From 01ab2f279488689bf26db8a0fda2e112f1d3348b Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Mon, 9 Feb 2026 23:56:33 +0000 Subject: [PATCH] fix(ui): boot Monaco diff workers via workerMain --- packages/ui/src/lib/monaco/setup.ts | 21 ++++++++++++------- .../ui/src/renderer/public/monaco.worker.js | 7 +++++++ 2 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 packages/ui/src/renderer/public/monaco.worker.js diff --git a/packages/ui/src/lib/monaco/setup.ts b/packages/ui/src/lib/monaco/setup.ts index 6411dfba..f28fb2ee 100644 --- a/packages/ui/src/lib/monaco/setup.ts +++ b/packages/ui/src/lib/monaco/setup.ts @@ -53,15 +53,22 @@ function ensureLoaderScript(): Promise { function configureWorkers() { const globalAny = globalThis as any - if (globalAny.MonacoEnvironment?.getWorkerUrl) return + const prevEnv = globalAny.MonacoEnvironment ?? {} + + // Monaco's AMD build no longer ships `editor.worker.js` (and language workers are + // `jsonWorker.js`, `cssWorker.js`, etc). The robust approach is to always boot + // `vs/base/worker/workerMain.js` and let it `require(...)` the requested module. + // + // Important: `workerMain.js` expects `MonacoEnvironment.baseUrl` to be the + // directory containing the `vs/` folder (so `/monaco/`, not `/monaco/vs`). + // Use a static worker bootstrap script rather than a `data:` URL. + // This avoids CSP issues and makes worker requests visible in DevTools. + const workerUrl = "/monaco.worker.js" globalAny.MonacoEnvironment = { - getWorkerUrl(_moduleId: string, label: string) { - if (label === "json") return `${LOCAL_VS_ROOT}/language/json/json.worker.js` - if (label === "css" || label === "scss" || label === "less") return `${LOCAL_VS_ROOT}/language/css/css.worker.js` - if (label === "html" || label === "handlebars" || label === "razor") return `${LOCAL_VS_ROOT}/language/html/html.worker.js` - if (label === "typescript" || label === "javascript") return `${LOCAL_VS_ROOT}/language/typescript/ts.worker.js` - return `${LOCAL_VS_ROOT}/editor/editor.worker.js` + ...prevEnv, + getWorkerUrl(_moduleId: string, _label: string) { + return workerUrl }, } } diff --git a/packages/ui/src/renderer/public/monaco.worker.js b/packages/ui/src/renderer/public/monaco.worker.js new file mode 100644 index 00000000..275a7f99 --- /dev/null +++ b/packages/ui/src/renderer/public/monaco.worker.js @@ -0,0 +1,7 @@ +// Monaco web worker bootstrap. +// +// `workerMain.js` expects `MonacoEnvironment.baseUrl` to be the directory that +// contains the `vs/` folder (so `/monaco/`, not `/monaco/vs`). +self.MonacoEnvironment = { baseUrl: "/monaco/" } + +importScripts("/monaco/vs/base/worker/workerMain.js")