From 5dc86426b1c8ac50707723badcec089698714af0 Mon Sep 17 00:00:00 2001 From: David Kaya Date: Wed, 25 Mar 2026 20:03:02 +0100 Subject: [PATCH] fix: move Prism global setup to entry-point module The previous approach imported prismjs component files directly in MarkdownComposer.tsx. In Vite dev mode, each component is served as a separate ESM module whose IIFE references a bare 'Prism' global that doesn't exist yet, crashing the app. Fix: create a dedicated prismSetup module that imports prismjs and assigns globalThis.Prism, then import it from the renderer entry point (main.tsx) before any component that loads @lexical/code-prism. ESM evaluation order guarantees the global is set before the tokenizer captures its reference. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/renderer/components/MarkdownComposer.tsx | 23 -------------------- src/renderer/lib/prismSetup.ts | 15 +++++++++++++ src/renderer/main.tsx | 1 + 3 files changed, 16 insertions(+), 23 deletions(-) create mode 100644 src/renderer/lib/prismSetup.ts diff --git a/src/renderer/components/MarkdownComposer.tsx b/src/renderer/components/MarkdownComposer.tsx index f6add2b..5ac82a9 100644 --- a/src/renderer/components/MarkdownComposer.tsx +++ b/src/renderer/components/MarkdownComposer.tsx @@ -21,29 +21,6 @@ import { $convertToMarkdownString, } from '@lexical/markdown'; import { $isCodeNode, $createCodeNode, CodeNode } from '@lexical/code'; - -// Prism must be on `globalThis` before @lexical/code-prism initializes its -// tokenizer reference. Vite's dev-mode esbuild CJS shim can race the global -// assignment, so we force it here before importing the module. -import Prism from 'prismjs'; -import 'prismjs/components/prism-clike'; -import 'prismjs/components/prism-javascript'; -import 'prismjs/components/prism-markup'; -import 'prismjs/components/prism-markdown'; -import 'prismjs/components/prism-c'; -import 'prismjs/components/prism-css'; -import 'prismjs/components/prism-objectivec'; -import 'prismjs/components/prism-sql'; -import 'prismjs/components/prism-python'; -import 'prismjs/components/prism-rust'; -import 'prismjs/components/prism-swift'; -import 'prismjs/components/prism-typescript'; -import 'prismjs/components/prism-java'; -import 'prismjs/components/prism-cpp'; -if (typeof globalThis !== 'undefined') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (globalThis as any).Prism = Prism; -} import { registerCodeHighlighting } from '@lexical/code-prism'; import { $isListNode, diff --git a/src/renderer/lib/prismSetup.ts b/src/renderer/lib/prismSetup.ts new file mode 100644 index 0000000..4823780 --- /dev/null +++ b/src/renderer/lib/prismSetup.ts @@ -0,0 +1,15 @@ +/** + * Ensures the PrismJS global is available before @lexical/code-prism + * captures its tokenizer reference. + * + * @lexical/code-prism reads `globalThis.Prism` at module-evaluation time. + * In Vite dev mode the esbuild CJS shim may not have set the global yet, + * so we force it here. This module must be imported before any module + * that transitively loads @lexical/code-prism. + */ +import Prism from 'prismjs'; + +if (typeof globalThis !== 'undefined' && !globalThis.Prism) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (globalThis as any).Prism = Prism; +} diff --git a/src/renderer/main.tsx b/src/renderer/main.tsx index cc67373..4591098 100644 --- a/src/renderer/main.tsx +++ b/src/renderer/main.tsx @@ -1,6 +1,7 @@ import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; +import '@renderer/lib/prismSetup'; import App from '@renderer/App'; import '@renderer/styles.css';