From 6678c0af493c0cc9f9b4aa3d76d2f40b8361aaf9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 5 Apr 2026 01:32:26 +0000 Subject: [PATCH 01/10] fix(deps): update dependency mermaid to v11.14.0 --- apps/client/package.json | 2 +- package.json | 2 +- packages/share-theme/package.json | 2 +- pnpm-lock.yaml | 34 +++++++++++++++---------------- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 4b48c04d14..c7de8e36cb 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -64,7 +64,7 @@ "leaflet-gpx": "2.2.0", "mark.js": "8.11.1", "marked": "17.0.5", - "mermaid": "11.13.0", + "mermaid": "11.14.0", "mind-elixir": "5.10.0", "normalize.css": "8.0.1", "panzoom": "9.4.4", diff --git a/package.json b/package.json index 9848c5bff4..d5d0d05a06 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@codemirror/language": "6.12.3", "@lezer/highlight": "1.2.3", "@lezer/common": "1.5.1", - "mermaid": "11.13.0", + "mermaid": "11.14.0", "preact": "10.29.0", "roughjs": "4.6.6", "@types/express-serve-static-core": "5.1.1", diff --git a/packages/share-theme/package.json b/packages/share-theme/package.json index a648e81cab..beb1213ed5 100644 --- a/packages/share-theme/package.json +++ b/packages/share-theme/package.json @@ -26,7 +26,7 @@ "dependencies": { "fuse.js": "7.1.0", "katex": "0.16.44", - "mermaid": "11.13.0" + "mermaid": "11.14.0" }, "devDependencies": { "@digitak/esrun": "3.2.26", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index abd7ec647e..ac5b326463 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,7 +8,7 @@ overrides: '@codemirror/language': 6.12.3 '@lezer/highlight': 1.2.3 '@lezer/common': 1.5.1 - mermaid: 11.13.0 + mermaid: 11.14.0 preact: 10.29.0 roughjs: 4.6.6 '@types/express-serve-static-core': 5.1.1 @@ -237,7 +237,7 @@ importers: version: 0.1.3(@types/leaflet@1.9.21)(leaflet@1.9.4)(maplibre-gl@5.6.1) '@mermaid-js/layout-elk': specifier: 0.2.1 - version: 0.2.1(mermaid@11.13.0) + version: 0.2.1(mermaid@11.14.0) '@mind-elixir/node-menu': specifier: 5.0.1 version: 5.0.1(mind-elixir@5.10.0) @@ -353,8 +353,8 @@ importers: specifier: 17.0.5 version: 17.0.5 mermaid: - specifier: 11.13.0 - version: 11.13.0 + specifier: 11.14.0 + version: 11.14.0 mind-elixir: specifier: 5.10.0 version: 5.10.0 @@ -1459,8 +1459,8 @@ importers: specifier: 0.16.44 version: 0.16.44 mermaid: - specifier: 11.13.0 - version: 11.13.0 + specifier: 11.14.0 + version: 11.14.0 devDependencies: '@digitak/esrun': specifier: 3.2.26 @@ -3577,10 +3577,10 @@ packages: '@mermaid-js/layout-elk@0.2.1': resolution: {integrity: sha512-MX9jwhMyd5zDcFsYcl3duDUkKhjVRUCGEQrdCeNV5hCIR6+3FuDDbRbFmvVbAu15K1+juzsYGG+K8MDvCY1Amg==} peerDependencies: - mermaid: 11.13.0 + mermaid: 11.14.0 - '@mermaid-js/parser@1.0.1': - resolution: {integrity: sha512-opmV19kN1JsK0T6HhhokHpcVkqKpF+x2pPDKKM2ThHtZAB5F4PROopk0amuVYK5qMrIA4erzpNm8gmPNJgMDxQ==} + '@mermaid-js/parser@1.1.0': + resolution: {integrity: sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==} '@microsoft/api-extractor-model@7.30.6': resolution: {integrity: sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg==} @@ -10656,8 +10656,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.13.0: - resolution: {integrity: sha512-fEnci+Immw6lKMFI8sqzjlATTyjLkRa6axrEgLV2yHTfv8r+h1wjFbV6xeRtd4rUV1cS4EpR9rwp3Rci7TRWDw==} + mermaid@11.14.0: + resolution: {integrity: sha512-GSGloRsBs+JINmmhl0JDwjpuezCsHB4WGI4NASHxL3fHo3o/BRXTxhDLKnln8/Q0lRFRyDdEjmk1/d5Sn1Xz8g==} methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -16763,7 +16763,7 @@ snapshots: '@excalidraw/mermaid-to-excalidraw@1.1.2': dependencies: '@excalidraw/markdown-to-text': 0.1.2 - mermaid: 11.13.0 + mermaid: 11.14.0 nanoid: 5.1.5 '@excalidraw/random-username@1.1.0': {} @@ -17630,13 +17630,13 @@ snapshots: '@mdn/browser-compat-data@5.7.6': {} - '@mermaid-js/layout-elk@0.2.1(mermaid@11.13.0)': + '@mermaid-js/layout-elk@0.2.1(mermaid@11.14.0)': dependencies: d3: 7.9.0 elkjs: 0.9.3 - mermaid: 11.13.0 + mermaid: 11.14.0 - '@mermaid-js/parser@1.0.1': + '@mermaid-js/parser@1.1.0': dependencies: langium: 4.2.1 @@ -26672,11 +26672,11 @@ snapshots: merge2@1.4.1: {} - mermaid@11.13.0: + mermaid@11.14.0: dependencies: '@braintree/sanitize-url': 7.1.2 '@iconify/utils': 3.1.0 - '@mermaid-js/parser': 1.0.1 + '@mermaid-js/parser': 1.1.0 '@types/d3': 7.4.3 '@upsetjs/venn.js': 2.0.0 cytoscape: 3.33.1 From 1c0cb601cbe6a306e5be2b61ab210b0a8f13a37b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 5 Apr 2026 16:43:32 +0000 Subject: [PATCH 02/10] chore(deps): update dependency electron to v40.8.5 [security] --- apps/desktop/package.json | 2 +- pnpm-lock.yaml | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index c7fadf8e3f..090d176200 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -46,7 +46,7 @@ "@triliumnext/server": "workspace:*", "@types/electron-squirrel-startup": "1.0.2", "copy-webpack-plugin": "13.0.1", - "electron": "40.6.1", + "electron": "40.8.5", "prebuild-install": "7.1.3" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 305a045d8d..1e1f67ff12 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -448,7 +448,7 @@ importers: dependencies: '@electron/remote': specifier: 2.1.3 - version: 2.1.3(electron@40.6.1) + version: 2.1.3(electron@40.8.5) better-sqlite3: specifier: 12.8.0 version: 12.8.0 @@ -511,8 +511,8 @@ importers: specifier: 13.0.1 version: 13.0.1(webpack@5.105.4(esbuild@0.27.5)) electron: - specifier: 40.6.1 - version: 40.6.1 + specifier: 40.8.5 + version: 40.8.5 prebuild-install: specifier: 7.1.3 version: 7.1.3 @@ -8512,8 +8512,8 @@ packages: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} - electron@40.6.1: - resolution: {integrity: sha512-u9YfoixttdauciHV9Ut9Zf3YipJoU093kR1GSYTTXTAXqhiXI0G1A0NnL/f0O2m2UULCXaXMf2W71PloR6V9pQ==} + electron@40.8.5: + resolution: {integrity: sha512-pgTY/VPQKaiU4sTjfU96iyxCXrFm4htVPCMRT4b7q9ijNTRgtLmLvcmzp2G4e7xDrq9p7OLHSmu1rBKFf6Y1/A==} engines: {node: '>= 12.20.55'} hasBin: true @@ -16640,9 +16640,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/remote@2.1.3(electron@40.6.1)': + '@electron/remote@2.1.3(electron@40.8.5)': dependencies: - electron: 40.6.1 + electron: 40.8.5 '@electron/remote@2.1.3(electron@41.1.0)': dependencies: @@ -24130,7 +24130,7 @@ snapshots: - supports-color optional: true - electron@40.6.1: + electron@40.8.5: dependencies: '@electron/get': 2.0.3 '@types/node': 24.12.0 From 92f5901b9528045d992dd978c36b6ac10b476431 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 5 Apr 2026 16:44:14 +0000 Subject: [PATCH 03/10] chore(deps): update dependency electron to v41.1.1 --- apps/edit-docs/package.json | 2 +- apps/server/package.json | 2 +- pnpm-lock.yaml | 20 ++++++++++---------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/edit-docs/package.json b/apps/edit-docs/package.json index 66ab77a1e1..b8e4e8665b 100644 --- a/apps/edit-docs/package.json +++ b/apps/edit-docs/package.json @@ -12,7 +12,7 @@ "@triliumnext/desktop": "workspace:*", "@types/fs-extra": "11.0.4", "copy-webpack-plugin": "14.0.0", - "electron": "41.1.0", + "electron": "41.1.1", "fs-extra": "11.3.4" }, "scripts": { diff --git a/apps/server/package.json b/apps/server/package.json index ff8d9bd609..ea6b33a909 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -91,7 +91,7 @@ "debounce": "3.0.0", "debug": "4.4.3", "ejs": "5.0.1", - "electron": "41.1.0", + "electron": "41.1.1", "electron-debug": "4.1.0", "electron-window-state": "5.0.3", "escape-html": "1.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 305a045d8d..bc66dfdb2e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -567,8 +567,8 @@ importers: specifier: 14.0.0 version: 14.0.0(webpack@5.105.4(esbuild@0.27.5)) electron: - specifier: 41.1.0 - version: 41.1.0 + specifier: 41.1.1 + version: 41.1.1 fs-extra: specifier: 11.3.4 version: 11.3.4 @@ -623,7 +623,7 @@ importers: version: 7.1.2 '@electron/remote': specifier: 2.1.3 - version: 2.1.3(electron@41.1.0) + version: 2.1.3(electron@41.1.1) '@triliumnext/commons': specifier: workspace:* version: link:../../packages/commons @@ -763,8 +763,8 @@ importers: specifier: 5.0.1 version: 5.0.1 electron: - specifier: 41.1.0 - version: 41.1.0 + specifier: 41.1.1 + version: 41.1.1 electron-debug: specifier: 4.1.0 version: 4.1.0 @@ -8517,8 +8517,8 @@ packages: engines: {node: '>= 12.20.55'} hasBin: true - electron@41.1.0: - resolution: {integrity: sha512-0XRFyxRqetmqtkkBvV++wGbHYJ7bD++f6EgJW8y9kX4pPRagwlmKDtzqXZhKiu0DIQppm3sXxzHWK9GYP91OKQ==} + electron@41.1.1: + resolution: {integrity: sha512-8bgvDhBjli+3Z2YCKgzzoBPh6391pr7Xv2h/tTJG4ETgvPvUxZomObbZLs31mUzYb6VrlcDDd9cyWyNKtPm3tA==} engines: {node: '>= 12.20.55'} hasBin: true @@ -16644,9 +16644,9 @@ snapshots: dependencies: electron: 40.6.1 - '@electron/remote@2.1.3(electron@41.1.0)': + '@electron/remote@2.1.3(electron@41.1.1)': dependencies: - electron: 41.1.0 + electron: 41.1.1 '@electron/universal@2.0.2': dependencies: @@ -24138,7 +24138,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@41.1.0: + electron@41.1.1: dependencies: '@electron/get': 2.0.3 '@types/node': 24.12.0 From 278d8428de8f024eefaf99e460f0f767ed78ad0a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 5 Apr 2026 21:13:09 +0300 Subject: [PATCH 04/10] feat(mermaid): integrate two new note types --- .../src/translations/en/translation.json | 4 +- .../type_widgets/mermaid/sample_diagrams.ts | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index ce49038fb5..2455120cf2 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -2304,7 +2304,9 @@ "sample_user_journey": "User Journey", "sample_xy": "XY", "sample_venn": "Venn", - "sample_ishikawa": "Ishikawa" + "sample_ishikawa": "Ishikawa", + "sample_treeview": "TreeView", + "sample_wardley": "Wardley Map" }, "mind-map": { "addChild": "Add child", diff --git a/apps/client/src/widgets/type_widgets/mermaid/sample_diagrams.ts b/apps/client/src/widgets/type_widgets/mermaid/sample_diagrams.ts index 29b62b1e38..8d53bdec82 100644 --- a/apps/client/src/widgets/type_widgets/mermaid/sample_diagrams.ts +++ b/apps/client/src/widgets/type_widgets/mermaid/sample_diagrams.ts @@ -505,6 +505,47 @@ ishikawa-beta Environment Subject moved too quickly Too dark +` + }, + { + name: t("mermaid.sample_treeview"), + content: `\ +treeView-beta + "src" + "components" + "Button.tsx" + "Modal.tsx" + "services" + "api.ts" + "utils.ts" + "index.ts" + "package.json" + "README.md" +` + }, + { + name: t("mermaid.sample_wardley"), + content: `\ +wardley-beta + title Tea Shop + + anchor Customers [0.95, 0.63] + anchor Business [0.95, 0.27] + + component Cup of Tea [0.79, 0.61] + component Tea [0.63, 0.81] + component Cup [0.57, 0.46] + component Water [0.52, 0.89] + component Kettle [0.47, 0.53] + component Power [0.36, 0.72] + + Customers -> Cup of Tea + Business -> Cup of Tea + Cup of Tea -> Tea + Cup of Tea -> Cup + Cup of Tea -> Water + Water -> Kettle + Kettle -> Power ` } ]; From 27e14558743c1aec1cc0ba60c997e41054ca6d4a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 5 Apr 2026 21:27:39 +0300 Subject: [PATCH 05/10] fix(mermaid): treeview clipped when padding --- apps/client/src/widgets/type_widgets/helpers/SplitEditor.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/type_widgets/helpers/SplitEditor.css b/apps/client/src/widgets/type_widgets/helpers/SplitEditor.css index 2c9a6a602e..c051eeb929 100644 --- a/apps/client/src/widgets/type_widgets/helpers/SplitEditor.css +++ b/apps/client/src/widgets/type_widgets/helpers/SplitEditor.css @@ -104,6 +104,6 @@ body.desktop .note-detail-split .note-detail-code-editor { .note-detail-split.svg-editor .render-container svg { width: 100%; height: 100%; - max-width: 100%; + max-width: 100% !important; } /* #endregion */ From 2c557eb0155123eed47c4e2f65c0ab5940b0f7d7 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 5 Apr 2026 21:36:11 +0300 Subject: [PATCH 06/10] Revert "fix(desktop): failing in prod due to tesseract" This reverts commit 9e34fcb8a804d5f2f6f9f4aca5206f270b047cb0. --- apps/desktop/scripts/build.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/scripts/build.ts b/apps/desktop/scripts/build.ts index d080036b11..2e5f82c506 100644 --- a/apps/desktop/scripts/build.ts +++ b/apps/desktop/scripts/build.ts @@ -16,7 +16,7 @@ async function main() { build.copy("/packages/share-theme/src/templates", "share-theme/templates/"); // Copy node modules dependencies - build.copyNodeModules([ "better-sqlite3", "bindings", "file-uri-to-path", "@electron/remote", "tesseract.js" ]); + build.copyNodeModules([ "better-sqlite3", "bindings", "file-uri-to-path", "@electron/remote" ]); build.copy("/node_modules/ckeditor5/dist/ckeditor5-content.css", "ckeditor5-content.css"); build.buildFrontend(); From 61dcc8db475bcc41f7587572bccce3e3a5f2df03 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 5 Apr 2026 21:53:53 +0300 Subject: [PATCH 07/10] Revert "fix(ocr): not working in server prod" This reverts commit f4f881e839392396caf81d0c20d7144c40d9b7f8. --- apps/server/scripts/build.ts | 2 +- scripts/build-utils.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/server/scripts/build.ts b/apps/server/scripts/build.ts index e8a27f66c3..9fa1f9cb83 100644 --- a/apps/server/scripts/build.ts +++ b/apps/server/scripts/build.ts @@ -11,7 +11,7 @@ async function main() { build.copy("/packages/share-theme/src/templates", "share-theme/templates/"); // Copy node modules dependencies - build.copyNodeModules([ "better-sqlite3", "bindings", "file-uri-to-path", "tesseract.js" ]); + build.copyNodeModules([ "better-sqlite3", "bindings", "file-uri-to-path" ]); build.copy("/node_modules/ckeditor5/dist/ckeditor5-content.css", "ckeditor5-content.css"); build.buildFrontend(); diff --git a/scripts/build-utils.ts b/scripts/build-utils.ts index 7349cecb2b..07a93a256e 100644 --- a/scripts/build-utils.ts +++ b/scripts/build-utils.ts @@ -53,8 +53,7 @@ export default class BuildHelper { "better-sqlite3", "pdfjs-dist", "./xhr-sync-worker.js", - "vite", - "tesseract.js" + "vite" ], metafile: true, splitting: false, From baa93cb371bfb766a290b5626f15421faf58d00e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 5 Apr 2026 22:14:01 +0300 Subject: [PATCH 08/10] chore(ocr): expose needed dependencies --- apps/server/scripts/build.ts | 4 ++++ .../ocr/processors/image_processor.ts | 19 +++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/apps/server/scripts/build.ts b/apps/server/scripts/build.ts index 9fa1f9cb83..73a3aeaee3 100644 --- a/apps/server/scripts/build.ts +++ b/apps/server/scripts/build.ts @@ -12,6 +12,10 @@ async function main() { // Copy node modules dependencies build.copyNodeModules([ "better-sqlite3", "bindings", "file-uri-to-path" ]); + + // Tesseract.js worker runs in a separate worker_thread and needs its + // source files (+ WASM core) on disk — they cannot be bundled. + build.copyNodeModules([ "tesseract.js", "tesseract.js-core", "wasm-feature-detect" ]); build.copy("/node_modules/ckeditor5/dist/ckeditor5-content.css", "ckeditor5-content.css"); build.buildFrontend(); diff --git a/apps/server/src/services/ocr/processors/image_processor.ts b/apps/server/src/services/ocr/processors/image_processor.ts index 15bfe78085..a7a09acd85 100644 --- a/apps/server/src/services/ocr/processors/image_processor.ts +++ b/apps/server/src/services/ocr/processors/image_processor.ts @@ -1,9 +1,11 @@ import fs from 'fs'; +import path from 'path'; import Tesseract from 'tesseract.js'; import dataDirs from '../../data_dir.js'; import log from '../../log.js'; import options from '../../options.js'; +import { getResourceDir, isDev } from '../../utils.js'; import { OCRProcessingOptions,OCRResult } from '../ocr_service.js'; import { FileProcessor } from './file_processor.js'; @@ -79,14 +81,27 @@ export class ImageProcessor extends FileProcessor { fs.mkdirSync(dataDirs.OCR_CACHE_DIR, { recursive: true }); log.info(`Initializing Tesseract worker for language(s): ${language}`); - this.worker = await Tesseract.createWorker(language, 1, { + + const workerOptions: Record = { cachePath: dataDirs.OCR_CACHE_DIR, logger: (m: { status: string; progress: number }) => { if (m.status === 'recognizing text') { log.info(`Image OCR progress (${language}): ${Math.round(m.progress * 100)}%`); } } - }); + }; + + // In production the server is bundled, so tesseract.js's default + // __dirname-based worker path is wrong. Point it at the copy we + // place in dist/node_modules during the build step. + if (!isDev) { + workerOptions.workerPath = path.join( + getResourceDir(), + 'node_modules', 'tesseract.js', 'src', 'worker-script', 'node', 'index.js' + ); + } + + this.worker = await Tesseract.createWorker(language, 1, workerOptions); this.currentLanguage = language; } From 1e861d1125f1a58d0656211377ca43dc8372d3cb Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 5 Apr 2026 22:20:38 +0300 Subject: [PATCH 09/10] chore(ocr): externalize tesseract.js completely --- apps/server/scripts/build.ts | 7 +++++-- .../ocr/processors/image_processor.ts | 19 ++----------------- scripts/build-utils.ts | 3 ++- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/apps/server/scripts/build.ts b/apps/server/scripts/build.ts index 73a3aeaee3..14401080e2 100644 --- a/apps/server/scripts/build.ts +++ b/apps/server/scripts/build.ts @@ -14,8 +14,11 @@ async function main() { build.copyNodeModules([ "better-sqlite3", "bindings", "file-uri-to-path" ]); // Tesseract.js worker runs in a separate worker_thread and needs its - // source files (+ WASM core) on disk — they cannot be bundled. - build.copyNodeModules([ "tesseract.js", "tesseract.js-core", "wasm-feature-detect" ]); + // source files (+ WASM core + transitive deps) on disk — they cannot be bundled. + build.copyNodeModules([ + "tesseract.js", "tesseract.js-core", "wasm-feature-detect", + "regenerator-runtime", "is-url", "bmp-js" + ]); build.copy("/node_modules/ckeditor5/dist/ckeditor5-content.css", "ckeditor5-content.css"); build.buildFrontend(); diff --git a/apps/server/src/services/ocr/processors/image_processor.ts b/apps/server/src/services/ocr/processors/image_processor.ts index a7a09acd85..15bfe78085 100644 --- a/apps/server/src/services/ocr/processors/image_processor.ts +++ b/apps/server/src/services/ocr/processors/image_processor.ts @@ -1,11 +1,9 @@ import fs from 'fs'; -import path from 'path'; import Tesseract from 'tesseract.js'; import dataDirs from '../../data_dir.js'; import log from '../../log.js'; import options from '../../options.js'; -import { getResourceDir, isDev } from '../../utils.js'; import { OCRProcessingOptions,OCRResult } from '../ocr_service.js'; import { FileProcessor } from './file_processor.js'; @@ -81,27 +79,14 @@ export class ImageProcessor extends FileProcessor { fs.mkdirSync(dataDirs.OCR_CACHE_DIR, { recursive: true }); log.info(`Initializing Tesseract worker for language(s): ${language}`); - - const workerOptions: Record = { + this.worker = await Tesseract.createWorker(language, 1, { cachePath: dataDirs.OCR_CACHE_DIR, logger: (m: { status: string; progress: number }) => { if (m.status === 'recognizing text') { log.info(`Image OCR progress (${language}): ${Math.round(m.progress * 100)}%`); } } - }; - - // In production the server is bundled, so tesseract.js's default - // __dirname-based worker path is wrong. Point it at the copy we - // place in dist/node_modules during the build step. - if (!isDev) { - workerOptions.workerPath = path.join( - getResourceDir(), - 'node_modules', 'tesseract.js', 'src', 'worker-script', 'node', 'index.js' - ); - } - - this.worker = await Tesseract.createWorker(language, 1, workerOptions); + }); this.currentLanguage = language; } diff --git a/scripts/build-utils.ts b/scripts/build-utils.ts index 07a93a256e..7349cecb2b 100644 --- a/scripts/build-utils.ts +++ b/scripts/build-utils.ts @@ -53,7 +53,8 @@ export default class BuildHelper { "better-sqlite3", "pdfjs-dist", "./xhr-sync-worker.js", - "vite" + "vite", + "tesseract.js" ], metafile: true, splitting: false, From dc1e0e8db4123990dc115d40f9cfb3723de6ba9e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 5 Apr 2026 22:22:58 +0300 Subject: [PATCH 10/10] fix(desktop): tesseract.js not copied --- apps/server/scripts/build.ts | 7 ------- scripts/build-utils.ts | 8 ++++++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/server/scripts/build.ts b/apps/server/scripts/build.ts index 14401080e2..9fa1f9cb83 100644 --- a/apps/server/scripts/build.ts +++ b/apps/server/scripts/build.ts @@ -12,13 +12,6 @@ async function main() { // Copy node modules dependencies build.copyNodeModules([ "better-sqlite3", "bindings", "file-uri-to-path" ]); - - // Tesseract.js worker runs in a separate worker_thread and needs its - // source files (+ WASM core + transitive deps) on disk — they cannot be bundled. - build.copyNodeModules([ - "tesseract.js", "tesseract.js-core", "wasm-feature-detect", - "regenerator-runtime", "is-url", "bmp-js" - ]); build.copy("/node_modules/ckeditor5/dist/ckeditor5-content.css", "ckeditor5-content.css"); build.buildFrontend(); diff --git a/scripts/build-utils.ts b/scripts/build-utils.ts index 7349cecb2b..23af1db90d 100644 --- a/scripts/build-utils.ts +++ b/scripts/build-utils.ts @@ -68,6 +68,14 @@ export default class BuildHelper { minify: true }); writeFileSync(join(this.outDir, "meta.json"), JSON.stringify(result.metafile)); + + // Tesseract.js is marked as external above because its worker runs in + // a separate worker_thread. Copy the worker source, WASM core and all + // transitive runtime deps so they are available in dist/node_modules. + this.copyNodeModules([ + "tesseract.js", "tesseract.js-core", "wasm-feature-detect", + "regenerator-runtime", "is-url", "bmp-js" + ]); } buildFrontend() {