From e5bc416b466f5936dca24c94f8d71bde532d9c4a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 20 Jan 2026 01:14:50 +0000 Subject: [PATCH 001/316] chore(deps): update dependency vite-plugin-static-copy to v3.1.5 --- apps/client/package.json | 2 +- pnpm-lock.yaml | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 1e336f6c37..1eb7e79009 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -81,6 +81,6 @@ "happy-dom": "20.3.3", "lightningcss": "1.30.2", "script-loader": "0.7.2", - "vite-plugin-static-copy": "3.1.4" + "vite-plugin-static-copy": "3.1.5" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf90c7f1e6..ec0c7034aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -354,8 +354,8 @@ importers: specifier: 0.7.2 version: 0.7.2 vite-plugin-static-copy: - specifier: 3.1.4 - version: 3.1.4(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + specifier: 3.1.5 + version: 3.1.5(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) apps/db-compare: dependencies: @@ -10962,10 +10962,6 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} - p-map@7.0.3: - resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} - engines: {node: '>=18'} - p-map@7.0.4: resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} @@ -13864,8 +13860,8 @@ packages: vite: optional: true - vite-plugin-static-copy@3.1.4: - resolution: {integrity: sha512-iCmr4GSw4eSnaB+G8zc2f4dxSuDjbkjwpuBLLGvQYR9IW7rnDzftnUjOH5p4RYR+d4GsiBqXRvzuFhs5bnzVyw==} + vite-plugin-static-copy@3.1.5: + resolution: {integrity: sha512-9pbZn9Vb+uUNg/Tr/f2MXmGvfSfLeWjscS4zTA3v+sWqKN+AjJ/ipTFwaqdopJkNkxG5DfgYrZXD80ljbNDxbg==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -27150,8 +27146,6 @@ snapshots: dependencies: aggregate-error: 3.1.0 - p-map@7.0.3: {} - p-map@7.0.4: {} p-queue@6.6.2: @@ -30503,10 +30497,10 @@ snapshots: - rollup - supports-color - vite-plugin-static-copy@3.1.4(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-static-copy@3.1.5(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: chokidar: 3.6.0 - p-map: 7.0.3 + p-map: 7.0.4 picocolors: 1.1.1 tinyglobby: 0.2.15 vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) From c043788b09901bfd293e04a8afc5b94e8cb73bb5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 20 Jan 2026 01:15:00 +0000 Subject: [PATCH 002/316] chore(deps): update pnpm to v10.28.1 --- apps/build-docs/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/build-docs/package.json b/apps/build-docs/package.json index 80cdef54f3..1ab4c6bc56 100644 --- a/apps/build-docs/package.json +++ b/apps/build-docs/package.json @@ -9,7 +9,7 @@ "keywords": [], "author": "Elian Doran ", "license": "AGPL-3.0-only", - "packageManager": "pnpm@10.28.0", + "packageManager": "pnpm@10.28.1", "devDependencies": { "@redocly/cli": "2.14.5", "archiver": "7.0.1", diff --git a/package.json b/package.json index 5d046f92ad..1bd68cc676 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "url": "https://github.com/TriliumNext/Trilium/issues" }, "homepage": "https://triliumnotes.org", - "packageManager": "pnpm@10.28.0", + "packageManager": "pnpm@10.28.1", "pnpm": { "patchedDependencies": { "@ckeditor/ckeditor5-mention": "patches/@ckeditor__ckeditor5-mention.patch", From dad9578b83563463851cbde9f63ef539bfda4b16 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 20 Jan 2026 01:16:12 +0000 Subject: [PATCH 003/316] chore(deps): update dependency turnish to v1.8.0 --- apps/server/package.json | 2 +- pnpm-lock.yaml | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index 5c46b0c6fe..3c8f269935 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -126,7 +126,7 @@ "swagger-jsdoc": "6.2.8", "time2fa": "1.4.2", "tmp": "0.2.5", - "turnish": "1.7.1", + "turnish": "1.8.0", "unescape": "1.0.1", "vite": "7.3.1", "ws": "8.19.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf90c7f1e6..910de3c994 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -793,8 +793,8 @@ importers: specifier: 0.2.5 version: 0.2.5 turnish: - specifier: 1.7.1 - version: 1.7.1 + specifier: 1.8.0 + version: 1.8.0 unescape: specifier: 1.0.1 version: 1.0.1 @@ -13483,8 +13483,8 @@ packages: turndown@7.2.2: resolution: {integrity: sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==} - turnish@1.7.1: - resolution: {integrity: sha512-NgyY7pIDABjKyg2isRgZyFPav6tOyvmqpTx3HROsKrOaE3JccP4C1P2IhAtkAZ8DkQb/O1R7HOFAkxY8uaJmcQ==} + turnish@1.8.0: + resolution: {integrity: sha512-r1K94mbU5FHwvHKsPrTejuxoQTyKrddeWNzxS53Dnu+33DJLZJzfAHmo7GhdxBvhrHYCfv/diYvpq2VCGSGa+w==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -15311,8 +15311,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -30130,7 +30128,7 @@ snapshots: dependencies: '@mixmark-io/domino': 2.2.0 - turnish@1.7.1: + turnish@1.8.0: dependencies: '@adobe/css-tools': 4.4.4 '@mixmark-io/domino': 2.2.0 From 15396640268076766d4e81952c1c59ae8127203e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 20 Jan 2026 15:16:32 +0200 Subject: [PATCH 004/316] Revert "test(client): fix broken tests after change in shortcut behaviour" This reverts commit e33950e0009dd20c27851c6ca21961c8f9d924da. --- apps/client/src/services/shortcuts.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/client/src/services/shortcuts.spec.ts b/apps/client/src/services/shortcuts.spec.ts index ed17dcd391..f2170da30d 100644 --- a/apps/client/src/services/shortcuts.spec.ts +++ b/apps/client/src/services/shortcuts.spec.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import shortcuts, { isIMEComposing,keyMatches, matchesShortcut } from "./shortcuts.js"; +import shortcuts, { isIMEComposing, keyMatches, matchesShortcut } from "./shortcuts.js"; // Mock utils module vi.mock("./utils.js", () => ({ @@ -249,7 +249,7 @@ describe("shortcuts", () => { const handler = vi.fn(); shortcuts.bindGlobalShortcut("ctrl+a", handler, "test-namespace"); - expect(mockElement.addEventListener).toHaveBeenCalledWith("keydown", expect.any(Function), true); + expect(mockElement.addEventListener).toHaveBeenCalledWith("keydown", expect.any(Function)); }); it("should not bind shortcuts when handler is null", () => { @@ -280,7 +280,7 @@ describe("shortcuts", () => { const handler = vi.fn(); shortcuts.bindElShortcut(mockJQueryEl, "ctrl+a", handler, "test-namespace"); - expect(mockEl.addEventListener).toHaveBeenCalledWith("keydown", expect.any(Function), true); + expect(mockEl.addEventListener).toHaveBeenCalledWith("keydown", expect.any(Function)); }); it("should fall back to document when element is empty", () => { @@ -290,7 +290,7 @@ describe("shortcuts", () => { const handler = vi.fn(); shortcuts.bindElShortcut(emptyJQuery, "ctrl+a", handler, "test-namespace"); - expect(mockElement.addEventListener).toHaveBeenCalledWith("keydown", expect.any(Function), true); + expect(mockElement.addEventListener).toHaveBeenCalledWith("keydown", expect.any(Function)); }); }); @@ -301,7 +301,7 @@ describe("shortcuts", () => { shortcuts.removeGlobalShortcut("test-namespace"); - expect(mockElement.removeEventListener).toHaveBeenCalledWith("keydown", expect.any(Function), true); + expect(mockElement.removeEventListener).toHaveBeenCalledWith("keydown", expect.any(Function)); }); }); From f96ed0af2660b97b0c69c11595f004b7466ca409 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 20 Jan 2026 15:16:51 +0200 Subject: [PATCH 005/316] Revert "fix(shortcuts): triggering in bubbling phase, not capturing" This reverts commit 711828d6b485770e3e88ddbb0cf53fe781912bf8. --- apps/client/src/services/shortcuts.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/client/src/services/shortcuts.ts b/apps/client/src/services/shortcuts.ts index 62c6b21ff4..63db45302d 100644 --- a/apps/client/src/services/shortcuts.ts +++ b/apps/client/src/services/shortcuts.ts @@ -110,9 +110,8 @@ function bindElShortcut($el: JQuery, keyboardShortcut: st } }; - // Add the event listener in capture phase to intercept events before they reach - // child elements like CodeMirror - element.addEventListener('keydown', listener, true); + // Add the event listener + element.addEventListener('keydown', listener); // Store the binding for later cleanup const binding: ShortcutBinding = { @@ -139,16 +138,15 @@ export function removeIndividualBinding(binding: ShortcutBinding) { if (activeBindingsInNamespace) { activeBindings.set(key, activeBindingsInNamespace.filter(aBinding => aBinding.handler === binding.handler)); } - // Remove listener with capture phase to match how it was added - binding.element.removeEventListener("keydown", binding.listener, true); + binding.element.removeEventListener("keydown", binding.listener); } function removeNamespaceBindings(namespace: string) { const bindings = activeBindings.get(namespace); if (bindings) { + // Remove all event listeners for this namespace bindings.forEach(binding => { - // Remove listener with capture phase to match how it was added - binding.element.removeEventListener('keydown', binding.listener, true); + binding.element.removeEventListener('keydown', binding.listener); }); activeBindings.delete(namespace); } From f83d95136dbbc1fc348a55b75fc37c31344c47b4 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 20 Jan 2026 16:11:40 +0200 Subject: [PATCH 006/316] fix(codemirror): ctrl+enter generates newline --- packages/codemirror/src/index.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/codemirror/src/index.ts b/packages/codemirror/src/index.ts index c86d37b12d..f77342455d 100644 --- a/packages/codemirror/src/index.ts +++ b/packages/codemirror/src/index.ts @@ -1,5 +1,5 @@ import { defaultKeymap, history, historyKeymap } from "@codemirror/commands"; -import { EditorView, highlightActiveLine, keymap, lineNumbers, placeholder, ViewPlugin, ViewUpdate, type EditorViewConfig } from "@codemirror/view"; +import { EditorView, highlightActiveLine, keymap, lineNumbers, placeholder, ViewPlugin, ViewUpdate, type EditorViewConfig, KeyBinding } from "@codemirror/view"; import { defaultHighlightStyle, StreamLanguage, syntaxHighlighting, indentUnit, bracketMatching, foldGutter, codeFolding } from "@codemirror/language"; import { Compartment, EditorSelection, EditorState, type Extension } from "@codemirror/state"; import { highlightSelectionMatches } from "@codemirror/search"; @@ -12,6 +12,17 @@ import { createSearchHighlighter, SearchHighlighter, searchMatchHighlightTheme } export { default as ColorThemes, type ThemeDefinition, getThemeById } from "./color_themes.js"; +// Custom keymap to prevent Ctrl+Enter from inserting a newline +// This allows the parent application to handle the shortcut (e.g., for "Run Active Note") +const preventCtrlEnterKeymap: readonly KeyBinding[] = [ + { + key: "Ctrl-Enter", + mac: "Cmd-Enter", + run: () => true, // Return true to mark event as handled, preventing default newline insertion + preventDefault: true + } +]; + type ContentChangedListener = () => void; export interface EditorConfig { @@ -59,6 +70,7 @@ export default class CodeMirror extends EditorView { lineNumbers(), indentUnit.of(" ".repeat(4)), keymap.of([ + ...preventCtrlEnterKeymap, ...defaultKeymap, ...historyKeymap, ...smartIndentWithTab From 60c789b6c7ffb3e93bb21f2b83f181164b66d530 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 20 Jan 2026 16:33:46 +0200 Subject: [PATCH 007/316] fix(client): production affected by cache of index JS --- apps/client/vite.config.mts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/client/vite.config.mts b/apps/client/vite.config.mts index c5c411a333..b76595d646 100644 --- a/apps/client/vite.config.mts +++ b/apps/client/vite.config.mts @@ -93,7 +93,15 @@ export default defineConfig(() => ({ print: join(__dirname, "src", "print.tsx") }, output: { - entryFileNames: "src/[name].js", + entryFileNames: (chunk) => { + // We enforce a hash in the main index file to avoid caching issues, this only works because we have the HTML entry point. + if (chunk.name === "index") { + return "src/[name]-[hash].js"; + } + + // For EJS-rendered pages (e.g. login) we need to have a stable name. + return "src/[name].js"; + }, chunkFileNames: "src/[name]-[hash].js", assetFileNames: "src/[name]-[hash].[ext]", manualChunks: { From 798efbc22fe3740231fbe1cb6380a84c6af286c7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 01:33:18 +0000 Subject: [PATCH 008/316] chore(deps): update dependency @smithy/middleware-retry to v4.4.26 --- packages/ckeditor5/package.json | 2 +- pnpm-lock.yaml | 80 +++++++++++++++++---------------- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/packages/ckeditor5/package.json b/packages/ckeditor5/package.json index 6ccb19bf26..165787584d 100644 --- a/packages/ckeditor5/package.json +++ b/packages/ckeditor5/package.json @@ -16,7 +16,7 @@ "ckeditor5-premium-features": "47.4.0" }, "devDependencies": { - "@smithy/middleware-retry": "4.4.24", + "@smithy/middleware-retry": "4.4.26", "@types/jquery": "3.5.33" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24521f0d5e..5a7cad1a5c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -888,8 +888,8 @@ importers: version: 47.4.0(bufferutil@4.0.9)(ckeditor5@47.4.0)(utf-8-validate@6.0.5) devDependencies: '@smithy/middleware-retry': - specifier: 4.4.24 - version: 4.4.24 + specifier: 4.4.26 + version: 4.4.26 '@types/jquery': specifier: 3.5.33 version: 3.5.33 @@ -4800,14 +4800,14 @@ packages: resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.20.6': - resolution: {integrity: sha512-BpAffW1mIyRZongoKBbh3RgHG+JDHJek/8hjA/9LnPunM+ejorO6axkxCgwxCe4K//g/JdPeR9vROHDYr/hfnQ==} - engines: {node: '>=18.0.0'} - '@smithy/core@3.20.7': resolution: {integrity: sha512-aO7jmh3CtrmPsIJxUwYIzI5WVlMK8BMCPQ4D4nTzqTqBhbzvxHNzBMGcEg13yg/z9R2Qsz49NUFl0F0lVbTVFw==} engines: {node: '>=18.0.0'} + '@smithy/core@3.21.0': + resolution: {integrity: sha512-bg2TfzgsERyETAxc/Ims/eJX8eAnIeTi4r4LHpMpfF/2NyO6RsWis0rjKcCPaGksljmOb23BZRiCeT/3NvwkXw==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.0.6': resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} engines: {node: '>=18.0.0'} @@ -4856,16 +4856,16 @@ packages: resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.7': - resolution: {integrity: sha512-SCmhUG1UwtnEhF5Sxd8qk7bJwkj1BpFzFlHkXqKCEmDPLrRjJyTGM0EhqT7XBtDaDJjCfjRJQodgZcKDR843qg==} + '@smithy/middleware-endpoint@4.4.10': + resolution: {integrity: sha512-kwWpNltpxrvPabnjEFvwSmA+66l6s2ReCvgVSzW/z92LU4T28fTdgZ18IdYRYOrisu2NMQ0jUndRScbO65A/zg==} engines: {node: '>=18.0.0'} '@smithy/middleware-endpoint@4.4.8': resolution: {integrity: sha512-TV44qwB/T0OMMzjIuI+JeS0ort3bvlPJ8XIH0MSlGADraXpZqmyND27ueuAL3E14optleADWqtd7dUgc2w+qhQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.24': - resolution: {integrity: sha512-yiUY1UvnbUFfP5izoKLtfxDSTRv724YRRwyiC/5HYY6vdsVDcDOXKSXmkJl/Hovcxt5r+8tZEUAdrOaCJwrl9Q==} + '@smithy/middleware-retry@4.4.26': + resolution: {integrity: sha512-ozZMoTAr+B2aVYfLYfkssFvc8ZV3p/vLpVQ7/k277xxUOA9ykSPe5obL2j6yHfbdrM/SZV7qj0uk/hSqavHrLw==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.9': @@ -4912,8 +4912,8 @@ packages: resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.10.8': - resolution: {integrity: sha512-wcr3UEL26k7lLoyf9eVDZoD1nNY3Fa1gbNuOXvfxvVWLGkOVW+RYZgUUp/bXHryJfycIOQnBq9o1JAE00ax8HQ==} + '@smithy/smithy-client@4.10.11': + resolution: {integrity: sha512-6o804SCyHGMXAb5mFJ+iTy9kVKv7F91a9szN0J+9X6p8A0NrdpUxdaC57aye2ipQkP2C4IAqETEpGZ0Zj77Haw==} engines: {node: '>=18.0.0'} '@smithy/smithy-client@4.10.9': @@ -14523,7 +14523,7 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.20.6 + '@smithy/core': 3.20.7 '@smithy/eventstream-serde-browser': 4.0.4 '@smithy/eventstream-serde-config-resolver': 4.1.2 '@smithy/eventstream-serde-node': 4.0.4 @@ -14531,14 +14531,14 @@ snapshots: '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.4.7 - '@smithy/middleware-retry': 4.4.24 + '@smithy/middleware-endpoint': 4.4.8 + '@smithy/middleware-retry': 4.4.26 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.8 + '@smithy/smithy-client': 4.10.9 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 @@ -14572,19 +14572,19 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.20.6 + '@smithy/core': 3.20.7 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.4.7 - '@smithy/middleware-retry': 4.4.24 + '@smithy/middleware-endpoint': 4.4.8 + '@smithy/middleware-retry': 4.4.26 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.8 + '@smithy/smithy-client': 4.10.9 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 @@ -14604,12 +14604,12 @@ snapshots: dependencies: '@aws-sdk/types': 3.821.0 '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.20.6 + '@smithy/core': 3.20.7 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.10.8 + '@smithy/smithy-client': 4.10.9 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 @@ -14634,7 +14634,7 @@ snapshots: '@smithy/node-http-handler': 4.4.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.8 + '@smithy/smithy-client': 4.10.9 '@smithy/types': 4.12.0 '@smithy/util-stream': 4.5.10 tslib: 2.8.1 @@ -14746,7 +14746,7 @@ snapshots: '@aws-sdk/core': 3.823.0 '@aws-sdk/types': 3.821.0 '@aws-sdk/util-endpoints': 3.821.0 - '@smithy/core': 3.20.6 + '@smithy/core': 3.20.7 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 @@ -14766,19 +14766,19 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.20.6 + '@smithy/core': 3.20.7 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.4.7 - '@smithy/middleware-retry': 4.4.24 + '@smithy/middleware-endpoint': 4.4.8 + '@smithy/middleware-retry': 4.4.26 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.8 + '@smithy/smithy-client': 4.10.9 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 @@ -15307,6 +15307,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -19289,7 +19291,7 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/core@3.20.6': + '@smithy/core@3.20.7': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -19302,7 +19304,7 @@ snapshots: '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/core@3.20.7': + '@smithy/core@3.21.0': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -19387,9 +19389,9 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.7': + '@smithy/middleware-endpoint@4.4.10': dependencies: - '@smithy/core': 3.20.6 + '@smithy/core': 3.21.0 '@smithy/middleware-serde': 4.2.9 '@smithy/node-config-provider': 4.3.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -19409,12 +19411,12 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.24': + '@smithy/middleware-retry@4.4.26': dependencies: '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/service-error-classification': 4.2.8 - '@smithy/smithy-client': 4.10.9 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -19488,10 +19490,10 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.10.8': + '@smithy/smithy-client@4.10.11': dependencies: - '@smithy/core': 3.20.6 - '@smithy/middleware-endpoint': 4.4.7 + '@smithy/core': 3.21.0 + '@smithy/middleware-endpoint': 4.4.10 '@smithy/middleware-stack': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 @@ -19549,7 +19551,7 @@ snapshots: '@smithy/util-defaults-mode-browser@4.0.22': dependencies: '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.8 + '@smithy/smithy-client': 4.10.9 '@smithy/types': 4.12.0 bowser: 2.11.0 tslib: 2.8.1 @@ -19560,7 +19562,7 @@ snapshots: '@smithy/credential-provider-imds': 4.0.6 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.8 + '@smithy/smithy-client': 4.10.9 '@smithy/types': 4.12.0 tslib: 2.8.1 From 16ed9a7e8e89a09a685bde4eeb5ac15171cd5b28 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 01:34:07 +0000 Subject: [PATCH 009/316] fix(deps): update dependency @zumer/snapdom to v2.0.2 --- apps/client/package.json | 2 +- pnpm-lock.yaml | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 1eb7e79009..66eae322ab 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -34,7 +34,7 @@ "@triliumnext/highlightjs": "workspace:*", "@triliumnext/share-theme": "workspace:*", "@triliumnext/split.js": "workspace:*", - "@zumer/snapdom": "2.0.1", + "@zumer/snapdom": "2.0.2", "autocomplete.js": "0.38.1", "bootstrap": "5.3.8", "boxicons": "2.1.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24521f0d5e..e13bf7e6cb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -218,8 +218,8 @@ importers: specifier: workspace:* version: link:../../packages/splitjs '@zumer/snapdom': - specifier: 2.0.1 - version: 2.0.1 + specifier: 2.0.2 + version: 2.0.2 autocomplete.js: specifier: 0.38.1 version: 0.38.1 @@ -5965,8 +5965,8 @@ packages: resolution: {integrity: sha512-0fztsk/0ryJ+2PPr9EyXS5/Co7OK8q3zY/xOoozEWaUsL5x+C0cyZ4YyMuUffOO2Dx/rAdq4JMPqW0VUtm+vzA==} engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'} - '@zumer/snapdom@2.0.1': - resolution: {integrity: sha512-78/qbYl2FTv4H6qaXcNfAujfIOSzdvs83NW63VbyC9QA3sqNPfPvhn4xYMO6Gy11hXwJUEhd0z65yKiNzDwy9w==} + '@zumer/snapdom@2.0.2': + resolution: {integrity: sha512-W6quT4lMcPu8Q9O/Q6witSfc6/+xuY8C8yDoHug/+o7zYKCNE/e0I3//XsWDkyq9C0mDE0TAWF/8bwCR7x3gHQ==} abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} @@ -15307,6 +15307,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -20860,7 +20862,7 @@ snapshots: '@zip.js/zip.js@2.8.11': {} - '@zumer/snapdom@2.0.1': {} + '@zumer/snapdom@2.0.2': {} abab@2.0.6: {} From 4da6294ef27e253ebf0eabfefe1865e7c426bd5c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 01:35:35 +0000 Subject: [PATCH 010/316] chore(deps): update dependency node-abi to v4.26.0 --- package.json | 2 +- pnpm-lock.yaml | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 1bd68cc676..381cca4bdd 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "on-headers@<1.1.0": ">=1.1.0", "form-data@>=4.0.0 <4.0.4": ">=4.0.4", "form-data@>=3.0.0 <3.0.4": ">=3.0.4", - "node-abi": "4.25.0" + "node-abi": "4.26.0" }, "ignoredBuiltDependencies": [ "sqlite3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24521f0d5e..d8bcbd322c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,7 +20,7 @@ overrides: on-headers@<1.1.0: '>=1.1.0' form-data@>=4.0.0 <4.0.4: '>=4.0.4' form-data@>=3.0.0 <3.0.4: '>=3.0.4' - node-abi: 4.25.0 + node-abi: 4.26.0 patchedDependencies: '@ckeditor/ckeditor5-code-block': @@ -10625,8 +10625,8 @@ packages: nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - node-abi@4.25.0: - resolution: {integrity: sha512-BRrQZc23ljOLms7EXVds3MOpB59/x7gaORodNuIwt96JKlflUmrOgv5hSJZEEM/WkW3uXpjZ4x1wcFu8V9mTpw==} + node-abi@4.26.0: + resolution: {integrity: sha512-8QwIZqikRvDIkXS2S93LjzhsSPJuIbfaMETWH+Bx8oOT9Sa9UsUtBFQlc3gBNd1+QINjaTloitXr1W3dQLi9Iw==} engines: {node: '>=22.12.0'} node-addon-api@7.1.1: @@ -15307,6 +15307,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -16808,7 +16810,7 @@ snapshots: detect-libc: 2.1.2 fs-extra: 10.1.0 got: 11.8.6 - node-abi: 4.25.0 + node-abi: 4.26.0 node-api-version: 0.2.1 ora: 5.4.1 read-binary-file-arch: 1.0.6 @@ -16826,7 +16828,7 @@ snapshots: detect-libc: 2.1.2 got: 11.8.6 graceful-fs: 4.2.11 - node-abi: 4.25.0 + node-abi: 4.26.0 node-api-version: 0.2.1 node-gyp: 11.4.2 ora: 5.4.1 @@ -26746,7 +26748,7 @@ snapshots: nice-try@1.0.5: {} - node-abi@4.25.0: + node-abi@4.26.0: dependencies: semver: 7.7.3 @@ -27889,7 +27891,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 4.25.0 + node-abi: 4.26.0 pump: 3.0.3 rc: 1.2.8 simple-get: 4.0.1 From a285c46b97173d17fd32bea548f82e34382bb1ba Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 01:36:23 +0000 Subject: [PATCH 011/316] fix(deps): update dependency @preact/signals to v2.6.0 --- apps/client/package.json | 2 +- pnpm-lock.yaml | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 1eb7e79009..f7630da16a 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -27,7 +27,7 @@ "@mermaid-js/layout-elk": "0.2.0", "@mind-elixir/node-menu": "5.0.1", "@popperjs/core": "2.11.8", - "@preact/signals": "2.5.1", + "@preact/signals": "2.6.0", "@triliumnext/ckeditor5": "workspace:*", "@triliumnext/codemirror": "workspace:*", "@triliumnext/commons": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24521f0d5e..e440398aa5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -197,8 +197,8 @@ importers: specifier: 2.11.8 version: 2.11.8 '@preact/signals': - specifier: 2.5.1 - version: 2.5.1(preact@10.28.2) + specifier: 2.6.0 + version: 2.6.0(preact@10.28.2) '@triliumnext/ckeditor5': specifier: workspace:* version: link:../../packages/ckeditor5 @@ -4043,11 +4043,11 @@ packages: '@babel/core': 7.x vite: 2.x || 3.x || 4.x || 5.x || 6.x || 7.x - '@preact/signals-core@1.12.1': - resolution: {integrity: sha512-BwbTXpj+9QutoZLQvbttRg5x3l5468qaV2kufh+51yha1c53ep5dY4kTuZR35+3pAZxpfQerGJiQqg34ZNZ6uA==} + '@preact/signals-core@1.12.2': + resolution: {integrity: sha512-5Yf8h1Ke3SMHr15xl630KtwPTW4sYDFkkxS0vQ8UiQLWwZQnrF9IKaVG1mN5VcJz52EcWs2acsc/Npjha/7ysA==} - '@preact/signals@2.5.1': - resolution: {integrity: sha512-VPjk5YFt7i11Fi4UK0tzaEe5xLwfhUxXL3l89ocxQ5aPz7bRo8M5+N73LjBMPklyXKYKz6YsNo4Smp8n6nplng==} + '@preact/signals@2.6.0': + resolution: {integrity: sha512-a22Mh1CCA+PaqobdV2YfeZ30PGywp/QnhCBNVDIsHUdkuqpYcbxt0vgC78JYaicBqWxAOGXLoExj5WHaZ/VKvg==} peerDependencies: preact: 10.28.2 @@ -15307,6 +15307,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -18510,11 +18512,11 @@ snapshots: - preact - supports-color - '@preact/signals-core@1.12.1': {} + '@preact/signals-core@1.12.2': {} - '@preact/signals@2.5.1(preact@10.28.2)': + '@preact/signals@2.6.0(preact@10.28.2)': dependencies: - '@preact/signals-core': 1.12.1 + '@preact/signals-core': 1.12.2 preact: 10.28.2 '@prefresh/babel-plugin@0.5.2': {} From 794e03b2cb023a33f9beaa2629cab084ac9164c4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 01:37:06 +0000 Subject: [PATCH 012/316] fix(deps): update dependency i18next to v25.8.0 --- apps/client/package.json | 2 +- apps/server/package.json | 2 +- apps/website/package.json | 2 +- pnpm-lock.yaml | 28 +++++++++++++++------------- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 1eb7e79009..317ce2e50c 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -44,7 +44,7 @@ "draggabilly": "3.0.0", "force-graph": "1.51.0", "globals": "17.0.0", - "i18next": "25.7.4", + "i18next": "25.8.0", "i18next-http-backend": "3.0.2", "jquery": "4.0.0", "jquery.fancytree": "2.38.5", diff --git a/apps/server/package.json b/apps/server/package.json index 3c8f269935..482f608dac 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -99,7 +99,7 @@ "html2plaintext": "2.1.4", "http-proxy-agent": "7.0.2", "https-proxy-agent": "7.0.6", - "i18next": "25.7.4", + "i18next": "25.8.0", "i18next-fs-backend": "2.6.1", "image-type": "6.0.0", "ini": "6.0.0", diff --git a/apps/website/package.json b/apps/website/package.json index 304563fcb4..b478eec643 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -9,7 +9,7 @@ "preview": "pnpm build && vite preview" }, "dependencies": { - "i18next": "25.7.4", + "i18next": "25.8.0", "i18next-http-backend": "3.0.2", "preact": "10.28.2", "preact-iso": "2.11.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24521f0d5e..9604bc7151 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -248,8 +248,8 @@ importers: specifier: 17.0.0 version: 17.0.0 i18next: - specifier: 25.7.4 - version: 25.7.4(typescript@5.9.3) + specifier: 25.8.0 + version: 25.8.0(typescript@5.9.3) i18next-http-backend: specifier: 3.0.2 version: 3.0.2(encoding@0.1.13) @@ -297,7 +297,7 @@ importers: version: 10.28.2 react-i18next: specifier: 16.5.3 - version: 16.5.3(i18next@25.7.4(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + version: 16.5.3(i18next@25.8.0(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) react-window: specifier: 2.2.5 version: 2.2.5(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -712,8 +712,8 @@ importers: specifier: 7.0.6 version: 7.0.6 i18next: - specifier: 25.7.4 - version: 25.7.4(typescript@5.9.3) + specifier: 25.8.0 + version: 25.8.0(typescript@5.9.3) i18next-fs-backend: specifier: 2.6.1 version: 2.6.1 @@ -820,8 +820,8 @@ importers: apps/website: dependencies: i18next: - specifier: 25.7.4 - version: 25.7.4(typescript@5.9.3) + specifier: 25.8.0 + version: 25.8.0(typescript@5.9.3) i18next-http-backend: specifier: 3.0.2 version: 3.0.2(encoding@0.1.13) @@ -836,7 +836,7 @@ importers: version: 6.6.5(preact@10.28.2) react-i18next: specifier: 16.5.3 - version: 16.5.3(i18next@25.7.4(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + version: 16.5.3(i18next@25.8.0(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) devDependencies: '@preact/preset-vite': specifier: 2.10.2 @@ -9024,8 +9024,8 @@ packages: i18next-http-backend@3.0.2: resolution: {integrity: sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==} - i18next@25.7.4: - resolution: {integrity: sha512-hRkpEblXXcXSNbw8mBNq9042OEetgyB/ahc/X17uV/khPwzV+uB8RHceHh3qavyrkPJvmXFKXME2Sy1E0KjAfw==} + i18next@25.8.0: + resolution: {integrity: sha512-urrg4HMFFMQZ2bbKRK7IZ8/CTE7D8H4JRlAwqA2ZwDRFfdd0K/4cdbNNLgfn9mo+I/h9wJu61qJzH7jCFAhUZQ==} peerDependencies: typescript: ^5 peerDependenciesMeta: @@ -15307,6 +15307,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -24857,7 +24859,7 @@ snapshots: transitivePeerDependencies: - encoding - i18next@25.7.4(typescript@5.9.3): + i18next@25.8.0(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 optionalDependencies: @@ -28092,11 +28094,11 @@ snapshots: react: 19.2.3 scheduler: 0.27.0 - react-i18next@16.5.3(i18next@25.7.4(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3): + react-i18next@16.5.3(i18next@25.8.0(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 html-parse-stringify: 3.0.1 - i18next: 25.7.4(typescript@5.9.3) + i18next: 25.8.0(typescript@5.9.3) react: 19.2.3 use-sync-external-store: 1.6.0(react@19.2.3) optionalDependencies: From 96b1efcfdc9a9417ed5cbd6eae6a36f3dd75b2c4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 06:17:33 +0000 Subject: [PATCH 013/316] chore(deps): update dependency lightningcss to v1.31.1 --- apps/client/package.json | 2 +- pnpm-lock.yaml | 236 +++++++++++++++++++-------------------- 2 files changed, 119 insertions(+), 119 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 1eb7e79009..8f5990b69d 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -79,7 +79,7 @@ "@types/tabulator-tables": "6.3.1", "copy-webpack-plugin": "13.0.1", "happy-dom": "20.3.3", - "lightningcss": "1.30.2", + "lightningcss": "1.31.1", "script-loader": "0.7.2", "vite-plugin-static-copy": "3.1.5" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24521f0d5e..31033f4299 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,10 +57,10 @@ importers: version: 24.10.9 '@vitest/browser-webdriverio': specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-v8': specifier: 4.0.17 - version: 4.0.17(@vitest/browser@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17))(vitest@4.0.17) + version: 4.0.17(@vitest/browser@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17))(vitest@4.0.17) '@vitest/ui': specifier: 4.0.17 version: 4.0.17(vitest@4.0.17) @@ -111,7 +111,7 @@ importers: version: 0.18.0 rollup-plugin-webpack-stats: specifier: 2.1.9 - version: 2.1.9(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.1.9(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) tslib: specifier: 2.8.1 version: 2.8.1 @@ -129,13 +129,13 @@ importers: version: 2.0.1 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -319,7 +319,7 @@ importers: version: 5.0.0 '@prefresh/vite': specifier: 2.4.11 - version: 2.4.11(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.4.11(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@types/bootstrap': specifier: 5.2.10 version: 5.2.10 @@ -348,14 +348,14 @@ importers: specifier: 20.3.3 version: 20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) lightningcss: - specifier: 1.30.2 - version: 1.30.2 + specifier: 1.31.1 + version: 1.31.1 script-loader: specifier: 0.7.2 version: 0.7.2 vite-plugin-static-copy: specifier: 3.1.5 - version: 3.1.5(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 3.1.5(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) apps/db-compare: dependencies: @@ -800,7 +800,7 @@ importers: version: 1.0.1 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) ws: specifier: 8.19.0 version: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -840,7 +840,7 @@ importers: devDependencies: '@preact/preset-vite': specifier: 2.10.2 - version: 2.10.2(@babel/core@7.28.0)(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.10.2(@babel/core@7.28.0)(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) eslint: specifier: 9.39.2 version: 9.39.2(jiti@2.6.1) @@ -855,10 +855,10 @@ importers: version: 0.4.2 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -913,7 +913,7 @@ importers: version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) '@vitest/coverage-istanbul': specifier: 4.0.17 version: 4.0.17(vitest@4.0.17) @@ -946,10 +946,10 @@ importers: version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -973,7 +973,7 @@ importers: version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) '@vitest/coverage-istanbul': specifier: 4.0.17 version: 4.0.17(vitest@4.0.17) @@ -1006,10 +1006,10 @@ importers: version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1033,7 +1033,7 @@ importers: version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) '@vitest/coverage-istanbul': specifier: 4.0.17 version: 4.0.17(vitest@4.0.17) @@ -1066,10 +1066,10 @@ importers: version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1100,7 +1100,7 @@ importers: version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) '@vitest/coverage-istanbul': specifier: 4.0.17 version: 4.0.17(vitest@4.0.17) @@ -1133,10 +1133,10 @@ importers: version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1167,7 +1167,7 @@ importers: version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) '@vitest/coverage-istanbul': specifier: 4.0.17 version: 4.0.17(vitest@4.0.17) @@ -1200,10 +1200,10 @@ importers: version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -9776,74 +9776,74 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + lightningcss-android-arm64@1.31.1: + resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + lightningcss-darwin-arm64@1.31.1: + resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + lightningcss-darwin-x64@1.31.1: + resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + lightningcss-freebsd-x64@1.31.1: + resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + lightningcss-linux-arm-gnueabihf@1.31.1: + resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + lightningcss-linux-arm64-gnu@1.31.1: + resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + lightningcss-linux-arm64-musl@1.31.1: + resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + lightningcss-linux-x64-gnu@1.31.1: + resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + lightningcss-linux-x64-musl@1.31.1: + resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + lightningcss-win32-arm64-msvc@1.31.1: + resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + lightningcss-win32-x64-msvc@1.31.1: + resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.30.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + lightningcss@1.31.1: + resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} lilconfig@2.1.0: @@ -15307,6 +15307,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -16014,8 +16016,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-slash-command@47.4.0': dependencies: @@ -18494,18 +18494,18 @@ snapshots: '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.2(@babel/core@7.28.0)(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@preact/preset-vite@2.10.2(@babel/core@7.28.0)(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) - '@prefresh/vite': 2.4.8(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@prefresh/vite': 2.4.8(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.0) debug: 4.4.1 picocolors: 1.1.1 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-prerender-plugin: 0.5.11(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite-prerender-plugin: 0.5.11(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - preact - supports-color @@ -18525,7 +18525,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.11(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@prefresh/vite@2.4.11(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@prefresh/babel-plugin': 0.5.2 @@ -18533,11 +18533,11 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.28.2 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@prefresh/vite@2.4.8(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@prefresh/vite@2.4.8(preact@10.28.2)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@prefresh/babel-plugin': 0.5.2 @@ -18545,7 +18545,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.28.2 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -20566,10 +20566,10 @@ snapshots: - bufferutil - utf-8-validate - '@vitest/browser-webdriverio@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@vitest/browser-webdriverio@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: - '@vitest/browser': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + '@vitest/browser': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -20577,16 +20577,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)': + '@vitest/browser@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)': dependencies: - '@vitest/mocker': 4.0.17(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/mocker': 4.0.17(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/utils': 4.0.17 magic-string: 0.30.21 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) ws: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -20606,11 +20606,11 @@ snapshots: magicast: 0.5.1 obug: 2.1.1 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.17(@vitest/browser@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17))(vitest@4.0.17)': + '@vitest/coverage-v8@4.0.17(@vitest/browser@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17))(vitest@4.0.17)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.17 @@ -20622,9 +20622,9 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + '@vitest/browser': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) '@vitest/expect@4.0.17': dependencies: @@ -20635,14 +20635,14 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.17(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitest/mocker@4.0.17(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.17 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.7.5(@types/node@24.10.9)(typescript@5.9.3) - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/pretty-format@4.0.17': dependencies: @@ -20670,7 +20670,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/utils@4.0.17': dependencies: @@ -25630,54 +25630,54 @@ snapshots: dependencies: immediate: 3.0.6 - lightningcss-android-arm64@1.30.2: + lightningcss-android-arm64@1.31.1: optional: true - lightningcss-darwin-arm64@1.30.2: + lightningcss-darwin-arm64@1.31.1: optional: true - lightningcss-darwin-x64@1.30.2: + lightningcss-darwin-x64@1.31.1: optional: true - lightningcss-freebsd-x64@1.30.2: + lightningcss-freebsd-x64@1.31.1: optional: true - lightningcss-linux-arm-gnueabihf@1.30.2: + lightningcss-linux-arm-gnueabihf@1.31.1: optional: true - lightningcss-linux-arm64-gnu@1.30.2: + lightningcss-linux-arm64-gnu@1.31.1: optional: true - lightningcss-linux-arm64-musl@1.30.2: + lightningcss-linux-arm64-musl@1.31.1: optional: true - lightningcss-linux-x64-gnu@1.30.2: + lightningcss-linux-x64-gnu@1.31.1: optional: true - lightningcss-linux-x64-musl@1.30.2: + lightningcss-linux-x64-musl@1.31.1: optional: true - lightningcss-win32-arm64-msvc@1.30.2: + lightningcss-win32-arm64-msvc@1.31.1: optional: true - lightningcss-win32-x64-msvc@1.30.2: + lightningcss-win32-x64-msvc@1.31.1: optional: true - lightningcss@1.30.2: + lightningcss@1.31.1: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 + lightningcss-android-arm64: 1.31.1 + lightningcss-darwin-arm64: 1.31.1 + lightningcss-darwin-x64: 1.31.1 + lightningcss-freebsd-x64: 1.31.1 + lightningcss-linux-arm-gnueabihf: 1.31.1 + lightningcss-linux-arm64-gnu: 1.31.1 + lightningcss-linux-arm64-musl: 1.31.1 + lightningcss-linux-x64-gnu: 1.31.1 + lightningcss-linux-x64-musl: 1.31.1 + lightningcss-win32-arm64-msvc: 1.31.1 + lightningcss-win32-x64-msvc: 1.31.1 lilconfig@2.1.0: {} @@ -28514,11 +28514,11 @@ snapshots: '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.29 optional: true - rollup-plugin-stats@1.5.4(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + rollup-plugin-stats@1.5.4(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): optionalDependencies: rolldown: 1.0.0-beta.29 rollup: 4.52.0 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) rollup-plugin-styles@4.0.0(rollup@4.52.0): dependencies: @@ -28547,13 +28547,13 @@ snapshots: '@rollup/pluginutils': 5.1.4(rollup@4.52.0) rollup: 4.52.0 - rollup-plugin-webpack-stats@2.1.9(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + rollup-plugin-webpack-stats@2.1.9(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - rollup-plugin-stats: 1.5.4(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + rollup-plugin-stats: 1.5.4(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) optionalDependencies: rolldown: 1.0.0-beta.29 rollup: 4.52.0 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) rollup@4.52.0: dependencies: @@ -30476,7 +30476,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-plugin-dts@4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.52.8(@types/node@24.10.9) '@rollup/pluginutils': 5.1.4(rollup@4.52.0) @@ -30489,27 +30489,27 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-static-copy@3.1.5(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-static-copy@3.1.5(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: chokidar: 3.6.0 p-map: 7.0.4 picocolors: 1.1.1 tinyglobby: 0.2.15 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: svgo: 3.3.2 typescript: 5.9.3 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-prerender-plugin@0.5.11(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-prerender-plugin@0.5.11(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -30517,9 +30517,9 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -30532,17 +30532,17 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 less: 4.1.3 - lightningcss: 1.30.2 + lightningcss: 1.31.1 sass: 1.91.0 sass-embedded: 1.91.0 terser: 5.44.0 tsx: 4.21.0 yaml: 2.8.1 - vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.2)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.17 - '@vitest/mocker': 4.0.17(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/mocker': 4.0.17(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.17 '@vitest/runner': 4.0.17 '@vitest/snapshot': 4.0.17 @@ -30559,12 +30559,12 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 24.10.9 - '@vitest/browser-webdriverio': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.2)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/browser-webdriverio': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/ui': 4.0.17(vitest@4.0.17) happy-dom: 20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) From 917e881faaca14180656ce3be2571e3db1147aa1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 10:43:23 +0000 Subject: [PATCH 014/316] chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v54.3.2 --- packages/ckeditor5-admonition/package.json | 2 +- packages/ckeditor5-footnotes/package.json | 2 +- .../ckeditor5-keyboard-marker/package.json | 2 +- packages/ckeditor5-math/package.json | 2 +- packages/ckeditor5-mermaid/package.json | 2 +- pnpm-lock.yaml | 64 +++++++++++-------- 6 files changed, 43 insertions(+), 31 deletions(-) diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index 2364bd8514..6e8907497f 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -21,7 +21,7 @@ "ckeditor5-metadata.json" ], "devDependencies": { - "@ckeditor/ckeditor5-dev-build-tools": "54.3.0", + "@ckeditor/ckeditor5-dev-build-tools": "54.3.2", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.53.0", diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index e387a85184..0bec430bff 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -22,7 +22,7 @@ "ckeditor5-metadata.json" ], "devDependencies": { - "@ckeditor/ckeditor5-dev-build-tools": "54.3.0", + "@ckeditor/ckeditor5-dev-build-tools": "54.3.2", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.53.0", diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index e72036a08b..590f80fc68 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -24,7 +24,7 @@ "ckeditor5-metadata.json" ], "devDependencies": { - "@ckeditor/ckeditor5-dev-build-tools": "54.3.0", + "@ckeditor/ckeditor5-dev-build-tools": "54.3.2", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.53.0", diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index 259cee11d9..e6088e757f 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -24,7 +24,7 @@ "ckeditor5-metadata.json" ], "devDependencies": { - "@ckeditor/ckeditor5-dev-build-tools": "54.3.0", + "@ckeditor/ckeditor5-dev-build-tools": "54.3.2", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.53.0", diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index 34d580fff2..1274dbd0d6 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -24,7 +24,7 @@ "ckeditor5-metadata.json" ], "devDependencies": { - "@ckeditor/ckeditor5-dev-build-tools": "54.3.0", + "@ckeditor/ckeditor5-dev-build-tools": "54.3.2", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.53.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24521f0d5e..935b33b9f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -897,8 +897,8 @@ importers: packages/ckeditor5-admonition: devDependencies: '@ckeditor/ckeditor5-dev-build-tools': - specifier: 54.3.0 - version: 54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) + specifier: 54.3.2 + version: 54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 @@ -957,8 +957,8 @@ importers: packages/ckeditor5-footnotes: devDependencies: '@ckeditor/ckeditor5-dev-build-tools': - specifier: 54.3.0 - version: 54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) + specifier: 54.3.2 + version: 54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 @@ -1017,8 +1017,8 @@ importers: packages/ckeditor5-keyboard-marker: devDependencies: '@ckeditor/ckeditor5-dev-build-tools': - specifier: 54.3.0 - version: 54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) + specifier: 54.3.2 + version: 54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 @@ -1084,8 +1084,8 @@ importers: version: 0.108.2 devDependencies: '@ckeditor/ckeditor5-dev-build-tools': - specifier: 54.3.0 - version: 54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) + specifier: 54.3.2 + version: 54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 @@ -1151,8 +1151,8 @@ importers: version: 4.17.22 devDependencies: '@ckeditor/ckeditor5-dev-build-tools': - specifier: 54.3.0 - version: 54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) + specifier: 54.3.2 + version: 54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 @@ -1852,8 +1852,8 @@ packages: '@ckeditor/ckeditor5-core@47.4.0': resolution: {integrity: sha512-upV/3x9fhgFWxVVtwR47zCOAvZKgP8a8N7UQOFwfs3Tr52+oE1gULWKTiS9079MBaXaIqtM/EbelNdvBh4gOGg==} - '@ckeditor/ckeditor5-dev-build-tools@54.3.0': - resolution: {integrity: sha512-46gPUhiSdDdFBsGewGgSnVq2E5vkwXBVN2L9dbQ3t9Wta3F4zjXxw+496mAq71hAVxfZmyACjaVT3pAJojUIRw==} + '@ckeditor/ckeditor5-dev-build-tools@54.3.2': + resolution: {integrity: sha512-xmK8/vbx5uVvkLwZ5kpW5A55LKYDRFQxYvh8rcybYG/B3yNgKrq7oJXvjVPTIqWiMT3JpjJ4J/NttIYDaXZhCw==} engines: {node: '>=24.11.0', npm: '>=5.7.1'} hasBin: true @@ -15242,6 +15242,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15307,8 +15309,10 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color - '@ckeditor/ckeditor5-dev-build-tools@54.3.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': + '@ckeditor/ckeditor5-dev-build-tools@54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: '@rollup/plugin-commonjs': 28.0.9(rollup@4.52.0) '@rollup/plugin-json': 6.1.0(rollup@4.52.0) @@ -15432,6 +15436,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -15970,6 +15976,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -16431,9 +16439,9 @@ snapshots: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.0)': + '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.1)': dependencies: - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 '@csstools/selector-resolve-nested@4.0.0(postcss-selector-parser@7.1.1)': dependencies: @@ -16443,6 +16451,10 @@ snapshots: dependencies: postcss-selector-parser: 7.1.0 + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.1)': + dependencies: + postcss-selector-parser: 7.1.1 + '@csstools/selector-specificity@6.0.0(postcss-selector-parser@7.1.1)': dependencies: postcss-selector-parser: 7.1.1 @@ -27456,7 +27468,7 @@ snapshots: postcss-calc@10.1.1(postcss@8.5.6): dependencies: postcss: 8.5.6 - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 postcss-calc@8.2.4(postcss@8.5.6): @@ -27500,7 +27512,7 @@ snapshots: postcss-discard-comments@7.0.4(postcss@8.5.6): dependencies: postcss: 8.5.6 - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 postcss-discard-duplicates@5.1.0(postcss@8.5.6): dependencies: @@ -27585,7 +27597,7 @@ snapshots: caniuse-api: 3.0.0 cssnano-utils: 5.0.1(postcss@8.5.6) postcss: 8.5.6 - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 postcss-minify-font-values@5.1.0(postcss@8.5.6): dependencies: @@ -27634,7 +27646,7 @@ snapshots: dependencies: cssesc: 3.0.0 postcss: 8.5.6 - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 postcss-mixins@11.0.3(postcss@8.5.6): dependencies: @@ -27652,13 +27664,13 @@ snapshots: dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 postcss-modules-scope@3.2.1(postcss@8.5.6): dependencies: postcss: 8.5.6 - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 postcss-modules-values@4.0.0(postcss@8.5.6): dependencies: @@ -27667,10 +27679,10 @@ snapshots: postcss-nesting@13.0.2(postcss@8.5.6): dependencies: - '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.0) - '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.1) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) postcss: 8.5.6 - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 postcss-normalize-charset@5.1.0(postcss@8.5.6): dependencies: @@ -27842,7 +27854,7 @@ snapshots: postcss-unique-selectors@7.0.4(postcss@8.5.6): dependencies: postcss: 8.5.6 - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 postcss-value-parser@4.2.0: {} @@ -29509,7 +29521,7 @@ snapshots: dependencies: browserslist: 4.26.2 postcss: 8.5.6 - postcss-selector-parser: 7.1.0 + postcss-selector-parser: 7.1.1 stylelint-config-ckeditor5@13.0.0(stylelint@17.0.0(typescript@5.9.3)): dependencies: From 8a280c2f9dbbb922e910f10324a6c4fbe0258c1d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 17:07:19 +0000 Subject: [PATCH 015/316] chore(deps): update dependency happy-dom to v20.3.4 --- apps/client/package.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 50 +++++++++++++++++++++++----------------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 0f3bd99479..f8c2e98227 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -78,7 +78,7 @@ "@types/reveal.js": "5.2.2", "@types/tabulator-tables": "6.3.1", "copy-webpack-plugin": "13.0.1", - "happy-dom": "20.3.3", + "happy-dom": "20.3.4", "lightningcss": "1.31.1", "script-loader": "0.7.2", "vite-plugin-static-copy": "3.1.5" diff --git a/package.json b/package.json index 381cca4bdd..8bb9583147 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "eslint-config-prettier": "10.1.8", "eslint-plugin-playwright": "2.5.0", "eslint-plugin-simple-import-sort": "12.1.1", - "happy-dom": "20.3.3", + "happy-dom": "20.3.4", "http-server": "14.1.1", "jiti": "2.6.1", "js-yaml": "4.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 80b8e9659b..69981a1a36 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -92,8 +92,8 @@ importers: specifier: 12.1.1 version: 12.1.1(eslint@9.39.2(jiti@2.6.1)) happy-dom: - specifier: 20.3.3 - version: 20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 20.3.4 + version: 20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) http-server: specifier: 14.1.1 version: 14.1.1 @@ -135,7 +135,7 @@ importers: version: 4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -345,8 +345,8 @@ importers: specifier: 13.0.1 version: 13.0.1(webpack@5.101.3(esbuild@0.27.2)) happy-dom: - specifier: 20.3.3 - version: 20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 20.3.4 + version: 20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) lightningcss: specifier: 1.31.1 version: 1.31.1 @@ -858,7 +858,7 @@ importers: version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -949,7 +949,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1009,7 +1009,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1069,7 +1069,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1136,7 +1136,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1203,7 +1203,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -8746,8 +8746,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@20.3.3: - resolution: {integrity: sha512-hM9gltmtQLfmWPqoPreUtRdP3nZCSzQEw7l/JC+up5CxquDykhYFKzIzoFFeVev3AGFEULNvsbE8fpZPgxUYEQ==} + happy-dom@20.3.4: + resolution: {integrity: sha512-rfbiwB6OKxZFIFQ7SRnCPB2WL9WhyXsFoTfecYgeCeFSOBxvkWLaXsdv5ehzJrfqwXQmDephAKWLRQoFoJwrew==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -15242,6 +15242,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15443,6 +15445,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -15972,6 +15976,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -16016,6 +16022,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-slash-command@47.4.0': dependencies: @@ -20569,7 +20577,7 @@ snapshots: '@vitest/browser-webdriverio@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: '@vitest/browser': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -20586,7 +20594,7 @@ snapshots: pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) ws: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -20606,7 +20614,7 @@ snapshots: magicast: 0.5.1 obug: 2.1.1 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -20622,7 +20630,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) optionalDependencies: '@vitest/browser': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) @@ -20670,7 +20678,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/utils@4.0.17': dependencies: @@ -24457,7 +24465,7 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5): + happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/node': 24.10.9 '@types/whatwg-mimetype': 3.0.2 @@ -30539,7 +30547,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.1 - vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.17 '@vitest/mocker': 4.0.17(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) @@ -30566,7 +30574,7 @@ snapshots: '@types/node': 24.10.9 '@vitest/browser-webdriverio': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/ui': 4.0.17(vitest@4.0.17) - happy-dom: 20.3.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + happy-dom: 20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - jiti From 227be184ac0a13c55d4e3cba302a43ea40ffb224 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 21 Jan 2026 22:34:36 +0200 Subject: [PATCH 016/316] fix(shortcuts): overlap on azerty due to key matches --- apps/client/src/services/shortcuts.spec.ts | 26 +++++++++++++++++----- apps/client/src/services/shortcuts.ts | 9 +++++--- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/apps/client/src/services/shortcuts.spec.ts b/apps/client/src/services/shortcuts.spec.ts index f2170da30d..c8f2d9b643 100644 --- a/apps/client/src/services/shortcuts.spec.ts +++ b/apps/client/src/services/shortcuts.spec.ts @@ -62,9 +62,10 @@ describe("shortcuts", () => { }); describe("keyMatches", () => { - const createKeyboardEvent = (key: string, code?: string) => ({ + const createKeyboardEvent = (key: string, code?: string, extraProps: Partial = {}) => ({ key, - code: code || `Key${key.toUpperCase()}` + code: code || `Key${key.toUpperCase()}`, + ...extraProps } as KeyboardEvent); it("should match regular letter keys using key code", () => { @@ -102,17 +103,23 @@ describe("shortcuts", () => { consoleSpy.mockRestore(); }); + it("should match azerty keys", () => { + const event = createKeyboardEvent("A", "KeyQ"); + expect(keyMatches(event, "a")).toBe(true); + expect(keyMatches(event, "q")).toBe(false); + }); + it("should match letter keys using code when key is a special character (macOS Alt behavior)", () => { // On macOS, pressing Option/Alt + A produces 'å' as the key, but code is still 'KeyA' - const macOSAltAEvent = createKeyboardEvent("å", "KeyA"); + const macOSAltAEvent = createKeyboardEvent("å", "KeyA", { altKey: true }); expect(keyMatches(macOSAltAEvent, "a")).toBe(true); // Option + H produces '˙' - const macOSAltHEvent = createKeyboardEvent("˙", "KeyH"); + const macOSAltHEvent = createKeyboardEvent("˙", "KeyH", { altKey: true }); expect(keyMatches(macOSAltHEvent, "h")).toBe(true); // Option + S produces 'ß' - const macOSAltSEvent = createKeyboardEvent("ß", "KeyS"); + const macOSAltSEvent = createKeyboardEvent("ß", "KeyS", { altKey: true }); expect(keyMatches(macOSAltSEvent, "s")).toBe(true); }); }); @@ -216,6 +223,15 @@ describe("shortcuts", () => { consoleSpy.mockRestore(); }); + it("matches azerty", () => { + const event = createKeyboardEvent({ + key: "a", + code: "KeyQ", + ctrlKey: true + }); + expect(matchesShortcut(event, "Ctrl+A")).toBe(true); + }); + it("should match Alt+letter shortcuts on macOS where key is a special character", () => { // On macOS, pressing Option/Alt + A produces 'å' but code remains 'KeyA' const macOSAltAEvent = createKeyboardEvent({ diff --git a/apps/client/src/services/shortcuts.ts b/apps/client/src/services/shortcuts.ts index 63db45302d..c367ecac31 100644 --- a/apps/client/src/services/shortcuts.ts +++ b/apps/client/src/services/shortcuts.ts @@ -215,9 +215,12 @@ export function keyMatches(e: KeyboardEvent, key: string): boolean { // For letter keys, use the physical key code for consistency // On macOS, Option/Alt key produces special characters, so we must use e.code if (key.length === 1 && key >= 'a' && key <= 'z') { - // e.code is like "KeyA", "KeyB", etc. - const expectedCode = `Key${key.toUpperCase()}`; - return e.code === expectedCode || e.key.toLowerCase() === key.toLowerCase(); + if (e.altKey) { + // e.code is like "KeyA", "KeyB", etc. + const expectedCode = `Key${key.toUpperCase()}`; + return e.code === expectedCode || e.key.toLowerCase() === key.toLowerCase(); + } + return e.key.toLowerCase() === key.toLowerCase(); } // For regular keys, check both key and code as fallback From 022c967781c2be3f39db5812be80da959b4d65be Mon Sep 17 00:00:00 2001 From: perfectra1n Date: Wed, 21 Jan 2026 16:25:17 -0800 Subject: [PATCH 017/316] feat(etapi): add revisions route and "undelete" route to etapi --- apps/server/etapi.openapi.yaml | 214 ++++++++++++++++++ .../spec/etapi/get-note-revisions.spec.ts | 77 +++++++ apps/server/spec/etapi/get-revision.spec.ts | 71 ++++++ apps/server/spec/etapi/note-history.spec.ts | 94 ++++++++ .../spec/etapi/revision-content.spec.ts | 64 ++++++ apps/server/spec/etapi/undelete-note.spec.ts | 103 +++++++++ apps/server/src/etapi/etapi_utils.ts | 13 +- apps/server/src/etapi/mappers.ts | 22 +- apps/server/src/etapi/revisions.ts | 178 +++++++++++++++ apps/server/src/routes/routes.ts | 3 + 10 files changed, 837 insertions(+), 2 deletions(-) create mode 100644 apps/server/spec/etapi/get-note-revisions.spec.ts create mode 100644 apps/server/spec/etapi/get-revision.spec.ts create mode 100644 apps/server/spec/etapi/note-history.spec.ts create mode 100644 apps/server/spec/etapi/revision-content.spec.ts create mode 100644 apps/server/spec/etapi/undelete-note.spec.ts create mode 100644 apps/server/src/etapi/revisions.ts diff --git a/apps/server/etapi.openapi.yaml b/apps/server/etapi.openapi.yaml index f35d9ad926..af05bdbe57 100644 --- a/apps/server/etapi.openapi.yaml +++ b/apps/server/etapi.openapi.yaml @@ -337,6 +337,130 @@ paths: application/json; charset=utf-8: schema: $ref: "#/components/schemas/Error" + /notes/{noteId}/revisions: + parameters: + - name: noteId + in: path + required: true + schema: + $ref: "#/components/schemas/EntityId" + get: + description: Returns all revisions for a note identified by its ID + operationId: getNoteRevisions + responses: + "200": + description: list of revisions + content: + application/json; charset=utf-8: + schema: + type: array + items: + $ref: "#/components/schemas/Revision" + default: + description: unexpected error + content: + application/json; charset=utf-8: + schema: + $ref: "#/components/schemas/Error" + /notes/{noteId}/undelete: + parameters: + - name: noteId + in: path + required: true + schema: + $ref: "#/components/schemas/EntityId" + post: + description: Restore a deleted note. The note must be deleted and must have at least one undeleted parent. + operationId: undeleteNote + responses: + "200": + description: note restored successfully + content: + application/json; charset=utf-8: + schema: + type: object + properties: + success: + type: boolean + example: true + default: + description: unexpected error + content: + application/json; charset=utf-8: + schema: + $ref: "#/components/schemas/Error" + /notes/history: + get: + description: Returns recent changes including note creations, modifications, and deletions + operationId: getNoteHistory + parameters: + - name: ancestorNoteId + in: query + required: false + description: Limit changes to a subtree identified by this note ID. Defaults to "root" (all notes). + schema: + $ref: "#/components/schemas/EntityId" + responses: + "200": + description: list of recent changes + content: + application/json; charset=utf-8: + schema: + type: array + items: + $ref: "#/components/schemas/RecentChange" + default: + description: unexpected error + content: + application/json; charset=utf-8: + schema: + $ref: "#/components/schemas/Error" + /revisions/{revisionId}: + parameters: + - name: revisionId + in: path + required: true + schema: + $ref: "#/components/schemas/EntityId" + get: + description: Returns a revision identified by its ID + operationId: getRevisionById + responses: + "200": + description: revision response + content: + application/json; charset=utf-8: + schema: + $ref: "#/components/schemas/Revision" + default: + description: unexpected error + content: + application/json; charset=utf-8: + schema: + $ref: "#/components/schemas/Error" + /revisions/{revisionId}/content: + parameters: + - name: revisionId + in: path + required: true + schema: + $ref: "#/components/schemas/EntityId" + get: + description: Returns revision content identified by its ID + operationId: getRevisionContent + responses: + "200": + description: revision content response + content: + text/html: + schema: + type: string + default: + description: unexpected error + content: + application/json; charset=utf-8: + schema: + $ref: "#/components/schemas/Error" /branches: post: description: > @@ -1186,3 +1310,93 @@ components: type: string description: Human readable error, potentially with more details, example: Note 'evnnmvHTCgIn' is protected and cannot be modified through ETAPI + Revision: + type: object + description: Revision represents a snapshot of note's title and content at some point in the past. + properties: + revisionId: + $ref: "#/components/schemas/EntityId" + readOnly: true + noteId: + $ref: "#/components/schemas/EntityId" + readOnly: true + type: + type: string + enum: + [ + text, + code, + render, + file, + image, + search, + relationMap, + book, + noteMap, + mermaid, + webView, + shortcut, + doc, + contentWidget, + launcher, + ] + mime: + type: string + isProtected: + type: boolean + readOnly: true + title: + type: string + blobId: + type: string + description: ID of the blob object which effectively serves as a content hash + dateLastEdited: + $ref: "#/components/schemas/LocalDateTime" + readOnly: true + dateCreated: + $ref: "#/components/schemas/LocalDateTime" + readOnly: true + utcDateLastEdited: + $ref: "#/components/schemas/UtcDateTime" + readOnly: true + utcDateCreated: + $ref: "#/components/schemas/UtcDateTime" + readOnly: true + utcDateModified: + $ref: "#/components/schemas/UtcDateTime" + readOnly: true + contentLength: + type: integer + format: int32 + readOnly: true + RecentChange: + type: object + description: Represents a recent change event (creation, modification, or deletion). + properties: + noteId: + $ref: "#/components/schemas/EntityId" + readOnly: true + title: + type: string + description: Title at the time of the change (may be "[protected]" for protected notes) + current_title: + type: string + description: Current title of the note (may be "[protected]" for protected notes) + current_isDeleted: + type: boolean + description: Whether the note is currently deleted + current_deleteId: + type: string + description: Delete ID if the note is deleted + current_isProtected: + type: boolean + description: Whether the note is protected + utcDate: + $ref: "#/components/schemas/UtcDateTime" + description: UTC timestamp of the change + date: + $ref: "#/components/schemas/LocalDateTime" + description: Local timestamp of the change + canBeUndeleted: + type: boolean + description: Whether the note can be undeleted (only present for deleted notes) diff --git a/apps/server/spec/etapi/get-note-revisions.spec.ts b/apps/server/spec/etapi/get-note-revisions.spec.ts new file mode 100644 index 0000000000..acf2bccf54 --- /dev/null +++ b/apps/server/spec/etapi/get-note-revisions.spec.ts @@ -0,0 +1,77 @@ +import { Application } from "express"; +import { beforeAll, describe, expect, it } from "vitest"; +import supertest from "supertest"; +import { createNote, login } from "./utils.js"; +import config from "../../src/services/config.js"; + +let app: Application; +let token: string; + +const USER = "etapi"; +let createdNoteId: string; + +describe("etapi/get-note-revisions", () => { + beforeAll(async () => { + config.General.noAuthentication = false; + const buildApp = (await (import("../../src/app.js"))).default; + app = await buildApp(); + token = await login(app); + createdNoteId = await createNote(app, token); + + // Create a revision by updating the note content + await supertest(app) + .put(`/etapi/notes/${createdNoteId}/content`) + .auth(USER, token, { "type": "basic" }) + .set("Content-Type", "text/plain") + .send("Updated content for revision") + .expect(204); + + // Force create a revision + await supertest(app) + .post(`/etapi/notes/${createdNoteId}/revision`) + .auth(USER, token, { "type": "basic" }) + .expect(204); + }); + + it("gets revisions for a note", async () => { + const response = await supertest(app) + .get(`/etapi/notes/${createdNoteId}/revisions`) + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(Array.isArray(response.body)).toBe(true); + expect(response.body.length).toBeGreaterThan(0); + + const revision = response.body[0]; + expect(revision).toHaveProperty("revisionId"); + expect(revision).toHaveProperty("noteId", createdNoteId); + expect(revision).toHaveProperty("type"); + expect(revision).toHaveProperty("mime"); + expect(revision).toHaveProperty("title"); + expect(revision).toHaveProperty("isProtected"); + expect(revision).toHaveProperty("blobId"); + expect(revision).toHaveProperty("utcDateCreated"); + }); + + it("returns empty array for note with no revisions", async () => { + // Create a new note without any revisions + const newNoteId = await createNote(app, token, "Brand new content"); + + const response = await supertest(app) + .get(`/etapi/notes/${newNoteId}/revisions`) + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(Array.isArray(response.body)).toBe(true); + // New notes may or may not have revisions depending on settings + }); + + it("returns 404 for non-existent note", async () => { + const response = await supertest(app) + .get("/etapi/notes/nonexistentnote/revisions") + .auth(USER, token, { "type": "basic" }) + .expect(404); + + expect(response.body.code).toStrictEqual("NOTE_NOT_FOUND"); + }); +}); diff --git a/apps/server/spec/etapi/get-revision.spec.ts b/apps/server/spec/etapi/get-revision.spec.ts new file mode 100644 index 0000000000..641f5255a7 --- /dev/null +++ b/apps/server/spec/etapi/get-revision.spec.ts @@ -0,0 +1,71 @@ +import { Application } from "express"; +import { beforeAll, describe, expect, it } from "vitest"; +import supertest from "supertest"; +import { createNote, login } from "./utils.js"; +import config from "../../src/services/config.js"; + +let app: Application; +let token: string; + +const USER = "etapi"; +let createdNoteId: string; +let revisionId: string; + +describe("etapi/get-revision", () => { + beforeAll(async () => { + config.General.noAuthentication = false; + const buildApp = (await (import("../../src/app.js"))).default; + app = await buildApp(); + token = await login(app); + createdNoteId = await createNote(app, token, "Initial content"); + + // Update content to create a revision + await supertest(app) + .put(`/etapi/notes/${createdNoteId}/content`) + .auth(USER, token, { "type": "basic" }) + .set("Content-Type", "text/plain") + .send("Updated content") + .expect(204); + + // Force create a revision + await supertest(app) + .post(`/etapi/notes/${createdNoteId}/revision`) + .auth(USER, token, { "type": "basic" }) + .expect(204); + + // Get the revision ID + const revisionsResponse = await supertest(app) + .get(`/etapi/notes/${createdNoteId}/revisions`) + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(revisionsResponse.body.length).toBeGreaterThan(0); + revisionId = revisionsResponse.body[0].revisionId; + }); + + it("gets revision metadata by ID", async () => { + const response = await supertest(app) + .get(`/etapi/revisions/${revisionId}`) + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(response.body).toHaveProperty("revisionId", revisionId); + expect(response.body).toHaveProperty("noteId", createdNoteId); + expect(response.body).toHaveProperty("type", "text"); + expect(response.body).toHaveProperty("mime", "text/html"); + expect(response.body).toHaveProperty("title", "Hello"); + expect(response.body).toHaveProperty("isProtected", false); + expect(response.body).toHaveProperty("blobId"); + expect(response.body).toHaveProperty("utcDateCreated"); + expect(response.body).toHaveProperty("utcDateModified"); + }); + + it("returns 404 for non-existent revision", async () => { + const response = await supertest(app) + .get("/etapi/revisions/nonexistentrevision") + .auth(USER, token, { "type": "basic" }) + .expect(404); + + expect(response.body.code).toStrictEqual("REVISION_NOT_FOUND"); + }); +}); diff --git a/apps/server/spec/etapi/note-history.spec.ts b/apps/server/spec/etapi/note-history.spec.ts new file mode 100644 index 0000000000..7696c00516 --- /dev/null +++ b/apps/server/spec/etapi/note-history.spec.ts @@ -0,0 +1,94 @@ +import { Application } from "express"; +import { beforeAll, describe, expect, it } from "vitest"; +import supertest from "supertest"; +import { createNote, login } from "./utils.js"; +import config from "../../src/services/config.js"; + +let app: Application; +let token: string; + +const USER = "etapi"; +let createdNoteId: string; + +describe("etapi/note-history", () => { + beforeAll(async () => { + config.General.noAuthentication = false; + const buildApp = (await (import("../../src/app.js"))).default; + app = await buildApp(); + token = await login(app); + + // Create a note to ensure there's some history + createdNoteId = await createNote(app, token, "History test content"); + + // Create a revision to ensure history has entries + await supertest(app) + .post(`/etapi/notes/${createdNoteId}/revision`) + .auth(USER, token, { "type": "basic" }) + .expect(204); + }); + + it("gets recent changes history", async () => { + const response = await supertest(app) + .get("/etapi/notes/history") + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(Array.isArray(response.body)).toBe(true); + expect(response.body.length).toBeGreaterThan(0); + + // Check that history entries have expected properties + const entry = response.body[0]; + expect(entry).toHaveProperty("noteId"); + expect(entry).toHaveProperty("title"); + expect(entry).toHaveProperty("utcDate"); + expect(entry).toHaveProperty("date"); + expect(entry).toHaveProperty("current_isDeleted"); + expect(entry).toHaveProperty("current_isProtected"); + }); + + it("filters history by ancestor note", async () => { + const response = await supertest(app) + .get("/etapi/notes/history?ancestorNoteId=root") + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(Array.isArray(response.body)).toBe(true); + // All results should be descendants of root (which is everything) + }); + + it("returns empty array for non-existent ancestor", async () => { + const response = await supertest(app) + .get("/etapi/notes/history?ancestorNoteId=nonexistentancestor") + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(Array.isArray(response.body)).toBe(true); + // Should be empty since no notes are descendants of a non-existent note + expect(response.body.length).toBe(0); + }); + + it("includes canBeUndeleted for deleted notes", async () => { + // Create and delete a note + const noteToDeleteId = await createNote(app, token, "Note to delete for history test"); + + await supertest(app) + .delete(`/etapi/notes/${noteToDeleteId}`) + .auth(USER, token, { "type": "basic" }) + .expect(204); + + // Check history - deleted note should appear with canBeUndeleted property + const response = await supertest(app) + .get("/etapi/notes/history") + .auth(USER, token, { "type": "basic" }) + .expect(200); + + const deletedEntry = response.body.find( + (entry: any) => entry.noteId === noteToDeleteId && entry.current_isDeleted === true + ); + + // Deleted entries should have canBeUndeleted property + if (deletedEntry) { + expect(deletedEntry).toHaveProperty("canBeUndeleted"); + } + }); +}); diff --git a/apps/server/spec/etapi/revision-content.spec.ts b/apps/server/spec/etapi/revision-content.spec.ts new file mode 100644 index 0000000000..5d7d5e558a --- /dev/null +++ b/apps/server/spec/etapi/revision-content.spec.ts @@ -0,0 +1,64 @@ +import { Application } from "express"; +import { beforeAll, describe, expect, it } from "vitest"; +import supertest from "supertest"; +import { createNote, login } from "./utils.js"; +import config from "../../src/services/config.js"; + +let app: Application; +let token: string; + +const USER = "etapi"; +let createdNoteId: string; +let revisionId: string; + +describe("etapi/revision-content", () => { + beforeAll(async () => { + config.General.noAuthentication = false; + const buildApp = (await (import("../../src/app.js"))).default; + app = await buildApp(); + token = await login(app); + createdNoteId = await createNote(app, token, "Initial revision content"); + + // Update content to ensure we have content in the revision + await supertest(app) + .put(`/etapi/notes/${createdNoteId}/content`) + .auth(USER, token, { "type": "basic" }) + .set("Content-Type", "text/plain") + .send("Content after first update") + .expect(204); + + // Force create a revision + await supertest(app) + .post(`/etapi/notes/${createdNoteId}/revision`) + .auth(USER, token, { "type": "basic" }) + .expect(204); + + // Get the revision ID + const revisionsResponse = await supertest(app) + .get(`/etapi/notes/${createdNoteId}/revisions`) + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(revisionsResponse.body.length).toBeGreaterThan(0); + revisionId = revisionsResponse.body[0].revisionId; + }); + + it("gets revision content", async () => { + const response = await supertest(app) + .get(`/etapi/revisions/${revisionId}/content`) + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(response.headers["content-type"]).toMatch(/text\/html/); + expect(response.text).toBeTruthy(); + }); + + it("returns 404 for non-existent revision content", async () => { + const response = await supertest(app) + .get("/etapi/revisions/nonexistentrevision/content") + .auth(USER, token, { "type": "basic" }) + .expect(404); + + expect(response.body.code).toStrictEqual("REVISION_NOT_FOUND"); + }); +}); diff --git a/apps/server/spec/etapi/undelete-note.spec.ts b/apps/server/spec/etapi/undelete-note.spec.ts new file mode 100644 index 0000000000..236539f4a1 --- /dev/null +++ b/apps/server/spec/etapi/undelete-note.spec.ts @@ -0,0 +1,103 @@ +import { Application } from "express"; +import { beforeAll, beforeEach, describe, expect, it } from "vitest"; +import supertest from "supertest"; +import { login } from "./utils.js"; +import config from "../../src/services/config.js"; +import { randomInt } from "crypto"; + +let app: Application; +let token: string; + +const USER = "etapi"; + +describe("etapi/undelete-note", () => { + beforeAll(async () => { + config.General.noAuthentication = false; + const buildApp = (await (import("../../src/app.js"))).default; + app = await buildApp(); + token = await login(app); + }); + + it("undeletes a deleted note", async () => { + // Create a note + const noteId = `testNote${randomInt(10000)}`; + await supertest(app) + .post("/etapi/create-note") + .auth(USER, token, { "type": "basic" }) + .send({ + "noteId": noteId, + "parentNoteId": "root", + "title": "Note to delete and restore", + "type": "text", + "content": "Content to restore" + }) + .expect(201); + + // Verify note exists + await supertest(app) + .get(`/etapi/notes/${noteId}`) + .auth(USER, token, { "type": "basic" }) + .expect(200); + + // Delete the note + await supertest(app) + .delete(`/etapi/notes/${noteId}`) + .auth(USER, token, { "type": "basic" }) + .expect(204); + + // Verify note is deleted (should return 404) + await supertest(app) + .get(`/etapi/notes/${noteId}`) + .auth(USER, token, { "type": "basic" }) + .expect(404); + + // Undelete the note + const response = await supertest(app) + .post(`/etapi/notes/${noteId}/undelete`) + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(response.body).toHaveProperty("success", true); + + // Verify note is restored + const restoredResponse = await supertest(app) + .get(`/etapi/notes/${noteId}`) + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(restoredResponse.body.title).toStrictEqual("Note to delete and restore"); + }); + + it("returns 404 for non-existent note", async () => { + const response = await supertest(app) + .post("/etapi/notes/nonexistentnote/undelete") + .auth(USER, token, { "type": "basic" }) + .expect(404); + + expect(response.body.code).toStrictEqual("NOTE_NOT_FOUND"); + }); + + it("returns 400 when trying to undelete a non-deleted note", async () => { + // Create a note + const noteId = `testNote${randomInt(10000)}`; + await supertest(app) + .post("/etapi/create-note") + .auth(USER, token, { "type": "basic" }) + .send({ + "noteId": noteId, + "parentNoteId": "root", + "title": "Note not deleted", + "type": "text", + "content": "Content" + }) + .expect(201); + + // Try to undelete a note that isn't deleted + const response = await supertest(app) + .post(`/etapi/notes/${noteId}/undelete`) + .auth(USER, token, { "type": "basic" }) + .expect(400); + + expect(response.body.code).toStrictEqual("NOTE_NOT_DELETED"); + }); +}); diff --git a/apps/server/src/etapi/etapi_utils.ts b/apps/server/src/etapi/etapi_utils.ts index 1319162575..9bafdf731a 100644 --- a/apps/server/src/etapi/etapi_utils.ts +++ b/apps/server/src/etapi/etapi_utils.ts @@ -121,6 +121,16 @@ function getAndCheckAttribute(attributeId: string) { } } +function getAndCheckRevision(revisionId: string) { + const revision = becca.getRevision(revisionId); + + if (revision) { + return revision; + } else { + throw new EtapiError(404, "REVISION_NOT_FOUND", `Revision '${revisionId}' not found.`); + } +} + function validateAndPatch(target: any, source: any, allowedProperties: ValidatorMap) { for (const key of Object.keys(source)) { if (!(key in allowedProperties)) { @@ -152,5 +162,6 @@ export default { getAndCheckNote, getAndCheckBranch, getAndCheckAttribute, - getAndCheckAttachment + getAndCheckAttachment, + getAndCheckRevision }; diff --git a/apps/server/src/etapi/mappers.ts b/apps/server/src/etapi/mappers.ts index 735e767c29..4748122390 100644 --- a/apps/server/src/etapi/mappers.ts +++ b/apps/server/src/etapi/mappers.ts @@ -2,6 +2,7 @@ import type BAttachment from "../becca/entities/battachment.js"; import type BAttribute from "../becca/entities/battribute.js"; import type BBranch from "../becca/entities/bbranch.js"; import type BNote from "../becca/entities/bnote.js"; +import type BRevision from "../becca/entities/brevision.js"; function mapNoteToPojo(note: BNote) { return { @@ -64,9 +65,28 @@ function mapAttachmentToPojo(attachment: BAttachment) { }; } +function mapRevisionToPojo(revision: BRevision) { + return { + revisionId: revision.revisionId, + noteId: revision.noteId, + type: revision.type, + mime: revision.mime, + isProtected: revision.isProtected, + title: revision.title, + blobId: revision.blobId, + dateLastEdited: revision.dateLastEdited, + dateCreated: revision.dateCreated, + utcDateLastEdited: revision.utcDateLastEdited, + utcDateCreated: revision.utcDateCreated, + utcDateModified: revision.utcDateModified, + contentLength: revision.contentLength + }; +} + export default { mapNoteToPojo, mapBranchToPojo, mapAttributeToPojo, - mapAttachmentToPojo + mapAttachmentToPojo, + mapRevisionToPojo }; diff --git a/apps/server/src/etapi/revisions.ts b/apps/server/src/etapi/revisions.ts new file mode 100644 index 0000000000..713af44f9f --- /dev/null +++ b/apps/server/src/etapi/revisions.ts @@ -0,0 +1,178 @@ +import becca from "../becca/becca.js"; +import sql from "../services/sql.js"; +import eu from "./etapi_utils.js"; +import mappers from "./mappers.js"; +import noteService from "../services/notes.js"; +import TaskContext from "../services/task_context.js"; +import protectedSessionService from "../services/protected_session.js"; +import utils from "../services/utils.js"; +import type { Router } from "express"; +import type { NoteRow, RecentChangeRow } from "@triliumnext/commons"; + +function register(router: Router) { + // GET /etapi/notes/history - must be registered before /etapi/notes/:noteId routes + eu.route(router, "get", "/etapi/notes/history", (req, res, next) => { + const ancestorNoteId = (req.query.ancestorNoteId as string) || "root"; + + let recentChanges: RecentChangeRow[] = []; + + const revisionRows = sql.getRows(` + SELECT + notes.noteId, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, + revisions.title, + revisions.utcDateCreated AS utcDate, + revisions.dateCreated AS date + FROM + revisions + JOIN notes USING(noteId)`); + + for (const revisionRow of revisionRows) { + const note = becca.getNote(revisionRow.noteId); + + // for deleted notes, the becca note is null, and it's not possible to (easily) determine if it belongs to a subtree + if (ancestorNoteId === "root" || note?.hasAncestor(ancestorNoteId)) { + recentChanges.push(revisionRow); + } + } + + // now we need to also collect date points not represented in note revisions: + // 1. creation for all notes (dateCreated) + // 2. deletion for deleted notes (dateModified) + const noteRows = sql.getRows(` + SELECT + notes.noteId, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, + notes.title, + notes.utcDateCreated AS utcDate, + notes.dateCreated AS date + FROM notes + UNION ALL + SELECT + notes.noteId, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, + notes.title, + notes.utcDateModified AS utcDate, + notes.dateModified AS date + FROM notes + WHERE notes.isDeleted = 1`); + + for (const noteRow of noteRows) { + const note = becca.getNote(noteRow.noteId); + + // for deleted notes, the becca note is null, and it's not possible to (easily) determine if it belongs to a subtree + if (ancestorNoteId === "root" || note?.hasAncestor(ancestorNoteId)) { + recentChanges.push(noteRow); + } + } + + recentChanges.sort((a, b) => (a.utcDate > b.utcDate ? -1 : 1)); + + recentChanges = recentChanges.slice(0, Math.min(500, recentChanges.length)); + + for (const change of recentChanges) { + if (change.current_isProtected) { + if (protectedSessionService.isProtectedSessionAvailable()) { + change.title = protectedSessionService.decryptString(change.title) || "[protected]"; + change.current_title = protectedSessionService.decryptString(change.current_title) || "[protected]"; + } else { + change.title = change.current_title = "[protected]"; + } + } + + if (change.current_isDeleted) { + const deleteId = change.current_deleteId; + + const undeletedParentBranchIds = noteService.getUndeletedParentBranchIds(change.noteId, deleteId); + + // note (and the subtree) can be undeleted if there's at least one undeleted parent (whose branch would be undeleted by this op) + change.canBeUndeleted = undeletedParentBranchIds.length > 0; + } + } + + res.json(recentChanges); + }); + + // GET /etapi/notes/:noteId/revisions - List all revisions for a note + eu.route(router, "get", "/etapi/notes/:noteId/revisions", (req, res, next) => { + const note = eu.getAndCheckNote(req.params.noteId); + + const revisions = becca.getRevisionsFromQuery( + `SELECT revisions.*, LENGTH(blobs.content) AS contentLength + FROM revisions + JOIN blobs USING (blobId) + WHERE noteId = ? + ORDER BY utcDateCreated DESC`, + [note.noteId] + ); + + res.json(revisions.map((revision) => mappers.mapRevisionToPojo(revision))); + }); + + // POST /etapi/notes/:noteId/undelete - Restore a deleted note + eu.route(router, "post", "/etapi/notes/:noteId/undelete", (req, res, next) => { + const { noteId } = req.params; + + const noteRow = sql.getRow("SELECT * FROM notes WHERE noteId = ?", [noteId]); + + if (!noteRow) { + throw new eu.EtapiError(404, "NOTE_NOT_FOUND", `Note '${noteId}' not found.`); + } + + if (!noteRow.isDeleted || !noteRow.deleteId) { + throw new eu.EtapiError(400, "NOTE_NOT_DELETED", `Note '${noteId}' is not deleted.`); + } + + const undeletedParentBranchIds = noteService.getUndeletedParentBranchIds(noteId, noteRow.deleteId); + + if (undeletedParentBranchIds.length === 0) { + throw new eu.EtapiError(400, "CANNOT_UNDELETE", `Cannot undelete note '${noteId}' - no undeleted parent found.`); + } + + const taskContext = new TaskContext("no-progress-reporting", "undeleteNotes", null); + noteService.undeleteNote(noteId, taskContext); + + res.json({ success: true }); + }); + + // GET /etapi/revisions/:revisionId - Get revision metadata + eu.route(router, "get", "/etapi/revisions/:revisionId", (req, res, next) => { + const revision = eu.getAndCheckRevision(req.params.revisionId); + + if (revision.isProtected) { + throw new eu.EtapiError(400, "REVISION_IS_PROTECTED", `Revision '${req.params.revisionId}' is protected and cannot be read through ETAPI.`); + } + + res.json(mappers.mapRevisionToPojo(revision)); + }); + + // GET /etapi/revisions/:revisionId/content - Get revision content + eu.route(router, "get", "/etapi/revisions/:revisionId/content", (req, res, next) => { + const revision = eu.getAndCheckRevision(req.params.revisionId); + + if (revision.isProtected) { + throw new eu.EtapiError(400, "REVISION_IS_PROTECTED", `Revision '${req.params.revisionId}' is protected and content cannot be read through ETAPI.`); + } + + const filename = utils.formatDownloadTitle(revision.title, revision.type, revision.mime); + + res.setHeader("Content-Disposition", utils.getContentDisposition(filename)); + res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + res.setHeader("Content-Type", revision.mime); + + res.send(revision.getContent()); + }); +} + +export default { + register +}; diff --git a/apps/server/src/routes/routes.ts b/apps/server/src/routes/routes.ts index 9e31d1bcac..96c3ebd84d 100644 --- a/apps/server/src/routes/routes.ts +++ b/apps/server/src/routes/routes.ts @@ -12,6 +12,7 @@ import etapiMetricsRoute from "../etapi/metrics.js"; import etapiNoteRoutes from "../etapi/notes.js"; import etapiSpecRoute from "../etapi/spec.js"; import etapiSpecialNoteRoutes from "../etapi/special_notes.js"; +import etapiRevisionsRoutes from "../etapi/revisions.js"; import auth from "../services/auth.js"; import openID from '../services/open_id.js'; import { isElectron } from "../services/utils.js"; @@ -361,6 +362,8 @@ function register(app: express.Application) { etapiAttachmentRoutes.register(router); etapiAttributeRoutes.register(router); etapiBranchRoutes.register(router); + // Register revisions routes BEFORE notes routes so /etapi/notes/history is matched before /etapi/notes/:noteId + etapiRevisionsRoutes.register(router); etapiNoteRoutes.register(router); etapiSpecialNoteRoutes.register(router); etapiSpecRoute.register(router); From 60c61f553a451414a47bb50798d98bbc6bdcab22 Mon Sep 17 00:00:00 2001 From: perfectra1n Date: Wed, 21 Jan 2026 16:30:37 -0800 Subject: [PATCH 018/316] feat(etapi): put filtering for revisions mainly in the db layer --- apps/server/src/etapi/revisions.ts | 111 ++++++++++++++++++----------- 1 file changed, 69 insertions(+), 42 deletions(-) diff --git a/apps/server/src/etapi/revisions.ts b/apps/server/src/etapi/revisions.ts index 713af44f9f..6451b18a15 100644 --- a/apps/server/src/etapi/revisions.ts +++ b/apps/server/src/etapi/revisions.ts @@ -14,35 +14,23 @@ function register(router: Router) { eu.route(router, "get", "/etapi/notes/history", (req, res, next) => { const ancestorNoteId = (req.query.ancestorNoteId as string) || "root"; - let recentChanges: RecentChangeRow[] = []; + let recentChanges: RecentChangeRow[]; - const revisionRows = sql.getRows(` - SELECT - notes.noteId, - notes.isDeleted AS current_isDeleted, - notes.deleteId AS current_deleteId, - notes.title AS current_title, - notes.isProtected AS current_isProtected, - revisions.title, - revisions.utcDateCreated AS utcDate, - revisions.dateCreated AS date - FROM - revisions - JOIN notes USING(noteId)`); - - for (const revisionRow of revisionRows) { - const note = becca.getNote(revisionRow.noteId); - - // for deleted notes, the becca note is null, and it's not possible to (easily) determine if it belongs to a subtree - if (ancestorNoteId === "root" || note?.hasAncestor(ancestorNoteId)) { - recentChanges.push(revisionRow); - } - } - - // now we need to also collect date points not represented in note revisions: - // 1. creation for all notes (dateCreated) - // 2. deletion for deleted notes (dateModified) - const noteRows = sql.getRows(` + if (ancestorNoteId === "root") { + // Optimized path: no ancestor filtering needed, fetch directly from DB + recentChanges = sql.getRows(` + SELECT + notes.noteId, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, + revisions.title, + revisions.utcDateCreated AS utcDate, + revisions.dateCreated AS date + FROM revisions + JOIN notes USING(noteId) + UNION ALL SELECT notes.noteId, notes.isDeleted AS current_isDeleted, @@ -53,7 +41,7 @@ function register(router: Router) { notes.utcDateCreated AS utcDate, notes.dateCreated AS date FROM notes - UNION ALL + UNION ALL SELECT notes.noteId, notes.isDeleted AS current_isDeleted, @@ -64,21 +52,60 @@ function register(router: Router) { notes.utcDateModified AS utcDate, notes.dateModified AS date FROM notes - WHERE notes.isDeleted = 1`); - - for (const noteRow of noteRows) { - const note = becca.getNote(noteRow.noteId); - - // for deleted notes, the becca note is null, and it's not possible to (easily) determine if it belongs to a subtree - if (ancestorNoteId === "root" || note?.hasAncestor(ancestorNoteId)) { - recentChanges.push(noteRow); - } + WHERE notes.isDeleted = 1 + ORDER BY utcDate DESC + LIMIT 500`); + } else { + // Use recursive CTE to find all descendants, then filter at DB level + // This pushes filtering to the database for much better performance + recentChanges = sql.getRows(` + WITH RECURSIVE descendants(noteId) AS ( + SELECT ? + UNION + SELECT branches.noteId + FROM branches + JOIN descendants ON branches.parentNoteId = descendants.noteId + ) + SELECT + notes.noteId, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, + revisions.title, + revisions.utcDateCreated AS utcDate, + revisions.dateCreated AS date + FROM revisions + JOIN notes USING(noteId) + WHERE notes.noteId IN (SELECT noteId FROM descendants) + UNION ALL + SELECT + notes.noteId, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, + notes.title, + notes.utcDateCreated AS utcDate, + notes.dateCreated AS date + FROM notes + WHERE notes.noteId IN (SELECT noteId FROM descendants) + UNION ALL + SELECT + notes.noteId, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, + notes.title, + notes.utcDateModified AS utcDate, + notes.dateModified AS date + FROM notes + WHERE notes.isDeleted = 1 AND notes.noteId IN (SELECT noteId FROM descendants) + ORDER BY utcDate DESC + LIMIT 500`, [ancestorNoteId]); } - recentChanges.sort((a, b) => (a.utcDate > b.utcDate ? -1 : 1)); - - recentChanges = recentChanges.slice(0, Math.min(500, recentChanges.length)); - for (const change of recentChanges) { if (change.current_isProtected) { if (protectedSessionService.isProtectedSessionAvailable()) { From 0650be664d99858a55f476d92bf08dc99e2bad35 Mon Sep 17 00:00:00 2001 From: perfectra1n Date: Wed, 21 Jan 2026 16:33:42 -0800 Subject: [PATCH 019/316] feat(etapi): resolve suggestions for norms from gemini --- apps/server/etapi.openapi.yaml | 15 +++--- apps/server/spec/etapi/note-history.spec.ts | 6 +-- apps/server/src/etapi/revisions.ts | 58 ++++++++++----------- packages/commons/src/lib/server_api.ts | 8 +-- 4 files changed, 44 insertions(+), 43 deletions(-) diff --git a/apps/server/etapi.openapi.yaml b/apps/server/etapi.openapi.yaml index af05bdbe57..2e6f941eb2 100644 --- a/apps/server/etapi.openapi.yaml +++ b/apps/server/etapi.openapi.yaml @@ -446,15 +446,16 @@ paths: schema: $ref: "#/components/schemas/EntityId" get: - description: Returns revision content identified by its ID + description: Returns revision content identified by its ID. The Content-Type header will match the revision's MIME type. operationId: getRevisionContent responses: "200": - description: revision content response + description: Revision content. The Content-Type header will be set to the revision's actual MIME type (e.g., text/html, text/plain, image/png). content: - text/html: + application/octet-stream: schema: type: string + format: binary default: description: unexpected error content: @@ -1379,16 +1380,16 @@ components: title: type: string description: Title at the time of the change (may be "[protected]" for protected notes) - current_title: + currentTitle: type: string description: Current title of the note (may be "[protected]" for protected notes) - current_isDeleted: + currentIsDeleted: type: boolean description: Whether the note is currently deleted - current_deleteId: + currentDeleteId: type: string description: Delete ID if the note is deleted - current_isProtected: + currentIsProtected: type: boolean description: Whether the note is protected utcDate: diff --git a/apps/server/spec/etapi/note-history.spec.ts b/apps/server/spec/etapi/note-history.spec.ts index 7696c00516..c78e8d359c 100644 --- a/apps/server/spec/etapi/note-history.spec.ts +++ b/apps/server/spec/etapi/note-history.spec.ts @@ -42,8 +42,8 @@ describe("etapi/note-history", () => { expect(entry).toHaveProperty("title"); expect(entry).toHaveProperty("utcDate"); expect(entry).toHaveProperty("date"); - expect(entry).toHaveProperty("current_isDeleted"); - expect(entry).toHaveProperty("current_isProtected"); + expect(entry).toHaveProperty("currentIsDeleted"); + expect(entry).toHaveProperty("currentIsProtected"); }); it("filters history by ancestor note", async () => { @@ -83,7 +83,7 @@ describe("etapi/note-history", () => { .expect(200); const deletedEntry = response.body.find( - (entry: any) => entry.noteId === noteToDeleteId && entry.current_isDeleted === true + (entry: any) => entry.noteId === noteToDeleteId && entry.currentIsDeleted === true ); // Deleted entries should have canBeUndeleted property diff --git a/apps/server/src/etapi/revisions.ts b/apps/server/src/etapi/revisions.ts index 6451b18a15..e76877ddc5 100644 --- a/apps/server/src/etapi/revisions.ts +++ b/apps/server/src/etapi/revisions.ts @@ -21,10 +21,10 @@ function register(router: Router) { recentChanges = sql.getRows(` SELECT notes.noteId, - notes.isDeleted AS current_isDeleted, - notes.deleteId AS current_deleteId, - notes.title AS current_title, - notes.isProtected AS current_isProtected, + notes.isDeleted AS currentIsDeleted, + notes.deleteId AS currentDeleteId, + notes.title AS currentTitle, + notes.isProtected AS currentIsProtected, revisions.title, revisions.utcDateCreated AS utcDate, revisions.dateCreated AS date @@ -33,10 +33,10 @@ function register(router: Router) { UNION ALL SELECT notes.noteId, - notes.isDeleted AS current_isDeleted, - notes.deleteId AS current_deleteId, - notes.title AS current_title, - notes.isProtected AS current_isProtected, + notes.isDeleted AS currentIsDeleted, + notes.deleteId AS currentDeleteId, + notes.title AS currentTitle, + notes.isProtected AS currentIsProtected, notes.title, notes.utcDateCreated AS utcDate, notes.dateCreated AS date @@ -44,10 +44,10 @@ function register(router: Router) { UNION ALL SELECT notes.noteId, - notes.isDeleted AS current_isDeleted, - notes.deleteId AS current_deleteId, - notes.title AS current_title, - notes.isProtected AS current_isProtected, + notes.isDeleted AS currentIsDeleted, + notes.deleteId AS currentDeleteId, + notes.title AS currentTitle, + notes.isProtected AS currentIsProtected, notes.title, notes.utcDateModified AS utcDate, notes.dateModified AS date @@ -68,10 +68,10 @@ function register(router: Router) { ) SELECT notes.noteId, - notes.isDeleted AS current_isDeleted, - notes.deleteId AS current_deleteId, - notes.title AS current_title, - notes.isProtected AS current_isProtected, + notes.isDeleted AS currentIsDeleted, + notes.deleteId AS currentDeleteId, + notes.title AS currentTitle, + notes.isProtected AS currentIsProtected, revisions.title, revisions.utcDateCreated AS utcDate, revisions.dateCreated AS date @@ -81,10 +81,10 @@ function register(router: Router) { UNION ALL SELECT notes.noteId, - notes.isDeleted AS current_isDeleted, - notes.deleteId AS current_deleteId, - notes.title AS current_title, - notes.isProtected AS current_isProtected, + notes.isDeleted AS currentIsDeleted, + notes.deleteId AS currentDeleteId, + notes.title AS currentTitle, + notes.isProtected AS currentIsProtected, notes.title, notes.utcDateCreated AS utcDate, notes.dateCreated AS date @@ -93,10 +93,10 @@ function register(router: Router) { UNION ALL SELECT notes.noteId, - notes.isDeleted AS current_isDeleted, - notes.deleteId AS current_deleteId, - notes.title AS current_title, - notes.isProtected AS current_isProtected, + notes.isDeleted AS currentIsDeleted, + notes.deleteId AS currentDeleteId, + notes.title AS currentTitle, + notes.isProtected AS currentIsProtected, notes.title, notes.utcDateModified AS utcDate, notes.dateModified AS date @@ -107,17 +107,17 @@ function register(router: Router) { } for (const change of recentChanges) { - if (change.current_isProtected) { + if (change.currentIsProtected) { if (protectedSessionService.isProtectedSessionAvailable()) { change.title = protectedSessionService.decryptString(change.title) || "[protected]"; - change.current_title = protectedSessionService.decryptString(change.current_title) || "[protected]"; + change.currentTitle = protectedSessionService.decryptString(change.currentTitle) || "[protected]"; } else { - change.title = change.current_title = "[protected]"; + change.title = change.currentTitle = "[protected]"; } } - if (change.current_isDeleted) { - const deleteId = change.current_deleteId; + if (change.currentIsDeleted) { + const deleteId = change.currentDeleteId; const undeletedParentBranchIds = noteService.getUndeletedParentBranchIds(change.noteId, deleteId); diff --git a/packages/commons/src/lib/server_api.ts b/packages/commons/src/lib/server_api.ts index a15192fd28..7c197a7614 100644 --- a/packages/commons/src/lib/server_api.ts +++ b/packages/commons/src/lib/server_api.ts @@ -56,10 +56,10 @@ export interface RevisionPojo { export interface RecentChangeRow { noteId: string; - current_isDeleted: boolean; - current_deleteId: string; - current_title: string; - current_isProtected: boolean; + currentIsDeleted: boolean; + currentDeleteId: string; + currentTitle: string; + currentIsProtected: boolean; title: string; utcDate: string; date: string; From 280697f2f7ef363d6ca85a7bbbbfe2ff4cc83479 Mon Sep 17 00:00:00 2001 From: perfectra1n Date: Wed, 21 Jan 2026 16:37:02 -0800 Subject: [PATCH 020/316] Revert "feat(etapi): resolve suggestions for norms from gemini" This reverts commit 0650be664d99858a55f476d92bf08dc99e2bad35. --- apps/server/etapi.openapi.yaml | 15 +++--- apps/server/spec/etapi/note-history.spec.ts | 6 +-- apps/server/src/etapi/revisions.ts | 58 ++++++++++----------- packages/commons/src/lib/server_api.ts | 8 +-- 4 files changed, 43 insertions(+), 44 deletions(-) diff --git a/apps/server/etapi.openapi.yaml b/apps/server/etapi.openapi.yaml index 2e6f941eb2..af05bdbe57 100644 --- a/apps/server/etapi.openapi.yaml +++ b/apps/server/etapi.openapi.yaml @@ -446,16 +446,15 @@ paths: schema: $ref: "#/components/schemas/EntityId" get: - description: Returns revision content identified by its ID. The Content-Type header will match the revision's MIME type. + description: Returns revision content identified by its ID operationId: getRevisionContent responses: "200": - description: Revision content. The Content-Type header will be set to the revision's actual MIME type (e.g., text/html, text/plain, image/png). + description: revision content response content: - application/octet-stream: + text/html: schema: type: string - format: binary default: description: unexpected error content: @@ -1380,16 +1379,16 @@ components: title: type: string description: Title at the time of the change (may be "[protected]" for protected notes) - currentTitle: + current_title: type: string description: Current title of the note (may be "[protected]" for protected notes) - currentIsDeleted: + current_isDeleted: type: boolean description: Whether the note is currently deleted - currentDeleteId: + current_deleteId: type: string description: Delete ID if the note is deleted - currentIsProtected: + current_isProtected: type: boolean description: Whether the note is protected utcDate: diff --git a/apps/server/spec/etapi/note-history.spec.ts b/apps/server/spec/etapi/note-history.spec.ts index c78e8d359c..7696c00516 100644 --- a/apps/server/spec/etapi/note-history.spec.ts +++ b/apps/server/spec/etapi/note-history.spec.ts @@ -42,8 +42,8 @@ describe("etapi/note-history", () => { expect(entry).toHaveProperty("title"); expect(entry).toHaveProperty("utcDate"); expect(entry).toHaveProperty("date"); - expect(entry).toHaveProperty("currentIsDeleted"); - expect(entry).toHaveProperty("currentIsProtected"); + expect(entry).toHaveProperty("current_isDeleted"); + expect(entry).toHaveProperty("current_isProtected"); }); it("filters history by ancestor note", async () => { @@ -83,7 +83,7 @@ describe("etapi/note-history", () => { .expect(200); const deletedEntry = response.body.find( - (entry: any) => entry.noteId === noteToDeleteId && entry.currentIsDeleted === true + (entry: any) => entry.noteId === noteToDeleteId && entry.current_isDeleted === true ); // Deleted entries should have canBeUndeleted property diff --git a/apps/server/src/etapi/revisions.ts b/apps/server/src/etapi/revisions.ts index e76877ddc5..6451b18a15 100644 --- a/apps/server/src/etapi/revisions.ts +++ b/apps/server/src/etapi/revisions.ts @@ -21,10 +21,10 @@ function register(router: Router) { recentChanges = sql.getRows(` SELECT notes.noteId, - notes.isDeleted AS currentIsDeleted, - notes.deleteId AS currentDeleteId, - notes.title AS currentTitle, - notes.isProtected AS currentIsProtected, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, revisions.title, revisions.utcDateCreated AS utcDate, revisions.dateCreated AS date @@ -33,10 +33,10 @@ function register(router: Router) { UNION ALL SELECT notes.noteId, - notes.isDeleted AS currentIsDeleted, - notes.deleteId AS currentDeleteId, - notes.title AS currentTitle, - notes.isProtected AS currentIsProtected, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, notes.title, notes.utcDateCreated AS utcDate, notes.dateCreated AS date @@ -44,10 +44,10 @@ function register(router: Router) { UNION ALL SELECT notes.noteId, - notes.isDeleted AS currentIsDeleted, - notes.deleteId AS currentDeleteId, - notes.title AS currentTitle, - notes.isProtected AS currentIsProtected, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, notes.title, notes.utcDateModified AS utcDate, notes.dateModified AS date @@ -68,10 +68,10 @@ function register(router: Router) { ) SELECT notes.noteId, - notes.isDeleted AS currentIsDeleted, - notes.deleteId AS currentDeleteId, - notes.title AS currentTitle, - notes.isProtected AS currentIsProtected, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, revisions.title, revisions.utcDateCreated AS utcDate, revisions.dateCreated AS date @@ -81,10 +81,10 @@ function register(router: Router) { UNION ALL SELECT notes.noteId, - notes.isDeleted AS currentIsDeleted, - notes.deleteId AS currentDeleteId, - notes.title AS currentTitle, - notes.isProtected AS currentIsProtected, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, notes.title, notes.utcDateCreated AS utcDate, notes.dateCreated AS date @@ -93,10 +93,10 @@ function register(router: Router) { UNION ALL SELECT notes.noteId, - notes.isDeleted AS currentIsDeleted, - notes.deleteId AS currentDeleteId, - notes.title AS currentTitle, - notes.isProtected AS currentIsProtected, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.title AS current_title, + notes.isProtected AS current_isProtected, notes.title, notes.utcDateModified AS utcDate, notes.dateModified AS date @@ -107,17 +107,17 @@ function register(router: Router) { } for (const change of recentChanges) { - if (change.currentIsProtected) { + if (change.current_isProtected) { if (protectedSessionService.isProtectedSessionAvailable()) { change.title = protectedSessionService.decryptString(change.title) || "[protected]"; - change.currentTitle = protectedSessionService.decryptString(change.currentTitle) || "[protected]"; + change.current_title = protectedSessionService.decryptString(change.current_title) || "[protected]"; } else { - change.title = change.currentTitle = "[protected]"; + change.title = change.current_title = "[protected]"; } } - if (change.currentIsDeleted) { - const deleteId = change.currentDeleteId; + if (change.current_isDeleted) { + const deleteId = change.current_deleteId; const undeletedParentBranchIds = noteService.getUndeletedParentBranchIds(change.noteId, deleteId); diff --git a/packages/commons/src/lib/server_api.ts b/packages/commons/src/lib/server_api.ts index 7c197a7614..a15192fd28 100644 --- a/packages/commons/src/lib/server_api.ts +++ b/packages/commons/src/lib/server_api.ts @@ -56,10 +56,10 @@ export interface RevisionPojo { export interface RecentChangeRow { noteId: string; - currentIsDeleted: boolean; - currentDeleteId: string; - currentTitle: string; - currentIsProtected: boolean; + current_isDeleted: boolean; + current_deleteId: string; + current_title: string; + current_isProtected: boolean; title: string; utcDate: string; date: string; From 9577aa2abe243be9187be8d60fb725bb821cf7b6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 01:45:37 +0000 Subject: [PATCH 021/316] fix(deps): update dependency @preact/signals to v2.6.1 --- apps/client/package.json | 2 +- pnpm-lock.yaml | 20 +++++--------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index f429465319..b9fa4406fa 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -27,7 +27,7 @@ "@mermaid-js/layout-elk": "0.2.0", "@mind-elixir/node-menu": "5.0.1", "@popperjs/core": "2.11.8", - "@preact/signals": "2.6.0", + "@preact/signals": "2.6.1", "@triliumnext/ckeditor5": "workspace:*", "@triliumnext/codemirror": "workspace:*", "@triliumnext/commons": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9cc1a8dc8..cd23092264 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -197,8 +197,8 @@ importers: specifier: 2.11.8 version: 2.11.8 '@preact/signals': - specifier: 2.6.0 - version: 2.6.0(preact@10.28.2) + specifier: 2.6.1 + version: 2.6.1(preact@10.28.2) '@triliumnext/ckeditor5': specifier: workspace:* version: link:../../packages/ckeditor5 @@ -4046,8 +4046,8 @@ packages: '@preact/signals-core@1.12.2': resolution: {integrity: sha512-5Yf8h1Ke3SMHr15xl630KtwPTW4sYDFkkxS0vQ8UiQLWwZQnrF9IKaVG1mN5VcJz52EcWs2acsc/Npjha/7ysA==} - '@preact/signals@2.6.0': - resolution: {integrity: sha512-a22Mh1CCA+PaqobdV2YfeZ30PGywp/QnhCBNVDIsHUdkuqpYcbxt0vgC78JYaicBqWxAOGXLoExj5WHaZ/VKvg==} + '@preact/signals@2.6.1': + resolution: {integrity: sha512-Gp3DI1T/0YyirwJnImR8l9xyVJgKiVzJXmEhic1/7SPw3zStrsvuBpwKnD609CzsIdzxprWa6yTNXN+VLLZPGQ==} peerDependencies: preact: 10.28.2 @@ -15242,8 +15242,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15445,8 +15443,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -15465,8 +15461,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.4.0': dependencies: @@ -15489,8 +15483,6 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -15673,8 +15665,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -18520,7 +18510,7 @@ snapshots: '@preact/signals-core@1.12.2': {} - '@preact/signals@2.6.0(preact@10.28.2)': + '@preact/signals@2.6.1(preact@10.28.2)': dependencies: '@preact/signals-core': 1.12.2 preact: 10.28.2 From 8ca84d183c72aad0101019d9e89d2050987be1aa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 02:03:34 +0000 Subject: [PATCH 022/316] fix(deps): update dependency lodash-es to v4.17.23 [security] --- packages/ckeditor5-mermaid/package.json | 2 +- pnpm-lock.yaml | 24 ++++++++++-------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index 34d580fff2..3a2600cbea 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -71,6 +71,6 @@ }, "dependencies": { "@types/lodash-es": "4.17.12", - "lodash-es": "4.17.22" + "lodash-es": "4.17.23" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9cc1a8dc8..b77882ff6b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1147,8 +1147,8 @@ importers: specifier: 4.17.12 version: 4.17.12 lodash-es: - specifier: 4.17.22 - version: 4.17.22 + specifier: 4.17.23 + version: 4.17.23 devDependencies: '@ckeditor/ckeditor5-dev-build-tools': specifier: 54.3.0 @@ -9906,8 +9906,8 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash-es@4.17.22: - resolution: {integrity: sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==} + lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} @@ -15445,8 +15445,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -15489,8 +15487,6 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -15976,8 +15972,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -16175,6 +16169,8 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.4.0 '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-upload@47.4.0': dependencies: @@ -21694,7 +21690,7 @@ snapshots: chevrotain-allstar@0.3.1(chevrotain@11.0.3): dependencies: chevrotain: 11.0.3 - lodash-es: 4.17.22 + lodash-es: 4.17.23 chevrotain@11.0.3: dependencies: @@ -22618,7 +22614,7 @@ snapshots: dagre-d3-es@7.0.13: dependencies: d3: 7.9.0 - lodash-es: 4.17.22 + lodash-es: 4.17.23 data-uri-to-buffer@4.0.1: {} @@ -25500,7 +25496,7 @@ snapshots: kapsule@1.16.3: dependencies: - lodash-es: 4.17.22 + lodash-es: 4.17.23 karma-chrome-launcher@3.2.0: dependencies: @@ -25765,7 +25761,7 @@ snapshots: lodash-es@4.17.21: {} - lodash-es@4.17.22: {} + lodash-es@4.17.23: {} lodash.clonedeep@4.5.0: {} From 673c39d798f2c6e65ae45eb46159f1d73efec554 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 22 Jan 2026 08:05:49 +0200 Subject: [PATCH 023/316] Revert "feat(options/advanced): add description for experimental" This reverts commit fc2ab91280b6697a0138c3889894b6ce7276f4a8. --- .../widgets/type_widgets/options/advanced.tsx | 1 - .../options/components/CheckboxList.tsx | 30 +++++++++---------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/options/advanced.tsx b/apps/client/src/widgets/type_widgets/options/advanced.tsx index c9d9b4a4ff..2959c5a1cc 100644 --- a/apps/client/src/widgets/type_widgets/options/advanced.tsx +++ b/apps/client/src/widgets/type_widgets/options/advanced.tsx @@ -191,7 +191,6 @@ function ExperimentalOptions() { values={filteredExperimentalFeatures} keyProperty="id" titleProperty="name" - descriptionProperty="description" currentValue={enabledExperimentalFeatures} onChange={setEnabledExperimentalFeatures} /> diff --git a/apps/client/src/widgets/type_widgets/options/components/CheckboxList.tsx b/apps/client/src/widgets/type_widgets/options/components/CheckboxList.tsx index baa37baf5f..a2f48a04fd 100644 --- a/apps/client/src/widgets/type_widgets/options/components/CheckboxList.tsx +++ b/apps/client/src/widgets/type_widgets/options/components/CheckboxList.tsx @@ -1,17 +1,14 @@ -import FormCheckbox from "../../../react/FormCheckbox"; - interface CheckboxListProps { values: T[]; keyProperty: keyof T; titleProperty?: keyof T; disabledProperty?: keyof T; - descriptionProperty?: keyof T; currentValue: string[]; onChange: (newValues: string[]) => void; columnWidth?: string; } -export default function CheckboxList({ values, keyProperty, titleProperty, disabledProperty, descriptionProperty, currentValue, onChange, columnWidth }: CheckboxListProps) { +export default function CheckboxList({ values, keyProperty, titleProperty, disabledProperty, currentValue, onChange, columnWidth }: CheckboxListProps) { function toggleValue(value: string) { if (currentValue.includes(value)) { // Already there, needs removing. @@ -25,17 +22,20 @@ export default function CheckboxList({ values, keyProperty, titleProperty, di return (
    {values.map(value => ( -
  • - toggleValue(String(value[keyProperty]))} - /> +
  • +
  • ))}
- ); -} + ) +} \ No newline at end of file From 9dfc1cdc4cb84fa6da68be59115593fdf066b2ac Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 22 Jan 2026 08:10:29 +0200 Subject: [PATCH 024/316] fix(render): not refreshing on attribute change (closes #8321) --- .../src/widgets/type_widgets/Render.tsx | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/Render.tsx b/apps/client/src/widgets/type_widgets/Render.tsx index 6cc7197571..f47e58f2de 100644 --- a/apps/client/src/widgets/type_widgets/Render.tsx +++ b/apps/client/src/widgets/type_widgets/Render.tsx @@ -1,12 +1,15 @@ -import { useEffect, useRef, useState } from "preact/hooks"; -import { TypeWidgetProps } from "./type_widget"; -import render from "../../services/render"; -import { refToJQuerySelector } from "../react/react_utils"; -import Alert from "../react/Alert"; import "./Render.css"; + +import { useEffect, useRef, useState } from "preact/hooks"; + +import attributes from "../../services/attributes"; import { t } from "../../services/i18n"; -import RawHtml from "../react/RawHtml"; +import render from "../../services/render"; +import Alert from "../react/Alert"; import { useTriliumEvent } from "../react/hooks"; +import RawHtml from "../react/RawHtml"; +import { refToJQuerySelector } from "../react/react_utils"; +import { TypeWidgetProps } from "./type_widget"; export default function Render({ note, noteContext, ntxId }: TypeWidgetProps) { const contentRef = useRef(null); @@ -31,6 +34,13 @@ export default function Render({ note, noteContext, ntxId }: TypeWidgetProps) { refresh(); }); + // Refresh on attribute change. + useTriliumEvent("entitiesReloaded", ({ loadResults }) => { + if (loadResults.getAttributeRows().some(a => a.type === "relation" && a.name === "renderNote" && attributes.isAffecting(a, note))) { + refresh(); + } + }); + // Integration with search. useTriliumEvent("executeWithContentElement", ({ resolve, ntxId: eventNtxId }) => { if (eventNtxId !== ntxId) return; From d6b6832a1dfd5d54ed59365228c5e98a606c87df Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 22 Jan 2026 08:15:40 +0200 Subject: [PATCH 025/316] fix(promoted_attributes): checkbox not displaying initial value properly (closes #8062) --- apps/client/src/widgets/PromotedAttributes.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/widgets/PromotedAttributes.tsx b/apps/client/src/widgets/PromotedAttributes.tsx index 0ec79725a0..a9618d3a63 100644 --- a/apps/client/src/widgets/PromotedAttributes.tsx +++ b/apps/client/src/widgets/PromotedAttributes.tsx @@ -217,6 +217,7 @@ function LabelInput({ inputId, ...props }: CellProps & { inputId: string }) { id={inputId} type={LABEL_MAPPINGS[definition.labelType ?? "text"]} value={valueAttr.value} + checked={definition.labelType === "boolean" ? valueAttr.value === "true" : undefined} placeholder={t("promoted_attributes.unset-field-placeholder")} data-attribute-id={valueAttr.attributeId} data-attribute-type={valueAttr.type} From 8b86e17ac87e18ffb0690597f1eb1ba25d690b94 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 22 Jan 2026 20:03:46 +0200 Subject: [PATCH 026/316] fix(client): race condition in syntax highlight (closes #8464) --- apps/client/src/services/syntax_highlight.ts | 23 +++++++++++--------- packages/highlightjs/src/index.ts | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/client/src/services/syntax_highlight.ts b/apps/client/src/services/syntax_highlight.ts index dd2bd48b47..3b2c35f682 100644 --- a/apps/client/src/services/syntax_highlight.ts +++ b/apps/client/src/services/syntax_highlight.ts @@ -1,10 +1,11 @@ -import { ensureMimeTypes, highlight, highlightAuto, loadTheme, Themes, type AutoHighlightResult, type HighlightResult, type Theme } from "@triliumnext/highlightjs"; +import { MimeType } from "@triliumnext/commons"; +import { type AutoHighlightResult, ensureMimeTypes, highlight, highlightAuto, type HighlightResult, loadTheme, type Theme,Themes } from "@triliumnext/highlightjs"; + +import { copyText, copyTextWithToast } from "./clipboard_ext.js"; +import { t } from "./i18n.js"; import mime_types from "./mime_types.js"; import options from "./options.js"; -import { t } from "./i18n.js"; -import { copyText, copyTextWithToast } from "./clipboard_ext.js"; import { isShare } from "./utils.js"; -import { MimeType } from "@triliumnext/commons"; let highlightingLoaded = false; @@ -76,13 +77,15 @@ export async function applySingleBlockSyntaxHighlight($codeBlock: JQuery Date: Thu, 22 Jan 2026 20:56:58 +0200 Subject: [PATCH 027/316] fix(mermaid): preview not rendering when read-only (closes #8419) --- .../type_widgets/helpers/SplitEditor.tsx | 80 ++++++++++++++----- .../type_widgets/helpers/SvgSplitEditor.tsx | 21 ++--- 2 files changed, 72 insertions(+), 29 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/helpers/SplitEditor.tsx b/apps/client/src/widgets/type_widgets/helpers/SplitEditor.tsx index 6553b650a9..237556b5e7 100644 --- a/apps/client/src/widgets/type_widgets/helpers/SplitEditor.tsx +++ b/apps/client/src/widgets/type_widgets/helpers/SplitEditor.tsx @@ -8,7 +8,7 @@ import { DEFAULT_GUTTER_SIZE } from "../../../services/resizer"; import utils, { isMobile } from "../../../services/utils"; import ActionButton, { ActionButtonProps } from "../../react/ActionButton"; import Admonition from "../../react/Admonition"; -import { useNoteLabelBoolean, useTriliumOption } from "../../react/hooks"; +import { useNoteBlob, useNoteLabelBoolean, useTriliumOption } from "../../react/hooks"; import { EditableCode, EditableCodeProps } from "../code/Code"; export interface SplitEditorProps extends EditableCodeProps { @@ -30,12 +30,22 @@ export interface SplitEditorProps extends EditableCodeProps { * - Can display errors to the user via {@link setError}. * - Horizontal or vertical orientation for the editor/preview split, adjustable via the switch split orientation button floating button. */ -export default function SplitEditor({ note, error, splitOptions, previewContent, previewButtons, className, editorBefore, forceOrientation, ...editorProps }: SplitEditorProps) { - const splitEditorOrientation = useSplitOrientation(forceOrientation); - const [ readOnly ] = useNoteLabelBoolean(note, "readOnly"); - const containerRef = useRef(null); +export default function SplitEditor(props: SplitEditorProps) { + const [ readOnly ] = useNoteLabelBoolean(props.note, "readOnly"); - const editor = (!readOnly && + if (readOnly) { + return ; + } + + return ; + +} + +function EditorWithSplit({ note, error, splitOptions, previewContent, previewButtons, className, editorBefore, forceOrientation, ...editorProps }: SplitEditorProps) { + const containerRef = useRef(null); + const splitEditorOrientation = useSplitOrientation(forceOrientation); + + const editor = (
{editorBefore}
@@ -53,19 +63,14 @@ export default function SplitEditor({ note, error, splitOptions, previewContent,
); - const preview = ( -
-
- {previewContent} -
-
- {previewButtons} -
-
- ); + const preview = ; useEffect(() => { - if (!utils.isDesktop() || !containerRef.current || readOnly) return; + if (!utils.isDesktop() || !containerRef.current) return; const elements = Array.from(containerRef.current?.children) as HTMLElement[]; const splitInstance = Split(elements, { rtl: glob.isRtl, @@ -76,10 +81,10 @@ export default function SplitEditor({ note, error, splitOptions, previewContent, }); return () => splitInstance.destroy(); - }, [ readOnly, splitEditorOrientation ]); + }, [ splitEditorOrientation ]); return ( -
+
{splitEditorOrientation === "horizontal" ? <>{editor}{preview} : <>{preview}{editor}} @@ -87,6 +92,43 @@ export default function SplitEditor({ note, error, splitOptions, previewContent, ); } +function ReadOnlyView({ ...props }: SplitEditorProps) { + const { note, onContentChanged } = props; + const content = useNoteBlob(note); + const onContentChangedRef = useRef(onContentChanged); + + useEffect(() => { + onContentChangedRef.current = onContentChanged; + }); + + useEffect(() => { + onContentChangedRef.current?.(content?.content ?? ""); + }, [ content ]); + + return ( +
+ +
+ ); +} + +function PreviewContainer({ error, previewContent, previewButtons }: { + error?: string | null; + previewContent: ComponentChildren; + previewButtons?: ComponentChildren; +}) { + return ( +
+
+ {previewContent} +
+
+ {previewButtons} +
+
+ ); +} + export function PreviewButton(props: Omit) { return { /** @@ -144,7 +145,7 @@ export default function SvgSplitEditor({ ntxId, note, attachmentName, renderSvg, } {...props} /> - ) + ); } function useResizer(containerRef: RefObject, noteId: string, svg: string | undefined) { @@ -181,7 +182,7 @@ function useResizer(containerRef: RefObject, noteId: string, svg lastPanZoom.current = { pan: zoomInstance.getPan(), zoom: zoomInstance.getZoom() - } + }; zoomRef.current = undefined; zoomInstance.destroy(); }; From 907853bbba88db8ba204fff1e22aad3dd3559962 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 00:39:32 +0000 Subject: [PATCH 028/316] chore(deps): update dependency @redocly/cli to v2.14.7 --- apps/build-docs/package.json | 2 +- pnpm-lock.yaml | 58 +++++++++++++++++++++++------------- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/apps/build-docs/package.json b/apps/build-docs/package.json index 1ab4c6bc56..30b15663a6 100644 --- a/apps/build-docs/package.json +++ b/apps/build-docs/package.json @@ -11,7 +11,7 @@ "license": "AGPL-3.0-only", "packageManager": "pnpm@10.28.1", "devDependencies": { - "@redocly/cli": "2.14.5", + "@redocly/cli": "2.14.7", "archiver": "7.0.1", "fs-extra": "11.3.3", "react": "19.2.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9cc1a8dc8..5933ef7a66 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -140,8 +140,8 @@ importers: apps/build-docs: devDependencies: '@redocly/cli': - specifier: 2.14.5 - version: 2.14.5(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5) + specifier: 2.14.7 + version: 2.14.7(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5) archiver: specifier: 7.0.1 version: 7.0.1 @@ -4397,8 +4397,11 @@ packages: '@redocly/ajv@8.17.1': resolution: {integrity: sha512-EDtsGZS964mf9zAUXAl9Ew16eYbeyAFWhsPr0fX6oaJxgd8rApYlPBf0joyhnUHz88WxrigyFtTaqqzXNzPgqw==} - '@redocly/cli@2.14.5': - resolution: {integrity: sha512-02Zz7YS7UwfBpbHbF64ApUkspr8Ar2XytgZ7JUljVwz+VjzCRcxkGMGE82BVYYQNKkw/YwlNOIX+lYYNbowTcw==} + '@redocly/ajv@8.17.2': + resolution: {integrity: sha512-rcbDZOfXAgGEJeJ30aWCVVJvxV9ooevb/m1/SFblO2qHs4cqTk178gx7T/vdslf57EA4lTofrwsq5K8rxK9g+g==} + + '@redocly/cli@2.14.7': + resolution: {integrity: sha512-EO1sXTaFgk95/BLQ1rThCMbiWgJomm7nnKitysQxX6iv4Ie2FipIRus1oF0z0a6ADqPtyGBJQQUIoqCG1KJAuw==} engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} hasBin: true @@ -4412,12 +4415,12 @@ packages: resolution: {integrity: sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==} engines: {node: '>=18.17.0', npm: '>=9.5.0'} - '@redocly/openapi-core@2.14.5': - resolution: {integrity: sha512-MQQR+RCG0V+jZV6msgKv1CNi/+TZUXmjMAAuTEktaTOYIsQWTCV9GYSD/2n94eMDZwxI4olr05OPzOZo9z0EMg==} + '@redocly/openapi-core@2.14.7': + resolution: {integrity: sha512-urtiy9H09gecAqpHa5dRG739UBMFrpEZ8zG29FB4LKJNIfhQRSR+8XWzoXSTuGL5zRBSzJx6WvpOCwT6GMKXcg==} engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} - '@redocly/respect-core@2.14.5': - resolution: {integrity: sha512-zZKYwBZYfRi4/Iv2V7hq9xOYhpO3+IuzYjk8/V0CZjoHCnoW8jgGGhvoXMn/BfedZS9/3fV9n4SEskIbmCPl8Q==} + '@redocly/respect-core@2.14.7': + resolution: {integrity: sha512-nNLqrYnVo8Mpd0+CmKbDaUG1xd0PcrRj/NNgIuR7tcjPQGkdassKB2kFTOq9E9JkHWUdfqawRjT3PPrn/y4kaA==} engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} '@replit/codemirror-indentation-markers@6.5.3': @@ -15096,6 +15099,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-upload': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-ai@47.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: @@ -15436,6 +15441,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -15445,8 +15452,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -16064,6 +16069,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-special-characters@47.4.0': dependencies: @@ -18884,14 +18891,21 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - '@redocly/cli@2.14.5(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5)': + '@redocly/ajv@8.17.2': + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + '@redocly/cli@2.14.7(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5)': dependencies: '@opentelemetry/exporter-trace-otlp-http': 0.202.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.34.0 - '@redocly/openapi-core': 2.14.5 - '@redocly/respect-core': 2.14.5 + '@redocly/openapi-core': 2.14.7 + '@redocly/respect-core': 2.14.7 abort-controller: 3.0.0 ajv: '@redocly/ajv@8.17.1' ajv-formats: 3.0.1(@redocly/ajv@8.17.1) @@ -18943,12 +18957,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@redocly/openapi-core@2.14.5': + '@redocly/openapi-core@2.14.7': dependencies: - '@redocly/ajv': 8.17.1 + '@redocly/ajv': 8.17.2 '@redocly/config': 0.41.2 - ajv: '@redocly/ajv@8.17.1' - ajv-formats: 3.0.1(@redocly/ajv@8.17.1) + ajv: '@redocly/ajv@8.17.2' + ajv-formats: 3.0.1(@redocly/ajv@8.17.2) colorette: 1.4.0 js-levenshtein: 1.1.6 js-yaml: 4.1.1 @@ -18956,12 +18970,12 @@ snapshots: pluralize: 8.0.0 yaml-ast-parser: 0.0.43 - '@redocly/respect-core@2.14.5': + '@redocly/respect-core@2.14.7': dependencies: '@faker-js/faker': 7.6.0 '@noble/hashes': 1.8.0 '@redocly/ajv': 8.17.1 - '@redocly/openapi-core': 2.14.5 + '@redocly/openapi-core': 2.14.7 ajv: '@redocly/ajv@8.17.1' better-ajv-errors: 1.2.0(@redocly/ajv@8.17.1) colorette: 2.0.20 @@ -20956,6 +20970,10 @@ snapshots: optionalDependencies: ajv: '@redocly/ajv@8.17.1' + ajv-formats@3.0.1(@redocly/ajv@8.17.2): + optionalDependencies: + ajv: '@redocly/ajv@8.17.2' + ajv-formats@3.0.1(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 @@ -21065,7 +21083,7 @@ snapshots: archiver-utils@5.0.2: dependencies: - glob: 10.4.5 + glob: 10.5.0 graceful-fs: 4.2.11 is-stream: 2.0.1 lazystream: 1.0.1 From b45eef91402027730a9556eca0e3a7d4233e87bf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 00:40:10 +0000 Subject: [PATCH 029/316] chore(deps): update dependency @smithy/middleware-retry to v4.4.27 --- packages/ckeditor5/package.json | 2 +- pnpm-lock.yaml | 84 +++++++++++++++------------------ 2 files changed, 40 insertions(+), 46 deletions(-) diff --git a/packages/ckeditor5/package.json b/packages/ckeditor5/package.json index 165787584d..8b16b2d86f 100644 --- a/packages/ckeditor5/package.json +++ b/packages/ckeditor5/package.json @@ -16,7 +16,7 @@ "ckeditor5-premium-features": "47.4.0" }, "devDependencies": { - "@smithy/middleware-retry": "4.4.26", + "@smithy/middleware-retry": "4.4.27", "@types/jquery": "3.5.33" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9cc1a8dc8..887c4b7c9b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -888,8 +888,8 @@ importers: version: 47.4.0(bufferutil@4.0.9)(ckeditor5@47.4.0)(utf-8-validate@6.0.5) devDependencies: '@smithy/middleware-retry': - specifier: 4.4.26 - version: 4.4.26 + specifier: 4.4.27 + version: 4.4.27 '@types/jquery': specifier: 3.5.33 version: 3.5.33 @@ -4800,14 +4800,14 @@ packages: resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.20.7': - resolution: {integrity: sha512-aO7jmh3CtrmPsIJxUwYIzI5WVlMK8BMCPQ4D4nTzqTqBhbzvxHNzBMGcEg13yg/z9R2Qsz49NUFl0F0lVbTVFw==} - engines: {node: '>=18.0.0'} - '@smithy/core@3.21.0': resolution: {integrity: sha512-bg2TfzgsERyETAxc/Ims/eJX8eAnIeTi4r4LHpMpfF/2NyO6RsWis0rjKcCPaGksljmOb23BZRiCeT/3NvwkXw==} engines: {node: '>=18.0.0'} + '@smithy/core@3.21.1': + resolution: {integrity: sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.0.6': resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} engines: {node: '>=18.0.0'} @@ -4860,12 +4860,12 @@ packages: resolution: {integrity: sha512-kwWpNltpxrvPabnjEFvwSmA+66l6s2ReCvgVSzW/z92LU4T28fTdgZ18IdYRYOrisu2NMQ0jUndRScbO65A/zg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.8': - resolution: {integrity: sha512-TV44qwB/T0OMMzjIuI+JeS0ort3bvlPJ8XIH0MSlGADraXpZqmyND27ueuAL3E14optleADWqtd7dUgc2w+qhQ==} + '@smithy/middleware-endpoint@4.4.11': + resolution: {integrity: sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.26': - resolution: {integrity: sha512-ozZMoTAr+B2aVYfLYfkssFvc8ZV3p/vLpVQ7/k277xxUOA9ykSPe5obL2j6yHfbdrM/SZV7qj0uk/hSqavHrLw==} + '@smithy/middleware-retry@4.4.27': + resolution: {integrity: sha512-xFUYCGRVsfgiN5EjsJJSzih9+yjStgMTCLANPlf0LVQkPDYCe0hz97qbdTZosFOiYlGBlHYityGRxrQ/hxhfVQ==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.9': @@ -4916,8 +4916,8 @@ packages: resolution: {integrity: sha512-6o804SCyHGMXAb5mFJ+iTy9kVKv7F91a9szN0J+9X6p8A0NrdpUxdaC57aye2ipQkP2C4IAqETEpGZ0Zj77Haw==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.10.9': - resolution: {integrity: sha512-Je0EvGXVJ0Vrrr2lsubq43JGRIluJ/hX17aN/W/A0WfE+JpoMdI8kwk2t9F0zTX9232sJDGcoH4zZre6m6f/sg==} + '@smithy/smithy-client@4.10.12': + resolution: {integrity: sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==} engines: {node: '>=18.0.0'} '@smithy/types@4.12.0': @@ -14523,7 +14523,7 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.20.7 + '@smithy/core': 3.21.0 '@smithy/eventstream-serde-browser': 4.0.4 '@smithy/eventstream-serde-config-resolver': 4.1.2 '@smithy/eventstream-serde-node': 4.0.4 @@ -14531,14 +14531,14 @@ snapshots: '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.4.8 - '@smithy/middleware-retry': 4.4.26 + '@smithy/middleware-endpoint': 4.4.10 + '@smithy/middleware-retry': 4.4.27 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.9 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 @@ -14572,19 +14572,19 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.20.7 + '@smithy/core': 3.21.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.4.8 - '@smithy/middleware-retry': 4.4.26 + '@smithy/middleware-endpoint': 4.4.10 + '@smithy/middleware-retry': 4.4.27 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.9 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 @@ -14604,12 +14604,12 @@ snapshots: dependencies: '@aws-sdk/types': 3.821.0 '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.20.7 + '@smithy/core': 3.21.0 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.10.9 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 @@ -14634,7 +14634,7 @@ snapshots: '@smithy/node-http-handler': 4.4.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.9 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/util-stream': 4.5.10 tslib: 2.8.1 @@ -14746,7 +14746,7 @@ snapshots: '@aws-sdk/core': 3.823.0 '@aws-sdk/types': 3.821.0 '@aws-sdk/util-endpoints': 3.821.0 - '@smithy/core': 3.20.7 + '@smithy/core': 3.21.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 @@ -14766,19 +14766,19 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.20.7 + '@smithy/core': 3.21.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.4.8 - '@smithy/middleware-retry': 4.4.26 + '@smithy/middleware-endpoint': 4.4.10 + '@smithy/middleware-retry': 4.4.27 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.9 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 @@ -15242,8 +15242,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15445,8 +15443,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -15976,8 +15972,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -19297,7 +19291,7 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/core@3.20.7': + '@smithy/core@3.21.0': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -19310,7 +19304,7 @@ snapshots: '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/core@3.21.0': + '@smithy/core@3.21.1': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -19406,9 +19400,9 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.8': + '@smithy/middleware-endpoint@4.4.11': dependencies: - '@smithy/core': 3.20.7 + '@smithy/core': 3.21.1 '@smithy/middleware-serde': 4.2.9 '@smithy/node-config-provider': 4.3.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -19417,12 +19411,12 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.26': + '@smithy/middleware-retry@4.4.27': dependencies: '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/service-error-classification': 4.2.8 - '@smithy/smithy-client': 4.10.11 + '@smithy/smithy-client': 4.10.12 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -19506,10 +19500,10 @@ snapshots: '@smithy/util-stream': 4.5.10 tslib: 2.8.1 - '@smithy/smithy-client@4.10.9': + '@smithy/smithy-client@4.10.12': dependencies: - '@smithy/core': 3.20.7 - '@smithy/middleware-endpoint': 4.4.8 + '@smithy/core': 3.21.1 + '@smithy/middleware-endpoint': 4.4.11 '@smithy/middleware-stack': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 @@ -19557,7 +19551,7 @@ snapshots: '@smithy/util-defaults-mode-browser@4.0.22': dependencies: '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.9 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 bowser: 2.11.0 tslib: 2.8.1 @@ -19568,7 +19562,7 @@ snapshots: '@smithy/credential-provider-imds': 4.0.6 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.9 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 tslib: 2.8.1 From 577780cb90ceb197026dcfd1f74bb31ea0d3bfc8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 00:41:33 +0000 Subject: [PATCH 030/316] chore(deps): update vitest monorepo to v4.0.18 --- apps/website/package.json | 2 +- package.json | 8 +- packages/ckeditor5-admonition/package.json | 6 +- packages/ckeditor5-footnotes/package.json | 6 +- .../ckeditor5-keyboard-marker/package.json | 6 +- packages/ckeditor5-math/package.json | 6 +- packages/ckeditor5-mermaid/package.json | 6 +- pnpm-lock.yaml | 236 +++++++++--------- 8 files changed, 135 insertions(+), 141 deletions(-) diff --git a/apps/website/package.json b/apps/website/package.json index b478eec643..5b98d62e92 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -23,7 +23,7 @@ "typescript": "5.9.3", "user-agent-data-types": "0.4.2", "vite": "7.3.1", - "vitest": "4.0.17" + "vitest": "4.0.18" }, "eslintConfig": { "extends": "preact" diff --git a/package.json b/package.json index 8bb9583147..10c1a22808 100644 --- a/package.json +++ b/package.json @@ -51,9 +51,9 @@ "@types/express": "5.0.6", "@types/js-yaml": "4.0.9", "@types/node": "24.10.9", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/coverage-v8": "4.0.17", - "@vitest/ui": "4.0.17", + "@vitest/browser-webdriverio": "4.0.18", + "@vitest/coverage-v8": "4.0.18", + "@vitest/ui": "4.0.18", "chalk": "5.6.2", "cross-env": "10.1.0", "dpdm": "3.14.0", @@ -77,7 +77,7 @@ "upath": "2.0.1", "vite": "7.3.1", "vite-plugin-dts": "4.5.4", - "vitest": "4.0.17" + "vitest": "4.0.18" }, "license": "AGPL-3.0-only", "author": { diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index 2364bd8514..26714f10c6 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -26,8 +26,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.53.0", "@typescript-eslint/parser": "8.53.0", - "@vitest/browser": "4.0.17", - "@vitest/coverage-istanbul": "4.0.17", + "@vitest/browser": "4.0.18", + "@vitest/coverage-istanbul": "4.0.18", "ckeditor5": "47.4.0", "eslint": "9.39.2", "eslint-config-ckeditor5": ">=9.1.0", @@ -38,7 +38,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "2.0.0", - "vitest": "4.0.17", + "vitest": "4.0.18", "webdriverio": "9.23.2" }, "peerDependencies": { diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index e387a85184..b9af9cc183 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -27,8 +27,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.53.0", "@typescript-eslint/parser": "8.53.0", - "@vitest/browser": "4.0.17", - "@vitest/coverage-istanbul": "4.0.17", + "@vitest/browser": "4.0.18", + "@vitest/coverage-istanbul": "4.0.18", "ckeditor5": "47.4.0", "eslint": "9.39.2", "eslint-config-ckeditor5": ">=9.1.0", @@ -39,7 +39,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "2.0.0", - "vitest": "4.0.17", + "vitest": "4.0.18", "webdriverio": "9.23.2" }, "peerDependencies": { diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index e72036a08b..cd53f5eadb 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -29,8 +29,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.53.0", "@typescript-eslint/parser": "8.53.0", - "@vitest/browser": "4.0.17", - "@vitest/coverage-istanbul": "4.0.17", + "@vitest/browser": "4.0.18", + "@vitest/coverage-istanbul": "4.0.18", "ckeditor5": "47.4.0", "eslint": "9.39.2", "eslint-config-ckeditor5": ">=9.1.0", @@ -41,7 +41,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "2.0.0", - "vitest": "4.0.17", + "vitest": "4.0.18", "webdriverio": "9.23.2" }, "peerDependencies": { diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index 259cee11d9..4bc2e55a90 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -29,8 +29,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.53.0", "@typescript-eslint/parser": "8.53.0", - "@vitest/browser": "4.0.17", - "@vitest/coverage-istanbul": "4.0.17", + "@vitest/browser": "4.0.18", + "@vitest/coverage-istanbul": "4.0.18", "ckeditor5": "47.4.0", "eslint": "9.39.2", "eslint-config-ckeditor5": ">=9.1.0", @@ -41,7 +41,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "2.0.0", - "vitest": "4.0.17", + "vitest": "4.0.18", "webdriverio": "9.23.2" }, "peerDependencies": { diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index 34d580fff2..8842b7dac9 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -29,8 +29,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.53.0", "@typescript-eslint/parser": "8.53.0", - "@vitest/browser": "4.0.17", - "@vitest/coverage-istanbul": "4.0.17", + "@vitest/browser": "4.0.18", + "@vitest/coverage-istanbul": "4.0.18", "ckeditor5": "47.4.0", "eslint": "9.39.2", "eslint-config-ckeditor5": ">=9.1.0", @@ -41,7 +41,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "2.0.0", - "vitest": "4.0.17", + "vitest": "4.0.18", "webdriverio": "9.23.2" }, "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9cc1a8dc8..0dd254ac38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,14 +56,14 @@ importers: specifier: 24.10.9 version: 24.10.9 '@vitest/browser-webdriverio': - specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 4.0.18 + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-v8': - specifier: 4.0.17 - version: 4.0.17(@vitest/browser@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17))(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18))(vitest@4.0.18) '@vitest/ui': - specifier: 4.0.17 - version: 4.0.17(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(vitest@4.0.18) chalk: specifier: 5.6.2 version: 5.6.2 @@ -134,8 +134,8 @@ importers: specifier: 4.5.4 version: 4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: - specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -857,8 +857,8 @@ importers: specifier: 7.3.1 version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vitest: - specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -912,11 +912,11 @@ importers: specifier: 8.53.0 version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': - specifier: 4.0.17 - version: 4.0.17(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(vitest@4.0.18) ckeditor5: specifier: 47.4.0 version: 47.4.0 @@ -948,8 +948,8 @@ importers: specifier: 2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: - specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -972,11 +972,11 @@ importers: specifier: 8.53.0 version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': - specifier: 4.0.17 - version: 4.0.17(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(vitest@4.0.18) ckeditor5: specifier: 47.4.0 version: 47.4.0 @@ -1008,8 +1008,8 @@ importers: specifier: 2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: - specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1032,11 +1032,11 @@ importers: specifier: 8.53.0 version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': - specifier: 4.0.17 - version: 4.0.17(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(vitest@4.0.18) ckeditor5: specifier: 47.4.0 version: 47.4.0 @@ -1068,8 +1068,8 @@ importers: specifier: 2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: - specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1099,11 +1099,11 @@ importers: specifier: 8.53.0 version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': - specifier: 4.0.17 - version: 4.0.17(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(vitest@4.0.18) ckeditor5: specifier: 47.4.0 version: 47.4.0 @@ -1135,8 +1135,8 @@ importers: specifier: 2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: - specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1166,11 +1166,11 @@ importers: specifier: 8.53.0 version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.17 - version: 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': - specifier: 4.0.17 - version: 4.0.17(vitest@4.0.17) + specifier: 4.0.18 + version: 4.0.18(vitest@4.0.18) ckeditor5: specifier: 47.4.0 version: 47.4.0 @@ -1202,8 +1202,8 @@ importers: specifier: 2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: - specifier: 4.0.17 - version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + specifier: 4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -5789,36 +5789,36 @@ packages: resolution: {integrity: sha512-kUDV5J+DXUl1SnO0IccRseXOK6sZolMHBHHNH+UNVoA/Ubr3r/bOFw4QTcImdn6PFUmlt9MvYvQfCHswuGvJNA==} engines: {node: '>=16'} - '@vitest/browser-webdriverio@4.0.17': - resolution: {integrity: sha512-0u1C2yW5J9wt7vrkZ5+VTj6+Ckz4LKV3SBWjk55clK5Earqh24c1tv+VdRW1ZSxlzJ6gjeAm/YoFM7MMq6tFHw==} + '@vitest/browser-webdriverio@4.0.18': + resolution: {integrity: sha512-dKn4kBq6gFk+wT5DMjPTvivXptz9MaN7CONoP+bA0bZxWofNsZtf9R4oPwQakuB95WBQ3j5kZ/9SXvB9i+XYQw==} peerDependencies: - vitest: 4.0.17 + vitest: 4.0.18 webdriverio: '*' - '@vitest/browser@4.0.17': - resolution: {integrity: sha512-cgf2JZk2fv5or3efmOrRJe1V9Md89BPgz4ntzbf84yAb+z2hW6niaGFinl9aFzPZ1q3TGfWZQWZ9gXTFThs2Qw==} + '@vitest/browser@4.0.18': + resolution: {integrity: sha512-gVQqh7paBz3gC+ZdcCmNSWJMk70IUjDeVqi+5m5vYpEHsIwRgw3Y545jljtajhkekIpIp5Gg8oK7bctgY0E2Ng==} peerDependencies: - vitest: 4.0.17 + vitest: 4.0.18 - '@vitest/coverage-istanbul@4.0.17': - resolution: {integrity: sha512-ayJXDFjASfKRwe4MlBxnC55busMQNxlWQu8i13q2V7/DT1KKUIfIqLgAphnBclqLmi/oAIC4JHcBF6GWZ3/EeQ==} + '@vitest/coverage-istanbul@4.0.18': + resolution: {integrity: sha512-0OhjP30owEDihYTZGWuq20rNtV1RjjJs1Mv4MaZIKcFBmiLUXX7HJLX4fU7wE+Mrc3lQxI2HKq6WrSXi5FGuCQ==} peerDependencies: - vitest: 4.0.17 + vitest: 4.0.18 - '@vitest/coverage-v8@4.0.17': - resolution: {integrity: sha512-/6zU2FLGg0jsd+ePZcwHRy3+WpNTBBhDY56P4JTRqUN/Dp6CvOEa9HrikcQ4KfV2b2kAHUFB4dl1SuocWXSFEw==} + '@vitest/coverage-v8@4.0.18': + resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} peerDependencies: - '@vitest/browser': 4.0.17 - vitest: 4.0.17 + '@vitest/browser': 4.0.18 + vitest: 4.0.18 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.17': - resolution: {integrity: sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==} + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} - '@vitest/mocker@4.0.17': - resolution: {integrity: sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==} + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -5828,25 +5828,25 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.17': - resolution: {integrity: sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==} + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} - '@vitest/runner@4.0.17': - resolution: {integrity: sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==} + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} - '@vitest/snapshot@4.0.17': - resolution: {integrity: sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==} + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} - '@vitest/spy@4.0.17': - resolution: {integrity: sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==} + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} - '@vitest/ui@4.0.17': - resolution: {integrity: sha512-hRDjg6dlDz7JlZAvjbiCdAJ3SDG+NH8tjZe21vjxfvT2ssYAn72SRXMge3dKKABm3bIJ3C+3wdunIdur8PHEAw==} + '@vitest/ui@4.0.18': + resolution: {integrity: sha512-CGJ25bc8fRi8Lod/3GHSvXRKi7nBo3kxh0ApW4yCjmrWmRmlT53B5E08XRSZRliygG0aVNxLrBEqPYdz/KcCtQ==} peerDependencies: - vitest: 4.0.17 + vitest: 4.0.18 - '@vitest/utils@4.0.17': - resolution: {integrity: sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==} + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} '@volar/language-core@2.4.13': resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==} @@ -13917,18 +13917,18 @@ packages: yaml: optional: true - vitest@4.0.17: - resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==} + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.17 - '@vitest/browser-preview': 4.0.17 - '@vitest/browser-webdriverio': 4.0.17 - '@vitest/ui': 4.0.17 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -15242,8 +15242,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15445,8 +15443,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -15976,8 +15972,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -20574,10 +20568,10 @@ snapshots: - bufferutil - utf-8-validate - '@vitest/browser-webdriverio@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@vitest/browser-webdriverio@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: - '@vitest/browser': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -20585,16 +20579,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)': + '@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)': dependencies: - '@vitest/mocker': 4.0.17(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - '@vitest/utils': 4.0.17 + '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/utils': 4.0.18 magic-string: 0.30.21 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) ws: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -20602,7 +20596,7 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-istanbul@4.0.17(vitest@4.0.17)': + '@vitest/coverage-istanbul@4.0.18(vitest@4.0.18)': dependencies: '@istanbuljs/schema': 0.1.3 '@jridgewell/gen-mapping': 0.3.13 @@ -20614,14 +20608,14 @@ snapshots: magicast: 0.5.1 obug: 2.1.1 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.17(@vitest/browser@4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17))(vitest@4.0.17)': + '@vitest/coverage-v8@4.0.18(@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18))(vitest@4.0.18)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.17 + '@vitest/utils': 4.0.18 ast-v8-to-istanbul: 0.3.10 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -20630,59 +20624,59 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17) + '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) - '@vitest/expect@4.0.17': + '@vitest/expect@4.0.18': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.2 - '@vitest/spy': 4.0.17 - '@vitest/utils': 4.0.17 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.17(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitest/mocker@4.0.18(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: - '@vitest/spy': 4.0.17 + '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.7.5(@types/node@24.10.9)(typescript@5.9.3) vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - '@vitest/pretty-format@4.0.17': + '@vitest/pretty-format@4.0.18': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.17': + '@vitest/runner@4.0.18': dependencies: - '@vitest/utils': 4.0.17 + '@vitest/utils': 4.0.18 pathe: 2.0.3 - '@vitest/snapshot@4.0.17': + '@vitest/snapshot@4.0.18': dependencies: - '@vitest/pretty-format': 4.0.17 + '@vitest/pretty-format': 4.0.18 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.17': {} + '@vitest/spy@4.0.18': {} - '@vitest/ui@4.0.17(vitest@4.0.17)': + '@vitest/ui@4.0.18(vitest@4.0.18)': dependencies: - '@vitest/utils': 4.0.17 + '@vitest/utils': 4.0.18 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - '@vitest/utils@4.0.17': + '@vitest/utils@4.0.18': dependencies: - '@vitest/pretty-format': 4.0.17 + '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 '@volar/language-core@2.4.13': @@ -30547,15 +30541,15 @@ snapshots: tsx: 4.21.0 yaml: 2.8.1 - vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.17)(@vitest/ui@4.0.17)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: - '@vitest/expect': 4.0.17 - '@vitest/mocker': 4.0.17(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.17 - '@vitest/runner': 4.0.17 - '@vitest/snapshot': 4.0.17 - '@vitest/spy': 4.0.17 - '@vitest/utils': 4.0.17 + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 es-module-lexer: 1.7.0 expect-type: 1.2.2 magic-string: 0.30.21 @@ -30572,8 +30566,8 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 24.10.9 - '@vitest/browser-webdriverio': 4.0.17(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.17)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) - '@vitest/ui': 4.0.17(vitest@4.0.17) + '@vitest/browser-webdriverio': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/ui': 4.0.18(vitest@4.0.18) happy-dom: 20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: From a57a1dfc475f24b757212cc45afd3f39c9208791 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 00:42:22 +0000 Subject: [PATCH 031/316] chore(deps): update dependency express-session to v1.19.0 --- apps/server/package.json | 2 +- pnpm-lock.yaml | 16 +++++----------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index 482f608dac..5edc905be4 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -91,7 +91,7 @@ "express-http-proxy": "2.1.2", "express-openid-connect": "2.19.4", "express-rate-limit": "8.2.1", - "express-session": "1.18.2", + "express-session": "1.19.0", "file-uri-to-path": "2.0.0", "fs-extra": "11.3.3", "helmet": "8.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9cc1a8dc8..f202e1c5de 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -688,8 +688,8 @@ importers: specifier: 8.2.1 version: 8.2.1(express@5.2.1) express-session: - specifier: 1.18.2 - version: 1.18.2 + specifier: 1.19.0 + version: 1.19.0 file-uri-to-path: specifier: 2.0.0 version: 2.0.0 @@ -8183,8 +8183,8 @@ packages: peerDependencies: express: '>= 4.11' - express-session@1.18.2: - resolution: {integrity: sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==} + express-session@1.19.0: + resolution: {integrity: sha512-0csaMkGq+vaiZTmSMMGkfdCOabYv192VbytFypcvI0MANrp+4i/7yEkJ0sbAEhycQjntaKGzYfjfXQyVb7BHMA==} engines: {node: '>= 0.8.0'} express@4.21.2: @@ -15242,8 +15242,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15445,8 +15443,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -15976,8 +15972,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -23713,7 +23707,7 @@ snapshots: express: 5.2.1 ip-address: 10.0.1 - express-session@1.18.2: + express-session@1.19.0: dependencies: cookie: 0.7.2 cookie-signature: 1.0.7 From 901201a7af6eefcd086e12efc7cc6f29fb3ee333 Mon Sep 17 00:00:00 2001 From: Wael Nasreddine Date: Thu, 22 Jan 2026 18:59:03 -0800 Subject: [PATCH 032/316] chore: pnpm2nix to use our copy of flake-utils --- flake.lock | 37 +++---------------------------------- flake.nix | 5 ++++- 2 files changed, 7 insertions(+), 35 deletions(-) diff --git a/flake.lock b/flake.lock index 447d1e1b02..9603cb3c6d 100644 --- a/flake.lock +++ b/flake.lock @@ -18,24 +18,6 @@ "type": "github" } }, - "flake-utils_2": { - "inputs": { - "systems": "systems_2" - }, - "locked": { - "lastModified": 1701680307, - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, "nixpkgs": { "locked": { "lastModified": 1765701828, @@ -54,7 +36,9 @@ }, "pnpm2nix": { "inputs": { - "flake-utils": "flake-utils_2", + "flake-utils": [ + "flake-utils" + ], "nixpkgs": [ "nixpkgs" ] @@ -94,21 +78,6 @@ "repo": "default", "type": "github" } - }, - "systems_2": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index ed1548b9ee..2434a8d5db 100644 --- a/flake.nix +++ b/flake.nix @@ -6,7 +6,10 @@ flake-utils.url = "github:numtide/flake-utils"; pnpm2nix = { url = "github:FliegendeWurst/pnpm2nix-nzbr"; - inputs.nixpkgs.follows = "nixpkgs"; + inputs = { + flake-utils.follows = "flake-utils"; + nixpkgs.follows = "nixpkgs"; + }; }; }; From 9a912c16ada632e18e39d57943ee8a16439ea647 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 23 Jan 2026 07:51:58 +0100 Subject: [PATCH 033/316] Update translation files Updated by "Cleanup translation files" add-on in Weblate. Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ --- docs/README-hi.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README-hi.md b/docs/README-hi.md index d0b229deb4..b8e1901420 100644 --- a/docs/README-hi.md +++ b/docs/README-hi.md @@ -114,8 +114,8 @@ application with focus on building large personal knowledge bases. location pins and GPX tracks * [Scripting](https://docs.triliumnotes.org/user-guide/scripts) - see [Advanced showcases](https://docs.triliumnotes.org/user-guide/advanced-usage/advanced-showcases) -* [REST API](https://docs.triliumnotes.org/user-guide/advanced-usage/etapi) for - automation +* ऑटोमेशन के लिए [REST + API](https://docs.triliumnotes.org/user-guide/advanced-usage/etapi) * Scales well in both usability and performance upwards of 100 000 notes * Touch optimized [mobile frontend](https://docs.triliumnotes.org/user-guide/setup/mobile-frontend) for From 36429da6da87c2b4fa1e357dff36a30021d5cb81 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 07:09:50 +0000 Subject: [PATCH 034/316] chore(deps): update dependency happy-dom to v20.3.7 --- apps/client/package.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 48 +++++++++++++++++++++------------------- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index f429465319..d14478f5c1 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -78,7 +78,7 @@ "@types/reveal.js": "5.2.2", "@types/tabulator-tables": "6.3.1", "copy-webpack-plugin": "13.0.1", - "happy-dom": "20.3.4", + "happy-dom": "20.3.7", "lightningcss": "1.31.1", "script-loader": "0.7.2", "vite-plugin-static-copy": "3.1.5" diff --git a/package.json b/package.json index 10c1a22808..e71d37e9bd 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "eslint-config-prettier": "10.1.8", "eslint-plugin-playwright": "2.5.0", "eslint-plugin-simple-import-sort": "12.1.1", - "happy-dom": "20.3.4", + "happy-dom": "20.3.7", "http-server": "14.1.1", "jiti": "2.6.1", "js-yaml": "4.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 950a4e4a35..e6810837eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -92,8 +92,8 @@ importers: specifier: 12.1.1 version: 12.1.1(eslint@9.39.2(jiti@2.6.1)) happy-dom: - specifier: 20.3.4 - version: 20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 20.3.7 + version: 20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5) http-server: specifier: 14.1.1 version: 14.1.1 @@ -135,7 +135,7 @@ importers: version: 4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -345,8 +345,8 @@ importers: specifier: 13.0.1 version: 13.0.1(webpack@5.101.3(esbuild@0.27.2)) happy-dom: - specifier: 20.3.4 - version: 20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 20.3.7 + version: 20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5) lightningcss: specifier: 1.31.1 version: 1.31.1 @@ -858,7 +858,7 @@ importers: version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -949,7 +949,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1009,7 +1009,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1069,7 +1069,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1136,7 +1136,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1203,7 +1203,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -8746,8 +8746,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@20.3.4: - resolution: {integrity: sha512-rfbiwB6OKxZFIFQ7SRnCPB2WL9WhyXsFoTfecYgeCeFSOBxvkWLaXsdv5ehzJrfqwXQmDephAKWLRQoFoJwrew==} + happy-dom@20.3.7: + resolution: {integrity: sha512-sb5IzoRl1WJKsUSRe+IloJf3z1iDq5PQ7Yk/ULMsZ5IAQEs9ZL7RsFfiKBXU7nK9QmO+iz0e59EH8r8jexTZ/g==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -15242,6 +15242,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15461,8 +15463,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.4.0': dependencies: @@ -15512,6 +15512,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-essentials@47.4.0': dependencies: @@ -20571,7 +20573,7 @@ snapshots: '@vitest/browser-webdriverio@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -20588,7 +20590,7 @@ snapshots: pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) ws: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -20608,7 +20610,7 @@ snapshots: magicast: 0.5.1 obug: 2.1.1 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -20624,7 +20626,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) optionalDependencies: '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) @@ -20672,7 +20674,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/utils@4.0.18': dependencies: @@ -24459,7 +24461,7 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): + happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/node': 24.10.9 '@types/whatwg-mimetype': 3.0.2 @@ -30541,7 +30543,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.1 - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.18 '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) @@ -30568,7 +30570,7 @@ snapshots: '@types/node': 24.10.9 '@vitest/browser-webdriverio': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/ui': 4.0.18(vitest@4.0.18) - happy-dom: 20.3.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) + happy-dom: 20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5) jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - jiti From 3e3c3e3bb4bdbddaa1f6f41bcb381f0ca3531243 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 11:38:18 +0200 Subject: [PATCH 035/316] fix(calendar): redundant refresh when adding new item --- apps/client/src/services/attributes.ts | 6 +++--- .../src/widgets/collections/calendar/api.ts | 17 +++++++++-------- .../src/widgets/collections/calendar/index.tsx | 18 ++++++++++-------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/apps/client/src/services/attributes.ts b/apps/client/src/services/attributes.ts index 0b156dcf3a..728ff515c6 100644 --- a/apps/client/src/services/attributes.ts +++ b/apps/client/src/services/attributes.ts @@ -14,13 +14,13 @@ async function addLabel(noteId: string, name: string, value: string = "", isInhe }); } -export async function setLabel(noteId: string, name: string, value: string = "", isInheritable = false) { +export async function setLabel(noteId: string, name: string, value: string = "", isInheritable = false, componentId?: string) { await server.put(`notes/${noteId}/set-attribute`, { type: "label", name, value, - isInheritable - }); + isInheritable, + }, componentId); } export async function setRelation(noteId: string, name: string, value: string = "", isInheritable = false) { diff --git a/apps/client/src/widgets/collections/calendar/api.ts b/apps/client/src/widgets/collections/calendar/api.ts index eef391108d..65f8905e4c 100644 --- a/apps/client/src/widgets/collections/calendar/api.ts +++ b/apps/client/src/widgets/collections/calendar/api.ts @@ -1,8 +1,8 @@ import { CreateChildrenResponse } from "@triliumnext/commons"; -import server from "../../../services/server"; + import FNote from "../../../entities/fnote"; import { setAttribute, setLabel } from "../../../services/attributes"; -import froca from "../../../services/froca"; +import server from "../../../services/server"; interface NewEventOpts { title: string; @@ -10,6 +10,7 @@ interface NewEventOpts { endDate?: string | null; startTime?: string | null; endTime?: string | null; + componentId?: string; } interface ChangeEventOpts { @@ -19,24 +20,24 @@ interface ChangeEventOpts { endTime?: string | null; } -export async function newEvent(parentNote: FNote, { title, startDate, endDate, startTime, endTime }: NewEventOpts) { +export async function newEvent(parentNote: FNote, { title, startDate, endDate, startTime, endTime, componentId }: NewEventOpts) { // Create the note. const { note } = await server.post(`notes/${parentNote.noteId}/children?target=into`, { title, content: "", type: "text" - }); + }, componentId); // Set the attributes. - setLabel(note.noteId, "startDate", startDate); + setLabel(note.noteId, "startDate", startDate, false, componentId); if (endDate) { - setLabel(note.noteId, "endDate", endDate); + setLabel(note.noteId, "endDate", endDate, false, componentId); } if (startTime) { - setLabel(note.noteId, "startTime", startTime); + setLabel(note.noteId, "startTime", startTime, false, componentId); } if (endTime) { - setLabel(note.noteId, "endTime", endTime); + setLabel(note.noteId, "endTime", endTime, false, componentId); } } diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx index 9d1721a97a..fd7669646e 100644 --- a/apps/client/src/widgets/collections/calendar/index.tsx +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -5,7 +5,7 @@ import { DateSelectArg, EventChangeArg, EventMountArg, EventSourceFuncArg, Local import { DateClickArg } from "@fullcalendar/interaction"; import { DISPLAYABLE_LOCALE_IDS } from "@triliumnext/commons"; import { RefObject } from "preact"; -import { useCallback, useEffect, useMemo, useRef, useState } from "preact/hooks"; +import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "preact/hooks"; import appContext from "../../../components/app_context"; import FNote from "../../../entities/fnote"; @@ -17,6 +17,7 @@ import { isMobile } from "../../../services/utils"; import ActionButton from "../../react/ActionButton"; import Button, { ButtonGroup } from "../../react/Button"; import { useNoteLabel, useNoteLabelBoolean, useResizeObserver, useSpacedUpdate, useTriliumEvent, useTriliumOption, useTriliumOptionInt } from "../../react/hooks"; +import { ParentComponent } from "../../react/react_utils"; import TouchBar, { TouchBarButton, TouchBarLabel, TouchBarSegmentedControl, TouchBarSpacer } from "../../react/TouchBar"; import { ViewModeProps } from "../interface"; import { changeEvent, newEvent } from "./api"; @@ -87,6 +88,7 @@ export const LOCALE_MAPPINGS: Record Promise<{ de }; export default function CalendarView({ note, noteIds }: ViewModeProps) { + const parentComponent = useContext(ParentComponent); const containerRef = useRef(null); const calendarRef = useRef(null); @@ -105,24 +107,24 @@ export default function CalendarView({ note, noteIds }: ViewModeProps { if (!isCalendarRoot) { return async () => await buildEvents(noteIds); - } + } return async (e: EventSourceFuncArg) => await buildEventsForCalendar(note, e); - }, [isCalendarRoot, noteIds]); const plugins = usePlugins(isEditable, isCalendarRoot); const locale = useLocale(); const { eventDidMount } = useEventDisplayCustomization(note); - const editingProps = useEditing(note, isEditable, isCalendarRoot); + const editingProps = useEditing(note, isEditable, isCalendarRoot, parentComponent?.componentId); // React to changes. useTriliumEvent("entitiesReloaded", ({ loadResults }) => { if (loadResults.getNoteIds().some(noteId => noteIds.includes(noteId)) // note title change. - || loadResults.getAttributeRows().some((a) => noteIds.includes(a.noteId ?? ""))) // subnote change. + || loadResults.getAttributeRows(parentComponent?.componentId).some((a) => noteIds.includes(a.noteId ?? ""))) // subnote change. { // Defer execution after the load results are processed so that the event builder has the updated data to work with. setTimeout(() => { + console.log("Refresh"); calendarRef.current?.refetchEvents(); }, 0); } @@ -222,7 +224,7 @@ function useLocale() { return calendarLocale; } -function useEditing(note: FNote, isEditable: boolean, isCalendarRoot: boolean) { +function useEditing(note: FNote, isEditable: boolean, isCalendarRoot: boolean, componentId: string | undefined) { const onCalendarSelection = useCallback(async (e: DateSelectArg) => { const { startDate, endDate } = parseStartEndDateFromEvent(e); if (!startDate) return; @@ -234,8 +236,8 @@ function useEditing(note: FNote, isEditable: boolean, isCalendarRoot: boolean) { return; } - newEvent(note, { title, startDate, endDate, startTime, endTime }); - }, [ note ]); + newEvent(note, { title, startDate, endDate, startTime, endTime, componentId }); + }, [ note, componentId ]); const onEventChange = useCallback(async (e: EventChangeArg) => { const { startDate, endDate } = parseStartEndDateFromEvent(e.event); From 2a61f51e06ecb476260bf45895245c8a9f68d710 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 11:58:57 +0200 Subject: [PATCH 036/316] chore(calendar): remove automatic fetching on note creation --- apps/client/src/widgets/collections/calendar/index.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx index fd7669646e..103c64d637 100644 --- a/apps/client/src/widgets/collections/calendar/index.tsx +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -104,12 +104,17 @@ export default function CalendarView({ note, noteIds }: ViewModeProps calendarRef.current?.updateSize()); const isCalendarRoot = (calendarRoot || workspaceCalendarRoot); const isEditable = !isCalendarRoot; + const noteIdsRef = useRef(noteIds); + useEffect(() => { + noteIdsRef.current = noteIds; + }, [ noteIds ]); + const eventBuilder = useMemo(() => { if (!isCalendarRoot) { - return async () => await buildEvents(noteIds); + return async () => await buildEvents(noteIdsRef.current); } return async (e: EventSourceFuncArg) => await buildEventsForCalendar(note, e); - }, [isCalendarRoot, noteIds]); + }, [isCalendarRoot, note]); const plugins = usePlugins(isEditable, isCalendarRoot); const locale = useLocale(); From 2eae8bbb644772d35361f9bc8c3e274136a02ba7 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 12:05:12 +0200 Subject: [PATCH 037/316] Revert "chore(calendar): remove automatic fetching on note creation" This reverts commit 2a61f51e06ecb476260bf45895245c8a9f68d710. --- apps/client/src/widgets/collections/calendar/index.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx index 103c64d637..fd7669646e 100644 --- a/apps/client/src/widgets/collections/calendar/index.tsx +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -104,17 +104,12 @@ export default function CalendarView({ note, noteIds }: ViewModeProps calendarRef.current?.updateSize()); const isCalendarRoot = (calendarRoot || workspaceCalendarRoot); const isEditable = !isCalendarRoot; - const noteIdsRef = useRef(noteIds); - useEffect(() => { - noteIdsRef.current = noteIds; - }, [ noteIds ]); - const eventBuilder = useMemo(() => { if (!isCalendarRoot) { - return async () => await buildEvents(noteIdsRef.current); + return async () => await buildEvents(noteIds); } return async (e: EventSourceFuncArg) => await buildEventsForCalendar(note, e); - }, [isCalendarRoot, note]); + }, [isCalendarRoot, noteIds]); const plugins = usePlugins(isEditable, isCalendarRoot); const locale = useLocale(); From 81c85d712ea42e571f3ab28630d001e67f05cb63 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 12:11:06 +0200 Subject: [PATCH 038/316] chore(calendar): create note with attributes atomically --- .../src/widgets/collections/calendar/api.ts | 43 +++++--- apps/server/src/services/note-interface.ts | 4 +- apps/server/src/services/notes.ts | 98 ++++++++++--------- 3 files changed, 85 insertions(+), 60 deletions(-) diff --git a/apps/client/src/widgets/collections/calendar/api.ts b/apps/client/src/widgets/collections/calendar/api.ts index 65f8905e4c..fde9a26501 100644 --- a/apps/client/src/widgets/collections/calendar/api.ts +++ b/apps/client/src/widgets/collections/calendar/api.ts @@ -1,4 +1,4 @@ -import { CreateChildrenResponse } from "@triliumnext/commons"; +import { AttributeRow, CreateChildrenResponse } from "@triliumnext/commons"; import FNote from "../../../entities/fnote"; import { setAttribute, setLabel } from "../../../services/attributes"; @@ -21,24 +21,41 @@ interface ChangeEventOpts { } export async function newEvent(parentNote: FNote, { title, startDate, endDate, startTime, endTime, componentId }: NewEventOpts) { - // Create the note. - const { note } = await server.post(`notes/${parentNote.noteId}/children?target=into`, { - title, - content: "", - type: "text" - }, componentId); - - // Set the attributes. - setLabel(note.noteId, "startDate", startDate, false, componentId); + const attributes: Omit[] = []; + attributes.push({ + type: "label", + name: "startDate", + value: startDate + }); if (endDate) { - setLabel(note.noteId, "endDate", endDate, false, componentId); + attributes.push({ + type: "label", + name: "endDate", + value: endDate + }); } if (startTime) { - setLabel(note.noteId, "startTime", startTime, false, componentId); + attributes.push({ + type: "label", + name: "startTime", + value: startTime + }); } if (endTime) { - setLabel(note.noteId, "endTime", endTime, false, componentId); + attributes.push({ + type: "label", + name: "endTime", + value: endTime + }); } + + // Create the note. + await server.post(`notes/${parentNote.noteId}/children?target=into`, { + title, + content: "", + type: "text", + attributes + }, componentId); } export async function changeEvent(note: FNote, { startDate, endDate, startTime, endTime }: ChangeEventOpts) { diff --git a/apps/server/src/services/note-interface.ts b/apps/server/src/services/note-interface.ts index 5ebaa6dfa7..d7b7c9b4fa 100644 --- a/apps/server/src/services/note-interface.ts +++ b/apps/server/src/services/note-interface.ts @@ -1,4 +1,4 @@ -import type { NoteType } from "@triliumnext/commons"; +import type { AttributeRow, NoteType } from "@triliumnext/commons"; export interface NoteParams { /** optionally can force specific noteId */ @@ -24,4 +24,6 @@ export interface NoteParams { utcDateCreated?: string; ignoreForbiddenParents?: boolean; target?: "into"; + /** Attributes to be set on the note. These are set atomically on note creation, so entity changes are not sent for attributes defined here. */ + attributes?: Omit[]; } diff --git a/apps/server/src/services/notes.ts b/apps/server/src/services/notes.ts index 4964a57976..a54f9e6340 100644 --- a/apps/server/src/services/notes.ts +++ b/apps/server/src/services/notes.ts @@ -1,33 +1,34 @@ -import sql from "./sql.js"; -import optionService from "./options.js"; +import type { AttachmentRow, AttributeRow, BranchRow, NoteRow } from "@triliumnext/commons"; +import { dayjs } from "@triliumnext/commons"; +import fs from "fs"; +import html2plaintext from "html2plaintext"; +import { t } from "i18next"; +import path from "path"; +import url from "url"; + +import becca from "../becca/becca.js"; +import BAttachment from "../becca/entities/battachment.js"; +import BAttribute from "../becca/entities/battribute.js"; +import BBranch from "../becca/entities/bbranch.js"; +import BNote from "../becca/entities/bnote.js"; +import ValidationError from "../errors/validation_error.js"; +import cls from "../services/cls.js"; +import log from "../services/log.js"; +import protectedSessionService from "../services/protected_session.js"; +import { newEntityId, quoteRegex, toMap,unescapeHtml } from "../services/utils.js"; import dateUtils from "./date_utils.js"; import entityChangesService from "./entity_changes.js"; import eventService from "./events.js"; -import cls from "../services/cls.js"; -import protectedSessionService from "../services/protected_session.js"; -import log from "../services/log.js"; -import { newEntityId, unescapeHtml, quoteRegex, toMap } from "../services/utils.js"; -import revisionService from "./revisions.js"; -import request from "./request.js"; -import path from "path"; -import url from "url"; -import becca from "../becca/becca.js"; -import BBranch from "../becca/entities/bbranch.js"; -import BNote from "../becca/entities/bnote.js"; -import BAttribute from "../becca/entities/battribute.js"; -import BAttachment from "../becca/entities/battachment.js"; -import { dayjs } from "@triliumnext/commons"; import htmlSanitizer from "./html_sanitizer.js"; -import ValidationError from "../errors/validation_error.js"; -import noteTypesService from "./note_types.js"; -import fs from "fs"; -import ws from "./ws.js"; -import html2plaintext from "html2plaintext"; -import type { AttachmentRow, AttributeRow, BranchRow, NoteRow } from "@triliumnext/commons"; -import type TaskContext from "./task_context.js"; -import type { NoteParams } from "./note-interface.js"; import imageService from "./image.js"; -import { t } from "i18next"; +import noteTypesService from "./note_types.js"; +import type { NoteParams } from "./note-interface.js"; +import optionService from "./options.js"; +import request from "./request.js"; +import revisionService from "./revisions.js"; +import sql from "./sql.js"; +import type TaskContext from "./task_context.js"; +import ws from "./ws.js"; interface FoundLink { name: "imageLink" | "internalLink" | "includeNoteLink" | "relationMapLink"; @@ -47,14 +48,13 @@ function getNewNotePosition(parentNote: BNote) { .reduce((min, note) => Math.min(min, note?.notePosition || 0), 0); return minNotePos - 10; - } else { - const maxNotePos = parentNote - .getChildBranches() - .filter((branch) => branch?.noteId !== "_hidden") // has "always last" note position - .reduce((max, note) => Math.max(max, note?.notePosition || 0), 0); - - return maxNotePos + 10; } + const maxNotePos = parentNote + .getChildBranches() + .filter((branch) => branch?.noteId !== "_hidden") // has "always last" note position + .reduce((max, note) => Math.max(max, note?.notePosition || 0), 0); + + return maxNotePos + 10; } function triggerNoteTitleChanged(note: BNote) { @@ -88,7 +88,7 @@ function copyChildAttributes(parentNote: BNote, childNote: BNote) { new BAttribute({ noteId: childNote.noteId, type: attr.type, - name: name, + name, value: attr.value, position: attr.position, isInheritable: attr.isInheritable @@ -222,6 +222,14 @@ function createNewNote(params: NoteParams): { utcDateCreated: params.utcDateCreated }).save(); + // Create attributes atomically. + for (const attribute of params.attributes || []) { + new BAttribute({ + ...attribute, + noteId: note.noteId + }).save(); + } + note.setContent(params.content); branch = new BBranch({ @@ -260,7 +268,7 @@ function createNewNote(params: NoteParams): { eventService.emit(eventService.ENTITY_CHANGED, { entityName: "blobs", entity: note }); eventService.emit(eventService.ENTITY_CREATED, { entityName: "branches", entity: branch }); eventService.emit(eventService.ENTITY_CHANGED, { entityName: "branches", entity: branch }); - eventService.emit(eventService.CHILD_NOTE_CREATED, { childNote: note, parentNote: parentNote }); + eventService.emit(eventService.CHILD_NOTE_CREATED, { childNote: note, parentNote }); log.info(`Created new note '${note.noteId}', branch '${branch.branchId}' of type '${note.type}', mime '${note.mime}'`); @@ -308,9 +316,8 @@ function createNewNoteWithTarget(target: "into" | "after" | "before", targetBran entityChangesService.putNoteReorderingEntityChange(params.parentNoteId); return retObject; - } else { - throw new Error(`Unknown target '${target}'`); } + throw new Error(`Unknown target '${target}'`); } function protectNoteRecursively(note: BNote, protect: boolean, includingSubTree: boolean, taskContext: TaskContext<"protectNotes">) { @@ -488,7 +495,7 @@ function findRelationMapLinks(content: string, foundLinks: FoundLink[]) { }); } } catch (e: any) { - log.error("Could not scan for relation map links: " + e.message); + log.error(`Could not scan for relation map links: ${e.message}`); } } @@ -656,8 +663,8 @@ function saveAttachments(note: BNote, content: string) { const attachment = note.saveAttachment({ role: "file", - mime: mime, - title: title, + mime, + title, content: buffer }); @@ -953,7 +960,7 @@ function duplicateSubtree(origNoteId: string, newParentNoteId: string) { const duplicateNoteSuffix = t("notes.duplicate-note-suffix"); if (!res.note.title.endsWith(duplicateNoteSuffix) && !res.note.title.startsWith(duplicateNoteSuffix)) { - res.note.title = t("notes.duplicate-note-title", { noteTitle: res.note.title, duplicateNoteSuffix: duplicateNoteSuffix }); + res.note.title = t("notes.duplicate-note-title", { noteTitle: res.note.title, duplicateNoteSuffix }); } res.note.save(); @@ -1050,13 +1057,12 @@ function duplicateSubtreeInner(origNote: BNote, origBranch: BBranch | null | und note: existingNote, branch: createDuplicatedBranch() }; - } else { - return { - // order here is important, note needs to be created first to not mess up the becca - note: createDuplicatedNote(), - branch: createDuplicatedBranch() - }; } + return { + // order here is important, note needs to be created first to not mess up the becca + note: createDuplicatedNote(), + branch: createDuplicatedBranch() + }; } function getNoteIdMapping(origNote: BNote) { From 17b1f599ff9ade1ce9794b1aa4f0c843724867da Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 12:24:35 +0200 Subject: [PATCH 039/316] feat(calendar): don't trigger refresh on event change --- apps/client/src/services/attributes.ts | 6 +++--- apps/client/src/widgets/collections/calendar/api.ts | 11 ++++++----- .../client/src/widgets/collections/calendar/index.tsx | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/apps/client/src/services/attributes.ts b/apps/client/src/services/attributes.ts index 728ff515c6..2bff933244 100644 --- a/apps/client/src/services/attributes.ts +++ b/apps/client/src/services/attributes.ts @@ -117,15 +117,15 @@ function removeOwnedRelationByName(note: FNote, relationName: string) { * @param name the name of the attribute to set. * @param value the value of the attribute to set. */ -export async function setAttribute(note: FNote, type: "label" | "relation", name: string, value: string | null | undefined) { +export async function setAttribute(note: FNote, type: "label" | "relation", name: string, value: string | null | undefined, componentId?: string) { if (value !== null && value !== undefined) { // Create or update the attribute. - await server.put(`notes/${note.noteId}/set-attribute`, { type, name, value }); + await server.put(`notes/${note.noteId}/set-attribute`, { type, name, value }, componentId); } else { // Remove the attribute if it exists on the server but we don't define a value for it. const attributeId = note.getAttribute(type, name)?.attributeId; if (attributeId) { - await server.remove(`notes/${note.noteId}/attributes/${attributeId}`); + await server.remove(`notes/${note.noteId}/attributes/${attributeId}`, componentId); } } } diff --git a/apps/client/src/widgets/collections/calendar/api.ts b/apps/client/src/widgets/collections/calendar/api.ts index fde9a26501..79df65e4c1 100644 --- a/apps/client/src/widgets/collections/calendar/api.ts +++ b/apps/client/src/widgets/collections/calendar/api.ts @@ -18,6 +18,7 @@ interface ChangeEventOpts { endDate?: string | null; startTime?: string | null; endTime?: string | null; + componentId?: string; } export async function newEvent(parentNote: FNote, { title, startDate, endDate, startTime, endTime, componentId }: NewEventOpts) { @@ -58,7 +59,7 @@ export async function newEvent(parentNote: FNote, { title, startDate, endDate, s }, componentId); } -export async function changeEvent(note: FNote, { startDate, endDate, startTime, endTime }: ChangeEventOpts) { +export async function changeEvent(note: FNote, { startDate, endDate, startTime, endTime, componentId }: ChangeEventOpts) { // Don't store the end date if it's empty. if (endDate === startDate) { endDate = undefined; @@ -70,12 +71,12 @@ export async function changeEvent(note: FNote, { startDate, endDate, startTime, let endAttribute = note.getAttributes("label").filter(attr => attr.name == "calendar:endDate").shift()?.value||"endDate"; const noteId = note.noteId; - setLabel(noteId, startAttribute, startDate); - setAttribute(note, "label", endAttribute, endDate); + setLabel(noteId, startAttribute, startDate, false, componentId); + setAttribute(note, "label", endAttribute, endDate, componentId); startAttribute = note.getAttributes("label").filter(attr => attr.name == "calendar:startTime").shift()?.value||"startTime"; endAttribute = note.getAttributes("label").filter(attr => attr.name == "calendar:endTime").shift()?.value||"endTime"; - setAttribute(note, "label", startAttribute, startTime); - setAttribute(note, "label", endAttribute, endTime); + setAttribute(note, "label", startAttribute, startTime, componentId); + setAttribute(note, "label", endAttribute, endTime, componentId); } diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx index fd7669646e..0f14ee1552 100644 --- a/apps/client/src/widgets/collections/calendar/index.tsx +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -246,8 +246,8 @@ function useEditing(note: FNote, isEditable: boolean, isCalendarRoot: boolean, c const { startTime, endTime } = parseStartEndTimeFromEvent(e.event); const note = await froca.getNote(e.event.extendedProps.noteId); if (!note) return; - changeEvent(note, { startDate, endDate, startTime, endTime }); - }, []); + changeEvent(note, { startDate, endDate, startTime, endTime, componentId }); + }, [ componentId ]); // Called upon when clicking the day number in the calendar, opens or creates the day note but only if in a calendar root. const onDateClick = useCallback(async (e: DateClickArg) => { From d7409bec494f72295abf9abfae0ae4da35f0c258 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 12:35:08 +0200 Subject: [PATCH 040/316] feat(calendar): don't trigger refresh on rename --- .../collections/calendar/event_builder.ts | 16 +++++++++------- .../src/widgets/collections/calendar/index.tsx | 17 ++++++++++++++--- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/apps/client/src/widgets/collections/calendar/event_builder.ts b/apps/client/src/widgets/collections/calendar/event_builder.ts index b2665b7883..f4611ccd7e 100644 --- a/apps/client/src/widgets/collections/calendar/event_builder.ts +++ b/apps/client/src/widgets/collections/calendar/event_builder.ts @@ -1,10 +1,11 @@ import { EventInput, EventSourceFuncArg, EventSourceInput } from "@fullcalendar/core/index.js"; -import froca from "../../../services/froca"; -import { formatDateToLocalISO, getCustomisableLabel, getMonthsInDateRange, offsetDate } from "./utils"; -import FNote from "../../../entities/fnote"; -import server from "../../../services/server"; import clsx from "clsx"; +import FNote from "../../../entities/fnote"; +import froca from "../../../services/froca"; +import server from "../../../services/server"; +import { formatDateToLocalISO, getCustomisableLabel, getMonthsInDateRange, offsetDate } from "./utils"; + interface Event { startDate: string, endDate?: string | null, @@ -105,7 +106,8 @@ export async function buildEvent(note: FNote, { startDate, endDate, startTime, e endDate = (endTime ? `${endDate}T${endTime}:00` : endDate); const eventData: EventInput = { - title: title, + id: note.noteId, + title, start: startDate, url: `#${note.noteId}?popup`, noteId: note.noteId, @@ -148,12 +150,12 @@ async function parseCustomTitle(customTitlettributeName: string | null, note: FN } async function buildDisplayedAttributes(note: FNote, calendarDisplayedAttributes: string[]) { - const filteredDisplayedAttributes = note.getAttributes().filter((attr): boolean => calendarDisplayedAttributes.includes(attr.name)) + const filteredDisplayedAttributes = note.getAttributes().filter((attr): boolean => calendarDisplayedAttributes.includes(attr.name)); const result: Array<[string, string]> = []; for (const attribute of filteredDisplayedAttributes) { if (attribute.type === "label") result.push([attribute.name, attribute.value]); - else result.push([attribute.name, (await attribute.getTargetNote())?.title || ""]) + else result.push([attribute.name, (await attribute.getTargetNote())?.title || ""]); } return result; diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx index 0f14ee1552..7eb201b0c1 100644 --- a/apps/client/src/widgets/collections/calendar/index.tsx +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -119,14 +119,25 @@ export default function CalendarView({ note, noteIds }: ViewModeProps { - if (loadResults.getNoteIds().some(noteId => noteIds.includes(noteId)) // note title change. - || loadResults.getAttributeRows(parentComponent?.componentId).some((a) => noteIds.includes(a.noteId ?? ""))) // subnote change. - { + const api = calendarRef.current; + if (!api) return; + + // Subnote attribute change. + if (loadResults.getAttributeRows(parentComponent?.componentId).some((a) => noteIds.includes(a.noteId ?? ""))) { // Defer execution after the load results are processed so that the event builder has the updated data to work with. setTimeout(() => { console.log("Refresh"); calendarRef.current?.refetchEvents(); }, 0); + return; // early return since we'll refresh the events anyway + } + + // Title change. + for (const noteId of loadResults.getNoteIds().filter(noteId => noteIds.includes(noteId))) { + const event = api.getEventById(noteId); + const note = froca.getNoteFromCache(noteId); + if (!event || !note) continue; + event.setProp("title", note.title); } }); From e51cea88bf593d779a2e261afda02b84c4ebc413 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 12:47:02 +0200 Subject: [PATCH 041/316] feat(calendar): don't trigger refresh on delete --- apps/client/src/services/branches.ts | 6 +++--- .../src/widgets/collections/calendar/context_menu.ts | 12 ++++++------ .../src/widgets/collections/calendar/index.tsx | 7 +++---- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/apps/client/src/services/branches.ts b/apps/client/src/services/branches.ts index cd1f5c6e70..8f31060242 100644 --- a/apps/client/src/services/branches.ts +++ b/apps/client/src/services/branches.ts @@ -103,7 +103,7 @@ async function moveToParentNote(branchIdsToMove: string[], newParentBranchId: st * @param moveToParent whether to automatically go to the parent note path after a succesful delete. Usually makes sense if deleting the active note(s). * @returns promise that returns false if the operation was cancelled or there was nothing to delete, true if the operation succeeded. */ -async function deleteNotes(branchIdsToDelete: string[], forceDeleteAllClones = false, moveToParent = true) { +async function deleteNotes(branchIdsToDelete: string[], forceDeleteAllClones = false, moveToParent = true, componentId?: string) { branchIdsToDelete = filterRootNote(branchIdsToDelete); if (branchIdsToDelete.length === 0) { @@ -139,9 +139,9 @@ async function deleteNotes(branchIdsToDelete: string[], forceDeleteAllClones = f const branch = froca.getBranch(branchIdToDelete); if (deleteAllClones && branch) { - await server.remove(`notes/${branch.noteId}${query}`); + await server.remove(`notes/${branch.noteId}${query}`, componentId); } else { - await server.remove(`branches/${branchIdToDelete}${query}`); + await server.remove(`branches/${branchIdToDelete}${query}`, componentId); } } diff --git a/apps/client/src/widgets/collections/calendar/context_menu.ts b/apps/client/src/widgets/collections/calendar/context_menu.ts index 5b157567ed..8c3511c363 100644 --- a/apps/client/src/widgets/collections/calendar/context_menu.ts +++ b/apps/client/src/widgets/collections/calendar/context_menu.ts @@ -1,12 +1,12 @@ -import NoteColorPicker from "../../../menus/custom-items/NoteColorPicker"; import FNote from "../../../entities/fnote"; import contextMenu, { ContextMenuEvent } from "../../../menus/context_menu"; +import { getArchiveMenuItem } from "../../../menus/context_menu_utils"; +import NoteColorPicker from "../../../menus/custom-items/NoteColorPicker"; import link_context_menu from "../../../menus/link_context_menu"; import branches from "../../../services/branches"; -import { getArchiveMenuItem } from "../../../menus/context_menu_utils"; import { t } from "../../../services/i18n"; -export function openCalendarContextMenu(e: ContextMenuEvent, note: FNote, parentNote: FNote) { +export function openCalendarContextMenu(e: ContextMenuEvent, note: FNote, parentNote: FNote, componentId?: string) { e.preventDefault(); e.stopPropagation(); @@ -30,16 +30,16 @@ export function openCalendarContextMenu(e: ContextMenuEvent, note: FNote, parent } if (branchIdToDelete) { - await branches.deleteNotes([ branchIdToDelete ], false, false); + await branches.deleteNotes([ branchIdToDelete ], false, false, componentId); } } }, { kind: "separator" }, { kind: "custom", - componentFn: () => NoteColorPicker({note: note}) + componentFn: () => NoteColorPicker({note}) } ], selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, e, note.noteId), - }) + }); } diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx index 7eb201b0c1..0bfaaf5b5b 100644 --- a/apps/client/src/widgets/collections/calendar/index.tsx +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -114,7 +114,7 @@ export default function CalendarView({ note, noteIds }: ViewModeProps noteIds.includes(a.noteId ?? ""))) { // Defer execution after the load results are processed so that the event builder has the updated data to work with. setTimeout(() => { - console.log("Refresh"); calendarRef.current?.refetchEvents(); }, 0); return; // early return since we'll refresh the events anyway @@ -277,7 +276,7 @@ function useEditing(note: FNote, isEditable: boolean, isCalendarRoot: boolean, c }; } -function useEventDisplayCustomization(parentNote: FNote) { +function useEventDisplayCustomization(parentNote: FNote, componentId: string | undefined) { const eventDidMount = useCallback((e: EventMountArg) => { const { iconClass, promotedAttributes } = e.event.extendedProps; @@ -334,7 +333,7 @@ function useEventDisplayCustomization(parentNote: FNote) { const note = await froca.getNote(e.event.extendedProps.noteId); if (!note) return; - openCalendarContextMenu(contextMenuEvent, note, parentNote); + openCalendarContextMenu(contextMenuEvent, note, parentNote, componentId); } if (isMobile()) { From 78c62be823143b88ce99b05c6af90a6768d61757 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 14:57:33 +0200 Subject: [PATCH 042/316] test(client): fix broken tests after change in attributes --- apps/client/src/services/attributes.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/client/src/services/attributes.spec.ts b/apps/client/src/services/attributes.spec.ts index 724f53a36a..7a949eebc6 100644 --- a/apps/client/src/services/attributes.spec.ts +++ b/apps/client/src/services/attributes.spec.ts @@ -42,7 +42,7 @@ describe("Set boolean with inheritance", () => { name: "foo", value: "", isInheritable: false - }); + }, undefined); }); it("removes boolean normally without inheritance", async () => { @@ -91,7 +91,7 @@ describe("Set boolean with inheritance", () => { name: "foo", value: "false", isInheritable: false - }); + }, undefined); }); it("overrides boolean with inherited false", async () => { @@ -112,7 +112,7 @@ describe("Set boolean with inheritance", () => { name: "foo", value: "", isInheritable: false - }); + }, undefined); }); it("deletes override boolean with inherited false with already existing value", async () => { @@ -134,6 +134,6 @@ describe("Set boolean with inheritance", () => { name: "foo", value: "", isInheritable: false - }); + }, undefined); }); }); From e3fdae8932d7ed18cbc69873bff91b166b56f9cc Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 15:02:33 +0200 Subject: [PATCH 043/316] chore: address requested changes --- apps/client/src/widgets/collections/calendar/index.tsx | 4 +--- apps/server/src/services/notes.ts | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx index 0bfaaf5b5b..d9195a3c5e 100644 --- a/apps/client/src/widgets/collections/calendar/index.tsx +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -125,9 +125,7 @@ export default function CalendarView({ note, noteIds }: ViewModeProps noteIds.includes(a.noteId ?? ""))) { // Defer execution after the load results are processed so that the event builder has the updated data to work with. - setTimeout(() => { - calendarRef.current?.refetchEvents(); - }, 0); + setTimeout(() => api.refetchEvents(), 0); return; // early return since we'll refresh the events anyway } diff --git a/apps/server/src/services/notes.ts b/apps/server/src/services/notes.ts index a54f9e6340..f4eb40579a 100644 --- a/apps/server/src/services/notes.ts +++ b/apps/server/src/services/notes.ts @@ -1,5 +1,4 @@ -import type { AttachmentRow, AttributeRow, BranchRow, NoteRow } from "@triliumnext/commons"; -import { dayjs } from "@triliumnext/commons"; +import { type AttachmentRow, type AttributeRow, type BranchRow, dayjs, type NoteRow } from "@triliumnext/commons"; import fs from "fs"; import html2plaintext from "html2plaintext"; import { t } from "i18next"; @@ -15,7 +14,7 @@ import ValidationError from "../errors/validation_error.js"; import cls from "../services/cls.js"; import log from "../services/log.js"; import protectedSessionService from "../services/protected_session.js"; -import { newEntityId, quoteRegex, toMap,unescapeHtml } from "../services/utils.js"; +import { newEntityId, quoteRegex, toMap, unescapeHtml } from "../services/utils.js"; import dateUtils from "./date_utils.js"; import entityChangesService from "./entity_changes.js"; import eventService from "./events.js"; From 44142e980d909af3d8c1672c92a073df9fc8d69e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 17:17:41 +0200 Subject: [PATCH 044/316] fix(quick_edit): not working when content is centered (closes #8371) --- apps/client/src/widgets/dialogs/PopupEditor.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/dialogs/PopupEditor.css b/apps/client/src/widgets/dialogs/PopupEditor.css index 68172e6290..197ed94065 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.css +++ b/apps/client/src/widgets/dialogs/PopupEditor.css @@ -82,6 +82,10 @@ body.mobile .modal.popup-editor-dialog .modal-dialog { align-items: flex-start; } +.modal.popup-editor-dialog .note-detail { + width: 100%; +} + .modal.popup-editor-dialog .note-detail.full-height { flex-grow: 0; height: 100%; @@ -106,4 +110,4 @@ body.mobile .modal.popup-editor-dialog .modal-dialog { margin: 0; border-radius: 0; } -} \ No newline at end of file +} From a51a831fe80d9271e62f045a41a53ec8be9da4bf Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 17:56:04 +0200 Subject: [PATCH 045/316] fix(canvas): background color not saved (closes #8325) --- .../type_widgets/canvas/persistence.ts | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas/persistence.ts b/apps/client/src/widgets/type_widgets/canvas/persistence.ts index 28c10e7523..e4714e7146 100644 --- a/apps/client/src/widgets/type_widgets/canvas/persistence.ts +++ b/apps/client/src/widgets/type_widgets/canvas/persistence.ts @@ -20,6 +20,9 @@ export interface CanvasContent { appState: Partial; } +/** Subset of the app state that should be persisted whenever they change. This explicitly excludes transient state like the current selection or zoom level. */ +type ImportantAppState = Pick; + export default function useCanvasPersistence(note: FNote, noteContext: NoteContext | null | undefined, apiRef: RefObject, theme: AppState["theme"], isReadOnly: boolean): Partial { const libraryChanged = useRef(false); @@ -37,6 +40,8 @@ export default function useCanvasPersistence(note: FNote, noteContext: NoteConte const libraryCache = useRef([]); const attachmentMetadata = useRef([]); + const appStateToCompare = useRef>({}); + const spacedUpdate = useEditorSpacedUpdate({ note, noteContext, @@ -78,7 +83,7 @@ export default function useCanvasPersistence(note: FNote, noteContext: NoteConte async getData() { const api = apiRef.current; if (!api) return; - const { content, svg } = await getData(api); + const { content, svg } = await getData(api, appStateToCompare); const attachments: SavedData["attachments"] = [{ role: "image", title: "canvas-export.svg", mime: "image/svg+xml", content: svg, position: 0 }]; // libraryChanged is unset in dataSaved() @@ -149,7 +154,21 @@ export default function useCanvasPersistence(note: FNote, noteContext: NoteConte const oldSceneVersion = currentSceneVersion.current; const newSceneVersion = getSceneVersion(apiRef.current.getSceneElements()); - if (newSceneVersion !== oldSceneVersion) { + let hasChanges = (newSceneVersion !== oldSceneVersion); + + // There are cases where the scene version does not change, but appState did. + if (!hasChanges) { + const importantAppState = appStateToCompare.current; + const currentAppState = apiRef.current.getAppState(); + for (const key in importantAppState) { + if (importantAppState[key as keyof ImportantAppState] !== currentAppState[key as keyof ImportantAppState]) { + hasChanges = true; + break; + } + } + } + + if (hasChanges) { spacedUpdate.resetUpdateTimer(); spacedUpdate.scheduleUpdate(); currentSceneVersion.current = newSceneVersion; @@ -163,7 +182,7 @@ export default function useCanvasPersistence(note: FNote, noteContext: NoteConte }; } -async function getData(api: ExcalidrawImperativeAPI) { +async function getData(api: ExcalidrawImperativeAPI, appStateToCompare: RefObject>) { const elements = api.getSceneElements(); const appState = api.getAppState(); @@ -188,6 +207,12 @@ async function getData(api: ExcalidrawImperativeAPI) { } }); + const importantAppState: ImportantAppState = { + gridModeEnabled: appState.gridModeEnabled, + viewBackgroundColor: appState.viewBackgroundColor + }; + appStateToCompare.current = importantAppState; + const content = { type: "excalidraw", version: 2, @@ -197,7 +222,7 @@ async function getData(api: ExcalidrawImperativeAPI) { scrollX: appState.scrollX, scrollY: appState.scrollY, zoom: appState.zoom, - gridModeEnabled: appState.gridModeEnabled + ...importantAppState } }; From dba985b308ade6e1981f49719e95cd117fe65e8e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 18:07:11 +0200 Subject: [PATCH 046/316] fix(canvas): saving on start due to mismatch in version number --- apps/client/src/widgets/type_widgets/canvas/persistence.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/type_widgets/canvas/persistence.ts b/apps/client/src/widgets/type_widgets/canvas/persistence.ts index e4714e7146..545a3d8564 100644 --- a/apps/client/src/widgets/type_widgets/canvas/persistence.ts +++ b/apps/client/src/widgets/type_widgets/canvas/persistence.ts @@ -52,7 +52,6 @@ export default function useCanvasPersistence(note: FNote, noteContext: NoteConte libraryCache.current = []; attachmentMetadata.current = []; - currentSceneVersion.current = -1; // load saved content into excalidraw canvas let content: CanvasContent = { @@ -70,6 +69,9 @@ export default function useCanvasPersistence(note: FNote, noteContext: NoteConte loadData(api, content, theme); + // Initialize tracking state after loading to prevent redundant updates from initial onChange events + currentSceneVersion.current = getSceneVersion(api.getSceneElements()); + // load the library state loadLibrary(note).then(({ libraryItems, metadata }) => { // Update the library and save to independent variables From c48bd9a5c35705ffbab992c6413dd84dcfcda882 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 23 Jan 2026 18:12:11 +0200 Subject: [PATCH 047/316] fix(canvas): saving on start due to library change --- .../type_widgets/canvas/persistence.ts | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas/persistence.ts b/apps/client/src/widgets/type_widgets/canvas/persistence.ts index 545a3d8564..4b31d826b6 100644 --- a/apps/client/src/widgets/type_widgets/canvas/persistence.ts +++ b/apps/client/src/widgets/type_widgets/canvas/persistence.ts @@ -176,10 +176,22 @@ export default function useCanvasPersistence(note: FNote, noteContext: NoteConte currentSceneVersion.current = newSceneVersion; } }, - onLibraryChange: () => { - libraryChanged.current = true; - spacedUpdate.resetUpdateTimer(); - spacedUpdate.scheduleUpdate(); + onLibraryChange: (libraryItems) => { + if (!apiRef.current || isReadOnly) return; + + // Check if library actually changed by comparing with cached state + const hasChanges = + libraryItems.length !== libraryCache.current.length || + libraryItems.some(item => { + const cachedItem = libraryCache.current.find(cached => cached.id === item.id); + return !cachedItem || cachedItem.name !== item.name; + }); + + if (hasChanges) { + libraryChanged.current = true; + spacedUpdate.resetUpdateTimer(); + spacedUpdate.scheduleUpdate(); + } } }; } From 8611d4a67a4858b5e6db5230ab11ae4b3679b4c7 Mon Sep 17 00:00:00 2001 From: Wael Nasreddine Date: Thu, 22 Jan 2026 19:15:16 -0800 Subject: [PATCH 048/316] fix: update nixpkgs to grab elector v40 --- flake.lock | 11 +++++------ flake.nix | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/flake.lock b/flake.lock index 9603cb3c6d..056cc08655 100644 --- a/flake.lock +++ b/flake.lock @@ -20,16 +20,15 @@ }, "nixpkgs": { "locked": { - "lastModified": 1765701828, - "narHash": "sha256-bUqeCi+mdqXt6Ag0n+9QAqyvFiQPZdSCzTI70Nn3HhA=", - "owner": "nixos", + "lastModified": 1769184885, + "narHash": "sha256-wVX5Cqpz66SINNsmt3Bv/Ijzzfl8EPUISq5rKK129K0=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "62996354316ef041b26c36e998a9ef193ede2864", + "rev": "12689597ba7a6d776c3c979f393896be095269d4", "type": "github" }, "original": { - "owner": "nixos", - "ref": "master", + "owner": "NixOS", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 2434a8d5db..23a7a38cf4 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,7 @@ description = "Trilium Notes (experimental flake)"; inputs = { - nixpkgs.url = "github:nixos/nixpkgs/master"; + nixpkgs.url = "github:NixOS/nixpkgs"; flake-utils.url = "github:numtide/flake-utils"; pnpm2nix = { url = "github:FliegendeWurst/pnpm2nix-nzbr"; From 1520c696a3cb1e38c58676ad2d1692c03274f8c2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 24 Jan 2026 01:39:45 +0000 Subject: [PATCH 049/316] chore(deps): update dependency cheerio to v1.2.0 --- apps/server/package.json | 2 +- pnpm-lock.yaml | 68 ++++++++++++++++++++-------------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index 5edc905be4..e44311d48b 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -74,7 +74,7 @@ "bindings": "1.5.0", "bootstrap": "5.3.8", "chardet": "2.1.1", - "cheerio": "1.1.2", + "cheerio": "1.2.0", "chokidar": "5.0.0", "cls-hooked": "4.2.2", "compression": "1.8.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f92cdc4907..b66963f228 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -637,8 +637,8 @@ importers: specifier: 2.1.1 version: 2.1.1 cheerio: - specifier: 1.1.2 - version: 1.1.2 + specifier: 1.2.0 + version: 1.2.0 chokidar: specifier: 5.0.0 version: 5.0.0 @@ -6650,8 +6650,8 @@ packages: resolution: {integrity: sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==} engines: {node: '>= 6'} - cheerio@1.1.2: - resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} + cheerio@1.2.0: + resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} engines: {node: '>=20.18.1'} chevrotain-allstar@0.3.1: @@ -7146,10 +7146,6 @@ packages: css-value@0.0.1: resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} - css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - css-what@6.2.2: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} @@ -7868,6 +7864,10 @@ packages: resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -8931,6 +8931,9 @@ packages: htmlparser2@10.0.0: resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -13623,8 +13626,8 @@ packages: resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} engines: {node: '>=18.17'} - undici@7.12.0: - resolution: {integrity: sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==} + undici@7.19.0: + resolution: {integrity: sha512-Heho1hJD81YChi+uS2RkSjcVO+EQLmLSyUlHyp7Y/wFbxQaGb4WXVKD073JytrjXJVkSZVzoE2MCSOKugFGtOQ==} engines: {node: '>=20.18.1'} unescape@1.0.1: @@ -15099,8 +15102,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-upload': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-ai@47.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: @@ -15247,8 +15248,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15314,8 +15313,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -15441,8 +15438,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -15470,6 +15465,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.4.0': dependencies: @@ -15492,6 +15489,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -15517,8 +15516,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-essentials@47.4.0': dependencies: @@ -15676,6 +15673,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -15977,8 +15976,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -16065,8 +16062,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-special-characters@47.4.0': dependencies: @@ -16178,8 +16173,6 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.4.0 '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-upload@47.4.0': dependencies: @@ -21682,7 +21675,7 @@ snapshots: dependencies: boolbase: 1.0.0 css-select: 5.2.2 - css-what: 6.1.0 + css-what: 6.2.2 domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 @@ -21697,18 +21690,18 @@ snapshots: parse5-htmlparser2-tree-adapter: 6.0.1 tslib: 2.8.1 - cheerio@1.1.2: + cheerio@1.2.0: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 domutils: 3.2.2 encoding-sniffer: 0.2.1 - htmlparser2: 10.0.0 + htmlparser2: 10.1.0 parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.12.0 + undici: 7.19.0 whatwg-mimetype: 4.0.0 chevrotain-allstar@0.3.1(chevrotain@11.0.3): @@ -22313,8 +22306,6 @@ snapshots: css-value@0.0.1: {} - css-what@6.1.0: {} - css-what@6.2.2: {} cssesc@3.0.0: {} @@ -23166,6 +23157,8 @@ snapshots: entities@6.0.0: {} + entities@7.0.1: {} + env-paths@2.2.1: {} environment@1.1.0: {} @@ -24732,6 +24725,13 @@ snapshots: domutils: 3.2.2 entities: 6.0.0 + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -30289,7 +30289,7 @@ snapshots: undici@6.21.3: {} - undici@7.12.0: {} + undici@7.19.0: {} unescape@1.0.1: dependencies: @@ -30713,7 +30713,7 @@ snapshots: '@wdio/utils': 9.23.2 archiver: 7.0.1 aria-query: 5.3.2 - cheerio: 1.1.2 + cheerio: 1.2.0 css-shorthand-properties: 1.1.2 css-value: 0.0.1 grapheme-splitter: 1.0.4 From cd7daee7719eaaacf034778a7e4e96e8301c78c7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 24 Jan 2026 06:31:00 +0000 Subject: [PATCH 050/316] chore(deps): update dependency @redocly/cli to v2.14.9 --- apps/build-docs/package.json | 2 +- pnpm-lock.yaml | 52 +++++++++++++++++++++++++----------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/apps/build-docs/package.json b/apps/build-docs/package.json index 30b15663a6..126a4feac9 100644 --- a/apps/build-docs/package.json +++ b/apps/build-docs/package.json @@ -11,7 +11,7 @@ "license": "AGPL-3.0-only", "packageManager": "pnpm@10.28.1", "devDependencies": { - "@redocly/cli": "2.14.7", + "@redocly/cli": "2.14.9", "archiver": "7.0.1", "fs-extra": "11.3.3", "react": "19.2.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b66963f228..fdc078d354 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -140,8 +140,8 @@ importers: apps/build-docs: devDependencies: '@redocly/cli': - specifier: 2.14.7 - version: 2.14.7(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5) + specifier: 2.14.9 + version: 2.14.9(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5) archiver: specifier: 7.0.1 version: 7.0.1 @@ -4400,8 +4400,8 @@ packages: '@redocly/ajv@8.17.2': resolution: {integrity: sha512-rcbDZOfXAgGEJeJ30aWCVVJvxV9ooevb/m1/SFblO2qHs4cqTk178gx7T/vdslf57EA4lTofrwsq5K8rxK9g+g==} - '@redocly/cli@2.14.7': - resolution: {integrity: sha512-EO1sXTaFgk95/BLQ1rThCMbiWgJomm7nnKitysQxX6iv4Ie2FipIRus1oF0z0a6ADqPtyGBJQQUIoqCG1KJAuw==} + '@redocly/cli@2.14.9': + resolution: {integrity: sha512-eueSFzydep5jwOHxlYW6rFOSRP1b5vY7gVOzQBd2/I6XQJnG31hgrDACqx/heD4vv3hhdpoumopz24erxLe0zQ==} engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} hasBin: true @@ -4415,12 +4415,12 @@ packages: resolution: {integrity: sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==} engines: {node: '>=18.17.0', npm: '>=9.5.0'} - '@redocly/openapi-core@2.14.7': - resolution: {integrity: sha512-urtiy9H09gecAqpHa5dRG739UBMFrpEZ8zG29FB4LKJNIfhQRSR+8XWzoXSTuGL5zRBSzJx6WvpOCwT6GMKXcg==} + '@redocly/openapi-core@2.14.9': + resolution: {integrity: sha512-PIWVxm7Os3U276XMhLIh+qftaA6TxVwOuoyDaobGSkd609fp25tp57G2k/uzzKjrhUD4g2QzeJ4lfCoaBgEjhg==} engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} - '@redocly/respect-core@2.14.7': - resolution: {integrity: sha512-nNLqrYnVo8Mpd0+CmKbDaUG1xd0PcrRj/NNgIuR7tcjPQGkdassKB2kFTOq9E9JkHWUdfqawRjT3PPrn/y4kaA==} + '@redocly/respect-core@2.14.9': + resolution: {integrity: sha512-kP3rylB04NZV52IoEa1t8ObkSxpRZy3zpkRAxYOiLtggRETOnLdcDbYep4ipbk6t0suZamznOLOgiAeBYHo/ig==} engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} '@replit/codemirror-indentation-markers@6.5.3': @@ -13626,6 +13626,10 @@ packages: resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} engines: {node: '>=18.17'} + undici@6.23.0: + resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} + engines: {node: '>=18.17'} + undici@7.19.0: resolution: {integrity: sha512-Heho1hJD81YChi+uS2RkSjcVO+EQLmLSyUlHyp7Y/wFbxQaGb4WXVKD073JytrjXJVkSZVzoE2MCSOKugFGtOQ==} engines: {node: '>=20.18.1'} @@ -15248,6 +15252,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15313,6 +15319,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -15438,6 +15446,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -15447,6 +15457,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -15647,6 +15659,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-html-embed@47.4.0': dependencies: @@ -15976,6 +15990,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -16062,6 +16078,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-special-characters@47.4.0': dependencies: @@ -18893,14 +18911,14 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - '@redocly/cli@2.14.7(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5)': + '@redocly/cli@2.14.9(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5)': dependencies: '@opentelemetry/exporter-trace-otlp-http': 0.202.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.34.0 - '@redocly/openapi-core': 2.14.7 - '@redocly/respect-core': 2.14.7 + '@redocly/openapi-core': 2.14.9 + '@redocly/respect-core': 2.14.9 abort-controller: 3.0.0 ajv: '@redocly/ajv@8.17.1' ajv-formats: 3.0.1(@redocly/ajv@8.17.1) @@ -18921,7 +18939,7 @@ snapshots: simple-websocket: 9.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) styled-components: 6.1.19(react-dom@19.2.3(react@19.2.3))(react@19.2.3) ulid: 3.0.2 - undici: 6.21.3 + undici: 6.23.0 yargs: 17.0.1 transitivePeerDependencies: - '@opentelemetry/api' @@ -18940,7 +18958,7 @@ snapshots: '@redocly/openapi-core@1.34.5': dependencies: - '@redocly/ajv': 8.17.1 + '@redocly/ajv': 8.17.2 '@redocly/config': 0.22.2 colorette: 1.4.0 https-proxy-agent: 7.0.6 @@ -18952,7 +18970,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@redocly/openapi-core@2.14.7': + '@redocly/openapi-core@2.14.9': dependencies: '@redocly/ajv': 8.17.2 '@redocly/config': 0.41.2 @@ -18965,12 +18983,12 @@ snapshots: pluralize: 8.0.0 yaml-ast-parser: 0.0.43 - '@redocly/respect-core@2.14.7': + '@redocly/respect-core@2.14.9': dependencies: '@faker-js/faker': 7.6.0 '@noble/hashes': 1.8.0 '@redocly/ajv': 8.17.1 - '@redocly/openapi-core': 2.14.7 + '@redocly/openapi-core': 2.14.9 ajv: '@redocly/ajv@8.17.1' better-ajv-errors: 1.2.0(@redocly/ajv@8.17.1) colorette: 2.0.20 @@ -30289,6 +30307,8 @@ snapshots: undici@6.21.3: {} + undici@6.23.0: {} + undici@7.19.0: {} unescape@1.0.1: From 430ef62a2dcc1d03e9b257225e4cf6d189f719bd Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 09:24:35 +0200 Subject: [PATCH 051/316] feat(notes): add default icon for GIF --- packages/commons/src/lib/notes.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/commons/src/lib/notes.ts b/packages/commons/src/lib/notes.ts index 6be531b5eb..e9fe892d1e 100644 --- a/packages/commons/src/lib/notes.ts +++ b/packages/commons/src/lib/notes.ts @@ -28,6 +28,10 @@ const FILE_MIME_MAPPINGS = { "application/pdf": "bx bxs-file-pdf", }; +const IMAGE_MIME_MAPPINGS = { + "image/gif": "bx bxs-file-gif", +}; + export function getNoteIcon({ noteId, type, mime, iconClass, workspaceIconClass, isFolder }: { noteId: string; type: NoteType; @@ -55,6 +59,9 @@ export function getNoteIcon({ noteId, type, mime, iconClass, workspaceIconClass, return correspondingMimeType?.icon ?? NOTE_TYPE_ICONS.code; } else if (type === "file") { return FILE_MIME_MAPPINGS[mime] ?? NOTE_TYPE_ICONS.file; + } else if (type === "image") { + return IMAGE_MIME_MAPPINGS[mime] ?? NOTE_TYPE_ICONS.image; } + return NOTE_TYPE_ICONS[type]; } From 1b0a53a441c4f5eac51c4130d1e43f36c73b9605 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 09:29:11 +0200 Subject: [PATCH 052/316] feat(notes): add default icon for doc files --- packages/commons/src/lib/notes.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/commons/src/lib/notes.ts b/packages/commons/src/lib/notes.ts index e9fe892d1e..15b9c8e41b 100644 --- a/packages/commons/src/lib/notes.ts +++ b/packages/commons/src/lib/notes.ts @@ -26,6 +26,8 @@ export const NOTE_TYPE_ICONS = { const FILE_MIME_MAPPINGS = { "application/pdf": "bx bxs-file-pdf", + "application/vnd.oasis.opendocument.text": "bx bxs-file-doc", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "bx bxs-file-doc", }; const IMAGE_MIME_MAPPINGS = { From 6ae1cc18e20fe35643281f5f6493562598647167 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 09:37:03 +0200 Subject: [PATCH 053/316] chore(web-clipper): remove IDEA file --- apps/web-clipper/trilium-web-clipper.iml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 apps/web-clipper/trilium-web-clipper.iml diff --git a/apps/web-clipper/trilium-web-clipper.iml b/apps/web-clipper/trilium-web-clipper.iml deleted file mode 100644 index c3e779f973..0000000000 --- a/apps/web-clipper/trilium-web-clipper.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file From 5113e2ab975508369ed6816bb3c0d6e44c191081 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 09:42:02 +0200 Subject: [PATCH 054/316] chore(web-clipper): create package JSON --- apps/web-clipper/package.json | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 apps/web-clipper/package.json diff --git a/apps/web-clipper/package.json b/apps/web-clipper/package.json new file mode 100644 index 0000000000..86fe91e973 --- /dev/null +++ b/apps/web-clipper/package.json @@ -0,0 +1,11 @@ +{ + "name": "@triliumnext/web-clipper", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "packageManager": "pnpm@10.28.1" +} From f8e5f31970a0a32fab71a325a303c22758d8c602 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 09:45:05 +0200 Subject: [PATCH 055/316] chore(web-clipper): install WXT --- apps/web-clipper/.wxt/tsconfig.json | 1 + apps/web-clipper/package.json | 13 +- pnpm-lock.yaml | 1346 +++++++++++++++++++++++++-- 3 files changed, 1299 insertions(+), 61 deletions(-) create mode 100644 apps/web-clipper/.wxt/tsconfig.json diff --git a/apps/web-clipper/.wxt/tsconfig.json b/apps/web-clipper/.wxt/tsconfig.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/apps/web-clipper/.wxt/tsconfig.json @@ -0,0 +1 @@ +{} diff --git a/apps/web-clipper/package.json b/apps/web-clipper/package.json index 86fe91e973..e7ebd634a9 100644 --- a/apps/web-clipper/package.json +++ b/apps/web-clipper/package.json @@ -4,8 +4,17 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "dev": "wxt", + "dev:firefox": "wxt -b firefox", + "build": "wxt build", + "build:firefox": "wxt build -b firefox", + "zip": "wxt zip", + "zip:firefox": "wxt zip -b firefox", + "postinstall": "wxt prepare" }, "keywords": [], - "packageManager": "pnpm@10.28.1" + "packageManager": "pnpm@10.28.1", + "devDependencies": { + "wxt": "0.20.13" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b66963f228..cddc67cb8d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -817,6 +817,12 @@ importers: specifier: 17.2.3 version: 17.2.3 + apps/web-clipper: + devDependencies: + wxt: + specifier: 0.20.13 + version: 0.20.13(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + apps/website: dependencies: i18next: @@ -1461,9 +1467,22 @@ importers: packages: + '@1natsu/wait-element@4.1.2': + resolution: {integrity: sha512-qWxSJD+Q5b8bKOvESFifvfZ92DuMsY+03SBNjTO34ipJLP6mZ9yK4bQz/vlh48aEQXoJfaZBqUwKL5BdI5iiWw==} + '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + '@aklinker1/rollup-plugin-visualizer@5.12.0': + resolution: {integrity: sha512-X24LvEGw6UFmy0lpGJDmXsMyBD58XmX1bbwsaMLhNoM+UMQfQ3b2RtC+nz4b/NoRK5r6QJSKJHBNVeUdwqybaQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rollup: + optional: true + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -1724,6 +1743,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.28.2': + resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.4': resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} @@ -2240,6 +2263,19 @@ packages: peerDependencies: postcss-selector-parser: ^7.1.1 + '@devicefarmer/adbkit-logcat@2.1.3': + resolution: {integrity: sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw==} + engines: {node: '>= 4'} + + '@devicefarmer/adbkit-monkey@1.2.1': + resolution: {integrity: sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg==} + engines: {node: '>= 0.10.4'} + + '@devicefarmer/adbkit@3.3.8': + resolution: {integrity: sha512-7rBLLzWQnBwutH2WZ0EWUkQdihqrnLYCUMaB44hSol9e0/cdIhuNFcqZO0xNheAU6qqHVA8sMiLofkYTgb+lmw==} + engines: {node: '>= 0.10.4'} + hasBin: true + '@digitak/esrun@3.2.26': resolution: {integrity: sha512-mL0bw7NhKVghp7mVsPwnAMhCn4NGAsk0KKFmAfnrYAZ/QCXR5xLXIYP82zLMjcsQag8DD6i1c+Yrm/57StYVzg==} engines: {node: '>=14.0'} @@ -3480,6 +3516,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -4031,6 +4070,18 @@ packages: engines: {node: '>=18'} hasBin: true + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@3.0.2': + resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} + engines: {node: '>=12'} + '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -5360,6 +5411,12 @@ packages: '@types/express@5.0.6': resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + '@types/filesystem@0.0.36': + resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} + + '@types/filewriter@0.0.33': + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} @@ -5372,6 +5429,9 @@ packages: '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/har-format@1.2.16': + resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -5441,6 +5501,9 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -5954,6 +6017,21 @@ packages: '@webcomponents/webcomponentsjs@2.8.0': resolution: {integrity: sha512-loGD63sacRzOzSJgQnB9ZAhaQGkN7wl2Zuw7tsphI5Isa0irijrRo6EnJii/GgjGefIFO8AIO7UivzRhFaEk9w==} + '@webext-core/fake-browser@1.3.4': + resolution: {integrity: sha512-nZcVWr3JpwpS5E6hKpbAwAMBM/AXZShnfW0F76udW8oLd6Kv0nbW6vFS07md4Na/0ntQonk3hFnlQYGYBAlTrA==} + + '@webext-core/isolated-element@1.1.3': + resolution: {integrity: sha512-rbtnReIGdiVQb2UhK3MiECU6JqsiIo2K/luWvOdOw57Ot770Iw4KLCEPXUQMITIH5V5er2jfVK8hSWXaEOQGNQ==} + + '@webext-core/match-patterns@1.0.3': + resolution: {integrity: sha512-NY39ACqCxdKBmHgw361M9pfJma8e4AZo20w9AY+5ZjIj1W2dvXC8J31G5fjfOGbulW9w4WKpT8fPooi0mLkn9A==} + + '@wxt-dev/browser@0.1.32': + resolution: {integrity: sha512-jvfSppeLzlH4sOkIvMBJoA1pKoI+U5gTkjDwMKdkTWh0P/fj+KDyze3lzo3S6372viCm8tXUKNez+VKyVz2ZDw==} + + '@wxt-dev/storage@1.2.6': + resolution: {integrity: sha512-f6AknnpJvhNHW4s0WqwSGCuZAj0fjP3EVNPBO5kB30pY+3Zt/nqZGqJN6FgBLCSkYjPJ8VL1hNX5LMVmvxQoDw==} + '@xmldom/xmldom@0.8.10': resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} engines: {node: '>=10.0.0'} @@ -6041,6 +6119,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + adm-zip@0.5.16: + resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} + engines: {node: '>=12.0'} + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -6113,6 +6195,9 @@ packages: amator@1.1.0: resolution: {integrity: sha512-V5+aH8pe+Z3u/UG3L3pG3BaFQGXAyXHVQDroRwjPHdh08bcUEchAVsU1MCuJSCaU5o60wTK6KaE6te5memzgYw==} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -6210,6 +6295,10 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} + array-differ@4.0.0: + resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -6221,6 +6310,10 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array-union@3.0.1: + resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} + engines: {node: '>=12'} + array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} @@ -6286,6 +6379,13 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + atomically@2.1.0: + resolution: {integrity: sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==} + author-regex@1.0.0: resolution: {integrity: sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==} engines: {node: '>=0.8'} @@ -6458,6 +6558,10 @@ packages: bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + boxicons@2.1.4: resolution: {integrity: sha512-BvJNfYfnE4g9WQ7GL91fftxMOTwAleWlPFwvQJPYb/Ju7aLjlQ/Eu55AH9JLNk/OR82z+ZSq4TbKzbV/e5Rr0A==} @@ -6536,6 +6640,18 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c12@3.3.3: + resolution: {integrity: sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + cacache@15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} @@ -6590,6 +6706,10 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} @@ -6682,10 +6802,25 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + chrome-launcher@1.2.0: + resolution: {integrity: sha512-JbuGuBNss258bvGil7FT4HKdC3SC2K7UAEUqiPy3ACS3Yxo3hAW6bvFpCu2HsIJLgTqxgEX6BkujvzZfLpUD0Q==} + engines: {node: '>=12.13.0'} + hasBin: true + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + citty@0.2.0: + resolution: {integrity: sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA==} + ckeditor5-collaboration@47.4.0: resolution: {integrity: sha512-SNwRWFy6DcU1R9wHpRvXq6YLbpMExRoGwms+JF1bKZK9afHznGOouoMPSpHNrkE27OMem6r0SlXAryUPQh4Pfg==} @@ -6704,6 +6839,10 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -6728,6 +6867,10 @@ packages: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + cli-truncate@5.1.0: resolution: {integrity: sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g==} engines: {node: '>=20'} @@ -6860,6 +7003,10 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@2.9.0: + resolution: {integrity: sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==} + engines: {node: '>= 0.6.x'} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -6934,6 +7081,13 @@ packages: confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@7.1.0: + resolution: {integrity: sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==} + engines: {node: '>=18'} + connect-history-api-fallback@2.0.0: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} @@ -6942,6 +7096,10 @@ packages: resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} engines: {node: '>= 0.10.0'} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} @@ -7211,6 +7369,9 @@ packages: cssom@0.4.4: resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + cssstyle@2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} @@ -7435,6 +7596,9 @@ packages: de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + debounce@3.0.0: resolution: {integrity: sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA==} engines: {node: '>=20'} @@ -7540,6 +7704,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -7551,6 +7719,9 @@ packages: defined@1.0.1: resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -7577,6 +7748,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -7688,6 +7862,14 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + + dotenv-expand@12.0.3: + resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} + engines: {node: '>=12'} + dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} @@ -7912,6 +8094,9 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -8201,6 +8386,9 @@ packages: exsolve@1.0.5: resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + ext-list@2.2.2: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} engines: {node: '>=0.10.0'} @@ -8244,6 +8432,10 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -8328,6 +8520,10 @@ packages: resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} engines: {node: '>=8'} + filesize@11.0.13: + resolution: {integrity: sha512-mYJ/qXKvREuO0uH8LTQJ6v7GsUvVOguqxg2VTwQUkyTPXXRRWPdjuUPVqdBrJQhvci48OHlNGRnux+Slr2Rnvw==} + engines: {node: '>= 10.8.0'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -8356,6 +8552,11 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + firefox-profile@4.7.0: + resolution: {integrity: sha512-aGApEu5bfCNbA4PGUZiRJAIU6jKmghV2UVdklXAofnNtiDjqYw0czLS46W7IfFqVKgKhFB8Ao2YoNGHY4BoIMQ==} + engines: {node: '>=18'} + hasBin: true + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -8405,6 +8606,10 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data-encoder@4.1.0: + resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} + engines: {node: '>= 18'} + form-data@4.0.4: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} @@ -8417,6 +8622,10 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + formdata-node@6.0.3: + resolution: {integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==} + engines: {node: '>= 18'} + formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -8515,6 +8724,10 @@ packages: fuzzysort@3.1.0: resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + fx-runner@1.4.0: + resolution: {integrity: sha512-rci1g6U0rdTg6bAaBboP7XdRu01dzTAaKXxFf+PUqGuCv6Xu7o8NZdY1D5MvKGIjb6EdS1g3VlXOgksir1uGkg==} + hasBin: true + galactus@1.0.0: resolution: {integrity: sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==} engines: {node: '>= 12'} @@ -8570,6 +8783,9 @@ packages: resolution: {integrity: sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==} engines: {node: '>= 4.0'} + get-port-please@3.2.0: + resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + get-port@7.1.0: resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} engines: {node: '>=16'} @@ -8607,6 +8823,10 @@ packages: gifwrap@0.10.1: resolution: {integrity: sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==} + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true + github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -8667,6 +8887,10 @@ packages: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} @@ -8725,9 +8949,15 @@ packages: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} engines: {node: '>=10.19.0'} + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-readlink@1.0.1: + resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} + grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} @@ -8738,6 +8968,9 @@ packages: resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + growly@1.3.0: + resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} + hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} @@ -8868,6 +9101,9 @@ packages: hoist-non-react-statics@2.5.5: resolution: {integrity: sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hookified@1.13.0: resolution: {integrity: sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==} @@ -8900,6 +9136,9 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} @@ -9150,6 +9389,10 @@ packages: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ini@4.1.3: resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -9200,6 +9443,10 @@ packages: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} + is-absolute@0.1.7: + resolution: {integrity: sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==} + engines: {node: '>=0.10.0'} + is-animated@2.0.2: resolution: {integrity: sha512-+Hi3UdXHV/3ZgxdO9Ik45ciNhDlYrDOIdGz7Cj7ybddWnYBi4kwBuGMn79Xa2Js4VldgX5e3943Djsr/KYSPbA==} @@ -9288,11 +9535,20 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-in-ci@1.0.0: + resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} + engines: {node: '>=18'} + hasBin: true + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} hasBin: true + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -9328,6 +9584,10 @@ packages: is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-npm@6.1.0: + resolution: {integrity: sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -9356,6 +9616,10 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -9363,6 +9627,10 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-primitive@3.0.1: + resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} + engines: {node: '>=0.10.0'} + is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -9380,6 +9648,10 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-relative@0.1.3: + resolution: {integrity: sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==} + engines: {node: '>=0.10.0'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -9416,6 +9688,14 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -9452,6 +9732,9 @@ packages: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} + isexe@1.1.2: + resolution: {integrity: sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -9459,6 +9742,10 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -9602,6 +9889,10 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-parse-even-better-errors@4.0.0: resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -9724,6 +10015,10 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} @@ -9737,10 +10032,18 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + ky@1.14.2: + resolution: {integrity: sha512-q3RBbsO5A5zrPhB6CaCS8ZUv+NWCXv6JJT4Em0i264G9W0fdPB8YRfnnEi7Dm7X7omAkBIPojzYJ2D1oHTHqug==} + engines: {node: '>=18'} + langium@3.3.1: resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} engines: {node: '>=16.0.0'} + latest-version@9.0.0: + resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==} + engines: {node: '>=18'} + launch-editor@2.11.1: resolution: {integrity: sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==} @@ -9782,6 +10085,9 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lighthouse-logger@2.0.2: + resolution: {integrity: sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==} + lightningcss-android-arm64@1.31.1: resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} engines: {node: '>= 12.0.0'} @@ -9866,6 +10172,19 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + linkedom@0.18.12: + resolution: {integrity: sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q==} + engines: {node: '>=16'} + peerDependencies: + canvas: '>= 2' + peerDependenciesMeta: + canvas: + optional: true + linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} @@ -9878,6 +10197,10 @@ packages: resolution: {integrity: sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==} engines: {node: '>=16.0.0'} + listr2@8.3.3: + resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} + engines: {node: '>=18.0.0'} + listr2@9.0.5: resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} engines: {node: '>=20.0.0'} @@ -9898,6 +10221,10 @@ packages: resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} engines: {node: '>=14'} + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + locate-app@2.5.0: resolution: {integrity: sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==} @@ -9972,6 +10299,10 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + log-update@5.0.1: resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -10045,6 +10376,9 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.1: resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} @@ -10075,6 +10409,9 @@ packages: resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} engines: {node: '>= 10'} + many-keys-map@2.0.1: + resolution: {integrity: sha512-DHnZAD4phTbZ+qnJdjoNEVU1NecYoSdbOOoVmTDH46AuxDkEVh3MxTVpXq10GtcTC6mndN9dkv1rNfpjRcLnOw==} + map-age-cleaner@0.1.3: resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} engines: {node: '>=6'} @@ -10108,6 +10445,9 @@ packages: engines: {node: '>= 12'} hasBin: true + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -10477,6 +10817,9 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mobx-react-lite@4.1.1: resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} peerDependencies: @@ -10553,6 +10896,10 @@ packages: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true + multimatch@6.0.0: + resolution: {integrity: sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + multimath@2.0.0: resolution: {integrity: sha512-toRx66cAMJ+Ccz7pMIg38xSIrtnbozk0dchXezwQDMgQmbGpfxjtv68H+L00iFL8hxDaVjrmwAFSb3I6bg8Q2g==} @@ -10576,6 +10923,10 @@ packages: nan@2.22.2: resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} + nano-spawn@1.0.3: + resolution: {integrity: sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==} + engines: {node: '>=20.17'} + nano-spawn@2.0.0: resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} engines: {node: '>=20.17'} @@ -10650,6 +11001,9 @@ packages: resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} engines: {node: 4.x || >=6.0.0} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -10687,6 +11041,9 @@ packages: node-html-parser@7.0.2: resolution: {integrity: sha512-DxodLVh7a6JMkYzWyc8nBX9MaF4M0lLFYkJHlWOiu7+9/I6mwNK9u5TbAMC7qfqDJEPX9OIoWA2A9t4C2l1mUQ==} + node-notifier@10.0.1: + resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==} + node-readfiles@0.2.0: resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} @@ -10779,6 +11136,11 @@ packages: nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + nypm@0.6.4: + resolution: {integrity: sha512-1TvCKjZyyklN+JJj2TS3P4uSQEInrM/HkkuSXsEzm1ApPgBffOn8gFguNnZf07r/1X6vlryfIqMUkJKQMzlZiw==} + engines: {node: '>=18'} + hasBin: true + oas-kit-common@1.0.8: resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} @@ -10844,6 +11206,12 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + oidc-token-hash@5.1.0: resolution: {integrity: sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==} engines: {node: ^10.13.0 || >=12.0.0} @@ -10854,6 +11222,10 @@ packages: omggif@1.0.10: resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -10884,6 +11256,10 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + openai@6.16.0: resolution: {integrity: sha512-fZ1uBqjFUjXzbGc35fFtYKEOxd20kd9fDpFeqWtsOZWiubY8CZ1NAlXHW3iathaFvqmNtCWMIsosCuyeI7Joxg==} hasBin: true @@ -10918,6 +11294,14 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + + os-shim@0.1.3: + resolution: {integrity: sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==} + engines: {node: '>= 0.4.0'} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -10999,6 +11383,10 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-json@10.0.1: + resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} + engines: {node: '>=18'} + package-manager-detector@1.3.0: resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} @@ -11044,6 +11432,10 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} + parse-node-version@1.0.1: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} @@ -11164,6 +11556,9 @@ packages: pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + perfect-freehand@1.2.0: resolution: {integrity: sha512-h/0ikF1M3phW7CwpZ5MMvKnfpHficWoOEyr//KVNTxV4F6deRK1eYMtHyBKEAKFK0aXIEUK9oBvlF6PNXMDsAw==} @@ -11197,6 +11592,16 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} + + pino@9.7.0: + resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} + hasBin: true + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -11215,6 +11620,9 @@ packages: pkg-types@2.1.0: resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + playwright-core@1.57.0: resolution: {integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==} engines: {node: '>=18'} @@ -11763,6 +12171,9 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -11783,12 +12194,23 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + promise-toolbox@0.21.0: + resolution: {integrity: sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg==} + engines: {node: '>=6'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + protobufjs@7.5.0: resolution: {integrity: sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==} engines: {node: '>=12.0.0'} @@ -11813,6 +12235,10 @@ packages: psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + publish-browser-extension@3.0.3: + resolution: {integrity: sha512-cBINZCkLo7YQaGoUvEHthZ0sDzgJQht28IS+SFMT2omSNhGsPiVNRkWir3qLiTrhGhW9Ci2KVHpA1QAMoBdL2g==} + hasBin: true + pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} @@ -11861,6 +12287,9 @@ packages: quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + query-selector-shadow-dom@1.0.1: resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} @@ -11874,6 +12303,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -11916,6 +12348,9 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -12062,6 +12497,10 @@ packages: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + rechoir@0.8.0: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} @@ -12098,6 +12537,14 @@ packages: resolution: {integrity: sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==} engines: {node: '>=4'} + registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + regjsgen@0.5.2: resolution: {integrity: sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==} @@ -12352,6 +12799,10 @@ packages: safe-regex2@5.0.0: resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -12509,6 +12960,9 @@ packages: script-loader@0.7.2: resolution: {integrity: sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==} + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + secure-compare@3.0.1: resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} @@ -12596,6 +13050,10 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + set-value@4.1.0: + resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==} + engines: {node: '>=11.0'} + setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -12624,6 +13082,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.7.3: + resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} + shell-quote@1.8.3: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} @@ -12632,6 +13093,9 @@ packages: resolution: {integrity: sha512-Jex+xw5Mg2qMZL3qnzXIfaxEtBaC4n7xifqaqtrZDdlheR70OGkydrPJWT0V1cA1k3nanC86x9FwAmQl6w3Klw==} engines: {node: '>=18'} + shellwords@0.1.1: + resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} + shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} @@ -12706,6 +13170,9 @@ packages: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -12778,6 +13245,9 @@ packages: resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + sort-keys-length@1.0.1: resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} engines: {node: '>=0.10.0'} @@ -12814,6 +13284,9 @@ packages: spacetrim@0.11.59: resolution: {integrity: sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==} + spawn-sync@1.0.15: + resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -12845,6 +13318,9 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -12902,6 +13378,10 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + stickyfill@1.1.1: resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==} @@ -13016,6 +13496,13 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.2: + resolution: {integrity: sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==} + engines: {node: '>=14.16'} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strip-outer@1.0.1: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} engines: {node: '>=0.10.0'} @@ -13037,6 +13524,12 @@ packages: resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} engines: {node: '>=10'} + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.2: + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + style-loader@2.0.0: resolution: {integrity: sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==} engines: {node: '>= 10.13.0'} @@ -13289,9 +13782,15 @@ packages: peerDependencies: tslib: ^2 + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -13504,6 +14003,10 @@ packages: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + type-fest@4.26.0: resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} engines: {node: '>=16'} @@ -13600,6 +14103,9 @@ packages: engines: {node: '>=0.8.0'} hasBin: true + uhyphen@0.2.0: + resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} + uid-safe@2.1.5: resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} engines: {node: '>= 0.8'} @@ -13660,6 +14166,10 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unimport@5.6.0: + resolution: {integrity: sha512-8rqAmtJV8o60x46kBAJKtHpJDJWkA2xcBqWKPI14MgUb05o1pnpnCnXSxedUXyeq7p8fR5g3pTo2BaswZ9lD9A==} + engines: {node: '>=18.12.0'} + union@0.5.0: resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} engines: {node: '>= 0.8.0'} @@ -13724,6 +14234,14 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin-utils@0.3.1: + resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} + engines: {node: '>=20.19.0'} + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + unused-filename@4.0.1: resolution: {integrity: sha512-ZX6U1J04K1FoSUeoX1OicAhw4d0aro2qo+L8RhJkiGTNtBNkd/Fi1Wxoc9HzcVu6HfOzm0si/N15JjxFmD1z6A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -13738,6 +14256,10 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-notifier@7.3.1: + resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==} + engines: {node: '>=18'} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -13857,6 +14379,11 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@5.3.0: + resolution: {integrity: sha512-8f20COPYJujc3OKPX6OuyBy3ZIv2det4eRRU4GY1y2MjbeGSUmPjedxg1b72KnTagCofwvZ65ThzjxDW2AtQFQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + vite-plugin-dts@4.5.4: resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} peerDependencies: @@ -14024,6 +14551,10 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-ext-run@0.2.4: + resolution: {integrity: sha512-rQicL7OwuqWdQWI33JkSXKcp7cuv1mJG8u3jRQwx/8aDsmhbTHs9ZRmNYOL+LX0wX8edIEQX8jj4bB60GoXtKA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -14088,6 +14619,9 @@ packages: resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webpack@5.101.3: resolution: {integrity: sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==} engines: {node: '>=10.13.0'} @@ -14151,6 +14685,12 @@ packages: wheel@1.0.0: resolution: {integrity: sha512-XiCMHibOiqalCQ+BaNSwRoZ9FDTAvOsXxGHXChBugewDj7HC8VBIER71dEOiRH1fSdLbRCQzngKTSiZ06ZQzeA==} + when-exit@2.1.5: + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} + + when@3.7.7: + resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -14167,6 +14707,10 @@ packages: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} + which@1.2.4: + resolution: {integrity: sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA==} + hasBin: true + which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -14199,6 +14743,13 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + winreg@0.0.12: + resolution: {integrity: sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -14276,6 +14827,14 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} + wxt@0.20.13: + resolution: {integrity: sha512-FwQEk+0a4/pYha6rTKGl5iicU6kRYDBDiElJf55CFEfoJKqvGzBTZpphafurQfqU1X0hvAm9w5GEWC0thXI6wQ==} + hasBin: true + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} @@ -14399,6 +14958,9 @@ packages: engines: {node: '>=8.0.0'} hasBin: true + zip-dir@2.0.0: + resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==} + zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} @@ -14429,8 +14991,22 @@ packages: snapshots: + '@1natsu/wait-element@4.1.2': + dependencies: + defu: 6.1.4 + many-keys-map: 2.0.1 + '@adobe/css-tools@4.4.4': {} + '@aklinker1/rollup-plugin-visualizer@5.12.0(rollup@4.52.0)': + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + source-map: 0.7.6 + yargs: 17.7.2 + optionalDependencies: + rollup: 4.52.0 + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -14982,6 +15558,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/runtime@7.28.2': {} + '@babel/runtime@7.28.4': {} '@babel/template@7.27.2': @@ -15102,6 +15680,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-upload': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-ai@47.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: @@ -15242,12 +15822,16 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-cloud-services@47.4.0': dependencies: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15313,6 +15897,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -15438,6 +16024,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -15447,6 +16035,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -15456,6 +16046,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-inline@47.4.0': dependencies: @@ -15489,8 +16081,6 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -15503,8 +16093,6 @@ snapshots: ckeditor5: 47.4.0 es-toolkit: 1.39.5 fuzzysort: 3.1.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-engine@47.4.0': dependencies: @@ -15547,8 +16135,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-export-word@47.4.0': dependencies: @@ -15582,8 +16168,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-footnotes@47.4.0': dependencies: @@ -15614,8 +16198,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-heading@47.4.0': dependencies: @@ -15626,8 +16208,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-highlight@47.4.0': dependencies: @@ -15636,8 +16216,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-horizontal-line@47.4.0': dependencies: @@ -15647,6 +16225,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-html-embed@47.4.0': dependencies: @@ -15656,8 +16236,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-html-support@47.4.0': dependencies: @@ -15673,8 +16251,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -15692,8 +16268,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-import-word@47.4.0': dependencies: @@ -15706,8 +16280,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-indent@47.4.0': dependencies: @@ -15719,8 +16291,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-inspector@5.0.0': {} @@ -15730,8 +16300,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-line-height@47.4.0': dependencies: @@ -15756,8 +16324,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-list-multi-level@47.4.0': dependencies: @@ -15781,8 +16347,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-markdown-gfm@47.4.0': dependencies: @@ -15820,8 +16384,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-mention@47.4.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d)': dependencies: @@ -15831,8 +16393,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-merge-fields@47.4.0': dependencies: @@ -15845,8 +16405,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-minimap@47.4.0': dependencies: @@ -15855,8 +16413,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-operations-compressor@47.4.0': dependencies: @@ -15911,8 +16467,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-pagination@47.4.0': dependencies: @@ -16020,8 +16574,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-slash-command@47.4.0': dependencies: @@ -16034,8 +16586,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-source-editing-enhanced@47.4.0': dependencies: @@ -16083,8 +16633,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-table@47.4.0': dependencies: @@ -16097,8 +16645,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-template@47.4.0': dependencies: @@ -16209,8 +16755,6 @@ snapshots: '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-widget@47.4.0': dependencies: @@ -16230,8 +16774,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@codemirror/autocomplete@6.18.6': dependencies: @@ -16457,6 +16999,22 @@ snapshots: dependencies: postcss-selector-parser: 7.1.1 + '@devicefarmer/adbkit-logcat@2.1.3': {} + + '@devicefarmer/adbkit-monkey@1.2.1': {} + + '@devicefarmer/adbkit@3.3.8': + dependencies: + '@devicefarmer/adbkit-logcat': 2.1.3 + '@devicefarmer/adbkit-monkey': 1.2.1 + bluebird: 3.7.2 + commander: 9.5.0 + debug: 4.3.7 + node-forge: 1.3.1 + split: 1.0.1 + transitivePeerDependencies: + - supports-color + '@digitak/esrun@3.2.26': dependencies: '@digitak/grubber': 3.1.4 @@ -17895,6 +18453,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/source-map@0.3.11': @@ -18500,6 +19063,18 @@ snapshots: dependencies: playwright: 1.57.0 + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@3.0.2': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + '@polka/url@1.0.0-next.29': {} '@popperjs/core@2.11.8': {} @@ -20034,6 +20609,12 @@ snapshots: '@types/express-serve-static-core': 5.1.0 '@types/serve-static': 2.2.0 + '@types/filesystem@0.0.36': + dependencies: + '@types/filewriter': 0.0.33 + + '@types/filewriter@0.0.33': {} + '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 @@ -20050,6 +20631,8 @@ snapshots: '@types/geojson@7946.0.16': {} + '@types/har-format@1.2.16': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -20120,6 +20703,8 @@ snapshots: '@types/mime@1.3.5': {} + '@types/minimatch@3.0.5': {} + '@types/ms@2.1.0': {} '@types/multer@2.0.0': @@ -20869,6 +21454,27 @@ snapshots: '@webcomponents/webcomponentsjs@2.8.0': {} + '@webext-core/fake-browser@1.3.4': + dependencies: + lodash.merge: 4.6.2 + + '@webext-core/isolated-element@1.1.3': + dependencies: + is-potential-custom-element-name: 1.0.1 + + '@webext-core/match-patterns@1.0.3': {} + + '@wxt-dev/browser@0.1.32': + dependencies: + '@types/filesystem': 0.0.36 + '@types/har-format': 1.2.16 + + '@wxt-dev/storage@1.2.6': + dependencies: + '@wxt-dev/browser': 0.1.32 + async-mutex: 0.5.0 + dequal: 2.0.3 + '@xmldom/xmldom@0.8.10': {} '@xtuc/ieee754@1.2.0': {} @@ -20934,6 +21540,8 @@ snapshots: acorn@8.15.0: {} + adm-zip@0.5.16: {} + agent-base@6.0.2: dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -21016,6 +21624,10 @@ snapshots: dependencies: bezier-easing: 2.1.0 + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -21121,6 +21733,8 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 + array-differ@4.0.0: {} + array-flatten@1.1.1: {} array-includes@3.1.9: @@ -21136,6 +21750,8 @@ snapshots: array-union@2.1.0: {} + array-union@3.0.1: {} + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 @@ -21225,6 +21841,13 @@ snapshots: at-least-node@1.0.0: {} + atomic-sleep@1.0.0: {} + + atomically@2.1.0: + dependencies: + stubborn-fs: 2.0.0 + when-exit: 2.1.5 + author-regex@1.0.0: {} autocomplete.js@0.38.1: @@ -21404,6 +22027,17 @@ snapshots: bowser@2.11.0: {} + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + boxicons@2.1.4: dependencies: '@webcomponents/webcomponentsjs': 2.8.0 @@ -21498,6 +22132,25 @@ snapshots: bytes@3.1.2: {} + c12@3.3.3(magicast@0.3.5): + dependencies: + chokidar: 5.0.0 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 17.2.3 + exsolve: 1.0.8 + giget: 2.0.0 + jiti: 2.6.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.0 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + + cac@6.7.14: {} + cacache@15.3.0: dependencies: '@npmcli/fs': 1.1.1 @@ -21619,6 +22272,8 @@ snapshots: camelcase@6.3.0: {} + camelcase@8.0.0: {} + camelize@1.0.1: {} caniuse-api@3.0.0: @@ -21742,13 +22397,28 @@ snapshots: chownr@3.0.0: {} + chrome-launcher@1.2.0: + dependencies: + '@types/node': 24.10.9 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 2.0.2 + transitivePeerDependencies: + - supports-color + chrome-trace-event@1.0.4: {} + ci-info@4.3.1: {} + + citty@0.1.6: + dependencies: + consola: 3.4.2 + + citty@0.2.0: {} + ckeditor5-collaboration@47.4.0: dependencies: '@ckeditor/ckeditor5-collaboration-core': 47.4.0 - transitivePeerDependencies: - - supports-color ckeditor5-premium-features@47.4.0(bufferutil@4.0.9)(ckeditor5@47.4.0)(utf-8-validate@6.0.5): dependencies: @@ -21854,6 +22524,8 @@ snapshots: clean-stack@2.2.0: {} + cli-boxes@3.0.0: {} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -21875,6 +22547,11 @@ snapshots: slice-ansi: 5.0.0 string-width: 5.1.2 + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + cli-truncate@5.1.0: dependencies: slice-ansi: 7.1.2 @@ -22001,6 +22678,10 @@ snapshots: commander@2.20.3: {} + commander@2.9.0: + dependencies: + graceful-readlink: 1.0.1 + commander@4.1.1: {} commander@5.1.0: {} @@ -22069,6 +22750,18 @@ snapshots: confbox@0.2.2: {} + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + configstore@7.1.0: + dependencies: + atomically: 2.1.0 + dot-prop: 9.0.0 + graceful-fs: 4.2.11 + xdg-basedir: 5.1.0 + connect-history-api-fallback@2.0.0: {} connect@3.7.0: @@ -22080,6 +22773,8 @@ snapshots: transitivePeerDependencies: - supports-color + consola@3.4.2: {} + console-control-strings@1.1.0: optional: true @@ -22418,6 +23113,8 @@ snapshots: cssom@0.4.4: {} + cssom@0.5.0: {} + cssstyle@2.3.0: dependencies: cssom: 0.3.8 @@ -22673,6 +23370,8 @@ snapshots: de-indent@1.0.2: {} + debounce@1.2.1: {} + debounce@3.0.0: {} debug@2.6.9: @@ -22749,6 +23448,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} define-properties@1.2.1: @@ -22759,6 +23460,8 @@ snapshots: defined@1.0.1: {} + defu@6.1.4: {} + degenerator@5.0.1: dependencies: ast-types: 0.13.4 @@ -22780,6 +23483,8 @@ snapshots: dequal@2.0.3: {} + destr@2.0.5: {} + destroy@1.2.0: {} detect-hover@1.0.3: {} @@ -22894,6 +23599,14 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + + dotenv-expand@12.0.3: + dependencies: + dotenv: 16.4.7 + dotenv@16.4.7: {} dotenv@17.2.3: {} @@ -23312,6 +24025,8 @@ snapshots: es-module-lexer@1.7.0: {} + es-module-lexer@2.0.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -23335,8 +24050,7 @@ snapshots: es-toolkit@1.39.5: {} - es6-error@4.1.1: - optional: true + es6-error@4.1.1: {} es6-promise-pool@2.5.0: {} @@ -23810,6 +24524,8 @@ snapshots: exsolve@1.0.5: {} + exsolve@1.0.8: {} + ext-list@2.2.2: dependencies: mime-db: 1.54.0 @@ -23859,6 +24575,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-redact@3.5.0: {} + fast-safe-stringify@2.1.1: {} fast-uri@3.1.0: {} @@ -23943,6 +24661,8 @@ snapshots: strip-outer: 1.0.1 trim-repeated: 1.0.0 + filesize@11.0.13: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -23993,6 +24713,14 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + firefox-profile@4.7.0: + dependencies: + adm-zip: 0.5.16 + fs-extra: 11.3.3 + ini: 4.1.3 + minimist: 1.2.8 + xml2js: 0.6.2 + flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -24059,6 +24787,8 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + form-data-encoder@4.1.0: {} + form-data@4.0.4: dependencies: asynckit: 0.4.0 @@ -24077,6 +24807,8 @@ snapshots: format@0.2.2: {} + formdata-node@6.0.3: {} + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 @@ -24172,6 +24904,15 @@ snapshots: fuzzysort@3.1.0: {} + fx-runner@1.4.0: + dependencies: + commander: 2.9.0 + shell-quote: 1.7.3 + spawn-sync: 1.0.15 + when: 3.7.7 + which: 1.2.4 + winreg: 0.0.12 + galactus@1.0.0: dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -24254,6 +24995,8 @@ snapshots: transitivePeerDependencies: - supports-color + get-port-please@3.2.0: {} + get-port@7.1.0: {} get-proto@1.0.1: @@ -24296,6 +25039,15 @@ snapshots: image-q: 4.0.0 omggif: 1.0.10 + giget@2.0.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + node-fetch-native: 1.6.7 + nypm: 0.6.4 + pathe: 2.0.3 + github-from-package@0.0.0: {} github-slugger@2.0.0: {} @@ -24385,6 +25137,10 @@ snapshots: serialize-error: 7.0.1 optional: true + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + global-dirs@3.0.1: dependencies: ini: 2.0.0 @@ -24456,8 +25212,12 @@ snapshots: p-cancelable: 2.1.1 responselike: 2.0.1 + graceful-fs@4.2.10: {} + graceful-fs@4.2.11: {} + graceful-readlink@1.0.1: {} + grapheme-splitter@1.0.4: {} graphemer@1.4.0: {} @@ -24465,6 +25225,8 @@ snapshots: graphql@16.12.0: optional: true + growly@1.3.0: {} + hachure-fill@0.5.2: {} handle-thing@2.0.1: {} @@ -24654,6 +25416,8 @@ snapshots: hoist-non-react-statics@2.5.5: {} + hookable@5.5.3: {} + hookified@1.13.0: {} hosted-git-info@2.8.9: {} @@ -24688,6 +25452,8 @@ snapshots: html-escaper@2.0.2: {} + html-escaper@3.0.3: {} + html-parse-stringify@3.0.1: dependencies: void-elements: 3.1.0 @@ -24979,6 +25745,8 @@ snapshots: ini@2.0.0: {} + ini@4.1.1: {} + ini@4.1.3: {} ini@5.0.0: {} @@ -25015,6 +25783,10 @@ snapshots: ipaddr.js@2.2.0: {} + is-absolute@0.1.7: + dependencies: + is-relative: 0.1.3 + is-animated@2.0.2: {} is-arguments@1.2.0: @@ -25099,10 +25871,17 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-in-ci@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 + is-installed-globally@1.0.0: + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + is-interactive@1.0.0: {} is-interactive@2.0.0: {} @@ -25132,6 +25911,8 @@ snapshots: is-node-process@1.2.0: optional: true + is-npm@6.1.0: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -25149,10 +25930,16 @@ snapshots: is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + is-plain-object@5.0.0: {} is-potential-custom-element-name@1.0.1: {} + is-primitive@3.0.1: {} + is-promise@4.0.0: {} is-property@1.0.2: @@ -25174,6 +25961,8 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-relative@0.1.3: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.4: @@ -25205,6 +25994,10 @@ snapshots: is-unicode-supported@0.1.0: {} + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -25235,10 +26028,14 @@ snapshots: isbinaryfile@4.0.10: {} + isexe@1.1.2: {} + isexe@2.0.0: {} isexe@3.1.1: {} + isobject@3.0.1: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@6.0.3: @@ -25447,6 +26244,8 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@3.0.2: {} + json-parse-even-better-errors@4.0.0: {} json-pointer@0.6.2: @@ -25592,6 +26391,8 @@ snapshots: kind-of@6.0.3: {} + kleur@3.0.3: {} + klona@2.0.6: {} knockout@3.5.1: {} @@ -25600,6 +26401,8 @@ snapshots: kolorist@1.8.0: {} + ky@1.14.2: {} + langium@3.3.1: dependencies: chevrotain: 11.0.3 @@ -25608,6 +26411,10 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 + latest-version@9.0.0: + dependencies: + package-json: 10.0.1 + launch-editor@2.11.1: dependencies: picocolors: 1.1.1 @@ -25658,6 +26465,13 @@ snapshots: dependencies: immediate: 3.0.6 + lighthouse-logger@2.0.2: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + lightningcss-android-arm64@1.31.1: optional: true @@ -25715,6 +26529,16 @@ snapshots: lines-and-columns@1.2.4: {} + lines-and-columns@2.0.4: {} + + linkedom@0.18.12: + dependencies: + css-select: 5.2.2 + cssom: 0.5.0 + html-escaper: 3.0.3 + htmlparser2: 10.1.0 + uhyphen: 0.2.0 + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 @@ -25738,6 +26562,15 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 8.1.0 + listr2@8.3.3: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.2 + listr2@9.0.5: dependencies: cli-truncate: 5.1.0 @@ -25768,6 +26601,12 @@ snapshots: pkg-types: 2.1.0 quansync: 0.2.10 + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + locate-app@2.5.0: dependencies: '@promptbook/utils': 0.69.5 @@ -25826,6 +26665,11 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + log-update@5.0.1: dependencies: ansi-escapes: 5.0.0 @@ -25901,6 +26745,12 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 + magicast@0.5.1: dependencies: '@babel/parser': 7.28.5 @@ -25996,6 +26846,8 @@ snapshots: - supports-color optional: true + many-keys-map@2.0.1: {} + map-age-cleaner@0.1.3: dependencies: p-defer: 1.0.0 @@ -26048,6 +26900,8 @@ snapshots: marked@4.3.0: {} + marky@1.3.0: {} + matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 @@ -26611,6 +27465,13 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + mobx-react-lite@4.1.1(mobx@6.15.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: mobx: 6.15.0 @@ -26714,6 +27575,13 @@ snapshots: dns-packet: 5.6.1 thunky: 1.1.0 + multimatch@6.0.0: + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 4.0.0 + array-union: 3.0.1 + minimatch: 3.1.2 + multimath@2.0.0: dependencies: glur: 1.1.2 @@ -26742,6 +27610,8 @@ snapshots: nan@2.22.2: optional: true + nano-spawn@1.0.3: {} + nano-spawn@2.0.0: {} nanoid@3.3.11: {} @@ -26790,6 +27660,8 @@ snapshots: dependencies: http2-client: 1.3.5 + node-fetch-native@1.6.7: {} + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 @@ -26849,6 +27721,15 @@ snapshots: css-select: 5.2.2 he: 1.2.0 + node-notifier@10.0.1: + dependencies: + growly: 1.3.0 + is-wsl: 2.2.0 + semver: 7.7.3 + shellwords: 0.1.1 + uuid: 8.3.2 + which: 2.0.2 + node-readfiles@0.2.0: dependencies: es6-promise: 3.3.1 @@ -26956,6 +27837,12 @@ snapshots: nwsapi@2.2.23: optional: true + nypm@0.6.4: + dependencies: + citty: 0.2.0 + pathe: 2.0.3 + tinyexec: 1.0.2 + oas-kit-common@1.0.8: dependencies: fast-safe-stringify: 2.1.1 @@ -27046,6 +27933,14 @@ snapshots: obug@2.1.1: {} + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 + + ohash@2.0.11: {} + oidc-token-hash@5.1.0: {} ollama@0.6.3: @@ -27054,6 +27949,8 @@ snapshots: omggif@1.0.10: {} + on-exit-leak-free@2.1.2: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -27085,6 +27982,12 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + openai@6.16.0(ws@8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12): optionalDependencies: ws: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -27131,6 +28034,20 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + os-shim@0.1.3: {} + os-tmpdir@1.0.2: {} outdent@0.8.0: {} @@ -27211,6 +28128,13 @@ snapshots: package-json-from-dist@1.0.1: {} + package-json@10.0.1: + dependencies: + ky: 1.14.2 + registry-auth-token: 5.1.1 + registry-url: 6.0.1 + semver: 7.7.3 + package-manager-detector@1.3.0: {} pacote@21.0.1: @@ -27278,6 +28202,14 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-json@7.1.1: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 3.0.2 + lines-and-columns: 2.0.4 + type-fest: 3.13.1 + parse-node-version@1.0.1: optional: true @@ -27375,6 +28307,8 @@ snapshots: pend@1.2.0: {} + perfect-debounce@2.1.0: {} + perfect-freehand@1.2.0: {} perfect-scrollbar@1.5.6: {} @@ -27400,6 +28334,26 @@ snapshots: pify@4.0.1: optional: true + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-std-serializers@7.1.0: {} + + pino@9.7.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + pirates@4.0.7: {} pixelmatch@5.3.0: @@ -27413,7 +28367,7 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 pkg-types@2.1.0: @@ -27422,6 +28376,12 @@ snapshots: exsolve: 1.0.5 pathe: 2.0.3 + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + playwright-core@1.57.0: {} playwright@1.57.0: @@ -27938,6 +28898,8 @@ snapshots: process-nextick-args@2.0.1: {} + process-warning@5.0.0: {} + process@0.11.10: {} progress@2.0.3: {} @@ -27949,6 +28911,15 @@ snapshots: err-code: 2.0.3 retry: 0.12.0 + promise-toolbox@0.21.0: + dependencies: + make-error: 1.3.6 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -27957,6 +28928,8 @@ snapshots: property-information@7.1.0: {} + proto-list@1.2.4: {} + protobufjs@7.5.0: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -28001,6 +28974,17 @@ snapshots: dependencies: punycode: 2.3.1 + publish-browser-extension@3.0.3: + dependencies: + cac: 6.7.14 + consola: 3.4.2 + dotenv: 17.2.3 + form-data-encoder: 4.1.0 + formdata-node: 6.0.3 + listr2: 8.3.3 + ofetch: 1.5.1 + zod: 4.1.12 + pump@3.0.3: dependencies: end-of-stream: 1.4.5 @@ -28045,6 +29029,8 @@ snapshots: quansync@0.2.10: {} + quansync@0.2.11: {} + query-selector-shadow-dom@1.0.1: {} query-string@7.1.3: @@ -28058,6 +29044,8 @@ snapshots: queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + quick-lru@5.1.1: {} quickselect@3.0.0: {} @@ -28100,6 +29088,11 @@ snapshots: schema-utils: 3.3.0 webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2) + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.5 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -28270,6 +29263,8 @@ snapshots: readdirp@5.0.0: {} + real-require@0.2.0: {} + rechoir@0.8.0: dependencies: resolve: 1.22.10 @@ -28344,6 +29339,14 @@ snapshots: unicode-match-property-ecmascript: 1.0.4 unicode-match-property-value-ecmascript: 1.2.0 + registry-auth-token@5.1.1: + dependencies: + '@pnpm/npm-conf': 3.0.2 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + regjsgen@0.5.2: {} regjsparser@0.6.9: @@ -28677,6 +29680,8 @@ snapshots: dependencies: ret: 0.5.0 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} sanitize-filename@1.6.3: @@ -28831,6 +29836,8 @@ snapshots: dependencies: raw-loader: 0.5.1 + scule@1.3.0: {} + secure-compare@3.0.1: {} selderee@0.11.0: @@ -28969,6 +29976,11 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + set-value@4.1.0: + dependencies: + is-plain-object: 2.0.4 + is-primitive: 3.0.1 + setimmediate@1.0.5: {} setprototypeof@1.1.0: {} @@ -28989,6 +30001,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.7.3: {} + shell-quote@1.8.3: {} shelljs@0.10.0: @@ -28996,6 +30010,8 @@ snapshots: execa: 5.1.1 fast-glob: 3.3.3 + shellwords@0.1.1: {} + shimmer@1.2.1: {} should-equal@2.0.0: @@ -29109,6 +30125,8 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 + sisteransi@1.0.5: {} + slash@3.0.0: {} slash@5.1.0: {} @@ -29220,6 +30238,10 @@ snapshots: ip-address: 10.1.0 smart-buffer: 4.2.0 + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + sort-keys-length@1.0.1: dependencies: sort-keys: 1.1.2 @@ -29247,6 +30269,11 @@ snapshots: spacetrim@0.11.59: {} + spawn-sync@1.0.15: + dependencies: + concat-stream: 1.6.2 + os-shim: 0.1.3 + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -29288,6 +30315,10 @@ snapshots: split2@4.2.0: {} + split@1.0.1: + dependencies: + through: 2.3.8 + sprintf-js@1.0.3: {} sprintf-js@1.1.3: @@ -29341,6 +30372,8 @@ snapshots: std-env@3.10.0: {} + stdin-discarder@0.2.2: {} + stickyfill@1.1.1: {} stop-iteration-iterator@1.1.0: @@ -29479,6 +30512,12 @@ snapshots: strip-json-comments@3.1.1: {} + strip-json-comments@5.0.2: {} + + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + strip-outer@1.0.1: dependencies: escape-string-regexp: 1.0.5 @@ -29499,6 +30538,12 @@ snapshots: '@tokenizer/token': 0.3.0 peek-readable: 4.1.0 + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.2 + + stubborn-utils@1.0.2: {} + style-loader@2.0.0(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2)): dependencies: loader-utils: 2.0.4 @@ -29922,10 +30967,16 @@ snapshots: dependencies: tslib: 2.8.1 + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + through2@4.0.2: dependencies: readable-stream: 3.6.2 + through@2.3.8: {} + thunky@1.1.0: {} time2fa@1.4.2: {} @@ -30166,6 +31217,8 @@ snapshots: type-fest@1.4.0: {} + type-fest@3.13.1: {} + type-fest@4.26.0: {} type-fest@4.41.0: {} @@ -30268,6 +31321,8 @@ snapshots: uglify-js@3.19.3: optional: true + uhyphen@0.2.0: {} + uid-safe@2.1.5: dependencies: random-bytes: 1.0.0 @@ -30322,6 +31377,23 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unimport@5.6.0: + dependencies: + acorn: 8.15.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.0 + pathe: 2.0.3 + picomatch: 4.0.3 + pkg-types: 2.3.0 + scule: 1.3.0 + strip-literal: 3.1.0 + tinyglobby: 0.2.15 + unplugin: 2.3.11 + unplugin-utils: 0.3.1 + union@0.5.0: dependencies: qs: 6.14.0 @@ -30391,6 +31463,18 @@ snapshots: unpipe@1.0.0: {} + unplugin-utils@0.3.1: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + unused-filename@4.0.1: dependencies: escape-string-regexp: 5.0.0 @@ -30404,6 +31488,19 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-notifier@7.3.1: + dependencies: + boxen: 8.0.1 + chalk: 5.6.2 + configstore: 7.1.0 + is-in-ci: 1.0.0 + is-installed-globally: 1.0.0 + is-npm: 6.1.0 + latest-version: 9.0.0 + pupa: 3.1.0 + semver: 7.7.3 + xdg-basedir: 5.1.0 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -30504,6 +31601,26 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + vite-node@5.3.0(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + dependencies: + cac: 6.7.14 + es-module-lexer: 2.0.0 + obug: 2.1.1 + pathe: 2.0.3 + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + vite-plugin-dts@4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.52.8(@types/node@24.10.9) @@ -30678,6 +31795,31 @@ snapshots: dependencies: defaults: 1.0.4 + web-ext-run@0.2.4: + dependencies: + '@babel/runtime': 7.28.2 + '@devicefarmer/adbkit': 3.3.8 + chrome-launcher: 1.2.0 + debounce: 1.2.1 + es6-error: 4.1.1 + firefox-profile: 4.7.0 + fx-runner: 1.4.0 + multimatch: 6.0.0 + node-notifier: 10.0.1 + parse-json: 7.1.1 + pino: 9.7.0 + promise-toolbox: 0.21.0 + set-value: 4.1.0 + source-map-support: 0.5.21 + strip-bom: 5.0.0 + strip-json-comments: 5.0.2 + tmp: 0.2.5 + update-notifier: 7.3.1 + watchpack: 2.4.4 + zip-dir: 2.0.0 + transitivePeerDependencies: + - supports-color + web-namespaces@2.0.1: {} web-streams-polyfill@3.3.3: {} @@ -30799,6 +31941,8 @@ snapshots: webpack-sources@3.3.3: {} + webpack-virtual-modules@0.6.2: {} + webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2): dependencies: '@types/eslint-scope': 3.7.7 @@ -30912,6 +32056,10 @@ snapshots: wheel@1.0.0: {} + when-exit@2.1.5: {} + + when@3.7.7: {} + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -30953,6 +32101,11 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 + which@1.2.4: + dependencies: + is-absolute: 0.1.7 + isexe: 1.1.2 + which@1.3.1: dependencies: isexe: 2.0.0 @@ -30983,6 +32136,12 @@ snapshots: string-width: 4.2.3 optional: true + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + winreg@0.0.12: {} + word-wrap@1.2.5: {} wordwrap@1.0.0: {} @@ -31044,6 +32203,71 @@ snapshots: dependencies: is-wsl: 3.1.0 + wxt@0.20.13(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + dependencies: + '@1natsu/wait-element': 4.1.2 + '@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.52.0) + '@webext-core/fake-browser': 1.3.4 + '@webext-core/isolated-element': 1.1.3 + '@webext-core/match-patterns': 1.0.3 + '@wxt-dev/browser': 0.1.32 + '@wxt-dev/storage': 1.2.6 + async-mutex: 0.5.0 + c12: 3.3.3(magicast@0.3.5) + cac: 6.7.14 + chokidar: 4.0.3 + ci-info: 4.3.1 + consola: 3.4.2 + defu: 6.1.4 + dotenv: 17.2.3 + dotenv-expand: 12.0.3 + esbuild: 0.27.2 + fast-glob: 3.3.3 + filesize: 11.0.13 + fs-extra: 11.3.3 + get-port-please: 3.2.0 + giget: 2.0.0 + hookable: 5.5.3 + import-meta-resolve: 4.2.0 + is-wsl: 3.1.0 + json5: 2.2.3 + jszip: 3.10.1 + linkedom: 0.18.12 + magicast: 0.3.5 + minimatch: 10.1.1 + nano-spawn: 1.0.3 + normalize-path: 3.0.0 + nypm: 0.6.4 + ohash: 2.0.11 + open: 10.2.0 + ora: 8.2.0 + perfect-debounce: 2.1.0 + picocolors: 1.1.1 + prompts: 2.4.2 + publish-browser-extension: 3.0.3 + scule: 1.3.0 + unimport: 5.6.0 + vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite-node: 5.3.0(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + web-ext-run: 0.2.4 + transitivePeerDependencies: + - '@types/node' + - canvas + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + xdg-basedir@5.1.0: {} + xml-name-validator@3.0.0: {} xml-name-validator@5.0.0: @@ -31163,6 +32387,11 @@ snapshots: optionalDependencies: commander: 9.5.0 + zip-dir@2.0.0: + dependencies: + async: 3.2.6 + jszip: 3.10.1 + zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 @@ -31171,8 +32400,7 @@ snapshots: zod@3.24.4: {} - zod@4.1.12: - optional: true + zod@4.1.12: {} zustand@4.5.6(@types/react@19.1.7)(react@19.2.3): dependencies: From e4d319c7a183a2af62bfccabb46e6789069b4988 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 09:50:25 +0200 Subject: [PATCH 056/316] chore(web-clipper): define entrypoints --- .../{background.js => entrypoints/background/index.js} | 0 .../{content.js => entrypoints/content/index.js} | 0 .../options.html => entrypoints/options/index.html} | 0 .../{options/options.js => entrypoints/options/index.js} | 0 .../{popup/popup.html => entrypoints/popup/index.html} | 0 apps/web-clipper/{ => entrypoints}/popup/popup.css | 0 apps/web-clipper/{ => entrypoints}/popup/popup.js | 0 apps/web-clipper/manifest.json | 9 ++------- 8 files changed, 2 insertions(+), 7 deletions(-) rename apps/web-clipper/{background.js => entrypoints/background/index.js} (100%) rename apps/web-clipper/{content.js => entrypoints/content/index.js} (100%) rename apps/web-clipper/{options/options.html => entrypoints/options/index.html} (100%) rename apps/web-clipper/{options/options.js => entrypoints/options/index.js} (100%) rename apps/web-clipper/{popup/popup.html => entrypoints/popup/index.html} (100%) rename apps/web-clipper/{ => entrypoints}/popup/popup.css (100%) rename apps/web-clipper/{ => entrypoints}/popup/popup.js (100%) diff --git a/apps/web-clipper/background.js b/apps/web-clipper/entrypoints/background/index.js similarity index 100% rename from apps/web-clipper/background.js rename to apps/web-clipper/entrypoints/background/index.js diff --git a/apps/web-clipper/content.js b/apps/web-clipper/entrypoints/content/index.js similarity index 100% rename from apps/web-clipper/content.js rename to apps/web-clipper/entrypoints/content/index.js diff --git a/apps/web-clipper/options/options.html b/apps/web-clipper/entrypoints/options/index.html similarity index 100% rename from apps/web-clipper/options/options.html rename to apps/web-clipper/entrypoints/options/index.html diff --git a/apps/web-clipper/options/options.js b/apps/web-clipper/entrypoints/options/index.js similarity index 100% rename from apps/web-clipper/options/options.js rename to apps/web-clipper/entrypoints/options/index.js diff --git a/apps/web-clipper/popup/popup.html b/apps/web-clipper/entrypoints/popup/index.html similarity index 100% rename from apps/web-clipper/popup/popup.html rename to apps/web-clipper/entrypoints/popup/index.html diff --git a/apps/web-clipper/popup/popup.css b/apps/web-clipper/entrypoints/popup/popup.css similarity index 100% rename from apps/web-clipper/popup/popup.css rename to apps/web-clipper/entrypoints/popup/popup.css diff --git a/apps/web-clipper/popup/popup.js b/apps/web-clipper/entrypoints/popup/popup.js similarity index 100% rename from apps/web-clipper/popup/popup.js rename to apps/web-clipper/entrypoints/popup/popup.js diff --git a/apps/web-clipper/manifest.json b/apps/web-clipper/manifest.json index fe3b983023..8e0c1ba2bc 100644 --- a/apps/web-clipper/manifest.json +++ b/apps/web-clipper/manifest.json @@ -31,8 +31,7 @@ ], "js": [ "lib/browser-polyfill.js", - "utils.js", - "content.js" + "utils.js" ] } ], @@ -40,13 +39,9 @@ "scripts": [ "lib/browser-polyfill.js", "utils.js", - "trilium_server_facade.js", - "background.js" + "trilium_server_facade.js" ] }, - "options_ui": { - "page": "options/options.html" - }, "commands": { "saveSelection": { "description": "Save the selected text into a note", From cb8b9686373d0cd1df67a7904fe6005ec3709d98 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 09:59:36 +0200 Subject: [PATCH 057/316] chore(web-clipper): make entrypoints actually run --- apps/web-clipper/.gitignore | 3 +- apps/web-clipper/.wxt/tsconfig.json | 1 - .../entrypoints/background/index.js | 896 +++++++++--------- apps/web-clipper/entrypoints/content/index.js | 709 +++++++------- apps/web-clipper/manifest.json | 3 - 5 files changed, 809 insertions(+), 803 deletions(-) delete mode 100644 apps/web-clipper/.wxt/tsconfig.json diff --git a/apps/web-clipper/.gitignore b/apps/web-clipper/.gitignore index 77738287f0..3e99175bf8 100644 --- a/apps/web-clipper/.gitignore +++ b/apps/web-clipper/.gitignore @@ -1 +1,2 @@ -dist/ \ No newline at end of file +.output +.wxt \ No newline at end of file diff --git a/apps/web-clipper/.wxt/tsconfig.json b/apps/web-clipper/.wxt/tsconfig.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/apps/web-clipper/.wxt/tsconfig.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/apps/web-clipper/entrypoints/background/index.js b/apps/web-clipper/entrypoints/background/index.js index 4074987abb..ee92f709a5 100644 --- a/apps/web-clipper/entrypoints/background/index.js +++ b/apps/web-clipper/entrypoints/background/index.js @@ -1,451 +1,453 @@ -// Keyboard shortcuts -chrome.commands.onCommand.addListener(async function (command) { - if (command == "saveSelection") { - await saveSelection(); - } else if (command == "saveWholePage") { - await saveWholePage(); - } else if (command == "saveTabs") { - await saveTabs(); - } else if (command == "saveCroppedScreenshot") { +export default defineBackground(() => { + // Keyboard shortcuts + chrome.commands.onCommand.addListener(async function (command) { + if (command == "saveSelection") { + await saveSelection(); + } else if (command == "saveWholePage") { + await saveWholePage(); + } else if (command == "saveTabs") { + await saveTabs(); + } else if (command == "saveCroppedScreenshot") { + const activeTab = await getActiveTab(); + + await saveCroppedScreenshot(activeTab.url); + } else { + console.log("Unrecognized command", command); + } + }); + + function cropImage(newArea, dataUrl) { + return new Promise((resolve, reject) => { + const img = new Image(); + + img.onload = function () { + const canvas = document.createElement('canvas'); + canvas.width = newArea.width; + canvas.height = newArea.height; + + const ctx = canvas.getContext('2d'); + + ctx.drawImage(img, newArea.x, newArea.y, newArea.width, newArea.height, 0, 0, newArea.width, newArea.height); + + resolve(canvas.toDataURL()); + }; + + img.src = dataUrl; + }); + } + + async function takeCroppedScreenshot(cropRect) { + const activeTab = await getActiveTab(); + const zoom = await browser.tabs.getZoom(activeTab.id) * window.devicePixelRatio; + + const newArea = Object.assign({}, cropRect); + newArea.x *= zoom; + newArea.y *= zoom; + newArea.width *= zoom; + newArea.height *= zoom; + + const dataUrl = await browser.tabs.captureVisibleTab(null, { format: 'png' }); + + return await cropImage(newArea, dataUrl); + } + + async function takeWholeScreenshot() { + // this saves only visible portion of the page + // workaround to save the whole page is to scroll & stitch + // example in https://github.com/mrcoles/full-page-screen-capture-chrome-extension + // see page.js and popup.js + return await browser.tabs.captureVisibleTab(null, { format: 'png' }); + } + + browser.runtime.onInstalled.addListener(() => { + if (isDevEnv()) { + browser.browserAction.setIcon({ + path: 'icons/32-dev.png', + }); + } + }); + + browser.contextMenus.create({ + id: "trilium-save-selection", + title: "Save selection to Trilium", + contexts: ["selection"] + }); + + browser.contextMenus.create({ + id: "trilium-save-cropped-screenshot", + title: "Clip screenshot to Trilium", + contexts: ["page"] + }); + + browser.contextMenus.create({ + id: "trilium-save-cropped-screenshot", + title: "Crop screen shot to Trilium", + contexts: ["page"] + }); + + browser.contextMenus.create({ + id: "trilium-save-whole-screenshot", + title: "Save whole screen shot to Trilium", + contexts: ["page"] + }); + + browser.contextMenus.create({ + id: "trilium-save-page", + title: "Save whole page to Trilium", + contexts: ["page"] + }); + + browser.contextMenus.create({ + id: "trilium-save-link", + title: "Save link to Trilium", + contexts: ["link"] + }); + + browser.contextMenus.create({ + id: "trilium-save-image", + title: "Save image to Trilium", + contexts: ["image"] + }); + + async function getActiveTab() { + const tabs = await browser.tabs.query({ + active: true, + currentWindow: true + }); + + return tabs[0]; + } + + async function getWindowTabs() { + const tabs = await browser.tabs.query({ + currentWindow: true + }); + + return tabs; + } + + async function sendMessageToActiveTab(message) { const activeTab = await getActiveTab(); - await saveCroppedScreenshot(activeTab.url); - } else { - console.log("Unrecognized command", command); + if (!activeTab) { + throw new Error("No active tab."); + } + + try { + return await browser.tabs.sendMessage(activeTab.id, message); + } + catch (e) { + throw e; + } } -}); - -function cropImage(newArea, dataUrl) { - return new Promise((resolve, reject) => { - const img = new Image(); - - img.onload = function () { - const canvas = document.createElement('canvas'); - canvas.width = newArea.width; - canvas.height = newArea.height; - - const ctx = canvas.getContext('2d'); - - ctx.drawImage(img, newArea.x, newArea.y, newArea.width, newArea.height, 0, 0, newArea.width, newArea.height); - - resolve(canvas.toDataURL()); - }; - - img.src = dataUrl; - }); -} - -async function takeCroppedScreenshot(cropRect) { - const activeTab = await getActiveTab(); - const zoom = await browser.tabs.getZoom(activeTab.id) * window.devicePixelRatio; - - const newArea = Object.assign({}, cropRect); - newArea.x *= zoom; - newArea.y *= zoom; - newArea.width *= zoom; - newArea.height *= zoom; - - const dataUrl = await browser.tabs.captureVisibleTab(null, { format: 'png' }); - - return await cropImage(newArea, dataUrl); -} - -async function takeWholeScreenshot() { - // this saves only visible portion of the page - // workaround to save the whole page is to scroll & stitch - // example in https://github.com/mrcoles/full-page-screen-capture-chrome-extension - // see page.js and popup.js - return await browser.tabs.captureVisibleTab(null, { format: 'png' }); -} - -browser.runtime.onInstalled.addListener(() => { - if (isDevEnv()) { - browser.browserAction.setIcon({ - path: 'icons/32-dev.png', - }); - } -}); - -browser.contextMenus.create({ - id: "trilium-save-selection", - title: "Save selection to Trilium", - contexts: ["selection"] -}); - -browser.contextMenus.create({ - id: "trilium-save-cropped-screenshot", - title: "Clip screenshot to Trilium", - contexts: ["page"] -}); - -browser.contextMenus.create({ - id: "trilium-save-cropped-screenshot", - title: "Crop screen shot to Trilium", - contexts: ["page"] -}); - -browser.contextMenus.create({ - id: "trilium-save-whole-screenshot", - title: "Save whole screen shot to Trilium", - contexts: ["page"] -}); - -browser.contextMenus.create({ - id: "trilium-save-page", - title: "Save whole page to Trilium", - contexts: ["page"] -}); - -browser.contextMenus.create({ - id: "trilium-save-link", - title: "Save link to Trilium", - contexts: ["link"] -}); - -browser.contextMenus.create({ - id: "trilium-save-image", - title: "Save image to Trilium", - contexts: ["image"] -}); - -async function getActiveTab() { - const tabs = await browser.tabs.query({ - active: true, - currentWindow: true - }); - - return tabs[0]; -} - -async function getWindowTabs() { - const tabs = await browser.tabs.query({ - currentWindow: true - }); - - return tabs; -} - -async function sendMessageToActiveTab(message) { - const activeTab = await getActiveTab(); - - if (!activeTab) { - throw new Error("No active tab."); - } - - try { - return await browser.tabs.sendMessage(activeTab.id, message); - } - catch (e) { - throw e; - } -} - -function toast(message, noteId = null, tabIds = null) { - sendMessageToActiveTab({ - name: 'toast', - message: message, - noteId: noteId, - tabIds: tabIds - }); -} - -function blob2base64(blob) { - return new Promise(resolve => { - const reader = new FileReader(); - reader.onloadend = function() { - resolve(reader.result); - }; - reader.readAsDataURL(blob); - }); -} - -async function fetchImage(url) { - const resp = await fetch(url); - const blob = await resp.blob(); - - return await blob2base64(blob); -} - -async function postProcessImage(image) { - if (image.src.startsWith("data:image/")) { - image.dataUrl = image.src; - image.src = "inline." + image.src.substr(11, 3); // this should extract file type - png/jpg - } - else { - try { - image.dataUrl = await fetchImage(image.src, image); - } - catch (e) { - console.log(`Cannot fetch image from ${image.src}`); - } - } -} - -async function postProcessImages(resp) { - if (resp.images) { - for (const image of resp.images) { - await postProcessImage(image); - } - } -} - -async function saveSelection() { - const payload = await sendMessageToActiveTab({name: 'trilium-save-selection'}); - - await postProcessImages(payload); - - const resp = await triliumServerFacade.callService('POST', 'clippings', payload); - - if (!resp) { - return; - } - - toast("Selection has been saved to Trilium.", resp.noteId); -} - -async function getImagePayloadFromSrc(src, pageUrl) { - const image = { - imageId: randomString(20), - src: src - }; - - await postProcessImage(image); - - const activeTab = await getActiveTab(); - - return { - title: activeTab.title, - content: ``, - images: [image], - pageUrl: pageUrl - }; -} - -async function saveCroppedScreenshot(pageUrl) { - const cropRect = await sendMessageToActiveTab({name: 'trilium-get-rectangle-for-screenshot'}); - - const src = await takeCroppedScreenshot(cropRect); - - const payload = await getImagePayloadFromSrc(src, pageUrl); - - const resp = await triliumServerFacade.callService("POST", "clippings", payload); - - if (!resp) { - return; - } - - toast("Screenshot has been saved to Trilium.", resp.noteId); -} - -async function saveWholeScreenshot(pageUrl) { - const src = await takeWholeScreenshot(); - - const payload = await getImagePayloadFromSrc(src, pageUrl); - - const resp = await triliumServerFacade.callService("POST", "clippings", payload); - - if (!resp) { - return; - } - - toast("Screenshot has been saved to Trilium.", resp.noteId); -} - -async function saveImage(srcUrl, pageUrl) { - const payload = await getImagePayloadFromSrc(srcUrl, pageUrl); - - const resp = await triliumServerFacade.callService("POST", "clippings", payload); - - if (!resp) { - return; - } - - toast("Image has been saved to Trilium.", resp.noteId); -} - -async function saveWholePage() { - const payload = await sendMessageToActiveTab({name: 'trilium-save-page'}); - - await postProcessImages(payload); - - const resp = await triliumServerFacade.callService('POST', 'notes', payload); - - if (!resp) { - return; - } - - toast("Page has been saved to Trilium.", resp.noteId); -} - -async function saveLinkWithNote(title, content) { - const activeTab = await getActiveTab(); - - if (!title.trim()) { - title = activeTab.title; - } - - const resp = await triliumServerFacade.callService('POST', 'notes', { - title: title, - content: content, - clipType: 'note', - pageUrl: activeTab.url - }); - - if (!resp) { - return false; - } - - toast("Link with note has been saved to Trilium.", resp.noteId); - - return true; -} - -async function getTabsPayload(tabs) { - let content = '
    '; - tabs.forEach(tab => { - content += `
  • ${tab.title}
  • ` - }); - content += '
'; - - const domainsCount = tabs.map(tab => tab.url) - .reduce((acc, url) => { - const hostname = new URL(url).hostname - return acc.set(hostname, (acc.get(hostname) || 0) + 1) - }, new Map()); - - let topDomains = [...domainsCount] - .sort((a, b) => {return b[1]-a[1]}) - .slice(0,3) - .map(domain=>domain[0]) - .join(', ') - - if (tabs.length > 3) { topDomains += '...' } - - return { - title: `${tabs.length} browser tabs: ${topDomains}`, - content: content, - clipType: 'tabs' - }; -} - -async function saveTabs() { - const tabs = await getWindowTabs(); - - const payload = await getTabsPayload(tabs); - - const resp = await triliumServerFacade.callService('POST', 'notes', payload); - - if (!resp) { - return; - } - - const tabIds = tabs.map(tab=>{return tab.id}); - - toast(`${tabs.length} links have been saved to Trilium.`, resp.noteId, tabIds); -} - -browser.contextMenus.onClicked.addListener(async function(info, tab) { - if (info.menuItemId === 'trilium-save-selection') { - await saveSelection(); - } - else if (info.menuItemId === 'trilium-save-cropped-screenshot') { - await saveCroppedScreenshot(info.pageUrl); - } - else if (info.menuItemId === 'trilium-save-whole-screenshot') { - await saveWholeScreenshot(info.pageUrl); - } - else if (info.menuItemId === 'trilium-save-image') { - await saveImage(info.srcUrl, info.pageUrl); - } - else if (info.menuItemId === 'trilium-save-link') { - const link = document.createElement("a"); - link.href = info.linkUrl; - // linkText might be available only in firefox - link.appendChild(document.createTextNode(info.linkText || info.linkUrl)); - - const activeTab = await getActiveTab(); - - const resp = await triliumServerFacade.callService('POST', 'clippings', { - title: activeTab.title, - content: link.outerHTML, - pageUrl: info.pageUrl - }); - - if (!resp) { - return; - } - - toast("Link has been saved to Trilium.", resp.noteId); - } - else if (info.menuItemId === 'trilium-save-page') { - await saveWholePage(); - } - else { - console.log("Unrecognized menuItemId", info.menuItemId); - } -}); - -browser.runtime.onMessage.addListener(async request => { - console.log("Received", request); - - if (request.name === 'openNoteInTrilium') { - const resp = await triliumServerFacade.callService('POST', 'open/' + request.noteId); - - if (!resp) { - return; - } - - // desktop app is not available so we need to open in browser - if (resp.result === 'open-in-browser') { - const {triliumServerUrl} = await browser.storage.sync.get("triliumServerUrl"); - - if (triliumServerUrl) { - const noteUrl = triliumServerUrl + '/#' + request.noteId; - - console.log("Opening new tab in browser", noteUrl); - - browser.tabs.create({ - url: noteUrl - }); - } - else { - console.error("triliumServerUrl not found in local storage."); - } - } - } - else if (request.name === 'closeTabs') { - return await browser.tabs.remove(request.tabIds) - } - else if (request.name === 'load-script') { - return await browser.tabs.executeScript({file: request.file}); - } - else if (request.name === 'save-cropped-screenshot') { - const activeTab = await getActiveTab(); - - return await saveCroppedScreenshot(activeTab.url); - } - else if (request.name === 'save-whole-screenshot') { - const activeTab = await getActiveTab(); - - return await saveWholeScreenshot(activeTab.url); - } - else if (request.name === 'save-whole-page') { - return await saveWholePage(); - } - else if (request.name === 'save-link-with-note') { - return await saveLinkWithNote(request.title, request.content); - } - else if (request.name === 'save-tabs') { - return await saveTabs(); - } - else if (request.name === 'trigger-trilium-search') { - triliumServerFacade.triggerSearchForTrilium(); - } - else if (request.name === 'send-trilium-search-status') { - triliumServerFacade.sendTriliumSearchStatusToPopup(); - } - else if (request.name === 'trigger-trilium-search-note-url') { - const activeTab = await getActiveTab(); - triliumServerFacade.triggerSearchNoteByUrl(activeTab.url); - } + + function toast(message, noteId = null, tabIds = null) { + sendMessageToActiveTab({ + name: 'toast', + message: message, + noteId: noteId, + tabIds: tabIds + }); + } + + function blob2base64(blob) { + return new Promise(resolve => { + const reader = new FileReader(); + reader.onloadend = function() { + resolve(reader.result); + }; + reader.readAsDataURL(blob); + }); + } + + async function fetchImage(url) { + const resp = await fetch(url); + const blob = await resp.blob(); + + return await blob2base64(blob); + } + + async function postProcessImage(image) { + if (image.src.startsWith("data:image/")) { + image.dataUrl = image.src; + image.src = "inline." + image.src.substr(11, 3); // this should extract file type - png/jpg + } + else { + try { + image.dataUrl = await fetchImage(image.src, image); + } + catch (e) { + console.log(`Cannot fetch image from ${image.src}`); + } + } + } + + async function postProcessImages(resp) { + if (resp.images) { + for (const image of resp.images) { + await postProcessImage(image); + } + } + } + + async function saveSelection() { + const payload = await sendMessageToActiveTab({name: 'trilium-save-selection'}); + + await postProcessImages(payload); + + const resp = await triliumServerFacade.callService('POST', 'clippings', payload); + + if (!resp) { + return; + } + + toast("Selection has been saved to Trilium.", resp.noteId); + } + + async function getImagePayloadFromSrc(src, pageUrl) { + const image = { + imageId: randomString(20), + src: src + }; + + await postProcessImage(image); + + const activeTab = await getActiveTab(); + + return { + title: activeTab.title, + content: ``, + images: [image], + pageUrl: pageUrl + }; + } + + async function saveCroppedScreenshot(pageUrl) { + const cropRect = await sendMessageToActiveTab({name: 'trilium-get-rectangle-for-screenshot'}); + + const src = await takeCroppedScreenshot(cropRect); + + const payload = await getImagePayloadFromSrc(src, pageUrl); + + const resp = await triliumServerFacade.callService("POST", "clippings", payload); + + if (!resp) { + return; + } + + toast("Screenshot has been saved to Trilium.", resp.noteId); + } + + async function saveWholeScreenshot(pageUrl) { + const src = await takeWholeScreenshot(); + + const payload = await getImagePayloadFromSrc(src, pageUrl); + + const resp = await triliumServerFacade.callService("POST", "clippings", payload); + + if (!resp) { + return; + } + + toast("Screenshot has been saved to Trilium.", resp.noteId); + } + + async function saveImage(srcUrl, pageUrl) { + const payload = await getImagePayloadFromSrc(srcUrl, pageUrl); + + const resp = await triliumServerFacade.callService("POST", "clippings", payload); + + if (!resp) { + return; + } + + toast("Image has been saved to Trilium.", resp.noteId); + } + + async function saveWholePage() { + const payload = await sendMessageToActiveTab({name: 'trilium-save-page'}); + + await postProcessImages(payload); + + const resp = await triliumServerFacade.callService('POST', 'notes', payload); + + if (!resp) { + return; + } + + toast("Page has been saved to Trilium.", resp.noteId); + } + + async function saveLinkWithNote(title, content) { + const activeTab = await getActiveTab(); + + if (!title.trim()) { + title = activeTab.title; + } + + const resp = await triliumServerFacade.callService('POST', 'notes', { + title: title, + content: content, + clipType: 'note', + pageUrl: activeTab.url + }); + + if (!resp) { + return false; + } + + toast("Link with note has been saved to Trilium.", resp.noteId); + + return true; + } + + async function getTabsPayload(tabs) { + let content = '
    '; + tabs.forEach(tab => { + content += `
  • ${tab.title}
  • ` + }); + content += '
'; + + const domainsCount = tabs.map(tab => tab.url) + .reduce((acc, url) => { + const hostname = new URL(url).hostname + return acc.set(hostname, (acc.get(hostname) || 0) + 1) + }, new Map()); + + let topDomains = [...domainsCount] + .sort((a, b) => {return b[1]-a[1]}) + .slice(0,3) + .map(domain=>domain[0]) + .join(', ') + + if (tabs.length > 3) { topDomains += '...' } + + return { + title: `${tabs.length} browser tabs: ${topDomains}`, + content: content, + clipType: 'tabs' + }; + } + + async function saveTabs() { + const tabs = await getWindowTabs(); + + const payload = await getTabsPayload(tabs); + + const resp = await triliumServerFacade.callService('POST', 'notes', payload); + + if (!resp) { + return; + } + + const tabIds = tabs.map(tab=>{return tab.id}); + + toast(`${tabs.length} links have been saved to Trilium.`, resp.noteId, tabIds); + } + + browser.contextMenus.onClicked.addListener(async function(info, tab) { + if (info.menuItemId === 'trilium-save-selection') { + await saveSelection(); + } + else if (info.menuItemId === 'trilium-save-cropped-screenshot') { + await saveCroppedScreenshot(info.pageUrl); + } + else if (info.menuItemId === 'trilium-save-whole-screenshot') { + await saveWholeScreenshot(info.pageUrl); + } + else if (info.menuItemId === 'trilium-save-image') { + await saveImage(info.srcUrl, info.pageUrl); + } + else if (info.menuItemId === 'trilium-save-link') { + const link = document.createElement("a"); + link.href = info.linkUrl; + // linkText might be available only in firefox + link.appendChild(document.createTextNode(info.linkText || info.linkUrl)); + + const activeTab = await getActiveTab(); + + const resp = await triliumServerFacade.callService('POST', 'clippings', { + title: activeTab.title, + content: link.outerHTML, + pageUrl: info.pageUrl + }); + + if (!resp) { + return; + } + + toast("Link has been saved to Trilium.", resp.noteId); + } + else if (info.menuItemId === 'trilium-save-page') { + await saveWholePage(); + } + else { + console.log("Unrecognized menuItemId", info.menuItemId); + } + }); + + browser.runtime.onMessage.addListener(async request => { + console.log("Received", request); + + if (request.name === 'openNoteInTrilium') { + const resp = await triliumServerFacade.callService('POST', 'open/' + request.noteId); + + if (!resp) { + return; + } + + // desktop app is not available so we need to open in browser + if (resp.result === 'open-in-browser') { + const {triliumServerUrl} = await browser.storage.sync.get("triliumServerUrl"); + + if (triliumServerUrl) { + const noteUrl = triliumServerUrl + '/#' + request.noteId; + + console.log("Opening new tab in browser", noteUrl); + + browser.tabs.create({ + url: noteUrl + }); + } + else { + console.error("triliumServerUrl not found in local storage."); + } + } + } + else if (request.name === 'closeTabs') { + return await browser.tabs.remove(request.tabIds) + } + else if (request.name === 'load-script') { + return await browser.tabs.executeScript({file: request.file}); + } + else if (request.name === 'save-cropped-screenshot') { + const activeTab = await getActiveTab(); + + return await saveCroppedScreenshot(activeTab.url); + } + else if (request.name === 'save-whole-screenshot') { + const activeTab = await getActiveTab(); + + return await saveWholeScreenshot(activeTab.url); + } + else if (request.name === 'save-whole-page') { + return await saveWholePage(); + } + else if (request.name === 'save-link-with-note') { + return await saveLinkWithNote(request.title, request.content); + } + else if (request.name === 'save-tabs') { + return await saveTabs(); + } + else if (request.name === 'trigger-trilium-search') { + triliumServerFacade.triggerSearchForTrilium(); + } + else if (request.name === 'send-trilium-search-status') { + triliumServerFacade.sendTriliumSearchStatusToPopup(); + } + else if (request.name === 'trigger-trilium-search-note-url') { + const activeTab = await getActiveTab(); + triliumServerFacade.triggerSearchNoteByUrl(activeTab.url); + } + }); }); diff --git a/apps/web-clipper/entrypoints/content/index.js b/apps/web-clipper/entrypoints/content/index.js index faacfa5464..c6ba6c438c 100644 --- a/apps/web-clipper/entrypoints/content/index.js +++ b/apps/web-clipper/entrypoints/content/index.js @@ -1,351 +1,358 @@ -function absoluteUrl(url) { - if (!url) { - return url; - } - - const protocol = url.toLowerCase().split(':')[0]; - if (['http', 'https', 'file'].indexOf(protocol) >= 0) { - return url; - } - - if (url.indexOf('//') === 0) { - return location.protocol + url; - } else if (url[0] === '/') { - return location.protocol + '//' + location.host + url; - } else { - return getBaseUrl() + '/' + url; - } -} - -function pageTitle() { - const titleElements = document.getElementsByTagName("title"); - - return titleElements.length ? titleElements[0].text.trim() : document.title.trim(); -} - -function getReadableDocument() { - // Readability directly change the passed document, so clone to preserve the original web page. - const documentCopy = document.cloneNode(true); - const readability = new Readability(documentCopy, { - serializer: el => el // so that .content is returned as DOM element instead of HTML - }); - - const article = readability.parse(); - - if (!article) { - throw new Error('Could not parse HTML document with Readability'); - } - - return { - title: article.title, - body: article.content, - } -} - -function getDocumentDates() { - var dates = { - publishedDate: null, - modifiedDate: null, - }; - - const articlePublishedTime = document.querySelector("meta[property='article:published_time']"); - if (articlePublishedTime && articlePublishedTime.getAttribute('content')) { - dates.publishedDate = new Date(articlePublishedTime.getAttribute('content')); - } - - const articleModifiedTime = document.querySelector("meta[property='article:modified_time']"); - if (articleModifiedTime && articleModifiedTime.getAttribute('content')) { - dates.modifiedDate = new Date(articleModifiedTime.getAttribute('content')); - } - - // TODO: if we didn't get dates from meta, then try to get them from JSON-LD - - return dates; -} - -function getRectangleArea() { - return new Promise((resolve, reject) => { - const overlay = document.createElement('div'); - overlay.style.opacity = '0.6'; - overlay.style.background = 'black'; - overlay.style.width = '100%'; - overlay.style.height = '100%'; - overlay.style.zIndex = 99999999; - overlay.style.top = 0; - overlay.style.left = 0; - overlay.style.position = 'fixed'; - - document.body.appendChild(overlay); - - const messageComp = document.createElement('div'); - - const messageCompWidth = 300; - messageComp.setAttribute("tabindex", "0"); // so that it can be focused - messageComp.style.position = 'fixed'; - messageComp.style.opacity = '0.95'; - messageComp.style.fontSize = '14px'; - messageComp.style.width = messageCompWidth + 'px'; - messageComp.style.maxWidth = messageCompWidth + 'px'; - messageComp.style.border = '1px solid black'; - messageComp.style.background = 'white'; - messageComp.style.color = 'black'; - messageComp.style.top = '10px'; - messageComp.style.textAlign = 'center'; - messageComp.style.padding = '10px'; - messageComp.style.left = Math.round(document.body.clientWidth / 2 - messageCompWidth / 2) + 'px'; - messageComp.style.zIndex = overlay.style.zIndex + 1; - - messageComp.textContent = 'Drag and release to capture a screenshot'; - - document.body.appendChild(messageComp); - - const selection = document.createElement('div'); - selection.style.opacity = '0.5'; - selection.style.border = '1px solid red'; - selection.style.background = 'white'; - selection.style.border = '2px solid black'; - selection.style.zIndex = overlay.style.zIndex - 1; - selection.style.top = 0; - selection.style.left = 0; - selection.style.position = 'fixed'; - - document.body.appendChild(selection); - - messageComp.focus(); // we listen on keypresses on this element to cancel on escape - - let isDragging = false; - let draggingStartPos = null; - let selectionArea = {}; - - function updateSelection() { - selection.style.left = selectionArea.x + 'px'; - selection.style.top = selectionArea.y + 'px'; - selection.style.width = selectionArea.width + 'px'; - selection.style.height = selectionArea.height + 'px'; - } - - function setSelectionSizeFromMouse(event) { - if (event.clientX < draggingStartPos.x) { - selectionArea.x = event.clientX; - } - - if (event.clientY < draggingStartPos.y) { - selectionArea.y = event.clientY; - } - - selectionArea.width = Math.max(1, Math.abs(event.clientX - draggingStartPos.x)); - selectionArea.height = Math.max(1, Math.abs(event.clientY - draggingStartPos.y)); - updateSelection(); - } - - function selection_mouseDown(event) { - selectionArea = {x: event.clientX, y: event.clientY, width: 0, height: 0}; - draggingStartPos = {x: event.clientX, y: event.clientY}; - isDragging = true; - updateSelection(); - } - - function selection_mouseMove(event) { - if (!isDragging) return; - setSelectionSizeFromMouse(event); - } - - function removeOverlay() { - isDragging = false; - - overlay.removeEventListener('mousedown', selection_mouseDown); - overlay.removeEventListener('mousemove', selection_mouseMove); - overlay.removeEventListener('mouseup', selection_mouseUp); - - document.body.removeChild(overlay); - document.body.removeChild(selection); - document.body.removeChild(messageComp); - } - - function selection_mouseUp(event) { - setSelectionSizeFromMouse(event); - - removeOverlay(); - - console.info('selectionArea:', selectionArea); - - if (!selectionArea || !selectionArea.width || !selectionArea.height) { - return; - } - - // Need to wait a bit before taking the screenshot to make sure - // the overlays have been removed and don't appear in the - // screenshot. 10ms is not enough. - setTimeout(() => resolve(selectionArea), 100); - } - - function cancel(event) { - if (event.key === "Escape") { - removeOverlay(); - } - } - - overlay.addEventListener('mousedown', selection_mouseDown); - overlay.addEventListener('mousemove', selection_mouseMove); - overlay.addEventListener('mouseup', selection_mouseUp); - overlay.addEventListener('mouseup', selection_mouseUp); - messageComp.addEventListener('keydown', cancel); - }); -} - -function makeLinksAbsolute(container) { - for (const link of container.getElementsByTagName('a')) { - if (link.href) { - link.href = absoluteUrl(link.href); - } - } -} - -function getImages(container) { - const images = []; - - for (const img of container.getElementsByTagName('img')) { - if (!img.src) { - continue; - } - - const existingImage = images.find(image => image.src === img.src); - - if (existingImage) { - img.src = existingImage.imageId; - } - else { - const imageId = randomString(20); - - images.push({ - imageId: imageId, - src: img.src - }); - - img.src = imageId; - } - } - - return images; -} - -function createLink(clickAction, text, color = "lightskyblue") { - const link = document.createElement('a'); - link.href = "javascript:"; - link.style.color = color; - link.appendChild(document.createTextNode(text)); - link.addEventListener("click", () => { - browser.runtime.sendMessage(null, clickAction) - }); - - return link -} - -async function prepareMessageResponse(message) { - console.info('Message: ' + message.name); - - if (message.name === "toast") { - let messageText; - - if (message.noteId) { - messageText = document.createElement('p'); - messageText.setAttribute("style", "padding: 0; margin: 0; font-size: larger;") - messageText.appendChild(document.createTextNode(message.message + " ")); - messageText.appendChild(createLink( - {name: 'openNoteInTrilium', noteId: message.noteId}, - "Open in Trilium." - )); - - // only after saving tabs - if (message.tabIds) { - messageText.appendChild(document.createElement("br")); - messageText.appendChild(createLink( - {name: 'closeTabs', tabIds: message.tabIds}, - "Close saved tabs.", - "tomato" - )); - } - } - else { - messageText = message.message; - } - - await requireLib('/lib/toast.js'); - - showToast(messageText, { - settings: { - duration: 7000 - } - }); - } - else if (message.name === "trilium-save-selection") { - const container = document.createElement('div'); - - const selection = window.getSelection(); - - for (let i = 0; i < selection.rangeCount; i++) { - const range = selection.getRangeAt(i); - - container.appendChild(range.cloneContents()); - } - - makeLinksAbsolute(container); - - const images = getImages(container); - - return { - title: pageTitle(), - content: container.innerHTML, - images: images, - pageUrl: getPageLocationOrigin() + location.pathname + location.search + location.hash - }; - - } - else if (message.name === 'trilium-get-rectangle-for-screenshot') { - return getRectangleArea(); - } - else if (message.name === "trilium-save-page") { - await requireLib("/lib/JSDOMParser.js"); - await requireLib("/lib/Readability.js"); - await requireLib("/lib/Readability-readerable.js"); - - const {title, body} = getReadableDocument(); - - makeLinksAbsolute(body); - - const images = getImages(body); - - var labels = {}; - const dates = getDocumentDates(); - if (dates.publishedDate) { - labels['publishedDate'] = dates.publishedDate.toISOString().substring(0, 10); - } - if (dates.modifiedDate) { - labels['modifiedDate'] = dates.publishedDate.toISOString().substring(0, 10); - } - - return { - title: title, - content: body.innerHTML, - images: images, - pageUrl: getPageLocationOrigin() + location.pathname + location.search, - clipType: 'page', - labels: labels - }; - } - else { - throw new Error('Unknown command: ' + JSON.stringify(message)); - } -} - -browser.runtime.onMessage.addListener(prepareMessageResponse); - -const loadedLibs = []; - -async function requireLib(libPath) { - if (!loadedLibs.includes(libPath)) { - loadedLibs.push(libPath); - - await browser.runtime.sendMessage({name: 'load-script', file: libPath}); - } -} +export default defineContentScript({ + matches: [ + "" + ], + main: () => { + function absoluteUrl(url) { + if (!url) { + return url; + } + + const protocol = url.toLowerCase().split(':')[0]; + if (['http', 'https', 'file'].indexOf(protocol) >= 0) { + return url; + } + + if (url.indexOf('//') === 0) { + return location.protocol + url; + } else if (url[0] === '/') { + return location.protocol + '//' + location.host + url; + } else { + return getBaseUrl() + '/' + url; + } + } + + function pageTitle() { + const titleElements = document.getElementsByTagName("title"); + + return titleElements.length ? titleElements[0].text.trim() : document.title.trim(); + } + + function getReadableDocument() { + // Readability directly change the passed document, so clone to preserve the original web page. + const documentCopy = document.cloneNode(true); + const readability = new Readability(documentCopy, { + serializer: el => el // so that .content is returned as DOM element instead of HTML + }); + + const article = readability.parse(); + + if (!article) { + throw new Error('Could not parse HTML document with Readability'); + } + + return { + title: article.title, + body: article.content, + } + } + + function getDocumentDates() { + var dates = { + publishedDate: null, + modifiedDate: null, + }; + + const articlePublishedTime = document.querySelector("meta[property='article:published_time']"); + if (articlePublishedTime && articlePublishedTime.getAttribute('content')) { + dates.publishedDate = new Date(articlePublishedTime.getAttribute('content')); + } + + const articleModifiedTime = document.querySelector("meta[property='article:modified_time']"); + if (articleModifiedTime && articleModifiedTime.getAttribute('content')) { + dates.modifiedDate = new Date(articleModifiedTime.getAttribute('content')); + } + + // TODO: if we didn't get dates from meta, then try to get them from JSON-LD + + return dates; + } + + function getRectangleArea() { + return new Promise((resolve, reject) => { + const overlay = document.createElement('div'); + overlay.style.opacity = '0.6'; + overlay.style.background = 'black'; + overlay.style.width = '100%'; + overlay.style.height = '100%'; + overlay.style.zIndex = 99999999; + overlay.style.top = 0; + overlay.style.left = 0; + overlay.style.position = 'fixed'; + + document.body.appendChild(overlay); + + const messageComp = document.createElement('div'); + + const messageCompWidth = 300; + messageComp.setAttribute("tabindex", "0"); // so that it can be focused + messageComp.style.position = 'fixed'; + messageComp.style.opacity = '0.95'; + messageComp.style.fontSize = '14px'; + messageComp.style.width = messageCompWidth + 'px'; + messageComp.style.maxWidth = messageCompWidth + 'px'; + messageComp.style.border = '1px solid black'; + messageComp.style.background = 'white'; + messageComp.style.color = 'black'; + messageComp.style.top = '10px'; + messageComp.style.textAlign = 'center'; + messageComp.style.padding = '10px'; + messageComp.style.left = Math.round(document.body.clientWidth / 2 - messageCompWidth / 2) + 'px'; + messageComp.style.zIndex = overlay.style.zIndex + 1; + + messageComp.textContent = 'Drag and release to capture a screenshot'; + + document.body.appendChild(messageComp); + + const selection = document.createElement('div'); + selection.style.opacity = '0.5'; + selection.style.border = '1px solid red'; + selection.style.background = 'white'; + selection.style.border = '2px solid black'; + selection.style.zIndex = overlay.style.zIndex - 1; + selection.style.top = 0; + selection.style.left = 0; + selection.style.position = 'fixed'; + + document.body.appendChild(selection); + + messageComp.focus(); // we listen on keypresses on this element to cancel on escape + + let isDragging = false; + let draggingStartPos = null; + let selectionArea = {}; + + function updateSelection() { + selection.style.left = selectionArea.x + 'px'; + selection.style.top = selectionArea.y + 'px'; + selection.style.width = selectionArea.width + 'px'; + selection.style.height = selectionArea.height + 'px'; + } + + function setSelectionSizeFromMouse(event) { + if (event.clientX < draggingStartPos.x) { + selectionArea.x = event.clientX; + } + + if (event.clientY < draggingStartPos.y) { + selectionArea.y = event.clientY; + } + + selectionArea.width = Math.max(1, Math.abs(event.clientX - draggingStartPos.x)); + selectionArea.height = Math.max(1, Math.abs(event.clientY - draggingStartPos.y)); + updateSelection(); + } + + function selection_mouseDown(event) { + selectionArea = {x: event.clientX, y: event.clientY, width: 0, height: 0}; + draggingStartPos = {x: event.clientX, y: event.clientY}; + isDragging = true; + updateSelection(); + } + + function selection_mouseMove(event) { + if (!isDragging) return; + setSelectionSizeFromMouse(event); + } + + function removeOverlay() { + isDragging = false; + + overlay.removeEventListener('mousedown', selection_mouseDown); + overlay.removeEventListener('mousemove', selection_mouseMove); + overlay.removeEventListener('mouseup', selection_mouseUp); + + document.body.removeChild(overlay); + document.body.removeChild(selection); + document.body.removeChild(messageComp); + } + + function selection_mouseUp(event) { + setSelectionSizeFromMouse(event); + + removeOverlay(); + + console.info('selectionArea:', selectionArea); + + if (!selectionArea || !selectionArea.width || !selectionArea.height) { + return; + } + + // Need to wait a bit before taking the screenshot to make sure + // the overlays have been removed and don't appear in the + // screenshot. 10ms is not enough. + setTimeout(() => resolve(selectionArea), 100); + } + + function cancel(event) { + if (event.key === "Escape") { + removeOverlay(); + } + } + + overlay.addEventListener('mousedown', selection_mouseDown); + overlay.addEventListener('mousemove', selection_mouseMove); + overlay.addEventListener('mouseup', selection_mouseUp); + overlay.addEventListener('mouseup', selection_mouseUp); + messageComp.addEventListener('keydown', cancel); + }); + } + + function makeLinksAbsolute(container) { + for (const link of container.getElementsByTagName('a')) { + if (link.href) { + link.href = absoluteUrl(link.href); + } + } + } + + function getImages(container) { + const images = []; + + for (const img of container.getElementsByTagName('img')) { + if (!img.src) { + continue; + } + + const existingImage = images.find(image => image.src === img.src); + + if (existingImage) { + img.src = existingImage.imageId; + } + else { + const imageId = randomString(20); + + images.push({ + imageId: imageId, + src: img.src + }); + + img.src = imageId; + } + } + + return images; + } + + function createLink(clickAction, text, color = "lightskyblue") { + const link = document.createElement('a'); + link.href = "javascript:"; + link.style.color = color; + link.appendChild(document.createTextNode(text)); + link.addEventListener("click", () => { + browser.runtime.sendMessage(null, clickAction) + }); + + return link + } + + async function prepareMessageResponse(message) { + console.info('Message: ' + message.name); + + if (message.name === "toast") { + let messageText; + + if (message.noteId) { + messageText = document.createElement('p'); + messageText.setAttribute("style", "padding: 0; margin: 0; font-size: larger;") + messageText.appendChild(document.createTextNode(message.message + " ")); + messageText.appendChild(createLink( + {name: 'openNoteInTrilium', noteId: message.noteId}, + "Open in Trilium." + )); + + // only after saving tabs + if (message.tabIds) { + messageText.appendChild(document.createElement("br")); + messageText.appendChild(createLink( + {name: 'closeTabs', tabIds: message.tabIds}, + "Close saved tabs.", + "tomato" + )); + } + } + else { + messageText = message.message; + } + + await requireLib('/lib/toast.js'); + + showToast(messageText, { + settings: { + duration: 7000 + } + }); + } + else if (message.name === "trilium-save-selection") { + const container = document.createElement('div'); + + const selection = window.getSelection(); + + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + + container.appendChild(range.cloneContents()); + } + + makeLinksAbsolute(container); + + const images = getImages(container); + + return { + title: pageTitle(), + content: container.innerHTML, + images: images, + pageUrl: getPageLocationOrigin() + location.pathname + location.search + location.hash + }; + + } + else if (message.name === 'trilium-get-rectangle-for-screenshot') { + return getRectangleArea(); + } + else if (message.name === "trilium-save-page") { + await requireLib("/lib/JSDOMParser.js"); + await requireLib("/lib/Readability.js"); + await requireLib("/lib/Readability-readerable.js"); + + const {title, body} = getReadableDocument(); + + makeLinksAbsolute(body); + + const images = getImages(body); + + var labels = {}; + const dates = getDocumentDates(); + if (dates.publishedDate) { + labels['publishedDate'] = dates.publishedDate.toISOString().substring(0, 10); + } + if (dates.modifiedDate) { + labels['modifiedDate'] = dates.publishedDate.toISOString().substring(0, 10); + } + + return { + title: title, + content: body.innerHTML, + images: images, + pageUrl: getPageLocationOrigin() + location.pathname + location.search, + clipType: 'page', + labels: labels + }; + } + else { + throw new Error('Unknown command: ' + JSON.stringify(message)); + } + } + + const loadedLibs = []; + + async function requireLib(libPath) { + if (!loadedLibs.includes(libPath)) { + loadedLibs.push(libPath); + + await browser.runtime.sendMessage({name: 'load-script', file: libPath}); + } + } + + browser.runtime.onMessage.addListener(prepareMessageResponse); + } +}); diff --git a/apps/web-clipper/manifest.json b/apps/web-clipper/manifest.json index 8e0c1ba2bc..70da3d1b1b 100644 --- a/apps/web-clipper/manifest.json +++ b/apps/web-clipper/manifest.json @@ -26,9 +26,6 @@ }, "content_scripts": [ { - "matches": [ - "" - ], "js": [ "lib/browser-polyfill.js", "utils.js" From ab95f6dcc2e086ad08367f28ecd03fbbcb0dea1c Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 10:08:29 +0200 Subject: [PATCH 058/316] fix(web-clipper): script imports --- apps/web-clipper/entrypoints/options/index.html | 6 +++--- apps/web-clipper/entrypoints/popup/index.html | 10 +++++----- apps/web-clipper/entrypoints/popup/popup.js | 4 +++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/apps/web-clipper/entrypoints/options/index.html b/apps/web-clipper/entrypoints/options/index.html index 2363567a5e..16e084ded9 100644 --- a/apps/web-clipper/entrypoints/options/index.html +++ b/apps/web-clipper/entrypoints/options/index.html @@ -54,9 +54,9 @@

Note that the entered password is not stored anywhere, it will be only used to retrieve an authorization token from the server instance which will be then used to send the clipped notes.

- - - + + + diff --git a/apps/web-clipper/entrypoints/popup/index.html b/apps/web-clipper/entrypoints/popup/index.html index be415744ca..7bd985801f 100644 --- a/apps/web-clipper/entrypoints/popup/index.html +++ b/apps/web-clipper/entrypoints/popup/index.html @@ -46,11 +46,11 @@
Status: unknown
- - - - - + + + + + diff --git a/apps/web-clipper/entrypoints/popup/popup.js b/apps/web-clipper/entrypoints/popup/popup.js index adac36126e..eca8d790e1 100644 --- a/apps/web-clipper/entrypoints/popup/popup.js +++ b/apps/web-clipper/entrypoints/popup/popup.js @@ -1,3 +1,5 @@ +console.log("Popup script loaded"); + async function sendMessage(message) { try { return await browser.runtime.sendMessage(message); @@ -164,7 +166,7 @@ browser.runtime.onMessage.addListener(request => { }else{ $alreadyVisited.html(''); } - + } }); From 22308a101e9b6511cc02a7957d6dca7e955119ed Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 10:18:59 +0200 Subject: [PATCH 059/316] fix(web-clipper): missing permissions --- apps/web-clipper/manifest.json | 9 --------- apps/web-clipper/wxt.config.js | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 apps/web-clipper/wxt.config.js diff --git a/apps/web-clipper/manifest.json b/apps/web-clipper/manifest.json index 70da3d1b1b..fc7e5b9213 100644 --- a/apps/web-clipper/manifest.json +++ b/apps/web-clipper/manifest.json @@ -10,15 +10,6 @@ "48": "icons/48.png", "96": "icons/96.png" }, - "permissions": [ - "activeTab", - "tabs", - "http://*/", - "https://*/", - "", - "storage", - "contextMenus" - ], "browser_action": { "default_icon": "icons/32.png", "default_title": "Trilium Web Clipper", diff --git a/apps/web-clipper/wxt.config.js b/apps/web-clipper/wxt.config.js new file mode 100644 index 0000000000..5dd59801a1 --- /dev/null +++ b/apps/web-clipper/wxt.config.js @@ -0,0 +1,15 @@ +import { defineConfig } from "vite"; + +export default defineConfig({ + manifest: { + permissions: [ + "activeTab", + "tabs", + "http://*/", + "https://*/", + "", + "storage", + "contextMenus" + ] + } +}); From 957590523c3e16a8dd77958d21d2a07eb47475e2 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 10:23:56 +0200 Subject: [PATCH 060/316] fix(web-clipper): integrate trilium server facade --- apps/web-clipper/entrypoints/background/index.js | 4 ++++ .../{ => entrypoints/background}/trilium_server_facade.js | 6 ++---- apps/web-clipper/entrypoints/popup/popup.js | 1 + apps/web-clipper/manifest.json | 3 +-- 4 files changed, 8 insertions(+), 6 deletions(-) rename apps/web-clipper/{ => entrypoints/background}/trilium_server_facade.js (98%) diff --git a/apps/web-clipper/entrypoints/background/index.js b/apps/web-clipper/entrypoints/background/index.js index ee92f709a5..b92bfdb724 100644 --- a/apps/web-clipper/entrypoints/background/index.js +++ b/apps/web-clipper/entrypoints/background/index.js @@ -1,4 +1,8 @@ +import TriliumServerFacade, { isDevEnv } from "./trilium_server_facade"; + export default defineBackground(() => { + const triliumServerFacade = new TriliumServerFacade(); + // Keyboard shortcuts chrome.commands.onCommand.addListener(async function (command) { if (command == "saveSelection") { diff --git a/apps/web-clipper/trilium_server_facade.js b/apps/web-clipper/entrypoints/background/trilium_server_facade.js similarity index 98% rename from apps/web-clipper/trilium_server_facade.js rename to apps/web-clipper/entrypoints/background/trilium_server_facade.js index 6f46893e50..b53b548475 100644 --- a/apps/web-clipper/trilium_server_facade.js +++ b/apps/web-clipper/entrypoints/background/trilium_server_facade.js @@ -1,12 +1,12 @@ const PROTOCOL_VERSION_MAJOR = 1; -function isDevEnv() { +export function isDevEnv() { const manifest = browser.runtime.getManifest(); return manifest.name.endsWith('(dev)'); } -class TriliumServerFacade { +export default class TriliumServerFacade { constructor() { this.triggerSearchForTrilium(); @@ -221,5 +221,3 @@ class TriliumServerFacade { (absoff % 60).toString().padStart(2,'0')); } } - -window.triliumServerFacade = new TriliumServerFacade(); diff --git a/apps/web-clipper/entrypoints/popup/popup.js b/apps/web-clipper/entrypoints/popup/popup.js index eca8d790e1..be571e428a 100644 --- a/apps/web-clipper/entrypoints/popup/popup.js +++ b/apps/web-clipper/entrypoints/popup/popup.js @@ -2,6 +2,7 @@ console.log("Popup script loaded"); async function sendMessage(message) { try { + console.log("Sending message", message); return await browser.runtime.sendMessage(message); } catch (e) { diff --git a/apps/web-clipper/manifest.json b/apps/web-clipper/manifest.json index fc7e5b9213..2a7b80fb41 100644 --- a/apps/web-clipper/manifest.json +++ b/apps/web-clipper/manifest.json @@ -26,8 +26,7 @@ "background": { "scripts": [ "lib/browser-polyfill.js", - "utils.js", - "trilium_server_facade.js" + "utils.js" ] }, "commands": { From a9218960e964dcb7baf7da68858ebe3129f43dc7 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 10:40:16 +0200 Subject: [PATCH 061/316] fix(web-clipper): the storage API will not work with a temporary addon ID --- apps/web-clipper/manifest.json | 7 +------ apps/web-clipper/wxt.config.js | 7 ++++++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/web-clipper/manifest.json b/apps/web-clipper/manifest.json index 2a7b80fb41..59a693e370 100644 --- a/apps/web-clipper/manifest.json +++ b/apps/web-clipper/manifest.json @@ -48,10 +48,5 @@ "default": "Ctrl+Shift+E" } } - }, - "browser_specific_settings": { - "gecko": { - "id": "{1410742d-b377-40e7-a9db-63dc9c6ec99c}" - } - } + } } diff --git a/apps/web-clipper/wxt.config.js b/apps/web-clipper/wxt.config.js index 5dd59801a1..f33731423a 100644 --- a/apps/web-clipper/wxt.config.js +++ b/apps/web-clipper/wxt.config.js @@ -10,6 +10,11 @@ export default defineConfig({ "", "storage", "contextMenus" - ] + ], + browser_specific_settings: { + gecko: { + id: "{1410742d-b377-40e7-a9db-63dc9c6ec99c}" + } + } } }); From 276b3f834bd38a5d4df3391d0943290b6b51b5ad Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 10:47:41 +0200 Subject: [PATCH 062/316] fix(web-clipper): triliumServerFacade is not defined --- .../web-clipper/entrypoints/background/trilium_server_facade.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web-clipper/entrypoints/background/trilium_server_facade.js b/apps/web-clipper/entrypoints/background/trilium_server_facade.js index b53b548475..b1a56a7ec4 100644 --- a/apps/web-clipper/entrypoints/background/trilium_server_facade.js +++ b/apps/web-clipper/entrypoints/background/trilium_server_facade.js @@ -132,7 +132,7 @@ export default class TriliumServerFacade { } async triggerSearchNoteByUrl(noteUrl) { - const resp = await triliumServerFacade.callService('GET', 'notes-by-url/' + encodeURIComponent(noteUrl)) + const resp = await this.callService('GET', 'notes-by-url/' + encodeURIComponent(noteUrl)) let newStatus = { status: 'not-found', noteId: null From 17f906fb65e3eaf729fd2b423e98790e65078f4d Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 10:58:20 +0200 Subject: [PATCH 063/316] chore(web-clipper): reintegrate icon --- .../{icons/96.png => assets/icon.png} | Bin apps/web-clipper/icons/32-dev.png | Bin 6518 -> 0 bytes apps/web-clipper/icons/32.png | Bin 1153 -> 0 bytes apps/web-clipper/icons/48.png | Bin 1654 -> 0 bytes apps/web-clipper/wxt.config.js | 1 + pnpm-lock.yaml | 299 +++++++++++++++++- 6 files changed, 298 insertions(+), 2 deletions(-) rename apps/web-clipper/{icons/96.png => assets/icon.png} (100%) delete mode 100644 apps/web-clipper/icons/32-dev.png delete mode 100644 apps/web-clipper/icons/32.png delete mode 100644 apps/web-clipper/icons/48.png diff --git a/apps/web-clipper/icons/96.png b/apps/web-clipper/assets/icon.png similarity index 100% rename from apps/web-clipper/icons/96.png rename to apps/web-clipper/assets/icon.png diff --git a/apps/web-clipper/icons/32-dev.png b/apps/web-clipper/icons/32-dev.png deleted file mode 100644 index d280a31bbd185a74c85c57fc1becaa380bb13219..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6518 zcmeHKcT|&E(@*GKn$jf(q#Du_5(Po}BE1C^Ar&Hogd{-30tnJXKyeiWDJtqp6A=VO zfkjjhL`6kWiiizSq$nuueS)s*p6~r<&-vc}%sEezJ9p+cGrv2}y>rvtT^;0QG-W^_ zki3(lttapc5k689z&9^8b{Yhd^p5o=@jb~g5Du5kV20Bn{2d%Rgf3t*Kp;V1Ey@3g zp0V8gYgL}ubpvyS{DFL}&Iv=YhR0@pQBj{V`hVBYRrO4&3r8<~+0q#_Td!R%eUN8j z?7wT1beqpJ+Lev0!1m;*K;4-6q%S>}8}@KWlj;kFN2XHJqMr32;WyXtKWr2~j`xmK z8`s@#@#yJP?0T`w^CoZZHuqRQ$$XJulO2;{Pwt*8@i56N+N`x;PSAG#vM5^^n4V@n zq**|B6`y(Xq`8@Q_QWB#1A@T<+1K;WMvHUu3me-WemP$|{ng>xuv=BGR*acl5T`cG zbTjyO*L|J@g>#=prj+uvPP$nRBHwXxUP`Ei9UW6!s{gRn6u4>Mn3Mu9I>Dqa)Y zjz-1lyePzU%(Q>-(1Z9ChVKdXq0tUD;PTyV_IABRjAH2hWUAN2M^x#c8$s7Cs@N^~ zr`y+W4N-rp?qh)Et{0B zox9hg269^V&CM+3cP+tN5h3a%)>CM}si&73C(G~YPRK_);3v$*K+po661idHY?l$e zwHL;;Rlqmp_LyKCK$q=LtF*n5xX5pr6XRZpb!|g$4y)Q90oU8PH}y?UhDBzhjtnzELK9(sy zLE;*h`f3NPX&8Q+u2YNa-6adFdr<$V8IWuT%?*=ACtZ(m zN;Mb-%*oE0P7@AxLRtSeIAnL-JXq6x-I0e-~v!NIZ;0s2emG@grl7uV#K<`ij{g@Hu4v`jNkdDC4d>izR}cc>QL+JbY`czbxsL}$vc;gvt4 zFAw&`r_y3=+2pgfreh(CQbncLFCNdqvmQNqT42*1!5s0w;`YFPzw(yOIfC)XJo6 zuGgr>b+&Q*zV!jv@VjE8REo?q_uXqZnO^UZw9G%|?*4Io{{7zyW6SfEZpz@L<4w|D z-@9~9+@SvvJky7lUwT^BU`l*X_sP-fv2A#2G|P5)WI%sdzh}MMV}0e%=#Ljlo9hN@ z4`Y2Y6wb>`NjXBP!-H0Rpz7UHRg&^`&Toncw`H{zQyNW3i=dQ-iTY0icz4yu)TPPU z;GJQ-bqYl-}Z~ zm7cs;u0jg;c1f^|Y0Z3dICe$f!uGA1anEbnhf?OGLlMp7;`gtslxAz6zY4oOsJYlN z##QCr6Wg%WR4Z#F3*@XB94Ve_6R#s^^!ju)L{zNFvm~JDfCIr`qzy~x@{id237oU} z;kkzrorlt8&eGkU!antJN>4I9P=g`3X3K+ahTCcw`*qq4p>CZbmLa2H7WUlQbMKt0 z9;ChcBHP)eamcW&(!@9ERKiflg~YJ(q2EmFK`)Mr94g|Kg${(g(7WM2b?>yS`o42_ z8#~;!`#y5K90)Ui5Hw=(DqDJIl>2t9gO(_%*1TH{>#?|TeEe|p#nF!A(jkMN(5&e8p#ZA8!1v&&3fenQKl?SrSGP_;(`9j6LT@BWsD8+tG6;|fauhQ^%)#qPH?+nCiX0{m3 zdpuyi(7auF$)P@tKCPEq)DoI074Nodvtkqa*rko@juE@C3f{X{bD|4Znz?JoLIu^X zE6$W1(b`sHIf1GTxkB_@H~cB9dC&T7XWx=0{#=(z4^bTabL>xvN(kYA-c<2tnYeVV zyOz9QwS|p!?B2zoj7yM$ZM{hOsZ_$%49wneD9gBHCQgB%`SbhalFBP>NR`KQ!P2&fOCUZJ29o9sid0Og3&F^vH53r ze5?loG(zd7jgF8lD>=46Q;>?Bl+x?z8J1ayLDo{n|KSbfXPP}$NoR>L~ym#TQ(xz>nR;$rc!R$#82%N;U zv2k~@vH9yj2iz3wK4{_CYNeh$SofQqsRBbWQi^nZU23}d_Lb@GYaYl{5OcSFm2}ZO zq^jo7Qad!%O?lYT=Il#>XMj# zoL5?XZhK|=bH8b;VnQN0&;Le&{@Um3uYFJ&nhVSb`O>>Uh<#Yl79a1p;kI0l!2qOi z;G+DUx$7dP9VQcmiCiZ&{XHX>hbOdN@4anZXq@}@!G>z9b*uVFOsX#iJ8V3B_T1aU zx}Ab@?!a*Q?`7pX+!p_IbPe)8NU&=y7=F6jCH9Cc(Zd@>-V8nMjeO!UWT+FRLCT ze^T2p5hGJ(TGf%cXn8x_VP%!>9xr zbfcxr1_2QOVA1(xh=3Iy!6OPRpv$;K;J;7|heDQB_+b`Ml8ZaUhRvlzFlHDt1k6sr zj7C8%Wgr{4GzQVr*8V#LFtUJ#^7$Mh93B%BV-|xpV{=2`NCJTXN1)&+6b#US@peS; z$pTmePfrN(4a1hsqjG_AX0jt7LQFD+9mThRLVV>WC9FBp&(!cJOu|sG7vZh zf{JHg(TJa*oFaI9as-twgaW|Lm;eryfTNfrDHIrjfkDAA3_JryMxucs3P+()X&3?y zi~R}0jmre8k{teXR6-~k0ENQg%qe6%1%{zv=`f5riVPzY5L6f*K{iLCa2Pb!oUsf= zqY~}eToxHvP9}>SLWgrALY60lgcGgZoh+azvu}YfOWecBddj=) zz4&Ayn@AiQkHH`b7#tdn0DS+gNh7max|T`>kuGQARC~7ma~BvEmLXy&sbtY=|Y|mC?pJtgrN}L zC?pX}AR=(42qY1KfWp5g3>UuDe`UM@{(m^xu&nUYHUQXtlL6Zcuv@`@Y**ho6VmuU z{Cr=F|Dgu}`j?Y`#qTe=e$n->82DGpzpCpOUH^)Kf2I7Zy8hqjlKK0>LyrKupcvpf zQ(Za?+>$^N6lVup&;*DCa^Kf876C}4Igb83;QrJre88KG@&$lUlJDeVC;3uVRdv0@ zm{j&#K%~L9Bk^t6EMeaaT5jj)G)N4S9|{q+bAAa5Y9Nq^pOdY%H>vggQR~nLR;tNO z>mJIi^0hD`*`-&yCvGzS(|%Qp4OX#qZ>ojVz$SR?_D>Knxh=6TM-sVBOdP)2mXsQM zNFt`CR5DU&|0eO;qp?zblqdTHdAATQ7cPYRCRs{#b}mgW#tk&K(}MdKtC{@@B-raL z@Jzy0nGtYKvdXSIwpO(TMWEG7rE@N=(v^G{U>GO)MyD~>yjOg3C+pUD>U0&dReE%H zq*Z8xCP&^}GF%aC7PfLH;YPnJWHq=Dtfum@1?#LB5CNXeuEPYhJv#MdP~^1g(Wh4O zfPS$n2g%j0DcXN)NlMW=Mr6%LC4tOVaWk+p5;}@Z zhymf_(Z(aUlT|W0M0c0GjPR{{X*p4F{m5l1gVaQoR?KETX`lZJwsl!3y0QC73F$HzR$|bGpQ5T7H1^bSoLuBikv?*Sy*IS zIJ-s$HiHd5CDt!G-J9NH+Kd}w?HvTSN)N>FSEcrmL~w1*gBQ~+jOvD^+>c)PqGQf9 zx2_0F@d#~bZI&J~{AgA7xWc}Dr$T|qwKvxquAVtVJ~^_l8TwJA9#lNXaH!_$WG^Xq z<)v=T=w_G|drU@)E_g(la{f@$5Uj1uM~Ymc!GayP>t?jvL|1{^4X8IJ{bh4=`s{*z zTH}i^-dXI;0K6z?wm5(Y=hae|ASKG=>!F&G$I^Rtv diff --git a/apps/web-clipper/icons/32.png b/apps/web-clipper/icons/32.png deleted file mode 100644 index 9aeeb66fe96a83e3abce5748ac88862bccd738b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1153 zcmV-{1b+L8P)EX>4Tx04R}tkv&MmKpe$i(@Onlaj=7kLx$>PK~%(1t5Adrp;l;o12rOiLp`5<5%ypW>NMI35kRU=q6(y8mBSx!EiiH&I$2<6kT)#vvg=bb;{@U#SB#pQP7X zTJ#9$-v%zOTbi;5TgF}~)6010qNS#tmY z4c7nw4c7reD4Tcy000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00LP_L_t(o!|j((XcIvc#(xRb3KrBHl(oA^(FjdYC`C{s z1`pMX5<$em3f`np^i=e)2p)_FwI>gvUIYzZJh-0xb6V<3!O(-ah()22)xFe{wpbE~ zmx&D1-Hn87MCgNsnR##C_syF(^LAiO{;{OG?XXnI9|7(II~CP)V8S-NFNqK+Rr2G& z~AbmXd3C$jVf*4d5^^1MCIrw&`Vo<(PS|qrf9CBHz;900&~6?g08HbD3oz z1H6l{%h{&)p`%(La$^zL5TgF3mxDoZ6i0xn6wU9zaohA}yH<>ROB)7`0Y8BUdO2v+ ziiH=z3BWfTcWY0pVXatb0s-(6I0s-jZb!b-9f1E5&FL1n7@tX;K&@CXfc{o?E9yhN zh=3!t>mdX;Crw~TYVQfF&WY!MBoiTHo029lC$;wjD~kR{(gY4F{VPg8NR)u#xGUl> zrzO`ElZC`{z;N6W@K$u!i)z@C&pmq=)QW|(z(a*xs%NLbaNI`%@ZQ?{?!T7b6bqo- Tw838S00000NkvXXu0mjfOh^kB diff --git a/apps/web-clipper/icons/48.png b/apps/web-clipper/icons/48.png deleted file mode 100644 index da66c56f64aacdda06c4d181e9b2ee1cb174f19c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1654 zcmV-+28sEJP)EX>4Tx04R}tkv&MmKpe$i(@Onlaj=7kLx$>PK~%(1t5Adrp;l;o12rOiLp`5<5%ypW>NMI35kRU=q6(y8mBSx!EiiH&I$2<6kT)#vvg=bb;{@U#SB#pQP7X zTJ#9$-v%zOTbi;5TgF}~)6010qNS#tmY z4c7nw4c7reD4Tcy000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00d4+L_t(&-tCxOY!p=#$A7zR0i}Kv6dj$x2OyL#qHPq# zeOO~ON-AuuX|&!%O?^Pali!IGeIeslK;KMh^hMeDg@#GdfCS^JBi64Fb;Jisf-}kV z!A4Y+6xziHZsRzanVoI6>ooKvo83M4o^${Id+x`%2j*l>&Th%10YtHsTM8@(E(FE_ z7dT`J`(!E!6ic~zz*E2@zAP)=!4*++^fFB3CNU|PXT@k=zz}3MfU=Y}<8s3SB*ZG_D!Ipa+-N=*sJde9X1_NhPF5by)Q z@fyGb^tifmI7A->{##%H&0sK3D@c$v;>PnldE58Gqrn%Oaxw>NdX1^<<-&>}z zuL0f#9T4_6svqpK@7%HOwzv=5rX?kkpZ z9|Ao!fIkMT2y19|b)^;fIiPO=mdTG_egyge8+Z=r4)Hl8(}Pt3{imj|Hx)~{mw@#V zKr123`V?@vDeOv^K~^=qNz?{-&L zz5rS_cPv^f*K`YT6Rd@2F~c7Xwe$K%m>zm3^w=-2m*Bx%)lx z#@v-~$rNe&>(6X4o}J_l68d&qYmbOXC%`d5IbO<_Mfqfbg#S2}=FNKO=# zUe)k+22zS%8O=@^^)cXM;AKDMV+00*oaAjBCR@@-Km`6z#5^U7 z^(4?-hvl<4M7<=&cXQezuslSU1OA91y&z2l!V0imGBuBq`Dr5XQ;4n!_%g<3A~giG zvNbMWPC>aY#_UAePN8Qaj?1GFq${Z+pp~uXWi81sZNMAMu++0QnhVkO1Cz6YfL6AC z0j>|IFOwCFSrGxWvNbGgN&ZdU$-g!JsAD%B1SE+goT+>6ib&g?R1=swWwf$&hpY!3 z3^b3Vo`8>tqm`{r;2hvl&eT?CbWhC5oSbd)4}^9=irlz;F#rGn07*qoM6N<$f~=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/ansi@1.0.2': resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} engines: {node: '>=18'} @@ -6026,6 +6166,11 @@ packages: '@webext-core/match-patterns@1.0.3': resolution: {integrity: sha512-NY39ACqCxdKBmHgw361M9pfJma8e4AZo20w9AY+5ZjIj1W2dvXC8J31G5fjfOGbulW9w4WKpT8fPooi0mLkn9A==} + '@wxt-dev/auto-icons@1.1.0': + resolution: {integrity: sha512-lDFZjDbrY5gDaapUuUOYTPudE88oB3Z7rTdg0N7iq2WIWga1h0bhzCJDaqNqMvPN2DCYvHFfA0cnqA12vEJjiA==} + peerDependencies: + wxt: '>=0.19.0' + '@wxt-dev/browser@0.1.32': resolution: {integrity: sha512-jvfSppeLzlH4sOkIvMBJoA1pKoI+U5gTkjDwMKdkTWh0P/fj+KDyze3lzo3S6372viCm8tXUKNez+VKyVz2ZDw==} @@ -13066,6 +13211,10 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -16093,6 +16242,8 @@ snapshots: ckeditor5: 47.4.0 es-toolkit: 1.39.5 fuzzysort: 3.1.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-engine@47.4.0': dependencies: @@ -16135,6 +16286,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-export-word@47.4.0': dependencies: @@ -16225,8 +16378,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-html-embed@47.4.0': dependencies: @@ -16280,6 +16431,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-indent@47.4.0': dependencies: @@ -16393,6 +16546,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-merge-fields@47.4.0': dependencies: @@ -16405,6 +16560,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-minimap@47.4.0': dependencies: @@ -16413,6 +16570,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-operations-compressor@47.4.0': dependencies: @@ -16586,6 +16745,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-source-editing-enhanced@47.4.0': dependencies: @@ -18108,6 +18269,102 @@ snapshots: transitivePeerDependencies: - supports-color + '@img/colour@1.0.0': {} + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + '@inquirer/ansi@1.0.2': optional: true @@ -21464,6 +21721,13 @@ snapshots: '@webext-core/match-patterns@1.0.3': {} + '@wxt-dev/auto-icons@1.1.0(wxt@0.20.13(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + dependencies: + defu: 6.1.4 + fs-extra: 11.3.3 + sharp: 0.34.5 + wxt: 0.20.13(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + '@wxt-dev/browser@0.1.32': dependencies: '@types/filesystem': 0.0.36 @@ -29989,6 +30253,37 @@ snapshots: shallowequal@1.1.0: {} + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 From 5600a707d321363cc7b39288081b713cebf83bee Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 10:59:51 +0200 Subject: [PATCH 064/316] chore(web-clipper): reintegrate name and description --- apps/web-clipper/manifest.json | 2 -- apps/web-clipper/wxt.config.js | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web-clipper/manifest.json b/apps/web-clipper/manifest.json index 59a693e370..282d5230ab 100644 --- a/apps/web-clipper/manifest.json +++ b/apps/web-clipper/manifest.json @@ -1,8 +1,6 @@ { "manifest_version": 2, - "name": "Trilium Web Clipper (dev)", "version": "1.0.1", - "description": "Save web clippings to Trilium Notes.", "homepage_url": "https://github.com/zadam/trilium-web-clipper", "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", "icons": { diff --git a/apps/web-clipper/wxt.config.js b/apps/web-clipper/wxt.config.js index 298165d8c5..ec61bac134 100644 --- a/apps/web-clipper/wxt.config.js +++ b/apps/web-clipper/wxt.config.js @@ -3,6 +3,8 @@ import { defineConfig } from "vite"; export default defineConfig({ modules: ['@wxt-dev/auto-icons'], manifest: { + name: "Trilium Web Clipper", + description: "Save web clippings to Trilium Notes.", permissions: [ "activeTab", "tabs", From c0a2ae99cf3d592b059de7826a98685b47afa254 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 11:13:17 +0200 Subject: [PATCH 065/316] fix(web-clipper): toast not working --- apps/web-clipper/entrypoints/background/index.js | 3 --- apps/web-clipper/entrypoints/content/index.js | 12 +----------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/apps/web-clipper/entrypoints/background/index.js b/apps/web-clipper/entrypoints/background/index.js index b92bfdb724..4492e862b6 100644 --- a/apps/web-clipper/entrypoints/background/index.js +++ b/apps/web-clipper/entrypoints/background/index.js @@ -421,9 +421,6 @@ export default defineBackground(() => { else if (request.name === 'closeTabs') { return await browser.tabs.remove(request.tabIds) } - else if (request.name === 'load-script') { - return await browser.tabs.executeScript({file: request.file}); - } else if (request.name === 'save-cropped-screenshot') { const activeTab = await getActiveTab(); diff --git a/apps/web-clipper/entrypoints/content/index.js b/apps/web-clipper/entrypoints/content/index.js index c6ba6c438c..99d30ae6a2 100644 --- a/apps/web-clipper/entrypoints/content/index.js +++ b/apps/web-clipper/entrypoints/content/index.js @@ -275,7 +275,7 @@ export default defineContentScript({ messageText = message.message; } - await requireLib('/lib/toast.js'); + await import("../../lib/toast"); showToast(messageText, { settings: { @@ -343,16 +343,6 @@ export default defineContentScript({ } } - const loadedLibs = []; - - async function requireLib(libPath) { - if (!loadedLibs.includes(libPath)) { - loadedLibs.push(libPath); - - await browser.runtime.sendMessage({name: 'load-script', file: libPath}); - } - } - browser.runtime.onMessage.addListener(prepareMessageResponse); } }); From b5ff71b1a03acbd300554daa9780ba0750c7eb93 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 11:25:32 +0200 Subject: [PATCH 066/316] fix(web-clipper): missing utils import --- apps/web-clipper/entrypoints/background/index.js | 1 + apps/web-clipper/entrypoints/content/index.js | 2 ++ apps/web-clipper/manifest.json | 6 ++---- apps/web-clipper/utils.js | 6 +++--- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/web-clipper/entrypoints/background/index.js b/apps/web-clipper/entrypoints/background/index.js index 4492e862b6..e8d3c6d038 100644 --- a/apps/web-clipper/entrypoints/background/index.js +++ b/apps/web-clipper/entrypoints/background/index.js @@ -1,3 +1,4 @@ +import { randomString } from "../../utils"; import TriliumServerFacade, { isDevEnv } from "./trilium_server_facade"; export default defineBackground(() => { diff --git a/apps/web-clipper/entrypoints/content/index.js b/apps/web-clipper/entrypoints/content/index.js index 99d30ae6a2..6711223841 100644 --- a/apps/web-clipper/entrypoints/content/index.js +++ b/apps/web-clipper/entrypoints/content/index.js @@ -1,3 +1,5 @@ +import { getBaseUrl, getPageLocationOrigin, randomString } from "../../utils.js"; + export default defineContentScript({ matches: [ "" diff --git a/apps/web-clipper/manifest.json b/apps/web-clipper/manifest.json index 282d5230ab..12694338c9 100644 --- a/apps/web-clipper/manifest.json +++ b/apps/web-clipper/manifest.json @@ -16,15 +16,13 @@ "content_scripts": [ { "js": [ - "lib/browser-polyfill.js", - "utils.js" + "lib/browser-polyfill.js" ] } ], "background": { "scripts": [ - "lib/browser-polyfill.js", - "utils.js" + "lib/browser-polyfill.js" ] }, "commands": { diff --git a/apps/web-clipper/utils.js b/apps/web-clipper/utils.js index 9ec82b2c23..aab69e12cd 100644 --- a/apps/web-clipper/utils.js +++ b/apps/web-clipper/utils.js @@ -1,4 +1,4 @@ -function randomString(len) { +export function randomString(len) { let text = ""; const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; @@ -9,7 +9,7 @@ function randomString(len) { return text; } -function getBaseUrl() { +export function getBaseUrl() { let output = getPageLocationOrigin() + location.pathname; if (output[output.length - 1] !== '/') { @@ -21,7 +21,7 @@ function getBaseUrl() { return output; } -function getPageLocationOrigin() { +export function getPageLocationOrigin() { // location.origin normally returns the protocol + domain + port (eg. https://example.com:8080) // but for file:// protocol this is browser dependant and in particular Firefox returns "null" in this case. return location.protocol === 'file:' ? 'file://' : location.origin; From 5d07a079efa1d57bc20d917ba92a4ec79f3247c7 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 11:46:07 +0200 Subject: [PATCH 067/316] feat(web-clipper): improve error handling for content entrypoint --- apps/web-clipper/entrypoints/content/index.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/web-clipper/entrypoints/content/index.js b/apps/web-clipper/entrypoints/content/index.js index 6711223841..72e4815ce6 100644 --- a/apps/web-clipper/entrypoints/content/index.js +++ b/apps/web-clipper/entrypoints/content/index.js @@ -312,10 +312,6 @@ export default defineContentScript({ return getRectangleArea(); } else if (message.name === "trilium-save-page") { - await requireLib("/lib/JSDOMParser.js"); - await requireLib("/lib/Readability.js"); - await requireLib("/lib/Readability-readerable.js"); - const {title, body} = getReadableDocument(); makeLinksAbsolute(body); @@ -345,6 +341,14 @@ export default defineContentScript({ } } - browser.runtime.onMessage.addListener(prepareMessageResponse); + browser.runtime.onMessage.addListener(async (message) => { + try { + const response = await prepareMessageResponse(message); + return response; + } catch (err) { + console.error(err); + throw err; + } + }); } }); From 59f2fc8d033641dbe4b5e8df561c5c26ab38cfa4 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 11:53:26 +0200 Subject: [PATCH 068/316] fix(web-clipper): clipping whole page not working --- apps/web-clipper/entrypoints/content/index.js | 1 + apps/web-clipper/lib/Readability.js | 6 +----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/web-clipper/entrypoints/content/index.js b/apps/web-clipper/entrypoints/content/index.js index 72e4815ce6..973172b4e3 100644 --- a/apps/web-clipper/entrypoints/content/index.js +++ b/apps/web-clipper/entrypoints/content/index.js @@ -1,4 +1,5 @@ import { getBaseUrl, getPageLocationOrigin, randomString } from "../../utils.js"; +import Readability from "../../lib/Readability.js"; export default defineContentScript({ matches: [ diff --git a/apps/web-clipper/lib/Readability.js b/apps/web-clipper/lib/Readability.js index ce06df459d..c5335f80b3 100644 --- a/apps/web-clipper/lib/Readability.js +++ b/apps/web-clipper/lib/Readability.js @@ -25,7 +25,7 @@ * @param {HTMLDocument} doc The document to parse. * @param {Object} options The options object. */ -function Readability(doc, options) { +export default function Readability(doc, options) { // In some older versions, people passed a URI as the first argument. Cope: if (options && options.documentElement) { doc = options; @@ -2277,7 +2277,3 @@ Readability.prototype = { }; } }; - -if (typeof module === "object") { - module.exports = Readability; -} From f0b1319f959a76005e2727dc03db00eef6e854a0 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 11:54:00 +0200 Subject: [PATCH 069/316] refactor(web-clipper): remove unnecessary libraries --- apps/web-clipper/lib/JSDOMParser.js | 1196 ----------------- .../web-clipper/lib/Readability-readerable.js | 108 -- 2 files changed, 1304 deletions(-) delete mode 100644 apps/web-clipper/lib/JSDOMParser.js delete mode 100644 apps/web-clipper/lib/Readability-readerable.js diff --git a/apps/web-clipper/lib/JSDOMParser.js b/apps/web-clipper/lib/JSDOMParser.js deleted file mode 100644 index 7bfa2acf5b..0000000000 --- a/apps/web-clipper/lib/JSDOMParser.js +++ /dev/null @@ -1,1196 +0,0 @@ -/*eslint-env es6:false*/ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/** - * This is a relatively lightweight DOMParser that is safe to use in a web - * worker. This is far from a complete DOM implementation; however, it should - * contain the minimal set of functionality necessary for Readability.js. - * - * Aside from not implementing the full DOM API, there are other quirks to be - * aware of when using the JSDOMParser: - * - * 1) Properly formed HTML/XML must be used. This means you should be extra - * careful when using this parser on anything received directly from an - * XMLHttpRequest. Providing a serialized string from an XMLSerializer, - * however, should be safe (since the browser's XMLSerializer should - * generate valid HTML/XML). Therefore, if parsing a document from an XHR, - * the recommended approach is to do the XHR in the main thread, use - * XMLSerializer.serializeToString() on the responseXML, and pass the - * resulting string to the worker. - * - * 2) Live NodeLists are not supported. DOM methods and properties such as - * getElementsByTagName() and childNodes return standard arrays. If you - * want these lists to be updated when nodes are removed or added to the - * document, you must take care to manually update them yourself. - */ -(function (global) { - - // XML only defines these and the numeric ones: - - var entityTable = { - "lt": "<", - "gt": ">", - "amp": "&", - "quot": '"', - "apos": "'", - }; - - var reverseEntityTable = { - "<": "<", - ">": ">", - "&": "&", - '"': """, - "'": "'", - }; - - function encodeTextContentHTML(s) { - return s.replace(/[&<>]/g, function(x) { - return reverseEntityTable[x]; - }); - } - - function encodeHTML(s) { - return s.replace(/[&<>'"]/g, function(x) { - return reverseEntityTable[x]; - }); - } - - function decodeHTML(str) { - return str.replace(/&(quot|amp|apos|lt|gt);/g, function(match, tag) { - return entityTable[tag]; - }).replace(/&#(?:x([0-9a-z]{1,4})|([0-9]{1,4}));/gi, function(match, hex, numStr) { - var num = parseInt(hex || numStr, hex ? 16 : 10); // read num - return String.fromCharCode(num); - }); - } - - // When a style is set in JS, map it to the corresponding CSS attribute - var styleMap = { - "alignmentBaseline": "alignment-baseline", - "background": "background", - "backgroundAttachment": "background-attachment", - "backgroundClip": "background-clip", - "backgroundColor": "background-color", - "backgroundImage": "background-image", - "backgroundOrigin": "background-origin", - "backgroundPosition": "background-position", - "backgroundPositionX": "background-position-x", - "backgroundPositionY": "background-position-y", - "backgroundRepeat": "background-repeat", - "backgroundRepeatX": "background-repeat-x", - "backgroundRepeatY": "background-repeat-y", - "backgroundSize": "background-size", - "baselineShift": "baseline-shift", - "border": "border", - "borderBottom": "border-bottom", - "borderBottomColor": "border-bottom-color", - "borderBottomLeftRadius": "border-bottom-left-radius", - "borderBottomRightRadius": "border-bottom-right-radius", - "borderBottomStyle": "border-bottom-style", - "borderBottomWidth": "border-bottom-width", - "borderCollapse": "border-collapse", - "borderColor": "border-color", - "borderImage": "border-image", - "borderImageOutset": "border-image-outset", - "borderImageRepeat": "border-image-repeat", - "borderImageSlice": "border-image-slice", - "borderImageSource": "border-image-source", - "borderImageWidth": "border-image-width", - "borderLeft": "border-left", - "borderLeftColor": "border-left-color", - "borderLeftStyle": "border-left-style", - "borderLeftWidth": "border-left-width", - "borderRadius": "border-radius", - "borderRight": "border-right", - "borderRightColor": "border-right-color", - "borderRightStyle": "border-right-style", - "borderRightWidth": "border-right-width", - "borderSpacing": "border-spacing", - "borderStyle": "border-style", - "borderTop": "border-top", - "borderTopColor": "border-top-color", - "borderTopLeftRadius": "border-top-left-radius", - "borderTopRightRadius": "border-top-right-radius", - "borderTopStyle": "border-top-style", - "borderTopWidth": "border-top-width", - "borderWidth": "border-width", - "bottom": "bottom", - "boxShadow": "box-shadow", - "boxSizing": "box-sizing", - "captionSide": "caption-side", - "clear": "clear", - "clip": "clip", - "clipPath": "clip-path", - "clipRule": "clip-rule", - "color": "color", - "colorInterpolation": "color-interpolation", - "colorInterpolationFilters": "color-interpolation-filters", - "colorProfile": "color-profile", - "colorRendering": "color-rendering", - "content": "content", - "counterIncrement": "counter-increment", - "counterReset": "counter-reset", - "cursor": "cursor", - "direction": "direction", - "display": "display", - "dominantBaseline": "dominant-baseline", - "emptyCells": "empty-cells", - "enableBackground": "enable-background", - "fill": "fill", - "fillOpacity": "fill-opacity", - "fillRule": "fill-rule", - "filter": "filter", - "cssFloat": "float", - "floodColor": "flood-color", - "floodOpacity": "flood-opacity", - "font": "font", - "fontFamily": "font-family", - "fontSize": "font-size", - "fontStretch": "font-stretch", - "fontStyle": "font-style", - "fontVariant": "font-variant", - "fontWeight": "font-weight", - "glyphOrientationHorizontal": "glyph-orientation-horizontal", - "glyphOrientationVertical": "glyph-orientation-vertical", - "height": "height", - "imageRendering": "image-rendering", - "kerning": "kerning", - "left": "left", - "letterSpacing": "letter-spacing", - "lightingColor": "lighting-color", - "lineHeight": "line-height", - "listStyle": "list-style", - "listStyleImage": "list-style-image", - "listStylePosition": "list-style-position", - "listStyleType": "list-style-type", - "margin": "margin", - "marginBottom": "margin-bottom", - "marginLeft": "margin-left", - "marginRight": "margin-right", - "marginTop": "margin-top", - "marker": "marker", - "markerEnd": "marker-end", - "markerMid": "marker-mid", - "markerStart": "marker-start", - "mask": "mask", - "maxHeight": "max-height", - "maxWidth": "max-width", - "minHeight": "min-height", - "minWidth": "min-width", - "opacity": "opacity", - "orphans": "orphans", - "outline": "outline", - "outlineColor": "outline-color", - "outlineOffset": "outline-offset", - "outlineStyle": "outline-style", - "outlineWidth": "outline-width", - "overflow": "overflow", - "overflowX": "overflow-x", - "overflowY": "overflow-y", - "padding": "padding", - "paddingBottom": "padding-bottom", - "paddingLeft": "padding-left", - "paddingRight": "padding-right", - "paddingTop": "padding-top", - "page": "page", - "pageBreakAfter": "page-break-after", - "pageBreakBefore": "page-break-before", - "pageBreakInside": "page-break-inside", - "pointerEvents": "pointer-events", - "position": "position", - "quotes": "quotes", - "resize": "resize", - "right": "right", - "shapeRendering": "shape-rendering", - "size": "size", - "speak": "speak", - "src": "src", - "stopColor": "stop-color", - "stopOpacity": "stop-opacity", - "stroke": "stroke", - "strokeDasharray": "stroke-dasharray", - "strokeDashoffset": "stroke-dashoffset", - "strokeLinecap": "stroke-linecap", - "strokeLinejoin": "stroke-linejoin", - "strokeMiterlimit": "stroke-miterlimit", - "strokeOpacity": "stroke-opacity", - "strokeWidth": "stroke-width", - "tableLayout": "table-layout", - "textAlign": "text-align", - "textAnchor": "text-anchor", - "textDecoration": "text-decoration", - "textIndent": "text-indent", - "textLineThrough": "text-line-through", - "textLineThroughColor": "text-line-through-color", - "textLineThroughMode": "text-line-through-mode", - "textLineThroughStyle": "text-line-through-style", - "textLineThroughWidth": "text-line-through-width", - "textOverflow": "text-overflow", - "textOverline": "text-overline", - "textOverlineColor": "text-overline-color", - "textOverlineMode": "text-overline-mode", - "textOverlineStyle": "text-overline-style", - "textOverlineWidth": "text-overline-width", - "textRendering": "text-rendering", - "textShadow": "text-shadow", - "textTransform": "text-transform", - "textUnderline": "text-underline", - "textUnderlineColor": "text-underline-color", - "textUnderlineMode": "text-underline-mode", - "textUnderlineStyle": "text-underline-style", - "textUnderlineWidth": "text-underline-width", - "top": "top", - "unicodeBidi": "unicode-bidi", - "unicodeRange": "unicode-range", - "vectorEffect": "vector-effect", - "verticalAlign": "vertical-align", - "visibility": "visibility", - "whiteSpace": "white-space", - "widows": "widows", - "width": "width", - "wordBreak": "word-break", - "wordSpacing": "word-spacing", - "wordWrap": "word-wrap", - "writingMode": "writing-mode", - "zIndex": "z-index", - "zoom": "zoom", - }; - - // Elements that can be self-closing - var voidElems = { - "area": true, - "base": true, - "br": true, - "col": true, - "command": true, - "embed": true, - "hr": true, - "img": true, - "input": true, - "link": true, - "meta": true, - "param": true, - "source": true, - "wbr": true - }; - - var whitespace = [" ", "\t", "\n", "\r"]; - - // See https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType - var nodeTypes = { - ELEMENT_NODE: 1, - ATTRIBUTE_NODE: 2, - TEXT_NODE: 3, - CDATA_SECTION_NODE: 4, - ENTITY_REFERENCE_NODE: 5, - ENTITY_NODE: 6, - PROCESSING_INSTRUCTION_NODE: 7, - COMMENT_NODE: 8, - DOCUMENT_NODE: 9, - DOCUMENT_TYPE_NODE: 10, - DOCUMENT_FRAGMENT_NODE: 11, - NOTATION_NODE: 12 - }; - - function getElementsByTagName(tag) { - tag = tag.toUpperCase(); - var elems = []; - var allTags = (tag === "*"); - function getElems(node) { - var length = node.children.length; - for (var i = 0; i < length; i++) { - var child = node.children[i]; - if (allTags || (child.tagName === tag)) - elems.push(child); - getElems(child); - } - } - getElems(this); - elems._isLiveNodeList = true; - return elems; - } - - var Node = function () {}; - - Node.prototype = { - attributes: null, - childNodes: null, - localName: null, - nodeName: null, - parentNode: null, - textContent: null, - nextSibling: null, - previousSibling: null, - - get firstChild() { - return this.childNodes[0] || null; - }, - - get firstElementChild() { - return this.children[0] || null; - }, - - get lastChild() { - return this.childNodes[this.childNodes.length - 1] || null; - }, - - get lastElementChild() { - return this.children[this.children.length - 1] || null; - }, - - appendChild: function (child) { - if (child.parentNode) { - child.parentNode.removeChild(child); - } - - var last = this.lastChild; - if (last) - last.nextSibling = child; - child.previousSibling = last; - - if (child.nodeType === Node.ELEMENT_NODE) { - child.previousElementSibling = this.children[this.children.length - 1] || null; - this.children.push(child); - child.previousElementSibling && (child.previousElementSibling.nextElementSibling = child); - } - this.childNodes.push(child); - child.parentNode = this; - }, - - removeChild: function (child) { - var childNodes = this.childNodes; - var childIndex = childNodes.indexOf(child); - if (childIndex === -1) { - throw "removeChild: node not found"; - } else { - child.parentNode = null; - var prev = child.previousSibling; - var next = child.nextSibling; - if (prev) - prev.nextSibling = next; - if (next) - next.previousSibling = prev; - - if (child.nodeType === Node.ELEMENT_NODE) { - prev = child.previousElementSibling; - next = child.nextElementSibling; - if (prev) - prev.nextElementSibling = next; - if (next) - next.previousElementSibling = prev; - this.children.splice(this.children.indexOf(child), 1); - } - - child.previousSibling = child.nextSibling = null; - child.previousElementSibling = child.nextElementSibling = null; - - return childNodes.splice(childIndex, 1)[0]; - } - }, - - replaceChild: function (newNode, oldNode) { - var childNodes = this.childNodes; - var childIndex = childNodes.indexOf(oldNode); - if (childIndex === -1) { - throw "replaceChild: node not found"; - } else { - // This will take care of updating the new node if it was somewhere else before: - if (newNode.parentNode) - newNode.parentNode.removeChild(newNode); - - childNodes[childIndex] = newNode; - - // update the new node's sibling properties, and its new siblings' sibling properties - newNode.nextSibling = oldNode.nextSibling; - newNode.previousSibling = oldNode.previousSibling; - if (newNode.nextSibling) - newNode.nextSibling.previousSibling = newNode; - if (newNode.previousSibling) - newNode.previousSibling.nextSibling = newNode; - - newNode.parentNode = this; - - // Now deal with elements before we clear out those values for the old node, - // because it can help us take shortcuts here: - if (newNode.nodeType === Node.ELEMENT_NODE) { - if (oldNode.nodeType === Node.ELEMENT_NODE) { - // Both were elements, which makes this easier, we just swap things out: - newNode.previousElementSibling = oldNode.previousElementSibling; - newNode.nextElementSibling = oldNode.nextElementSibling; - if (newNode.previousElementSibling) - newNode.previousElementSibling.nextElementSibling = newNode; - if (newNode.nextElementSibling) - newNode.nextElementSibling.previousElementSibling = newNode; - this.children[this.children.indexOf(oldNode)] = newNode; - } else { - // Hard way: - newNode.previousElementSibling = (function() { - for (var i = childIndex - 1; i >= 0; i--) { - if (childNodes[i].nodeType === Node.ELEMENT_NODE) - return childNodes[i]; - } - return null; - })(); - if (newNode.previousElementSibling) { - newNode.nextElementSibling = newNode.previousElementSibling.nextElementSibling; - } else { - newNode.nextElementSibling = (function() { - for (var i = childIndex + 1; i < childNodes.length; i++) { - if (childNodes[i].nodeType === Node.ELEMENT_NODE) - return childNodes[i]; - } - return null; - })(); - } - if (newNode.previousElementSibling) - newNode.previousElementSibling.nextElementSibling = newNode; - if (newNode.nextElementSibling) - newNode.nextElementSibling.previousElementSibling = newNode; - - if (newNode.nextElementSibling) - this.children.splice(this.children.indexOf(newNode.nextElementSibling), 0, newNode); - else - this.children.push(newNode); - } - } else if (oldNode.nodeType === Node.ELEMENT_NODE) { - // new node is not an element node. - // if the old one was, update its element siblings: - if (oldNode.previousElementSibling) - oldNode.previousElementSibling.nextElementSibling = oldNode.nextElementSibling; - if (oldNode.nextElementSibling) - oldNode.nextElementSibling.previousElementSibling = oldNode.previousElementSibling; - this.children.splice(this.children.indexOf(oldNode), 1); - - // If the old node wasn't an element, neither the new nor the old node was an element, - // and the children array and its members shouldn't need any updating. - } - - - oldNode.parentNode = null; - oldNode.previousSibling = null; - oldNode.nextSibling = null; - if (oldNode.nodeType === Node.ELEMENT_NODE) { - oldNode.previousElementSibling = null; - oldNode.nextElementSibling = null; - } - return oldNode; - } - }, - - __JSDOMParser__: true, - }; - - for (var nodeType in nodeTypes) { - Node[nodeType] = Node.prototype[nodeType] = nodeTypes[nodeType]; - } - - var Attribute = function (name, value) { - this.name = name; - this._value = value; - }; - - Attribute.prototype = { - get value() { - return this._value; - }, - setValue: function(newValue) { - this._value = newValue; - }, - getEncodedValue: function() { - return encodeHTML(this._value); - }, - }; - - var Comment = function () { - this.childNodes = []; - }; - - Comment.prototype = { - __proto__: Node.prototype, - - nodeName: "#comment", - nodeType: Node.COMMENT_NODE - }; - - var Text = function () { - this.childNodes = []; - }; - - Text.prototype = { - __proto__: Node.prototype, - - nodeName: "#text", - nodeType: Node.TEXT_NODE, - get textContent() { - if (typeof this._textContent === "undefined") { - this._textContent = decodeHTML(this._innerHTML || ""); - } - return this._textContent; - }, - get innerHTML() { - if (typeof this._innerHTML === "undefined") { - this._innerHTML = encodeTextContentHTML(this._textContent || ""); - } - return this._innerHTML; - }, - - set innerHTML(newHTML) { - this._innerHTML = newHTML; - delete this._textContent; - }, - set textContent(newText) { - this._textContent = newText; - delete this._innerHTML; - }, - }; - - var Document = function (url) { - this.documentURI = url; - this.styleSheets = []; - this.childNodes = []; - this.children = []; - }; - - Document.prototype = { - __proto__: Node.prototype, - - nodeName: "#document", - nodeType: Node.DOCUMENT_NODE, - title: "", - - getElementsByTagName: getElementsByTagName, - - getElementById: function (id) { - function getElem(node) { - var length = node.children.length; - if (node.id === id) - return node; - for (var i = 0; i < length; i++) { - var el = getElem(node.children[i]); - if (el) - return el; - } - return null; - } - return getElem(this); - }, - - createElement: function (tag) { - var node = new Element(tag); - return node; - }, - - createTextNode: function (text) { - var node = new Text(); - node.textContent = text; - return node; - }, - - get baseURI() { - if (!this.hasOwnProperty("_baseURI")) { - this._baseURI = this.documentURI; - var baseElements = this.getElementsByTagName("base"); - var href = baseElements[0] && baseElements[0].getAttribute("href"); - if (href) { - try { - this._baseURI = (new URL(href, this._baseURI)).href; - } catch (ex) {/* Just fall back to documentURI */} - } - } - return this._baseURI; - }, - }; - - var Element = function (tag) { - // We use this to find the closing tag. - this._matchingTag = tag; - // We're explicitly a non-namespace aware parser, we just pretend it's all HTML. - var lastColonIndex = tag.lastIndexOf(":"); - if (lastColonIndex != -1) { - tag = tag.substring(lastColonIndex + 1); - } - this.attributes = []; - this.childNodes = []; - this.children = []; - this.nextElementSibling = this.previousElementSibling = null; - this.localName = tag.toLowerCase(); - this.tagName = tag.toUpperCase(); - this.style = new Style(this); - }; - - Element.prototype = { - __proto__: Node.prototype, - - nodeType: Node.ELEMENT_NODE, - - getElementsByTagName: getElementsByTagName, - - get className() { - return this.getAttribute("class") || ""; - }, - - set className(str) { - this.setAttribute("class", str); - }, - - get id() { - return this.getAttribute("id") || ""; - }, - - set id(str) { - this.setAttribute("id", str); - }, - - get href() { - return this.getAttribute("href") || ""; - }, - - set href(str) { - this.setAttribute("href", str); - }, - - get src() { - return this.getAttribute("src") || ""; - }, - - set src(str) { - this.setAttribute("src", str); - }, - - get srcset() { - return this.getAttribute("srcset") || ""; - }, - - set srcset(str) { - this.setAttribute("srcset", str); - }, - - get nodeName() { - return this.tagName; - }, - - get innerHTML() { - function getHTML(node) { - var i = 0; - for (i = 0; i < node.childNodes.length; i++) { - var child = node.childNodes[i]; - if (child.localName) { - arr.push("<" + child.localName); - - // serialize attribute list - for (var j = 0; j < child.attributes.length; j++) { - var attr = child.attributes[j]; - // the attribute value will be HTML escaped. - var val = attr.getEncodedValue(); - var quote = (val.indexOf('"') === -1 ? '"' : "'"); - arr.push(" " + attr.name + "=" + quote + val + quote); - } - - if (child.localName in voidElems && !child.childNodes.length) { - // if this is a self-closing element, end it here - arr.push("/>"); - } else { - // otherwise, add its children - arr.push(">"); - getHTML(child); - arr.push(""); - } - } else { - // This is a text node, so asking for innerHTML won't recurse. - arr.push(child.innerHTML); - } - } - } - - // Using Array.join() avoids the overhead from lazy string concatenation. - var arr = []; - getHTML(this); - return arr.join(""); - }, - - set innerHTML(html) { - var parser = new JSDOMParser(); - var node = parser.parse(html); - var i; - for (i = this.childNodes.length; --i >= 0;) { - this.childNodes[i].parentNode = null; - } - this.childNodes = node.childNodes; - this.children = node.children; - for (i = this.childNodes.length; --i >= 0;) { - this.childNodes[i].parentNode = this; - } - }, - - set textContent(text) { - // clear parentNodes for existing children - for (var i = this.childNodes.length; --i >= 0;) { - this.childNodes[i].parentNode = null; - } - - var node = new Text(); - this.childNodes = [ node ]; - this.children = []; - node.textContent = text; - node.parentNode = this; - }, - - get textContent() { - function getText(node) { - var nodes = node.childNodes; - for (var i = 0; i < nodes.length; i++) { - var child = nodes[i]; - if (child.nodeType === 3) { - text.push(child.textContent); - } else { - getText(child); - } - } - } - - // Using Array.join() avoids the overhead from lazy string concatenation. - // See http://blog.cdleary.com/2012/01/string-representation-in-spidermonkey/#ropes - var text = []; - getText(this); - return text.join(""); - }, - - getAttribute: function (name) { - for (var i = this.attributes.length; --i >= 0;) { - var attr = this.attributes[i]; - if (attr.name === name) { - return attr.value; - } - } - return undefined; - }, - - setAttribute: function (name, value) { - for (var i = this.attributes.length; --i >= 0;) { - var attr = this.attributes[i]; - if (attr.name === name) { - attr.setValue(value); - return; - } - } - this.attributes.push(new Attribute(name, value)); - }, - - removeAttribute: function (name) { - for (var i = this.attributes.length; --i >= 0;) { - var attr = this.attributes[i]; - if (attr.name === name) { - this.attributes.splice(i, 1); - break; - } - } - }, - - hasAttribute: function (name) { - return this.attributes.some(function (attr) { - return attr.name == name; - }); - }, - }; - - var Style = function (node) { - this.node = node; - }; - - // getStyle() and setStyle() use the style attribute string directly. This - // won't be very efficient if there are a lot of style manipulations, but - // it's the easiest way to make sure the style attribute string and the JS - // style property stay in sync. Readability.js doesn't do many style - // manipulations, so this should be okay. - Style.prototype = { - getStyle: function (styleName) { - var attr = this.node.getAttribute("style"); - if (!attr) - return undefined; - - var styles = attr.split(";"); - for (var i = 0; i < styles.length; i++) { - var style = styles[i].split(":"); - var name = style[0].trim(); - if (name === styleName) - return style[1].trim(); - } - - return undefined; - }, - - setStyle: function (styleName, styleValue) { - var value = this.node.getAttribute("style") || ""; - var index = 0; - do { - var next = value.indexOf(";", index) + 1; - var length = next - index - 1; - var style = (length > 0 ? value.substr(index, length) : value.substr(index)); - if (style.substr(0, style.indexOf(":")).trim() === styleName) { - value = value.substr(0, index).trim() + (next ? " " + value.substr(next).trim() : ""); - break; - } - index = next; - } while (index); - - value += " " + styleName + ": " + styleValue + ";"; - this.node.setAttribute("style", value.trim()); - } - }; - - // For each item in styleMap, define a getter and setter on the style - // property. - for (var jsName in styleMap) { - (function (cssName) { - Style.prototype.__defineGetter__(jsName, function () { - return this.getStyle(cssName); - }); - Style.prototype.__defineSetter__(jsName, function (value) { - this.setStyle(cssName, value); - }); - })(styleMap[jsName]); - } - - var JSDOMParser = function () { - this.currentChar = 0; - - // In makeElementNode() we build up many strings one char at a time. Using - // += for this results in lots of short-lived intermediate strings. It's - // better to build an array of single-char strings and then join() them - // together at the end. And reusing a single array (i.e. |this.strBuf|) - // over and over for this purpose uses less memory than using a new array - // for each string. - this.strBuf = []; - - // Similarly, we reuse this array to return the two arguments from - // makeElementNode(), which saves us from having to allocate a new array - // every time. - this.retPair = []; - - this.errorState = ""; - }; - - JSDOMParser.prototype = { - error: function(m) { - if (typeof dump !== "undefined") { - dump("JSDOMParser error: " + m + "\n"); - } else if (typeof console !== "undefined") { - console.log("JSDOMParser error: " + m + "\n"); - } - this.errorState += m + "\n"; - }, - - /** - * Look at the next character without advancing the index. - */ - peekNext: function () { - return this.html[this.currentChar]; - }, - - /** - * Get the next character and advance the index. - */ - nextChar: function () { - return this.html[this.currentChar++]; - }, - - /** - * Called after a quote character is read. This finds the next quote - * character and returns the text string in between. - */ - readString: function (quote) { - var str; - var n = this.html.indexOf(quote, this.currentChar); - if (n === -1) { - this.currentChar = this.html.length; - str = null; - } else { - str = this.html.substring(this.currentChar, n); - this.currentChar = n + 1; - } - - return str; - }, - - /** - * Called when parsing a node. This finds the next name/value attribute - * pair and adds the result to the attributes list. - */ - readAttribute: function (node) { - var name = ""; - - var n = this.html.indexOf("=", this.currentChar); - if (n === -1) { - this.currentChar = this.html.length; - } else { - // Read until a '=' character is hit; this will be the attribute key - name = this.html.substring(this.currentChar, n); - this.currentChar = n + 1; - } - - if (!name) - return; - - // After a '=', we should see a '"' for the attribute value - var c = this.nextChar(); - if (c !== '"' && c !== "'") { - this.error("Error reading attribute " + name + ", expecting '\"'"); - return; - } - - // Read the attribute value (and consume the matching quote) - var value = this.readString(c); - - node.attributes.push(new Attribute(name, decodeHTML(value))); - - return; - }, - - /** - * Parses and returns an Element node. This is called after a '<' has been - * read. - * - * @returns an array; the first index of the array is the parsed node; - * the second index is a boolean indicating whether this is a void - * Element - */ - makeElementNode: function (retPair) { - var c = this.nextChar(); - - // Read the Element tag name - var strBuf = this.strBuf; - strBuf.length = 0; - while (whitespace.indexOf(c) == -1 && c !== ">" && c !== "/") { - if (c === undefined) - return false; - strBuf.push(c); - c = this.nextChar(); - } - var tag = strBuf.join(""); - - if (!tag) - return false; - - var node = new Element(tag); - - // Read Element attributes - while (c !== "/" && c !== ">") { - if (c === undefined) - return false; - while (whitespace.indexOf(this.html[this.currentChar++]) != -1) { - // Advance cursor to first non-whitespace char. - } - this.currentChar--; - c = this.nextChar(); - if (c !== "/" && c !== ">") { - --this.currentChar; - this.readAttribute(node); - } - } - - // If this is a self-closing tag, read '/>' - var closed = false; - if (c === "/") { - closed = true; - c = this.nextChar(); - if (c !== ">") { - this.error("expected '>' to close " + tag); - return false; - } - } - - retPair[0] = node; - retPair[1] = closed; - return true; - }, - - /** - * If the current input matches this string, advance the input index; - * otherwise, do nothing. - * - * @returns whether input matched string - */ - match: function (str) { - var strlen = str.length; - if (this.html.substr(this.currentChar, strlen).toLowerCase() === str.toLowerCase()) { - this.currentChar += strlen; - return true; - } - return false; - }, - - /** - * Searches the input until a string is found and discards all input up to - * and including the matched string. - */ - discardTo: function (str) { - var index = this.html.indexOf(str, this.currentChar) + str.length; - if (index === -1) - this.currentChar = this.html.length; - this.currentChar = index; - }, - - /** - * Reads child nodes for the given node. - */ - readChildren: function (node) { - var child; - while ((child = this.readNode())) { - // Don't keep Comment nodes - if (child.nodeType !== 8) { - node.appendChild(child); - } - } - }, - - discardNextComment: function() { - if (this.match("--")) { - this.discardTo("-->"); - } else { - var c = this.nextChar(); - while (c !== ">") { - if (c === undefined) - return null; - if (c === '"' || c === "'") - this.readString(c); - c = this.nextChar(); - } - } - return new Comment(); - }, - - - /** - * Reads the next child node from the input. If we're reading a closing - * tag, or if we've reached the end of input, return null. - * - * @returns the node - */ - readNode: function () { - var c = this.nextChar(); - - if (c === undefined) - return null; - - // Read any text as Text node - var textNode; - if (c !== "<") { - --this.currentChar; - textNode = new Text(); - var n = this.html.indexOf("<", this.currentChar); - if (n === -1) { - textNode.innerHTML = this.html.substring(this.currentChar, this.html.length); - this.currentChar = this.html.length; - } else { - textNode.innerHTML = this.html.substring(this.currentChar, n); - this.currentChar = n; - } - return textNode; - } - - if (this.match("![CDATA[")) { - var endChar = this.html.indexOf("]]>", this.currentChar); - if (endChar === -1) { - this.error("unclosed CDATA section"); - return null; - } - textNode = new Text(); - textNode.textContent = this.html.substring(this.currentChar, endChar); - this.currentChar = endChar + ("]]>").length; - return textNode; - } - - c = this.peekNext(); - - // Read Comment node. Normally, Comment nodes know their inner - // textContent, but we don't really care about Comment nodes (we throw - // them away in readChildren()). So just returning an empty Comment node - // here is sufficient. - if (c === "!" || c === "?") { - // We're still before the ! or ? that is starting this comment: - this.currentChar++; - return this.discardNextComment(); - } - - // If we're reading a closing tag, return null. This means we've reached - // the end of this set of child nodes. - if (c === "/") { - --this.currentChar; - return null; - } - - // Otherwise, we're looking at an Element node - var result = this.makeElementNode(this.retPair); - if (!result) - return null; - - var node = this.retPair[0]; - var closed = this.retPair[1]; - var localName = node.localName; - - // If this isn't a void Element, read its child nodes - if (!closed) { - this.readChildren(node); - var closingTag = ""; - if (!this.match(closingTag)) { - this.error("expected '" + closingTag + "' and got " + this.html.substr(this.currentChar, closingTag.length)); - return null; - } - } - - // Only use the first title, because SVG might have other - // title elements which we don't care about (medium.com - // does this, at least). - if (localName === "title" && !this.doc.title) { - this.doc.title = node.textContent.trim(); - } else if (localName === "head") { - this.doc.head = node; - } else if (localName === "body") { - this.doc.body = node; - } else if (localName === "html") { - this.doc.documentElement = node; - } - - return node; - }, - - /** - * Parses an HTML string and returns a JS implementation of the Document. - */ - parse: function (html, url) { - this.html = html; - var doc = this.doc = new Document(url); - this.readChildren(doc); - - // If this is an HTML document, remove root-level children except for the - // node - if (doc.documentElement) { - for (var i = doc.childNodes.length; --i >= 0;) { - var child = doc.childNodes[i]; - if (child !== doc.documentElement) { - doc.removeChild(child); - } - } - } - - return doc; - } - }; - - // Attach the standard DOM types to the global scope - global.Node = Node; - global.Comment = Comment; - global.Document = Document; - global.Element = Element; - global.Text = Text; - - // Attach JSDOMParser to the global scope - global.JSDOMParser = JSDOMParser; - -})(this); - -if (typeof module === "object") { - module.exports = this.JSDOMParser; -} diff --git a/apps/web-clipper/lib/Readability-readerable.js b/apps/web-clipper/lib/Readability-readerable.js deleted file mode 100644 index 64be5e15e8..0000000000 --- a/apps/web-clipper/lib/Readability-readerable.js +++ /dev/null @@ -1,108 +0,0 @@ -/* eslint-env es6:false */ -/* - * Copyright (c) 2010 Arc90 Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This code is heavily based on Arc90's readability.js (1.7.1) script - * available at: http://code.google.com/p/arc90labs-readability - */ - -var REGEXPS = { - // NOTE: These two regular expressions are duplicated in - // Readability.js. Please keep both copies in sync. - unlikelyCandidates: /-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote/i, - okMaybeItsACandidate: /and|article|body|column|content|main|shadow/i, -}; - -function isNodeVisible(node) { - // Have to null-check node.style and node.className.indexOf to deal with SVG and MathML nodes. - return (!node.style || node.style.display != "none") - && !node.hasAttribute("hidden") - //check for "fallback-image" so that wikimedia math images are displayed - && (!node.hasAttribute("aria-hidden") || node.getAttribute("aria-hidden") != "true" || (node.className && node.className.indexOf && node.className.indexOf("fallback-image") !== -1)); -} - -/** - * Decides whether or not the document is reader-able without parsing the whole thing. - * @param {Object} options Configuration object. - * @param {number} [options.minContentLength=140] The minimum node content length used to decide if the document is readerable. - * @param {number} [options.minScore=20] The minumum cumulated 'score' used to determine if the document is readerable. - * @param {Function} [options.visibilityChecker=isNodeVisible] The function used to determine if a node is visible. - * @return {boolean} Whether or not we suspect Readability.parse() will suceeed at returning an article object. - */ -function isProbablyReaderable(doc, options = {}) { - // For backward compatibility reasons 'options' can either be a configuration object or the function used - // to determine if a node is visible. - if (typeof options == "function") { - options = { visibilityChecker: options }; - } - - var defaultOptions = { minScore: 20, minContentLength: 140, visibilityChecker: isNodeVisible }; - options = Object.assign(defaultOptions, options); - - var nodes = doc.querySelectorAll("p, pre, article"); - - // Get
nodes which have
node(s) and append them into the `nodes` variable. - // Some articles' DOM structures might look like - //
- // Sentences
- //
- // Sentences
- //
- var brNodes = doc.querySelectorAll("div > br"); - if (brNodes.length) { - var set = new Set(nodes); - [].forEach.call(brNodes, function (node) { - set.add(node.parentNode); - }); - nodes = Array.from(set); - } - - var score = 0; - // This is a little cheeky, we use the accumulator 'score' to decide what to return from - // this callback: - return [].some.call(nodes, function (node) { - if (!options.visibilityChecker(node)) { - return false; - } - - var matchString = node.className + " " + node.id; - if (REGEXPS.unlikelyCandidates.test(matchString) && - !REGEXPS.okMaybeItsACandidate.test(matchString)) { - return false; - } - - if (node.matches("li p")) { - return false; - } - - var textContentLength = node.textContent.trim().length; - if (textContentLength < options.minContentLength) { - return false; - } - - score += Math.sqrt(textContentLength - options.minContentLength); - - if (score > options.minScore) { - return true; - } - return false; - }); -} - -if (typeof module === "object") { - module.exports = isProbablyReaderable; -} From 75e88c69bd0648fb2f587832b18873153dc3db45 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 12:12:07 +0200 Subject: [PATCH 070/316] fix(web-clipper): createLink not defined in popup --- apps/web-clipper/entrypoints/content/index.js | 14 +------------- apps/web-clipper/entrypoints/popup/index.html | 1 - apps/web-clipper/entrypoints/popup/popup.js | 2 +- apps/web-clipper/utils.js | 12 ++++++++++++ 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/apps/web-clipper/entrypoints/content/index.js b/apps/web-clipper/entrypoints/content/index.js index 973172b4e3..e5c3642479 100644 --- a/apps/web-clipper/entrypoints/content/index.js +++ b/apps/web-clipper/entrypoints/content/index.js @@ -1,4 +1,4 @@ -import { getBaseUrl, getPageLocationOrigin, randomString } from "../../utils.js"; +import { createLink, getBaseUrl, getPageLocationOrigin, randomString } from "../../utils.js"; import Readability from "../../lib/Readability.js"; export default defineContentScript({ @@ -237,18 +237,6 @@ export default defineContentScript({ return images; } - function createLink(clickAction, text, color = "lightskyblue") { - const link = document.createElement('a'); - link.href = "javascript:"; - link.style.color = color; - link.appendChild(document.createTextNode(text)); - link.addEventListener("click", () => { - browser.runtime.sendMessage(null, clickAction) - }); - - return link - } - async function prepareMessageResponse(message) { console.info('Message: ' + message.name); diff --git a/apps/web-clipper/entrypoints/popup/index.html b/apps/web-clipper/entrypoints/popup/index.html index 7bd985801f..0479588e73 100644 --- a/apps/web-clipper/entrypoints/popup/index.html +++ b/apps/web-clipper/entrypoints/popup/index.html @@ -50,7 +50,6 @@ - diff --git a/apps/web-clipper/entrypoints/popup/popup.js b/apps/web-clipper/entrypoints/popup/popup.js index be571e428a..775a3ec0c8 100644 --- a/apps/web-clipper/entrypoints/popup/popup.js +++ b/apps/web-clipper/entrypoints/popup/popup.js @@ -1,4 +1,4 @@ -console.log("Popup script loaded"); +import { createLink } from "../../utils"; async function sendMessage(message) { try { diff --git a/apps/web-clipper/utils.js b/apps/web-clipper/utils.js index aab69e12cd..a69a00dbab 100644 --- a/apps/web-clipper/utils.js +++ b/apps/web-clipper/utils.js @@ -26,3 +26,15 @@ export function getPageLocationOrigin() { // but for file:// protocol this is browser dependant and in particular Firefox returns "null" in this case. return location.protocol === 'file:' ? 'file://' : location.origin; } + +export function createLink(clickAction, text, color = "lightskyblue") { + const link = document.createElement('a'); + link.href = "javascript:"; + link.style.color = color; + link.appendChild(document.createTextNode(text)); + link.addEventListener("click", () => { + browser.runtime.sendMessage(null, clickAction) + }); + + return link +} From 423038100e151c826a3bf8b00889d413900c60a1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 12:12:51 +0200 Subject: [PATCH 071/316] fix(web-clipper): undefined variable in popup --- apps/web-clipper/entrypoints/popup/popup.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/web-clipper/entrypoints/popup/popup.js b/apps/web-clipper/entrypoints/popup/popup.js index 775a3ec0c8..ec5ee67f82 100644 --- a/apps/web-clipper/entrypoints/popup/popup.js +++ b/apps/web-clipper/entrypoints/popup/popup.js @@ -161,8 +161,7 @@ browser.runtime.onMessage.addListener(request => { if (searchNote.status === 'found'){ const a = createLink({name: 'openNoteInTrilium', noteId: searchNote.noteId}, "Open in Trilium.") - noteFound = `Already visited website!`; - $alreadyVisited.html(noteFound); + $alreadyVisited.text(`Already visited website!`); $alreadyVisited[0].appendChild(a); }else{ $alreadyVisited.html(''); From 2e144fac5eb8b94ccbc1c124bfe4065ae412f091 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 12:35:31 +0200 Subject: [PATCH 072/316] chore(web-clipper): set up for TypeScript --- apps/web-clipper/tsconfig.json | 6 ++++++ apps/web-clipper/{wxt.config.js => wxt.config.ts} | 2 +- package.json | 2 +- tsconfig.json | 3 +++ 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 apps/web-clipper/tsconfig.json rename apps/web-clipper/{wxt.config.js => wxt.config.ts} (93%) diff --git a/apps/web-clipper/tsconfig.json b/apps/web-clipper/tsconfig.json new file mode 100644 index 0000000000..bed55354b9 --- /dev/null +++ b/apps/web-clipper/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": [ + "../../tsconfig.base.json", + "./.wxt/tsconfig.json" + ] +} \ No newline at end of file diff --git a/apps/web-clipper/wxt.config.js b/apps/web-clipper/wxt.config.ts similarity index 93% rename from apps/web-clipper/wxt.config.js rename to apps/web-clipper/wxt.config.ts index ec61bac134..7a3ec383c9 100644 --- a/apps/web-clipper/wxt.config.js +++ b/apps/web-clipper/wxt.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from "vite"; +import { defineConfig } from "wxt"; export default defineConfig({ modules: ['@wxt-dev/auto-icons'], diff --git a/package.json b/package.json index e71d37e9bd..7ec68ed23f 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "dev:linter-check": "cross-env NODE_OPTIONS=--max_old_space_size=4096 eslint .", "dev:linter-fix": "cross-env NODE_OPTIONS=--max_old_space_size=4096 eslint . --fix", "postinstall": "tsx scripts/electron-rebuild.mts && pnpm prepare", - "prepare": "pnpm run --filter pdfjs-viewer --filter share-theme build" + "prepare": "pnpm run --filter pdfjs-viewer --filter share-theme build && pnpm run --filter web-clipper postinstall" }, "private": true, "devDependencies": { diff --git a/tsconfig.json b/tsconfig.json index fb9d2774aa..9fc01bb4d7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,6 +24,9 @@ { "path": "./apps/website" }, + { + "path": "./apps/web-clipper" + }, { "path": "./apps/dump-db" }, From 266494ba8c54aea831e79b15ff6a46901baa96e8 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 13:20:27 +0200 Subject: [PATCH 073/316] chore(web-clipper): port most files to TypeScript --- .../background/trilium_server_facade.js | 223 --------------- .../background/trilium_server_facade.ts | 253 ++++++++++++++++++ .../content/{index.js => index.ts} | 98 +++---- .../entrypoints/options/index.html | 2 +- .../options/{index.js => index.ts} | 22 +- apps/web-clipper/entrypoints/popup/index.html | 2 +- .../entrypoints/popup/{popup.js => popup.ts} | 12 +- apps/web-clipper/types.d.ts | 7 + 8 files changed, 329 insertions(+), 290 deletions(-) delete mode 100644 apps/web-clipper/entrypoints/background/trilium_server_facade.js create mode 100644 apps/web-clipper/entrypoints/background/trilium_server_facade.ts rename apps/web-clipper/entrypoints/content/{index.js => index.ts} (79%) rename apps/web-clipper/entrypoints/options/{index.js => index.ts} (77%) rename apps/web-clipper/entrypoints/popup/{popup.js => popup.ts} (95%) create mode 100644 apps/web-clipper/types.d.ts diff --git a/apps/web-clipper/entrypoints/background/trilium_server_facade.js b/apps/web-clipper/entrypoints/background/trilium_server_facade.js deleted file mode 100644 index b1a56a7ec4..0000000000 --- a/apps/web-clipper/entrypoints/background/trilium_server_facade.js +++ /dev/null @@ -1,223 +0,0 @@ -const PROTOCOL_VERSION_MAJOR = 1; - -export function isDevEnv() { - const manifest = browser.runtime.getManifest(); - - return manifest.name.endsWith('(dev)'); -} - -export default class TriliumServerFacade { - constructor() { - this.triggerSearchForTrilium(); - - // continually scan for changes (if e.g. desktop app is started after browser) - setInterval(() => this.triggerSearchForTrilium(), 60 * 1000); - } - - async sendTriliumSearchStatusToPopup() { - try { - await browser.runtime.sendMessage({ - name: "trilium-search-status", - triliumSearch: this.triliumSearch - }); - } - catch (e) {} // nothing might be listening - } - async sendTriliumSearchNoteToPopup(){ - try{ - await browser.runtime.sendMessage({ - name: "trilium-previously-visited", - searchNote: this.triliumSearchNote - }) - - } - catch (e) {} // nothing might be listening - } - - setTriliumSearchNote(st){ - this.triliumSearchNote = st; - this.sendTriliumSearchNoteToPopup(); - } - - setTriliumSearch(ts) { - this.triliumSearch = ts; - - this.sendTriliumSearchStatusToPopup(); - } - - setTriliumSearchWithVersionCheck(json, resp) { - const [major, minor] = json.protocolVersion - .split(".") - .map(chunk => parseInt(chunk)); - - // minor version is intended to be used to dynamically limit features provided by extension - // if some specific Trilium API is not supported. So far not needed. - - if (major !== PROTOCOL_VERSION_MAJOR) { - this.setTriliumSearch({ - status: 'version-mismatch', - extensionMajor: PROTOCOL_VERSION_MAJOR, - triliumMajor: major - }); - } - else { - this.setTriliumSearch(resp); - } - } - - async triggerSearchForTrilium() { - this.setTriliumSearch({ status: 'searching' }); - - try { - const port = await this.getPort(); - - console.debug('Trying port ' + port); - - const resp = await fetch(`http://127.0.0.1:${port}/api/clipper/handshake`); - - const text = await resp.text(); - - console.log("Received response:", text); - - const json = JSON.parse(text); - - if (json.appName === 'trilium') { - this.setTriliumSearchWithVersionCheck(json, { - status: 'found-desktop', - port: port, - url: 'http://127.0.0.1:' + port - }); - - return; - } - } - catch (error) { - // continue - } - - const {triliumServerUrl} = await browser.storage.sync.get("triliumServerUrl"); - const {authToken} = await browser.storage.sync.get("authToken"); - - if (triliumServerUrl && authToken) { - try { - const resp = await fetch(triliumServerUrl + '/api/clipper/handshake', { - headers: { - Authorization: authToken - } - }); - - const text = await resp.text(); - - console.log("Received response:", text); - - const json = JSON.parse(text); - - if (json.appName === 'trilium') { - this.setTriliumSearchWithVersionCheck(json, { - status: 'found-server', - url: triliumServerUrl, - token: authToken - }); - - return; - } - } - catch (e) { - console.log("Request to the configured server instance failed with:", e); - } - } - - // if all above fails it's not found - this.setTriliumSearch({ status: 'not-found' }); - } - - async triggerSearchNoteByUrl(noteUrl) { - const resp = await this.callService('GET', 'notes-by-url/' + encodeURIComponent(noteUrl)) - let newStatus = { - status: 'not-found', - noteId: null - } - if (resp && resp.noteId) { - newStatus.noteId = resp.noteId; - newStatus.status = 'found'; - } - this.setTriliumSearchNote(newStatus); - } - async waitForTriliumSearch() { - return new Promise((res, rej) => { - const checkStatus = () => { - if (this.triliumSearch.status === "searching") { - setTimeout(checkStatus, 500); - } - else if (this.triliumSearch.status === 'not-found') { - rej(new Error("Trilium instance has not been found.")); - } - else { - res(); - } - }; - - checkStatus(); - }); - } - - async getPort() { - const {triliumDesktopPort} = await browser.storage.sync.get("triliumDesktopPort"); - - if (triliumDesktopPort) { - return parseInt(triliumDesktopPort); - } - else { - return isDevEnv() ? 37740 : 37840; - } - } - - async callService(method, path, body) { - const fetchOptions = { - method: method, - headers: { - 'Content-Type': 'application/json' - }, - }; - - if (body) { - fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body); - } - - try { - await this.waitForTriliumSearch(); - - fetchOptions.headers.Authorization = this.triliumSearch.token || ""; - fetchOptions.headers['trilium-local-now-datetime'] = this.localNowDateTime(); - - const url = this.triliumSearch.url + "/api/clipper/" + path; - - console.log(`Sending ${method} request to ${url}`); - - const response = await fetch(url, fetchOptions); - - if (!response.ok) { - throw new Error(await response.text()); - } - - return await response.json(); - } - catch (e) { - console.log("Sending request to trilium failed", e); - - toast('Your request failed because we could not contact Trilium instance. Please make sure Trilium is running and is accessible.'); - - return null; - } - } - - localNowDateTime() { - const date = new Date(); - const off = date.getTimezoneOffset(); - const absoff = Math.abs(off); - return (new Date(date.getTime() - off * 60 * 1000).toISOString().substr(0,23).replace("T", " ") + - (off > 0 ? '-' : '+') + - (absoff / 60).toFixed(0).padStart(2,'0') + ':' + - (absoff % 60).toString().padStart(2,'0')); - } -} diff --git a/apps/web-clipper/entrypoints/background/trilium_server_facade.ts b/apps/web-clipper/entrypoints/background/trilium_server_facade.ts new file mode 100644 index 0000000000..f9854437f4 --- /dev/null +++ b/apps/web-clipper/entrypoints/background/trilium_server_facade.ts @@ -0,0 +1,253 @@ +const PROTOCOL_VERSION_MAJOR = 1; + +export function isDevEnv() { + const manifest = browser.runtime.getManifest(); + + return manifest.name.endsWith('(dev)'); +} + +type TriliumSearchStatus = { + status: "searching"; +} | { + status: "not-found" +} | { + status: "found-desktop", + port: number; + url: string; +} | { + status: "found-server", + url: string; + token: string; +} | { + status: "version-mismatch"; + extensionMajor: number; + triliumMajor: number; +}; + +type TriliumSearchNoteStatus = { + status: "not-found", + noteId: null +} | { + status: "found", + noteId: string +}; + +export default class TriliumServerFacade { + private triliumSearch?: TriliumSearchStatus; + private triliumSearchNote?: TriliumSearchNoteStatus; + + constructor() { + this.triggerSearchForTrilium(); + + // continually scan for changes (if e.g. desktop app is started after browser) + setInterval(() => this.triggerSearchForTrilium(), 60 * 1000); + } + + async sendTriliumSearchStatusToPopup() { + try { + await browser.runtime.sendMessage({ + name: "trilium-search-status", + triliumSearch: this.triliumSearch + }); + } + catch (e) {} // nothing might be listening + } + async sendTriliumSearchNoteToPopup(){ + try{ + await browser.runtime.sendMessage({ + name: "trilium-previously-visited", + searchNote: this.triliumSearchNote + }); + + } + catch (e) {} // nothing might be listening + } + + setTriliumSearchNote(st){ + this.triliumSearchNote = st; + this.sendTriliumSearchNoteToPopup(); + } + + setTriliumSearch(ts: TriliumSearchStatus) { + this.triliumSearch = ts; + + this.sendTriliumSearchStatusToPopup(); + } + + setTriliumSearchWithVersionCheck(json: { protocolVersion: string }, resp: TriliumSearchStatus) { + const [major, minor] = json.protocolVersion + .split(".") + .map(chunk => parseInt(chunk, 10)); + + // minor version is intended to be used to dynamically limit features provided by extension + // if some specific Trilium API is not supported. So far not needed. + + if (major !== PROTOCOL_VERSION_MAJOR) { + this.setTriliumSearch({ + status: 'version-mismatch', + extensionMajor: PROTOCOL_VERSION_MAJOR, + triliumMajor: major + }); + } + else { + this.setTriliumSearch(resp); + } + } + + async triggerSearchForTrilium() { + this.setTriliumSearch({ status: 'searching' }); + + try { + const port = await this.getPort(); + + console.debug(`Trying port ${ port}`); + + const resp = await fetch(`http://127.0.0.1:${port}/api/clipper/handshake`); + + const text = await resp.text(); + + console.log("Received response:", text); + + const json = JSON.parse(text); + + if (json.appName === 'trilium') { + this.setTriliumSearchWithVersionCheck(json, { + status: 'found-desktop', + port, + url: `http://127.0.0.1:${port}` + }); + + return; + } + } + catch (error) { + // continue + } + + const {triliumServerUrl} = await browser.storage.sync.get<{ triliumServerUrl: string }>("triliumServerUrl"); + const {authToken} = await browser.storage.sync.get<{ authToken: string }>("authToken"); + + if (triliumServerUrl && authToken) { + try { + const resp = await fetch(`${triliumServerUrl }/api/clipper/handshake`, { + headers: { + Authorization: authToken + } + }); + + const text = await resp.text(); + + console.log("Received response:", text); + + const json = JSON.parse(text); + + if (json.appName === 'trilium') { + this.setTriliumSearchWithVersionCheck(json, { + status: 'found-server', + url: triliumServerUrl, + token: authToken + }); + + return; + } + } + catch (e) { + console.log("Request to the configured server instance failed with:", e); + } + } + + // if all above fails it's not found + this.setTriliumSearch({ status: 'not-found' }); + } + + async triggerSearchNoteByUrl(noteUrl) { + const resp = await this.callService('GET', `notes-by-url/${encodeURIComponent(noteUrl)}`); + let newStatus: TriliumSearchNoteStatus; + if (resp && resp.noteId) { + newStatus = { + status: 'found', + noteId: resp.noteId, + }; + } else { + newStatus = { + status: 'not-found', + noteId: null + }; + } + this.setTriliumSearchNote(newStatus); + } + async waitForTriliumSearch() { + return new Promise((res, rej) => { + const checkStatus = () => { + if (this.triliumSearch?.status === "searching") { + setTimeout(checkStatus, 500); + } else if (this.triliumSearch?.status === 'not-found') { + rej(new Error("Trilium instance has not been found.")); + } else { + res(); + } + }; + + checkStatus(); + }); + } + + async getPort() { + const {triliumDesktopPort} = await browser.storage.sync.get<{ triliumDesktopPort: string }>("triliumDesktopPort"); + + if (triliumDesktopPort) { + return parseInt(triliumDesktopPort, 10); + } + + return isDevEnv() ? 37740 : 37840; + } + + async callService(method: string, path: string, body?: string | object) { + await this.waitForTriliumSearch(); + if (!this.triliumSearch || (this.triliumSearch.status !== 'found-desktop' && this.triliumSearch.status !== 'found-server')) return; + + try { + const fetchOptions: RequestInit = { + method, + headers: { + Authorization: "token" in this.triliumSearch ? this.triliumSearch.token ?? "" : "", + 'Content-Type': 'application/json', + 'trilium-local-now-datetime': this.localNowDateTime() + }, + }; + + if (body) { + fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body); + } + + const url = `${this.triliumSearch.url}/api/clipper/${path}`; + + console.log(`Sending ${method} request to ${url}`); + + const response = await fetch(url, fetchOptions); + + if (!response.ok) { + throw new Error(await response.text()); + } + + return await response.json(); + } + catch (e) { + console.log("Sending request to trilium failed", e); + + window.showToast('Your request failed because we could not contact Trilium instance. Please make sure Trilium is running and is accessible.'); + + return null; + } + } + + localNowDateTime() { + const date = new Date(); + const off = date.getTimezoneOffset(); + const absoff = Math.abs(off); + return (`${new Date(date.getTime() - off * 60 * 1000).toISOString().substr(0,23).replace("T", " ") + + (off > 0 ? '-' : '+') + + (absoff / 60).toFixed(0).padStart(2,'0') }:${ + (absoff % 60).toString().padStart(2,'0')}`); + } +} diff --git a/apps/web-clipper/entrypoints/content/index.js b/apps/web-clipper/entrypoints/content/index.ts similarity index 79% rename from apps/web-clipper/entrypoints/content/index.js rename to apps/web-clipper/entrypoints/content/index.ts index e5c3642479..0ee35ef0d8 100644 --- a/apps/web-clipper/entrypoints/content/index.js +++ b/apps/web-clipper/entrypoints/content/index.ts @@ -1,5 +1,5 @@ -import { createLink, getBaseUrl, getPageLocationOrigin, randomString } from "../../utils.js"; import Readability from "../../lib/Readability.js"; +import { createLink, getBaseUrl, getPageLocationOrigin, randomString } from "../../utils.js"; export default defineContentScript({ matches: [ @@ -19,10 +19,10 @@ export default defineContentScript({ if (url.indexOf('//') === 0) { return location.protocol + url; } else if (url[0] === '/') { - return location.protocol + '//' + location.host + url; - } else { - return getBaseUrl() + '/' + url; + return `${location.protocol}//${location.host}${url}`; } + return `${getBaseUrl()}/${url}`; + } function pageTitle() { @@ -47,40 +47,37 @@ export default defineContentScript({ return { title: article.title, body: article.content, - } + }; } function getDocumentDates() { - var dates = { - publishedDate: null, - modifiedDate: null, - }; + let publishedDate: Date | null = null; + let modifiedDate: Date | null = null; - const articlePublishedTime = document.querySelector("meta[property='article:published_time']"); - if (articlePublishedTime && articlePublishedTime.getAttribute('content')) { - dates.publishedDate = new Date(articlePublishedTime.getAttribute('content')); + const articlePublishedTime = document.querySelector("meta[property='article:published_time']")?.getAttribute('content'); + if (articlePublishedTime && articlePublishedTime) { + publishedDate = new Date(articlePublishedTime); } - const articleModifiedTime = document.querySelector("meta[property='article:modified_time']"); - if (articleModifiedTime && articleModifiedTime.getAttribute('content')) { - dates.modifiedDate = new Date(articleModifiedTime.getAttribute('content')); + const articleModifiedTime = document.querySelector("meta[property='article:modified_time']")?.getAttribute('content'); + if (articleModifiedTime && articleModifiedTime) { + modifiedDate = new Date(articleModifiedTime); } // TODO: if we didn't get dates from meta, then try to get them from JSON-LD - - return dates; + return { publishedDate, modifiedDate }; } function getRectangleArea() { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { const overlay = document.createElement('div'); overlay.style.opacity = '0.6'; overlay.style.background = 'black'; overlay.style.width = '100%'; overlay.style.height = '100%'; - overlay.style.zIndex = 99999999; - overlay.style.top = 0; - overlay.style.left = 0; + overlay.style.zIndex = "99999999"; + overlay.style.top = "0"; + overlay.style.left = "0"; overlay.style.position = 'fixed'; document.body.appendChild(overlay); @@ -92,15 +89,15 @@ export default defineContentScript({ messageComp.style.position = 'fixed'; messageComp.style.opacity = '0.95'; messageComp.style.fontSize = '14px'; - messageComp.style.width = messageCompWidth + 'px'; - messageComp.style.maxWidth = messageCompWidth + 'px'; + messageComp.style.width = `${messageCompWidth }px`; + messageComp.style.maxWidth = `${messageCompWidth }px`; messageComp.style.border = '1px solid black'; messageComp.style.background = 'white'; messageComp.style.color = 'black'; messageComp.style.top = '10px'; messageComp.style.textAlign = 'center'; messageComp.style.padding = '10px'; - messageComp.style.left = Math.round(document.body.clientWidth / 2 - messageCompWidth / 2) + 'px'; + messageComp.style.left = `${Math.round(document.body.clientWidth / 2 - messageCompWidth / 2) }px`; messageComp.style.zIndex = overlay.style.zIndex + 1; messageComp.textContent = 'Drag and release to capture a screenshot'; @@ -112,9 +109,9 @@ export default defineContentScript({ selection.style.border = '1px solid red'; selection.style.background = 'white'; selection.style.border = '2px solid black'; - selection.style.zIndex = overlay.style.zIndex - 1; - selection.style.top = 0; - selection.style.left = 0; + selection.style.zIndex = String(parseInt(overlay.style.zIndex, 10) - 1); + selection.style.top = "0"; + selection.style.left = "0"; selection.style.position = 'fixed'; document.body.appendChild(selection); @@ -122,17 +119,19 @@ export default defineContentScript({ messageComp.focus(); // we listen on keypresses on this element to cancel on escape let isDragging = false; - let draggingStartPos = null; - let selectionArea = {}; + let draggingStartPos: {x: number, y: number} | null = null; + let selectionArea: {x?: number, y?: number, width?: number, height?: number} = {}; function updateSelection() { - selection.style.left = selectionArea.x + 'px'; - selection.style.top = selectionArea.y + 'px'; - selection.style.width = selectionArea.width + 'px'; - selection.style.height = selectionArea.height + 'px'; + selection.style.left = `${selectionArea.x}px`; + selection.style.top = `${selectionArea.y}px`; + selection.style.width = `${selectionArea.width}px`; + selection.style.height = `${selectionArea.height}px`; } function setSelectionSizeFromMouse(event) { + if (!draggingStartPos) return; + if (event.clientX < draggingStartPos.x) { selectionArea.x = event.clientX; } @@ -209,8 +208,8 @@ export default defineContentScript({ } } - function getImages(container) { - const images = []; + function getImages(container: HTMLElement) { + const images: {imageId: string, src: string}[] = []; for (const img of container.getElementsByTagName('img')) { if (!img.src) { @@ -226,7 +225,7 @@ export default defineContentScript({ const imageId = randomString(20); images.push({ - imageId: imageId, + imageId, src: img.src }); @@ -237,16 +236,16 @@ export default defineContentScript({ return images; } - async function prepareMessageResponse(message) { - console.info('Message: ' + message.name); + async function prepareMessageResponse(message: {name: string, noteId?: string, message?: string, tabIds?: string[]}) { + console.info(`Message: ${ message.name}`); if (message.name === "toast") { let messageText; if (message.noteId) { messageText = document.createElement('p'); - messageText.setAttribute("style", "padding: 0; margin: 0; font-size: larger;") - messageText.appendChild(document.createTextNode(message.message + " ")); + messageText.setAttribute("style", "padding: 0; margin: 0; font-size: larger;"); + messageText.appendChild(document.createTextNode(`${message.message } `)); messageText.appendChild(createLink( {name: 'openNoteInTrilium', noteId: message.noteId}, "Open in Trilium." @@ -268,7 +267,7 @@ export default defineContentScript({ await import("../../lib/toast"); - showToast(messageText, { + window.showToast(messageText, { settings: { duration: 7000 } @@ -278,6 +277,9 @@ export default defineContentScript({ const container = document.createElement('div'); const selection = window.getSelection(); + if (!selection || selection.rangeCount === 0) { + throw new Error('No selection available to clip'); + } for (let i = 0; i < selection.rangeCount; i++) { const range = selection.getRangeAt(i); @@ -292,7 +294,7 @@ export default defineContentScript({ return { title: pageTitle(), content: container.innerHTML, - images: images, + images, pageUrl: getPageLocationOrigin() + location.pathname + location.search + location.hash }; @@ -307,26 +309,26 @@ export default defineContentScript({ const images = getImages(body); - var labels = {}; + const labels = {}; const dates = getDocumentDates(); if (dates.publishedDate) { labels['publishedDate'] = dates.publishedDate.toISOString().substring(0, 10); } if (dates.modifiedDate) { - labels['modifiedDate'] = dates.publishedDate.toISOString().substring(0, 10); + labels['modifiedDate'] = dates.modifiedDate.toISOString().substring(0, 10); } return { - title: title, + title, content: body.innerHTML, - images: images, + images, pageUrl: getPageLocationOrigin() + location.pathname + location.search, clipType: 'page', - labels: labels + labels }; } else { - throw new Error('Unknown command: ' + JSON.stringify(message)); + throw new Error(`Unknown command: ${ JSON.stringify(message)}`); } } diff --git a/apps/web-clipper/entrypoints/options/index.html b/apps/web-clipper/entrypoints/options/index.html index 16e084ded9..4aa2969c22 100644 --- a/apps/web-clipper/entrypoints/options/index.html +++ b/apps/web-clipper/entrypoints/options/index.html @@ -56,7 +56,7 @@ - + diff --git a/apps/web-clipper/entrypoints/options/index.js b/apps/web-clipper/entrypoints/options/index.ts similarity index 77% rename from apps/web-clipper/entrypoints/options/index.js rename to apps/web-clipper/entrypoints/options/index.ts index 03c05822ca..da8fa1850a 100644 --- a/apps/web-clipper/entrypoints/options/index.js +++ b/apps/web-clipper/entrypoints/options/index.ts @@ -17,8 +17,8 @@ function showSuccess(message) { async function saveTriliumServerSetup(e) { e.preventDefault(); - if ($triliumServerUrl.val().trim().length === 0 - || $triliumServerPassword.val().trim().length === 0) { + if (($triliumServerUrl.val() as string | undefined)?.trim().length === 0 + || ($triliumServerPassword.val() as string | undefined)?.trim().length === 0) { showError("One or more mandatory inputs are missing. Please fill in server URL and password."); return; @@ -27,7 +27,7 @@ async function saveTriliumServerSetup(e) { let resp; try { - resp = await fetch($triliumServerUrl.val() + '/api/login/token', { + resp = await fetch(`${$triliumServerUrl.val() }/api/login/token`, { method: "POST", headers: { 'Accept': 'application/json', @@ -39,7 +39,8 @@ async function saveTriliumServerSetup(e) { }); } catch (e) { - showError("Unknown error: " + e.message); + const message = e instanceof Error ? e.message : String(e); + showError(`Unknown error: ${message}`); return; } @@ -47,7 +48,7 @@ async function saveTriliumServerSetup(e) { showError("Incorrect credentials."); } else if (resp.status !== 200) { - showError("Unrecognised response with status code " + resp.status); + showError(`Unrecognised response with status code ${ resp.status}`); } else { const json = await resp.json(); @@ -89,8 +90,8 @@ const $triilumDesktopSetupForm = $("#trilium-desktop-setup-form"); $triilumDesktopSetupForm.on("submit", e => { e.preventDefault(); - const port = $triliumDesktopPort.val().trim(); - const portNum = parseInt(port); + const port = ($triliumDesktopPort.val() as string | undefined ?? "").trim(); + const portNum = parseInt(port, 10); if (port && (isNaN(portNum) || portNum <= 0 || portNum >= 65536)) { showError(`Please enter valid port number.`); @@ -105,8 +106,8 @@ $triilumDesktopSetupForm.on("submit", e => { }); async function restoreOptions() { - const {triliumServerUrl} = await browser.storage.sync.get("triliumServerUrl"); - const {authToken} = await browser.storage.sync.get("authToken"); + const {triliumServerUrl} = await browser.storage.sync.get<{ triliumServerUrl: string }>("triliumServerUrl"); + const {authToken} = await browser.storage.sync.get<{ authToken: string }>("authToken"); $errorMessage.hide(); $successMessage.hide(); @@ -127,8 +128,7 @@ async function restoreOptions() { $triliumServerConfiguredDiv.hide(); } - const {triliumDesktopPort} = await browser.storage.sync.get("triliumDesktopPort"); - + const {triliumDesktopPort} = await browser.storage.sync.get<{ triliumDesktopPort: string }>("triliumDesktopPort"); $triliumDesktopPort.val(triliumDesktopPort); } diff --git a/apps/web-clipper/entrypoints/popup/index.html b/apps/web-clipper/entrypoints/popup/index.html index 0479588e73..a1051659f3 100644 --- a/apps/web-clipper/entrypoints/popup/index.html +++ b/apps/web-clipper/entrypoints/popup/index.html @@ -48,7 +48,7 @@ - + diff --git a/apps/web-clipper/entrypoints/popup/popup.js b/apps/web-clipper/entrypoints/popup/popup.ts similarity index 95% rename from apps/web-clipper/entrypoints/popup/popup.js rename to apps/web-clipper/entrypoints/popup/popup.ts index ec5ee67f82..8f8220de1f 100644 --- a/apps/web-clipper/entrypoints/popup/popup.js +++ b/apps/web-clipper/entrypoints/popup/popup.ts @@ -38,9 +38,9 @@ $saveTabsButton.on("click", () => sendMessage({name: 'save-tabs'})); const $saveLinkWithNoteWrapper = $("#save-link-with-note-wrapper"); const $textNote = $("#save-link-with-note-textarea"); -const $keepTitle = $("#keep-title-checkbox"); +const $keepTitle = $("#keep-title-checkbox"); -$textNote.on('keypress', function (event) { +$textNote.on('keypress', (event) => { if ((event.which === 10 || event.which === 13) && event.ctrlKey) { saveLinkWithNote(); return false; @@ -63,7 +63,7 @@ $("#cancel-button").on("click", () => { }); async function saveLinkWithNote() { - const textNoteVal = $textNote.val().trim(); + const textNoteVal = ($textNote.val() as string | undefined ?? "").trim(); let title, content; if (!textNoteVal) { @@ -111,7 +111,7 @@ function escapeHtml(string) { const htmlWithPars = pre.innerHTML.replace(/\n/g, "

"); - return '

' + htmlWithPars + '

'; + return `

${ htmlWithPars }

`; } const $connectionStatus = $("#connection-status"); @@ -160,7 +160,7 @@ browser.runtime.onMessage.addListener(request => { const {searchNote} = request; if (searchNote.status === 'found'){ const a = createLink({name: 'openNoteInTrilium', noteId: searchNote.noteId}, - "Open in Trilium.") + "Open in Trilium."); $alreadyVisited.text(`Already visited website!`); $alreadyVisited[0].appendChild(a); }else{ @@ -176,7 +176,7 @@ const $checkConnectionButton = $("#check-connection-button"); $checkConnectionButton.on("click", () => { browser.runtime.sendMessage({ name: "trigger-trilium-search" - }) + }); }); $(() => browser.runtime.sendMessage({name: "send-trilium-search-status"})); diff --git a/apps/web-clipper/types.d.ts b/apps/web-clipper/types.d.ts new file mode 100644 index 0000000000..4d83d0f28e --- /dev/null +++ b/apps/web-clipper/types.d.ts @@ -0,0 +1,7 @@ +interface Window { + showToast(message: string, opts?: { + settings?: { + duration: number; + } + }): void; +} From 4011771b64e3deae02b6d6ef067b7749abcea6ea Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 13:58:23 +0200 Subject: [PATCH 074/316] chore(web-clipper): port the remaining files to TypeScript --- apps/web-clipper/build.js | 1 - apps/web-clipper/build.ts | 1 + .../background/{index.js => index.ts} | 93 +++++++++---------- apps/web-clipper/entrypoints/popup/index.html | 1 - apps/web-clipper/{utils.js => utils.ts} | 14 +-- 5 files changed, 51 insertions(+), 59 deletions(-) delete mode 100644 apps/web-clipper/build.js create mode 100644 apps/web-clipper/build.ts rename apps/web-clipper/entrypoints/background/{index.js => index.ts} (83%) rename apps/web-clipper/{utils.js => utils.ts} (75%) diff --git a/apps/web-clipper/build.js b/apps/web-clipper/build.js deleted file mode 100644 index 3826b25246..0000000000 --- a/apps/web-clipper/build.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = { buildDate:"2022-10-29T15:25:37+02:00", buildRevision: "c9c10a90aa9b94efdf150b0b2fd57f9df5bf2d0a" }; diff --git a/apps/web-clipper/build.ts b/apps/web-clipper/build.ts new file mode 100644 index 0000000000..2f5056d477 --- /dev/null +++ b/apps/web-clipper/build.ts @@ -0,0 +1 @@ +export default { buildDate:"2022-10-29T15:25:37+02:00", buildRevision: "c9c10a90aa9b94efdf150b0b2fd57f9df5bf2d0a" }; diff --git a/apps/web-clipper/entrypoints/background/index.js b/apps/web-clipper/entrypoints/background/index.ts similarity index 83% rename from apps/web-clipper/entrypoints/background/index.js rename to apps/web-clipper/entrypoints/background/index.ts index e8d3c6d038..c36aa48994 100644 --- a/apps/web-clipper/entrypoints/background/index.js +++ b/apps/web-clipper/entrypoints/background/index.ts @@ -1,11 +1,13 @@ import { randomString } from "../../utils"; import TriliumServerFacade, { isDevEnv } from "./trilium_server_facade"; +type Rect = { x: number, y: number, width: number, height: number }; + export default defineBackground(() => { const triliumServerFacade = new TriliumServerFacade(); // Keyboard shortcuts - chrome.commands.onCommand.addListener(async function (command) { + browser.commands.onCommand.addListener(async (command) => { if (command == "saveSelection") { await saveSelection(); } else if (command == "saveWholePage") { @@ -21,8 +23,8 @@ export default defineBackground(() => { } }); - function cropImage(newArea, dataUrl) { - return new Promise((resolve, reject) => { + function cropImage(newArea: Rect, dataUrl: string) { + return new Promise((resolve) => { const img = new Image(); img.onload = function () { @@ -31,8 +33,7 @@ export default defineBackground(() => { canvas.height = newArea.height; const ctx = canvas.getContext('2d'); - - ctx.drawImage(img, newArea.x, newArea.y, newArea.width, newArea.height, 0, 0, newArea.width, newArea.height); + ctx?.drawImage(img, newArea.x, newArea.y, newArea.width, newArea.height, 0, 0, newArea.width, newArea.height); resolve(canvas.toDataURL()); }; @@ -41,17 +42,17 @@ export default defineBackground(() => { }); } - async function takeCroppedScreenshot(cropRect) { + async function takeCroppedScreenshot(cropRect: Rect) { const activeTab = await getActiveTab(); const zoom = await browser.tabs.getZoom(activeTab.id) * window.devicePixelRatio; - const newArea = Object.assign({}, cropRect); + const newArea: Rect = Object.assign({}, cropRect); newArea.x *= zoom; newArea.y *= zoom; newArea.width *= zoom; newArea.height *= zoom; - const dataUrl = await browser.tabs.captureVisibleTab(null, { format: 'png' }); + const dataUrl = await browser.tabs.captureVisibleTab({ format: 'png' }); return await cropImage(newArea, dataUrl); } @@ -61,7 +62,7 @@ export default defineBackground(() => { // workaround to save the whole page is to scroll & stitch // example in https://github.com/mrcoles/full-page-screen-capture-chrome-extension // see page.js and popup.js - return await browser.tabs.captureVisibleTab(null, { format: 'png' }); + return await browser.tabs.captureVisibleTab({ format: 'png' }); } browser.runtime.onInstalled.addListener(() => { @@ -134,52 +135,47 @@ export default defineBackground(() => { async function sendMessageToActiveTab(message) { const activeTab = await getActiveTab(); - if (!activeTab) { + if (!activeTab?.id) { throw new Error("No active tab."); } - try { - return await browser.tabs.sendMessage(activeTab.id, message); - } - catch (e) { - throw e; - } + return await browser.tabs.sendMessage(activeTab.id, message); } - function toast(message, noteId = null, tabIds = null) { + function toast(message: string, noteId: string | null = null, tabIds: number[] | null = null) { sendMessageToActiveTab({ name: 'toast', - message: message, - noteId: noteId, - tabIds: tabIds + message, + noteId, + tabIds }); } - function blob2base64(blob) { - return new Promise(resolve => { + function blob2base64(blob: Blob) { + return new Promise(resolve => { const reader = new FileReader(); reader.onloadend = function() { - resolve(reader.result); + resolve(reader.result as string | null); }; reader.readAsDataURL(blob); }); } - async function fetchImage(url) { + async function fetchImage(url: string) { const resp = await fetch(url); const blob = await resp.blob(); return await blob2base64(blob); } - async function postProcessImage(image) { + async function postProcessImage(image: { src: string, dataUrl?: string | null }) { if (image.src.startsWith("data:image/")) { image.dataUrl = image.src; - image.src = "inline." + image.src.substr(11, 3); // this should extract file type - png/jpg + image.src = `inline.${ image.src.substr(11, 3)}`; // this should extract file type - png/jpg } else { try { - image.dataUrl = await fetchImage(image.src, image); + image.dataUrl = await fetchImage(image.src); } catch (e) { console.log(`Cannot fetch image from ${image.src}`); @@ -187,7 +183,7 @@ export default defineBackground(() => { } } - async function postProcessImages(resp) { + async function postProcessImages(resp: { images?: { src: string, dataUrl?: string }[] }) { if (resp.images) { for (const image of resp.images) { await postProcessImage(image); @@ -212,7 +208,7 @@ export default defineBackground(() => { async function getImagePayloadFromSrc(src, pageUrl) { const image = { imageId: randomString(20), - src: src + src }; await postProcessImage(image); @@ -223,7 +219,7 @@ export default defineBackground(() => { title: activeTab.title, content: ``, images: [image], - pageUrl: pageUrl + pageUrl }; } @@ -291,8 +287,8 @@ export default defineBackground(() => { } const resp = await triliumServerFacade.callService('POST', 'notes', { - title: title, - content: content, + title, + content, clipType: 'note', pageUrl: activeTab.url }); @@ -309,27 +305,27 @@ export default defineBackground(() => { async function getTabsPayload(tabs) { let content = ''; const domainsCount = tabs.map(tab => tab.url) .reduce((acc, url) => { - const hostname = new URL(url).hostname - return acc.set(hostname, (acc.get(hostname) || 0) + 1) + const hostname = new URL(url).hostname; + return acc.set(hostname, (acc.get(hostname) || 0) + 1); }, new Map()); let topDomains = [...domainsCount] - .sort((a, b) => {return b[1]-a[1]}) + .sort((a, b) => {return b[1]-a[1];}) .slice(0,3) .map(domain=>domain[0]) - .join(', ') + .join(', '); - if (tabs.length > 3) { topDomains += '...' } + if (tabs.length > 3) { topDomains += '...'; } return { title: `${tabs.length} browser tabs: ${topDomains}`, - content: content, + content, clipType: 'tabs' }; } @@ -340,17 +336,13 @@ export default defineBackground(() => { const payload = await getTabsPayload(tabs); const resp = await triliumServerFacade.callService('POST', 'notes', payload); + if (!resp) return; - if (!resp) { - return; - } - - const tabIds = tabs.map(tab=>{return tab.id}); - + const tabIds = tabs.map(tab => tab.id!).filter(id => id !== undefined) as number[]; toast(`${tabs.length} links have been saved to Trilium.`, resp.noteId, tabIds); } - browser.contextMenus.onClicked.addListener(async function(info, tab) { + browser.contextMenus.onClicked.addListener(async (info, tab) => { if (info.menuItemId === 'trilium-save-selection') { await saveSelection(); } @@ -365,8 +357,9 @@ export default defineBackground(() => { } else if (info.menuItemId === 'trilium-save-link') { const link = document.createElement("a"); + if (!info.linkUrl) return; link.href = info.linkUrl; - // linkText might be available only in firefox + // linkText is not supported in Chrome/Edge; fallback to selected text or URL link.appendChild(document.createTextNode(info.linkText || info.linkUrl)); const activeTab = await getActiveTab(); @@ -395,7 +388,7 @@ export default defineBackground(() => { console.log("Received", request); if (request.name === 'openNoteInTrilium') { - const resp = await triliumServerFacade.callService('POST', 'open/' + request.noteId); + const resp = await triliumServerFacade.callService('POST', `open/${ request.noteId}`); if (!resp) { return; @@ -406,7 +399,7 @@ export default defineBackground(() => { const {triliumServerUrl} = await browser.storage.sync.get("triliumServerUrl"); if (triliumServerUrl) { - const noteUrl = triliumServerUrl + '/#' + request.noteId; + const noteUrl = `${triliumServerUrl }/#${ request.noteId}`; console.log("Opening new tab in browser", noteUrl); @@ -420,7 +413,7 @@ export default defineBackground(() => { } } else if (request.name === 'closeTabs') { - return await browser.tabs.remove(request.tabIds) + return await browser.tabs.remove(request.tabIds); } else if (request.name === 'save-cropped-screenshot') { const activeTab = await getActiveTab(); diff --git a/apps/web-clipper/entrypoints/popup/index.html b/apps/web-clipper/entrypoints/popup/index.html index a1051659f3..ee4b13871b 100644 --- a/apps/web-clipper/entrypoints/popup/index.html +++ b/apps/web-clipper/entrypoints/popup/index.html @@ -49,7 +49,6 @@ - diff --git a/apps/web-clipper/utils.js b/apps/web-clipper/utils.ts similarity index 75% rename from apps/web-clipper/utils.js rename to apps/web-clipper/utils.ts index a69a00dbab..5c1b3efd6a 100644 --- a/apps/web-clipper/utils.js +++ b/apps/web-clipper/utils.ts @@ -1,4 +1,4 @@ -export function randomString(len) { +export function randomString(len: number) { let text = ""; const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; @@ -13,9 +13,9 @@ export function getBaseUrl() { let output = getPageLocationOrigin() + location.pathname; if (output[output.length - 1] !== '/') { - output = output.split('/'); - output.pop(); - output = output.join('/'); + const outputArr = output.split('/'); + outputArr.pop(); + output = outputArr.join('/'); } return output; @@ -27,14 +27,14 @@ export function getPageLocationOrigin() { return location.protocol === 'file:' ? 'file://' : location.origin; } -export function createLink(clickAction, text, color = "lightskyblue") { +export function createLink(clickAction: object, text: string, color = "lightskyblue") { const link = document.createElement('a'); link.href = "javascript:"; link.style.color = color; link.appendChild(document.createTextNode(text)); link.addEventListener("click", () => { - browser.runtime.sendMessage(null, clickAction) + browser.runtime.sendMessage(null, clickAction); }); - return link + return link; } From a9b8ffd94ce271c1987d93d1f47ab8c58a2f92f2 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 14:26:05 +0200 Subject: [PATCH 075/316] chore(web-clipper): fix package lock --- apps/web-clipper/package.json | 13 +++++++------ pnpm-lock.yaml | 10 ---------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/apps/web-clipper/package.json b/apps/web-clipper/package.json index e7ebd634a9..8dcc7ec6c6 100644 --- a/apps/web-clipper/package.json +++ b/apps/web-clipper/package.json @@ -4,17 +4,18 @@ "description": "", "main": "index.js", "scripts": { - "dev": "wxt", - "dev:firefox": "wxt -b firefox", - "build": "wxt build", - "build:firefox": "wxt build -b firefox", - "zip": "wxt zip", - "zip:firefox": "wxt zip -b firefox", + "dev": "wxt", + "dev:firefox": "wxt -b firefox", + "build": "wxt build", + "build:firefox": "wxt build -b firefox", + "zip": "wxt zip", + "zip:firefox": "wxt zip -b firefox", "postinstall": "wxt prepare" }, "keywords": [], "packageManager": "pnpm@10.28.1", "devDependencies": { + "@wxt-dev/auto-icons": "1.1.0", "wxt": "0.20.13" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d170e3d26d..f4fde97a4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16286,8 +16286,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-export-word@47.4.0': dependencies: @@ -16431,8 +16429,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-indent@47.4.0': dependencies: @@ -16560,8 +16556,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-minimap@47.4.0': dependencies: @@ -16570,8 +16564,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-operations-compressor@47.4.0': dependencies: @@ -16745,8 +16737,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-source-editing-enhanced@47.4.0': dependencies: From e37487a1cfaa447fc5464b778a9760f3e38c30b6 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 15:28:47 +0200 Subject: [PATCH 076/316] feat(web-clipper): handle manifest V3 --- .../entrypoints/background/index.ts | 71 ++++++++++--------- apps/web-clipper/entrypoints/content/index.ts | 11 ++- .../entrypoints/offscreen/index.html | 9 +++ .../entrypoints/offscreen/index.ts | 24 +++++++ apps/web-clipper/utils.ts | 2 + apps/web-clipper/wxt.config.ts | 3 +- 6 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 apps/web-clipper/entrypoints/offscreen/index.html create mode 100644 apps/web-clipper/entrypoints/offscreen/index.ts diff --git a/apps/web-clipper/entrypoints/background/index.ts b/apps/web-clipper/entrypoints/background/index.ts index c36aa48994..a27571884c 100644 --- a/apps/web-clipper/entrypoints/background/index.ts +++ b/apps/web-clipper/entrypoints/background/index.ts @@ -1,7 +1,6 @@ -import { randomString } from "../../utils"; -import TriliumServerFacade, { isDevEnv } from "./trilium_server_facade"; +import { randomString, Rect } from "@/utils"; -type Rect = { x: number, y: number, width: number, height: number }; +import TriliumServerFacade, { isDevEnv } from "./trilium_server_facade"; export default defineBackground(() => { const triliumServerFacade = new TriliumServerFacade(); @@ -23,38 +22,46 @@ export default defineBackground(() => { } }); - function cropImage(newArea: Rect, dataUrl: string) { - return new Promise((resolve) => { - const img = new Image(); - - img.onload = function () { - const canvas = document.createElement('canvas'); - canvas.width = newArea.width; - canvas.height = newArea.height; - - const ctx = canvas.getContext('2d'); - ctx?.drawImage(img, newArea.x, newArea.y, newArea.width, newArea.height, 0, 0, newArea.width, newArea.height); - - resolve(canvas.toDataURL()); - }; - - img.src = dataUrl; - }); - } - - async function takeCroppedScreenshot(cropRect: Rect) { + async function takeCroppedScreenshot(cropRect: Rect, devicePixelRatio: number = 1) { const activeTab = await getActiveTab(); - const zoom = await browser.tabs.getZoom(activeTab.id) * window.devicePixelRatio; + const zoom = await browser.tabs.getZoom(activeTab.id) * devicePixelRatio; - const newArea: Rect = Object.assign({}, cropRect); - newArea.x *= zoom; - newArea.y *= zoom; - newArea.width *= zoom; - newArea.height *= zoom; + const newArea: Rect = { + x: cropRect.x * zoom, + y: cropRect.y * zoom, + width: cropRect.width * zoom, + height: cropRect.height * zoom + }; const dataUrl = await browser.tabs.captureVisibleTab({ format: 'png' }); - return await cropImage(newArea, dataUrl); + // Create offscreen document if it doesn't exist + await ensureOffscreenDocument(); + + // Send cropping task to offscreen document + const croppedDataUrl = await browser.runtime.sendMessage({ + type: 'CROP_IMAGE', + dataUrl, + cropRect: newArea + }); + + return croppedDataUrl; + } + + async function ensureOffscreenDocument() { + const existingContexts = await browser.runtime.getContexts({ + contextTypes: ['OFFSCREEN_DOCUMENT'] + }); + + if (existingContexts.length > 0) { + return; // Already exists + } + + await browser.offscreen.createDocument({ + url: browser.runtime.getURL('/offscreen.html'), + reasons: ['DOM_SCRAPING'], // or 'DISPLAY_MEDIA' depending on browser support + justification: 'Image cropping requires canvas API' + }); } async function takeWholeScreenshot() { @@ -224,9 +231,9 @@ export default defineBackground(() => { } async function saveCroppedScreenshot(pageUrl) { - const cropRect = await sendMessageToActiveTab({name: 'trilium-get-rectangle-for-screenshot'}); + const { rect, devicePixelRatio } = await sendMessageToActiveTab({name: 'trilium-get-rectangle-for-screenshot'}); - const src = await takeCroppedScreenshot(cropRect); + const src = await takeCroppedScreenshot(rect, devicePixelRatio); const payload = await getImagePayloadFromSrc(src, pageUrl); diff --git a/apps/web-clipper/entrypoints/content/index.ts b/apps/web-clipper/entrypoints/content/index.ts index 0ee35ef0d8..c085dd8673 100644 --- a/apps/web-clipper/entrypoints/content/index.ts +++ b/apps/web-clipper/entrypoints/content/index.ts @@ -1,3 +1,5 @@ +import { Rect } from "@/utils.js"; + import Readability from "../../lib/Readability.js"; import { createLink, getBaseUrl, getPageLocationOrigin, randomString } from "../../utils.js"; @@ -69,7 +71,7 @@ export default defineContentScript({ } function getRectangleArea() { - return new Promise((resolve) => { + return new Promise((resolve) => { const overlay = document.createElement('div'); overlay.style.opacity = '0.6'; overlay.style.background = 'black'; @@ -120,7 +122,7 @@ export default defineContentScript({ let isDragging = false; let draggingStartPos: {x: number, y: number} | null = null; - let selectionArea: {x?: number, y?: number, width?: number, height?: number} = {}; + let selectionArea: Rect; function updateSelection() { selection.style.left = `${selectionArea.x}px`; @@ -300,7 +302,10 @@ export default defineContentScript({ } else if (message.name === 'trilium-get-rectangle-for-screenshot') { - return getRectangleArea(); + return { + rect: await getRectangleArea(), + devicePixelRatio: window.devicePixelRatio + }; } else if (message.name === "trilium-save-page") { const {title, body} = getReadableDocument(); diff --git a/apps/web-clipper/entrypoints/offscreen/index.html b/apps/web-clipper/entrypoints/offscreen/index.html new file mode 100644 index 0000000000..b6a07c8d24 --- /dev/null +++ b/apps/web-clipper/entrypoints/offscreen/index.html @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/apps/web-clipper/entrypoints/offscreen/index.ts b/apps/web-clipper/entrypoints/offscreen/index.ts new file mode 100644 index 0000000000..6c63f5f4cd --- /dev/null +++ b/apps/web-clipper/entrypoints/offscreen/index.ts @@ -0,0 +1,24 @@ +browser.runtime.onMessage.addListener((message, _sender, sendResponse) => { + if (message.type === 'CROP_IMAGE') { + cropImage(message.cropRect, message.dataUrl).then(sendResponse); + return true; // Keep channel open for async response + } +}); + +function cropImage(newArea: { x: number, y: number, width: number, height: number }, dataUrl: string) { + return new Promise((resolve) => { + const img = new Image(); + img.onload = () => { + const canvas = document.createElement('canvas'); + canvas.width = newArea.width; + canvas.height = newArea.height; + const ctx = canvas.getContext('2d'); + if (ctx) { + ctx.drawImage(img, newArea.x, newArea.y, newArea.width, newArea.height, + 0, 0, newArea.width, newArea.height); + } + resolve(canvas.toDataURL()); + }; + img.src = dataUrl; + }); +} diff --git a/apps/web-clipper/utils.ts b/apps/web-clipper/utils.ts index 5c1b3efd6a..7dbbafd038 100644 --- a/apps/web-clipper/utils.ts +++ b/apps/web-clipper/utils.ts @@ -1,3 +1,5 @@ +export type Rect = { x: number, y: number, width: number, height: number }; + export function randomString(len: number) { let text = ""; const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; diff --git a/apps/web-clipper/wxt.config.ts b/apps/web-clipper/wxt.config.ts index 7a3ec383c9..f824eb64c9 100644 --- a/apps/web-clipper/wxt.config.ts +++ b/apps/web-clipper/wxt.config.ts @@ -12,7 +12,8 @@ export default defineConfig({ "https://*/", "", "storage", - "contextMenus" + "contextMenus", + "offscreen" ], browser_specific_settings: { gecko: { From 1e820439992197fbe66d4ee1912af70875139bef Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 15:42:04 +0200 Subject: [PATCH 077/316] fix(web-clipper): saving links not working under MV3 --- apps/web-clipper/entrypoints/background/index.ts | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/apps/web-clipper/entrypoints/background/index.ts b/apps/web-clipper/entrypoints/background/index.ts index a27571884c..acc0460c39 100644 --- a/apps/web-clipper/entrypoints/background/index.ts +++ b/apps/web-clipper/entrypoints/background/index.ts @@ -363,24 +363,18 @@ export default defineBackground(() => { await saveImage(info.srcUrl, info.pageUrl); } else if (info.menuItemId === 'trilium-save-link') { - const link = document.createElement("a"); if (!info.linkUrl) return; - link.href = info.linkUrl; - // linkText is not supported in Chrome/Edge; fallback to selected text or URL - link.appendChild(document.createTextNode(info.linkText || info.linkUrl)); - + const linkText = info.linkText || info.linkUrl; + const content = `${linkText}`; const activeTab = await getActiveTab(); const resp = await triliumServerFacade.callService('POST', 'clippings', { title: activeTab.title, - content: link.outerHTML, + content, pageUrl: info.pageUrl }); - if (!resp) { - return; - } - + if (!resp) return; toast("Link has been saved to Trilium.", resp.noteId); } else if (info.menuItemId === 'trilium-save-page') { From ac109c2ece75230efba6ba76307531e53febe94b Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 16:07:15 +0200 Subject: [PATCH 078/316] feat(web-clipper): support manifest V2 for Firefox --- .../entrypoints/background/index.ts | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/apps/web-clipper/entrypoints/background/index.ts b/apps/web-clipper/entrypoints/background/index.ts index acc0460c39..953ba552f4 100644 --- a/apps/web-clipper/entrypoints/background/index.ts +++ b/apps/web-clipper/entrypoints/background/index.ts @@ -22,6 +22,40 @@ export default defineBackground(() => { } }); + function cropImageManifestV2(newArea: Rect, dataUrl: string) { + return new Promise((resolve, reject) => { + const img = new Image(); + + img.onload = function () { + const canvas = document.createElement('canvas'); + canvas.width = newArea.width; + canvas.height = newArea.height; + + const ctx = canvas.getContext('2d'); + if (!ctx) { + reject(); + return; + } + ctx.drawImage(img, newArea.x, newArea.y, newArea.width, newArea.height, 0, 0, newArea.width, newArea.height); + resolve(canvas.toDataURL()); + }; + + img.src = dataUrl; + }); + } + + async function cropImageManifestV3(newArea: Rect, dataUrl: string) { + // Create offscreen document if it doesn't exist + await ensureOffscreenDocument(); + + // Send cropping task to offscreen document + return await browser.runtime.sendMessage({ + type: 'CROP_IMAGE', + dataUrl, + cropRect: newArea + }); + } + async function takeCroppedScreenshot(cropRect: Rect, devicePixelRatio: number = 1) { const activeTab = await getActiveTab(); const zoom = await browser.tabs.getZoom(activeTab.id) * devicePixelRatio; @@ -34,18 +68,8 @@ export default defineBackground(() => { }; const dataUrl = await browser.tabs.captureVisibleTab({ format: 'png' }); - - // Create offscreen document if it doesn't exist - await ensureOffscreenDocument(); - - // Send cropping task to offscreen document - const croppedDataUrl = await browser.runtime.sendMessage({ - type: 'CROP_IMAGE', - dataUrl, - cropRect: newArea - }); - - return croppedDataUrl; + const cropImage = (import.meta.env.MANIFEST_VERSION === 3 ? cropImageManifestV3 : cropImageManifestV2); + return await cropImage(newArea, dataUrl); } async function ensureOffscreenDocument() { From 785ace64addcd1a7c86746af8b9766e31d01759f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 16:20:36 +0200 Subject: [PATCH 079/316] feat(web-clipper): use new Trilium icon for now --- apps/web-clipper/assets/icon.png | Bin 12869 -> 10710 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/web-clipper/assets/icon.png b/apps/web-clipper/assets/icon.png index f4783da589bfb1b777e943d71bdf3552264b2ffa..2d4da35c43a20974961be21d9535ae5c8f995eb3 100644 GIT binary patch literal 10710 zcmcI~i91wp`1d)pnX!(2jj>bqoyb^2WXrw{k~K+W=Zt*~*|PLSMJk2J5;2wvDWsyZ zOqT3xWapiJzxOYAuj`%bndjWg=iK+_zRz-9=eeE~v&$FhsJW;C0H8B8(6s;n7)68u zXgKB2T`ANH0C2#}_==vf_f5hJ{6UhvL$%tRq2B79>sxst6Ez-oPnB2i-a1Y9{T(Oz zni0WdY%TLD(_lV#S^lQ(K^&nHUwHJEzVU8HyyGc|Jip!M_=&zFY3FB=85I4tJqEaqs> zTU)Hx1_!*lLYe<1N>8D{798ysvo-x*U8bmceZ&Pfr~eWDdA(j5E@qxz$WWP2S6a+B z{Fk~PT1Zpas15diW&S?^V@jOO+8|0mib|R1j13l??6218dDR=;Y_y^vS3-g*GsU%h z>qf|HM+$zy*`5Mk%(_5{{J$suwlw>{!WA>0`hPL=`eWDAk}1Msj^3iz)%g@TN;#Cs z6xe#rt=ztt_1d82;(r_{D#b-XQe6LP@w!GKNg0%GP>jpB0yb&_DFi6UnD%QFQH7P!~ zk7B|9OXTXj=;8>qd#se%Q?jg-IZ%ugR?9bhmv8znmsmu$5mx@QUJeOf^7CFKI8)ee z)cxx@1sUGvLK%^5u2F4nE2TDTH9@Nno!0Au1Dmba3*wd{UDh8(E<|3;?u}eaioext zvtAOh91&((ac(w(b4K$#B}ibC6(!wb-o<}y^l+PvJ{S4z%mUzm$JWBo*a zEiHM;^XhLC!#O?eIS5C&c|7X$2`@C)o_O7P7ZOMEx!q#FmJqj8V63)s0A0tMK_n6-l(*mpqPT6iIhj8C&=QmB`}ZNJ)uQ|$5{Bu31Xj> z{y=h_`hs@51Q@U_qo54^}cLs@5001i3Bl=X6vg{?`JnmJ|u6< zdA8+DHSw3UTlB=pE{|p;?YrdpK0UXZvoCHFt&*i3yrz2F(86Qza(cN##m(wFb1lE$ z_mw91+pXroR4<^9C?iK)?N&5E(Gv_uvC`Qg8 zJ=-A58`pwDTmwCTkdP25Z-3ug?ydnIQa1uUi`Ue-000LV>S|pH{jus45_!ey$A!f{ z>|KI31_S0x;c$A`0_O@2T`Y@ubQSKcDISZx3Llm zeuGF!RbcE~zx;9F%{*m%yLD}He)s3AY`NX2wXn(Eu&G=0+7wRze}A>TOXq!Uo6JLk z`7|$xh=|C`OG!z6&rng8lb3gYH@Kp)RNiMgSpsIB4a^Gqlfy8fD6cFp)l%K{g2kh+ zuw~*@ZRJ{MO|^lI z?-UqVx^H)_iPuzHsCwvVvXJ$*67XN`_ufMF3*SG{_TzAs)4yBqh3!O1g2^digr%>$ z{HQKBro@bzMtO8CI1sjb>%)rQ18#(<{Zy0~%(ydWp#3ll&Xw67^7i|8)HW=G<>Vgq z`DG5It6cwbvEB7~K!(i=ZU6i2_ZGZjPd`8#wmx|r*)#PYX87|N>7&-V4L_tP0&)fJ zXXozvltWi9Pcw)^?Y-ga&LMj=%V8;+%|N(7H~UFfX(%IbXq;Sh=a=RzU5u-sG7K2O zAAF56-JgsGJzG*VY2y|W+J0}`$^~N?s+kjO{Ap7)l{s;=h~>DI9UFS&+m70z;ys(I zTH6h2r)^J0OsV$pCdZ(e0jNz`+MEWxa{abU#KXfgR3SPU! z%mj z+ee#O$Hr;VcovJF(vc$hkC#rPVvYt=kYtIAn>D2C7@i+rXBVix#Wv(=gxtD&BK_yR zivZyG6}o2#A-$2-4;o$^zj(gV6m3H_E&T#$mLmp85v+(`4c;`*v^p8vq<$BKZL&My zBPD^G_ZSMUse;r?Qf#cO8h;n5#CdvL{J>2Gv|H0D>z_q62U95ask@#(&;IOk0Y_#> z6&1;jI{7*xQ;LuT!fr>tmdbv<=c%x)DFUB00&BUu4(jkw>}LR;nkp69BtwPRz6@kaIL(HM*|d})C+P%QTkPKNc;I60h* zmasfADO41nt(FSAj~AFm+Z;feD{8Gw`-<2TQ#rXSl0|@RT!)2uUU+)%Dt_3!;6t8f zRNlw_y+N9k)Aa5|JeotEb0LA$h~yjfSLw{*s*1@uD8zVyEBNk!9a|gGzVN%9yci z`vEPy@wuEOP%D!4AGO(pq~JUM)o5~xpCssZQKo?{z`g8dj{AoaBMbbQG}1u(nH&>7 z1e2?>!zD<8E=z`d{b67y=I-8%5B@l@vtPg5-{ad9{YarC%wQbCnhu?VzvGDGv=m0D zIC&AMv7?N^P24SKuDHI7v=mc~T(^~uwC4iAGFd8&*-!%n^HvoeT!NB?< z9aO25tnvOu&+C|~yQz4Bwh;8)Dg6_$DOJWRjxVfL+r73x*qEzWNrQUn19nkC6AmR` zb&P;&nkpSZTz$>(mh>ZzDDMkVhp@kTct=|5cN>@9nGi!owCFkS!g4W(4Qe6|w{U3b z1gPO$yf`wxeE6+?K7?S#`wHSNdkx)|KMHuVlpj=DswfSNFk_9tf_U&XC+y9m&G*HC z{o~H@)`r(V=`Jew4^GvjzEac*0@PQ)RzBTnhlr)yMBeLt9nU^>tP zzH~Q|&AmOoo^uczx0rG_?LNC4>CP8Z=+zx4^ch;5Zb+25M+(^E!t2m4NSzpG#pE@? zrLJDb7`&APnKTUuBx_22cVSh7p!`IFU5NZ;)~Zito3u=pVZHDQe~3)wbvyoLunQ5?sXT9b%;$xo08QG!48 zb?yI>7|HSfsgeisul04*eye(eD^b;HX0f4m^U*3;?oe_P?d*#Jf=3ae5eIS;=Oomz zsiw;4Rs>m>wDTa}kj$t8BcJbldOP8Dnr8j1%RUDhHS@ID78W3oRpWYP+r;q*qeOXe zMQzTjKCE+>W7v(8o^`{JtY9xLwl1hr;r$T9yRjN?OYOF5c6^%0*c>H5j`Ic_3})wX za)?#{n~MJ-P}X&>_l?PU%UTH?%L_-w;_R1zcl3cR7mPm-B1PDUxq8s!J$ciU;AY-7 zdGysVZU2HBohO8&yq zb4c9w$6t!1Uhw;J1!=t}BG;N{7k$nEaSx0a1{|ngih7!pn8X|0aJ= zieck|VwW$#5Y*`IZoz)%Yg4Yoap5&g z=#_n03p)f7_XD4hN=fxB=KP#Bf%z=)%kV>ods!%^d`OS$I^iW9%Ouqnd(7_-9bF@3 z15Dsx$Ft5j*bARNRf6@UL4W<)-^S+3K0&Q93rd61K7qupS!gHlZ7J(k&7OkH zNCd3HTjx5>XCpdeIOY-w@VK)PE_$EA;4jgw(pL0T%^os1eU>odto7l10areXX$7AU zMqm)FU@*Yp%l7KEPl8_o*`O#@g+|;v$!hstI-wwhJbNw^7B-t8!ww||Z0uPRhmEkvlpE1ykZ*&5L##xemjqMg90{a<3QcFi-7ORZAu zzfE3o#vd-^1Hu(#Inn2g={I9@;O={8p0^mQjP$~{gU>5IXgD_M5*M!as{Ft|_NRL$@2AY!1&hhT*hl3K`1292=>Torof4z#Z`a#W(RrU+~0(jNDW zBkp^^f+nB!kCsvg>n~jKLUhe|94S#ZPmgd<0RM%$x5TaPXoMH_xRUKlef@j|WE7Y6 z2o#bxXgt?k)Q%QoxxeFIcf?%+aMW2o>em5-QNLvS6$1Q2byOa*Mlo(MH}2INoggtq zZlOo!v7eY@tD##mywI0ecXnC2Ny>>c1%0zSl=xHs!|@#R30!kRa2qm$IHFr<{!(T4UYjgt_A8_e!afB$UUb-pipbRcFM}t?&!mTzzAVLt1Fm>xos-S zEwAxEnPIvh6YZdjI{n{)9saj`{r#^Tl3aUrX%(-%Pb!5O(RKZ4;3C@_YtXTMLscp_$R7E=-k0T|a!vJ#+4xi+7EyRI&m)lYeUfgXkMNGh06O2yeTc8$Ph)^mYrO zucjc<$jnOD7de}w-&248EP7)}q9^{SxDY@c;b!j88JwB|j)BQ_q z|LCfFVsaDs*k&#e+_0Y1OSzY-6bTLj*Xa$mh-*>&3m+(}1SfQyu>AMu^m%dL9y~sM zAFqf`Nx*q4Wi3$U+`@}qI63{KZ+zv{-&jANU`)*Rs>8{o=qvrh*uf_&KZ11^%w{Z; zS@)IS05YrSmWFcTMBl>^uN>e3s=1au^=cM7Fs{<8+*x_)PQ_Nuni4iD%WHez{38qQ zADd<1D1Pt5Wop6NO^u%PBO3jycRUdIne_H6kFJdAli&M~BluM@I3E&(C?XQl8TWh) z`ggj@>klOrfU|CuI2zY3j9ZsdEPhd35#479*uigqPLDIhY+Uc<-p!rguBtzL-UrKB z?l9EOpJrwL#KhLfsBqf$!YBuD(*#=e2=$ib%sduHZV%Mon z1Nxg_+G!nxedP?~*TblqcJ>@bZVu0HbUBmP5g$EVoyH`x9MP{)XZg@{SX{$iPOoMm z@<2@6F7QwBdN<{gZOgA-CVu|Z8h3GIoH_pLxnxJQf4%rRVh_DhlfSiP%EKEnQubOq zYGHZMt$jHn`OLl0vgQzOtt>4A5ugQ|>qYYM+`C48Bk(HfsTp!yeXO*^u`&z8`c->& zdGJJc&tKy0)cCW6ry_S~PKH}MCbeA9sfq-jP*^-$%+{9lIa<%4K+49CD*Mdoh{ABH%3@MVzSd(fy1hUAJdu zCv-^PP36ODg-=t;3p%S0*3ec=xX)0!19QIV`HyV0(FQT*LhNvMh7!ySl z!EjVHu#fp;K5Lx>ziXm>H+7Vz_mnNMafj))M&&qW47w_v_LuMh`>5tiyQh;i>OPIes|X!UB; zBf;{`NZ+avvl23zdhe);)C{(N*++lC?>W$EqdCmXUQ5q<0T|?vLMc<$bKGdbug74% zM_T(_?hOf-BkmXVyfH*@)x_X**H8_jkc!Dx;*HBvXU58LpH<~5n^51}t#3Qf{1Wi# z`c&u?{;-^WP2m?l;~AG9EL$j;Z0j#Keie<+96Gp@S8zeXejg$8eF@bN|K+X2T_Zf^%F;&a*Wr zJ|@$w8}ldcw9F;{C8Orh1gq5bn=A7IdZ8;fKD&5sChfcCKseFRrws$q@_Pd1w>pXq zVEhO3u(knhb=UG2RQ-)AH8Kaf)IoNCyzVV-{JySLEc~I`L{0Mc@vJxV7qTvSBIKbB z(=?5H5X(uLUM|TT=Q`mxO<%5lcSo9sN4r^ve6UW3`kj#R*wh(gc&PxlR`#L%bMAVy z{Dn?4lG1gxPRw2^;h1J-TBFN^nnykCK=3sw?bp@wl~M=J)a2X5 z8%_$iy)grpm$Dmzi&8%^t0jRdAsbiYoF%-}ZywBQEoRzkAa17EJXLse@IJMHyhl7@ zxVii8@nGT40VubO`{83F6Kexcw8 zdN|vXs8x2PH%24aB-PJQh_MxUbuu^Wl8B)~iYSy^h??%sc8BV9YtS+bc)=QM?UazmAvp|GdBB^hI*xq@Yy& zM4n(m{jsK6?<80!Q`tP8ue~CS){Xkmavtf#oM*bG+KYc3E8zCqJKO4sAp% zb)GqpJko4dApE_2w0iTq19?@MWwF$rFS15eB}s38J-dJ?aE6a(xN&6}8`;T3is=4R zop<{2hDf;>zPQHpj1BAI%u_{|yD%Yg%q#vs`F8rmC&l>>ygH}prubCCk6>?$VwS2d z*M+$7?CUiP;M}_oEhS}+^G$lS%;S3$|GRd?Ky~LowP>OQhFz*z@HEc9JR}5x^3RjD zc3yt<_DcfcLz^GV_0S8UDt`|7=y_Dml5^SDIyA~|j32k0@>EPf)ddmHl@buol?J(E zA22c9U|8Vm&t#V4jd>8X^Jq(OX`4v;Vy`?+|A0NWZ&`3JH^p2OU zIazX+Zqgmj=pk=93f8%P{PSq4d}Q_GoZ)6Kcio)U-?BD(!EKiKCm*()KWPK5>LK%f z-48WG$ZlJor>>olf9JVI+}u2Re2U-8QSB~>d}SO#9Pa`xM)c^OU~>?&twnKC)-jD2>Enk??F=O4QIsCp!dlS3xTiT!)&&%QHj zokRth^0CZS<#%U~zTQftjR_ly4+{%>^XV?sjmma^OO&f|8$=Q@;yY&u1##pyTRRvFrcBxLArN8RrjGY<&RDh+HY0*XEvl*v< zar-saw=28cCuWb6479OG{{}4s32fYbxaa({NcJROUYZKE-XQSW2i89K*q}8`>>Yp(WT<_!Bwo6svk4=9-Pnh`bYbBSjWO}1PZt+GL5tbeSf`E;XPt);?TCUFSRKCqr;>BM;XV| zuhS-F0@_S{&$|~T$PhzoH-CJpdI;*XdEV_&w95_W885G+z+E zIdh%N|G;1qsNfnh%m?23^0TK`G09wkGf{nz2d+ZySp$>Vvs{dEKP}0Ifv*9qd$`WM z{92Zu<*Hb5-Yi?VznLyH-620qx+*yMFth`=MYKen56;hebm6Y~bzaeB$=WINz*iFnv2X=Y(w$M&;>(8bTc3iS<8 z8_%#?tx+*6s?uVK%^bS#=I-&A(pDz~$}p)z-HK}ghl*rV z;g40`cgsnU1Yo+221kCW{NnJl_%5 z#?2J8qU$Z{&0P@XOL{LXe3lJV zF+y!BP&dxYiPT=8Yj(H;j0F;8wi80-Kq*&vD~xf1V6Ga#`Wd*4J?~Pf#SL z-`z+xu@?nTxV(#%E=<6#uk z-4l9ZJNfO8m1*vIgqR(wCj|&f7}Mr{iX_`tJpAl1@cz8I*wkUM1Y9bCKAFe~+47-; zq=B{C2*t9F?xd|yJ7KR_b?nVo{OQd=!|jXX&%o02Mf{hDSW~YHJh*PAZx#}OW_Xv= zBIl-YHLV-;@Gm)dE3~a(D$*lBLtjJgn8NR<5nYcsN5b%X!TDuM0=L`q+QB^W% zhL%}@Io@T2AXGyz8GBkBYrGM?fRTj_AOX*-2ui=W>k!!La^I~&+!!(W>&>BOFJU;c z-R|h5^&L;>;THRMML-Rf{57sq>H{?dT@dS~t29JPrDXC^$>hU%={-Tkj+y`HrWn+E zaf?ug{I-I61Y1^F1B%7-h?lNenifn}BQMj}Bq(5IRk6-GYoLJw?u|MR9KD0j$OP|` z7wZ?`)0U(up=_y`uH!lRE+&%s9Vf)66=IZj^7pWz4?QBaXm0a>OZR*jH}YYBwBQ`1 znN$lBpKSS#7il>VL6U|Q;NiBNxAnwvpZ@H4LC-Dn!8?1t@w(V003~CaLbFGsRLdFhni4Oz{F8AdRkT6fQF~$8bCX*Tn(H;T75ODLsZPaQri0Q&9pSC3P{o*Pn zK$$~UkuD&`AKdW4$50{R+LoQ&GOV%p0%N5|Bmrl-y^>f!zAkBQm*J%fL`1RD{iql+J()23e|C=hoxDej{yJ~@oz6c1rXZ#P2j#Q;;8aS!@5xmU5bW*)q0-^7K}so zVH`GMKXLIUh;mMdV-ck|+zL^e_1FleazbfLGV}Jcv&^I#a2)_cm0?oPjc zp263QazYOrZ2koMU%4tMZdV(DWu`(pTP?%FHr2w}(IinfD))5!($10A4?1m1!QX7j z!ix9FSh{udRr(`W8(+EwshhFed*A0DTt+)76nE0br^gea{9q(4Ves z5_bjT`BpCWv9zxwY@7@KMypB*$*aNbHS#E&M`9uBa`|)I^sm19*oX#eN+Y~z;96~N z3BS({JqHK1mG9Y%{WoHd48M~po#c$I*-NXm&YJq3@lQ60yi5h#F89NnGXHn}{N7`I zzTSu6E|Gaa(!!^KnN*kki7xS+yKUEdt_*x8Y5)+-a!@yacpsR%BKhkFB6O*`P%GjU zBWakgF)^?Wv4DpzXFH7Lhf&GUNLyz=lUj=58Ru0lX{^F++_Oe1?Q--nk)jwg5 zWwl3{oFd|1JQV?_?X*|nlX~r|WdQCyMe-w)1J%*u_#i>O zc^$aV$gjc&UTZYk)TA^2NhX=Nl2Ld;TxxdJLvAcXQv9C<)R!&^e9%nr1d~>?I9hK9 z;wYi(5x*N$L>oHMnpPesIe1cw)7D&#vqgyNWwl?g_G1nAK{*8 zZi5fF8>uJ@kQ2!j$_eLwHF~jpt(5UYr^uih61>d_fQcaXMOvmmiX>(*%U>r+3x~mT zDztp%D5eU5=>Wl%~FOB%OKjVCo}mxo=fKS=AH3J zUe`rK4Hz>-4@fZVTq1rf5X%OMiBWa4!fOFt_=TDTB<}T12R>VX!smS54ne(ynngnn zdPb$0IM1ZFLoO9=A^0x9baw>IFvZ{l+Qs7!uF7UXGdmaNvOs;syOR^k?7%&E%4H${ zbSfHLzj#0?4)Oe#ZkE@(RLyQ7ng7?#O(caQ&7gMrb)U?vf7>U&~(y z4i@TrCD}&=03Z+X(=+nYf%$;kJX~$;oe&_e$8HD^!q?sg0PvlyeQS$c6L}MQ3#X{Y z@U5ns@wCCNzW%}eN$W$&&hCDR-b0ccWn$kA8s5R1wp-{%z(vyg;rj(To&#Twcmt&s91#C+6s?09_e{j>Ymrt|Z&uigGbw|7n+uZkUv z)k~e+Ffd9nFdhW9-bjpyKVQlapF4eYNJxGyo_ldExk$ZkFhHbgdfejqlxWg*k&ir6 z7s+}g;Ai^KrMcqkM_Gxa`+hsNitCS$MGt@c^enN}c!qtKOUgfDnCp3~`PS2KY;Cl+ zqKUH0g#_DJU*jKE$e2HIo!B$vZHxU}PxZ5}ZP9qj^nU%F*7s+SGtJZQr~8FR>_4Fl z8LNv}{T3Bcd8eN9`I#@nE9Nd3ZS>j}z640+l1fF^pKX?ARPTshWjI;Ira(4*v@`SP zebPk8%bpl-ygN+ywb(aYeK+gER&VlAL(Jh&)iZ;R@$Q1h0)73#H?M>Tif#VOlUFKH z-lg%;8*IkNdpiRStEzUe(1+A&4y400!NCIo#1ztnSnLXbysy_dB zWmyvMuE;D#B~_4!7Ib2!{q*EJKgrWSbF(C+gTLP0jDWLBrKgMsJ`)j0SMB4m*@ok! ztc_sKr#eP8ZC57 ze`a&qTlzDtv2Ez>lj;rEoZw}pAN@4psz2^5W3Z`+GQ%as_#Y(#@n$(~>poDm@C$Fz zpdXA-^a%{)t#K8`yy|F3*X;FQ-#6X3;dQ+~b<6I0vpGnezkl#4O?&5A|9r*ctLLTQ zR~^mNP3CqkTFzNNMPSqWj(1<&%vEeiwHz|iMX-OYp#!Qo4$3N%h_dOo(bZk%zY3rk`D%w~miZhw~gkDE~nyM$P)#oj(wB$f6-({VD z4GruFK^E>=oclIqXv;t8;d+6;B9klU^edG`2l5UR81kXQ(n=9E02g3Bp5DDofcZk< zOG=GBz#Utuo-pC>;mrSJs zX-a8d!56%?8F?|@!rfmn&L1raspy!2sgqcYQ~TKFvxAELCZO)wAb#k4RH0v_3m4&2VuZ3&2p!-i!-(^>_ zng`-w$Pz?8QJ73L4{bf*ke!G=7%XC`H&E9Iz~0~W$F4c*diqtO;>-H0hVPX=`OnT5 zjL*zD#@OB)dB<#)d)>iBCoIeopkmF^$8dDVBrmm!~+NBN_LDp}6OrN^~_T zSeSNQIpwPy-$8vIiftW~cBe*N4q<&7s@^(fW%WX%Na;kPP?sT$9hOC-(&3*N>?P(TsQ68dk3;GE72T;KJT$ozqgmpqg7BqWkjqlIvXE<_ z+$`oNlkjTjiDJ4BN3^JDSrPKm;d4*oeDb7ff=v~|s}w?M^hO1N&T*O(X1y>_f=1&P z397BaJ;2eVG}_zay6?{sr^Cb!wb4FNYf)rGL`0& z93)K>z3h(N%NQp6ty~A&-SK_9NEuz8lII)9z<#WpE(z939K%S&=(^7sI?z(!^r3q9 zk{X@zYc%SDXAla4k9$P*7X924ih5MwvUoc>3)`%MFw+nm=)|TSIqY45cay$A{rzaW zBq@11LU=u61d>7XY@0QrMB1^aQ0^=H6aYIpNq;-3*?pc2ye@DeN@U*3*~p!6M>kHs zJT4x1?mc&JX3a7Cco+=nvf9KUeY)s<>!1J5fLSAvdhxlzSb7T1b;fk_Q$l-nE|Ek8 z-U$aX*vJ5D*Nmm6IwJ+M?gVU(cG6E9uAGG79eMe+Ks!yr+t-q0P_ZSy^Tk-0KcCVX zRf?~SJyN{U-EG22|kbPFX`XlL&bK>GU=4KjdOLp~9Jw}>CTx~ieWzdhFbZR#Op zQWsl7+(RM9A^Wg%OO5Bm zAdO8cfZUgZ90G}@3zjlsm6rq&@#e4gfNKC*-9LAL-**O$chKN7sl_6Q+a(24v>4N>a#@2rm3D(+k2smfSF;p>ia3Occqd&DBJAJ* z5(=_Z39PISS%>{g9aHeax{LO$1i`z6K|!StXuAOr47s6)%5t_J+l@}S?%aap&3g^E zFeVC2$2;s+bVfc#gqzLNsCo9lo@Ej=b#GyYZ@u!c>;il+5_#5ZDtCX0E3mfpJ)MN@ zk1Fg5%xb9@$+{}+Um!!+_ePGSVAab6&!q$-u@sG@1aXs3tt{T|J`Ph&pp-l_GHCq{ zWQ%rfFJF2unr69>xA#me9kLQn4CcZqM9yZg+CHG4=*s@O*jMIP-1T%Lyzjk^{ZH}N zN^oiP^1d&+aj~D6gZO<2a-v4~?x5}Vz6_Jks|$1*A|*|)Ok6$WwoFlDwd8x;(a+qR zR0n1+i6IUA8oN^x7vAzb^5u$&9-*4QyjXI@2F@f!YRwCwN+P^6ys(m_tmlOp(ZTPZ ziY}&z=5MjXvtL>A!8ZzuqL3PQ_9GYS#O>>IoF8UkOgj!kKWSP%|G1|Y)FwW9Gd6-7 z;n0+ejObzle=3e~ErHgRI6Exk`?C{=bi4&(XA-(3^|!nCLwMqezI{*nCJYS1{Gc_D z+y0pe-DKd&u2>p0E`5&0>vh7&(@1%>ui>9O8n`^?jJIVGmIGM4qVJIX?z5G$&LYln zCt3?w!$Y67ztm$Vv(1Mp_uff-P9eUfRM#U{@um zox++S!#!!YSl?XR)^(aZ4f4o-il&%8(;3XurH*#y8h)lO9(hrbpqAnY_jb;S7cW1J zP1hHa&;%;tOb!rq1{aP=heSzo`_fr?rRF`bVAnkRD`i#5W(Da< zF10aPd89S{-umcH^h4!Y0ERDdP$`)!Jy5&itqNeZ`ON*a7|L9mhkiXxXf+e5R%*%$ zZ{tZ(LfhaIwH=F?b{YSw_qYIifSrev`u4-7jZ|vDZ~cKERA}f|!bZow zGc>v2Os}7I)R?AjN+Ke!qr4<(d=G^7(#baoqq%a1aKJKo9wcEYLj_gUfV&EzkE}Xy zFib-50?ye()5d+KEQ&89mt?NnD+V;P-1naRAj-K&y)V=jWi=R@OhrCjF3zeINR~Iq zIcAz3U|s*2@#z%@2~sI62e)JGCsa5`L^=qP8X^C91^ z;tc3PoMxpvjd?n&$L99V_$`C~)~iFVd5VOpSu~EQ!W}+C4@2q1)iE&VVn0%+F@6t6 z__-9$>=K>%k>1l!dL?!D3RVMiOR#iVaNW?;Wmrc!aivTI4n3g7)wU_2Mf3#K?WE8f zirH=D7v8{EOb(WUl5{$&6iVgvbOxev zGNaO{!lEgCfige*CsB=A-XPp?v+)FeF?m|hsyxOT?u?H_)u5ZF7$!66+SB0>^I^Uc z{Eg<@QtE&`g_DkSyKcuHzIDA!!oVeSDS(p@_`P?6v~ZH+k-ph`^fLi#{)aI+r8)sR4(o|7itl`L&L10y z)o1XZu5AlW_{0=1s7p3r4!!3$*w|9h9@CW>lfrw$YZC>t+w^+AM2$5uaaEm}dH8`k z+}BSH6wt4Kq?O9GaP{DD=yDeyxqQrymRj;zo&80cIaO{DM>Nn znMQwer2C~Z0b24$@C-CY2`|L_^q%AK!%yleH4i9%L`s{CoqcL#B;GOTOlG#j#4FYP z<_3kzR35q{r>mXcHR}%pRRt|HtsZxeAB>b+1HTB=hBo>5k+Q{PTtrp!jYbEdWhJWsC zKNPB&u9l0NyQOD8N{FCJtjnMh9d>>Y3-r{0Hee3qI{-1+ai*sBV?RZdcTaVCb*ME@ zPECCXX}QVfJ{V7v9!DqtW(RM<`SJbB&^i^j+I$(9vzQ|h+2;fzxD9$N{w4H7<>>5+ z2~V6*QX92vo^JA!aZz z1dLWOgpK(YeK!Oxe;}kI(o*ncsCNa}_+_+0lLV2cYO8w)OXG;xD0xw3VO(-Q`I1pU#^7$dAVER(S} z-#V!I5B>YeYXlrad^(}dGII;1LXFzyk2~)Y>zufwaWyH~DU6|WSP@1vfVSP&fNm%E zQkHwa@Q&m2R|=tDA7_q@Buur3)T%s1J@zx{$EOys9-T+3DopZ2_B1J>Q_-KWjgAiE&!dm}hkFUN@ckr+ z55hxoUWt%H4~kw4mlLRPjgA&NmhX&9p35}t68hU!+)m&-pKMj~SECcOI11ud%$$zW z4wm_#-^K(dcA0j=VCVu{+6x`D%b$%P44%?oLYr8u1gE=ar=5v=bb5}T%~V0(WPG|m zeG6ex$vd z7yQ?LBs8jtB#`%x+!M_XoVs;ODz>D&tX#`mxdv&m+Y_$opLf1ItipeJC<1pFX`6R0 zVs1pDIw(oladEc0~?1I;{YW#|D9`Kw3?!u(-f&KshFvMO?PD@2j?jJj#C_icb zub|3Z(o|uKbq^Id32lhoag5TrBBDebD5A9PP2iP@C7WGhtJB1j-&N|UU0NEpn(XK? zHpDiRA-)E>dwS}4y&`Q>#RFS4uQr6Ax1O)>i-U}K1U~OjVGAw@=|(mr_mxL28=gpK zi9Uy=7=KJ-VO%2^|OxPc&K<-tl($#x>+pl_+i*Ok)O?@AwQ z-gGK!SQu}JmEB{hj9^tJ&d!P=?XM)sHD~LQjT%~&ypfsad8K;K5I2SnzexJ|?q$dA zl8daNWIzVbT#$%ApPGknPQ@vx4+L1O=R}+J~I&;IUU9Aw@zRqr_(f|M?qU=?*e5yXli2u*;_-I3?b^g>TYrfJ9}k64}`9th92C{5iV-YBqfO_;VXs$a7K8+ zK)%jSE}mk(P^RCwVyN?9Vjd>YZxt^`D3g)87D&$30|64`7UbpyEBM+Y`I#i~KoTC- zHex#Rihn|&uAoeIUS4iuJUl)=KHNS6+^!zBJba>}qCC9(JpBA%lm^)Iv5ObX7wqE6 z{0rg_40(hn+yhn5_O33VUzji}S8p#U6BBA2^pE*DyQ!=H1@GedCkrS(czj`QJbc`| zJkHKMf4A`TQb3|W{+!UiweZwKZS3>tAUs{YJ>UohB*Mju`R@?c@W1Tcygi(Lhhq)r zK{z3tQL3IOuYCXFQb|Q!>o1F66xiB3yZyF8k^L{4UiLQsB!7w2! zA+V?rFE2053c-i4w*DK0riVSMDq&84pVcoYYZR0ST+rIuhF=&gENUYF7KB^F!6Mc| z0$>;)KSG3;SJavhA@m!{8ZM^j>fsDSrPJOSW{co)bFuwB@QZLU87&nk6F)caKP6gD zFfSXF0hCG2-o@MZp96aK&InyE*e^Eugam{I1^Gk-1o$8VqPznCR5Cz#c%mxt7bYJs zH^1QTkzZ*MLj{8(7WS)7Q2@W?s9410JPki;KJQMUI) zX*~W_@qgC5F2enft3Pf5C;Q(+Akgo!6@$V5aN-F=BL1KgW%tJr+z#eqi$LAqe-_j~ z!SA5|()O`KpqSv~lXJKY!NNf71mB^gk#65x@VV>wk3p zM-2Q&%Kxjb|IzgyG4LNL|F63KztM&F&jt?Rf_kd+LA7V~l*#g_)(*=`RY@N39bg2| z3LW2dK}m4kl#M-6{owSk11QU$>WdO$d#R`^V6WqolZz6l>~gN6MATjiMqYBR&cFHq z!0*RXgf+;=-pda3>+#eui1027fK^3aM$dP4Fa1d(*(80hR8#x@k(==wr4$4c6PoNq z4*R6JSCv)mMFf(fjM++iBFf~nXof7&fVRw}OsOnm%ApogSIaS|9mTGrdk2rQXT|RE zMc@l8J?RX5e5cFapZPKN_fsS&(Ff1d(yS9wQ&Jbtzb<~e**8C2>UfS##314O$H^0N zL8=4#Y$mc0*TwaseH|W^FE&#z6 zniKXE8fOqukaq!$wV683{16+E1T;j$78jhuiAkJJ0@|Yg4Dtv+D{JpQ!A)xU~N4Ki+L42hw?f&ham+XM~)Zjl3vb7)@NV|z(J zA~en9u-eCM%+h*8p6z{$ZibTR`&iFxX$%IQ$ppqct;Ps(?e$o?->ycpcjRxhDYYwm z;TY7-usaJ{dTgl(+Ldz4WI}~!_~nLC}X`BexBVaU&3^jqRvQ|zz9E8i+G3ecx* z?5fc(#1EfXQn+DS0wyuNyzdfY?AIxM-s4BNk|{HLy3LX5x{wpT63K+$M%SRK2#4?v zDP*0RM&hRBEcFJ3cT0XnOUtyCenVrb#!tXG@6woMr1cKH9PK3#E1IS#F18++`7wAF zZ3%Np0ZQ)rpwqb*t#>wNF1EU65!j3yqVshTO@c|=jgwcuTwgy#vK;GUN*IJ^A-v}# z*g$p7hs!N%Fp%(Qiz6=vI|KNpH+Xgph0i`R+5A8O^+xHa)+bQ1?w|%303=LugyfLA zPgAH|;0MCfLo$;HA~0(S+ufF)9L;NnTw@+)#Jo>+&XppgM7z74eKD4|GbZ<4C<%iO zv-$NZ=(6@sVpAYRyY&*qcqM62<*jnxBAv!Yw`n8(=TVN2$hY=Jb5Zg5QJA$3mP{OS zA~g{Lw)7);;VTtA!L#y~uNb1*z6A$j2fp)cp3W~CwBfOgvNuXagWX2TcGJ1@4FIKh ziMQ@m*Ryd@Kml8+GA`oUkqxHmT_(Fi?4RymXtb|ebzE(1`#EELu(hiu5z*f5)VfUGsD}4f z;{=HCTJZb%AJZ)(j(nNrW-P$1Ke(yW1>iEy%3+Q#KgnI(Vtu7pHjEPX(u^wMN+79- zr2n=mdjU`y*xll)E9ON*h4YEBHS%9=8c8U0Dl!}GEsAH6#6(0uM&c6(P<)*B7w z-gUP{DRkg?Wh-9DPe^-o`}y1h?&hAdeN9^I?qCxzM}VZ*bH)}-Bc30Ld;C#i=#U(q zCL5e_r6^hx9$g8F;ze=IF+hMiZtF|8A6GXRW>z#)FQrit@_i~olHTZ&Dy@}fCUhQv z!>r}8;2-ouT6HsoBTefc#+#}J*^IvHT0<>d3I{A-4$#k4k`J&xx5NC{TeWeDNRot8 zIWL6UiI;t3$_QfY*_PV~(@@}3W^FUtAr{Pyu_VTyb~uQ{!}8sG4A4A-QsVPVDT(q_ zCI+$NwI|F^M%i3e(vRvlm`Khvm#j#hVJ}rlge>mxzo`mjTw{LPL_l>huCP8@u2l}!#VZU^?J9K6^+&5gw+#(pVJ6+5-n7l)rPJ{V$osJ#pP?N1}30NML)u=f6P~=g;lzdU-dANhm@3Tz9@X< z7%o$$lk+VzyI&@aSB|J>7`19J_bjN2>#BA6DLeH5sPz~RPbuC##I5w}ccKe2`B3V! zeayBni?7zj;am9zfz#=yqIh^D5zHVwgDZh|tw+=&tSodYqjyj5!?QB%o%=-ZCRw+W zW;a-u1jj39Sw`Nnz4Gqd;B}JAe?vq(44$@L6RJ}1v3Ym?AQ?bQqHopyvEOc+`D1ap zvOE_y_k`T{(3NA&_&nnzLFd?HiPAIXrGZ4Jbw$etdn3kytu}K#Gd|lr&US(V82G^k z`yd;wUkueqkiu>+|B?ul+=A_#3Rhy_mZw}$oxwod{G?*>?B;U;Y=N~?%4EK?pXubC zdO3xxeq$|#DM8{U`?a5n1OeArkqMp|Pf3miSCRQ$e23Slnjsc>WQ8Su`N`vvV9&S5 z(jkku7wRM-i%}*N;&@cfG*bh6_nsb&1i4079DLkd2ra>Rf?bPOOYBSGs}mxLcacrZ zr#riVom`b=kQ=_jsc_n2+hoI*YMapQT<1_7xyxM&#-M2LDe_(&jrU)tWkV&O%#Zyh z0*5D+dl!UU!AaqxI1-U>&MZ->X>}czH6lQEkAt4y>IR*OQv(&rs#?+xB5pi z)ZbXRuTGDwu%7d%0(t9wvl{9+mKFLX@uGSEXnZEWT!Z14N|Wo1Z&|ZwaGS~T9iXRL z5?B~o5YbG4a@;AqTia*a#*Ay-jqO9~k{rJrdn41?=)mCds;Vp@oMf!DZ~R`vn8(`D z0;yIqdtR2$#_C698>gAFJQ5`SQa^+(H?mZU@v?rDqli^yd-;PyBnhYa^y>WckyNgEY@i>=tt| zW+JwNOMIy~J4IPkvuYHML}FFY_5(h&HCAPtN#uFADtj4w!n^w786HpFjV!n1>1N;= zdVyJ+QS<^2T`T%PKR)@&OtA=+658EGdlx5mGPJ^M{xtNbueOptzaa1oOz8H+Mb|}L zZZZHBWQ@;t#mSSJo`i2 z$b55ueqL%NcAbaJ*Aw<_0sP6amNwwdVwpN~Jie#1km{;729^|}sQ?oN~hMI!V4$|pcc zioQFga~^&6C^QNN;J#7-5pw!Augl{xG8IXMmWFyM!yxr)rkyV)Zc{vv&8@!gQfC;a ziT3A0cZJWa)oj?T+4lzy`ui$NXnLez-TZmvQo9bp$U}Q9!B>w14!B8dFdfz%tK^3a zaYZ$XDK>bqv6sxBA)Y?oL*3(_1a50knwzWhFG`f+y`oTwj zSd0O-Sa8!Ij@+lB>p#njIHDcxGsUKZwK>AQB{rhv$$q6qpeBWhK`UU4Q9uBvmN(NO zu=k2-)DbEy*hF6>^Exlrh~B4RRLTl z5%aLSthbS$XQ57q-n$^yHl(_}7~|RfojY0FR*cBLBBboOVD-~PC26Ec8CeC~r^Pnl zadYNsZMYwXb+1tPIadCO&z%wzrn?i5F&Zkn2y>;pH4lwf$~S_!8Gv7^$ZKDGdbx(> zCaximP?)YJ%Cg2eRLDuyPLgwIe%a^OV;TZa`C&A4sp)N7 z3ej=cay^W&+ z6(P~Xzb35(y15jSYL$4)q|5gbDLIq9Js6qRWMTK@81o}5O46Zp#aiRVM`j_lB%jZk zZ`Z)rLH7zKmyh8r9%u6-63R0e^Ptzx^($sTKCDf2DY3Y@Z4(CI1D2XE&AGkwZ@p#H zTi3lLH??8|J0q2|hH%pNM)I&W>EBAm2Cl@71dFMx7t;l(GNP{Hd4aVzO{4464yr$d z_iAsYvKp(FLEn#4KQ-4m1H+R_I6q9^5K&vOTt@PcLK$m~j=iv$=OL`5(05nO9O)?{jsO=wnl^mD1TRm`2V2>`DG;PULWx+8n;tkEMV69*63x O04fR^^5wFY!T$%<5MZ|e From 28ed93dcdc0ab2aa22f75efdce361dfcb99d08b6 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 16:22:43 +0200 Subject: [PATCH 080/316] refactor(web-clipper): use @-imports --- apps/web-clipper/entrypoints/content/index.ts | 8 +++----- apps/web-clipper/entrypoints/popup/popup.ts | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/web-clipper/entrypoints/content/index.ts b/apps/web-clipper/entrypoints/content/index.ts index c085dd8673..618ad11e16 100644 --- a/apps/web-clipper/entrypoints/content/index.ts +++ b/apps/web-clipper/entrypoints/content/index.ts @@ -1,7 +1,5 @@ -import { Rect } from "@/utils.js"; - -import Readability from "../../lib/Readability.js"; -import { createLink, getBaseUrl, getPageLocationOrigin, randomString } from "../../utils.js"; +import Readability from "@/lib/Readability.js"; +import { createLink, getBaseUrl, getPageLocationOrigin, randomString, Rect } from "@/utils.js"; export default defineContentScript({ matches: [ @@ -267,7 +265,7 @@ export default defineContentScript({ messageText = message.message; } - await import("../../lib/toast"); + await import("@/lib/toast"); window.showToast(messageText, { settings: { diff --git a/apps/web-clipper/entrypoints/popup/popup.ts b/apps/web-clipper/entrypoints/popup/popup.ts index 8f8220de1f..40ca451a8f 100644 --- a/apps/web-clipper/entrypoints/popup/popup.ts +++ b/apps/web-clipper/entrypoints/popup/popup.ts @@ -1,6 +1,6 @@ -import { createLink } from "../../utils"; +import { createLink } from "@/utils"; -async function sendMessage(message) { +async function sendMessage(message: object) { try { console.log("Sending message", message); return await browser.runtime.sendMessage(message); From bf736977ab1427a73ba76026f61a7f349987c845 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 16:26:16 +0200 Subject: [PATCH 081/316] chore(web-clipper): don't render offscreen for MV2 --- apps/web-clipper/entrypoints/offscreen/index.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/web-clipper/entrypoints/offscreen/index.html b/apps/web-clipper/entrypoints/offscreen/index.html index b6a07c8d24..232bb63907 100644 --- a/apps/web-clipper/entrypoints/offscreen/index.html +++ b/apps/web-clipper/entrypoints/offscreen/index.html @@ -1,7 +1,8 @@ - + + From 680817d81cf0c240a656771fe2e214a2bb4ee1e9 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 16:39:00 +0200 Subject: [PATCH 082/316] fix(web-clipper): duplicate context menu entry --- apps/web-clipper/entrypoints/background/index.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/apps/web-clipper/entrypoints/background/index.ts b/apps/web-clipper/entrypoints/background/index.ts index 953ba552f4..5aa2642e84 100644 --- a/apps/web-clipper/entrypoints/background/index.ts +++ b/apps/web-clipper/entrypoints/background/index.ts @@ -110,12 +110,6 @@ export default defineBackground(() => { contexts: ["selection"] }); - browser.contextMenus.create({ - id: "trilium-save-cropped-screenshot", - title: "Clip screenshot to Trilium", - contexts: ["page"] - }); - browser.contextMenus.create({ id: "trilium-save-cropped-screenshot", title: "Crop screen shot to Trilium", From 1fb360e34fc9e263a73df665e17507d6ee26c584 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 16:40:00 +0200 Subject: [PATCH 083/316] chore(web-clipper): remove polyfill --- .../entrypoints/options/index.html | 1 - apps/web-clipper/entrypoints/popup/index.html | 1 - apps/web-clipper/lib/browser-polyfill.js | 1224 ----------------- apps/web-clipper/manifest.json | 12 - 4 files changed, 1238 deletions(-) delete mode 100644 apps/web-clipper/lib/browser-polyfill.js diff --git a/apps/web-clipper/entrypoints/options/index.html b/apps/web-clipper/entrypoints/options/index.html index 4aa2969c22..331a36a02e 100644 --- a/apps/web-clipper/entrypoints/options/index.html +++ b/apps/web-clipper/entrypoints/options/index.html @@ -55,7 +55,6 @@ - diff --git a/apps/web-clipper/entrypoints/popup/index.html b/apps/web-clipper/entrypoints/popup/index.html index ee4b13871b..cdf2241cff 100644 --- a/apps/web-clipper/entrypoints/popup/index.html +++ b/apps/web-clipper/entrypoints/popup/index.html @@ -46,7 +46,6 @@
Status: unknown
- diff --git a/apps/web-clipper/lib/browser-polyfill.js b/apps/web-clipper/lib/browser-polyfill.js deleted file mode 100644 index c0b5dfd077..0000000000 --- a/apps/web-clipper/lib/browser-polyfill.js +++ /dev/null @@ -1,1224 +0,0 @@ -(function (global, factory) { - if (typeof define === "function" && define.amd) { - define("webextension-polyfill", ["module"], factory); - } else if (typeof exports !== "undefined") { - factory(module); - } else { - var mod = { - exports: {} - }; - factory(mod); - global.browser = mod.exports; - } -})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (module) { - /* webextension-polyfill - v0.6.0 - Mon Dec 23 2019 12:32:53 */ - - /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ - - /* vim: set sts=2 sw=2 et tw=80: */ - - /* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - "use strict"; - - if (typeof browser === "undefined" || Object.getPrototypeOf(browser) !== Object.prototype) { - const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received."; - const SEND_RESPONSE_DEPRECATION_WARNING = "Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)"; // Wrapping the bulk of this polyfill in a one-time-use function is a minor - // optimization for Firefox. Since Spidermonkey does not fully parse the - // contents of a function until the first time it's called, and since it will - // never actually need to be called, this allows the polyfill to be included - // in Firefox nearly for free. - - const wrapAPIs = extensionAPIs => { - // NOTE: apiMetadata is associated to the content of the api-metadata.json file - // at build time by replacing the following "include" with the content of the - // JSON file. - const apiMetadata = { - "alarms": { - "clear": { - "minArgs": 0, - "maxArgs": 1 - }, - "clearAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "bookmarks": { - "create": { - "minArgs": 1, - "maxArgs": 1 - }, - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getChildren": { - "minArgs": 1, - "maxArgs": 1 - }, - "getRecent": { - "minArgs": 1, - "maxArgs": 1 - }, - "getSubTree": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTree": { - "minArgs": 0, - "maxArgs": 0 - }, - "move": { - "minArgs": 2, - "maxArgs": 2 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeTree": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 - } - }, - "browserAction": { - "disable": { - "minArgs": 0, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "enable": { - "minArgs": 0, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "getBadgeBackgroundColor": { - "minArgs": 1, - "maxArgs": 1 - }, - "getBadgeText": { - "minArgs": 1, - "maxArgs": 1 - }, - "getPopup": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTitle": { - "minArgs": 1, - "maxArgs": 1 - }, - "openPopup": { - "minArgs": 0, - "maxArgs": 0 - }, - "setBadgeBackgroundColor": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setBadgeText": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setIcon": { - "minArgs": 1, - "maxArgs": 1 - }, - "setPopup": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setTitle": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - } - }, - "browsingData": { - "remove": { - "minArgs": 2, - "maxArgs": 2 - }, - "removeCache": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeCookies": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeDownloads": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeFormData": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeHistory": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeLocalStorage": { - "minArgs": 1, - "maxArgs": 1 - }, - "removePasswords": { - "minArgs": 1, - "maxArgs": 1 - }, - "removePluginData": { - "minArgs": 1, - "maxArgs": 1 - }, - "settings": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "commands": { - "getAll": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "contextMenus": { - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 - } - }, - "cookies": { - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAllCookieStores": { - "minArgs": 0, - "maxArgs": 0 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "devtools": { - "inspectedWindow": { - "eval": { - "minArgs": 1, - "maxArgs": 2, - "singleCallbackArg": false - } - }, - "panels": { - "create": { - "minArgs": 3, - "maxArgs": 3, - "singleCallbackArg": true - } - } - }, - "downloads": { - "cancel": { - "minArgs": 1, - "maxArgs": 1 - }, - "download": { - "minArgs": 1, - "maxArgs": 1 - }, - "erase": { - "minArgs": 1, - "maxArgs": 1 - }, - "getFileIcon": { - "minArgs": 1, - "maxArgs": 2 - }, - "open": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "pause": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeFile": { - "minArgs": 1, - "maxArgs": 1 - }, - "resume": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 - }, - "show": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - } - }, - "extension": { - "isAllowedFileSchemeAccess": { - "minArgs": 0, - "maxArgs": 0 - }, - "isAllowedIncognitoAccess": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "history": { - "addUrl": { - "minArgs": 1, - "maxArgs": 1 - }, - "deleteAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "deleteRange": { - "minArgs": 1, - "maxArgs": 1 - }, - "deleteUrl": { - "minArgs": 1, - "maxArgs": 1 - }, - "getVisits": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "i18n": { - "detectLanguage": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAcceptLanguages": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "identity": { - "launchWebAuthFlow": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "idle": { - "queryState": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "management": { - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "getSelf": { - "minArgs": 0, - "maxArgs": 0 - }, - "setEnabled": { - "minArgs": 2, - "maxArgs": 2 - }, - "uninstallSelf": { - "minArgs": 0, - "maxArgs": 1 - } - }, - "notifications": { - "clear": { - "minArgs": 1, - "maxArgs": 1 - }, - "create": { - "minArgs": 1, - "maxArgs": 2 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "getPermissionLevel": { - "minArgs": 0, - "maxArgs": 0 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 - } - }, - "pageAction": { - "getPopup": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTitle": { - "minArgs": 1, - "maxArgs": 1 - }, - "hide": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setIcon": { - "minArgs": 1, - "maxArgs": 1 - }, - "setPopup": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setTitle": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "show": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - } - }, - "permissions": { - "contains": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "request": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "runtime": { - "getBackgroundPage": { - "minArgs": 0, - "maxArgs": 0 - }, - "getPlatformInfo": { - "minArgs": 0, - "maxArgs": 0 - }, - "openOptionsPage": { - "minArgs": 0, - "maxArgs": 0 - }, - "requestUpdateCheck": { - "minArgs": 0, - "maxArgs": 0 - }, - "sendMessage": { - "minArgs": 1, - "maxArgs": 3 - }, - "sendNativeMessage": { - "minArgs": 2, - "maxArgs": 2 - }, - "setUninstallURL": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "sessions": { - "getDevices": { - "minArgs": 0, - "maxArgs": 1 - }, - "getRecentlyClosed": { - "minArgs": 0, - "maxArgs": 1 - }, - "restore": { - "minArgs": 0, - "maxArgs": 1 - } - }, - "storage": { - "local": { - "clear": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "managed": { - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - } - }, - "sync": { - "clear": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 - } - } - }, - "tabs": { - "captureVisibleTab": { - "minArgs": 0, - "maxArgs": 2 - }, - "create": { - "minArgs": 1, - "maxArgs": 1 - }, - "detectLanguage": { - "minArgs": 0, - "maxArgs": 1 - }, - "discard": { - "minArgs": 0, - "maxArgs": 1 - }, - "duplicate": { - "minArgs": 1, - "maxArgs": 1 - }, - "executeScript": { - "minArgs": 1, - "maxArgs": 2 - }, - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getCurrent": { - "minArgs": 0, - "maxArgs": 0 - }, - "getZoom": { - "minArgs": 0, - "maxArgs": 1 - }, - "getZoomSettings": { - "minArgs": 0, - "maxArgs": 1 - }, - "highlight": { - "minArgs": 1, - "maxArgs": 1 - }, - "insertCSS": { - "minArgs": 1, - "maxArgs": 2 - }, - "move": { - "minArgs": 2, - "maxArgs": 2 - }, - "query": { - "minArgs": 1, - "maxArgs": 1 - }, - "reload": { - "minArgs": 0, - "maxArgs": 2 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeCSS": { - "minArgs": 1, - "maxArgs": 2 - }, - "sendMessage": { - "minArgs": 2, - "maxArgs": 3 - }, - "setZoom": { - "minArgs": 1, - "maxArgs": 2 - }, - "setZoomSettings": { - "minArgs": 1, - "maxArgs": 2 - }, - "update": { - "minArgs": 1, - "maxArgs": 2 - } - }, - "topSites": { - "get": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "webNavigation": { - "getAllFrames": { - "minArgs": 1, - "maxArgs": 1 - }, - "getFrame": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "webRequest": { - "handlerBehaviorChanged": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "windows": { - "create": { - "minArgs": 0, - "maxArgs": 1 - }, - "get": { - "minArgs": 1, - "maxArgs": 2 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 1 - }, - "getCurrent": { - "minArgs": 0, - "maxArgs": 1 - }, - "getLastFocused": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 - } - } - }; - - if (Object.keys(apiMetadata).length === 0) { - throw new Error("api-metadata.json has not been included in browser-polyfill"); - } - /** - * A WeakMap subclass which creates and stores a value for any key which does - * not exist when accessed, but behaves exactly as an ordinary WeakMap - * otherwise. - * - * @param {function} createItem - * A function which will be called in order to create the value for any - * key which does not exist, the first time it is accessed. The - * function receives, as its only argument, the key being created. - */ - - - class DefaultWeakMap extends WeakMap { - constructor(createItem, items = undefined) { - super(items); - this.createItem = createItem; - } - - get(key) { - if (!this.has(key)) { - this.set(key, this.createItem(key)); - } - - return super.get(key); - } - - } - /** - * Returns true if the given object is an object with a `then` method, and can - * therefore be assumed to behave as a Promise. - * - * @param {*} value The value to test. - * @returns {boolean} True if the value is thenable. - */ - - - const isThenable = value => { - return value && typeof value === "object" && typeof value.then === "function"; - }; - /** - * Creates and returns a function which, when called, will resolve or reject - * the given promise based on how it is called: - * - * - If, when called, `chrome.runtime.lastError` contains a non-null object, - * the promise is rejected with that value. - * - If the function is called with exactly one argument, the promise is - * resolved to that value. - * - Otherwise, the promise is resolved to an array containing all of the - * function's arguments. - * - * @param {object} promise - * An object containing the resolution and rejection functions of a - * promise. - * @param {function} promise.resolve - * The promise's resolution function. - * @param {function} promise.rejection - * The promise's rejection function. - * @param {object} metadata - * Metadata about the wrapped method which has created the callback. - * @param {integer} metadata.maxResolvedArgs - * The maximum number of arguments which may be passed to the - * callback created by the wrapped async function. - * - * @returns {function} - * The generated callback function. - */ - - - const makeCallback = (promise, metadata) => { - return (...callbackArgs) => { - if (extensionAPIs.runtime.lastError) { - promise.reject(extensionAPIs.runtime.lastError); - } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) { - promise.resolve(callbackArgs[0]); - } else { - promise.resolve(callbackArgs); - } - }; - }; - - const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments"; - /** - * Creates a wrapper function for a method with the given name and metadata. - * - * @param {string} name - * The name of the method which is being wrapped. - * @param {object} metadata - * Metadata about the method being wrapped. - * @param {integer} metadata.minArgs - * The minimum number of arguments which must be passed to the - * function. If called with fewer than this number of arguments, the - * wrapper will raise an exception. - * @param {integer} metadata.maxArgs - * The maximum number of arguments which may be passed to the - * function. If called with more than this number of arguments, the - * wrapper will raise an exception. - * @param {integer} metadata.maxResolvedArgs - * The maximum number of arguments which may be passed to the - * callback created by the wrapped async function. - * - * @returns {function(object, ...*)} - * The generated wrapper function. - */ - - - const wrapAsyncFunction = (name, metadata) => { - return function asyncFunctionWrapper(target, ...args) { - if (args.length < metadata.minArgs) { - throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); - } - - if (args.length > metadata.maxArgs) { - throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); - } - - return new Promise((resolve, reject) => { - if (metadata.fallbackToNoCallback) { - // This API method has currently no callback on Chrome, but it return a promise on Firefox, - // and so the polyfill will try to call it with a callback first, and it will fallback - // to not passing the callback if the first call fails. - try { - target[name](...args, makeCallback({ - resolve, - reject - }, metadata)); - } catch (cbError) { - console.warn(`${name} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", cbError); - target[name](...args); // Update the API method metadata, so that the next API calls will not try to - // use the unsupported callback anymore. - - metadata.fallbackToNoCallback = false; - metadata.noCallback = true; - resolve(); - } - } else if (metadata.noCallback) { - target[name](...args); - resolve(); - } else { - target[name](...args, makeCallback({ - resolve, - reject - }, metadata)); - } - }); - }; - }; - /** - * Wraps an existing method of the target object, so that calls to it are - * intercepted by the given wrapper function. The wrapper function receives, - * as its first argument, the original `target` object, followed by each of - * the arguments passed to the original method. - * - * @param {object} target - * The original target object that the wrapped method belongs to. - * @param {function} method - * The method being wrapped. This is used as the target of the Proxy - * object which is created to wrap the method. - * @param {function} wrapper - * The wrapper function which is called in place of a direct invocation - * of the wrapped method. - * - * @returns {Proxy} - * A Proxy object for the given method, which invokes the given wrapper - * method in its place. - */ - - - const wrapMethod = (target, method, wrapper) => { - return new Proxy(method, { - apply(targetMethod, thisObj, args) { - return wrapper.call(thisObj, target, ...args); - } - - }); - }; - - let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty); - /** - * Wraps an object in a Proxy which intercepts and wraps certain methods - * based on the given `wrappers` and `metadata` objects. - * - * @param {object} target - * The target object to wrap. - * - * @param {object} [wrappers = {}] - * An object tree containing wrapper functions for special cases. Any - * function present in this object tree is called in place of the - * method in the same location in the `target` object tree. These - * wrapper methods are invoked as described in {@see wrapMethod}. - * - * @param {object} [metadata = {}] - * An object tree containing metadata used to automatically generate - * Promise-based wrapper functions for asynchronous. Any function in - * the `target` object tree which has a corresponding metadata object - * in the same location in the `metadata` tree is replaced with an - * automatically-generated wrapper function, as described in - * {@see wrapAsyncFunction} - * - * @returns {Proxy} - */ - - const wrapObject = (target, wrappers = {}, metadata = {}) => { - let cache = Object.create(null); - let handlers = { - has(proxyTarget, prop) { - return prop in target || prop in cache; - }, - - get(proxyTarget, prop, receiver) { - if (prop in cache) { - return cache[prop]; - } - - if (!(prop in target)) { - return undefined; - } - - let value = target[prop]; - - if (typeof value === "function") { - // This is a method on the underlying object. Check if we need to do - // any wrapping. - if (typeof wrappers[prop] === "function") { - // We have a special-case wrapper for this method. - value = wrapMethod(target, target[prop], wrappers[prop]); - } else if (hasOwnProperty(metadata, prop)) { - // This is an async method that we have metadata for. Create a - // Promise wrapper for it. - let wrapper = wrapAsyncFunction(prop, metadata[prop]); - value = wrapMethod(target, target[prop], wrapper); - } else { - // This is a method that we don't know or care about. Return the - // original method, bound to the underlying object. - value = value.bind(target); - } - } else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) { - // This is an object that we need to do some wrapping for the children - // of. Create a sub-object wrapper for it with the appropriate child - // metadata. - value = wrapObject(value, wrappers[prop], metadata[prop]); - } else if (hasOwnProperty(metadata, "*")) { - // Wrap all properties in * namespace. - value = wrapObject(value, wrappers[prop], metadata["*"]); - } else { - // We don't need to do any wrapping for this property, - // so just forward all access to the underlying object. - Object.defineProperty(cache, prop, { - configurable: true, - enumerable: true, - - get() { - return target[prop]; - }, - - set(value) { - target[prop] = value; - } - - }); - return value; - } - - cache[prop] = value; - return value; - }, - - set(proxyTarget, prop, value, receiver) { - if (prop in cache) { - cache[prop] = value; - } else { - target[prop] = value; - } - - return true; - }, - - defineProperty(proxyTarget, prop, desc) { - return Reflect.defineProperty(cache, prop, desc); - }, - - deleteProperty(proxyTarget, prop) { - return Reflect.deleteProperty(cache, prop); - } - - }; // Per contract of the Proxy API, the "get" proxy handler must return the - // original value of the target if that value is declared read-only and - // non-configurable. For this reason, we create an object with the - // prototype set to `target` instead of using `target` directly. - // Otherwise we cannot return a custom object for APIs that - // are declared read-only and non-configurable, such as `chrome.devtools`. - // - // The proxy handlers themselves will still use the original `target` - // instead of the `proxyTarget`, so that the methods and properties are - // dereferenced via the original targets. - - let proxyTarget = Object.create(target); - return new Proxy(proxyTarget, handlers); - }; - /** - * Creates a set of wrapper functions for an event object, which handles - * wrapping of listener functions that those messages are passed. - * - * A single wrapper is created for each listener function, and stored in a - * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener` - * retrieve the original wrapper, so that attempts to remove a - * previously-added listener work as expected. - * - * @param {DefaultWeakMap} wrapperMap - * A DefaultWeakMap object which will create the appropriate wrapper - * for a given listener function when one does not exist, and retrieve - * an existing one when it does. - * - * @returns {object} - */ - - - const wrapEvent = wrapperMap => ({ - addListener(target, listener, ...args) { - target.addListener(wrapperMap.get(listener), ...args); - }, - - hasListener(target, listener) { - return target.hasListener(wrapperMap.get(listener)); - }, - - removeListener(target, listener) { - target.removeListener(wrapperMap.get(listener)); - } - - }); // Keep track if the deprecation warning has been logged at least once. - - - let loggedSendResponseDeprecationWarning = false; - const onMessageWrappers = new DefaultWeakMap(listener => { - if (typeof listener !== "function") { - return listener; - } - /** - * Wraps a message listener function so that it may send responses based on - * its return value, rather than by returning a sentinel value and calling a - * callback. If the listener function returns a Promise, the response is - * sent when the promise either resolves or rejects. - * - * @param {*} message - * The message sent by the other end of the channel. - * @param {object} sender - * Details about the sender of the message. - * @param {function(*)} sendResponse - * A callback which, when called with an arbitrary argument, sends - * that value as a response. - * @returns {boolean} - * True if the wrapped listener returned a Promise, which will later - * yield a response. False otherwise. - */ - - - return function onMessage(message, sender, sendResponse) { - let didCallSendResponse = false; - let wrappedSendResponse; - let sendResponsePromise = new Promise(resolve => { - wrappedSendResponse = function (response) { - if (!loggedSendResponseDeprecationWarning) { - console.warn(SEND_RESPONSE_DEPRECATION_WARNING, new Error().stack); - loggedSendResponseDeprecationWarning = true; - } - - didCallSendResponse = true; - resolve(response); - }; - }); - let result; - - try { - result = listener(message, sender, wrappedSendResponse); - } catch (err) { - result = Promise.reject(err); - } - - const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called - // wrappedSendResponse synchronously, we can exit earlier - // because there will be no response sent from this listener. - - if (result !== true && !isResultThenable && !didCallSendResponse) { - return false; - } // A small helper to send the message if the promise resolves - // and an error if the promise rejects (a wrapped sendMessage has - // to translate the message into a resolved promise or a rejected - // promise). - - - const sendPromisedResult = promise => { - promise.then(msg => { - // send the message value. - sendResponse(msg); - }, error => { - // Send a JSON representation of the error if the rejected value - // is an instance of error, or the object itself otherwise. - let message; - - if (error && (error instanceof Error || typeof error.message === "string")) { - message = error.message; - } else { - message = "An unexpected error occurred"; - } - - sendResponse({ - __mozWebExtensionPolyfillReject__: true, - message - }); - }).catch(err => { - // Print an error on the console if unable to send the response. - console.error("Failed to send onMessage rejected reply", err); - }); - }; // If the listener returned a Promise, send the resolved value as a - // result, otherwise wait the promise related to the wrappedSendResponse - // callback to resolve and send it as a response. - - - if (isResultThenable) { - sendPromisedResult(result); - } else { - sendPromisedResult(sendResponsePromise); - } // Let Chrome know that the listener is replying. - - - return true; - }; - }); - - const wrappedSendMessageCallback = ({ - reject, - resolve - }, reply) => { - if (extensionAPIs.runtime.lastError) { - // Detect when none of the listeners replied to the sendMessage call and resolve - // the promise to undefined as in Firefox. - // See https://github.com/mozilla/webextension-polyfill/issues/130 - if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) { - resolve(); - } else { - reject(extensionAPIs.runtime.lastError); - } - } else if (reply && reply.__mozWebExtensionPolyfillReject__) { - // Convert back the JSON representation of the error into - // an Error instance. - reject(new Error(reply.message)); - } else { - resolve(reply); - } - }; - - const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => { - if (args.length < metadata.minArgs) { - throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); - } - - if (args.length > metadata.maxArgs) { - throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); - } - - return new Promise((resolve, reject) => { - const wrappedCb = wrappedSendMessageCallback.bind(null, { - resolve, - reject - }); - args.push(wrappedCb); - apiNamespaceObj.sendMessage(...args); - }); - }; - - const staticWrappers = { - runtime: { - onMessage: wrapEvent(onMessageWrappers), - onMessageExternal: wrapEvent(onMessageWrappers), - sendMessage: wrappedSendMessage.bind(null, "sendMessage", { - minArgs: 1, - maxArgs: 3 - }) - }, - tabs: { - sendMessage: wrappedSendMessage.bind(null, "sendMessage", { - minArgs: 2, - maxArgs: 3 - }) - } - }; - const settingMetadata = { - clear: { - minArgs: 1, - maxArgs: 1 - }, - get: { - minArgs: 1, - maxArgs: 1 - }, - set: { - minArgs: 1, - maxArgs: 1 - } - }; - apiMetadata.privacy = { - network: { - "*": settingMetadata - }, - services: { - "*": settingMetadata - }, - websites: { - "*": settingMetadata - } - }; - return wrapObject(extensionAPIs, staticWrappers, apiMetadata); - }; - - if (typeof chrome != "object" || !chrome || !chrome.runtime || !chrome.runtime.id) { - throw new Error("This script should only be loaded in a browser extension."); - } // The build process adds a UMD wrapper around this file, which makes the - // `module` variable available. - - - module.exports = wrapAPIs(chrome); - } else { - module.exports = browser; - } -}); -//# sourceMappingURL=browser-polyfill.js.map diff --git a/apps/web-clipper/manifest.json b/apps/web-clipper/manifest.json index 12694338c9..8c7754a064 100644 --- a/apps/web-clipper/manifest.json +++ b/apps/web-clipper/manifest.json @@ -13,18 +13,6 @@ "default_title": "Trilium Web Clipper", "default_popup": "popup/popup.html" }, - "content_scripts": [ - { - "js": [ - "lib/browser-polyfill.js" - ] - } - ], - "background": { - "scripts": [ - "lib/browser-polyfill.js" - ] - }, "commands": { "saveSelection": { "description": "Save the selected text into a note", From a2a37a0b54302ebf605adb910ddc4c4d29fbdc68 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 16:45:58 +0200 Subject: [PATCH 084/316] chore(web-clipper): integrate old manifest --- apps/web-clipper/manifest.json | 36 ---------------------------------- apps/web-clipper/package.json | 2 +- apps/web-clipper/wxt.config.ts | 21 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 37 deletions(-) delete mode 100644 apps/web-clipper/manifest.json diff --git a/apps/web-clipper/manifest.json b/apps/web-clipper/manifest.json deleted file mode 100644 index 8c7754a064..0000000000 --- a/apps/web-clipper/manifest.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "manifest_version": 2, - "version": "1.0.1", - "homepage_url": "https://github.com/zadam/trilium-web-clipper", - "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", - "icons": { - "32": "icons/32.png", - "48": "icons/48.png", - "96": "icons/96.png" - }, - "browser_action": { - "default_icon": "icons/32.png", - "default_title": "Trilium Web Clipper", - "default_popup": "popup/popup.html" - }, - "commands": { - "saveSelection": { - "description": "Save the selected text into a note", - "suggested_key": { - "default": "Ctrl+Shift+S" - } - }, - "saveWholePage": { - "description": "Save the current page", - "suggested_key": { - "default": "Alt+Shift+S" - } - }, - "saveCroppedScreenshot": { - "description": "Take a cropped screenshot of the current page", - "suggested_key": { - "default": "Ctrl+Shift+E" - } - } - } -} diff --git a/apps/web-clipper/package.json b/apps/web-clipper/package.json index 8dcc7ec6c6..e975e1ac42 100644 --- a/apps/web-clipper/package.json +++ b/apps/web-clipper/package.json @@ -1,6 +1,6 @@ { "name": "@triliumnext/web-clipper", - "version": "1.0.0", + "version": "1.0.1", "description": "", "main": "index.js", "scripts": { diff --git a/apps/web-clipper/wxt.config.ts b/apps/web-clipper/wxt.config.ts index f824eb64c9..98932d7463 100644 --- a/apps/web-clipper/wxt.config.ts +++ b/apps/web-clipper/wxt.config.ts @@ -5,6 +5,7 @@ export default defineConfig({ manifest: { name: "Trilium Web Clipper", description: "Save web clippings to Trilium Notes.", + homepage_url: "https://docs.triliumnotes.org/user-guide/setup/web-clipper", permissions: [ "activeTab", "tabs", @@ -19,6 +20,26 @@ export default defineConfig({ gecko: { id: "{1410742d-b377-40e7-a9db-63dc9c6ec99c}" } + }, + commands: { + saveSelection: { + description: "Save the selected text into a note", + suggested_key: { + default: "Ctrl+Shift+S" + } + }, + saveWholePage: { + description: "Save the current page", + suggested_key: { + default: "Alt+Shift+S" + } + }, + saveCroppedScreenshot: { + description: "Take a cropped screenshot of the current page", + suggested_key: { + default: "Ctrl+Shift+E" + } + } } } }); From 53e3d65c52b984b664944f7ee9a43058e268835e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 17:01:03 +0200 Subject: [PATCH 085/316] fix(web-clipper): handling of dev port --- apps/web-clipper/entrypoints/background/index.ts | 10 +--------- .../entrypoints/background/trilium_server_facade.ts | 8 +------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/apps/web-clipper/entrypoints/background/index.ts b/apps/web-clipper/entrypoints/background/index.ts index 5aa2642e84..7ca94f21e7 100644 --- a/apps/web-clipper/entrypoints/background/index.ts +++ b/apps/web-clipper/entrypoints/background/index.ts @@ -1,6 +1,6 @@ import { randomString, Rect } from "@/utils"; -import TriliumServerFacade, { isDevEnv } from "./trilium_server_facade"; +import TriliumServerFacade from "./trilium_server_facade"; export default defineBackground(() => { const triliumServerFacade = new TriliumServerFacade(); @@ -96,14 +96,6 @@ export default defineBackground(() => { return await browser.tabs.captureVisibleTab({ format: 'png' }); } - browser.runtime.onInstalled.addListener(() => { - if (isDevEnv()) { - browser.browserAction.setIcon({ - path: 'icons/32-dev.png', - }); - } - }); - browser.contextMenus.create({ id: "trilium-save-selection", title: "Save selection to Trilium", diff --git a/apps/web-clipper/entrypoints/background/trilium_server_facade.ts b/apps/web-clipper/entrypoints/background/trilium_server_facade.ts index f9854437f4..3e65b849df 100644 --- a/apps/web-clipper/entrypoints/background/trilium_server_facade.ts +++ b/apps/web-clipper/entrypoints/background/trilium_server_facade.ts @@ -1,11 +1,5 @@ const PROTOCOL_VERSION_MAJOR = 1; -export function isDevEnv() { - const manifest = browser.runtime.getManifest(); - - return manifest.name.endsWith('(dev)'); -} - type TriliumSearchStatus = { status: "searching"; } | { @@ -199,7 +193,7 @@ export default class TriliumServerFacade { return parseInt(triliumDesktopPort, 10); } - return isDevEnv() ? 37740 : 37840; + return import.meta.env.DEV ? 37742 : 37840; } async callService(method: string, path: string, body?: string | object) { From bba69e98aef5d1ff73ca60bf102a1a01d00396ec Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 17:07:53 +0200 Subject: [PATCH 086/316] fix(web-clipper): warning about offscreen permission in MV2 --- apps/web-clipper/wxt.config.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/web-clipper/wxt.config.ts b/apps/web-clipper/wxt.config.ts index 98932d7463..9c41b98108 100644 --- a/apps/web-clipper/wxt.config.ts +++ b/apps/web-clipper/wxt.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from "wxt"; export default defineConfig({ modules: ['@wxt-dev/auto-icons'], - manifest: { + manifest: ({ manifestVersion }) => ({ name: "Trilium Web Clipper", description: "Save web clippings to Trilium Notes.", homepage_url: "https://docs.triliumnotes.org/user-guide/setup/web-clipper", @@ -14,8 +14,8 @@ export default defineConfig({ "", "storage", "contextMenus", - "offscreen" - ], + manifestVersion === 3 && "offscreen" + ].filter(Boolean), browser_specific_settings: { gecko: { id: "{1410742d-b377-40e7-a9db-63dc9c6ec99c}" @@ -41,5 +41,5 @@ export default defineConfig({ } } } - } + }) }); From c2a758dd4af3f5c81ec07c343546d180f5f18684 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 17:23:06 +0200 Subject: [PATCH 087/316] chore(web-clipper): address requested changes --- .../entrypoints/background/index.ts | 39 +++++++++++-------- .../background/trilium_server_facade.ts | 4 +- apps/web-clipper/entrypoints/content/index.ts | 15 ++++--- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/apps/web-clipper/entrypoints/background/index.ts b/apps/web-clipper/entrypoints/background/index.ts index 7ca94f21e7..5ac45ba92f 100644 --- a/apps/web-clipper/entrypoints/background/index.ts +++ b/apps/web-clipper/entrypoints/background/index.ts @@ -7,18 +7,23 @@ export default defineBackground(() => { // Keyboard shortcuts browser.commands.onCommand.addListener(async (command) => { - if (command == "saveSelection") { - await saveSelection(); - } else if (command == "saveWholePage") { - await saveWholePage(); - } else if (command == "saveTabs") { - await saveTabs(); - } else if (command == "saveCroppedScreenshot") { - const activeTab = await getActiveTab(); - - await saveCroppedScreenshot(activeTab.url); - } else { - console.log("Unrecognized command", command); + switch (command) { + case "saveSelection": + await saveSelection(); + break; + case "saveWholePage": + await saveWholePage(); + break; + case "saveTabs": + await saveTabs(); + break; + case "saveCroppedScreenshot": { + const activeTab = await getActiveTab(); + await saveCroppedScreenshot(activeTab.url); + break; + } + default: + console.log("Unrecognized command", command); } }); @@ -39,6 +44,7 @@ export default defineBackground(() => { ctx.drawImage(img, newArea.x, newArea.y, newArea.width, newArea.height, 0, 0, newArea.width, newArea.height); resolve(canvas.toDataURL()); }; + img.onerror = reject; img.src = dataUrl; }); @@ -188,14 +194,15 @@ export default defineBackground(() => { async function postProcessImage(image: { src: string, dataUrl?: string | null }) { if (image.src.startsWith("data:image/")) { image.dataUrl = image.src; - image.src = `inline.${ image.src.substr(11, 3)}`; // this should extract file type - png/jpg + const mimeSubtype = image.src.match(/data:image\/(.*?);/)?.[1]; + if (!mimeSubtype) return; + image.src = `inline.${mimeSubtype}`; // this should extract file type - png/jpg } else { try { image.dataUrl = await fetchImage(image.src); - } - catch (e) { - console.log(`Cannot fetch image from ${image.src}`); + } catch (e) { + console.error(`Cannot fetch image from ${image.src}`, e); } } } diff --git a/apps/web-clipper/entrypoints/background/trilium_server_facade.ts b/apps/web-clipper/entrypoints/background/trilium_server_facade.ts index 3e65b849df..43247a9e79 100644 --- a/apps/web-clipper/entrypoints/background/trilium_server_facade.ts +++ b/apps/web-clipper/entrypoints/background/trilium_server_facade.ts @@ -154,7 +154,7 @@ export default class TriliumServerFacade { this.setTriliumSearch({ status: 'not-found' }); } - async triggerSearchNoteByUrl(noteUrl) { + async triggerSearchNoteByUrl(noteUrl: string) { const resp = await this.callService('GET', `notes-by-url/${encodeURIComponent(noteUrl)}`); let newStatus: TriliumSearchNoteStatus; if (resp && resp.noteId) { @@ -229,8 +229,6 @@ export default class TriliumServerFacade { catch (e) { console.log("Sending request to trilium failed", e); - window.showToast('Your request failed because we could not contact Trilium instance. Please make sure Trilium is running and is accessible.'); - return null; } } diff --git a/apps/web-clipper/entrypoints/content/index.ts b/apps/web-clipper/entrypoints/content/index.ts index 618ad11e16..b708bd6393 100644 --- a/apps/web-clipper/entrypoints/content/index.ts +++ b/apps/web-clipper/entrypoints/content/index.ts @@ -55,12 +55,12 @@ export default defineContentScript({ let modifiedDate: Date | null = null; const articlePublishedTime = document.querySelector("meta[property='article:published_time']")?.getAttribute('content'); - if (articlePublishedTime && articlePublishedTime) { + if (articlePublishedTime) { publishedDate = new Date(articlePublishedTime); } const articleModifiedTime = document.querySelector("meta[property='article:modified_time']")?.getAttribute('content'); - if (articleModifiedTime && articleModifiedTime) { + if (articleModifiedTime) { modifiedDate = new Date(articleModifiedTime); } @@ -129,7 +129,7 @@ export default defineContentScript({ selection.style.height = `${selectionArea.height}px`; } - function setSelectionSizeFromMouse(event) { + function setSelectionSizeFromMouse(event: MouseEvent) { if (!draggingStartPos) return; if (event.clientX < draggingStartPos.x) { @@ -145,14 +145,14 @@ export default defineContentScript({ updateSelection(); } - function selection_mouseDown(event) { + function selection_mouseDown(event: MouseEvent) { selectionArea = {x: event.clientX, y: event.clientY, width: 0, height: 0}; draggingStartPos = {x: event.clientX, y: event.clientY}; isDragging = true; updateSelection(); } - function selection_mouseMove(event) { + function selection_mouseMove(event: MouseEvent) { if (!isDragging) return; setSelectionSizeFromMouse(event); } @@ -169,7 +169,7 @@ export default defineContentScript({ document.body.removeChild(messageComp); } - function selection_mouseUp(event) { + function selection_mouseUp(event: MouseEvent) { setSelectionSizeFromMouse(event); removeOverlay(); @@ -186,7 +186,7 @@ export default defineContentScript({ setTimeout(() => resolve(selectionArea), 100); } - function cancel(event) { + function cancel(event: KeyboardEvent) { if (event.key === "Escape") { removeOverlay(); } @@ -195,7 +195,6 @@ export default defineContentScript({ overlay.addEventListener('mousedown', selection_mouseDown); overlay.addEventListener('mousemove', selection_mouseMove); overlay.addEventListener('mouseup', selection_mouseUp); - overlay.addEventListener('mouseup', selection_mouseUp); messageComp.addEventListener('keydown', cancel); }); } From 9d347ff3d9a2bc856ce462b3dab9a0bf3d6f47d1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 17:25:09 +0200 Subject: [PATCH 088/316] chore(web-clipper): update help URL --- apps/web-clipper/entrypoints/popup/popup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web-clipper/entrypoints/popup/popup.ts b/apps/web-clipper/entrypoints/popup/popup.ts index 40ca451a8f..273fe5c5b5 100644 --- a/apps/web-clipper/entrypoints/popup/popup.ts +++ b/apps/web-clipper/entrypoints/popup/popup.ts @@ -101,7 +101,7 @@ async function saveLinkWithNote() { $("#save-button").on("click", saveLinkWithNote); $("#show-help-button").on("click", () => { - window.open("https://github.com/zadam/trilium/wiki/Web-clipper", '_blank'); + window.open("https://docs.triliumnotes.org/user-guide/setup/web-clipper", '_blank'); }); function escapeHtml(string) { From d0f441ec7492b60aa1852f511afebe4c618b7395 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 17:38:36 +0200 Subject: [PATCH 089/316] ci(web-clipper): generate .zip files on change --- .github/workflows/web-clipper.yml | 44 +++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/workflows/web-clipper.yml diff --git a/.github/workflows/web-clipper.yml b/.github/workflows/web-clipper.yml new file mode 100644 index 0000000000..412b2ad6f6 --- /dev/null +++ b/.github/workflows/web-clipper.yml @@ -0,0 +1,44 @@ +name: Deploy web clipper extension + +on: + push: + branches: + - main + paths: + - "apps/web-clipper/**" + + pull_request: + paths: + - "apps/web-clipper/**" + +jobs: + build: + runs-on: ubuntu-latest + name: Build web clipper extension + + permissions: + contents: read + deployments: write + + steps: + - uses: actions/checkout@v6 + - uses: pnpm/action-setup@v4 + - name: Set up node & dependencies + uses: actions/setup-node@v6 + with: + node-version: 24 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --filter web-clipper --frozen-lockfile --ignore-scripts + + - name: Build the web clipper extension + run: | + pnpm --filter web-clipper zip + pnpm --filter web-clipper zip:firefox + + - name: Upload build artifacts + uses: actions/upload-artifact@v6 + with: + name: web-clipper-extension + path: .output/*.zip From 4c978d8622e53f1a208cda79c8cb74fc76c2a639 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 17:41:51 +0200 Subject: [PATCH 090/316] ci(web-clipper): fail if no files found --- .github/workflows/web-clipper.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/web-clipper.yml b/.github/workflows/web-clipper.yml index 412b2ad6f6..f12fdb11d7 100644 --- a/.github/workflows/web-clipper.yml +++ b/.github/workflows/web-clipper.yml @@ -42,3 +42,4 @@ jobs: with: name: web-clipper-extension path: .output/*.zip + if-no-files-found: error From cb0fabf273f14dfdccf0312c102123e3a0802c08 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 17:43:11 +0200 Subject: [PATCH 091/316] ci(web-clipper): fail if no files found --- .github/workflows/web-clipper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/web-clipper.yml b/.github/workflows/web-clipper.yml index f12fdb11d7..cd9de9a798 100644 --- a/.github/workflows/web-clipper.yml +++ b/.github/workflows/web-clipper.yml @@ -41,5 +41,5 @@ jobs: uses: actions/upload-artifact@v6 with: name: web-clipper-extension - path: .output/*.zip + path: apps/web-clipper/.output/*.zip if-no-files-found: error From 625062a2683324e1d1860ba82f36d538c7a6f3c0 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 17:46:48 +0200 Subject: [PATCH 092/316] ci(web-clipper): no files uploaded --- .github/workflows/web-clipper.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/web-clipper.yml b/.github/workflows/web-clipper.yml index cd9de9a798..ad16ee972b 100644 --- a/.github/workflows/web-clipper.yml +++ b/.github/workflows/web-clipper.yml @@ -42,4 +42,5 @@ jobs: with: name: web-clipper-extension path: apps/web-clipper/.output/*.zip + include-hidden-files: true if-no-files-found: error From 743a6f3466c18688e8b05caa3369c8fb94cc9165 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 18:12:02 +0200 Subject: [PATCH 093/316] ci(web-clipper): disable compression level for artifact --- .github/workflows/web-clipper.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/web-clipper.yml b/.github/workflows/web-clipper.yml index ad16ee972b..ef360a5a93 100644 --- a/.github/workflows/web-clipper.yml +++ b/.github/workflows/web-clipper.yml @@ -44,3 +44,4 @@ jobs: path: apps/web-clipper/.output/*.zip include-hidden-files: true if-no-files-found: error + compression-level: 0 From 199962233b372838b750b81584c9034a77ccf7da Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 19:04:38 +0200 Subject: [PATCH 094/316] chore(web-clipper): use friendly ID for Firefox --- apps/web-clipper/wxt.config.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/web-clipper/wxt.config.ts b/apps/web-clipper/wxt.config.ts index 9c41b98108..f3389c1efe 100644 --- a/apps/web-clipper/wxt.config.ts +++ b/apps/web-clipper/wxt.config.ts @@ -18,7 +18,8 @@ export default defineConfig({ ].filter(Boolean), browser_specific_settings: { gecko: { - id: "{1410742d-b377-40e7-a9db-63dc9c6ec99c}" + // See https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/browser_specific_settings#id. + id: "web-clipper@triliumnotes.org" } }, commands: { From 1cf93ff0dec89ee1a80654934cb30fad74920043 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 19:25:16 +0200 Subject: [PATCH 095/316] chore(web-clipper): add data_collection_permissions for Firefox --- apps/web-clipper/wxt.config.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/web-clipper/wxt.config.ts b/apps/web-clipper/wxt.config.ts index f3389c1efe..71f7df37a8 100644 --- a/apps/web-clipper/wxt.config.ts +++ b/apps/web-clipper/wxt.config.ts @@ -19,7 +19,14 @@ export default defineConfig({ browser_specific_settings: { gecko: { // See https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/browser_specific_settings#id. - id: "web-clipper@triliumnotes.org" + id: "web-clipper@triliumnotes.org", + // Firefox built-in data collection consent + // See https://extensionworkshop.com/documentation/develop/firefox-builtin-data-consent/ + // This extension only communicates with a user-configured Trilium instance + // and does not collect telemetry or send data to remote servers. + data_collection_permissions: { + required: ["none"] + } } }, commands: { From ada22e496679ea366b16704327d67b6577cc6b51 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 21:24:14 +0200 Subject: [PATCH 096/316] docs(user): update web clipper --- .../Installation & Setup/Web Clipper.html | 55 ++++++++++++++----- apps/web-clipper/README.md | 24 -------- .../Developer Guide/Documentation.md | 2 +- .../Installation & Setup/Web Clipper.md | 37 ++++++++++--- 4 files changed, 73 insertions(+), 45 deletions(-) delete mode 100644 apps/web-clipper/README.md diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html index b406c7b3ce..effb6e395b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html @@ -4,17 +4,34 @@

Trilium Web Clipper is a web browser extension which allows user to clip text, screenshots, whole pages and short notes and save them directly to Trilium Notes.

-

Project is hosted here.

-

Firefox and Chrome are supported browsers, but the chrome build should - work on other chromium based browsers as well.

+

Supported browsers

+

Trilium Web Clipper officially supports the following web browsers:

+
    +
  • +

    Mozilla Firefox, using Manifest v2.

    +
  • +
  • +

    Google Chrome, using Manifest v3. Theoretically the extension should work + on other Chromium-based browsers as well, but they are not officially supported.

    +
  • +
+

Obtaining the extension

+

Functionality

  • select text and clip it with the right-click context menu
  • click on an image or link and save it through context menu
  • save whole page from the popup or context menu
  • save screenshot (with crop tool) from either popup or context menu
  • -
  • create short text note from popup
  • +
  • create short text note from popup
+

Location of clippings

Trilium will save these clippings as a new child note under a "clipper inbox" note.

By default, that's the day note but you @@ -23,21 +40,33 @@ spellcheck="false">clipperInbox, on any other note.

If there's multiple clippings from the same page (and on the same day), then they will be added to the same note.

-

Extension is available from: -

+

Keyboard shortcuts

+

Keyboard shortcuts are available for most functions:

    -
  • Project release page - - .xpi for Firefox and .zip for Chromium based browsers.
  • -
  • Chrome Web Store +
  • Save selected text: Ctrl+Shift+S (Mac: ++S)
  • +
  • Save whole page: Alt+Shift+S (Mac: ++S)
  • +
  • Save screenshot: Ctrl+Shift+E (Mac: ++E)
  • +
+

To set custom shortcuts, follow the directions for your browser.

+
    +
  • Firefox: about:addons → + Gear icon ⚙️ → Manage extension shortcuts
  • +
  • Chrome: chrome://extensions/shortcuts
+

Configuration

The extension needs to connect to a running Trilium instance. By default, it scans a port range on the local computer to find a desktop Trilium instance.

It's also possible to configure the server address if you don't run the desktop application, or want it to work without the desktop application running.

-

Username

-

Older versions of Trilium (before 0.50) required username & password - to authenticate, but this is no longer the case. You may enter anything - in that field, it will not have any effect.

\ No newline at end of file +

Credits

+

Some parts of the code are based on the Joplin Notes browser extension.

\ No newline at end of file diff --git a/apps/web-clipper/README.md b/apps/web-clipper/README.md deleted file mode 100644 index a37d0e1817..0000000000 --- a/apps/web-clipper/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Trilium Web Clipper - -## This repo is dead - -**Trilium is in maintenance mode and Web Clipper is not likely to get new releases.** - -Trilium Web Clipper is a web browser extension which allows user to clip text, screenshots, whole pages and short notes and save them directly to [Trilium Notes](https://github.com/zadam/trilium). - -For more details, see the [wiki page](https://github.com/zadam/trilium/wiki/Web-clipper). - -## Keyboard shortcuts -Keyboard shortcuts are available for most functions: -* Save selected text: `Ctrl+Shift+S` (Mac: `Cmd+Shift+S`) -* Save whole page: `Alt+Shift+S` (Mac: `Opt+Shift+S`) -* Save screenshot: `Ctrl+Shift+E` (Mac: `Cmd+Shift+E`) - -To set custom shortcuts, follow the directions for your browser. - -**Firefox**: `about:addons` > Gear icon ⚙️ > Manage extension shortcuts - -**Chrome**: `chrome://extensions/shortcuts` - -## Credits -Some parts of the code are based on the [Joplin Notes browser extension](https://github.com/laurent22/joplin/tree/master/Clipper). diff --git a/docs/Developer Guide/Developer Guide/Documentation.md b/docs/Developer Guide/Developer Guide/Documentation.md index ea5d135a22..d840ffd46a 100644 --- a/docs/Developer Guide/Developer Guide/Documentation.md +++ b/docs/Developer Guide/Developer Guide/Documentation.md @@ -1,5 +1,5 @@ # Documentation -There are multiple types of documentation for Trilium: +There are multiple types of documentation for Trilium: * The _User Guide_ represents the user-facing documentation. This documentation can be browsed by users directly from within Trilium, by pressing F1. * The _Developer's Guide_ represents a set of Markdown documents that present the internals of Trilium, for developers. diff --git a/docs/User Guide/User Guide/Installation & Setup/Web Clipper.md b/docs/User Guide/User Guide/Installation & Setup/Web Clipper.md index bd5731d34f..a74fb72d05 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Web Clipper.md +++ b/docs/User Guide/User Guide/Installation & Setup/Web Clipper.md @@ -3,9 +3,19 @@ Trilium Web Clipper is a web browser extension which allows user to clip text, screenshots, whole pages and short notes and save them directly to Trilium Notes. -Project is hosted [here](https://github.com/TriliumNext/web-clipper). +## Supported browsers -Firefox and Chrome are supported browsers, but the chrome build should work on other chromium based browsers as well. +Trilium Web Clipper officially supports the following web browsers: + +* Mozilla Firefox, using Manifest v2. +* Google Chrome, using Manifest v3. Theoretically the extension should work on other Chromium-based browsers as well, but they are not officially supported. + +## Obtaining the extension + +> [!WARNING] +> The extension is currently under development. A preview with unsigned extensions is available on [GitHub Actions](https://github.com/TriliumNext/Trilium/actions/runs/21318809414). +> +> We have already submitted the extension to both Chrome and Firefox web stores, but they are pending validation. ## Functionality @@ -15,16 +25,29 @@ Firefox and Chrome are supported browsers, but the chrome build should work on o * save screenshot (with crop tool) from either popup or context menu * create short text note from popup +## Location of clippings + Trilium will save these clippings as a new child note under a "clipper inbox" note. By default, that's the [day note](../Advanced%20Usage/Advanced%20Showcases/Day%20Notes.md) but you can override that by setting the [label](../Advanced%20Usage/Attributes.md) `clipperInbox`, on any other note. If there's multiple clippings from the same page (and on the same day), then they will be added to the same note. -**Extension is available from:** +## Keyboard shortcuts -* [Project release page](https://github.com/TriliumNext/web-clipper/releases) - .xpi for Firefox and .zip for Chromium based browsers. -* [Chrome Web Store](https://chromewebstore.google.com/detail/trilium-web-clipper/dfhgmnfclbebfobmblelddiejjcijbjm) +Keyboard shortcuts are available for most functions: + +* Save selected text: Ctrl+Shift+S (Mac: ++S) +* Save whole page: Alt+Shift+S (Mac: ++S) +* Save screenshot: Ctrl+Shift+E (Mac: ++E) + +To set custom shortcuts, follow the directions for your browser. + +* **Firefox**: `about:addons` → Gear icon ⚙️ → Manage extension shortcuts +* **Chrome**: `chrome://extensions/shortcuts` + +> [!NOTE] +> On Firefox, the default shortcuts interfere with some browser features. As such, the keyboard combinations will not trigger the Web Clipper action. To fix this, simply change the keyboard shortcut to something that works. The defaults will be adjusted in future versions. ## Configuration @@ -32,6 +55,6 @@ The extension needs to connect to a running Trilium instance. By default, it sca It's also possible to configure the [server](Server%20Installation.md) address if you don't run the desktop application, or want it to work without the desktop application running. -## Username +## Credits -Older versions of Trilium (before 0.50) required username & password to authenticate, but this is no longer the case. You may enter anything in that field, it will not have any effect. \ No newline at end of file +Some parts of the code are based on the [Joplin Notes browser extension](https://github.com/laurent22/joplin/tree/master/Clipper). \ No newline at end of file From e2e5d485d7281e091fd65b0bddfd760bb99c5c5f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 21:35:54 +0200 Subject: [PATCH 097/316] docs(dev): add some information on web clipper --- docs/Developer Guide/!!!meta.json | 34 ++++++++++++++++++ .../Developer Guide/Concepts/Web Clipper.md | 35 +++++++++++++++++++ .../Developer Guide/Project Structure.md | 1 + 3 files changed, 70 insertions(+) create mode 100644 docs/Developer Guide/Developer Guide/Concepts/Web Clipper.md diff --git a/docs/Developer Guide/!!!meta.json b/docs/Developer Guide/!!!meta.json index d5bdbfd832..3d865230e9 100644 --- a/docs/Developer Guide/!!!meta.json +++ b/docs/Developer Guide/!!!meta.json @@ -2839,6 +2839,40 @@ "format": "markdown", "dataFileName": "Themes.md", "attachments": [] + }, + { + "isClone": false, + "noteId": "YTAxJMA3uWwn", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "YTAxJMA3uWwn" + ], + "title": "Web Clipper", + "notePosition": 210, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "web-clipper", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-paperclip", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Web Clipper.md", + "attachments": [] } ] }, diff --git a/docs/Developer Guide/Developer Guide/Concepts/Web Clipper.md b/docs/Developer Guide/Developer Guide/Concepts/Web Clipper.md new file mode 100644 index 0000000000..b36bfd1303 --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Concepts/Web Clipper.md @@ -0,0 +1,35 @@ +# Web Clipper +The Web Clipper is present in the monorepo in `apps/web-clipper`. It's based on [WXT](https://wxt.dev/guide/introduction.html), a framework for building web extensions that allows very easy development and publishing. + +## Manifest version + +Originally the Web Clipper supported only Manifest v2, which made the extension incompatible with Google Chrome. [#8494](https://github.com/TriliumNext/Trilium/pull/8494) introduces Manifest v3 support for Google Chrome, alongside with Manifest v2 for Firefox. + +Although Firefox does support Manifest v3, we are still using Manifest v2 for it because WXT dev mode doesn't work for the Firefox / Manifest v3 combination and there were some mentions about Manifest v3 not being well supported on Firefox Mobile (and we plan to have support for it). + +## Dev mode + +WXT allows easy development of the plugin, with full TypeScript support and live reload. To enter dev mode: + +* Run `pnpm --filter web-clipper dev` to enter dev mode for Chrome (with manifest v3). +* Run `pnpm --filter web-clipper dev:firefox` to enter dev mode for Firefox (with manifest v2). + +This will open a separate browser instance in which the extension is automatically injected. + +## Port + +The default port is: + +* `37742` if in development mode. This makes it possible to use `pnpm desktop:start` to spin up a desktop instance to use the Clipper with. +* `37840` in production, the default Trilium port. + +## Building + +* Run `build` (Chrome) or `build:firefox` to generate the output files, which will be in `.output/[browser]`. +* Run `zip` or `zip:firefox` to generate the ZIP files. + +## CI + +`.github/workflows/web-clipper.yml` handles the building of the web clipper. Whenever the web clipper is modified, it generates the ZIPs and uploads them as artifacts. + +There is currently no automatic publishing to the app stores. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Project Structure.md b/docs/Developer Guide/Developer Guide/Project Structure.md index 82688cf2ac..2e2a5438d4 100644 --- a/docs/Developer Guide/Developer Guide/Project Structure.md +++ b/docs/Developer Guide/Developer Guide/Project Structure.md @@ -9,6 +9,7 @@ The mono-repo is mainly structured in: * `client`, representing the front-end that is used both by the server and the desktop application. * `server`, representing the Node.js / server version of the application. * `desktop`, representing the Electron-based desktop application. + * `web-clipper`, representing the browser extension to easily clip web pages into Trilium, with support for both Firefox and Chrome (manifest V3). * `packages`, containing dependencies used by one or more `apps`. * `commons`, containing shared code for all the apps. From 4927b01d9634c7af98e54ec17b9dc341a9c8b437 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 23:13:27 +0200 Subject: [PATCH 098/316] chore(webclipper): fix typecheck --- apps/web-clipper/entrypoints/background/index.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/web-clipper/entrypoints/background/index.ts b/apps/web-clipper/entrypoints/background/index.ts index 5ac45ba92f..31ee608f53 100644 --- a/apps/web-clipper/entrypoints/background/index.ts +++ b/apps/web-clipper/entrypoints/background/index.ts @@ -366,7 +366,7 @@ export default defineBackground(() => { toast(`${tabs.length} links have been saved to Trilium.`, resp.noteId, tabIds); } - browser.contextMenus.onClicked.addListener(async (info, tab) => { + browser.contextMenus.onClicked.addListener(async (info: globalThis.Browser.contextMenus.OnClickData & { linkText?: string; }) => { if (info.menuItemId === 'trilium-save-selection') { await saveSelection(); } @@ -381,6 +381,7 @@ export default defineBackground(() => { } else if (info.menuItemId === 'trilium-save-link') { if (!info.linkUrl) return; + // Link text is only available on Firefox. const linkText = info.linkText || info.linkUrl; const content = `${linkText}`; const activeTab = await getActiveTab(); @@ -460,7 +461,9 @@ export default defineBackground(() => { } else if (request.name === 'trigger-trilium-search-note-url') { const activeTab = await getActiveTab(); - triliumServerFacade.triggerSearchNoteByUrl(activeTab.url); + if (activeTab.url) { + triliumServerFacade.triggerSearchNoteByUrl(activeTab.url); + } } }); }); From b7b367b5a3449225f0469d97ea128a351d6e8065 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 24 Jan 2026 23:54:26 +0200 Subject: [PATCH 099/316] chore(webclipper): address requested changes --- .../entrypoints/background/index.ts | 36 +++++++++++++------ .../background/trilium_server_facade.ts | 6 ++-- apps/web-clipper/entrypoints/content/index.ts | 12 ++++--- apps/web-clipper/entrypoints/options/index.ts | 2 +- apps/web-clipper/entrypoints/popup/popup.ts | 2 +- 5 files changed, 37 insertions(+), 21 deletions(-) diff --git a/apps/web-clipper/entrypoints/background/index.ts b/apps/web-clipper/entrypoints/background/index.ts index 31ee608f53..8657ee5117 100644 --- a/apps/web-clipper/entrypoints/background/index.ts +++ b/apps/web-clipper/entrypoints/background/index.ts @@ -2,6 +2,19 @@ import { randomString, Rect } from "@/utils"; import TriliumServerFacade from "./trilium_server_facade"; +type BackgroundMessage = { + name: "toast"; + message: string; + noteId: string | null; + tabIds: number[] | null; +} | { + name: "trilium-save-selection"; +} | { + name: "trilium-get-rectangle-for-screenshot"; +} | { + name: "trilium-save-page"; +}; + export default defineBackground(() => { const triliumServerFacade = new TriliumServerFacade(); @@ -155,7 +168,7 @@ export default defineBackground(() => { return tabs; } - async function sendMessageToActiveTab(message) { + async function sendMessageToActiveTab(message: BackgroundMessage) { const activeTab = await getActiveTab(); if (!activeTab?.id) { @@ -229,7 +242,7 @@ export default defineBackground(() => { toast("Selection has been saved to Trilium.", resp.noteId); } - async function getImagePayloadFromSrc(src, pageUrl) { + async function getImagePayloadFromSrc(src: string, pageUrl: string | null | undefined) { const image = { imageId: randomString(20), src @@ -247,7 +260,7 @@ export default defineBackground(() => { }; } - async function saveCroppedScreenshot(pageUrl) { + async function saveCroppedScreenshot(pageUrl: string | null | undefined) { const { rect, devicePixelRatio } = await sendMessageToActiveTab({name: 'trilium-get-rectangle-for-screenshot'}); const src = await takeCroppedScreenshot(rect, devicePixelRatio); @@ -263,7 +276,7 @@ export default defineBackground(() => { toast("Screenshot has been saved to Trilium.", resp.noteId); } - async function saveWholeScreenshot(pageUrl) { + async function saveWholeScreenshot(pageUrl: string | null | undefined) { const src = await takeWholeScreenshot(); const payload = await getImagePayloadFromSrc(src, pageUrl); @@ -277,7 +290,7 @@ export default defineBackground(() => { toast("Screenshot has been saved to Trilium.", resp.noteId); } - async function saveImage(srcUrl, pageUrl) { + async function saveImage(srcUrl: string, pageUrl: string | null | undefined) { const payload = await getImagePayloadFromSrc(srcUrl, pageUrl); const resp = await triliumServerFacade.callService("POST", "clippings", payload); @@ -303,11 +316,11 @@ export default defineBackground(() => { toast("Page has been saved to Trilium.", resp.noteId); } - async function saveLinkWithNote(title, content) { + async function saveLinkWithNote(title: string, content: string) { const activeTab = await getActiveTab(); if (!title.trim()) { - title = activeTab.title; + title = activeTab.title ?? ""; } const resp = await triliumServerFacade.callService('POST', 'notes', { @@ -326,7 +339,7 @@ export default defineBackground(() => { return true; } - async function getTabsPayload(tabs) { + async function getTabsPayload(tabs: Browser.tabs.Tab[]) { let content = '
    '; tabs.forEach(tab => { content += `
  • ${tab.title}
  • `; @@ -335,7 +348,7 @@ export default defineBackground(() => { const domainsCount = tabs.map(tab => tab.url) .reduce((acc, url) => { - const hostname = new URL(url).hostname; + const hostname = new URL(url ?? "").hostname; return acc.set(hostname, (acc.get(hostname) || 0) + 1); }, new Map()); @@ -362,7 +375,7 @@ export default defineBackground(() => { const resp = await triliumServerFacade.callService('POST', 'notes', payload); if (!resp) return; - const tabIds = tabs.map(tab => tab.id!).filter(id => id !== undefined) as number[]; + const tabIds = tabs.map(tab => tab.id).filter(id => id !== undefined) as number[]; toast(`${tabs.length} links have been saved to Trilium.`, resp.noteId, tabIds); } @@ -377,6 +390,7 @@ export default defineBackground(() => { await saveWholeScreenshot(info.pageUrl); } else if (info.menuItemId === 'trilium-save-image') { + if (!info.srcUrl) return; await saveImage(info.srcUrl, info.pageUrl); } else if (info.menuItemId === 'trilium-save-link') { @@ -407,7 +421,7 @@ export default defineBackground(() => { console.log("Received", request); if (request.name === 'openNoteInTrilium') { - const resp = await triliumServerFacade.callService('POST', `open/${ request.noteId}`); + const resp = await triliumServerFacade.callService('POST', `open/${request.noteId}`); if (!resp) { return; diff --git a/apps/web-clipper/entrypoints/background/trilium_server_facade.ts b/apps/web-clipper/entrypoints/background/trilium_server_facade.ts index 43247a9e79..da553cec29 100644 --- a/apps/web-clipper/entrypoints/background/trilium_server_facade.ts +++ b/apps/web-clipper/entrypoints/background/trilium_server_facade.ts @@ -57,7 +57,7 @@ export default class TriliumServerFacade { catch (e) {} // nothing might be listening } - setTriliumSearchNote(st){ + setTriliumSearchNote(st: TriliumSearchNoteStatus){ this.triliumSearchNote = st; this.sendTriliumSearchNoteToPopup(); } @@ -69,7 +69,7 @@ export default class TriliumServerFacade { } setTriliumSearchWithVersionCheck(json: { protocolVersion: string }, resp: TriliumSearchStatus) { - const [major, minor] = json.protocolVersion + const [ major ] = json.protocolVersion .split(".") .map(chunk => parseInt(chunk, 10)); @@ -94,7 +94,7 @@ export default class TriliumServerFacade { try { const port = await this.getPort(); - console.debug(`Trying port ${ port}`); + console.debug(`Trying port ${port}`); const resp = await fetch(`http://127.0.0.1:${port}/api/clipper/handshake`); diff --git a/apps/web-clipper/entrypoints/content/index.ts b/apps/web-clipper/entrypoints/content/index.ts index b708bd6393..d35f3d8970 100644 --- a/apps/web-clipper/entrypoints/content/index.ts +++ b/apps/web-clipper/entrypoints/content/index.ts @@ -6,7 +6,7 @@ export default defineContentScript({ "" ], main: () => { - function absoluteUrl(url) { + function absoluteUrl(url: string | undefined) { if (!url) { return url; } @@ -89,8 +89,8 @@ export default defineContentScript({ messageComp.style.position = 'fixed'; messageComp.style.opacity = '0.95'; messageComp.style.fontSize = '14px'; - messageComp.style.width = `${messageCompWidth }px`; - messageComp.style.maxWidth = `${messageCompWidth }px`; + messageComp.style.width = `${messageCompWidth}px`; + messageComp.style.maxWidth = `${messageCompWidth}px`; messageComp.style.border = '1px solid black'; messageComp.style.background = 'white'; messageComp.style.color = 'black'; @@ -199,10 +199,12 @@ export default defineContentScript({ }); } - function makeLinksAbsolute(container) { + function makeLinksAbsolute(container: HTMLElement) { for (const link of container.getElementsByTagName('a')) { if (link.href) { - link.href = absoluteUrl(link.href); + const newUrl = absoluteUrl(link.href); + if (!newUrl) continue; + link.href = newUrl; } } } diff --git a/apps/web-clipper/entrypoints/options/index.ts b/apps/web-clipper/entrypoints/options/index.ts index da8fa1850a..c7cb3d4bdf 100644 --- a/apps/web-clipper/entrypoints/options/index.ts +++ b/apps/web-clipper/entrypoints/options/index.ts @@ -27,7 +27,7 @@ async function saveTriliumServerSetup(e) { let resp; try { - resp = await fetch(`${$triliumServerUrl.val() }/api/login/token`, { + resp = await fetch(`${$triliumServerUrl.val()}/api/login/token`, { method: "POST", headers: { 'Accept': 'application/json', diff --git a/apps/web-clipper/entrypoints/popup/popup.ts b/apps/web-clipper/entrypoints/popup/popup.ts index 273fe5c5b5..0e4613b794 100644 --- a/apps/web-clipper/entrypoints/popup/popup.ts +++ b/apps/web-clipper/entrypoints/popup/popup.ts @@ -111,7 +111,7 @@ function escapeHtml(string) { const htmlWithPars = pre.innerHTML.replace(/\n/g, "

    "); - return `

    ${ htmlWithPars }

    `; + return `

    ${htmlWithPars}

    `; } const $connectionStatus = $("#connection-status"); From 99e22a5636ffcf1e85339c5673e4fa1dcbb6a16e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 25 Jan 2026 01:58:44 +0000 Subject: [PATCH 100/316] fix(deps): update codemirror themes to v6.2.4 --- packages/codemirror/package.json | 4 ++-- pnpm-lock.yaml | 24 ++++++++++++++---------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/codemirror/package.json b/packages/codemirror/package.json index e3b832a4b8..397676b5df 100644 --- a/packages/codemirror/package.json +++ b/packages/codemirror/package.json @@ -39,8 +39,8 @@ "@fsegurai/codemirror-theme-tokyo-night-day": "6.2.3", "@fsegurai/codemirror-theme-tokyo-night-storm": "6.2.3", "@fsegurai/codemirror-theme-volcano": "6.2.3", - "@fsegurai/codemirror-theme-vscode-dark": "6.2.3", - "@fsegurai/codemirror-theme-vscode-light": "6.2.3", + "@fsegurai/codemirror-theme-vscode-dark": "6.2.4", + "@fsegurai/codemirror-theme-vscode-light": "6.2.4", "@replit/codemirror-indentation-markers": "6.5.3", "@replit/codemirror-lang-nix": "6.0.1", "@replit/codemirror-vim": "6.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b66963f228..ac8955c806 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1313,11 +1313,11 @@ importers: specifier: 6.2.3 version: 6.2.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.39.11)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-vscode-dark': - specifier: 6.2.3 - version: 6.2.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.39.11)(@lezer/highlight@1.2.1) + specifier: 6.2.4 + version: 6.2.4(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.39.11)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-vscode-light': - specifier: 6.2.3 - version: 6.2.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.39.11)(@lezer/highlight@1.2.1) + specifier: 6.2.4 + version: 6.2.4(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.39.11)(@lezer/highlight@1.2.1) '@replit/codemirror-indentation-markers': specifier: 6.5.3 version: 6.5.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.39.11) @@ -3172,16 +3172,16 @@ packages: '@codemirror/view': ^6.0.0 '@lezer/highlight': ^1.0.0 - '@fsegurai/codemirror-theme-vscode-dark@6.2.3': - resolution: {integrity: sha512-702b/C3fdTQEfAXiXNewHuvyht83volDFQPR7/uF3S+F6xJ94nUHh4xaffLEFZskvuNVQErX477mq/hnYRdRbA==} + '@fsegurai/codemirror-theme-vscode-dark@6.2.4': + resolution: {integrity: sha512-Vjr1658LIYgvC3ALVeqMhSMLA1ljoLmQpdAq8JuFdH8HkENfCXPmLX498Lnab3UYyn/b3qZAbHtAF+wQ64iMkg==} peerDependencies: '@codemirror/language': ^6.0.0 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': ^1.0.0 - '@fsegurai/codemirror-theme-vscode-light@6.2.3': - resolution: {integrity: sha512-/5xU4EGFfH8zOiw6tIFAhWUx7meuw3rX+OOKY0yu0uM8DFU+nXpepzdBwFlaTorJqdTjxw75EHxSxpRoxrgBkw==} + '@fsegurai/codemirror-theme-vscode-light@6.2.4': + resolution: {integrity: sha512-to840rPueVX6UV4YLEymGhUzzyuunY15LfGgm4Vq6hY2NmCfwYhQ/KfTcJ3XrZXiE80MrHjOq1FDcXl17UgvIQ==} peerDependencies: '@codemirror/language': ^6.0.0 '@codemirror/state': ^6.0.0 @@ -15313,6 +15313,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -16173,6 +16175,8 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.4.0 '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-upload@47.4.0': dependencies: @@ -17466,14 +17470,14 @@ snapshots: '@codemirror/view': 6.39.11 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-vscode-dark@6.2.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.39.11)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-vscode-dark@6.2.4(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.39.11)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 '@codemirror/view': 6.39.11 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-vscode-light@6.2.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.39.11)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-vscode-light@6.2.4(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.39.11)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 From cb0eeee8cc834a593fcd98ad56a417ade084cc37 Mon Sep 17 00:00:00 2001 From: pythaac Date: Sat, 24 Jan 2026 16:33:37 +0100 Subject: [PATCH 101/316] Translated using Weblate (Korean) Currently translated at 100.0% (152 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/ko/ --- .../src/translations/ko/translation.json | 54 +++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/apps/website/src/translations/ko/translation.json b/apps/website/src/translations/ko/translation.json index b65d463022..3504047426 100644 --- a/apps/website/src/translations/ko/translation.json +++ b/apps/website/src/translations/ko/translation.json @@ -48,7 +48,8 @@ }, "header": { "get-started": "시작하기", - "documentation": "문서" + "documentation": "문서", + "support-us": "후원하기" }, "support_us": { "financial_donations_title": "금전적 기부", @@ -56,7 +57,8 @@ "financial_donations_cta": "애플리케이션의 주요 개발자 (eliandoran)을 다음 방법으로 후원하는 것을 고려해 주십시오.", "github_sponsors": "GitHub Sponsors", "paypal": "페이팔", - "buy_me_a_coffee": "Buy Me A Coffee" + "buy_me_a_coffee": "Buy Me A Coffee", + "title": "후원하기" }, "contribute": { "title": "기여할 수 있는 다른 방법", @@ -84,7 +86,14 @@ "title_x64": "리눅스 64비트", "title_arm64": "ARM 기반 리눅스", "description_x64": "대부분의 리눅스 배포판에서 x86_64 아키텍처와 호환됩니다.", - "description_arm64": "ARM 기반 리눅스 배포판에서 aarch64 아키텍처와 호환됩니다." + "description_arm64": "ARM 기반 리눅스 배포판에서 aarch64 아키텍처와 호환됩니다.", + "quick_start": "사용하시는 배포판에 따라 적절한 패키지 형식을 선택해주세요:", + "download_deb": ".deb", + "download_rpm": ".rpm", + "download_flatpak": ".flatpak", + "download_zip": "포터블 (.zip)", + "download_nixpkgs": "nixpkgs", + "download_aur": "AUR" }, "note_types": { "text_title": "텍스트 노트", @@ -148,5 +157,44 @@ }, "components": { "link_learn_more": "자세히 알아보기..." + }, + "footer": { + "copyright_and_the": " 그리고 ", + "copyright_community": "커뮤니티" + }, + "social_buttons": { + "github": "GitHub", + "github_discussions": "GitHub Discussions", + "matrix": "Matrix", + "reddit": "Reddit" + }, + "download_helper_desktop_macos": { + "title_x64": "macOS (Intel)", + "title_arm64": "macOS (Apple Silicon)", + "description_x64": "Intel Mac은 Monterey 버전 이상 macOS에서 지원합니다.", + "description_arm64": "M1, M2 칩과 같은 Apple Silicon이 탑재된 Macs 전용.", + "quick_start": "Homebrew로 설치하는 경우:", + "download_dmg": "설치 프로그램 내려받기 (.dmg)", + "download_homebrew_cask": "Homebrew Cask", + "download_zip": "포터블 (.zip)" + }, + "download_helper_server_docker": { + "title": "Docker를 사용한 셀프 호스팅", + "description": "Docker 컨테이너를 사용하여 Windows, Linux 또는 macOS에 간편하게 배포할 수 있습니다.", + "download_dockerhub": "도커 허브", + "download_ghcr": "ghcr.io" + }, + "download_helper_server_linux": { + "title": "리눅스에서 셀프 호스팅", + "description": "Trilium Notes를 자체 서버 또는 VPS에 배포하세요. 대부분의 배포판과 호환됩니다.", + "download_tar_x64": "x64 (.tar.xz)", + "download_tar_arm64": "ARM (.tar.xz)", + "download_nixos": "NixOS 모듈" + }, + "download_helper_server_hosted": { + "title": "유료 호스팅", + "description": "Trilium Notes는 간편한 접근 및 관리를 위해 유료 서비스인 PikaPods에서 호스팅할 수 있습니다. Trilium 팀과 직접 제휴되어있지는 않습니다.", + "download_pikapod": "PikaPods에서 설치하기", + "download_triliumcc": "또는 trilium.cc를 참조하세요" } } From 554aa1cd645cfdee585914a4bc542d9eaad8abf6 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 25 Jan 2026 10:01:12 +0100 Subject: [PATCH 102/316] Translated using Weblate (Romanian) Currently translated at 94.6% (1669 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/ro/ --- .../src/translations/ro/translation.json | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json index 94286ea2a6..67fb2a4f9c 100644 --- a/apps/client/src/translations/ro/translation.json +++ b/apps/client/src/translations/ro/translation.json @@ -880,7 +880,11 @@ "convert_into_attachment_prompt": "Doriți convertirea notiței „{{title}}” într-un atașament al notiței părinte?", "print_pdf": "Exportare ca PDF...", "open_note_on_server": "Deschide notița pe server", - "view_revisions": "Revizii ale notițelor..." + "view_revisions": "Revizii ale notițelor...", + "export_as_image": "Exportează ca imagine", + "export_as_image_png": "PNG (bitmap)", + "export_as_image_svg": "SVG (vectorial)", + "note_map": "Harta notițelor" }, "note_erasure_timeout": { "deleted_notes_erased": "Notițele șterse au fost eliminate permanent.", @@ -1309,8 +1313,17 @@ }, "bundle-error": { "title": "Eroare la încărcarea unui script personalizat", - "message": "Scriptul din notița cu ID-ul „{{id}}”, întitulată „{{title}}” nu a putut fi executată din cauza:\n\n{{message}}" - } + "message": "Scriptul nu a putut fi executat din cauza:\n\n{{message}}" + }, + "widget-list-error": { + "title": "Nu s-a putut obține lista de widget-uri de la server" + }, + "widget-render-error": { + "title": "Nu s-a putut randa un widget React" + }, + "widget-missing-parent": "Widget-ul personalizat nu are definită proprietatea necesară „{{property}}“.\n\nDacă acest script este menit să ruleze fără interfață grafică, folosiți '#run=frontendStartup'.", + "open-script-note": "Deschide notița scriptului", + "scripting-error": "Eroare script personalizat: {{title}}" }, "tray": { "enable_tray": "Activează system tray-ul (este necesară repornirea aplicației pentru a avea efect)", @@ -1483,7 +1496,10 @@ "note_icon": { "change_note_icon": "Schimbă iconița notiței", "reset-default": "Resetează la iconița implicită", - "search": "Căutare:" + "search": "Căutare:", + "search_placeholder_one": "Caută printre {{number}} iconițe dintr-un pachet", + "search_placeholder_few": "Caută printre {{number}} iconițe din {{count}} pachete", + "search_placeholder_other": "Caută printre {{number}} iconițe din {{count}} de pachete" }, "show_highlights_list_widget_button": { "show_highlights_list": "Afișează lista de evidențieri" From 41a85a78dbdc61d2fbcb7fa0095027978b427d59 Mon Sep 17 00:00:00 2001 From: Toto Yullian Date: Sun, 25 Jan 2026 10:02:09 +0100 Subject: [PATCH 103/316] Translated using Weblate (Indonesian) Currently translated at 1.0% (19 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/id/ --- apps/client/src/translations/id/translation.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/id/translation.json b/apps/client/src/translations/id/translation.json index 9cb3e2e4de..2e21886371 100644 --- a/apps/client/src/translations/id/translation.json +++ b/apps/client/src/translations/id/translation.json @@ -21,7 +21,10 @@ }, "bundle-error": { "title": "Gagal memuat skrip kustom", - "message": "Skrip dari catatan dengan ID \"{{id}}\", berjudul \"{{title}}\" tidak dapat dijalankan karena:\n\n{{message}}" + "message": "Skrip tidak dapat dijalankan karena:\n\n{{message}}" + }, + "widget-list-error": { + "title": "Gagal mendapatkan daftar widget dari server" } }, "add_link": { From aaaf8c1e2b90882b671f4b49ca18cdc116ec4ef1 Mon Sep 17 00:00:00 2001 From: green Date: Sun, 25 Jan 2026 11:12:14 +0100 Subject: [PATCH 104/316] Translated using Weblate (Japanese) Currently translated at 100.0% (1763 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/ --- apps/client/src/translations/ja/translation.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/ja/translation.json b/apps/client/src/translations/ja/translation.json index cf6611c980..4f3e972dcf 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -1288,7 +1288,11 @@ "search_not_executed": "検索はまだ実行されていません。上の「検索」ボタンをクリックすると、検索結果が表示されます。" }, "sql_result": { - "no_rows": "このクエリでは行が返されませんでした" + "no_rows": "このクエリでは行が返されませんでした", + "not_executed": "クエリはまだ実行されていません。", + "failed": "SQLクエリの実行に失敗しました", + "statement_result": "ステートメント結果", + "execute_now": "今すぐ実行" }, "sql_table_schemas": { "tables": "テーブル" From e348a9b907e3da69c7e2ace38e15f9904f313641 Mon Sep 17 00:00:00 2001 From: noobhjy Date: Sun, 25 Jan 2026 13:39:07 +0100 Subject: [PATCH 105/316] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1763 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/ --- apps/client/src/translations/cn/translation.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index 47c3d491f7..9dd25e5984 100644 --- a/apps/client/src/translations/cn/translation.json +++ b/apps/client/src/translations/cn/translation.json @@ -1639,7 +1639,11 @@ "configure_launchbar": "配置启动栏" }, "sql_result": { - "no_rows": "此查询没有返回任何数据" + "no_rows": "此查询没有返回任何数据", + "not_executed": "查询尚未执行。", + "failed": "SQL 查询执行失败", + "execute_now": "立即执行", + "statement_result": "执行结果" }, "sql_table_schemas": { "tables": "表" From ba46ba77b4cf592ff844e40d89ee11c082cb82f6 Mon Sep 17 00:00:00 2001 From: Toto Yullian Date: Sun, 25 Jan 2026 12:26:57 +0100 Subject: [PATCH 106/316] Translated using Weblate (Indonesian) Currently translated at 1.1% (20 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/id/ --- apps/client/src/translations/id/translation.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/id/translation.json b/apps/client/src/translations/id/translation.json index 2e21886371..3b63a0c24f 100644 --- a/apps/client/src/translations/id/translation.json +++ b/apps/client/src/translations/id/translation.json @@ -25,7 +25,8 @@ }, "widget-list-error": { "title": "Gagal mendapatkan daftar widget dari server" - } + }, + "open-script-note": "Buka skrip catatan" }, "add_link": { "add_link": "Tambah tautan", From 46057fa03bf8c90ff505cab187c3b438a7e1eccf Mon Sep 17 00:00:00 2001 From: Vitalii Hlas <1998vitaliu@gmail.com> Date: Sun, 25 Jan 2026 17:30:16 +0100 Subject: [PATCH 107/316] Translated using Weblate (Ukrainian) Currently translated at 40.5% (47 of 116 strings) Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/uk/ --- docs/README-uk.md | 53 +++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/docs/README-uk.md b/docs/README-uk.md index e6b7667f42..73b35ff30b 100644 --- a/docs/README-uk.md +++ b/docs/README-uk.md @@ -112,38 +112,41 @@ Trilium Notes — це безкоштовний кросплатформний * Інтелект-карти, засновані на [Mind Elixir](https://docs.mind-elixir.com/) * [Геокарти](https://docs.triliumnotes.org/user-guide/collections/geomap) з географічними позначками та GPX-треками -* [Scripting](https://docs.triliumnotes.org/user-guide/scripts) - see [Advanced - showcases](https://docs.triliumnotes.org/user-guide/advanced-usage/advanced-showcases) -* [REST API](https://docs.triliumnotes.org/user-guide/advanced-usage/etapi) for - automation -* Scales well in both usability and performance upwards of 100 000 notes -* Touch optimized [mobile - frontend](https://docs.triliumnotes.org/user-guide/setup/mobile-frontend) for - smartphones and tablets -* Built-in [dark - theme](https://docs.triliumnotes.org/user-guide/concepts/themes), support for - user themes +* [Сценарії](https://docs.triliumnotes.org/user-guide/scripts) – див. [Розширені + демонстрації](https://docs.triliumnotes.org/user-guide/advanced-usage/advanced-showcases) +* [REST API](https://docs.triliumnotes.org/user-guide/advanced-usage/etapi) для + автоматизації +* Добре масштабується як за зручністю використання, так і за продуктивністю до + 100 000 нотаток +* Оптимізовано для сенсорного керування [мобільний + інтерфейс](https://docs.triliumnotes.org/user-guide/setup/mobile-frontend) для + смартфонів і планшетів +* Вбудована [темна + тема](https://docs.triliumnotes.org/user-guide/concepts/themes), підтримка тем + користувача * [Evernote](https://docs.triliumnotes.org/user-guide/concepts/import-export/evernote) and [Markdown import & export](https://docs.triliumnotes.org/user-guide/concepts/import-export/markdown) -* [Web Clipper](https://docs.triliumnotes.org/user-guide/setup/web-clipper) for - easy saving of web content -* Customizable UI (sidebar buttons, user-defined widgets, ...) -* [Metrics](https://docs.triliumnotes.org/user-guide/advanced-usage/metrics), - along with a Grafana Dashboard. +* [Web Clipper](https://docs.triliumnotes.org/user-guide/setup/web-clipper) для + легкого збереження веб-контенту +* Настроюваний інтерфейс користувача (кнопки бічної панелі, віджети, що + визначаються користувачем, ...) +* [Метрики](https://docs.triliumnotes.org/user-guide/advanced-usage/metrics), а + також панель інструментів Grafana. -✨ Check out the following third-party resources/communities for more TriliumNext -related goodies: +✨ Перегляньте наступні сторонні ресурси/спільноти, щоб дізнатися більше про +TriliumNext: -- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party - themes, scripts, plugins and more. -- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more. +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) для тем, + скриптів, плагінів тощо від сторонніх розробників. +- [TriliumRocks!](https://trilium.rocks/) для навчальних посібників, інструкцій + та багато іншого. -## ❓Why TriliumNext? +## ❓Чому TriliumNext? -The original Trilium developer ([Zadam](https://github.com/zadam)) has -graciously given the Trilium repository to the community project which resides -at https://github.com/TriliumNext +Оригінальний розробник Trilium ([Zadam](https://github.com/zadam)) люб'язно +надав репозиторій Trilium спільнотному проекту, який знаходиться за адресою +https://github.com/TriliumNext ### ⬆️Migrating from Zadam/Trilium? From 5ca0830b88dc44a65ea9b0a5e8990adc245d8f72 Mon Sep 17 00:00:00 2001 From: Vitalii Hlas <1998vitaliu@gmail.com> Date: Sun, 25 Jan 2026 17:29:58 +0100 Subject: [PATCH 108/316] Translated using Weblate (Ukrainian) Currently translated at 29.6% (45 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/uk/ --- apps/website/src/translations/uk/translation.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/uk/translation.json b/apps/website/src/translations/uk/translation.json index 0c9995069a..7f4f913cea 100644 --- a/apps/website/src/translations/uk/translation.json +++ b/apps/website/src/translations/uk/translation.json @@ -45,6 +45,16 @@ "code_description": "Великі зразки вихідного коду або скриптів використовують спеціальний редактор із підсвічуванням синтаксису для багатьох мов програмування та різними колірними темами.", "file_title": "Файлові нотатки", "file_description": "Вбудовуйте мультимедійні файли, такі як PDF-файли, зображення, відео, з попереднім переглядом у програмі.", - "canvas_title": "Полотно" + "canvas_title": "Полотно", + "title": "Кілька способів представлення вашої інформації", + "canvas_description": "Розташовуйте фігури, зображення та текст на нескінченному полотні, використовуючи ту саму технологію, що й excalidraw.com. Ідеально підходить для діаграм, ескізів та візуального планування.", + "mermaid_description": "Створюйте діаграми, такі як блок-схеми, діаграми класів та послідовностей, діаграми Ганта та багато іншого, використовуючи синтаксис Mermaid.", + "others_list": "та інші: <0>карта нотаток, <1>карта зв'язків, <2>збережені пошуки, <3>візуалізація нотаток та <4>веб-перегляди." + }, + "extensibility_benefits": { + "title": "Спільне використання та розширюваність", + "import_export_title": "Імпорт/експорт", + "import_export_description": "Легко взаємодійте з іншими програмами, використовуючи формати Markdown, ENEX, OML.", + "share_title": "Діліться нотатками в Інтернеті" } } From 836b5feaae43c6c78bf76fb4a87cf430350be7da Mon Sep 17 00:00:00 2001 From: Vitalii Hlas <1998vitaliu@gmail.com> Date: Sun, 25 Jan 2026 17:52:40 +0100 Subject: [PATCH 109/316] Translated using Weblate (Ukrainian) Currently translated at 91.3% (1611 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/uk/ --- .../src/translations/uk/translation.json | 79 ++++++++++++++++--- 1 file changed, 67 insertions(+), 12 deletions(-) diff --git a/apps/client/src/translations/uk/translation.json b/apps/client/src/translations/uk/translation.json index 8fa5dfd62a..36985a1943 100644 --- a/apps/client/src/translations/uk/translation.json +++ b/apps/client/src/translations/uk/translation.json @@ -14,7 +14,10 @@ "edit_branch_prefix": "Редагувати префікс гілки", "help_on_tree_prefix": "Довідка щодо префіксу дерева", "prefix": "Префікс: ", - "branch_prefix_saved": "Префікс гілки збережено." + "branch_prefix_saved": "Префікс гілки збережено.", + "edit_branch_prefix_multiple": "Редагувати префікс гілки для {{count}} гілок", + "branch_prefix_saved_multiple": "Префікс гілки збережено для {{count}} гілок.", + "affected_branches": "Уражені гілки ({{count}}):" }, "about": { "app_version": "Версія програми:", @@ -70,8 +73,17 @@ }, "bundle-error": { "title": "Не вдалося завантажити користувацький скрипт", - "message": "Скрипт з нотатки ID \"{{id}}\" з заголовком \"{{title}}\" не вдалося виконати через:\n\n{{message}}" - } + "message": "Скрипт не вдалося виконати через:\n\n{{message}}" + }, + "widget-list-error": { + "title": "Не вдалося отримати список віджетів з сервера" + }, + "widget-render-error": { + "title": "Не вдалося відобразити користувацький віджет" + }, + "widget-missing-parent": "Для власного віджета не визначено {{property}} обов'язкову властивість\n\nЯкщо цей скрипт призначений для запуску без елемента інтерфейсу користувача, використовуйте замість нього '#run=frontendStartup'.", + "open-script-note": "Відкрити нотатку сценарію", + "scripting-error": "Помилка користувацького скрипта: {{title}}" }, "bulk_actions": { "bulk_actions": "Масові дії", @@ -849,7 +861,10 @@ "note_icon": { "change_note_icon": "Змінити значок нотатки", "search": "Пошук:", - "reset-default": "Скинути значок до стандартного значення" + "reset-default": "Скинути значок до стандартного значення", + "search_placeholder_one": "Пошук {{number}} значка у {{count}} пакеті", + "search_placeholder_few": "Пошук {{number}} значків у {{count}} пакетах", + "search_placeholder_many": "Пошук {{number}} значків у {{count}} пакетах" }, "basic_properties": { "note_type": "Тип нотатки", @@ -884,7 +899,7 @@ "file_type": "Тип файлу", "file_size": "Розмір файлу", "download": "Завантажити", - "open": "Відкрити", + "open": "Відкрити зовні", "upload_new_revision": "Завантажити нову версію", "upload_success": "Завантажено нову версію файлу.", "upload_failed": "Не вдалося завантажити нову версію файлу.", @@ -1589,13 +1604,19 @@ "refresh-saved-search-results": "Оновити збережені результати пошуку", "create-child-note": "Створити дочірню нотатку", "unhoist": "Відкріпити", - "toggle-sidebar": "Перемикання бічної панелі" + "toggle-sidebar": "Перемикання бічної панелі", + "subtree-hidden-tooltip_one": "{{count}} дочірня нотатка, прихована від дерев", + "subtree-hidden-tooltip_few": "{{count}} дочірніх нотатки, прихованих від дерев", + "subtree-hidden-tooltip_many": "{{count}} дочірніх нотаток, прихованих від дерев" }, "title_bar_buttons": { "window-on-top": "Тримати вікно зверху" }, "note_detail": { - "could_not_find_typewidget": "Не вдалося знайти typeWidget для типу '{{type}}'" + "could_not_find_typewidget": "Не вдалося знайти typeWidget для типу '{{type}}'", + "print_report_collection_content_one": "{{count}} нотатку з колекції не вдалося роздрукувати, тому що вони не підтримуються або захищені.", + "print_report_collection_content_few": "{{count}} нотатки з колекції не вдалося роздрукувати, тому що вони не підтримуються або захищені.", + "print_report_collection_content_many": "{{count}} нотаток з колекції не вдалося роздрукувати, тому що вони не підтримуються або захищені." }, "note_title": { "placeholder": "введіть тут заголовок нотатки..." @@ -1743,7 +1764,7 @@ "unknown_widget": "Невідомий віджет для \"{{id}}\"." }, "note_language": { - "not_set": "Не встановлено", + "not_set": "Мову не встановлено", "configure-languages": "Налаштувати мови..." }, "content_language": { @@ -1810,7 +1831,7 @@ "book_properties_config": { "hide-weekends": "Приховати вихідні", "display-week-numbers": "Відображення номерів тижнів", - "map-style": "Стиль карти:", + "map-style": "Стиль карти", "max-nesting-depth": "Максимальна глибина вкладення:", "raster": "Растр", "vector_light": "Вектор (Світла)", @@ -1863,7 +1884,7 @@ "will_be_deleted_in": "Це вкладення буде автоматично видалено через {{time}}", "will_be_deleted_soon": "Це вкладення незабаром буде автоматично видалено", "deletion_reason": ", оскільки вкладення не має посилання у вмісті нотатки. Щоб запобігти видаленню, додайте посилання на вкладення назад у вміст або перетворіть вкладення на нотатку.", - "role_and_size": "Роль: {{role}}, Розмір: {{size}}", + "role_and_size": "Роль: {{role}}, розмір: {{size}}, формат даних: {{- mimeType}}", "link_copied": "Посилання на вкладення скопійовано в буфер обміну.", "unrecognized_role": "Нерозпізнана роль вкладення '{{role}}'." }, @@ -1914,7 +1935,7 @@ "import-into-note": "Імпортувати в нотатку", "apply-bulk-actions": "Застосувати масові дії", "converted-to-attachments": "({{count}}) нотаток перетворено на вкладення.", - "convert-to-attachment-confirm": "Ви впевнені, що хочете конвертувати вибрані нотатки у вкладення до їхніх батьківських нотаток?", + "convert-to-attachment-confirm": "Ви впевнені, що хочете конвертувати вибрані нотатки у вкладення до їхніх батьківських нотаток? Ця операція застосовується лише до нотаток із зображеннями, інші нотатки будуть пропущені.", "open-in-popup": "Швидке редагування", "archive": "Архівувати", "unarchive": "Розархівувати" @@ -1978,7 +1999,10 @@ }, "highlights_list_2": { "title": "Список основних моментів", - "options": "Параметри" + "options": "Параметри", + "title_with_count_one": "{{count}} виділення", + "title_with_count_few": "{{count}} виділення", + "title_with_count_many": "{{count}} виділень" }, "table_context_menu": { "delete_row": "Видалити рядок" @@ -2051,5 +2075,36 @@ }, "collections": { "rendering_error": "Не вдалося показати вміст через помилку." + }, + "status_bar": { + "backlinks_one": "{{count}} зворотне посилання", + "backlinks_few": "{{count}} зворотні посилання", + "backlinks_many": "{{count}} зворотних посилань", + "backlinks_title_one": "Переглянути зворотне посилання", + "backlinks_title_few": "Переглянути зворотні посилання", + "backlinks_title_many": "Переглянути зворотніх посилань", + "attachments_one": "{{count}} вкладення", + "attachments_few": "{{count}} вкладення", + "attachments_many": "{{count}} вкладень", + "attachments_title_one": "Переглянути вкладення в новій вкладці", + "attachments_title_few": "Переглянути вкладення в новій вкладці", + "attachments_title_many": "Переглянути вкладень в новій вкладці", + "attributes_one": "{{count}} атрибут", + "attributes_few": "{{count}} атрибути", + "attributes_many": "{{count}} атрибутів", + "note_paths_one": "{{count}} шлях", + "note_paths_few": "{{count}} шляхи", + "note_paths_many": "{{count}} шляхів" + }, + "pdf": { + "attachments_one": "{{count}} вкладення", + "attachments_few": "{{count}} вкладення", + "attachments_many": "{{count}} вкладень", + "layers_one": "{{count}} шар", + "layers_few": "{{count}} шари", + "layers_many": "{{count}} шарів", + "pages_one": "{{count}} сторінка", + "pages_few": "{{count}} сторінки", + "pages_many": "{{count}} сторінок" } } From 595d30feb76eb51c882c63cd09f170efbf0c4b24 Mon Sep 17 00:00:00 2001 From: Vitalii Hlas <1998vitaliu@gmail.com> Date: Sun, 25 Jan 2026 17:32:24 +0100 Subject: [PATCH 110/316] Translated using Weblate (Ukrainian) Currently translated at 97.9% (380 of 388 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/uk/ --- apps/server/src/assets/translations/uk/server.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/server/src/assets/translations/uk/server.json b/apps/server/src/assets/translations/uk/server.json index 3c34c72a4b..63dd0510f6 100644 --- a/apps/server/src/assets/translations/uk/server.json +++ b/apps/server/src/assets/translations/uk/server.json @@ -233,7 +233,7 @@ "setup_sync-from-desktop": { "heading": "Синхронізація з ПК", "description": "Це налаштування потрібно ініціювати з екземпляра ПК:", - "step1": "Відкрийте екземпляр Trilium Notes на ПК.", + "step1": "Відкрийте свій екземпляр Trilium Notes на ПК.", "step2": "У меню Trilium натисніть Параметри.", "step3": "Натисніть на Категорія Синхронізації.", "step4": "Змініть адресу екземпляра сервера на: {{- host}} та натисніть кнопку Зберегти.", @@ -249,7 +249,7 @@ "proxy-server": "Проксі-сервер (необов'язково)", "proxy-server-placeholder": "https://:", "note": "Нотатка:", - "proxy-instruction": "Якщо залишити налаштування проксі-сервера порожнім, використовуватиметься системний проксі-сервер (стосується лише ПК програми)", + "proxy-instruction": "Якщо залишити налаштування проксі-сервера порожнім, використовуватиметься системний проксі-сервер (стосується лише програми на ПК)", "password": "Пароль", "password-placeholder": "Пароль", "back": "Назад", @@ -415,7 +415,7 @@ "end-time": "Час завершення", "geolocation": "Геолокація", "built-in-templates": "Вбудовані шаблони", - "board": "Дошка", + "board": "Kanban Дошка", "status": "Статус", "board_note_first": "Перша нотатка", "board_note_second": "Друга нотатка", From 9eb24c6fc2360603bdcf29f637be786fd71f1e08 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 25 Jan 2026 17:40:11 +0100 Subject: [PATCH 111/316] Translated using Weblate (Romanian) Currently translated at 99.9% (1762 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/ro/ --- .../src/translations/ro/translation.json | 160 ++++++++++++++++-- 1 file changed, 142 insertions(+), 18 deletions(-) diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json index 67fb2a4f9c..4823db67d3 100644 --- a/apps/client/src/translations/ro/translation.json +++ b/apps/client/src/translations/ro/translation.json @@ -68,7 +68,7 @@ "attachment_detail_2": { "deletion_reason": ", deoarece nu există o legătură către atașament în conținutul notiței. Pentru a preveni ștergerea, trebuie adăugată înapoi o legătură către atașament în conținut sau atașamentul trebuie convertit în notiță.", "link_copied": "O legătură către atașament a fost copiată în clipboard.", - "role_and_size": "Rol: {{role}}, dimensiune: {{size}}", + "role_and_size": "Rol: {{role}}, dimensiune: {{size}}, MIME: {{- mimeType}}", "unrecognized_role": "Rol atașament necunoscut: „{{role}}”.", "will_be_deleted_in": "Acest atașament va fi șters automat în {{time}}", "will_be_deleted_soon": "Acest atașament va fi șters automat în curând" @@ -293,7 +293,8 @@ "expand_tooltip": "Expandează subnotițele directe ale acestei colecții (un singur nivel de adâncime). Pentru mai multe opțiuni, apăsați săgeata din dreapta.", "expand_first_level": "Expandează subnotițele directe", "expand_nth_level": "Expandează pe {{depth}} nivele", - "expand_all_levels": "Expandează pe toate nivelele" + "expand_all_levels": "Expandează pe toate nivelele", + "hide_child_notes": "Ascunde subnotițele din arbore" }, "bookmark_switch": { "bookmark": "Semn de carte", @@ -569,7 +570,7 @@ "file_size": "Dimensiunea fișierului", "file_type": "Tipul fișierului", "note_id": "ID-ul notiței", - "open": "Deschide", + "open": "Deschide în exterior", "original_file_name": "Denumirea originală a fișierului", "title": "Fișier", "upload_failed": "Încărcarea a unei noi revizii ale fișierului a eșuat.", @@ -795,7 +796,8 @@ }, "inherited_attribute_list": { "no_inherited_attributes": "Niciun atribut moștenit.", - "title": "Atribute moștenite" + "title": "Atribute moștenite", + "none": "niciunul" }, "jump_to_note": { "search_button": "Caută în întregul conținut", @@ -903,7 +905,9 @@ "note_size_info": "Dimensiunea notiței reprezintă o aproximare a cerințelor de stocare ale acestei notițe. Ia în considerare conținutul notiței dar și ale reviziilor sale.", "subtree_size": "(dimensiunea sub-arborelui: {{size}} în {{count}} notițe)", "title": "Informații despre notiță", - "type": "Tip" + "type": "Tip", + "mime": "Tip MIME", + "show_similar_notes": "Afișează notițe similare" }, "note_launcher": { "this_launcher_doesnt_define_target_note": "Acesată scurtătură nu definește o notiță-destinație." @@ -1161,7 +1165,8 @@ "search_parameters": "Parametrii de căutare", "search_script": "script de căutare", "search_string": "șir de căutat", - "unknown_search_option": "Opțiune de căutare necunoscută „{{searchOptionName}}”" + "unknown_search_option": "Opțiune de căutare necunoscută „{{searchOptionName}}”", + "view_options": "Opțiuni de afișare:" }, "search_engine": { "baidu": "Baidu", @@ -1430,7 +1435,10 @@ "convert-to-attachment-confirm": "Doriți convertirea notițelor selectate în atașamente ale notiței părinte? Această operațiune se aplică doar notițelor de tip imagine, celelalte vor fi ignorate.", "open-in-popup": "Editare rapidă", "archive": "Arhivează", - "unarchive": "Dezarhivează" + "unarchive": "Dezarhivează", + "open-in-a-new-window": "Deschide în fereastră nouă", + "hide-subtree": "Ascunde subnotițele", + "show-subtree": "Afișează subnotițele" }, "shared_info": { "help_link": "Pentru informații vizitați wiki-ul.", @@ -1491,7 +1499,13 @@ }, "highlights_list_2": { "options": "Setări", - "title": "Listă de evidențieri" + "title": "Listă de evidențieri", + "title_with_count_one": "{{count}} evidențiere", + "title_with_count_few": "{{count}} evidențieri", + "title_with_count_other": "{{count}} de evidențieri", + "modal_title": "Configurează lista de evidențieri", + "menu_configure": "Configurează lista de evidențieri...", + "no_highlights": "Nu există nicio evidențiere." }, "note_icon": { "change_note_icon": "Schimbă iconița notiței", @@ -1499,7 +1513,13 @@ "search": "Căutare:", "search_placeholder_one": "Caută printre {{number}} iconițe dintr-un pachet", "search_placeholder_few": "Caută printre {{number}} iconițe din {{count}} pachete", - "search_placeholder_other": "Caută printre {{number}} iconițe din {{count}} de pachete" + "search_placeholder_other": "Caută printre {{number}} iconițe din {{count}} de pachete", + "search_placeholder_filtered": "Căutați printre {{number}} iconițe în {{name}}", + "filter": "Filtrează", + "filter-none": "Toate iconițele", + "filter-default": "Iconițele implicite", + "icon_tooltip": "{{name}}\nPachet iconițe: {{iconPack}}", + "no_results": "Nu s-a găsit nicio iconiță." }, "show_highlights_list_widget_button": { "show_highlights_list": "Afișează lista de evidențieri" @@ -1537,7 +1557,17 @@ "refresh-saved-search-results": "Reîmprospătează căutarea salvată", "unhoist": "Defocalizează notița", "toggle-sidebar": "Comută bara laterală", - "dropping-not-allowed": "Aici nu este permisă plasarea notițelor." + "dropping-not-allowed": "Aici nu este permisă plasarea notițelor.", + "clone-indicator-tooltip": "Această notiță are {{- count}} părinți: {{- parents}}", + "clone-indicator-tooltip-single": "Această notiță este clonată (un singur părinte: {{- parent}})", + "shared-indicator-tooltip": "Această notiță este partajată public", + "shared-indicator-tooltip-with-url": "Această notiță este partajată public la: {{- url}}", + "subtree-hidden-tooltip_one": "{{count}} subnotiță ascunsă din arbore", + "subtree-hidden-tooltip_few": "{{count}} subnotițe ascunse din arbore", + "subtree-hidden-tooltip_other": "{{count}} de subnotițe ascunse din arbore", + "subtree-hidden-moved-title": "Adăugat în {{title}}", + "subtree-hidden-moved-description-collection": "Subnotițele din această colecție sunt ascunse din arbore.", + "subtree-hidden-moved-description-other": "Subnotițele din această notiță sunt ascunse." }, "title_bar_buttons": { "window-on-top": "Menține fereastra mereu vizibilă" @@ -1545,12 +1575,24 @@ "note_detail": { "could_not_find_typewidget": "Nu s-a putut găsi widget-ul corespunzător tipului „{{type}}”", "printing": "Imprimare în curs...", - "printing_pdf": "Exportare ca PDF în curs..." + "printing_pdf": "Exportare ca PDF în curs...", + "print_report_title": "Raport de imprimare", + "print_report_collection_content_one": "{{count}} notiță din colecție nu a putut fi imprimată deoarece nu este suportată sau este protejată.", + "print_report_collection_content_few": "{{count}} notițe din colecție nu au putut fi imprimate deoarece nu sunt suportate sau sunt protejate.", + "print_report_collection_content_other": "{{count}} de notițe din colecție nu au putut fi imprimate deoarece nu sunt suportate sau sunt protejate.", + "print_report_collection_details_button": "Afișează detalii", + "print_report_collection_details_ignored_notes": "Notițe ignorate" }, "note_title": { "placeholder": "introduceți titlul notiței aici...", "created_on": "Creată la ", - "last_modified": "Modificată la " + "last_modified": "Modificată la ", + "note_type_switcher_label": "Schimbă din {{type}} la:", + "note_type_switcher_others": "Mai multe tipuri de notițe", + "note_type_switcher_templates": "Șablon", + "note_type_switcher_collection": "Colecție", + "edited_notes": "Notițe editate în această zi", + "promoted_attributes": "Atribute promovate" }, "revisions_snapshot_limit": { "erase_excess_revision_snapshots": "Șterge acum reviziile excesive", @@ -1571,7 +1613,11 @@ "configure_launchbar": "Configurează bara de lansare" }, "sql_result": { - "no_rows": "Nu s-a găsit niciun rând pentru această interogare" + "no_rows": "Nu s-a găsit niciun rând pentru această interogare", + "not_executed": "Această interogare nu a fost executată încă.", + "failed": "Interogarea SQL a eșuat", + "statement_result": "Rezultatul comenzii SQL", + "execute_now": "Execută acum" }, "sql_table_schemas": { "tables": "Tabele" @@ -1593,7 +1639,8 @@ }, "toc": { "options": "Setări", - "table_of_contents": "Cuprins" + "table_of_contents": "Cuprins", + "no_headings": "Niciun titlu." }, "watched_file_update_status": { "file_last_modified": "Fișierul a fost ultima oară modificat la data de .", @@ -2028,7 +2075,7 @@ "book_properties_config": { "hide-weekends": "Ascunde weekend-urile", "display-week-numbers": "Afișează numărul săptămânii", - "map-style": "Stil hartă:", + "map-style": "Stil hartă", "max-nesting-depth": "Nivel maxim de imbricare:", "raster": "Raster", "vector_light": "Vectorial (culoare deschisă)", @@ -2085,7 +2132,10 @@ "next_theme_title": "Încercați noua temă Trilium", "next_theme_message": "Utilizați tema clasică, doriți să încercați noua temă?", "next_theme_button": "Testează noua temă", - "dismiss": "Treci peste" + "dismiss": "Treci peste", + "new_layout_title": "Aspect nou", + "new_layout_message": "Am introdus un aspect modernizat pentru Trilium. Panglică a fost integrată în restul interfeței, cu o bară de stare nouă și secțiuni expandabile (precum atributele promovate) ce preiau funcționalitatea de bază.\n\nNoul aspect este activat în mod implicit, și se poate dezactiva momentan din Opțiuni → Aspect.", + "new_layout_button": "Mai multe informații" }, "ui-performance": { "title": "Setări de performanță", @@ -2100,7 +2150,10 @@ }, "settings_appearance": { "related_code_blocks": "Tema de culori pentru blocuri de cod în notițe de tip text", - "related_code_notes": "Tema de culori pentru notițele de tip cod" + "related_code_notes": "Tema de culori pentru notițele de tip cod", + "ui": "Interfață grafică", + "ui_old_layout": "Aspect vechi", + "ui_new_layout": "Aspect nou" }, "units": { "percentage": "%" @@ -2156,6 +2209,77 @@ "read_only_temporarily_disabled": "Editabilă temporar", "read_only_temporarily_disabled_description": "Această notiță se poate modifica, deși în mod normal ea este doar în citire. Notița va reveni la modul doar în citire imediat ce navigați către altă notiță.\n\nClick pentru a re-activa modul doar în citire.", "shared_publicly": "Partajată public", - "shared_locally": "Partajată local" + "shared_locally": "Partajată local", + "shared_copy_to_clipboard": "Copiază legătură în clipboard", + "shared_open_in_browser": "Deschide legătura în browser", + "shared_unshare": "Înlătură partajarea", + "clipped_note": "Decupare web", + "clipped_note_description": "Această notiță a fost preluată de la {{url}}.\n\nClic pentru a naviga la pagina web sursă.", + "execute_script": "Rulează script", + "execute_script_description": "Această notiță este un script. Clic pentru a executa scriptul.", + "execute_sql": "Rulează SQL", + "execute_sql_description": "Această notiță este de tip SQL. Clic pentru a executa interogarea SQL.", + "save_status_saved": "Salvat", + "save_status_saving": "Se salvează...", + "save_status_unsaved": "Nesalvat", + "save_status_error": "Salvarea a eșuat", + "save_status_saving_tooltip": "Modificările sunt în curs de salvare.", + "save_status_unsaved_tooltip": "Există schimbări ce nu au fost încă salvate. Acestea vor fi salvate automat într-un moment.", + "save_status_error_tooltip": "A intervenit o eroare la salvarea notiței. Dacă este posibil, încercați să copiați conținutul notiței într-un alt loc și să reîmprospătați aplicația." + }, + "breadcrumb": { + "hoisted_badge": "Focalizat", + "hoisted_badge_title": "Defocalizează", + "workspace_badge": "Spațiu de lucru", + "scroll_to_top_title": "Sari la începutul notiței", + "create_new_note": "Crează subnotiță", + "empty_hide_archived_notes": "Ascunde notițele arhivate" + }, + "status_bar": { + "language_title": "Schimbă limba conținutului", + "note_info_title": "Afișează informații despre notiță precum data modificării și dimensiunea", + "backlinks_one": "{{count}} legătură de retur", + "backlinks_few": "{{count}} legături de retur", + "backlinks_other": "{{count}} de legături de retur", + "backlinks_title_one": "Afișează legătura de retur", + "backlinks_title_few": "Afișează legăturile de retur", + "backlinks_title_other": "Afișează legăturile de retur", + "attachments_one": "{{count}} atașament", + "attachments_few": "{{count}} atașamente", + "attachments_other": "{{count}} de atașamente", + "attachments_title_one": "Deschide atașamentul într-un tab nou", + "attachments_title_few": "Deschide atașamentele într-un tab nou", + "attachments_title_other": "Deschide atașamentele într-un tab nou", + "attributes_one": "{{count}} atribut", + "attributes_few": "{{count}} atribute", + "attributes_other": "{{count}} de atribute", + "attributes_title": "Atribute proprii și moștenite", + "note_paths_one": "O cale", + "note_paths_few": "{{count}} căi", + "note_paths_other": "{{count}} de căi", + "note_paths_title": "Căi ale notiței", + "code_note_switcher": "Schimbă limbajul" + }, + "attributes_panel": { + "title": "Atributele notiței" + }, + "right_pane": { + "empty_message": "Nimic de afișat pentru această notiță", + "empty_button": "Ascunde panoul", + "toggle": "Comută panoul din dreapta", + "custom_widget_go_to_source": "Mergi la codul sursă" + }, + "pdf": { + "attachments_one": "{{count}} atașament", + "attachments_few": "{{count}} atașamente", + "attachments_other": "{{count}} de atașamente", + "layers_one": "{{count}} strat", + "layers_few": "{{count}} straturi", + "layers_other": "{{count}} de straturi", + "pages_one": "{{count}} pagină", + "pages_few": "{{count}} pagini", + "pages_other": "{{count}} de pagini", + "pages_alt": "Pagina {{pageNumber}}", + "pages_loading": "Încărcare..." } } From 7439b9ca65cf41e6eaf8a718d0e50f6dd1aac626 Mon Sep 17 00:00:00 2001 From: Vitalii Hlas <1998vitaliu@gmail.com> Date: Sun, 25 Jan 2026 19:23:12 +0100 Subject: [PATCH 112/316] Translated using Weblate (Ukrainian) Currently translated at 50.0% (58 of 116 strings) Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/uk/ --- docs/README-uk.md | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/docs/README-uk.md b/docs/README-uk.md index 73b35ff30b..834b2e94fc 100644 --- a/docs/README-uk.md +++ b/docs/README-uk.md @@ -164,41 +164,42 @@ prevents direct migration. ## 💬 Discuss with us -Feel free to join our official conversations. We would love to hear what -features, suggestions, or issues you may have! +Не соромтеся приєднуватися до наших офіційних обговорень. Ми будемо раді почути +про ваші функції, пропозиції чи проблеми! -- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous - discussions.) - - The `General` Matrix room is also bridged to +- [Матриця](https://matrix.to/#/#triliumnext:matrix.org) (Для синхронних + обговорень.) + - Кімната матриці `Загальні` також підключена до [XMPP](xmpp:discuss@trilium.thisgreat.party?join) -- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For - asynchronous discussions.) -- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug - reports and feature requests.) +- [Обговорення на Github](https://github.com/TriliumNext/Trilium/discussions) + (Для асинхронних обговорень.) +- [Проблеми Github](https://github.com/TriliumNext/Trilium/issues) (Для звітів + про помилки та запитів на нові функції.) -## 🏗 Installation +## 🏗 Встановлення ### Windows / MacOS -Download the binary release for your platform from the [latest release -page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package -and run the `trilium` executable. +Завантажте бінарний реліз для вашої платформи зі сторінки [останнього +релізу](https://github.com/TriliumNext/Trilium/releases/latest), розпакуйте +пакет і запустіть виконуваний файл `trilium`. ### Linux -If your distribution is listed in the table below, use your distribution's -package. +Якщо ваш дистрибутив зазначено в таблиці нижче, використовуйте пакет вашого +дистрибутива. [![Packaging status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) -You may also download the binary release for your platform from the [latest -release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the -package and run the `trilium` executable. +Ви також можете завантажити бінарний реліз для вашої платформи зі сторінки +[останнього релізу](https://github.com/TriliumNext/Trilium/releases/latest), +розпакувати пакет і запустити виконуваний файл `trilium`. -TriliumNext is also provided as a Flatpak, but not yet published on FlatHub. +TriliumNext також доступний у форматі Flatpak, але ще не опублікований на +FlatHub. -### Browser (any OS) +### Браузер (будь-яка ОС) If you use a server installation (see below), you can directly access the web interface (which is almost identical to the desktop app). From 96acd7f9213b72d9815a9ec9683ace5d9db3144c Mon Sep 17 00:00:00 2001 From: Vitalii Hlas <1998vitaliu@gmail.com> Date: Sun, 25 Jan 2026 19:24:30 +0100 Subject: [PATCH 113/316] Translated using Weblate (Ukrainian) Currently translated at 38.8% (59 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/uk/ --- .../src/translations/uk/translation.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/website/src/translations/uk/translation.json b/apps/website/src/translations/uk/translation.json index 7f4f913cea..d5f99d866f 100644 --- a/apps/website/src/translations/uk/translation.json +++ b/apps/website/src/translations/uk/translation.json @@ -56,5 +56,23 @@ "import_export_title": "Імпорт/експорт", "import_export_description": "Легко взаємодійте з іншими програмами, використовуючи формати Markdown, ENEX, OML.", "share_title": "Діліться нотатками в Інтернеті" + }, + "collections": { + "title": "Колекції", + "calendar_title": "Календар", + "calendar_description": "Організовуйте свої особисті або професійні події за допомогою календаря з підтримкою цілоденних та багатоденних подій. Переглядайте свої події з першого погляду завдяки тижневому, місячному та річному переглядам. Легке додавання або перетягування подій.", + "table_title": "Таблиця", + "table_description": "Відображайте та редагуйте інформацію про нотатки в табличній структурі з різними типами стовпців, такими як текст, число, прапорці, дата й час, посилання та кольори, а також підтримка зв'язків. За потреби відображайте нотатки в деревоподібній ієрархії всередині таблиці.", + "board_title": "Дошка Kanban", + "board_description": "Організуйте свої завдання або статуси проектів на дошці Kanbanза допомогою простого способу створення нових елементів і стовпців, а також простої зміни їх статусу шляхом перетягування по дошці.", + "geomap_title": "Геокарта", + "geomap_description": "Плануйте свою відпустку або позначайте цікаві місця безпосередньо на географічній карті за допомогою налаштовуваних маркерів. Відображайте записані GPX-треки для відстеження маршрутів.", + "presentation_title": "Презентація", + "presentation_description": "Упорядкуйте інформацію у слайди та презентуйте їх у повноекранному режимі з плавними переходами. Слайди також можна експортувати у PDF для зручного обміну." + }, + "faq": { + "title": "Часті запитання", + "mobile_question": "Чи є мобільний додаток?", + "mobile_answer": "Наразі офіційного мобільного застосунку немає. Однак, якщо у вас є серверний екземпляр, ви можете отримати до нього доступ за допомогою веббраузера та навіть встановити його як PWA. Для Android існує неофіційний застосунок під назвою TriliumDroid, який працює навіть офлайн (так само, як і клієнт для настільних комп’ютерів)." } } From 34d3c318d6085b24f2e4353c21e00cb20c1182e5 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 25 Jan 2026 19:27:22 +0100 Subject: [PATCH 114/316] Update translation files Updated by "Cleanup translation files" add-on in Weblate. Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ --- docs/README-uk.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/README-uk.md b/docs/README-uk.md index 834b2e94fc..7f1c5d6e56 100644 --- a/docs/README-uk.md +++ b/docs/README-uk.md @@ -201,8 +201,9 @@ FlatHub. ### Браузер (будь-яка ОС) -If you use a server installation (see below), you can directly access the web -interface (which is almost identical to the desktop app). +Якщо ви використовуєте серверну інсталяцію (див. нижче), ви можете отримати +безпосередній доступ до веб-інтерфейсу (який майже ідентичний десктопному +додатку). Currently only the latest versions of Chrome & Firefox are supported (and tested). From b26d9c0303c3cff1c2bd729186a499c80cd1bb74 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 25 Jan 2026 19:33:42 +0100 Subject: [PATCH 115/316] Update translation files Updated by "Cleanup translation files" add-on in Weblate. Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ --- docs/README-uk.md | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/docs/README-uk.md b/docs/README-uk.md index 7f1c5d6e56..7784c3c031 100644 --- a/docs/README-uk.md +++ b/docs/README-uk.md @@ -205,29 +205,31 @@ FlatHub. безпосередній доступ до веб-інтерфейсу (який майже ідентичний десктопному додатку). -Currently only the latest versions of Chrome & Firefox are supported (and -tested). +Наразі підтримуються (і протестовані) лише найновіші версії Chrome та Firefox. -### Mobile +### Мобільний -To use TriliumNext on a mobile device, you can use a mobile web browser to -access the mobile interface of a server installation (see below). +Щоб використовувати TriliumNext на мобільному пристрої, ви можете скористатися +мобільним веб-браузером для доступу до мобільного інтерфейсу серверної +інсталяції (див. нижче). -See issue https://github.com/TriliumNext/Trilium/issues/4962 for more -information on mobile app support. +Див. випуск https://github.com/TriliumNext/Trilium/issues/4962 для отримання +додаткової інформації про підтримку мобільних додатків. -If you prefer a native Android app, you can use +Якщо ви надаєте перевагу рідному додатку для Android, ви можете скористатися [TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). -Report bugs and missing features at [their -repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to -disable automatic updates on your server installation (see below) when using -TriliumDroid since the sync version must match between Trilium and TriliumDroid. +Повідомляйте про помилки та відсутні функції на [їхньому +репозиторії](https://github.com/FliegendeWurst/TriliumDroid). Примітка: Найкраще +вимкнути автоматичні оновлення на вашому сервері (див. нижче) під час +використання TriliumDroid, оскільки версія синхронізації має збігатися між +Trilium та TriliumDroid. -### Server +### Сервер -To install TriliumNext on your own server (including via Docker from -[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server -installation docs](https://docs.triliumnotes.org/user-guide/setup/server). +Щоб встановити TriliumNext на власний сервер (зокрема через Docker з +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)), дотримуйтесь +інструкцій [документації щодо встановлення +сервера](https://docs.triliumnotes.org/user-guide/setup/server). ## 💻 Contribute From 4b70bb677828b810c9978499fcde6c9e2bd91907 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 25 Jan 2026 20:45:06 +0200 Subject: [PATCH 116/316] chore(web-clipper): bump version to v1.1.0 --- apps/web-clipper/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web-clipper/package.json b/apps/web-clipper/package.json index e975e1ac42..2853dcb900 100644 --- a/apps/web-clipper/package.json +++ b/apps/web-clipper/package.json @@ -1,6 +1,6 @@ { "name": "@triliumnext/web-clipper", - "version": "1.0.1", + "version": "1.1.0", "description": "", "main": "index.js", "scripts": { From 18d1b8cbfe0f9fae4d6997d1bf55f3a71f7d526f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 25 Jan 2026 21:19:43 +0200 Subject: [PATCH 117/316] chore(web-clipper): add README for Firefox submission --- apps/web-clipper/README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 apps/web-clipper/README.md diff --git a/apps/web-clipper/README.md b/apps/web-clipper/README.md new file mode 100644 index 0000000000..e1258a8cd8 --- /dev/null +++ b/apps/web-clipper/README.md @@ -0,0 +1,31 @@ +# Trilium Web Clipper + +## Context + +The Web Clipper is an extension for the Trilium Notes application, an open-source note-taking application that can be used either in standalone mode via the desktop application or connected to a server. + +The source is extracted from the official monorepo, where it can be found under `apps/web-clipper`. The only change made to the provided source code is to have `tsconfig.base.json` in the same directory as the Web Clipper. The submitted source code is a snapshot of the following commit: [https://github.com/TriliumNext/Trilium/commit/1cf93ff0dec89ee1a80654934cb30fad74920043](https://github.com/TriliumNext/Trilium/commit/1cf93ff0dec89ee1a80654934cb30fad74920043)  + +There are some warnings regarding the use of `innerHTML` but they come from a third-party library (Readability). We plan to update to a newer version of that library soon, but we would like to publish the extension first (if possible). + +## Building from source + +To build from the provided sources: + +1. `pnpm i` to install the dependencies. +2. `pnpm build:firefox` to trigger the Firefox build. +3. The output will be available in `.output/firefox-mv2`. + +> [!NOTE] +> To generate the ZIP instead that can be imported into Firefox, run `pnpm zip;firefox` which will generate `.output\triliumnextweb-clipper-1.0.1-sources.zip`. + +## Testing + +To test it, a functional Trilium Notes desktop application is required: + +1. Download the latest version of Trilium Notes from [https://triliumnotes.org/](https://triliumnotes.org/) (top-right bottom automatically detects the platform). +2. During the first setup, create a new database. +3. Allow the Firewall port if asked. +4. Install the Web Clipper extension into the browser. +5. The extension should be able to see the Trilium instance and become active. +6. Web pages can now be clipped and they will appear in the local Trilium instance. \ No newline at end of file From 411c06246337a4682f92f780153c56509f302f6e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 25 Jan 2026 21:20:07 +0200 Subject: [PATCH 118/316] chore(web-clipper): rewire TS config for sources ZIP --- apps/web-clipper/wxt.config.ts | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/apps/web-clipper/wxt.config.ts b/apps/web-clipper/wxt.config.ts index 71f7df37a8..145af8ec5a 100644 --- a/apps/web-clipper/wxt.config.ts +++ b/apps/web-clipper/wxt.config.ts @@ -1,5 +1,8 @@ +import { copyFile, readFile, rm, writeFile } from "fs/promises"; import { defineConfig } from "wxt"; +let originalTsConfig: object; + export default defineConfig({ modules: ['@wxt-dev/auto-icons'], manifest: ({ manifestVersion }) => ({ @@ -49,5 +52,31 @@ export default defineConfig({ } } } - }) + }), + zip: { + includeSources: [ + "../../tsconfig.base.json" + ] + }, + hooks: { + 'zip:sources:start': async () => { + // Rewrite tsconfig.base.json into the web-clipper app folder + await copyFile("../../tsconfig.base.json", "./tsconfig.base.json"); + + originalTsConfig = JSON.parse(await readFile("./tsconfig.json", "utf-8")); + const adjustedTsConfig = { + ...originalTsConfig, + extends: ["./tsconfig.base.json", "./.wxt/tsconfig.json"] + }; + + await writeFile("./tsconfig.json", JSON.stringify(adjustedTsConfig, null, 4), 'utf-8'); + }, + "zip:sources:done": async () => { + // Restore original tsconfig.json + await writeFile("./tsconfig.json", JSON.stringify(originalTsConfig, null, 4), 'utf-8'); + + // Remove the copied tsconfig.base.json + await rm("./tsconfig.base.json"); + } + } }); From 1a92eeac69f24712b17c66233a6689ba201fef78 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 25 Jan 2026 19:44:48 +0100 Subject: [PATCH 119/316] Update translation files Updated by "Cleanup translation files" add-on in Weblate. Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ --- docs/README-uk.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/README-uk.md b/docs/README-uk.md index 7784c3c031..b9bfe4aa1e 100644 --- a/docs/README-uk.md +++ b/docs/README-uk.md @@ -232,22 +232,22 @@ Trilium та TriliumDroid. сервера](https://docs.triliumnotes.org/user-guide/setup/server). -## 💻 Contribute +## 💻 Зробіть свій внесок -### Translations +### Переклади -If you are a native speaker, help us translate Trilium by heading over to our -[Weblate page](https://hosted.weblate.org/engage/trilium/). +Якщо ви носій мови, допоможіть нам перекласти Trilium, перейшовши на нашу +[сторінку Weblate](https://hosted.weblate.org/engage/trilium/). -Here's the language coverage we have so far: +Ось мовне висвітлення, яке ми маємо наразі: -[![Translation -status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) +[![Стан +перекладу](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) -### Code +### Код -Download the repository, install dependencies using `pnpm` and then run the -server (available at http://localhost:8080): +Завантажте репозиторій, встановіть залежності за допомогою `pnpm`, а потім +запустіть сервер (доступний за адресою http://localhost:8080): ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium @@ -255,10 +255,10 @@ pnpm install pnpm run server:start ``` -### Documentation +### Документація -Download the repository, install dependencies using `pnpm` and then run the -environment required to edit the documentation: +Завантажте репозиторій, встановіть залежності за допомогою `pnpm`, а потім +запустіть середовище, необхідне для редагування документації: ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium @@ -266,9 +266,9 @@ pnpm install pnpm edit-docs:edit-docs ``` -### Building the Executable -Download the repository, install dependencies using `pnpm` and then build the -desktop app for Windows: +### Створення виконуваного файлу +Завантажте репозиторій, встановіть залежності за допомогою `pnpm`, а потім +зберіть настільний додаток для Windows: ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium From 28368a3e0d6f63e42a5c4071dd0451fb75a4854a Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 25 Jan 2026 20:23:25 +0100 Subject: [PATCH 120/316] Update translation files Updated by "Cleanup translation files" add-on in Weblate. Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ --- docs/README-uk.md | 99 ++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/docs/README-uk.md b/docs/README-uk.md index b9bfe4aa1e..96763a1427 100644 --- a/docs/README-uk.md +++ b/docs/README-uk.md @@ -276,71 +276,72 @@ pnpm install pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 ``` -For more details, see the [development -docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). +Для отримання додаткової інформації див. [документацію +розробника](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). -### Developer Documentation +### Документація розробника Please view the [documentation guide](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) for details. If you have more questions, feel free to reach out via the links described in the "Discuss with us" section above. -## 👏 Shoutouts +## 👏 Привітання -* [zadam](https://github.com/zadam) for the original concept and implementation - of the application. -* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the - application icon. -* [nriver](https://github.com/nriver) for his work on internationalization. -* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. -* [antoniotejada](https://github.com/nriver) for the original syntax highlight - widget. -* [Dosu](https://dosu.dev/) for providing us with the automated responses to - GitHub issues and discussions. -* [Tabler Icons](https://tabler.io/icons) for the system tray icons. +* [zadam](https://github.com/zadam) за оригінальну концепцію та реалізацію + застосунку. +* [Sarah Hussein](https://github.com/Sarah-Hussein) за розробку піктограми + програми. +* [nriver](https://github.com/nriver) за його роботу з інтернаціоналізації. +* [Thomas Frei](https://github.com/thfrei) за його оригінальну роботу на Canvas. +* [antoniotejada](https://github.com/nriver) для оригінального віджета + підсвічування синтаксису. +* [Dosu](https://dosu.dev/) за надання нам автоматичних відповідей на проблеми + та обговорення GitHub. +* [Tabler Icons](https://tabler.io/icons) для значків у системному треї. -Trilium would not be possible without the technologies behind it: +Trilium був би неможливим без технологій, що лежать в його основі: -* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind - text notes. We are grateful for being offered a set of the premium features. -* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with - support for huge amount of languages. -* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite - whiteboard used in Canvas notes. -* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the - mind map functionality. -* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical - maps. -* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive - table used in collections. -* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library - without real competition. -* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. - Used in [relation - maps](https://docs.triliumnotes.org/user-guide/note-types/relation-map) and - [link - maps](https://docs.triliumnotes.org/user-guide/advanced-usage/note-map#link-map) +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) – візуальний редактор + текстових нотаток. Ми вдячні за те, що нам запропонували набір + преміум-функцій. +* [CodeMirror](https://github.com/codemirror/CodeMirror) – редактор коду з + підтримкою величезної кількості мов програмування. +* [Excalidraw](https://github.com/excalidraw/excalidraw) – нескінченна дошка, що + використовується в нотатках Canvas. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) – забезпечує + функціональність карти розуму. +* [Leaflet](https://github.com/Leaflet/Leaflet) – для візуалізації географічних + карт. +* [Tabulator](https://github.com/olifolkerd/tabulator) – для інтерактивної + таблиці, що використовується в колекціях. +* [FancyTree](https://github.com/mar10/fancytree) – багатофункціональна + бібліотека дерев без реальної конкуренції. +* [jsPlumb](https://github.com/jsplumb/jsplumb) – бібліотека візуальної + зв’язності. Використовується в [картах + зв’язків](https://docs.triliumnotes.org/user-guide/note-types/relation-map) та + [картах + посилань](https://docs.triliumnotes.org/user-guide/advanced-usage/note-map#link-map) -## 🤝 Support +## 🤝 Підтримка -Trilium is built and maintained with [hundreds of hours of -work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your -support keeps it open-source, improves features, and covers costs such as -hosting. +Trilium створено та підтримується [сотнями годин +роботи](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Ваша +підтримка забезпечує його відкритий вихідний код, покращує функції та покриває +витрати, такі як хостинг. -Consider supporting the main developer -([eliandoran](https://github.com/eliandoran)) of the application via: +Розгляньте можливість підтримки головного розробника +([eliandoran](https://github.com/eliandoran)) програми через: -- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [Спонсори GitHub](https://github.com/sponsors/eliandoran) - [PayPal](https://paypal.me/eliandoran) - [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) -## 🔑 License +## 🔑 Ліцензія -Copyright 2017-2025 zadam, Elian Doran, and other contributors +Авторське право 2017-2025 належить zadam, Elian Doran та іншим авторам -This program is free software: you can redistribute it and/or modify it under -the terms of the GNU Affero General Public License as published by the Free -Software Foundation, either version 3 of the License, or (at your option) any -later version. +Ця програма є вільним програмним забезпеченням: ви можете розповсюджувати її +та/або змінювати відповідно до умов Загальної публічної ліцензії GNU Affero, +опублікованої Фондом вільного програмного забезпечення, або версії 3 Ліцензії, +або (на ваш вибір) будь-якої пізнішої версії. From 44bf83731043e5271711ff845394fbeead650b7e Mon Sep 17 00:00:00 2001 From: Vitalii Hlas <1998vitaliu@gmail.com> Date: Sun, 25 Jan 2026 20:00:03 +0100 Subject: [PATCH 121/316] Translated using Weblate (Ukrainian) Currently translated at 76.3% (116 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/uk/ --- .../src/translations/uk/translation.json | 81 ++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/uk/translation.json b/apps/website/src/translations/uk/translation.json index d5f99d866f..94442b2930 100644 --- a/apps/website/src/translations/uk/translation.json +++ b/apps/website/src/translations/uk/translation.json @@ -73,6 +73,85 @@ "faq": { "title": "Часті запитання", "mobile_question": "Чи є мобільний додаток?", - "mobile_answer": "Наразі офіційного мобільного застосунку немає. Однак, якщо у вас є серверний екземпляр, ви можете отримати до нього доступ за допомогою веббраузера та навіть встановити його як PWA. Для Android існує неофіційний застосунок під назвою TriliumDroid, який працює навіть офлайн (так само, як і клієнт для настільних комп’ютерів)." + "mobile_answer": "Наразі офіційного мобільного застосунку немає. Однак, якщо у вас є серверний екземпляр, ви можете отримати до нього доступ за допомогою веббраузера та навіть встановити його як PWA. Для Android існує неофіційний застосунок під назвою TriliumDroid, який працює навіть офлайн (так само, як і клієнт для настільних комп’ютерів).", + "database_question": "Де зберігаються дані?", + "database_answer": "Усі ваші нотатки зберігатимуться в базі даних SQLite в папці програми. Причина, чому Trilium використовує базу даних замість звичайних текстових файлів, пов'язана як з продуктивністю, так і з тим, що деякі функції було б набагато складніше реалізувати, такі як клони (одна й та сама нотатка в кількох місцях дерева). Щоб знайти папку програми, просто перейдіть до вікна «Про систему».", + "server_question": "Чи потрібен мені сервер для використання Trilium?", + "server_answer": "Ні, сервер дозволяє доступ через веббраузер і керує синхронізацією, якщо у вас кілька пристроїв. Щоб розпочати, достатньо завантажити десктопний застосунок і почати ним користуватися.", + "scaling_question": "Наскільки добре масштабується застосунок з великою кількістю нотаток?", + "scaling_answer": "Залежно від використання, програма має бути здатною без проблем обробляти щонайменше 100 000 нотаток. Зверніть увагу, що процес синхронізації іноді може завершитися невдачею, якщо завантажувати багато великих файлів (1 ГБ на файл), оскільки Trilium призначений радше як програма бази знань, ніж як сховище файлів (наприклад, NextCloud).", + "network_share_question": "Чи можна надати спільний доступ до бази даних через мережевий диск?", + "network_share_answer": "Ні, зазвичай не рекомендується використовувати спільний доступ до бази даних SQLite через мережевий диск. Хоча іноді це може спрацювати, існує ймовірність пошкодження бази даних через недосконале блокування файлів у мережі.", + "security_question": "Як захищені мої дані?", + "security_answer": "За замовчуванням нотатки не шифруються та їх можна зчитувати безпосередньо з бази даних. Після того, як нотатку позначено як зашифровану, вона шифрується за допомогою AES-128-CBC." + }, + "final_cta": { + "title": "Готові розпочати роботу з Trilium Notes?", + "description": "Створіть свою особисту базу знань за допомогою потужних функцій та повної конфіденційності.", + "get_started": "Почати" + }, + "components": { + "link_learn_more": "Дізнатися більше..." + }, + "download_now": { + "text": "Завантажити зараз ", + "platform_big": "v{{version}} для {{platform}}", + "platform_small": "для {{platform}}", + "linux_big": "v{{version}} для Linux", + "linux_small": "для Linux", + "more_platforms": "Більше платформ та налаштування серверів" + }, + "header": { + "get-started": "Почати", + "documentation": "Документація", + "support-us": "Підтримайте нас" + }, + "footer": { + "copyright_and_the": " і ", + "copyright_community": "спільнота" + }, + "social_buttons": { + "github": "GitHub", + "github_discussions": "Обговорення на GitHub", + "matrix": "Матриця", + "reddit": "Reddit" + }, + "support_us": { + "title": "Підтримайте нас", + "financial_donations_title": "Фінансова підтримка", + "financial_donations_description": "Trilium створено та підтримується завдяки сотням годин роботи. Ваша підтримка забезпечує його відкритий вихідний код, покращує функції та покриває витрати, такі як хостинг.", + "financial_donations_cta": "Розгляньте можливість підтримки головного розробника (eliandoran) програми через:", + "github_sponsors": "GitHub Спонсори", + "paypal": "PayPal", + "buy_me_a_coffee": "Купи мені кави" + }, + "contribute": { + "title": "Інші способи зробити внесок", + "way_translate": "Перекладіть програму вашою рідною мовою за допомогою Weblate.", + "way_community": "Взаємодійте зі спільнотою на GitHub Обговорення або на Matrix.", + "way_reports": "Повідомляйте про помилки через Проблеми GitHub.", + "way_document": "Покращуйте документацію, повідомляючи нас про прогалини в ній або надаючи посібники, відповіді на поширені запитання чи навчальні посібники.", + "way_market": "Поширте інформацію: поділіться нотатками Trilium з друзями або в блогах і соціальних мережах." + }, + "404": { + "title": "404: Не знайдено", + "description": "Сторінку, яку ви шукали, не знайдено. Можливо, її видалили або URL-адреса неправильна." + }, + "download_helper_desktop_windows": { + "title_x64": "Windows 64-bit", + "title_arm64": "Windows на ARM", + "description_x64": "Сумісний з пристроями Intel або AMD під управлінням Windows 10 та 11.", + "description_arm64": "Сумісний з пристроями ARM (наприклад, з Qualcomm Snapdragon).", + "quick_start": "Щоб встановити через Winget:", + "download_exe": "Завантажити інсталятор (.exe)", + "download_zip": "Портативний (.zip)" + }, + "download_helper_desktop_linux": { + "title_x64": "Linux 64-bit", + "title_arm64": "Linux на ARM", + "description_x64": "Для більшості дистрибутивів Linux, сумісних з архітектурою x86_64.", + "description_arm64": "Для дистрибутивів Linux на базі ARM, сумісних з архітектурою aarch64.", + "quick_start": "Виберіть відповідний формат пакета, залежно від вашого дистрибутива:", + "download_deb": ".deb" } } From 7159ea592785050c13748f9b9c566bcaa27f3f91 Mon Sep 17 00:00:00 2001 From: Vitalii Hlas <1998vitaliu@gmail.com> Date: Sun, 25 Jan 2026 19:47:39 +0100 Subject: [PATCH 122/316] Translated using Weblate (Ukrainian) Currently translated at 91.4% (1613 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/uk/ --- apps/client/src/translations/uk/translation.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/client/src/translations/uk/translation.json b/apps/client/src/translations/uk/translation.json index 36985a1943..3d0614fdfe 100644 --- a/apps/client/src/translations/uk/translation.json +++ b/apps/client/src/translations/uk/translation.json @@ -211,7 +211,8 @@ "export_status": "Статус експорту", "export_in_progress": "Триває експорт: {{progressCount}}", "export_finished_successfully": "Експорт успішно завершено.", - "format_pdf": "PDF – для друку або спільного використання." + "format_pdf": "PDF – для друку або спільного використання.", + "share-format": "HTML для веб-публікацій – використовує ту саму тему, що й для спільних нотаток, але може бути опублікований як статичний веб-сайт." }, "help": { "title": "Шпаргалка", @@ -265,7 +266,8 @@ "showSQLConsole": "показати консоль SQL", "other": "Інше", "quickSearch": "фокус на швидкому введенні пошуку", - "inPageSearch": "пошук на сторінці" + "inPageSearch": "пошук на сторінці", + "editShortcuts": "Редагувати комбінації клавіш" }, "import": { "importIntoNote": "Імпортувати в нотатку", From c2c9b6819cd55d4f2a00142f15975d0547d69251 Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Sun, 25 Jan 2026 19:32:49 +0100 Subject: [PATCH 123/316] Translated using Weblate (German) Currently translated at 100.0% (1763 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/ --- apps/client/src/translations/de/translation.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index 10df8f772e..fa1cd4b8a7 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -1608,7 +1608,11 @@ "configure_launchbar": "Startleiste konfigurieren" }, "sql_result": { - "no_rows": "Es wurden keine Zeilen für diese Abfrage zurückgegeben" + "no_rows": "Es wurden keine Zeilen für diese Abfrage zurückgegeben", + "not_executed": "Die Abfrage wurde noch nicht ausgeführt.", + "failed": "SQL-Abfrage ist fehlgeschlagen", + "execute_now": "Jetzt ausführen", + "statement_result": "Anweisung Ergebnis" }, "sql_table_schemas": { "tables": "Tabellen" From 7aec858ade1f5b27b027c58cc41ad3c223ed1111 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 25 Jan 2026 21:37:49 +0200 Subject: [PATCH 124/316] chore(web-clipper): missing offscreen.html in sources --- apps/web-clipper/wxt.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web-clipper/wxt.config.ts b/apps/web-clipper/wxt.config.ts index 145af8ec5a..1ca4460a1e 100644 --- a/apps/web-clipper/wxt.config.ts +++ b/apps/web-clipper/wxt.config.ts @@ -55,7 +55,7 @@ export default defineConfig({ }), zip: { includeSources: [ - "../../tsconfig.base.json" + "entrypoints/offscreen/index.html" ] }, hooks: { From 2d126c9cec112feef24f27e87f0b12d1c229ec30 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 25 Jan 2026 21:38:01 +0200 Subject: [PATCH 125/316] feat(ci): create release for web-clipper --- .github/workflows/web-clipper.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/workflows/web-clipper.yml b/.github/workflows/web-clipper.yml index ef360a5a93..a8110cf34b 100644 --- a/.github/workflows/web-clipper.yml +++ b/.github/workflows/web-clipper.yml @@ -6,11 +6,21 @@ on: - main paths: - "apps/web-clipper/**" + tags: + - "web-clipper-v*" pull_request: paths: - "apps/web-clipper/**" +permissions: + contents: write + discussions: write + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest @@ -39,9 +49,22 @@ jobs: - name: Upload build artifacts uses: actions/upload-artifact@v6 + if: ${{ !startsWith(github.ref, 'refs/tags/v') }} with: name: web-clipper-extension path: apps/web-clipper/.output/*.zip include-hidden-files: true if-no-files-found: error compression-level: 0 + + - name: Release web clipper extension + uses: softprops/action-gh-release@v2.5.0 + if: ${{ startsWith(github.ref, 'refs/tags/web-clipper-v') }} + with: + draft: false + fail_on_unmatched_files: true + files: apps/web-clipper/.output/*.zip + discussion_category_name: Releases + make_latest: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 241147c7626b8e8548136679f4d6321cccbaee55 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 25 Jan 2026 21:40:19 +0200 Subject: [PATCH 126/316] fix(ci): token for web-clipper release --- .github/workflows/web-clipper.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/web-clipper.yml b/.github/workflows/web-clipper.yml index a8110cf34b..e2fb90326b 100644 --- a/.github/workflows/web-clipper.yml +++ b/.github/workflows/web-clipper.yml @@ -49,7 +49,7 @@ jobs: - name: Upload build artifacts uses: actions/upload-artifact@v6 - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} + if: ${{ !startsWith(github.ref, 'refs/tags/web-clipper-v') }} with: name: web-clipper-extension path: apps/web-clipper/.output/*.zip @@ -66,5 +66,4 @@ jobs: files: apps/web-clipper/.output/*.zip discussion_category_name: Releases make_latest: false - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.RELEASE_PAT }} From 0cf34fb8745851449571075d0f6f9aa36a6da612 Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Sun, 25 Jan 2026 21:36:10 +0100 Subject: [PATCH 127/316] Translated using Weblate (German) Currently translated at 100.0% (1763 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/ --- apps/client/src/translations/de/translation.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index fa1cd4b8a7..7ecf415a40 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -2243,14 +2243,14 @@ "attachments_title_other": "Anhänge in einem neuen Tab öffnen", "attributes_one": "{{count}} Eigenschaft", "attributes_other": "{{count}} Eigenschaften", - "attributes_title": "Eigene und gererbte Eigenschaften", + "attributes_title": "Eigene und geerbte Attribute", "note_paths_one": "{{count}} Pfad", "note_paths_other": "{{count}} Pfade", "note_paths_title": "Notizpfade", "code_note_switcher": "Sprachmodus ändern" }, "attributes_panel": { - "title": "Notizeigenschaften" + "title": "Notizattribute" }, "right_pane": { "empty_message": "Für diese Notiz gibt es nichts anzuzeigen", From 4ce841dc8a5b118f9c3ed7c14ef7482c1090494d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 01:15:19 +0000 Subject: [PATCH 128/316] chore(deps): update dependency axios to v1.13.3 --- apps/server/package.json | 2 +- pnpm-lock.yaml | 96 ++++++++++++++++++++++++---------------- 2 files changed, 59 insertions(+), 39 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index e44311d48b..bd0beeed83 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -70,7 +70,7 @@ "@types/xml2js": "0.4.14", "archiver": "7.0.1", "async-mutex": "0.5.0", - "axios": "1.13.2", + "axios": "1.13.3", "bindings": "1.5.0", "bootstrap": "5.3.8", "chardet": "2.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eee164a724..7dad20aaf1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -625,8 +625,8 @@ importers: specifier: 0.5.0 version: 0.5.0 axios: - specifier: 1.13.2 - version: 1.13.2(debug@4.4.3) + specifier: 1.13.3 + version: 1.13.3(debug@4.4.3) bindings: specifier: 1.5.0 version: 1.5.0 @@ -6546,8 +6546,8 @@ packages: resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==} engines: {node: '>=6.0.0'} - axios@1.13.2: - resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + axios@1.13.3: + resolution: {integrity: sha512-ERT8kdX7DZjtUm7IitEyV7InTHAF42iJuMArIiDIV5YtPanJkgw4hw5Dyg9fh0mihdWNn1GKaeIWErfe56UQ1g==} b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -8755,10 +8755,6 @@ packages: resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} engines: {node: '>= 18'} - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} - engines: {node: '>= 6'} - form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} @@ -15833,8 +15829,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-upload': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-ai@47.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: @@ -15975,8 +15969,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-cloud-services@47.4.0': dependencies: @@ -16177,8 +16169,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -16188,8 +16178,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -16199,8 +16187,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-inline@47.4.0': dependencies: @@ -16210,8 +16196,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.4.0': dependencies: @@ -16234,6 +16218,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -16290,6 +16276,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-export-word@47.4.0': dependencies: @@ -16323,6 +16311,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-footnotes@47.4.0': dependencies: @@ -16353,6 +16343,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-heading@47.4.0': dependencies: @@ -16363,6 +16355,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-highlight@47.4.0': dependencies: @@ -16371,6 +16365,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-horizontal-line@47.4.0': dependencies: @@ -16380,8 +16376,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-html-embed@47.4.0': dependencies: @@ -16391,6 +16385,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-html-support@47.4.0': dependencies: @@ -16406,6 +16402,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -16423,6 +16421,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-import-word@47.4.0': dependencies: @@ -16435,6 +16435,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-indent@47.4.0': dependencies: @@ -16446,6 +16448,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-inspector@5.0.0': {} @@ -16455,6 +16459,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-line-height@47.4.0': dependencies: @@ -16479,6 +16485,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-list-multi-level@47.4.0': dependencies: @@ -16502,6 +16510,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-markdown-gfm@47.4.0': dependencies: @@ -16539,6 +16549,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-mention@47.4.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d)': dependencies: @@ -16562,6 +16574,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-minimap@47.4.0': dependencies: @@ -16570,6 +16584,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-operations-compressor@47.4.0': dependencies: @@ -16624,6 +16640,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-pagination@47.4.0': dependencies: @@ -16733,6 +16751,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-slash-command@47.4.0': dependencies: @@ -16745,6 +16765,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-source-editing-enhanced@47.4.0': dependencies: @@ -16771,8 +16793,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-special-characters@47.4.0': dependencies: @@ -16794,6 +16814,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-table@47.4.0': dependencies: @@ -16806,6 +16828,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-template@47.4.0': dependencies: @@ -16880,8 +16904,6 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.4.0 '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-upload@47.4.0': dependencies: @@ -16918,6 +16940,8 @@ snapshots: '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-widget@47.4.0': dependencies: @@ -16937,6 +16961,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@codemirror/autocomplete@6.18.6': dependencies: @@ -21100,7 +21126,7 @@ snapshots: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/node': 24.10.9 - form-data: 4.0.4 + form-data: 4.0.5 '@types/supercluster@7.1.3': dependencies: @@ -22126,10 +22152,10 @@ snapshots: await-to-js@3.0.0: {} - axios@1.13.2(debug@4.4.3): + axios@1.13.3(debug@4.4.3): dependencies: follow-redirects: 1.15.9(debug@4.4.3) - form-data: 4.0.4 + form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -22685,6 +22711,8 @@ snapshots: ckeditor5-collaboration@47.4.0: dependencies: '@ckeditor/ckeditor5-collaboration-core': 47.4.0 + transitivePeerDependencies: + - supports-color ckeditor5-premium-features@47.4.0(bufferutil@4.0.9)(ckeditor5@47.4.0)(utf-8-validate@6.0.5): dependencies: @@ -25055,14 +25083,6 @@ snapshots: form-data-encoder@4.1.0: {} - form-data@4.0.4: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - form-data@4.0.5: dependencies: asynckit: 0.4.0 @@ -26451,7 +26471,7 @@ snapshots: decimal.js: 10.5.0 domexception: 2.0.1 escodegen: 2.1.0 - form-data: 4.0.4 + form-data: 4.0.5 html-encoding-sniffer: 2.0.1 http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 From 9224029a16907d903523267c29134fcc10e0dba9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 01:16:05 +0000 Subject: [PATCH 129/316] chore(deps): update dependency happy-dom to v20.3.9 --- apps/client/package.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 112 +++++++++++++++++++++++++-------------- 3 files changed, 73 insertions(+), 43 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 754c33d5e8..e2b31f7465 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -78,7 +78,7 @@ "@types/reveal.js": "5.2.2", "@types/tabulator-tables": "6.3.1", "copy-webpack-plugin": "13.0.1", - "happy-dom": "20.3.7", + "happy-dom": "20.3.9", "lightningcss": "1.31.1", "script-loader": "0.7.2", "vite-plugin-static-copy": "3.1.5" diff --git a/package.json b/package.json index 7ec68ed23f..417a7e688b 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "eslint-config-prettier": "10.1.8", "eslint-plugin-playwright": "2.5.0", "eslint-plugin-simple-import-sort": "12.1.1", - "happy-dom": "20.3.7", + "happy-dom": "20.3.9", "http-server": "14.1.1", "jiti": "2.6.1", "js-yaml": "4.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eee164a724..6adcc4b6a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -92,8 +92,8 @@ importers: specifier: 12.1.1 version: 12.1.1(eslint@9.39.2(jiti@2.6.1)) happy-dom: - specifier: 20.3.7 - version: 20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 20.3.9 + version: 20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5) http-server: specifier: 14.1.1 version: 14.1.1 @@ -135,7 +135,7 @@ importers: version: 4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -345,8 +345,8 @@ importers: specifier: 13.0.1 version: 13.0.1(webpack@5.101.3(esbuild@0.27.2)) happy-dom: - specifier: 20.3.7 - version: 20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 20.3.9 + version: 20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5) lightningcss: specifier: 1.31.1 version: 1.31.1 @@ -867,7 +867,7 @@ importers: version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -958,7 +958,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1018,7 +1018,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1078,7 +1078,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1145,7 +1145,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1212,7 +1212,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.2 version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -9127,8 +9127,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@20.3.7: - resolution: {integrity: sha512-sb5IzoRl1WJKsUSRe+IloJf3z1iDq5PQ7Yk/ULMsZ5IAQEs9ZL7RsFfiKBXU7nK9QmO+iz0e59EH8r8jexTZ/g==} + happy-dom@20.3.9: + resolution: {integrity: sha512-OIoj0PcK2JaxQuANHxWkxFRSNXAuSgO1vCzCT66KItE0W/ieZLG+/iW8OetlxB+F9EaPB7DoFYKAubFG1f4Mvw==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -15833,8 +15833,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-upload': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-ai@47.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: @@ -15975,16 +15973,12 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-cloud-services@47.4.0': dependencies: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16177,8 +16171,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -16188,8 +16180,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -16199,8 +16189,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-inline@47.4.0': dependencies: @@ -16234,6 +16222,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -16290,6 +16280,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-export-word@47.4.0': dependencies: @@ -16323,6 +16315,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-footnotes@47.4.0': dependencies: @@ -16353,6 +16347,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-heading@47.4.0': dependencies: @@ -16363,6 +16359,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-highlight@47.4.0': dependencies: @@ -16371,6 +16369,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-horizontal-line@47.4.0': dependencies: @@ -16380,8 +16380,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-html-embed@47.4.0': dependencies: @@ -16391,6 +16389,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-html-support@47.4.0': dependencies: @@ -16406,6 +16406,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -16423,6 +16425,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-import-word@47.4.0': dependencies: @@ -16435,6 +16439,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-indent@47.4.0': dependencies: @@ -16446,6 +16452,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-inspector@5.0.0': {} @@ -16455,6 +16463,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-line-height@47.4.0': dependencies: @@ -16479,6 +16489,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-list-multi-level@47.4.0': dependencies: @@ -16502,6 +16514,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-markdown-gfm@47.4.0': dependencies: @@ -16539,6 +16553,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-mention@47.4.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d)': dependencies: @@ -16562,6 +16578,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-minimap@47.4.0': dependencies: @@ -16570,6 +16588,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-operations-compressor@47.4.0': dependencies: @@ -16624,6 +16644,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-pagination@47.4.0': dependencies: @@ -16687,8 +16709,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -16733,6 +16753,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-slash-command@47.4.0': dependencies: @@ -16745,6 +16767,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-source-editing-enhanced@47.4.0': dependencies: @@ -16771,8 +16795,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-special-characters@47.4.0': dependencies: @@ -16794,6 +16816,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-table@47.4.0': dependencies: @@ -16806,6 +16830,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-template@47.4.0': dependencies: @@ -16880,8 +16906,6 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.4.0 '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-upload@47.4.0': dependencies: @@ -16918,6 +16942,8 @@ snapshots: '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-widget@47.4.0': dependencies: @@ -16937,6 +16963,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@codemirror/autocomplete@6.18.6': dependencies: @@ -21430,7 +21458,7 @@ snapshots: '@vitest/browser-webdriverio@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21447,7 +21475,7 @@ snapshots: pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) ws: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21467,7 +21495,7 @@ snapshots: magicast: 0.5.1 obug: 2.1.1 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -21483,7 +21511,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) optionalDependencies: '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) @@ -21531,7 +21559,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/utils@4.0.18': dependencies: @@ -22685,6 +22713,8 @@ snapshots: ckeditor5-collaboration@47.4.0: dependencies: '@ckeditor/ckeditor5-collaboration-core': 47.4.0 + transitivePeerDependencies: + - supports-color ckeditor5-premium-features@47.4.0(bufferutil@4.0.9)(ckeditor5@47.4.0)(utf-8-validate@6.0.5): dependencies: @@ -25506,7 +25536,7 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5): + happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/node': 24.10.9 '@types/whatwg-mimetype': 3.0.2 @@ -31983,7 +32013,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.1 - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.18 '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) @@ -32010,7 +32040,7 @@ snapshots: '@types/node': 24.10.9 '@vitest/browser-webdriverio': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/ui': 4.0.18(vitest@4.0.18) - happy-dom: 20.3.7(bufferutil@4.0.9)(utf-8-validate@6.0.5) + happy-dom: 20.3.9(bufferutil@4.0.9)(utf-8-validate@6.0.5) jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - jiti From 30ead4080ad3ac7f316452ba2e31d54c29003cbc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 01:16:42 +0000 Subject: [PATCH 130/316] fix(deps): update dependency katex to v0.16.28 --- apps/client/package.json | 2 +- packages/share-theme/package.json | 2 +- pnpm-lock.yaml | 86 +++++++++++++++++++++---------- 3 files changed, 60 insertions(+), 30 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 754c33d5e8..a7f2e5f680 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -49,7 +49,7 @@ "jquery": "4.0.0", "jquery.fancytree": "2.38.5", "jsplumb": "2.15.6", - "katex": "0.16.27", + "katex": "0.16.28", "knockout": "3.5.1", "leaflet": "1.9.4", "leaflet-gpx": "2.2.0", diff --git a/packages/share-theme/package.json b/packages/share-theme/package.json index a20b744f17..a8e6e6672f 100644 --- a/packages/share-theme/package.json +++ b/packages/share-theme/package.json @@ -25,7 +25,7 @@ "license": "Apache-2.0", "dependencies": { "fuse.js": "7.1.0", - "katex": "0.16.27", + "katex": "0.16.28", "mermaid": "11.12.2" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eee164a724..eab2f34f36 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -263,8 +263,8 @@ importers: specifier: 2.15.6 version: 2.15.6 katex: - specifier: 0.16.27 - version: 0.16.27 + specifier: 0.16.28 + version: 0.16.28 knockout: specifier: 3.5.1 version: 3.5.1 @@ -1407,8 +1407,8 @@ importers: specifier: 7.1.0 version: 7.1.0 katex: - specifier: 0.16.27 - version: 0.16.27 + specifier: 0.16.28 + version: 0.16.28 mermaid: specifier: 11.12.2 version: 11.12.2 @@ -10130,8 +10130,8 @@ packages: engines: {node: '>= 10'} hasBin: true - katex@0.16.27: - resolution: {integrity: sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==} + katex@0.16.28: + resolution: {integrity: sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==} hasBin: true kdbush@4.0.2: @@ -15833,8 +15833,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-upload': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-ai@47.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: @@ -15975,16 +15973,12 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-cloud-services@47.4.0': dependencies: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16177,8 +16171,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -16188,8 +16180,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -16199,8 +16189,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-inline@47.4.0': dependencies: @@ -16234,6 +16222,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -16290,6 +16280,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-export-word@47.4.0': dependencies: @@ -16323,6 +16315,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-footnotes@47.4.0': dependencies: @@ -16353,6 +16347,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-heading@47.4.0': dependencies: @@ -16363,6 +16359,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-highlight@47.4.0': dependencies: @@ -16371,6 +16369,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-horizontal-line@47.4.0': dependencies: @@ -16380,8 +16380,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-html-embed@47.4.0': dependencies: @@ -16391,6 +16389,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-html-support@47.4.0': dependencies: @@ -16406,6 +16406,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -16423,6 +16425,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-import-word@47.4.0': dependencies: @@ -16435,6 +16439,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-indent@47.4.0': dependencies: @@ -16446,6 +16452,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-inspector@5.0.0': {} @@ -16455,6 +16463,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-line-height@47.4.0': dependencies: @@ -16479,6 +16489,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-list-multi-level@47.4.0': dependencies: @@ -16502,6 +16514,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-markdown-gfm@47.4.0': dependencies: @@ -16539,6 +16553,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-mention@47.4.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d)': dependencies: @@ -16562,6 +16578,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-minimap@47.4.0': dependencies: @@ -16570,6 +16588,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-operations-compressor@47.4.0': dependencies: @@ -16624,6 +16644,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-pagination@47.4.0': dependencies: @@ -16687,8 +16709,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -16733,6 +16753,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-slash-command@47.4.0': dependencies: @@ -16745,6 +16767,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-source-editing-enhanced@47.4.0': dependencies: @@ -16771,8 +16795,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-special-characters@47.4.0': dependencies: @@ -16794,6 +16816,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-table@47.4.0': dependencies: @@ -16806,6 +16830,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-template@47.4.0': dependencies: @@ -16880,8 +16906,6 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.4.0 '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-upload@47.4.0': dependencies: @@ -16918,6 +16942,8 @@ snapshots: '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-widget@47.4.0': dependencies: @@ -16937,6 +16963,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@codemirror/autocomplete@6.18.6': dependencies: @@ -22685,6 +22713,8 @@ snapshots: ckeditor5-collaboration@47.4.0: dependencies: '@ckeditor/ckeditor5-collaboration-core': 47.4.0 + transitivePeerDependencies: + - supports-color ckeditor5-premium-features@47.4.0(bufferutil@4.0.9)(ckeditor5@47.4.0)(utf-8-validate@6.0.5): dependencies: @@ -26633,7 +26663,7 @@ snapshots: - supports-color - utf-8-validate - katex@0.16.27: + katex@0.16.28: dependencies: commander: 8.3.0 @@ -27368,7 +27398,7 @@ snapshots: dagre-d3-es: 7.0.13 dayjs: 1.11.19 dompurify: 3.2.5 - katex: 0.16.27 + katex: 0.16.28 khroma: 2.1.0 lodash-es: 4.17.21 marked: 16.4.2 From 3b76239f65ee904e4ab7d1cc28576f9b83c29e3b Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Sun, 25 Jan 2026 23:10:22 +0100 Subject: [PATCH 131/316] Translated using Weblate (German) Currently translated at 100.0% (1763 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/ --- .../src/translations/de/translation.json | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index 7ecf415a40..4b3acf567f 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -720,7 +720,7 @@ "update_available": "Update verfügbar" }, "note_launcher": { - "this_launcher_doesnt_define_target_note": "Dieser Launcher definiert keine Zielnotiz." + "this_launcher_doesnt_define_target_note": "Dieser Starter definiert keine Zielnotiz." }, "code_buttons": { "execute_button_title": "Skript ausführen", @@ -763,8 +763,8 @@ "change_note_icon": "Notiz-Icon ändern", "search": "Suche:", "reset-default": "Standard wiederherstellen", - "search_placeholder_one": "Suche {{number}} Icons über {{count}} Pakete", - "search_placeholder_other": "Suche {{number}} Icons über {{count}} Pakete", + "search_placeholder_one": "Suche {{number}} Symbole über {{count}} Pakete", + "search_placeholder_other": "Suche {{number}} Symbole über {{count}} Pakete", "search_placeholder_filtered": "Suche {{number}} Icons in {{name}}", "filter": "Filter", "filter-none": "Alle Icons", @@ -1169,7 +1169,7 @@ "layout": "Layout", "layout-vertical-title": "Vertikal", "layout-horizontal-title": "Horizontal", - "layout-vertical-description": "Startleiste ist auf der linken Seite (standard)", + "layout-vertical-description": "Startleiste ist auf der linken Seite (Standard)", "layout-horizontal-description": "Startleiste ist unter der Tableiste. Die Tableiste wird dadurch auf die ganze Breite erweitert.", "auto_theme": "Alt (Folge dem Farbschema des Systems)", "light_theme": "Alt (Hell)", @@ -1177,7 +1177,7 @@ }, "zoom_factor": { "title": "Zoomfaktor (nur Desktop-Build)", - "description": "Das Zoomen kann auch mit den Tastenkombinationen STRG+- und STRG+u003d gesteuert werden." + "description": "Das Zoomen kann auch mit den Tastenkombinationen Strg+- und Strg+= gesteuert werden." }, "code_auto_read_only_size": { "title": "Automatische schreibgeschützte Größe", @@ -1490,12 +1490,12 @@ "note-map": "Notizkarte", "render-note": "Render Notiz", "mermaid-diagram": "Mermaid Diagramm", - "canvas": "Canvas", + "canvas": "Leinwand", "web-view": "Webansicht", "mind-map": "Mind Map", "file": "Datei", "image": "Bild", - "launcher": "Launcher", + "launcher": "Starter", "doc": "Dokument", "widget": "Widget", "confirm-change": "Es is nicht empfehlenswert den Notiz-Typ zu ändern, wenn der Inhalt der Notiz nicht leer ist. Möchtest du dennoch fortfahren?", @@ -1595,7 +1595,7 @@ "last_modified": "Bearbeitet am ", "note_type_switcher_label": "Ändere von {{type}} zu:", "note_type_switcher_others": "Andere Notizart", - "note_type_switcher_templates": "Template", + "note_type_switcher_templates": "Vorlagen", "note_type_switcher_collection": "Sammlung", "edited_notes": "Notizen, bearbeitet an diesem Tag", "promoted_attributes": "Hervorgehobene Attribute" @@ -1683,16 +1683,16 @@ "confirm_unhoisting": "Die angeforderte Notiz ‚{{requestedNote}}‘ befindet sich außerhalb des hoisted Bereichs der Notiz ‚{{hoistedNote}}‘. Du musst sie unhoisten, um auf die Notiz zuzugreifen. Möchtest du mit dem Unhoisting fortfahren?" }, "launcher_context_menu": { - "reset_launcher_confirm": "Möchtest du „{{title}}“ wirklich zurücksetzen? Alle Daten / Einstellungen in dieser Notiz (und ihren Unternotizen) gehen verloren und der Launcher wird an seinen ursprünglichen Standort zurückgesetzt.", - "add-note-launcher": "Launcher für Notiz hinzufügen", - "add-script-launcher": "Launcher für Skript hinzufügen", + "reset_launcher_confirm": "Möchtest du „{{title}}“ wirklich zurücksetzen? Alle Daten / Einstellungen in dieser Notiz (und ihren Unternotizen) gehen verloren und der Starter wird an seinen ursprünglichen Standort zurückgesetzt.", + "add-note-launcher": "Notiz-Starter hinzufügen", + "add-script-launcher": "Skript-Starter hinzufügen", "add-custom-widget": "Benutzerdefiniertes Widget hinzufügen", - "add-spacer": "Spacer hinzufügen", + "add-spacer": "Abstandhalter hinzufügen", "delete": "Löschen ", "reset": "Zurücksetzen", - "move-to-visible-launchers": "Zu sichtbaren Launchern verschieben", - "move-to-available-launchers": "Zu verfügbaren Launchern verschieben", - "duplicate-launcher": "Launcher duplizieren " + "move-to-visible-launchers": "Zu sichtbaren Startern verschieben", + "move-to-available-launchers": "Zu verfügbaren Startern verschieben", + "duplicate-launcher": "Starter duplizieren " }, "highlighting": { "description": "Steuert die Syntaxhervorhebung für Codeblöcke in Textnotizen, Code-Notizen sind nicht betroffen.", @@ -2241,8 +2241,8 @@ "attachments_other": "{{count}} Anhänge", "attachments_title_one": "Anhang in einem neuen Tab öffnen", "attachments_title_other": "Anhänge in einem neuen Tab öffnen", - "attributes_one": "{{count}} Eigenschaft", - "attributes_other": "{{count}} Eigenschaften", + "attributes_one": "{{count}} Attribute", + "attributes_other": "{{count}} Attribute", "attributes_title": "Eigene und geerbte Attribute", "note_paths_one": "{{count}} Pfad", "note_paths_other": "{{count}} Pfade", From 78b0773a285d0eac98b83c12a9bd3586e65a20c4 Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Sun, 25 Jan 2026 22:24:43 +0100 Subject: [PATCH 132/316] Translated using Weblate (German) Currently translated at 100.0% (116 of 116 strings) Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/de/ --- docs/README-de.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/README-de.md b/docs/README-de.md index a3c2112144..00cfe89340 100644 --- a/docs/README-de.md +++ b/docs/README-de.md @@ -104,7 +104,7 @@ Unsere Dokumentation ist verfügbar in mehreren Formaten: [Notizverschlüsselung](https://docs.triliumnotes.org/user-guide/concepts/notes/protected-notes) mit Granularität pro Notiz * Skizzieren von Diagrammen basierend auf [Excalidraw](https://excalidraw.com/) - (Notiztyp „Canvas“) + (Notiztyp „Leinwand“) * [Beziehungskarten](https://docs.triliumnotes.org/user-guide/note-types/relation-map) und [Notiz-/Link-Karten](https://docs.triliumnotes.org/user-guide/note-types/note-map) @@ -298,7 +298,7 @@ enthält weitere Details. Bei offenen Fragen kann über die im Abschnitt Anwendungssymbols. * [nriver](https://github.com/nriver) für seine Arbeit zur Internationalisierung. -* [Thomas Frei](https://github.com/thfrei) für seine ursprüngliche Arbeit an +* [Thomas Frei](https://github.com/thfrei) für seine originelle Arbeit an Canvas. * [antoniotejada](https://github.com/nriver) für das ursprüngliche Syntax-Highlighting-Widget. @@ -314,7 +314,7 @@ Trilium wäre ohne die zugrundeliegenden Technologien nicht möglich: * [CodeMirror](https://github.com/codemirror/CodeMirror) - Code-Editor mit Unterstützung für eine Vielzahl von Sprachen. * [Excalidraw](https://github.com/excalidraw/excalidraw) – das unendliche - Whiteboard, verwendet in Canvas-Notizen. + Whiteboard, verwendet in Leinwand-Notizen. * [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) – bietet die Mindmap-Funktionalität. * [Leaflet](https://github.com/Leaflet/Leaflet) – für die Darstellung From 27bf41e0ced48cc09554e61522b4f98370f55ce1 Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Sun, 25 Jan 2026 23:00:32 +0100 Subject: [PATCH 133/316] Translated using Weblate (German) Currently translated at 100.0% (388 of 388 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/de/ --- apps/server/src/assets/translations/de/server.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/server/src/assets/translations/de/server.json b/apps/server/src/assets/translations/de/server.json index aa36bcc3d3..8037825bcb 100644 --- a/apps/server/src/assets/translations/de/server.json +++ b/apps/server/src/assets/translations/de/server.json @@ -216,13 +216,13 @@ "launch-bar-templates-title": "Startleiste Vorlagen", "base-abstract-launcher-title": "Basis Abstrakte Startleiste", "command-launcher-title": "Befehlslauncher", - "note-launcher-title": "Notiz Launcher", + "note-launcher-title": "Notiz-Starter", "script-launcher-title": "Skript-Starter", "built-in-widget-title": "Eingebautes Widget", "spacer-title": "Freifeld", "custom-widget-title": "Benutzerdefiniertes Widget", "launch-bar-title": "Launchbar", - "available-launchers-title": "Verfügbare Launchers", + "available-launchers-title": "Verfügbare Starter", "go-to-previous-note-title": "Zur vorherigen Notiz gehen", "go-to-next-note-title": "Zur nächsten Notiz gehen", "new-note-title": "Neue Notiz", @@ -248,7 +248,7 @@ "sync-title": "Synchronisation", "other": "Weitere", "advanced-title": "Erweitert", - "visible-launchers-title": "Sichtbare Launcher", + "visible-launchers-title": "Sichtbare Starter", "user-guide": "Nutzerhandbuch", "jump-to-note-title": "Springe zu...", "llm-chat-title": "Chat mit Notizen", From 81d964d3e8f3dce5bbfd285d8e701f9bece0fe4f Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Mon, 26 Jan 2026 00:14:03 +0100 Subject: [PATCH 134/316] Translated using Weblate (German) Currently translated at 100.0% (1763 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/ --- apps/client/src/translations/de/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index 4b3acf567f..6d3fbf5cb6 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -1612,7 +1612,7 @@ "not_executed": "Die Abfrage wurde noch nicht ausgeführt.", "failed": "SQL-Abfrage ist fehlgeschlagen", "execute_now": "Jetzt ausführen", - "statement_result": "Anweisung Ergebnis" + "statement_result": "Abfrageergebnis" }, "sql_table_schemas": { "tables": "Tabellen" From 9462ccc6501e153ff71ceb5bf0eb735901685ced Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Mon, 26 Jan 2026 00:21:28 +0100 Subject: [PATCH 135/316] Translated using Weblate (German) Currently translated at 100.0% (152 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/de/ --- apps/website/src/translations/de/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/website/src/translations/de/translation.json b/apps/website/src/translations/de/translation.json index dcbc5e3861..b162d9dce9 100644 --- a/apps/website/src/translations/de/translation.json +++ b/apps/website/src/translations/de/translation.json @@ -91,7 +91,7 @@ "download_helper_server_docker": { "title": "Self-hosted mit Docker", "description": "Schnelle Installation auf Windows, Linux oder macOS mit einem Docker-Container.", - "download_dockerhub": "Docker-Hub", + "download_dockerhub": "Docker Hub", "download_ghcr": "ghcr.io" }, "download_helper_desktop_linux": { From 0c72bd1539b8f0c23074f83838cd2e4202d9e7af Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Mon, 26 Jan 2026 00:19:13 +0100 Subject: [PATCH 136/316] Translated using Weblate (German) Currently translated at 100.0% (1763 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/ --- apps/client/src/translations/de/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index 6d3fbf5cb6..2216634237 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -1595,7 +1595,7 @@ "last_modified": "Bearbeitet am ", "note_type_switcher_label": "Ändere von {{type}} zu:", "note_type_switcher_others": "Andere Notizart", - "note_type_switcher_templates": "Vorlagen", + "note_type_switcher_templates": "Vorlage", "note_type_switcher_collection": "Sammlung", "edited_notes": "Notizen, bearbeitet an diesem Tag", "promoted_attributes": "Hervorgehobene Attribute" From 2b7a7a87679141efe8193aa9e45b238a17563a8d Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Mon, 26 Jan 2026 00:25:18 +0100 Subject: [PATCH 137/316] Translated using Weblate (German) Currently translated at 100.0% (388 of 388 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/de/ --- apps/server/src/assets/translations/de/server.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/assets/translations/de/server.json b/apps/server/src/assets/translations/de/server.json index 8037825bcb..127b28bd71 100644 --- a/apps/server/src/assets/translations/de/server.json +++ b/apps/server/src/assets/translations/de/server.json @@ -221,7 +221,7 @@ "built-in-widget-title": "Eingebautes Widget", "spacer-title": "Freifeld", "custom-widget-title": "Benutzerdefiniertes Widget", - "launch-bar-title": "Launchbar", + "launch-bar-title": "Starterleiste", "available-launchers-title": "Verfügbare Starter", "go-to-previous-note-title": "Zur vorherigen Notiz gehen", "go-to-next-note-title": "Zur nächsten Notiz gehen", From a487a502f53828071a7d591aa433fab416805984 Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Mon, 26 Jan 2026 00:25:33 +0100 Subject: [PATCH 138/316] Translated using Weblate (German) Currently translated at 100.0% (1763 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/ --- apps/client/src/translations/de/translation.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index 2216634237..624d244040 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -645,7 +645,7 @@ "zoom_out": "Herauszoomen", "reset_zoom_level": "Zoomstufe zurücksetzen", "zoom_in": "Hineinzoomen", - "configure_launchbar": "Konfiguriere die Launchbar", + "configure_launchbar": "Konfiguriere die Starterleiste", "show_shared_notes_subtree": "Unterbaum „Freigegebene Notizen“ anzeigen", "advanced": "Erweitert", "open_dev_tools": "Öffne die Entwicklungstools", @@ -1605,7 +1605,7 @@ "search_not_executed": "Die Suche wurde noch nicht ausgeführt. Klicke oben auf „Suchen“, um die Ergebnisse anzuzeigen." }, "spacer": { - "configure_launchbar": "Startleiste konfigurieren" + "configure_launchbar": "Starterleiste konfigurieren" }, "sql_result": { "no_rows": "Es wurden keine Zeilen für diese Abfrage zurückgegeben", From 494e23b69f8420e7bbedc7bd28809bde89a4dc7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Sanchez=20Castell=C3=B3n?= Date: Mon, 26 Jan 2026 01:06:50 +0100 Subject: [PATCH 139/316] Translated using Weblate (Spanish) Currently translated at 100.0% (116 of 116 strings) Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/es/ --- docs/README-es.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/README-es.md b/docs/README-es.md index d39610988b..48c4146884 100644 --- a/docs/README-es.md +++ b/docs/README-es.md @@ -97,8 +97,8 @@ La documentación está disponible en varios formatos: inicio de sesión más seguro * [Sincronización](https://docs.triliumnotes.org/user-guide/setup/synchronization) con servidor de sincronización autohospedado - * there are [3rd party services for hosting synchronisation - server](https://docs.triliumnotes.org/user-guide/setup/server/cloud-hosting) + * existen [servicios de terceros para alojar servidores de + sincronización](https://docs.triliumnotes.org/user-guide/setup/server/cloud-hosting) * [Compartir](https://docs.triliumnotes.org/user-guide/advanced-usage/sharing) (publicar) notas en Internet público * Fuerte [cifrado de @@ -106,10 +106,11 @@ La documentación está disponible en varios formatos: con granularidad por nota * Esbozo de diagramas, basado en [Excalidraw](https://excalidraw.com/) (tipo de nota "lienzo") -* [Relation - maps](https://docs.triliumnotes.org/user-guide/note-types/relation-map) and - [note/link maps](https://docs.triliumnotes.org/user-guide/note-types/note-map) - for visualizing notes and their relations +* [Mapas de + relaciones](https://docs.triliumnotes.org/user-guide/note-types/relation-map) + y [mapas de + notas/enlaces](https://docs.triliumnotes.org/user-guide/note-types/note-map) + para visualizar notas y sus relaciones * Mapas mentales, basados en [Mind Elixir](https://docs.mind-elixir.com/) * [Mapas geográficos](https://docs.triliumnotes.org/user-guide/collections/geomap) con @@ -134,8 +135,8 @@ La documentación está disponible en varios formatos: guardar fácilmente contenido web * Interfaz personalizable (botones de la barra lateral, widgets definidos por el usuario, …) -* [Metrics](https://docs.triliumnotes.org/user-guide/advanced-usage/metrics), - along with a Grafana Dashboard. +* [Métricas](https://docs.triliumnotes.org/user-guide/advanced-usage/metrics), + junto con un panel de control de Grafana. ✨ Consulta los siguientes recursos y comunidades de terceros para obtener más contenido relacionado con TriliumNext: From 7af4fbfccef5058f1714eb03daf79216d933ddea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Sanchez=20Castell=C3=B3n?= Date: Mon, 26 Jan 2026 01:08:53 +0100 Subject: [PATCH 140/316] Translated using Weblate (Spanish) Currently translated at 93.5% (1650 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/ --- apps/client/src/translations/es/translation.json | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/client/src/translations/es/translation.json b/apps/client/src/translations/es/translation.json index 7e0ae3c694..b9aa2a0178 100644 --- a/apps/client/src/translations/es/translation.json +++ b/apps/client/src/translations/es/translation.json @@ -28,7 +28,10 @@ }, "widget-render-error": { "title": "Hubo un fallo al renderizar un widget personalizado de React" - } + }, + "widget-missing-parent": "El widget personalizado no tiene definida la propiedad obligatoria '{{property}}'.\n\nSi este script está pensado para ejecutarse sin un elemento de interfaz de usuario, utilice '#run=frontendStartup' en su lugar.", + "open-script-note": "Abrir script", + "scripting-error": "Error en script personalizado: {{title}}" }, "add_link": { "add_link": "Agregar enlace", @@ -211,7 +214,8 @@ "info": { "modalTitle": "Mensaje informativo", "closeButton": "Cerrar", - "okButton": "Aceptar" + "okButton": "Aceptar", + "copy_to_clipboard": "Copiar al portapapeles" }, "jump_to_note": { "search_button": "Buscar en texto completo", @@ -697,7 +701,10 @@ "convert_into_attachment_successful": "La nota '{{title}}' ha sido convertida a un archivo adjunto.", "convert_into_attachment_prompt": "¿Está seguro que desea convertir la nota '{{title}}' en un archivo adjunto de la nota padre?", "print_pdf": "Exportar como PDF...", - "open_note_on_server": "Abrir nota en servidor" + "open_note_on_server": "Abrir nota en servidor", + "view_revisions": "Revisiones de la nota...", + "advanced": "Avanzado", + "export_as_image": "Exportar como imagen" }, "onclick_button": { "no_click_handler": "El widget de botón '{{componentId}}' no tiene un controlador de clics definido" From 1ab7b91f2e7ca924dfce8520fbb8ffcb633104e8 Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Mon, 26 Jan 2026 01:39:42 +0100 Subject: [PATCH 141/316] Translated using Weblate (German) Currently translated at 100.0% (1763 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/ --- .../src/translations/de/translation.json | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index 624d244040..d75ce7a5d4 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -421,7 +421,7 @@ "execute_description": "Längere Beschreibung der aktuellen Codenotiz, die zusammen mit der Schaltfläche „Ausführen“ angezeigt wird", "exclude_from_note_map": "Notizen mit dieser Bezeichnung werden in der Notizenkarte ausgeblendet", "new_notes_on_top": "Neue Notizen werden oben in der übergeordneten Notiz erstellt, nicht unten.", - "hide_highlight_widget": "Widget „Hervorhebungsliste“ ausblenden", + "hide_highlight_widget": "Widget „Markierungsliste“ ausblenden", "run_on_note_creation": "Wird ausgeführt, wenn eine Notiz im Backend erstellt wird. Verwende diese Beziehung, wenn du das Skript für alle Notizen ausführen möchtest, die unter einer bestimmten Unternotiz erstellt wurden. Erstelle es in diesem Fall auf der Unternotiz-Stammnotiz und mache es vererbbar. Eine neue Notiz, die innerhalb der Unternotiz (beliebige Tiefe) erstellt wird, löst das Skript aus.", "run_on_child_note_creation": "Wird ausgeführt, wenn eine neue Notiz unter der Notiz erstellt wird, in der diese Beziehung definiert ist", "run_on_note_title_change": "Wird ausgeführt, wenn der Notiztitel geändert wird (einschließlich der Notizerstellung)", @@ -632,7 +632,7 @@ "show_toc": "Inhaltsverzeichnis anzeigen" }, "show_highlights_list_widget_button": { - "show_highlights_list": "Hervorhebungen anzeigen" + "show_highlights_list": "Markierungsliste anzeigen" }, "global_menu": { "menu": "Menü", @@ -1266,16 +1266,16 @@ "markdown": "Markdown-Stil" }, "highlights_list": { - "title": "Highlights-Liste", - "description": "Du kannst die im rechten Bereich angezeigte Highlights-Liste anpassen:", + "title": "Markierungsliste", + "description": "Du kannst die im rechten Bereich angezeigte Markierungsliste anpassen:", "bold": "Fettgedruckter Text", "italic": "Kursiver Text", "underline": "Unterstrichener Text", "color": "Farbiger Text", "bg_color": "Text mit Hintergrundfarbe", - "visibility_title": "Sichtbarkeit der Highlights-Liste", - "visibility_description": "Du kannst das Hervorhebungs-Widget pro Notiz ausblenden, indem du die Beschriftung #hideHighlightWidget hinzufügst.", - "shortcut_info": "Du kannst eine Tastenkombination zum schnellen Umschalten des rechten Bereichs (einschließlich Hervorhebungen) in den Optionen -> Tastenkombinationen konfigurieren (Name „toggleRightPane“)." + "visibility_title": "Sichtbarkeit der Markierungsliste", + "visibility_description": "Du kannst das Markierungs-Widget pro Notiz ausblenden, indem du die Beschriftung #hideHighlightWidget hinzufügst.", + "shortcut_info": "Du kannst eine Tastenkombination zum schnellen Umschalten des rechten Bereichs (einschließlich Markierungen) in den Optionen -> Tastenkombinationen konfigurieren (Name „toggleRightPane“)." }, "table_of_contents": { "title": "Inhaltsverzeichnis", @@ -1535,13 +1535,13 @@ "replace_all": "Alle Ersetzen" }, "highlights_list_2": { - "title": "Hervorhebungs-Liste", + "title": "Markierungsliste", "options": "Optionen", - "title_with_count_one": "{{count}} Highlight", - "title_with_count_other": "{{count}} Highlights", - "modal_title": "Highlight Liste konfigurieren", - "menu_configure": "Highlight Liste konfigurieren…", - "no_highlights": "Keine Highlights gefunden." + "title_with_count_one": "{{count}} Markierung", + "title_with_count_other": "{{count}} Markierungen", + "modal_title": "Markierungsliste konfigurieren", + "menu_configure": "Markierungsliste konfigurieren…", + "no_highlights": "Keine Markierungen gefunden." }, "quick-search": { "placeholder": "Schnellsuche", From 4c51c8e8f888e365addb3eaab762160e16d3ffc8 Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Mon, 26 Jan 2026 01:35:07 +0100 Subject: [PATCH 142/316] Translated using Weblate (German) Currently translated at 100.0% (116 of 116 strings) Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/de/ --- docs/README-de.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README-de.md b/docs/README-de.md index 00cfe89340..051d0af07a 100644 --- a/docs/README-de.md +++ b/docs/README-de.md @@ -301,7 +301,7 @@ enthält weitere Details. Bei offenen Fragen kann über die im Abschnitt * [Thomas Frei](https://github.com/thfrei) für seine originelle Arbeit an Canvas. * [antoniotejada](https://github.com/nriver) für das ursprüngliche - Syntax-Highlighting-Widget. + Syntaxhervorhebungs-Widget. * [Dosu](https://dosu.dev/) für die Bereitstellung automatisierter Antworten auf GitHub-Issues und Diskussionen. * [Tabler-Icons](https://tabler.io/icons) für die Symbole in der Taskleiste. From 4cdf6d82926820de405ff2ba3885caa0fda662f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Sanchez=20Castell=C3=B3n?= Date: Mon, 26 Jan 2026 01:17:51 +0100 Subject: [PATCH 143/316] Translated using Weblate (Spanish) Currently translated at 94.2% (1662 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/ --- .../src/translations/es/translation.json | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/apps/client/src/translations/es/translation.json b/apps/client/src/translations/es/translation.json index b9aa2a0178..5ba611b671 100644 --- a/apps/client/src/translations/es/translation.json +++ b/apps/client/src/translations/es/translation.json @@ -704,7 +704,10 @@ "open_note_on_server": "Abrir nota en servidor", "view_revisions": "Revisiones de la nota...", "advanced": "Avanzado", - "export_as_image": "Exportar como imagen" + "export_as_image": "Exportar como imagen", + "export_as_image_png": "PNG (ráster)", + "export_as_image_svg": "SVG (vectorial)", + "note_map": "Mapa de la nota" }, "onclick_button": { "no_click_handler": "El widget de botón '{{componentId}}' no tiene un controlador de clics definido" @@ -766,7 +769,13 @@ "reset-default": "Restablecer a icono por defecto", "search_placeholder_one": "Buscar {{number}} icono a través de {{count}} paquetes", "search_placeholder_many": "Buscar {{number}} iconos a través de {{count}} paquetes", - "search_placeholder_other": "Buscar {{number}} iconos a través de {{count}} paquetes" + "search_placeholder_other": "Buscar {{number}} iconos a través de {{count}} paquetes", + "search_placeholder_filtered": "Buscar {{number}} iconos en {{name}}", + "filter": "Filtro", + "filter-none": "Todos los iconos", + "filter-default": "Iconos predeterminados", + "icon_tooltip": "{{name}}\nPaquete de iconos: {{iconPack}}", + "no_results": "No se encontraron iconos." }, "basic_properties": { "note_type": "Tipo de nota", @@ -793,7 +802,8 @@ "expand_tooltip": "Expande las notas hijas inmediatas de esta colección (un nivel). Para más opciones, pulsa la flecha a la derecha.", "expand_first_level": "Expandir hijos inmediatos", "expand_nth_level": "Expandir {{depth}} niveles", - "expand_all_levels": "Expandir todos los niveles" + "expand_all_levels": "Expandir todos los niveles", + "hide_child_notes": "Ocultar notas hijas en el árbol" }, "edited_notes": { "no_edited_notes_found": "Aún no hay notas editadas en este día...", @@ -826,7 +836,8 @@ }, "inherited_attribute_list": { "title": "Atributos heredados", - "no_inherited_attributes": "Sin atributos heredados." + "no_inherited_attributes": "Sin atributos heredados.", + "none": "ninguno" }, "note_info_widget": { "note_id": "ID de nota", @@ -837,7 +848,8 @@ "note_size_info": "El tamaño de la nota proporciona una estimación aproximada de los requisitos de almacenamiento para esta nota. Toma en cuenta el contenido de la nota y el contenido de sus revisiones de nota.", "calculate": "calcular", "subtree_size": "(tamaño del subárbol: {{size}} en {{count}} notas)", - "title": "Información de nota" + "title": "Información de nota", + "mime": "Tipo MIME" }, "note_map": { "open_full": "Ampliar al máximo", From 4979a1b22415bc5ca16b3b18a58d6a2feb02a431 Mon Sep 17 00:00:00 2001 From: MarcelWie Date: Mon, 26 Jan 2026 01:40:20 +0100 Subject: [PATCH 144/316] Translated using Weblate (German) Currently translated at 100.0% (1763 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/ --- apps/client/src/translations/de/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index d75ce7a5d4..a5b83e24ae 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -1701,7 +1701,7 @@ }, "code_block": { "word_wrapping": "Wortumbruch", - "theme_none": "Keine Syntax-Hervorhebung", + "theme_none": "Keine Syntaxhervorhebung", "theme_group_light": "Helle Themen", "theme_group_dark": "Dunkle Themen", "copy_title": "Kopiere in Zwischenablage" From a24ab7ca06b70c3593b1edb254530792ea95be11 Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 06:13:57 +0100 Subject: [PATCH 145/316] Translated using Weblate (Indonesian) Currently translated at 16.4% (25 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/id/ --- apps/website/src/translations/id/translation.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/id/translation.json b/apps/website/src/translations/id/translation.json index 6c8074293a..ca3c632965 100644 --- a/apps/website/src/translations/id/translation.json +++ b/apps/website/src/translations/id/translation.json @@ -18,6 +18,18 @@ "title": "Organisasi", "note_structure_title": "Struktur catatan", "note_structure_description": "Catatan dapat disusun secara hirarkis. Tidak perlu folder, karena setiap catatan dapat mengandung catatan anak. Satu catatan dapat ditambah di beberapa tempat sekaligus dalam hirarki.", - "attributes_title": "Label dan hubungan catatan" + "attributes_title": "Label dan hubungan catatan", + "attributes_description": "Gunakan relasi antar catatan atau tambahkan label untuk kategorisasi yang mudah. Gunakan atribut utama untuk memasukkan informasi terstruktur yang dapat digunakan dalam tabel atau papan (boards).", + "hoisting_title": "Workspace dan Area Fokus", + "hoisting_description": "Dengan mudah memisahkan catatan personal dan kerjaan dengan grouping dalam workspace, fokus hanya ke catatan-catatan yang spesifik di workspace tertentu." + }, + "productivity_benefits": { + "title": "Produktivitas dan Keamanan", + "revisions_title": "Revisi Catatan", + "revisions_content": "Catatan akan secara periodik disimpan dalam bentuk revisi secara otomatis dan versi revisi-revisi bisa digunakan untuk mengulas kembali atau melakukan undo jika ada kesalahan atau perubahan yang tidak disengaja. Versi revisi juga bisa dibuat sesuai kebutuhan.", + "sync_title": "Sinkronisasi", + "sync_content": "Gunakan hostinganmu sendiri atau instansi cloud untuk sinkronisasi mudah catatan-catatan anda pada beberapa perangkat, dan untuk akses dari ponsel anda dengan PWA.", + "search_content": "Atau cari teks di dalam catatan lalu lebih dalam dengan cari catatan induk, atau berdasarkan kedalaman.", + "web_clipper_title": "Penyemat Web" } } From a0e6023810065e12fe504901c349ccfb2dd74e24 Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 06:16:16 +0100 Subject: [PATCH 146/316] Translated using Weblate (Indonesian) Currently translated at 23.2% (27 of 116 strings) Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/id/ --- docs/README-id.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/docs/README-id.md b/docs/README-id.md index 3a74efc087..5949b27702 100644 --- a/docs/README-id.md +++ b/docs/README-id.md @@ -69,19 +69,20 @@ Dokumentasi kami tersedia dalam berbagai format: ## 🎁 Fitur -* Notes can be arranged into arbitrarily deep tree. Single note can be placed - into multiple places in the tree (see - [cloning](https://docs.triliumnotes.org/user-guide/concepts/notes/cloning)) -* Rich WYSIWYG note editor including e.g. tables, images and - [math](https://docs.triliumnotes.org/user-guide/note-types/text) with markdown +* Catatan dapat disusun menjadi cabang pohon manapun. Satu catatan dapat disusun + ke beberapa cabang di pohon + (lihat[cloning](https://docs.triliumnotes.org/user-guide/concepts/notes/cloning)) +* Catatan bentuk Rich WYSIWYG dengan tabel, gambar, dan + [math](https://docs.triliumnotes.org/user-guide/note-types/text) dengan + markdown [autoformat](https://docs.triliumnotes.org/user-guide/note-types/text/markdown-formatting) -* Support for editing [notes with source - code](https://docs.triliumnotes.org/user-guide/note-types/code), including - syntax highlighting -* Fast and easy [navigation between - notes](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation), - full text search and [note - hoisting](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting) +* Dukungan untuk peng-editan [catatan dengan kode + source](https://docs.triliumnotes.org/user-guide/note-types/code), termasuk + penyorotan sintaks +* Cepat dan mudah [navigasi antar + catatan](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation), + pencarian dengan teks dan [area + fokus](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting) * Seamless [note versioning](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions) * Note @@ -95,10 +96,10 @@ Dokumentasi kami tersedia dalam berbagai format: more secure login * [Synchronization](https://docs.triliumnotes.org/user-guide/setup/synchronization) with self-hosted sync server - * there are [3rd party services for hosting synchronisation - server](https://docs.triliumnotes.org/user-guide/setup/server/cloud-hosting) -* [Sharing](https://docs.triliumnotes.org/user-guide/advanced-usage/sharing) - (publishing) notes to public internet + * ada [servis pihak ke-3 untuk server hostingan + sinkronisasi](https://docs.triliumnotes.org/user-guide/setup/server/cloud-hosting) +* [Bagikan](https://docs.triliumnotes.org/user-guide/advanced-usage/sharing) + (publikasi) catatan ke publik (internet) * Strong [note encryption](https://docs.triliumnotes.org/user-guide/concepts/notes/protected-notes) with per-note granularity From 6a70c52bd16367f00f105c6a96e21c3d3736ddd3 Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 06:14:58 +0100 Subject: [PATCH 147/316] Translated using Weblate (Indonesian) Currently translated at 1.3% (24 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/id/ --- apps/client/src/translations/id/translation.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/id/translation.json b/apps/client/src/translations/id/translation.json index 3b63a0c24f..3e84959765 100644 --- a/apps/client/src/translations/id/translation.json +++ b/apps/client/src/translations/id/translation.json @@ -26,11 +26,19 @@ "widget-list-error": { "title": "Gagal mendapatkan daftar widget dari server" }, - "open-script-note": "Buka skrip catatan" + "open-script-note": "Buka skrip catatan", + "widget-render-error": { + "title": "Gagal render widget React custom" + }, + "widget-missing-parent": "Widget custom '{{property}}' tidak terdefinisi.\n\nJika skrip ini bermaksud untuk bisa dijalankan tanpa elemen UI, gunakanlah '#run=frontendStartup'.", + "scripting-error": "Skrip custom eror : {{title}}" }, "add_link": { "add_link": "Tambah tautan", "help_on_links": "Bantuan pada tautan", "note": "Catatan" + }, + "branch_prefix": { + "edit_branch_prefix_multiple": "Edit prefiks cabang untuk {{count}} cabang" } } From 1c215199602eec8dc3253a835130f702eb254970 Mon Sep 17 00:00:00 2001 From: "Francis C." Date: Mon, 26 Jan 2026 03:26:19 +0100 Subject: [PATCH 148/316] Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (1763 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/ --- apps/client/src/translations/tw/translation.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json index aa57306ed5..d4ef14f53a 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -1566,6 +1566,7 @@ "shared-indicator-tooltip": "此筆記已公開分享", "shared-indicator-tooltip-with-url": "此筆記已公開分享至:{{- url}}", "subtree-hidden-tooltip_one": "從樹中隱藏的 {{count}} 篇子筆記", + "subtree-hidden-tooltip_other": "", "subtree-hidden-moved-title": "已新增至 {{title}}", "subtree-hidden-moved-description-collection": "此集合隱藏其樹中的子筆記。", "subtree-hidden-moved-description-other": "子筆記隱藏於此筆記的樹中。" @@ -1602,7 +1603,11 @@ "configure_launchbar": "設定啟動欄" }, "sql_result": { - "no_rows": "此次查詢沒有返回任何數據" + "no_rows": "此次查詢沒有返回任何數據", + "not_executed": "查詢尚未執行。", + "failed": "SQL 查詢執行失敗", + "statement_result": "查詢結果", + "execute_now": "立即執行" }, "sql_table_schemas": { "tables": "表" From 4cac419a2682d70c64b783e8f774e27f4cd9b088 Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 06:35:42 +0100 Subject: [PATCH 149/316] Translated using Weblate (Indonesian) Currently translated at 31.0% (36 of 116 strings) Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/id/ --- docs/README-id.md | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/docs/README-id.md b/docs/README-id.md index 5949b27702..2d9e1d527c 100644 --- a/docs/README-id.md +++ b/docs/README-id.md @@ -100,26 +100,28 @@ Dokumentasi kami tersedia dalam berbagai format: sinkronisasi](https://docs.triliumnotes.org/user-guide/setup/server/cloud-hosting) * [Bagikan](https://docs.triliumnotes.org/user-guide/advanced-usage/sharing) (publikasi) catatan ke publik (internet) -* Strong [note - encryption](https://docs.triliumnotes.org/user-guide/concepts/notes/protected-notes) - with per-note granularity -* Sketching diagrams, based on [Excalidraw](https://excalidraw.com/) (note type - "canvas") -* [Relation - maps](https://docs.triliumnotes.org/user-guide/note-types/relation-map) and - [note/link maps](https://docs.triliumnotes.org/user-guide/note-types/note-map) - for visualizing notes and their relations -* Mind maps, based on [Mind Elixir](https://docs.mind-elixir.com/) -* [Geo maps](https://docs.triliumnotes.org/user-guide/collections/geomap) with - location pins and GPX tracks -* [Scripting](https://docs.triliumnotes.org/user-guide/scripts) - see [Advanced - showcases](https://docs.triliumnotes.org/user-guide/advanced-usage/advanced-showcases) -* [REST API](https://docs.triliumnotes.org/user-guide/advanced-usage/etapi) for - automation -* Scales well in both usability and performance upwards of 100 000 notes -* Touch optimized [mobile - frontend](https://docs.triliumnotes.org/user-guide/setup/mobile-frontend) for - smartphones and tablets +* Kuat [enkripsi + catatan](https://docs.triliumnotes.org/user-guide/concepts/notes/protected-notes) + dengan granularitas per catatan +* Membuat diagram, berdasarkan [Excalidraw](https://excalidraw.com/) (tipe + catatan "kanvas") +* [Peta + relasi](https://docs.triliumnotes.org/user-guide/note-types/relation-map) dan + [peta + catatan/link](https://docs.triliumnotes.org/user-guide/note-types/note-map) + untuk visualisasi relasi antar catatan. +* Mind maps, berdasarkan [Mind Elixir](https://docs.mind-elixir.com/) +* [Peta geolokasi](https://docs.triliumnotes.org/user-guide/collections/geomap) + dengan titik lokasi dan jalur GPX +* [Pengunaan skrip](https://docs.triliumnotes.org/user-guide/scripts) - lihat + [Demo tingkat + lanjut](https://docs.triliumnotes.org/user-guide/advanced-usage/advanced-showcases) +* [REST API](https://docs.triliumnotes.org/user-guide/advanced-usage/etapi) + untuk otomatisasi +* Performa dan Usabilitas tinggi, bahkan di atas 100 000 catatan +* Teroptimisasi untuk kontrol sentuh [frontend + mobile](https://docs.triliumnotes.org/user-guide/setup/mobile-frontend) untuk + hp dan tablet * Built-in [dark theme](https://docs.triliumnotes.org/user-guide/concepts/themes), support for user themes From d84411118799880b4a0cd40615431a16355fc05c Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 06:34:54 +0100 Subject: [PATCH 150/316] Translated using Weblate (Indonesian) Currently translated at 22.3% (34 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/id/ --- apps/website/src/translations/id/translation.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/id/translation.json b/apps/website/src/translations/id/translation.json index ca3c632965..52e1cd2faf 100644 --- a/apps/website/src/translations/id/translation.json +++ b/apps/website/src/translations/id/translation.json @@ -30,6 +30,17 @@ "sync_title": "Sinkronisasi", "sync_content": "Gunakan hostinganmu sendiri atau instansi cloud untuk sinkronisasi mudah catatan-catatan anda pada beberapa perangkat, dan untuk akses dari ponsel anda dengan PWA.", "search_content": "Atau cari teks di dalam catatan lalu lebih dalam dengan cari catatan induk, atau berdasarkan kedalaman.", - "web_clipper_title": "Penyemat Web" + "web_clipper_title": "Penyemat Web", + "web_clipper_content": "Mengambil halaman web (atau foto halaman web) dan disematkan langsung ke catatan Trilium dengan ekstensi browser penyemat web." + }, + "note_types": { + "title": "Cara-cara menampilkan informasi Anda", + "text_title": "Catatan teks", + "text_description": "Catatan-catatan ini diedit dengan editor visual (WYSIWYG), dengan dukungan tabel, gambar, ekspresi matematika, blok kode dengan penyorotan sintaks. Format teks catatan anda dengan sintaks Markdown atau gunakan fungsi panggilan slash(/).", + "code_title": "Catatan kode", + "code_description": "Gunakan editor khusus untuk kode source yang besar yang mempunyai penyorotan sintaks untuk banyak bahasa pemograman dengan tema-tema warna yang bervariasi.", + "file_title": "Catatan file", + "file_description": "Sematkan file multimedia (PDF, gambar, video) dengan pratinjau dalam aplikasi.", + "canvas_title": "Kanvas" } } From fbcf974c739d12a27e50605744b0f318c6d060cc Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 06:34:53 +0100 Subject: [PATCH 151/316] Translated using Weblate (Indonesian) Currently translated at 1.8% (33 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/id/ --- apps/client/src/translations/id/translation.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/id/translation.json b/apps/client/src/translations/id/translation.json index 3e84959765..407966304a 100644 --- a/apps/client/src/translations/id/translation.json +++ b/apps/client/src/translations/id/translation.json @@ -39,6 +39,17 @@ "note": "Catatan" }, "branch_prefix": { - "edit_branch_prefix_multiple": "Edit prefiks cabang untuk {{count}} cabang" + "edit_branch_prefix_multiple": "Edit prefiks cabang untuk {{count}} cabang", + "help_on_tree_prefix": "Bantuan pada prefiks pohon catatan", + "prefix": "Prefiks: ", + "save": "Simpan", + "branch_prefix_saved": "Prefiks cabang telah disimpan.", + "branch_prefix_saved_multiple": "Prefix cabang telah disimpan pada {{count}} cabang.", + "affected_branches": "Cabang terdampak ({{count}}):" + }, + "bulk_actions": { + "bulk_actions": "Aksi borongan", + "affected_notes": "Catatan terdampak", + "include_descendants": "Sertakan anakan dari catatan yang dipilih" } } From 5b10e33e72ae7015399b7b9fa35fe25453947b21 Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 07:29:12 +0100 Subject: [PATCH 152/316] Translated using Weblate (Indonesian) Currently translated at 32.2% (49 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/id/ --- .../src/translations/id/translation.json | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/id/translation.json b/apps/website/src/translations/id/translation.json index 52e1cd2faf..31f4f55781 100644 --- a/apps/website/src/translations/id/translation.json +++ b/apps/website/src/translations/id/translation.json @@ -41,6 +41,25 @@ "code_description": "Gunakan editor khusus untuk kode source yang besar yang mempunyai penyorotan sintaks untuk banyak bahasa pemograman dengan tema-tema warna yang bervariasi.", "file_title": "Catatan file", "file_description": "Sematkan file multimedia (PDF, gambar, video) dengan pratinjau dalam aplikasi.", - "canvas_title": "Kanvas" + "canvas_title": "Kanvas", + "canvas_description": "Susun bentuk, gambar, dan teks di atas kanvas tak terbatas menggunakan teknologi yang sama dengan excalidraw.com. Sangat ideal untuk diagram, sketsa, dan perencanaan visual.", + "mermaid_title": "Diagram mermaid", + "mermaid_description": "Buat diagram seperti diagram alur (flowchart), diagram kelas & urutan (class & sequence), bagan Gantt, dan banyak lagi, menggunakan sintaks Mermaid.", + "mindmap_title": "Peta pikiran (Mindmap)", + "mindmap_description": "Organisasikan pemikiran Anda secara visual atau lakukan sesi brainstorming.", + "others_list": "dan lainnya: <0>peta catatan, <1>peta relasi, <2>pencarian tersimpan, <3>render catatan, dan <4>tampilan web." + }, + "collections": { + "table_description": "Tampilkan dan edit informasi catatan dalam struktur tabel, dengan berbagai tipe kolom seperti teks, angka, kotak centang, tanggal & waktu, tautan, dan warna, serta dukungan untuk relasi catatan. Secara opsional, tampilkan catatan dalam hierarki pohon di dalam tabel.", + "board_title": "Papan Kanban", + "board_description": "Atur tugas atau status proyek Anda ke dalam papan Kanban dengan cara mudah untuk membuat item dan kolom baru, serta mengubah statusnya cukup dengan menyeretnya di sepanjang papan.", + "geomap_title": "Peta Geo", + "geomap_description": "Rencanakan liburan Anda atau tandai titik minat langsung pada peta geografis menggunakan penanda titik yang dapat disesuaikan. Tampilkan rekaman jalur GPX untuk melacak rencana perjalanan.", + "presentation_title": "Presentasi", + "presentation_description": "Atur informasi ke dalam slide dan presentasikan dalam layar penuh dengan transisi yang mulus. Slide juga dapat diekspor ke PDF agar mudah dibagikan." + }, + "faq": { + "title": "Tanya Jawab", + "mobile_question": "Apakah ada aplikasi mobile?" } } From 784ea240cabf69fe9fbb080e9da388209cefa7f2 Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 07:29:20 +0100 Subject: [PATCH 153/316] Translated using Weblate (Indonesian) Currently translated at 42.2% (49 of 116 strings) Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/id/ --- docs/README-id.md | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/README-id.md b/docs/README-id.md index 2d9e1d527c..bed5e9a6ca 100644 --- a/docs/README-id.md +++ b/docs/README-id.md @@ -122,15 +122,14 @@ Dokumentasi kami tersedia dalam berbagai format: * Teroptimisasi untuk kontrol sentuh [frontend mobile](https://docs.triliumnotes.org/user-guide/setup/mobile-frontend) untuk hp dan tablet -* Built-in [dark - theme](https://docs.triliumnotes.org/user-guide/concepts/themes), support for - user themes +* [tema gelap](https://docs.triliumnotes.org/user-guide/concepts/themes) bawaan, + dukungan untuk tema personal pengguna * [Evernote](https://docs.triliumnotes.org/user-guide/concepts/import-export/evernote) - and [Markdown import & - export](https://docs.triliumnotes.org/user-guide/concepts/import-export/markdown) -* [Web Clipper](https://docs.triliumnotes.org/user-guide/setup/web-clipper) for - easy saving of web content -* Customizable UI (sidebar buttons, user-defined widgets, ...) + dan [impor & ekspor + markdown](https://docs.triliumnotes.org/user-guide/concepts/import-export/markdown) +* [Penyemat Web](https://docs.triliumnotes.org/user-guide/setup/web-clipper) + untuk memudahkan pencatatan konten web +* "UI yang dapat dikustomisasi (tombol sidebar, widget kustom, ...)" * [Metrics](https://docs.triliumnotes.org/user-guide/advanced-usage/metrics), along with a Grafana Dashboard. @@ -175,29 +174,30 @@ features, suggestions, or issues you may have! - [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug reports and feature requests.) -## 🏗 Installation +## 🏗 Instalasi ### Windows / MacOS -Download the binary release for your platform from the [latest release -page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package -and run the `trilium` executable. +Unduh rilis biner untuk platform Anda dari [halaman rilis +terbaru](https://github.com/TriliumNext/Trilium/releases/latest), ekstrak +package dan jalankan file executable `trilium`. ### Linux -If your distribution is listed in the table below, use your distribution's -package. +Jika distribusi Anda tercantum dalam tabel di bawah ini, gunakan package dari +distribusi Anda tersebut. -[![Packaging -status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) +[![Status +packaging](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) -You may also download the binary release for your platform from the [latest -release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the -package and run the `trilium` executable. +Anda juga dapat mengunduh rilis biner untuk platform Anda dari [halaman rilis +terbaru](https://github.com/TriliumNext/Trilium/releases/latest), ekstrak +package-nya dan jalankan file executable `trilium`. -TriliumNext is also provided as a Flatpak, but not yet published on FlatHub. +TriliumNext juga tersedia sebagai Flatpak, namun belum dipublikasikan di +FlatHub. -### Browser (any OS) +### Browser (OS apapun) If you use a server installation (see below), you can directly access the web interface (which is almost identical to the desktop app). From 2e86166400a819fb4d807f81d628916fb6553097 Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 07:16:41 +0100 Subject: [PATCH 154/316] Translated using Weblate (Indonesian) Currently translated at 21.3% (83 of 388 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/id/ --- apps/server/src/assets/translations/id/server.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/assets/translations/id/server.json b/apps/server/src/assets/translations/id/server.json index f4a6541232..9a72e86d85 100644 --- a/apps/server/src/assets/translations/id/server.json +++ b/apps/server/src/assets/translations/id/server.json @@ -59,7 +59,7 @@ "show-backend-log": "Buka halaman \"Log Backend\"", "show-help": "Buka Panduan Pengguna bawaan", "show-cheatsheet": "Menampilkan modal dengan operasi keyboard umum", - "text-note-operations": "Operasi catatan teks", + "text-note-operations": "Tindakan catatan teks", "add-link-to-text": "Buka dialog untuk menambahkan tautan ke teks", "follow-link-under-cursor": "Ikuti tautan tempat tanda sisipan ditempatkan", "insert-date-and-time-to-text": "Masukkan tanggal & waktu saat ini ke dalam teks", From be8dda85236cdc0a1febede224a8dd43cd7b356f Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 07:28:58 +0100 Subject: [PATCH 155/316] Translated using Weblate (Indonesian) Currently translated at 2.6% (47 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/id/ --- .../src/translations/id/translation.json | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/id/translation.json b/apps/client/src/translations/id/translation.json index 407966304a..3a3b8991e7 100644 --- a/apps/client/src/translations/id/translation.json +++ b/apps/client/src/translations/id/translation.json @@ -50,6 +50,24 @@ "bulk_actions": { "bulk_actions": "Aksi borongan", "affected_notes": "Catatan terdampak", - "include_descendants": "Sertakan anakan dari catatan yang dipilih" + "include_descendants": "Sertakan anakan dari catatan yang dipilih", + "available_actions": "Pilihan aksi", + "chosen_actions": "Aksi terpilih", + "execute_bulk_actions": "Eksekusi aksi borongan", + "bulk_actions_executed": "Aksi borongan telah di eksekusi dengan sukses.", + "none_yet": "Belum ada... tambahkan aksi dengan memilih salah satu dari aksi di atas.", + "labels": "Label-label" + }, + "confirm": { + "cancel": "Batal", + "ok": "Oke", + "are_you_sure_remove_note": "Apakah anda yakin mau membuang catatan \"{{title}}\" dari peta relasi? ", + "if_you_dont_check": "Jika Anda tidak mencentang ini, catatan hanya akan dihapus dari peta relasi.", + "also_delete_note": "Hapus juga catatannya" + }, + "delete_notes": { + "delete_notes_preview": "Hapus pratinjau catatan", + "close": "Tutup", + "delete_all_clones_description": "Hapus seluruh duplikat (bisa dikembalikan di menu revisi)" } } From 3ba853dbad871be30b5478ee3ca1742ccfe9573e Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 08:12:00 +0100 Subject: [PATCH 156/316] Translated using Weblate (Indonesian) Currently translated at 2.8% (51 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/id/ --- apps/client/src/translations/id/translation.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/client/src/translations/id/translation.json b/apps/client/src/translations/id/translation.json index 3a3b8991e7..8c0e154099 100644 --- a/apps/client/src/translations/id/translation.json +++ b/apps/client/src/translations/id/translation.json @@ -11,7 +11,7 @@ }, "toast": { "critical-error": { - "title": "Kesalahan kritis", + "title": "Eror kritikal", "message": "Telah terjadi kesalahan kritis yang mencegah aplikasi klien untuk memulai:\n\n{{message}}\n\nHal ini kemungkinan besar disebabkan oleh skrip yang gagal secara tidak terduga. Coba jalankan aplikasi dalam mode aman dan atasi masalahnya." }, "widget-error": { @@ -68,6 +68,10 @@ "delete_notes": { "delete_notes_preview": "Hapus pratinjau catatan", "close": "Tutup", - "delete_all_clones_description": "Hapus seluruh duplikat (bisa dikembalikan di menu revisi)" + "delete_all_clones_description": "Hapus seluruh duplikat (bisa dikembalikan di menu revisi)", + "erase_notes_description": "Penghapusan normal hanya menandai catatan sebagai dihapus dan dapat dipulihkan (melalui dialog versi revisi) dalam jangka waktu tertentu. Mencentang opsi ini akan menghapus catatan secara permanen seketika dan catatan tidak akan bisa dipulihkan kembali.", + "erase_notes_warning": "Hapus catatan secara permanen (tidak bisa dikembalikan), termasuk semua duplikat. Aksi akan memaksa aplikasi untuk mengulang kembali.", + "notes_to_be_deleted": "Catatan-catatan berikut akan dihapuskan ({{notesCount}})", + "no_note_to_delete": "Tidak ada Catatan yang akan dihapus (hanya duplikat)." } } From 5629b9a1618f79ede0dee93645ee5914a8a2044e Mon Sep 17 00:00:00 2001 From: Toto Yullian Date: Mon, 26 Jan 2026 08:04:02 +0100 Subject: [PATCH 157/316] Translated using Weblate (Indonesian) Currently translated at 2.8% (51 of 1763 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/id/ --- apps/client/src/translations/id/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/translations/id/translation.json b/apps/client/src/translations/id/translation.json index 8c0e154099..209c25c48c 100644 --- a/apps/client/src/translations/id/translation.json +++ b/apps/client/src/translations/id/translation.json @@ -21,7 +21,7 @@ }, "bundle-error": { "title": "Gagal memuat skrip kustom", - "message": "Skrip tidak dapat dijalankan karena:\n\n{{message}}" + "message": "Skrip tidak dapat dijalankan:\n\n{{message}}" }, "widget-list-error": { "title": "Gagal mendapatkan daftar widget dari server" From d8c7c919d1f49334669c36fe15505975695668b3 Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 08:04:36 +0100 Subject: [PATCH 158/316] Translated using Weblate (Indonesian) Currently translated at 44.8% (52 of 116 strings) Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/id/ --- docs/README-id.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/README-id.md b/docs/README-id.md index bed5e9a6ca..9d31c1941c 100644 --- a/docs/README-id.md +++ b/docs/README-id.md @@ -109,7 +109,7 @@ Dokumentasi kami tersedia dalam berbagai format: relasi](https://docs.triliumnotes.org/user-guide/note-types/relation-map) dan [peta catatan/link](https://docs.triliumnotes.org/user-guide/note-types/note-map) - untuk visualisasi relasi antar catatan. + untuk visualisasi relasi antar catatan * Mind maps, berdasarkan [Mind Elixir](https://docs.mind-elixir.com/) * [Peta geolokasi](https://docs.triliumnotes.org/user-guide/collections/geomap) dengan titik lokasi dan jalur GPX @@ -199,13 +199,12 @@ FlatHub. ### Browser (OS apapun) -If you use a server installation (see below), you can directly access the web -interface (which is almost identical to the desktop app). +Jika Anda menggunakan instalasi server (lihat di bawah), Anda dapat langsung +mengakses antarmuka web (yang hampir identik dengan aplikasi desktop). -Currently only the latest versions of Chrome & Firefox are supported (and -tested). +Saat ini hanya Chrome & Firefox versi terbaru yang didukung (dan telah diuji). -### Mobile +### Ponsel To use TriliumNext on a mobile device, you can use a mobile web browser to access the mobile interface of a server installation (see below). From 671e05421ab14b6358a1bf62c3f2a897b67716e9 Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 08:01:03 +0100 Subject: [PATCH 159/316] Translated using Weblate (Indonesian) Currently translated at 34.8% (53 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/id/ --- apps/website/src/translations/id/translation.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/id/translation.json b/apps/website/src/translations/id/translation.json index 31f4f55781..b8c02bc97d 100644 --- a/apps/website/src/translations/id/translation.json +++ b/apps/website/src/translations/id/translation.json @@ -60,6 +60,10 @@ }, "faq": { "title": "Tanya Jawab", - "mobile_question": "Apakah ada aplikasi mobile?" + "mobile_question": "Apakah ada aplikasi mobile?", + "mobile_answer": "Saat ini belum ada aplikasi mobile resmi. Namun, jika Anda memiliki server, Anda dapat mengaksesnya menggunakan browser web dan bahkan menginstalnya sebagai PWA. Untuk Android, tersedia aplikasi tidak resmi bernama TriliumDroid yang dapat bekerja secara offline (sama seperti aplikasi desktop).", + "database_question": "Di manakah data disimpan?", + "database_answer": "Semua catatan Anda akan disimpan dalam basis data SQLite di dalam sebuah folder aplikasi. Alasan mengapa Trilium menggunakan basis data alih-alih file teks biasa adalah demi performa dan karena beberapa fitur akan jauh lebih sulit untuk diterapkan, seperti klon (catatan yang sama di beberapa tempat dalam hierarki). Untuk menemukan folder aplikasinya, cukup buka jendela 'Tentang'.", + "server_question": "Apakah saya butuh server untuk menjalankan Trilium?" } } From a6e8e2a127e6ebba73a62210aeee67511873f21b Mon Sep 17 00:00:00 2001 From: Jason Kuanca Date: Mon, 26 Jan 2026 08:02:04 +0100 Subject: [PATCH 160/316] Translated using Weblate (Indonesian) Currently translated at 21.6% (84 of 388 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/id/ --- apps/server/src/assets/translations/id/server.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/assets/translations/id/server.json b/apps/server/src/assets/translations/id/server.json index 9a72e86d85..52cf7e0415 100644 --- a/apps/server/src/assets/translations/id/server.json +++ b/apps/server/src/assets/translations/id/server.json @@ -71,7 +71,7 @@ "add-new-label": "Buat label baru", "create-new-relation": "Buat relasi baru", "ribbon-tabs": "Tab pita", - "toggle-basic-properties": "Alihkan Properti Dasar", + "toggle-basic-properties": "Tampilkan/Sembunyikan Properti Dasar", "toggle-file-properties": "Alihkan Properti File", "toggle-image-properties": "Alihkan Properti Gambar", "toggle-owned-attributes": "Alihkan Atribut yang Dimiliki", From 442aac0466002c382729f73a4879496d212c1367 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 26 Jan 2026 17:10:29 +0100 Subject: [PATCH 161/316] Update translation files Updated by "Cleanup translation files" add-on in Weblate. Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ --- docs/README-id.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/README-id.md b/docs/README-id.md index 9d31c1941c..acaa46396d 100644 --- a/docs/README-id.md +++ b/docs/README-id.md @@ -83,17 +83,17 @@ Dokumentasi kami tersedia dalam berbagai format: catatan](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation), pencarian dengan teks dan [area fokus](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting) -* Seamless [note - versioning](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions) -* Note - [attributes](https://docs.triliumnotes.org/user-guide/advanced-usage/attributes) - can be used for note organization, querying and advanced - [scripting](https://docs.triliumnotes.org/user-guide/scripts) +* Mulus [versi + catatan](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions) +* Catatan + [atribut](https://docs.triliumnotes.org/user-guide/advanced-usage/attributes) + dapat digunakan untuk mengatur catatan, pencarian dan tingkat lanjut + [pemrograman](https://docs.triliumnotes.org/user-guide/scripts) * Antarmuka pengguna tersedia dalam bahasa Inggris, Jerman, Spanyol, Prancis, Rumania, dan Tionghoa (sederhana dan tradisional) -* Direct [OpenID and TOTP - integration](https://docs.triliumnotes.org/user-guide/setup/server/mfa) for - more secure login +* Integrasi [OpenID dan TOTP + langsung](https://docs.triliumnotes.org/user-guide/setup/server/mfa) untuk + login yang lebih aman * [Synchronization](https://docs.triliumnotes.org/user-guide/setup/synchronization) with self-hosted sync server * ada [servis pihak ke-3 untuk server hostingan From 810563b3f998cfa6b9721f72d75ce9ad6890fa7b Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 26 Jan 2026 19:21:19 +0200 Subject: [PATCH 162/316] fix(web-clipper): duplicate context menu error --- .../entrypoints/background/context_menu.ts | 42 +++++++++++++++++++ .../entrypoints/background/index.ts | 39 ++--------------- 2 files changed, 45 insertions(+), 36 deletions(-) create mode 100644 apps/web-clipper/entrypoints/background/context_menu.ts diff --git a/apps/web-clipper/entrypoints/background/context_menu.ts b/apps/web-clipper/entrypoints/background/context_menu.ts new file mode 100644 index 0000000000..6685651fbd --- /dev/null +++ b/apps/web-clipper/entrypoints/background/context_menu.ts @@ -0,0 +1,42 @@ +const CONTEXT_MENU_ITEMS: Browser.contextMenus.CreateProperties[] = [ + { + id: "trilium-save-selection", + title: "Save selection to Trilium", + contexts: ["selection"] + }, + { + id: "trilium-save-cropped-screenshot", + title: "Crop screen shot to Trilium", + contexts: ["page"] + }, + { + id: "trilium-save-whole-screenshot", + title: "Save whole screen shot to Trilium", + contexts: ["page"] + }, + { + id: "trilium-save-page", + title: "Save whole page to Trilium", + contexts: ["page"] + }, + { + id: "trilium-save-link", + title: "Save link to Trilium", + contexts: ["link"] + }, + { + id: "trilium-save-image", + title: "Save image to Trilium", + contexts: ["image"] + } +]; + +export default function setupContextMenu() { + // Context menu items need to be registered only once. + // https://stackoverflow.com/questions/64318529/cannot-create-item-with-duplicate-context-menu-id-in-extension + browser.runtime.onInstalled.addListener(() => { + for (const item of CONTEXT_MENU_ITEMS) { + browser.contextMenus.create(item); + } + }); +} diff --git a/apps/web-clipper/entrypoints/background/index.ts b/apps/web-clipper/entrypoints/background/index.ts index 8657ee5117..7d99abc997 100644 --- a/apps/web-clipper/entrypoints/background/index.ts +++ b/apps/web-clipper/entrypoints/background/index.ts @@ -1,5 +1,6 @@ import { randomString, Rect } from "@/utils"; +import setupContextMenu from "./context_menu"; import TriliumServerFacade from "./trilium_server_facade"; type BackgroundMessage = { @@ -40,6 +41,8 @@ export default defineBackground(() => { } }); + setupContextMenu(); + function cropImageManifestV2(newArea: Rect, dataUrl: string) { return new Promise((resolve, reject) => { const img = new Image(); @@ -115,42 +118,6 @@ export default defineBackground(() => { return await browser.tabs.captureVisibleTab({ format: 'png' }); } - browser.contextMenus.create({ - id: "trilium-save-selection", - title: "Save selection to Trilium", - contexts: ["selection"] - }); - - browser.contextMenus.create({ - id: "trilium-save-cropped-screenshot", - title: "Crop screen shot to Trilium", - contexts: ["page"] - }); - - browser.contextMenus.create({ - id: "trilium-save-whole-screenshot", - title: "Save whole screen shot to Trilium", - contexts: ["page"] - }); - - browser.contextMenus.create({ - id: "trilium-save-page", - title: "Save whole page to Trilium", - contexts: ["page"] - }); - - browser.contextMenus.create({ - id: "trilium-save-link", - title: "Save link to Trilium", - contexts: ["link"] - }); - - browser.contextMenus.create({ - id: "trilium-save-image", - title: "Save image to Trilium", - contexts: ["image"] - }); - async function getActiveTab() { const tabs = await browser.tabs.query({ active: true, From bbbdab42ca2666fbf8cab04f1d3f9378a6189fc3 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 26 Jan 2026 19:38:11 +0200 Subject: [PATCH 163/316] fix(web-clipper): cash not working in Chrome --- .../entrypoints/options/index.html | 1 - apps/web-clipper/entrypoints/options/index.ts | 2 + apps/web-clipper/entrypoints/popup/index.html | 1 - apps/web-clipper/entrypoints/popup/popup.ts | 10 ++-- apps/web-clipper/lib/cash.min.js | 40 ------------- apps/web-clipper/package.json | 3 + pnpm-lock.yaml | 57 +++++++++---------- 7 files changed, 38 insertions(+), 76 deletions(-) delete mode 100644 apps/web-clipper/lib/cash.min.js diff --git a/apps/web-clipper/entrypoints/options/index.html b/apps/web-clipper/entrypoints/options/index.html index 331a36a02e..abe09d4458 100644 --- a/apps/web-clipper/entrypoints/options/index.html +++ b/apps/web-clipper/entrypoints/options/index.html @@ -54,7 +54,6 @@

    Note that the entered password is not stored anywhere, it will be only used to retrieve an authorization token from the server instance which will be then used to send the clipped notes.

    - diff --git a/apps/web-clipper/entrypoints/options/index.ts b/apps/web-clipper/entrypoints/options/index.ts index c7cb3d4bdf..b4050c977b 100644 --- a/apps/web-clipper/entrypoints/options/index.ts +++ b/apps/web-clipper/entrypoints/options/index.ts @@ -1,3 +1,5 @@ +import $ from "cash-dom"; + const $triliumServerUrl = $("#trilium-server-url"); const $triliumServerPassword = $("#trilium-server-password"); diff --git a/apps/web-clipper/entrypoints/popup/index.html b/apps/web-clipper/entrypoints/popup/index.html index cdf2241cff..a655a5e4a8 100644 --- a/apps/web-clipper/entrypoints/popup/index.html +++ b/apps/web-clipper/entrypoints/popup/index.html @@ -46,7 +46,6 @@
    Status: unknown
    - diff --git a/apps/web-clipper/entrypoints/popup/popup.ts b/apps/web-clipper/entrypoints/popup/popup.ts index 0e4613b794..aa4f0bc2c1 100644 --- a/apps/web-clipper/entrypoints/popup/popup.ts +++ b/apps/web-clipper/entrypoints/popup/popup.ts @@ -1,3 +1,5 @@ +import $ from "cash-dom"; + import { createLink } from "@/utils"; async function sendMessage(message: object) { @@ -38,7 +40,7 @@ $saveTabsButton.on("click", () => sendMessage({name: 'save-tabs'})); const $saveLinkWithNoteWrapper = $("#save-link-with-note-wrapper"); const $textNote = $("#save-link-with-note-textarea"); -const $keepTitle = $("#keep-title-checkbox"); +const $keepTitle = $("#keep-title-checkbox"); $textNote.on('keypress', (event) => { if ((event.which === 10 || event.which === 13) && event.ctrlKey) { @@ -52,7 +54,7 @@ $textNote.on('keypress', (event) => { $("#save-link-with-note-button").on("click", () => { $saveLinkWithNoteWrapper.show(); - $textNote[0].focus(); + $textNote[0]?.focus(); }); $("#cancel-button").on("click", () => { @@ -70,7 +72,7 @@ async function saveLinkWithNote() { title = ''; content = ''; } - else if ($keepTitle[0].checked){ + else if (($keepTitle[0] as HTMLInputElement | undefined)?.checked){ title = ''; content = textNoteVal; } @@ -162,7 +164,7 @@ browser.runtime.onMessage.addListener(request => { const a = createLink({name: 'openNoteInTrilium', noteId: searchNote.noteId}, "Open in Trilium."); $alreadyVisited.text(`Already visited website!`); - $alreadyVisited[0].appendChild(a); + $alreadyVisited[0]?.appendChild(a); }else{ $alreadyVisited.html(''); } diff --git a/apps/web-clipper/lib/cash.min.js b/apps/web-clipper/lib/cash.min.js deleted file mode 100644 index 044700612a..0000000000 --- a/apps/web-clipper/lib/cash.min.js +++ /dev/null @@ -1,40 +0,0 @@ -/* MIT https://github.com/kenwheeler/cash */ -(function(){ -'use strict';var e={"class":"className",contenteditable:"contentEditable","for":"htmlFor",readonly:"readOnly",maxlength:"maxLength",tabindex:"tabIndex",colspan:"colSpan",rowspan:"rowSpan",usemap:"useMap"};function g(a,b){try{return a(b)}catch(c){return b}} -var m=document,n=window,p=m.documentElement,r=m.createElement.bind(m),aa=r("div"),t=r("table"),ba=r("tbody"),ca=r("tr"),u=Array.isArray,v=Array.prototype,da=v.concat,w=v.filter,ea=v.indexOf,fa=v.map,ha=v.push,ia=v.slice,x=v.some,ja=v.splice,ka=/^#[\w-]*$/,la=/^\.[\w-]*$/,ma=/<.+>/,na=/^\w+$/;function y(a,b){return a&&(A(b)||B(b))?la.test(a)?b.getElementsByClassName(a.slice(1)):na.test(a)?b.getElementsByTagName(a):b.querySelectorAll(a):[]} -var C=function(){function a(a,c){if(a){if(a instanceof C)return a;var b=a;if(D(a)){if(b=(c instanceof C?c[0]:c)||m,b=ka.test(a)?b.getElementById(a.slice(1)):ma.test(a)?oa(a):y(a,b),!b)return}else if(E(a))return this.ready(a);if(b.nodeType||b===n)b=[b];this.length=b.length;a=0;for(c=this.length;aarguments.length?this[0]&&this[0][a]:this.each(function(c,h){h[a]=b});for(var c in a)this.prop(c,a[c]);return this}};F.get=function(a){if(void 0===a)return ia.call(this);a=Number(a);return this[0>a?a+this.length:a]};F.eq=function(a){return G(this.get(a))}; -F.first=function(){return this.eq(0)};F.last=function(){return this.eq(-1)};function L(a){return D(a)?function(b,c){return qa(c,a)}:E(a)?a:a instanceof C?function(b,c){return a.is(c)}:a?function(b,c){return c===a}:function(){return!1}}F.filter=function(a){var b=L(a);return G(w.call(this,function(a,d){return b.call(a,d,a)}))};function M(a,b){return b?a.filter(b):a}var sa=/\S+/g;function N(a){return D(a)?a.match(sa)||[]:[]}F.hasClass=function(a){return!!a&&x.call(this,function(b){return B(b)&&b.classList.contains(a)})}; -F.removeAttr=function(a){var b=N(a);return this.each(function(a,d){B(d)&&I(b,function(a,b){d.removeAttribute(b)})})};F.attr=function(a,b){if(a){if(D(a)){if(2>arguments.length){if(!this[0]||!B(this[0]))return;var c=this[0].getAttribute(a);return null===c?void 0:c}return void 0===b?this:null===b?this.removeAttr(a):this.each(function(c,h){B(h)&&h.setAttribute(a,b)})}for(c in a)this.attr(c,a[c]);return this}}; -F.toggleClass=function(a,b){var c=N(a),d=void 0!==b;return this.each(function(a,f){B(f)&&I(c,function(a,c){d?b?f.classList.add(c):f.classList.remove(c):f.classList.toggle(c)})})};F.addClass=function(a){return this.toggleClass(a,!0)};F.removeClass=function(a){return arguments.length?this.toggleClass(a,!1):this.attr("class","")}; -function O(a,b,c,d){for(var h=[],f=E(b),k=d&&L(d),q=0,R=a.length;qarguments.length)return this[0]&&Q(this[0],a,c);if(!a)return this;b=xa(a,b,c);return this.each(function(d,f){B(f)&&(c?f.style.setProperty(a,b):f.style[a]=b)})}for(var d in a)this.css(d,a[d]);return this};var ya=/^\s+|\s+$/;function za(a,b){a=a.dataset[b]||a.dataset[H(b)];return ya.test(a)?a:g(JSON.parse,a)} -F.data=function(a,b){if(!a){if(!this[0])return;var c={},d;for(d in this[0].dataset)c[d]=za(this[0],d);return c}if(D(a))return 2>arguments.length?this[0]&&za(this[0],a):void 0===b?this:this.each(function(c,d){c=b;c=g(JSON.stringify,c);d.dataset[H(a)]=c});for(d in a)this.data(d,a[d]);return this};function Aa(a,b){var c=a.documentElement;return Math.max(a.body["scroll"+b],c["scroll"+b],a.body["offset"+b],c["offset"+b],c["client"+b])} -function Ba(a,b){return S(a,"border"+(b?"Left":"Top")+"Width")+S(a,"padding"+(b?"Left":"Top"))+S(a,"padding"+(b?"Right":"Bottom"))+S(a,"border"+(b?"Right":"Bottom")+"Width")} -I([!0,!1],function(a,b){I(["Width","Height"],function(a,d){F[(b?"outer":"inner")+d]=function(c){if(this[0])return K(this[0])?b?this[0]["inner"+d]:this[0].document.documentElement["client"+d]:A(this[0])?Aa(this[0],d):this[0][(b?"offset":"client")+d]+(c&&b?S(this[0],"margin"+(a?"Top":"Left"))+S(this[0],"margin"+(a?"Bottom":"Right")):0)}})}); -I(["Width","Height"],function(a,b){var c=b.toLowerCase();F[c]=function(d){if(!this[0])return void 0===d?void 0:this;if(!arguments.length)return K(this[0])?this[0].document.documentElement["client"+b]:A(this[0])?Aa(this[0],b):this[0].getBoundingClientRect()[c]-Ba(this[0],!a);var h=parseInt(d,10);return this.each(function(b,d){B(d)&&(b=Q(d,"boxSizing"),d.style[c]=xa(c,h+("border-box"===b?Ba(d,!a):0)))})}});var V={}; -F.toggle=function(a){return this.each(function(b,c){if(B(c))if(void 0===a?"none"===Q(c,"display"):a){if(c.style.display=c.___cd||"","none"===Q(c,"display")){b=c.style;c=c.tagName;if(V[c])c=V[c];else{var d=r(c);m.body.insertBefore(d,null);var h=Q(d,"display");m.body.removeChild(d);c=V[c]="none"!==h?h:"block"}b.display=c}}else c.___cd=Q(c,"display"),c.style.display="none"})};F.hide=function(){return this.toggle(!1)};F.show=function(){return this.toggle(!0)}; -function Ca(a,b){return!b||!x.call(b,function(b){return 0>a.indexOf(b)})}var W={focus:"focusin",blur:"focusout"},Da={mouseenter:"mouseover",mouseleave:"mouseout"},Ea=/^(mouse|pointer|contextmenu|drag|drop|click|dblclick)/i;function Fa(a,b,c,d,h){var f=a.___ce=a.___ce||{};f[b]=f[b]||[];f[b].push([c,d,h]);a.addEventListener(b,h)}function X(a){a=a.split(".");return[a[0],a.slice(1).sort()]} -function Y(a,b,c,d,h){var f=a.___ce=a.___ce||{};if(b)f[b]&&(f[b]=f[b].filter(function(f){var k=f[0],R=f[1];f=f[2];if(h&&f.guid!==h.guid||!Ca(k,c)||d&&d!==R)return!0;a.removeEventListener(b,f)}));else for(b in f)Y(a,b,c,d,h)} -F.off=function(a,b,c){var d=this;if(void 0===a)this.each(function(a,b){(B(b)||A(b)||K(b))&&Y(b)});else if(D(a))E(b)&&(c=b,b=""),I(N(a),function(a,h){a=X(Da[h]||W[h]||h);var f=a[0],k=a[1];d.each(function(a,d){(B(d)||A(d)||K(d))&&Y(d,f,k,b,c)})});else for(var h in a)this.off(h,a[h]);return this}; -F.on=function(a,b,c,d,h){var f=this;if(!D(a)){for(var k in a)this.on(k,b,c,a[k],h);return this}D(b)||(void 0!==b&&null!==b&&(void 0!==c&&(d=c),c=b),b="");E(d)||(d=c,c=void 0);if(!d)return this;I(N(a),function(a,k){a=X(Da[k]||W[k]||k);var l=a[0],q=a[1];l&&f.each(function(a,f){if(B(f)||A(f)||K(f))a=function Ja(a){if(!a.namespace||Ca(q,a.namespace.split("."))){var k=f;if(b){for(var z=a.target;!qa(z,b);){if(z===f)return;z=z.parentNode;if(!z)return}k=z;a.___cd=!0}a.___cd&&Object.defineProperty(a,"currentTarget", -{configurable:!0,get:function(){return k}});Object.defineProperty(a,"data",{configurable:!0,get:function(){return c}});z=d.call(k,a,a.___td);h&&Y(f,l,q,b,Ja);!1===z&&(a.preventDefault(),a.stopPropagation())}},a.guid=d.guid=d.guid||G.guid++,Fa(f,l,q,b,a)})});return this};F.one=function(a,b,c,d){return this.on(a,b,c,d,!0)};F.ready=function(a){function b(){return setTimeout(a,0,G)}"loading"!==m.readyState?b():m.addEventListener("DOMContentLoaded",b);return this}; -F.trigger=function(a,b){if(D(a)){var c=X(a),d=c[0];c=c[1];if(!d)return this;var h=Ea.test(d)?"MouseEvents":"HTMLEvents";a=m.createEvent(h);a.initEvent(d,!0,!0);a.namespace=c.join(".")}a.___td=b;var f=a.type in W;return this.each(function(b,c){if(f&&E(c[a.type]))c[a.type]();else c.dispatchEvent(a)})};function Ga(a){return a.multiple&&a.options?O(w.call(a.options,function(a){return a.selected&&!a.disabled&&!a.parentNode.disabled}),"value"):a.value||""} -var Ha=/%20/g,Ia=/\r?\n/g,Ka=/file|reset|submit|button|image/i,La=/radio|checkbox/i;F.serialize=function(){var a="";this.each(function(b,c){I(c.elements||[c],function(b,c){c.disabled||!c.name||"FIELDSET"===c.tagName||Ka.test(c.type)||La.test(c.type)&&!c.checked||(b=Ga(c),void 0!==b&&(b=u(b)?b:[b],I(b,function(b,d){b=a;d="&"+encodeURIComponent(c.name)+"="+encodeURIComponent(d.replace(Ia,"\r\n")).replace(Ha,"+");a=b+d})))})});return a.slice(1)}; -F.val=function(a){return arguments.length?this.each(function(b,c){if((b=c.multiple&&c.options)||La.test(c.type)){var d=u(a)?fa.call(a,String):null===a?[]:[String(a)];b?I(c.options,function(a,b){b.selected=0<=d.indexOf(b.value)},!0):c.checked=0<=d.indexOf(c.value)}else c.value=void 0===a||null===a?"":a}):this[0]&&Ga(this[0])};F.clone=function(){return this.map(function(a,b){return b.cloneNode(!0)})};F.detach=function(a){M(this,a).each(function(a,c){c.parentNode&&c.parentNode.removeChild(c)});return this}; -var Ma=/^\s*<(\w+)[^>]*>/,Na=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,Oa={"*":aa,tr:ba,td:ca,th:ca,thead:t,tbody:t,tfoot:t};function oa(a){if(!D(a))return[];if(Na.test(a))return[r(RegExp.$1)];var b=Ma.test(a)&&RegExp.$1;b=Oa[b]||Oa["*"];b.innerHTML=a;return G(b.childNodes).detach().get()}G.parseHTML=oa;F.empty=function(){return this.each(function(a,b){for(;b.firstChild;)b.removeChild(b.firstChild)})}; -F.html=function(a){return arguments.length?void 0===a?this:this.each(function(b,c){B(c)&&(c.innerHTML=a)}):this[0]&&this[0].innerHTML};F.remove=function(a){M(this,a).detach().off();return this};F.text=function(a){return void 0===a?this[0]?this[0].textContent:"":this.each(function(b,c){B(c)&&(c.textContent=a)})};F.unwrap=function(){this.parent().each(function(a,b){"BODY"!==b.tagName&&(a=G(b),a.replaceWith(a.children()))});return this}; -F.offset=function(){var a=this[0];if(a)return a=a.getBoundingClientRect(),{top:a.top+n.pageYOffset,left:a.left+n.pageXOffset}};F.offsetParent=function(){return this.map(function(a,b){for(a=b.offsetParent;a&&"static"===Q(a,"position");)a=a.offsetParent;return a||p})}; -F.position=function(){var a=this[0];if(a){var b="fixed"===Q(a,"position"),c=b?a.getBoundingClientRect():this.offset();if(!b){var d=a.ownerDocument;for(b=a.offsetParent||d.documentElement;(b===d.body||b===d.documentElement)&&"static"===Q(b,"position");)b=b.parentNode;b!==a&&B(b)&&(d=G(b).offset(),c.top-=d.top+S(b,"borderTopWidth"),c.left-=d.left+S(b,"borderLeftWidth"))}return{top:c.top-S(a,"marginTop"),left:c.left-S(a,"marginLeft")}}}; -F.children=function(a){return M(G(P(O(this,function(a){return a.children}))),a)};F.contents=function(){return G(P(O(this,function(a){return"IFRAME"===a.tagName?[a.contentDocument]:"TEMPLATE"===a.tagName?a.content.childNodes:a.childNodes})))};F.find=function(a){return G(P(O(this,function(b){return y(a,b)})))};var Pa=/^\s*\s*$/g,Qa=/^$|^module$|\/(java|ecma)script/i,Ra=["type","src","nonce","noModule"]; -function Sa(a,b){a=G(a);a.filter("script").add(a.find("script")).each(function(a,d){if(Qa.test(d.type)&&p.contains(d)){var c=r("script");c.text=d.textContent.replace(Pa,"");I(Ra,function(a,b){d[b]&&(c[b]=d[b])});b.head.insertBefore(c,null);b.head.removeChild(c)}})} -function Z(a,b,c,d,h,f,k,q){I(a,function(a,f){I(G(f),function(a,f){I(G(b),function(b,k){var l=c?k:f;b=c?a:b;k=c?f:k;l=b?l.cloneNode(!0):l;b=!b;h?k.insertBefore(l,d?k.firstChild:null):k.parentNode.insertBefore(l,d?k:k.nextSibling);b&&Sa(l,k.ownerDocument)},q)},k)},f);return b}F.after=function(){return Z(arguments,this,!1,!1,!1,!0,!0)};F.append=function(){return Z(arguments,this,!1,!1,!0)};F.appendTo=function(a){return Z(arguments,this,!0,!1,!0)};F.before=function(){return Z(arguments,this,!1,!0)}; -F.insertAfter=function(a){return Z(arguments,this,!0,!1,!1,!1,!1,!0)};F.insertBefore=function(a){return Z(arguments,this,!0,!0)};F.prepend=function(){return Z(arguments,this,!1,!0,!0,!0,!0)};F.prependTo=function(a){return Z(arguments,this,!0,!0,!0,!1,!1,!0)};F.replaceWith=function(a){return this.before(a).remove()};F.replaceAll=function(a){G(a).replaceWith(this);return this};F.wrapAll=function(a){a=G(a);for(var b=a[0];b.children.length;)b=b.firstElementChild;this.first().before(a);return this.appendTo(b)}; -F.wrap=function(a){return this.each(function(b,c){var d=G(a)[0];G(c).wrapAll(b?d.cloneNode(!0):d)})};F.wrapInner=function(a){return this.each(function(b,c){b=G(c);c=b.contents();c.length?c.wrapAll(a):b.append(a)})};F.has=function(a){var b=D(a)?function(b,d){return y(a,d).length}:function(b,d){return d.contains(a)};return this.filter(b)};F.is=function(a){var b=L(a);return x.call(this,function(a,d){return b.call(a,d,a)})};F.next=function(a,b,c){return M(G(P(O(this,"nextElementSibling",b,c))),a)}; -F.nextAll=function(a){return this.next(a,!0)};F.nextUntil=function(a,b){return this.next(b,!0,a)};F.not=function(a){var b=L(a);return this.filter(function(c,d){return(!D(a)||B(d))&&!b.call(d,c,d)})};F.parent=function(a){return M(G(P(O(this,"parentNode"))),a)};F.index=function(a){var b=a?G(a)[0]:this[0];a=a?this:G(b).parent().children();return ea.call(a,b)};F.closest=function(a){var b=this.filter(a);if(b.length)return b;var c=this.parent();return c.length?c.closest(a):b}; -F.parents=function(a,b){return M(G(P(O(this,"parentElement",!0,b))),a)};F.parentsUntil=function(a,b){return this.parents(b,a)};F.prev=function(a,b,c){return M(G(P(O(this,"previousElementSibling",b,c))),a)};F.prevAll=function(a){return this.prev(a,!0)};F.prevUntil=function(a,b){return this.prev(b,!0,a)};F.siblings=function(a){return M(G(P(O(this,function(a){return G(a).parent().children().not(a)}))),a)};"undefined"!==typeof exports?module.exports=G:n.cash=n.$=G; -})(); \ No newline at end of file diff --git a/apps/web-clipper/package.json b/apps/web-clipper/package.json index 2853dcb900..97aa421df1 100644 --- a/apps/web-clipper/package.json +++ b/apps/web-clipper/package.json @@ -17,5 +17,8 @@ "devDependencies": { "@wxt-dev/auto-icons": "1.1.0", "wxt": "0.20.13" + }, + "dependencies": { + "cash-dom": "8.1.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a0450f01a..c716b4dd18 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -818,6 +818,10 @@ importers: version: 17.2.3 apps/web-clipper: + dependencies: + cash-dom: + specifier: 8.1.5 + version: 8.1.5 devDependencies: '@wxt-dev/auto-icons': specifier: 1.1.0 @@ -6871,6 +6875,9 @@ packages: canvas-roundrect-polyfill@0.0.1: resolution: {integrity: sha512-yWq+R3U3jE+coOeEb3a3GgE2j/0MMiDKM/QpLb6h9ihf5fGY9UXtvK9o4vNqjWXoZz7/3EaSVU3IX53TvFFUOw==} + cash-dom@8.1.5: + resolution: {integrity: sha512-/BS05CfzyHR5xT2ksKj1sDLPaOv5rSmIwoGxNgdKwUtnIuiJ5neMxVEmZxvfyJiSjGbOMD0Lwe+9v+fszDqHew==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -15829,6 +15836,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-upload': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-ai@47.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: @@ -15969,12 +15978,16 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-cloud-services@47.4.0': dependencies: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16167,6 +16180,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -16176,6 +16191,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -16185,6 +16202,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-inline@47.4.0': dependencies: @@ -16194,6 +16213,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.4.0': dependencies: @@ -16216,8 +16237,6 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -16274,8 +16293,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-export-word@47.4.0': dependencies: @@ -16300,6 +16317,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-font@47.4.0': dependencies: @@ -16374,6 +16393,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-html-embed@47.4.0': dependencies: @@ -16419,8 +16440,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-import-word@47.4.0': dependencies: @@ -16433,8 +16452,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-indent@47.4.0': dependencies: @@ -16508,8 +16525,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-markdown-gfm@47.4.0': dependencies: @@ -16558,8 +16573,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-merge-fields@47.4.0': dependencies: @@ -16572,8 +16585,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-minimap@47.4.0': dependencies: @@ -16582,8 +16593,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-operations-compressor@47.4.0': dependencies: @@ -16638,8 +16647,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-pagination@47.4.0': dependencies: @@ -16747,8 +16754,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-slash-command@47.4.0': dependencies: @@ -16761,8 +16766,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-source-editing-enhanced@47.4.0': dependencies: @@ -16810,8 +16813,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-table@47.4.0': dependencies: @@ -16824,8 +16825,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-template@47.4.0': dependencies: @@ -16936,8 +16935,6 @@ snapshots: '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-widget@47.4.0': dependencies: @@ -16957,8 +16954,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@codemirror/autocomplete@6.18.6': dependencies: @@ -22579,6 +22574,8 @@ snapshots: canvas-roundrect-polyfill@0.0.1: {} + cash-dom@8.1.5: {} + ccount@2.0.1: {} chai@6.2.1: {} From ab519a4caa007b895549249ae6761dd78f63ff71 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 26 Jan 2026 20:06:57 +0200 Subject: [PATCH 164/316] chore(web-clipper): rephrase "already visited" & fix spacing --- apps/web-clipper/entrypoints/popup/popup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web-clipper/entrypoints/popup/popup.ts b/apps/web-clipper/entrypoints/popup/popup.ts index aa4f0bc2c1..c68e7e6af9 100644 --- a/apps/web-clipper/entrypoints/popup/popup.ts +++ b/apps/web-clipper/entrypoints/popup/popup.ts @@ -163,7 +163,7 @@ browser.runtime.onMessage.addListener(request => { if (searchNote.status === 'found'){ const a = createLink({name: 'openNoteInTrilium', noteId: searchNote.noteId}, "Open in Trilium."); - $alreadyVisited.text(`Already visited website!`); + $alreadyVisited.text(`Web page already clipped. `); $alreadyVisited[0]?.appendChild(a); }else{ $alreadyVisited.html(''); From c97c69900be9cb56919e94c082762e9aedca2e38 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 26 Jan 2026 20:10:18 +0200 Subject: [PATCH 165/316] chore(web-clipper): minor typo in "screenshot" --- apps/web-clipper/entrypoints/background/context_menu.ts | 4 ++-- apps/web-clipper/entrypoints/popup/index.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/web-clipper/entrypoints/background/context_menu.ts b/apps/web-clipper/entrypoints/background/context_menu.ts index 6685651fbd..28786df7bf 100644 --- a/apps/web-clipper/entrypoints/background/context_menu.ts +++ b/apps/web-clipper/entrypoints/background/context_menu.ts @@ -6,12 +6,12 @@ const CONTEXT_MENU_ITEMS: Browser.contextMenus.CreateProperties[] = [ }, { id: "trilium-save-cropped-screenshot", - title: "Crop screen shot to Trilium", + title: "Crop screenshot to Trilium", contexts: ["page"] }, { id: "trilium-save-whole-screenshot", - title: "Save whole screen shot to Trilium", + title: "Save whole screenshot to Trilium", contexts: ["page"] }, { diff --git a/apps/web-clipper/entrypoints/popup/index.html b/apps/web-clipper/entrypoints/popup/index.html index a655a5e4a8..207d6433cb 100644 --- a/apps/web-clipper/entrypoints/popup/index.html +++ b/apps/web-clipper/entrypoints/popup/index.html @@ -20,8 +20,8 @@
    - - + + From 537d92421c6ebd05805e976221bd06495b214923 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 26 Jan 2026 20:20:46 +0200 Subject: [PATCH 166/316] chore(web-clipper): fix warning related to permissions --- apps/web-clipper/wxt.config.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/web-clipper/wxt.config.ts b/apps/web-clipper/wxt.config.ts index 1ca4460a1e..7dd1c0a3a9 100644 --- a/apps/web-clipper/wxt.config.ts +++ b/apps/web-clipper/wxt.config.ts @@ -12,13 +12,15 @@ export default defineConfig({ permissions: [ "activeTab", "tabs", - "http://*/", - "https://*/", - "", "storage", "contextMenus", manifestVersion === 3 && "offscreen" ].filter(Boolean), + host_permissions: [ + "http://*/", + "https://*/", + "", + ], browser_specific_settings: { gecko: { // See https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/browser_specific_settings#id. From 82ea4c1a04ea3346705bb4d0f6c8d381d3d07dbe Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 26 Jan 2026 20:37:32 +0200 Subject: [PATCH 167/316] docs(guide): add instructions on installing from .zip --- .../Installation & Setup/Web Clipper.html | 78 +++++++++++++++++-- .../Developer Guide/Documentation.md | 2 +- .../Installation & Setup/Web Clipper.md | 30 +++++++ 3 files changed, 102 insertions(+), 8 deletions(-) diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html index effb6e395b..77eb7dea73 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html @@ -7,13 +7,9 @@

    Supported browsers

    Trilium Web Clipper officially supports the following web browsers:

      -
    • -

      Mozilla Firefox, using Manifest v2.

      -
    • -
    • -

      Google Chrome, using Manifest v3. Theoretically the extension should work - on other Chromium-based browsers as well, but they are not officially supported.

      -
    • +
    • Mozilla Firefox, using Manifest v2.
    • +
    • Google Chrome, using Manifest v3. Theoretically the extension should work + on other Chromium-based browsers as well, but they are not officially supported.

    Obtaining the extension