Skip to content

[Bug]: CodeBlock breaks SSR/client evaluation in Waku/Vite due to CJS react-syntax-highlighter language imports #1020

Description

@arrudaricardo

Summary

When using @clickhouse/click-ui in a Waku/Vite React app, the app fails during module evaluation with:

txt TypeError: _interopRequireDefault is not a function

The stack trace points to CodeBlock importing CJS language modules from react-syntax-highlighter inside Click UI’s ESM build.

Would it be possible to fix this by patching CodeBlock to use the ESM language imports from react-syntax-highlighter instead of the CJS ones?

Error

TypeError: _interopRequireDefault is not a function     at eval (.../node_modules/react-syntax-
highlighter/dist/cjs/languages/hljs/sql.js:8:12)     at async ESModulesEvaluator.runInlinedModule 
(.../node_modules/waku/node_modules/vite/dist/node/module-runner.js:992:3)     at async ModuleRunner.directRequest 
(.../node_modules/waku/node_modules/vite/dist/node/module-runner.js:1247:59)     at async ModuleRunner.cachedRequest 
(.../node_modules/waku/node_modules/vite/dist/node/module-runner.js:1154:73)     at async eval (.../node_modules/@clickhouse/click-
ui/dist/esm/components/CodeBlock/index.js:10:31)     at async ESModulesEvaluator.runInlinedModule 
(.../node_modules/waku/node_modules/vite/dist/node/module-runner.js:992:3)     at async ModuleRunner.directRequest 
(.../node_modules/waku/node_modules/vite/dist/node/module-runner.js:1247:59)     at async ModuleRunner.cachedRequest 
(.../node_modules/waku/node_modules/vite/dist/node/module-runner.js:1154:73)     at async eval (.../node_modules/@clickhouse/click-
ui/dist/esm/index.js:39:1) 

Suspected cause

CodeBlock currently imports Highlight.js language definitions from the CJS build of react-syntax-highlighter:

ts import sql from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql.js'; import bash from 'react-syntax-
highlighter/dist/cjs/languages/hljs/bash.js'; import json from 'react-syntax-highlighter/dist/cjs/languages/hljs/json.js'; import tsx from 
'react-syntax-highlighter/dist/cjs/languages/hljs/typescript.js'; import plaintext from 'react-syntax-
highlighter/dist/cjs/languages/hljs/plaintext.js'; 

However, @clickhouse/click-ui exposes an ESM build through the import export condition:

{
  "exports": { 
    ".": {
       "import": "./dist/esm/index.js", 
      "require": "./dist/cjs/index.cjs" 
    }
   } 
} 

In Waku/Vite, the ESM build is evaluated by Vite’s module runner, and the CJS language module appears to fail because of CJS/ESM interop around _interopRequireDefault.

This can also happen even when CodeBlock is not directly used, because the root entry point re-exports CodeBlock, so importing unrelated components from @clickhouse/click-ui can still cause CodeBlock to be evaluated.

Proposed fix

Could CodeBlock use the ESM language imports instead?

diff - import sql from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql.js'; - import bash from 'react-syntax-highlighter/dist/cjs/languages/hljs/bash.js'; - import json from 'react-syntax-highlighter/dist/cjs/languages/hljs/json.js'; - import tsx from 'react-syntax-highlighter/dist/cjs/languages/hljs/typescript.js'; - import plaintext from 'react-syntax-highlighter/dist/cjs/languages/hljs/plaintext.js';  + import sql from 'react-syntax-highlighter/dist/esm/languages/hljs/sql'; + import bash from 'react-syntax-highlighter/dist/esm/languages/hljs/bash'; + import json from 'react-syntax-highlighter/dist/esm/languages/hljs/json'; + import tsx from 'react-syntax-highlighter/dist/esm/languages/hljs/typescript'; + import plaintext from 'react-syntax-highlighter/dist/esm/languages/hljs/plaintext'; 

Then the registrations could likely be simplified as well:

diff - SyntaxHighlighter.registerLanguage('sql', sql.default || sql); + SyntaxHighlighter.registerLanguage('sql', sql); 

Same for the other languages.

Expected behavior

@clickhouse/click-ui should be importable in Waku/Vite SSR/client-module evaluation without failing during evaluation of CodeBlock.

Actual behavior

The app crashes during module evaluation with:

txt TypeError: _interopRequireDefault is not a function 

Environment

txt Framework/runtime: Waku + Vite Package: @clickhouse/click-ui Failure path: @clickhouse/click-ui/dist/esm/components/CodeBlock/index.js Underlying module: react-syntax-highlighter/dist/cjs/languages/hljs/sql.js

Additional context

This seems related to the general SSR compatibility issue previously reported in #604, but this report identifies a specific failing path through CodeBlock and react-syntax-highlighter CJS language imports.

Component(s) affected

CodeBlock

How to reproduce

npm create waku@latest click-ui-ssr-repro
cd click-ui-ssr-repro
npm install
npm install @clickhouse/click-ui styled-components

App.tsx

import { Button } from '@clickhouse/click-ui';

export default function App() {
  return <Button>Test</Button>;
}
npm run dev
TypeError: _interopRequireDefault is not a function
    at eval (.../node_modules/react-syntax-highlighter/dist/cjs/languages/hljs/sql.js:8:12)
    at async ESModulesEvaluator.runInlinedModule (.../node_modules/waku/node_modules/vite/dist/node/module-runner.js:992:3)
    at async eval (.../node_modules/@clickhouse/click-ui/dist/esm/components/CodeBlock/index.js:10:31)
    at async eval (.../node_modules/@clickhouse/click-ui/dist/esm/index.js:39:1)

Note that CodeBlock does not need to be rendered directly. The failure can happen from a root import such as:

import { Button } from '@clickhouse/click-ui';

Click UI Version

0.0.252-test.7

Browser(s)

Chrome

Operating system

macOS 26

Is this a regression?

Not sure

Last working version (if regression)

No response

Screenshots or recording

No response

Visual / UX checklist

  • Checked in both light and dark mode (if applicable)
  • Checked at different viewport sizes (if applicable)
  • Checked with keyboard navigation (if applicable)
  • Checked for visual regressions in related components

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions