From 0f47a4988b449fbc1a7bb3f7a4f11fa8c8629810 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 10 Jun 2025 22:22:47 +0300 Subject: [PATCH 01/27] refactor(canvas): proof of concept for preact-based canvas --- apps/client/package.json | 9 +- .../client/src/widgets/type_widgets/canvas.ts | 112 +---- .../src/widgets/type_widgets/canvas_el.ts | 7 + apps/client/vite.config.mts | 16 +- pnpm-lock.yaml | 404 +++++++++--------- 5 files changed, 224 insertions(+), 324 deletions(-) create mode 100644 apps/client/src/widgets/type_widgets/canvas_el.ts diff --git a/apps/client/package.json b/apps/client/package.json index 0b33bdacd..1f2d2aa38 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -51,8 +51,7 @@ "mind-elixir": "4.6.0", "normalize.css": "8.0.1", "panzoom": "9.4.3", - "react": "19.1.0", - "react-dom": "19.1.0", + "preact": "10.26.8", "split.js": "1.6.5", "svg-pan-zoom": "3.6.2", "vanilla-js-wheel-zoom": "9.0.4" @@ -64,8 +63,6 @@ "@types/leaflet": "1.9.18", "@types/leaflet-gpx": "1.3.7", "@types/mark.js": "8.11.12", - "@types/react": "19.1.7", - "@types/react-dom": "19.1.6", "copy-webpack-plugin": "13.0.0", "happy-dom": "17.6.3", "script-loader": "0.7.2", @@ -75,7 +72,9 @@ "name": "client", "targets": { "serve": { - "dependsOn": ["^build"] + "dependsOn": [ + "^build" + ] } } } diff --git a/apps/client/src/widgets/type_widgets/canvas.ts b/apps/client/src/widgets/type_widgets/canvas.ts index 53c940970..6ce7a3b83 100644 --- a/apps/client/src/widgets/type_widgets/canvas.ts +++ b/apps/client/src/widgets/type_widgets/canvas.ts @@ -1,16 +1,8 @@ import TypeWidget from "./type_widget.js"; import utils from "../../services/utils.js"; -import linkService from "../../services/link.js"; import server from "../../services/server.js"; import type FNote from "../../entities/fnote.js"; import options from "../../services/options.js"; -import type { ExcalidrawElement, Theme } from "@excalidraw/excalidraw/element/types"; -import type { AppState, BinaryFileData, ExcalidrawImperativeAPI, ExcalidrawProps, LibraryItem, SceneData } from "@excalidraw/excalidraw/types"; -import type { JSX } from "react"; -import type React from "react"; -import type { Root } from "react-dom/client"; -import "@excalidraw/excalidraw/index.css"; -import asset_path from "../../asset_path.js"; const TPL = /*html*/`
@@ -121,7 +113,6 @@ export default class ExcalidrawTypeWidget extends TypeWidget { private excalidrawWrapperRef!: React.RefObject; private $render!: JQuery; - private root?: Root; private reactHandlers!: JQuery; constructor() { @@ -191,14 +182,8 @@ export default class ExcalidrawTypeWidget extends TypeWidget { } (window.process.env as any).PREACT = false; - const excalidraw = await import("@excalidraw/excalidraw"); - this.excalidrawLib = excalidraw; - - const { createRoot } = await import("react-dom/client"); - const React = (await import("react")).default; - this.root?.unmount(); - this.root = createRoot(renderElement); - this.root.render(React.createElement(() => this.createExcalidrawReactApp(React, excalidraw.Excalidraw))); + const renderCanvas = (await import("./canvas_el.js")).default; + renderCanvas(renderElement); } /** @@ -470,99 +455,6 @@ export default class ExcalidrawTypeWidget extends TypeWidget { } } - createExcalidrawReactApp(react: typeof React, excalidrawComponent: React.MemoExoticComponent<(props: ExcalidrawProps) => JSX.Element>) { - const excalidrawWrapperRef = react.useRef(null); - this.excalidrawWrapperRef = excalidrawWrapperRef; - const [dimensions, setDimensions] = react.useState<{ width?: number; height?: number }>({ - width: undefined, - height: undefined - }); - - react.useEffect(() => { - if (excalidrawWrapperRef.current) { - const dimensions = { - width: excalidrawWrapperRef.current.getBoundingClientRect().width, - height: excalidrawWrapperRef.current.getBoundingClientRect().height - }; - setDimensions(dimensions); - } - - const onResize = () => { - if (this.note?.type !== "canvas") { - return; - } - - if (excalidrawWrapperRef.current) { - const dimensions = { - width: excalidrawWrapperRef.current.getBoundingClientRect().width, - height: excalidrawWrapperRef.current.getBoundingClientRect().height - }; - setDimensions(dimensions); - } - }; - - window.addEventListener("resize", onResize); - - return () => window.removeEventListener("resize", onResize); - }, [excalidrawWrapperRef]); - - const onLinkOpen = react.useCallback>((element, event) => { - let link = element.link; - if (!link) { - return false; - } - - if (link.startsWith("root/")) { - link = "#" + link; - } - - const { nativeEvent } = event.detail; - - event.preventDefault(); - - return linkService.goToLinkExt(nativeEvent, link, null); - }, []); - - return react.createElement( - react.Fragment, - null, - react.createElement( - "div", - { - className: "excalidraw-wrapper", - ref: excalidrawWrapperRef - }, - react.createElement(excalidrawComponent, { - // this makes sure that 1) manual theme switch button is hidden 2) theme stays as it should after opening menu - theme: this.themeStyle, - excalidrawAPI: (api: ExcalidrawImperativeAPI) => { - this.excalidrawApi = api; - }, - onLibraryChange: () => { - this.libraryChanged = true; - - this.saveData(); - }, - onChange: () => this.onChangeHandler(), - viewModeEnabled: options.is("databaseReadonly"), - zenModeEnabled: false, - gridModeEnabled: false, - isCollaborating: false, - detectScroll: false, - handleKeyboardGlobally: false, - autoFocus: false, - onLinkOpen, - UIOptions: { - canvasActions: { - saveToActiveFile: false, - export: false - } - } - }) - ) - ); - } - /** * needed to ensure, that multipleOnChangeHandler calls do not trigger a save. * we compare the scene version as suggested in: diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts new file mode 100644 index 000000000..814018519 --- /dev/null +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -0,0 +1,7 @@ +import "@excalidraw/excalidraw/index.css"; +import { Excalidraw } from "@excalidraw/excalidraw"; +import { h, render } from "preact"; + +export default function renderCanvas(targetEl: HTMLElement) { + render(h(Excalidraw, null, "Hello world"), targetEl); +} diff --git a/apps/client/vite.config.mts b/apps/client/vite.config.mts index 05dd85e53..a3f00a714 100644 --- a/apps/client/vite.config.mts +++ b/apps/client/vite.config.mts @@ -43,11 +43,22 @@ export default defineConfig(() => ({ { find: "@triliumnext/highlightjs", replacement: resolve(__dirname, "node_modules/@triliumnext/highlightjs/dist") + }, + { + find: "react", + replacement: "preact/compat" + }, + { + find: "react-dom", + replacement: "preact/compat" } ], dedupe: [ "react", - "react-dom" + "react-dom", + "preact", + "preact/compat", + "preact/hooks" ] }, // Uncomment this if you are using workers. @@ -97,5 +108,8 @@ export default defineConfig(() => ({ }, commonjsOptions: { transformMixedEsModules: true, + }, + define: { + "process.env.IS_PREACT": JSON.stringify("true"), } })); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8158b90c2..6e34d4dba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -158,7 +158,7 @@ importers: version: 9.28.0 '@excalidraw/excalidraw': specifier: 0.18.0 - version: 0.18.0(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 0.18.0(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) '@fullcalendar/core': specifier: 6.1.17 version: 6.1.17 @@ -276,12 +276,9 @@ importers: panzoom: specifier: 9.4.3 version: 9.4.3 - react: - specifier: 19.1.0 - version: 19.1.0 - react-dom: - specifier: 19.1.0 - version: 19.1.0(react@19.1.0) + preact: + specifier: 10.26.8 + version: 10.26.8 split.js: specifier: 1.6.5 version: 1.6.5 @@ -310,12 +307,6 @@ importers: '@types/mark.js': specifier: 8.11.12 version: 8.11.12 - '@types/react': - specifier: 19.1.7 - version: 19.1.7 - '@types/react-dom': - specifier: 19.1.6 - version: 19.1.6(@types/react@19.1.7) copy-webpack-plugin: specifier: 13.0.0 version: 13.0.0(webpack@5.99.9(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.5)) @@ -10781,8 +10772,8 @@ packages: preact@10.12.1: resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==} - preact@10.26.5: - resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} + preact@10.26.8: + resolution: {integrity: sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==} prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} @@ -11016,10 +11007,6 @@ packages: resolution: {integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==} engines: {node: '>=0.10.0'} - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} - engines: {node: '>=0.10.0'} - read-binary-file-arch@1.0.6: resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} hasBin: true @@ -15566,14 +15553,14 @@ snapshots: '@eslint/core': 0.14.0 levn: 0.4.1 - '@excalidraw/excalidraw@0.18.0(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@excalidraw/excalidraw@0.18.0(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: '@braintree/sanitize-url': 6.0.2 '@excalidraw/laser-pointer': 1.3.1 '@excalidraw/mermaid-to-excalidraw': 1.1.2 '@excalidraw/random-username': 1.1.0 - '@radix-ui/react-popover': 1.1.6(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-tabs': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-popover': 1.1.6(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-tabs': 1.0.2(react-dom@19.1.0(react@16.14.0))(react@16.14.0) browser-fs-access: 0.29.1 canvas-roundrect-polyfill: 0.0.1 clsx: 1.1.1 @@ -15582,8 +15569,8 @@ snapshots: fractional-indexing: 3.2.0 fuzzy: 0.1.3 image-blob-reduce: 3.0.1 - jotai: 2.11.0(@types/react@19.1.7)(react@19.1.0) - jotai-scope: 0.7.2(jotai@2.11.0(@types/react@19.1.7)(react@19.1.0))(react@19.1.0) + jotai: 2.11.0(@types/react@19.1.7)(react@16.14.0) + jotai-scope: 0.7.2(jotai@2.11.0(@types/react@19.1.7)(react@16.14.0))(react@16.14.0) lodash.debounce: 4.0.8 lodash.throttle: 4.1.1 nanoid: 4.0.2 @@ -15596,11 +15583,11 @@ snapshots: png-chunks-extract: 1.0.0 points-on-curve: 1.0.1 pwacompat: 2.0.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) roughjs: 4.6.4 sass: 1.51.0 - tunnel-rat: 0.1.2(@types/react@19.1.7)(react@19.1.0) + tunnel-rat: 0.1.2(@types/react@19.1.7)(react@16.14.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -15637,11 +15624,11 @@ snapshots: '@floating-ui/core': 1.6.9 '@floating-ui/utils': 0.2.9 - '@floating-ui/react-dom@2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@floating-ui/react-dom@2.1.2(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: '@floating-ui/dom': 1.6.13 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) '@floating-ui/utils@0.2.9': {} @@ -16973,275 +16960,275 @@ snapshots: '@radix-ui/primitive@1.1.1': {} - '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) optionalDependencies: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) - '@radix-ui/react-collection@1.0.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-collection@1.0.1(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 - '@radix-ui/react-compose-refs': 1.0.0(react@19.1.0) - '@radix-ui/react-context': 1.0.0(react@19.1.0) - '@radix-ui/react-primitive': 1.0.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.0.1(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.0.0(react@16.14.0) + '@radix-ui/react-context': 1.0.0(react@16.14.0) + '@radix-ui/react-primitive': 1.0.1(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-slot': 1.0.1(react@16.14.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) - '@radix-ui/react-compose-refs@1.0.0(react@19.1.0)': + '@radix-ui/react-compose-refs@1.0.0(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 - react: 19.1.0 + react: 16.14.0 - '@radix-ui/react-compose-refs@1.1.1(@types/react@19.1.7)(react@19.1.0)': + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.1.7)(react@16.14.0)': dependencies: - react: 19.1.0 + react: 16.14.0 optionalDependencies: '@types/react': 19.1.7 - '@radix-ui/react-context@1.0.0(react@19.1.0)': + '@radix-ui/react-context@1.0.0(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 - react: 19.1.0 + react: 16.14.0 - '@radix-ui/react-context@1.1.1(@types/react@19.1.7)(react@19.1.0)': + '@radix-ui/react-context@1.1.1(@types/react@19.1.7)(react@16.14.0)': dependencies: - react: 19.1.0 + react: 16.14.0 optionalDependencies: '@types/react': 19.1.7 - '@radix-ui/react-direction@1.0.0(react@19.1.0)': + '@radix-ui/react-direction@1.0.0(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 - react: 19.1.0 + react: 16.14.0 - '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.1.7)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.1.7)(react@16.14.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) optionalDependencies: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) - '@radix-ui/react-focus-guards@1.1.1(@types/react@19.1.7)(react@19.1.0)': + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.1.7)(react@16.14.0)': dependencies: - react: 19.1.0 + react: 16.14.0 optionalDependencies: '@types/react': 19.1.7 - '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.7)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.7)(react@16.14.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) optionalDependencies: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) - '@radix-ui/react-id@1.0.0(react@19.1.0)': + '@radix-ui/react-id@1.0.0(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 - '@radix-ui/react-use-layout-effect': 1.0.0(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-use-layout-effect': 1.0.0(react@16.14.0) + react: 16.14.0 - '@radix-ui/react-id@1.1.0(@types/react@19.1.7)(react@19.1.0)': + '@radix-ui/react-id@1.1.0(@types/react@19.1.7)(react@16.14.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.7)(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.7)(react@16.14.0) + react: 16.14.0 optionalDependencies: '@types/react': 19.1.7 - '@radix-ui/react-popover@1.1.6(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-popover@1.1.6(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.1.2(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.1.7)(react@16.14.0) aria-hidden: 1.2.4 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.6.3(@types/react@19.1.7)(react@19.1.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) + react-remove-scroll: 2.6.3(@types/react@19.1.7)(react@16.14.0) optionalDependencies: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) - '@radix-ui/react-popper@1.2.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-popper@1.2.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-arrow': 1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-use-rect': 1.1.0(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.0(@types/react@19.1.7)(react@19.1.0) + '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-arrow': 1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.1.7)(react@16.14.0) '@radix-ui/rect': 1.1.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) optionalDependencies: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) - '@radix-ui/react-portal@1.1.4(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-portal@1.1.4(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.7)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.7)(react@16.14.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) optionalDependencies: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) - '@radix-ui/react-presence@1.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-presence@1.0.0(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 - '@radix-ui/react-compose-refs': 1.0.0(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.0.0(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.0.0(react@16.14.0) + '@radix-ui/react-use-layout-effect': 1.0.0(react@16.14.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) - '@radix-ui/react-presence@1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-presence@1.1.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.7)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@16.14.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.7)(react@16.14.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) optionalDependencies: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) - '@radix-ui/react-primitive@1.0.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-primitive@1.0.1(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 - '@radix-ui/react-slot': 1.0.1(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-slot': 1.0.1(react@16.14.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) - '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: - '@radix-ui/react-slot': 1.1.2(@types/react@19.1.7)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.1.7)(react@16.14.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) optionalDependencies: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) - '@radix-ui/react-roving-focus@1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-roving-focus@1.0.2(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 '@radix-ui/primitive': 1.0.0 - '@radix-ui/react-collection': 1.0.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.0.0(react@19.1.0) - '@radix-ui/react-context': 1.0.0(react@19.1.0) - '@radix-ui/react-direction': 1.0.0(react@19.1.0) - '@radix-ui/react-id': 1.0.0(react@19.1.0) - '@radix-ui/react-primitive': 1.0.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.0.0(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.0.0(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-collection': 1.0.1(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-compose-refs': 1.0.0(react@16.14.0) + '@radix-ui/react-context': 1.0.0(react@16.14.0) + '@radix-ui/react-direction': 1.0.0(react@16.14.0) + '@radix-ui/react-id': 1.0.0(react@16.14.0) + '@radix-ui/react-primitive': 1.0.1(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@16.14.0) + '@radix-ui/react-use-controllable-state': 1.0.0(react@16.14.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) - '@radix-ui/react-slot@1.0.1(react@19.1.0)': + '@radix-ui/react-slot@1.0.1(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 - '@radix-ui/react-compose-refs': 1.0.0(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-compose-refs': 1.0.0(react@16.14.0) + react: 16.14.0 - '@radix-ui/react-slot@1.1.2(@types/react@19.1.7)(react@19.1.0)': + '@radix-ui/react-slot@1.1.2(@types/react@19.1.7)(react@16.14.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.7)(react@16.14.0) + react: 16.14.0 optionalDependencies: '@types/react': 19.1.7 - '@radix-ui/react-tabs@1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-tabs@1.0.2(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 '@radix-ui/primitive': 1.0.0 - '@radix-ui/react-context': 1.0.0(react@19.1.0) - '@radix-ui/react-direction': 1.0.0(react@19.1.0) - '@radix-ui/react-id': 1.0.0(react@19.1.0) - '@radix-ui/react-presence': 1.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 1.0.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.0.0(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-context': 1.0.0(react@16.14.0) + '@radix-ui/react-direction': 1.0.0(react@16.14.0) + '@radix-ui/react-id': 1.0.0(react@16.14.0) + '@radix-ui/react-presence': 1.0.0(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-primitive': 1.0.1(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-roving-focus': 1.0.2(react-dom@19.1.0(react@16.14.0))(react@16.14.0) + '@radix-ui/react-use-controllable-state': 1.0.0(react@16.14.0) + react: 16.14.0 + react-dom: 19.1.0(react@16.14.0) - '@radix-ui/react-use-callback-ref@1.0.0(react@19.1.0)': + '@radix-ui/react-use-callback-ref@1.0.0(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 - react: 19.1.0 + react: 16.14.0 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.1.7)(react@19.1.0)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.1.7)(react@16.14.0)': dependencies: - react: 19.1.0 + react: 16.14.0 optionalDependencies: '@types/react': 19.1.7 - '@radix-ui/react-use-controllable-state@1.0.0(react@19.1.0)': + '@radix-ui/react-use-controllable-state@1.0.0(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 - '@radix-ui/react-use-callback-ref': 1.0.0(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-use-callback-ref': 1.0.0(react@16.14.0) + react: 16.14.0 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.1.7)(react@19.1.0)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.1.7)(react@16.14.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.7)(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.7)(react@16.14.0) + react: 16.14.0 optionalDependencies: '@types/react': 19.1.7 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.1.7)(react@19.1.0)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.1.7)(react@16.14.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.7)(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.1.7)(react@16.14.0) + react: 16.14.0 optionalDependencies: '@types/react': 19.1.7 - '@radix-ui/react-use-layout-effect@1.0.0(react@19.1.0)': + '@radix-ui/react-use-layout-effect@1.0.0(react@16.14.0)': dependencies: '@babel/runtime': 7.27.1 - react: 19.1.0 + react: 16.14.0 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.1.7)(react@19.1.0)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.1.7)(react@16.14.0)': dependencies: - react: 19.1.0 + react: 16.14.0 optionalDependencies: '@types/react': 19.1.7 - '@radix-ui/react-use-rect@1.1.0(@types/react@19.1.7)(react@19.1.0)': + '@radix-ui/react-use-rect@1.1.0(@types/react@19.1.7)(react@16.14.0)': dependencies: '@radix-ui/rect': 1.1.0 - react: 19.1.0 + react: 16.14.0 optionalDependencies: '@types/react': 19.1.7 - '@radix-ui/react-use-size@1.1.0(@types/react@19.1.7)(react@19.1.0)': + '@radix-ui/react-use-size@1.1.0(@types/react@19.1.7)(react@16.14.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.7)(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.7)(react@16.14.0) + react: 16.14.0 optionalDependencies: '@types/react': 19.1.7 @@ -18016,10 +18003,12 @@ snapshots: '@types/react-dom@19.1.6(@types/react@19.1.7)': dependencies: '@types/react': 19.1.7 + optional: true '@types/react@19.1.7': dependencies: csstype: 3.1.3 + optional: true '@types/readdir-glob@1.1.5': dependencies: @@ -20281,7 +20270,8 @@ snapshots: '@asamuzakjp/css-color': 3.1.4 rrweb-cssom: 0.8.0 - csstype@3.1.3: {} + csstype@3.1.3: + optional: true cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.2): dependencies: @@ -21695,7 +21685,7 @@ snapshots: dependencies: d3-selection: 3.0.0 kapsule: 1.16.3 - preact: 10.26.5 + preact: 10.26.8 flora-colossus@2.0.0: dependencies: @@ -23137,15 +23127,15 @@ snapshots: dependencies: '@panva/asn1.js': 1.0.0 - jotai-scope@0.7.2(jotai@2.11.0(@types/react@19.1.7)(react@19.1.0))(react@19.1.0): + jotai-scope@0.7.2(jotai@2.11.0(@types/react@19.1.7)(react@16.14.0))(react@16.14.0): dependencies: - jotai: 2.11.0(@types/react@19.1.7)(react@19.1.0) - react: 19.1.0 + jotai: 2.11.0(@types/react@19.1.7)(react@16.14.0) + react: 16.14.0 - jotai@2.11.0(@types/react@19.1.7)(react@19.1.0): + jotai@2.11.0(@types/react@19.1.7)(react@16.14.0): optionalDependencies: '@types/react': 19.1.7 - react: 19.1.0 + react: 16.14.0 jpeg-js@0.4.4: {} @@ -25431,7 +25421,7 @@ snapshots: preact@10.12.1: {} - preact@10.26.5: {} + preact@10.26.8: {} prebuild-install@7.1.3: dependencies: @@ -25614,9 +25604,9 @@ snapshots: react: 16.14.0 scheduler: 0.19.1 - react-dom@19.1.0(react@19.1.0): + react-dom@19.1.0(react@16.14.0): dependencies: - react: 19.1.0 + react: 16.14.0 scheduler: 0.26.0 react-interactive@0.8.3(react@16.14.0): @@ -25634,22 +25624,22 @@ snapshots: react-refresh@0.17.0: {} - react-remove-scroll-bar@2.3.8(@types/react@19.1.7)(react@19.1.0): + react-remove-scroll-bar@2.3.8(@types/react@19.1.7)(react@16.14.0): dependencies: - react: 19.1.0 - react-style-singleton: 2.2.3(@types/react@19.1.7)(react@19.1.0) + react: 16.14.0 + react-style-singleton: 2.2.3(@types/react@19.1.7)(react@16.14.0) tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.7 - react-remove-scroll@2.6.3(@types/react@19.1.7)(react@19.1.0): + react-remove-scroll@2.6.3(@types/react@19.1.7)(react@16.14.0): dependencies: - react: 19.1.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.1.7)(react@19.1.0) - react-style-singleton: 2.2.3(@types/react@19.1.7)(react@19.1.0) + react: 16.14.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.7)(react@16.14.0) + react-style-singleton: 2.2.3(@types/react@19.1.7)(react@16.14.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.1.7)(react@19.1.0) - use-sidecar: 1.1.3(@types/react@19.1.7)(react@19.1.0) + use-callback-ref: 1.3.3(@types/react@19.1.7)(react@16.14.0) + use-sidecar: 1.1.3(@types/react@19.1.7)(react@16.14.0) optionalDependencies: '@types/react': 19.1.7 @@ -25674,10 +25664,10 @@ snapshots: react: 16.14.0 warning: 4.0.3 - react-style-singleton@2.2.3(@types/react@19.1.7)(react@19.1.0): + react-style-singleton@2.2.3(@types/react@19.1.7)(react@16.14.0): dependencies: get-nonce: 1.0.1 - react: 19.1.0 + react: 16.14.0 tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.7 @@ -25688,8 +25678,6 @@ snapshots: object-assign: 4.1.1 prop-types: 15.8.1 - react@19.1.0: {} - read-binary-file-arch@1.0.6: dependencies: debug: 4.4.1(supports-color@6.0.0) @@ -27341,9 +27329,9 @@ snapshots: dependencies: safe-buffer: 5.2.1 - tunnel-rat@0.1.2(@types/react@19.1.7)(react@19.1.0): + tunnel-rat@0.1.2(@types/react@19.1.7)(react@16.14.0): dependencies: - zustand: 4.5.6(@types/react@19.1.7)(react@19.1.0) + zustand: 4.5.6(@types/react@19.1.7)(react@16.14.0) transitivePeerDependencies: - '@types/react' - immer @@ -27562,24 +27550,24 @@ snapshots: urlpattern-polyfill@10.0.0: {} - use-callback-ref@1.3.3(@types/react@19.1.7)(react@19.1.0): + use-callback-ref@1.3.3(@types/react@19.1.7)(react@16.14.0): dependencies: - react: 19.1.0 + react: 16.14.0 tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.7 - use-sidecar@1.1.3(@types/react@19.1.7)(react@19.1.0): + use-sidecar@1.1.3(@types/react@19.1.7)(react@16.14.0): dependencies: detect-node-es: 1.1.0 - react: 19.1.0 + react: 16.14.0 tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.7 - use-sync-external-store@1.5.0(react@19.1.0): + use-sync-external-store@1.5.0(react@16.14.0): dependencies: - react: 19.1.0 + react: 16.14.0 userhome@1.0.1: {} @@ -27723,11 +27711,11 @@ snapshots: vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.87.0)(sass@1.87.0)(stylus@0.64.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.5 - fdir: 6.4.4(picomatch@4.0.2) + fdir: 6.4.5(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.3 rollup: 4.40.0 - tinyglobby: 0.2.13 + tinyglobby: 0.2.14 optionalDependencies: '@types/node': 22.15.30 fsevents: 2.3.3 @@ -28362,9 +28350,9 @@ snapshots: zod@3.24.4: {} - zustand@4.5.6(@types/react@19.1.7)(react@19.1.0): + zustand@4.5.6(@types/react@19.1.7)(react@16.14.0): dependencies: - use-sync-external-store: 1.5.0(react@19.1.0) + use-sync-external-store: 1.5.0(react@16.14.0) optionalDependencies: '@types/react': 19.1.7 - react: 19.1.0 + react: 16.14.0 From 3e0f420eeccc44e71518c15fbc3eadbc709a7a58 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 10 Jun 2025 22:44:11 +0300 Subject: [PATCH 02/27] chore(canvas): reintroduce wrapper --- .../client/src/widgets/type_widgets/canvas.ts | 1 + .../src/widgets/type_widgets/canvas_el.ts | 20 +++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas.ts b/apps/client/src/widgets/type_widgets/canvas.ts index 6ce7a3b83..32bb1e325 100644 --- a/apps/client/src/widgets/type_widgets/canvas.ts +++ b/apps/client/src/widgets/type_widgets/canvas.ts @@ -20,6 +20,7 @@ const TPL = /*html*/` .excalidraw-wrapper { height: 100%; + } :root[dir="ltr"] .excalidraw diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts index 814018519..8c7f5b752 100644 --- a/apps/client/src/widgets/type_widgets/canvas_el.ts +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -1,7 +1,23 @@ import "@excalidraw/excalidraw/index.css"; import { Excalidraw } from "@excalidraw/excalidraw"; -import { h, render } from "preact"; +import { createElement, createRef, Fragment, render } from "preact/compat"; export default function renderCanvas(targetEl: HTMLElement) { - render(h(Excalidraw, null, "Hello world"), targetEl); + render(createCanvasElement(), targetEl); +} + +function createCanvasElement() { + const excalidrawWrapperRef = createRef(); + + return createElement(Fragment, null, + createElement( + "div", + { + className: "excalidraw-wrapper", + ref: excalidrawWrapperRef + }, + createElement(Excalidraw, { + + }) + )); } From 5ad3d7d077081736214c53a5f779a5ced37370ed Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 10 Jun 2025 22:50:39 +0300 Subject: [PATCH 03/27] chore(canvas): missing API endpoint --- apps/client/src/widgets/type_widgets/canvas.ts | 7 ++++++- apps/client/src/widgets/type_widgets/canvas_el.ts | 11 +++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas.ts b/apps/client/src/widgets/type_widgets/canvas.ts index 32bb1e325..3f3eabe50 100644 --- a/apps/client/src/widgets/type_widgets/canvas.ts +++ b/apps/client/src/widgets/type_widgets/canvas.ts @@ -3,6 +3,7 @@ import utils from "../../services/utils.js"; import server from "../../services/server.js"; import type FNote from "../../entities/fnote.js"; import options from "../../services/options.js"; +import { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/types"; const TPL = /*html*/`
@@ -184,7 +185,11 @@ export default class ExcalidrawTypeWidget extends TypeWidget { (window.process.env as any).PREACT = false; const renderCanvas = (await import("./canvas_el.js")).default; - renderCanvas(renderElement); + renderCanvas(renderElement, { + excalidrawAPI: (api: ExcalidrawImperativeAPI) => { + this.excalidrawApi = api; + }, + }); } /** diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts index 8c7f5b752..9ab0269e0 100644 --- a/apps/client/src/widgets/type_widgets/canvas_el.ts +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -1,12 +1,13 @@ import "@excalidraw/excalidraw/index.css"; import { Excalidraw } from "@excalidraw/excalidraw"; import { createElement, createRef, Fragment, render } from "preact/compat"; +import { ExcalidrawProps } from "@excalidraw/excalidraw/types"; -export default function renderCanvas(targetEl: HTMLElement) { - render(createCanvasElement(), targetEl); +export default function renderCanvas(targetEl: HTMLElement, opts: ExcalidrawProps) { + render(createCanvasElement(opts), targetEl); } -function createCanvasElement() { +function createCanvasElement(opts: ExcalidrawProps) { const excalidrawWrapperRef = createRef(); return createElement(Fragment, null, @@ -16,8 +17,6 @@ function createCanvasElement() { className: "excalidraw-wrapper", ref: excalidrawWrapperRef }, - createElement(Excalidraw, { - - }) + createElement(Excalidraw, opts) )); } From dd586854559b0f75b840e74ca6b8795aaf124ee5 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 10 Jun 2025 23:09:36 +0300 Subject: [PATCH 04/27] chore(canvas): bring back scene API --- .../client/src/widgets/type_widgets/canvas.ts | 86 +++++-------------- .../src/widgets/type_widgets/canvas_el.ts | 64 +++++++++++++- 2 files changed, 83 insertions(+), 67 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas.ts b/apps/client/src/widgets/type_widgets/canvas.ts index 3f3eabe50..7ea8dac19 100644 --- a/apps/client/src/widgets/type_widgets/canvas.ts +++ b/apps/client/src/widgets/type_widgets/canvas.ts @@ -4,6 +4,7 @@ import server from "../../services/server.js"; import type FNote from "../../entities/fnote.js"; import options from "../../services/options.js"; import { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/types"; +import type Canvas from "./canvas_el.js"; const TPL = /*html*/`
@@ -101,11 +102,8 @@ interface AttachmentMetadata { */ export default class ExcalidrawTypeWidget extends TypeWidget { - private readonly SCENE_VERSION_INITIAL: number; - private readonly SCENE_VERSION_ERROR: number; - private currentNoteId: string; - private currentSceneVersion: number; + private libraryChanged: boolean; private librarycache: LibraryItem[]; private attachmentMetadata: AttachmentMetadata[]; @@ -116,21 +114,17 @@ export default class ExcalidrawTypeWidget extends TypeWidget { private $render!: JQuery; private reactHandlers!: JQuery; + private canvasInstance!: Canvas; constructor() { super(); - // constants - this.SCENE_VERSION_INITIAL = -1; // -1 indicates that it is fresh. excalidraw scene version is always >0 - this.SCENE_VERSION_ERROR = -2; // -2 indicates error - // currently required by excalidraw, in order to allows self-hosting fonts locally. // this avoids making excalidraw load the fonts from an external CDN. (window as any).EXCALIDRAW_ASSET_PATH = `${window.location.pathname}/node_modules/@excalidraw/excalidraw/dist/prod`; // temporary vars this.currentNoteId = ""; - this.currentSceneVersion = this.SCENE_VERSION_INITIAL; // will be overwritten this.$render; @@ -184,12 +178,11 @@ export default class ExcalidrawTypeWidget extends TypeWidget { } (window.process.env as any).PREACT = false; - const renderCanvas = (await import("./canvas_el.js")).default; - renderCanvas(renderElement, { - excalidrawAPI: (api: ExcalidrawImperativeAPI) => { - this.excalidrawApi = api; - }, + const Canvas = (await import("./canvas_el.js")).default; + this.canvasInstance = new Canvas({ + }); + this.canvasInstance.renderCanvas(renderElement); } /** @@ -200,7 +193,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { const noteChanged = this.currentNoteId !== note.noteId; if (noteChanged) { // reset the scene to omit unnecessary onchange handler - this.currentSceneVersion = this.SCENE_VERSION_INITIAL; + this.canvasInstance?.resetSceneVersion(); } this.currentNoteId = note.noteId; @@ -208,7 +201,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { const blob = await note.getBlob(); // before we load content into excalidraw, make sure excalidraw has loaded - while (!this.excalidrawApi) { + while (!this.canvasInstance?.excalidrawApi) { console.log("excalidrawApi not yet loaded, sleep 200ms..."); await utils.sleep(200); } @@ -228,7 +221,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { }; // TODO: Props mismatch. - this.excalidrawApi.updateScene(sceneData as any); + this.canvasInstance.excalidrawApi.updateScene(sceneData as any); } else if (blob.content) { let content: CanvasContent; @@ -301,7 +294,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { const metadata = results.map((result) => result.metadata); // Update the library and save to independent variables - this.excalidrawApi.updateLibrary({ libraryItems, merge: false }); + this.canvasInstance.excalidrawApi.updateLibrary({ libraryItems, merge: false }); // save state of library to compare it to the new state later. this.librarycache = libraryItems; @@ -310,14 +303,14 @@ export default class ExcalidrawTypeWidget extends TypeWidget { // Update the scene // TODO: Fix type of sceneData - this.excalidrawApi.updateScene(sceneData as any); - this.excalidrawApi.addFiles(fileArray); - this.excalidrawApi.history.clear(); + this.canvasInstance.excalidrawApi.updateScene(sceneData as any); + this.canvasInstance.excalidrawApi.addFiles(fileArray); + this.canvasInstance.excalidrawApi.history.clear(); } // set initial scene version - if (this.currentSceneVersion === this.SCENE_VERSION_INITIAL) { - this.currentSceneVersion = this.getSceneVersion(); + if (this.canvasInstance.isInitialScene()) { + this.canvasInstance.updateSceneVersion(); } } @@ -326,14 +319,14 @@ export default class ExcalidrawTypeWidget extends TypeWidget { * this is automatically called after this.saveData(); */ async getData() { - const elements = this.excalidrawApi.getSceneElements(); - const appState = this.excalidrawApi.getAppState(); + const elements = this.canvasInstance.excalidrawApi.getSceneElements(); + const appState = this.canvasInstance.excalidrawApi.getAppState(); /** * A file is not deleted, even though removed from canvas. Therefore, we only keep * files that are referenced by an element. Maybe this will change with a new excalidraw version? */ - const files = this.excalidrawApi.getFiles(); + const files = this.canvasInstance.excalidrawApi.getFiles(); // parallel svg export to combat bitrot and enable rendering image for note inclusion, preview, and share const svg = await this.excalidrawLib.exportToSvg({ @@ -370,7 +363,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { // this.libraryChanged is unset in dataSaved() // there's no separate method to get library items, so have to abuse this one - const libraryItems = await this.excalidrawApi.updateLibrary({ + const libraryItems = await this.canvasInstance.excalidrawApi.updateLibrary({ libraryItems() { return []; }, @@ -444,53 +437,20 @@ export default class ExcalidrawTypeWidget extends TypeWidget { } // changeHandler is called upon any tiny change in excalidraw. button clicked, hover, etc. // make sure only when a new element is added, we actually save something. - const isNewSceneVersion = this.isNewSceneVersion(); + const isNewSceneVersion = this.canvasInstance.isNewSceneVersion(); /** * FIXME: however, we might want to make an exception, if viewport changed, since viewport * is desired to save? (add) and appState background, and some things */ // upon updateScene, onchange is called, even though "nothing really changed" that is worth saving - const isNotInitialScene = this.currentSceneVersion !== this.SCENE_VERSION_INITIAL; - + const isNotInitialScene = !this.canvasInstance.isInitialScene(); const shouldSave = isNewSceneVersion && isNotInitialScene; if (shouldSave) { - this.updateSceneVersion(); + this.canvasInstance.updateSceneVersion(); this.saveData(); } } - /** - * needed to ensure, that multipleOnChangeHandler calls do not trigger a save. - * we compare the scene version as suggested in: - * https://github.com/excalidraw/excalidraw/issues/3014#issuecomment-778115329 - * - * info: sceneVersions are not incrementing. it seems to be a pseudo-random number - */ - isNewSceneVersion() { - if (options.is("databaseReadonly")) { - return false; - } - - const sceneVersion = this.getSceneVersion(); - - return ( - this.currentSceneVersion === this.SCENE_VERSION_INITIAL || // initial scene version update - this.currentSceneVersion !== sceneVersion - ); // ensure scene changed - } - - getSceneVersion() { - if (this.excalidrawApi) { - const elements = this.excalidrawApi.getSceneElements(); - return this.excalidrawLib.getSceneVersion(elements); - } else { - return this.SCENE_VERSION_ERROR; - } - } - - updateSceneVersion() { - this.currentSceneVersion = this.getSceneVersion(); - } } diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts index 9ab0269e0..5ad275d4e 100644 --- a/apps/client/src/widgets/type_widgets/canvas_el.ts +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -1,10 +1,66 @@ import "@excalidraw/excalidraw/index.css"; -import { Excalidraw } from "@excalidraw/excalidraw"; +import { Excalidraw, getSceneVersion, exportToSvg } from "@excalidraw/excalidraw"; import { createElement, createRef, Fragment, render } from "preact/compat"; -import { ExcalidrawProps } from "@excalidraw/excalidraw/types"; +import { ExcalidrawImperativeAPI, ExcalidrawProps } from "@excalidraw/excalidraw/types"; + +/** -1 indicates that it is fresh. excalidraw scene version is always >0 */ +const SCENE_VERSION_INITIAL = -1; +/** -2 indicates error */ +const SCENE_VERSION_ERROR = -2; + +export default class Canvas { + + private currentSceneVersion: number; + private opts: ExcalidrawProps; + excalidrawApi!: ExcalidrawImperativeAPI; + + constructor(opts: ExcalidrawProps) { + this.opts = opts; + this.currentSceneVersion = SCENE_VERSION_INITIAL; + } + + renderCanvas(targetEl: HTMLElement) { + render(createCanvasElement({ + ...this.opts, + excalidrawAPI: (api: ExcalidrawImperativeAPI) => { + this.excalidrawApi = api; + }, + }), targetEl); + } + + /** + * needed to ensure, that multipleOnChangeHandler calls do not trigger a save. + * we compare the scene version as suggested in: + * https://github.com/excalidraw/excalidraw/issues/3014#issuecomment-778115329 + * + * info: sceneVersions are not incrementing. it seems to be a pseudo-random number + */ + isNewSceneVersion() { + const sceneVersion = this.getSceneVersion(); + + return ( + this.currentSceneVersion === SCENE_VERSION_INITIAL || // initial scene version update + this.currentSceneVersion !== sceneVersion + ); // ensure scene changed + } + + getSceneVersion() { + const elements = this.excalidrawApi.getSceneElements(); + return getSceneVersion(elements); + } + + updateSceneVersion() { + this.currentSceneVersion = this.getSceneVersion(); + } + + resetSceneVersion() { + this.currentSceneVersion = SCENE_VERSION_INITIAL; + } + + isInitialScene() { + return this.currentSceneVersion === SCENE_VERSION_INITIAL; + } -export default function renderCanvas(targetEl: HTMLElement, opts: ExcalidrawProps) { - render(createCanvasElement(opts), targetEl); } function createCanvasElement(opts: ExcalidrawProps) { From ddbd268a663c5deb19e31109102254b84bb66749 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 10 Jun 2025 23:25:43 +0300 Subject: [PATCH 05/27] chore(canvas): bring back load/save --- .../client/src/widgets/type_widgets/canvas.ts | 84 ++----------- .../src/widgets/type_widgets/canvas_el.ts | 116 +++++++++++++++--- 2 files changed, 109 insertions(+), 91 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas.ts b/apps/client/src/widgets/type_widgets/canvas.ts index 7ea8dac19..58b7cfe01 100644 --- a/apps/client/src/widgets/type_widgets/canvas.ts +++ b/apps/client/src/widgets/type_widgets/canvas.ts @@ -108,7 +108,6 @@ export default class ExcalidrawTypeWidget extends TypeWidget { private librarycache: LibraryItem[]; private attachmentMetadata: AttachmentMetadata[]; private themeStyle!: Theme; - private excalidrawLib!: typeof import("@excalidraw/excalidraw"); private excalidrawApi!: ExcalidrawImperativeAPI; private excalidrawWrapperRef!: React.RefObject; @@ -180,7 +179,10 @@ export default class ExcalidrawTypeWidget extends TypeWidget { const Canvas = (await import("./canvas_el.js")).default; this.canvasInstance = new Canvas({ - + // this makes sure that 1) manual theme switch button is hidden 2) theme stays as it should after opening menu + theme: this.themeStyle, + onChange: () => this.onChangeHandler(), + viewModeEnabled: options.is("databaseReadonly"), }); this.canvasInstance.renderCanvas(renderElement); } @@ -238,36 +240,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { }; } - const { elements, files } = content; - const appState: Partial = content.appState ?? {}; - - appState.theme = this.themeStyle; - - if (this.excalidrawWrapperRef.current) { - const boundingClientRect = this.excalidrawWrapperRef.current.getBoundingClientRect(); - appState.width = boundingClientRect.width; - appState.height = boundingClientRect.height; - appState.offsetLeft = boundingClientRect.left; - appState.offsetTop = boundingClientRect.top; - } - - const sceneData: SceneData = { - elements, - appState - }; - - // files are expected in an array when loading. they are stored as a key-index object - // see example for loading here: - // https://github.com/excalidraw/excalidraw/blob/c5a7723185f6ca05e0ceb0b0d45c4e3fbcb81b2a/src/packages/excalidraw/example/App.js#L68 - const fileArray: BinaryFileData[] = []; - for (const fileId in files) { - const file = files[fileId]; - // TODO: dataURL is replaceable with a trilium image url - // maybe we can save normal images (pasted) with base64 data url, and trilium images - // with their respective url! nice - // file.dataURL = "http://localhost:8080/api/images/ltjOiU8nwoZx/start.png"; - fileArray.push(file); - } + this.canvasInstance.loadData(content, this.themeStyle); Promise.all( (await note.getAttachmentsByRole("canvasLibraryItem")).map(async (attachment) => { @@ -301,11 +274,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { this.attachmentMetadata = metadata; }); - // Update the scene - // TODO: Fix type of sceneData - this.canvasInstance.excalidrawApi.updateScene(sceneData as any); - this.canvasInstance.excalidrawApi.addFiles(fileArray); - this.canvasInstance.excalidrawApi.history.clear(); + } // set initial scene version @@ -319,45 +288,8 @@ export default class ExcalidrawTypeWidget extends TypeWidget { * this is automatically called after this.saveData(); */ async getData() { - const elements = this.canvasInstance.excalidrawApi.getSceneElements(); - const appState = this.canvasInstance.excalidrawApi.getAppState(); - - /** - * A file is not deleted, even though removed from canvas. Therefore, we only keep - * files that are referenced by an element. Maybe this will change with a new excalidraw version? - */ - const files = this.canvasInstance.excalidrawApi.getFiles(); - - // parallel svg export to combat bitrot and enable rendering image for note inclusion, preview, and share - const svg = await this.excalidrawLib.exportToSvg({ - elements, - appState, - exportPadding: 5, // 5 px padding - files - }); - const svgString = svg.outerHTML; - - const activeFiles: Record = {}; - // TODO: Used any where upstream typings appear to be broken. - elements.forEach((element: any) => { - if ("fileId" in element && element.fileId) { - activeFiles[element.fileId] = files[element.fileId]; - } - }); - - const content = { - type: "excalidraw", - version: 2, - elements, - files: activeFiles, - appState: { - scrollX: appState.scrollX, - scrollY: appState.scrollY, - zoom: appState.zoom - } - }; - - const attachments = [{ role: "image", title: "canvas-export.svg", mime: "image/svg+xml", content: svgString, position: 0 }]; + const { content, svg } = await this.canvasInstance.getData(); + const attachments = [{ role: "image", title: "canvas-export.svg", mime: "image/svg+xml", content: svg, position: 0 }]; if (this.libraryChanged) { // this.libraryChanged is unset in dataSaved() diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts index 5ad275d4e..078619edd 100644 --- a/apps/client/src/widgets/type_widgets/canvas_el.ts +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -1,7 +1,7 @@ import "@excalidraw/excalidraw/index.css"; import { Excalidraw, getSceneVersion, exportToSvg } from "@excalidraw/excalidraw"; -import { createElement, createRef, Fragment, render } from "preact/compat"; -import { ExcalidrawImperativeAPI, ExcalidrawProps } from "@excalidraw/excalidraw/types"; +import { createElement, createRef, Fragment, RefObject, render } from "preact/compat"; +import { AppState, BinaryFileData, ExcalidrawImperativeAPI, ExcalidrawProps, SceneData } from "@excalidraw/excalidraw/types"; /** -1 indicates that it is fresh. excalidraw scene version is always >0 */ const SCENE_VERSION_INITIAL = -1; @@ -12,6 +12,7 @@ export default class Canvas { private currentSceneVersion: number; private opts: ExcalidrawProps; + private excalidrawWrapperRef: RefObject; excalidrawApi!: ExcalidrawImperativeAPI; constructor(opts: ExcalidrawProps) { @@ -20,7 +21,7 @@ export default class Canvas { } renderCanvas(targetEl: HTMLElement) { - render(createCanvasElement({ + render(this.createCanvasElement({ ...this.opts, excalidrawAPI: (api: ExcalidrawImperativeAPI) => { this.excalidrawApi = api; @@ -28,6 +29,20 @@ export default class Canvas { }), targetEl); } + private createCanvasElement(opts: ExcalidrawProps) { + const excalidrawWrapperRef = createRef(); + + return createElement(Fragment, null, + createElement( + "div", + { + className: "excalidraw-wrapper", + ref: excalidrawWrapperRef + }, + createElement(Excalidraw, opts) + )); + } + /** * needed to ensure, that multipleOnChangeHandler calls do not trigger a save. * we compare the scene version as suggested in: @@ -61,18 +76,89 @@ export default class Canvas { return this.currentSceneVersion === SCENE_VERSION_INITIAL; } + loadData(content: any, theme: any) { + const { elements, files } = content; + const appState: Partial = content.appState ?? {}; + + appState.theme = theme; + + if (this.excalidrawWrapperRef?.current) { + const boundingClientRect = this.excalidrawWrapperRef.current.getBoundingClientRect(); + appState.width = boundingClientRect.width; + appState.height = boundingClientRect.height; + appState.offsetLeft = boundingClientRect.left; + appState.offsetTop = boundingClientRect.top; + } + + const sceneData: SceneData = { + elements, + appState + }; + + // files are expected in an array when loading. they are stored as a key-index object + // see example for loading here: + // https://github.com/excalidraw/excalidraw/blob/c5a7723185f6ca05e0ceb0b0d45c4e3fbcb81b2a/src/packages/excalidraw/example/App.js#L68 + const fileArray: BinaryFileData[] = []; + for (const fileId in files) { + const file = files[fileId]; + // TODO: dataURL is replaceable with a trilium image url + // maybe we can save normal images (pasted) with base64 data url, and trilium images + // with their respective url! nice + // file.dataURL = "http://localhost:8080/api/images/ltjOiU8nwoZx/start.png"; + fileArray.push(file); + } + + // Update the scene + // TODO: Fix type of sceneData + this.excalidrawApi.updateScene(sceneData as any); + this.excalidrawApi.addFiles(fileArray); + this.excalidrawApi.history.clear(); + } + + async getData() { + const elements = this.excalidrawApi.getSceneElements(); + const appState = this.excalidrawApi.getAppState(); + + /** + * A file is not deleted, even though removed from canvas. Therefore, we only keep + * files that are referenced by an element. Maybe this will change with a new excalidraw version? + */ + const files = this.excalidrawApi.getFiles(); + // parallel svg export to combat bitrot and enable rendering image for note inclusion, preview, and share + const svg = await exportToSvg({ + elements, + appState, + exportPadding: 5, // 5 px padding + files + }); + const svgString = svg.outerHTML; + + const activeFiles: Record = {}; + // TODO: Used any where upstream typings appear to be broken. + elements.forEach((element: any) => { + if ("fileId" in element && element.fileId) { + activeFiles[element.fileId] = files[element.fileId]; + } + }); + + const content = { + type: "excalidraw", + version: 2, + elements, + files: activeFiles, + appState: { + scrollX: appState.scrollX, + scrollY: appState.scrollY, + zoom: appState.zoom + } + }; + + return { + content, + svg: svgString + } + } + } -function createCanvasElement(opts: ExcalidrawProps) { - const excalidrawWrapperRef = createRef(); - return createElement(Fragment, null, - createElement( - "div", - { - className: "excalidraw-wrapper", - ref: excalidrawWrapperRef - }, - createElement(Excalidraw, opts) - )); -} From 5b98277f3cc2d94d788d858eb9ff5213e492cdb0 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 10 Jun 2025 23:28:36 +0300 Subject: [PATCH 06/27] chore(canvas): bring back more options --- apps/client/src/widgets/type_widgets/canvas.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps/client/src/widgets/type_widgets/canvas.ts b/apps/client/src/widgets/type_widgets/canvas.ts index 58b7cfe01..0927bb1aa 100644 --- a/apps/client/src/widgets/type_widgets/canvas.ts +++ b/apps/client/src/widgets/type_widgets/canvas.ts @@ -183,6 +183,23 @@ export default class ExcalidrawTypeWidget extends TypeWidget { theme: this.themeStyle, onChange: () => this.onChangeHandler(), viewModeEnabled: options.is("databaseReadonly"), + zenModeEnabled: false, + gridModeEnabled: false, + isCollaborating: false, + detectScroll: false, + handleKeyboardGlobally: false, + autoFocus: false, + UIOptions: { + canvasActions: { + saveToActiveFile: false, + export: false + } + }, + onLibraryChange: () => { + this.libraryChanged = true; + + this.saveData(); + }, }); this.canvasInstance.renderCanvas(renderElement); } From 4bd5644258259f5babb27e9fbe84ea37b82c48ae Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 10 Jun 2025 23:35:03 +0300 Subject: [PATCH 07/27] refactor(canvas): access to wrapper --- apps/client/src/widgets/type_widgets/canvas_el.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts index 078619edd..c9cf6f735 100644 --- a/apps/client/src/widgets/type_widgets/canvas_el.ts +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -1,6 +1,6 @@ import "@excalidraw/excalidraw/index.css"; import { Excalidraw, getSceneVersion, exportToSvg } from "@excalidraw/excalidraw"; -import { createElement, createRef, Fragment, RefObject, render } from "preact/compat"; +import { createElement, createRef, Fragment, RefObject, render, useEffect, useState } from "preact/compat"; import { AppState, BinaryFileData, ExcalidrawImperativeAPI, ExcalidrawProps, SceneData } from "@excalidraw/excalidraw/types"; /** -1 indicates that it is fresh. excalidraw scene version is always >0 */ @@ -12,7 +12,7 @@ export default class Canvas { private currentSceneVersion: number; private opts: ExcalidrawProps; - private excalidrawWrapperRef: RefObject; + private excalidrawWrapperRef?: RefObject; excalidrawApi!: ExcalidrawImperativeAPI; constructor(opts: ExcalidrawProps) { @@ -30,14 +30,13 @@ export default class Canvas { } private createCanvasElement(opts: ExcalidrawProps) { - const excalidrawWrapperRef = createRef(); - + this.excalidrawWrapperRef = createRef(); return createElement(Fragment, null, createElement( "div", { className: "excalidraw-wrapper", - ref: excalidrawWrapperRef + ref: this.excalidrawWrapperRef }, createElement(Excalidraw, opts) )); @@ -160,5 +159,3 @@ export default class Canvas { } } - - From a7c115cdf5080c88dd1c956fc9d9548905a57eb3 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 10 Jun 2025 23:41:15 +0300 Subject: [PATCH 08/27] chore(canvas): solve type errors --- apps/client/src/widgets/type_widgets/canvas.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/type_widgets/canvas.ts b/apps/client/src/widgets/type_widgets/canvas.ts index 0927bb1aa..427c1697d 100644 --- a/apps/client/src/widgets/type_widgets/canvas.ts +++ b/apps/client/src/widgets/type_widgets/canvas.ts @@ -3,7 +3,8 @@ import utils from "../../services/utils.js"; import server from "../../services/server.js"; import type FNote from "../../entities/fnote.js"; import options from "../../services/options.js"; -import { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/types"; +import type { AppState, BinaryFileData, ExcalidrawImperativeAPI, LibraryItem, SceneData } from "@excalidraw/excalidraw/types"; +import type { ExcalidrawElement, Theme } from "@excalidraw/excalidraw/element/types"; import type Canvas from "./canvas_el.js"; const TPL = /*html*/` From 00c5497d937eb2448263e91ea4d8b8b35edb6633 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 09:24:07 +0300 Subject: [PATCH 09/27] chore(cI): use pnpm exec instead of pnpx --- .github/workflows/ci.yml | 49 +++++++++++++++++++++++++++++++ .github/workflows/main-docker.yml | 4 +-- .github/workflows/playwright.yml | 4 +-- 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..4cd298de8 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,49 @@ +name: CI + +on: + push: + branches: + - master + pull_request: + +permissions: + actions: read + contents: read + +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + filter: tree:0 + fetch-depth: 0 + + + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + run_install: false + + # This enables task distribution via Nx Cloud + # Run this command as early as possible, before dependencies are installed + # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun + # Connect your workspace by running "nx connect" and uncomment this line to enable task distribution + # - run: pnpm dlx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="e2e-ci" + + + # Cache node_modules + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - run: pnpm install --frozen-lockfile + - run: pnpm exec playwright install --with-deps + - uses: nrwl/nx-set-shas@v4 + + # Prepend any command with "nx-cloud record --" to record its logs to Nx Cloud + # - run: pnpm exec nx-cloud record -- echo Hello World + # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected + # When you enable task distribution, run the e2e-ci task instead of e2e + - run: pnpm exec nx affected -t lint test build e2e diff --git a/.github/workflows/main-docker.yml b/.github/workflows/main-docker.yml index 2fe298217..e59ddc318 100644 --- a/.github/workflows/main-docker.yml +++ b/.github/workflows/main-docker.yml @@ -53,7 +53,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Install Playwright Browsers - run: pnpx playwright install --with-deps + run: pnpm exec playwright install --with-deps - name: Run the TypeScript build run: pnpm run server:build @@ -82,7 +82,7 @@ jobs: require-healthy: true - name: Run Playwright tests - run: TRILIUM_DOCKER=1 TRILIUM_PORT=8082 pnpx nx run server-e2e:e2e + run: TRILIUM_DOCKER=1 TRILIUM_PORT=8082 pnpm exec nx run server-e2e:e2e - uses: actions/upload-artifact@v4 if: ${{ !cancelled() }} with: diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 597f1173d..8ea06d74b 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -33,11 +33,11 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - - run: pnpx playwright install --with-deps + - run: pnpm exec playwright install --with-deps - uses: nrwl/nx-set-shas@v4 # Prepend any command with "nx-cloud record --" to record its logs to Nx Cloud # - run: npx nx-cloud record -- echo Hello World # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected # When you enable task distribution, run the e2e-ci task instead of e2e - - run: pnpx nx affected -t e2e + - run: pnpm exec nx affected -t e2e From e032e6f217a619f4f179f22547c7e39dd20de6a1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 10:07:39 +0300 Subject: [PATCH 10/27] refactor(deps): remove package lock from package --- packages/share-theme/package-lock.json | 2562 ------------------------ 1 file changed, 2562 deletions(-) delete mode 100644 packages/share-theme/package-lock.json diff --git a/packages/share-theme/package-lock.json b/packages/share-theme/package-lock.json deleted file mode 100644 index d28ae12ae..000000000 --- a/packages/share-theme/package-lock.json +++ /dev/null @@ -1,2562 +0,0 @@ -{ - "name": "@triliumnext/share-theme", - "version": "1.0.3", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@triliumnext/share-theme", - "version": "1.0.3", - "license": "ISC", - "devDependencies": { - "@digitak/esrun": "^3.2.24", - "@types/swagger-ui": "^3.52.0", - "@typescript-eslint/eslint-plugin": "^6.7.2", - "@typescript-eslint/parser": "^6.7.2", - "dotenv": "^16.3.1", - "esbuild": "^0.25.0", - "eslint": "^8.49.0", - "highlight.js": "^11.8.0", - "typescript": "^5.2.2" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@digitak/esrun": { - "version": "3.2.24", - "resolved": "https://registry.npmjs.org/@digitak/esrun/-/esrun-3.2.24.tgz", - "integrity": "sha512-HvD1eSuZVBaFZpKU/kl2rzDELCAbAnrFO2in855IrX15Zji4sdrekiEQph+eq5W5xjCyc254zx/Bh8RM2216mg==", - "dev": true, - "dependencies": { - "@digitak/grubber": "^3.1.4", - "chokidar": "^3.5.1", - "esbuild": "^0.17.4" - }, - "bin": { - "esrun": "bin.js" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@digitak/esrun/node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "node_modules/@digitak/grubber": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@digitak/grubber/-/grubber-3.1.4.tgz", - "integrity": "sha512-pqsnp2BUYlDoTXWG34HWgEJse/Eo1okRgNex8IG84wHrJp8h3SakeR5WhB4VxSA2+/D+frNYJ0ch3yXzsfNDoA==", - "dev": true - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", - "dev": true - }, - "node_modules/@types/swagger-ui": { - "version": "3.52.0", - "resolved": "https://registry.npmjs.org/@types/swagger-ui/-/swagger-ui-3.52.0.tgz", - "integrity": "sha512-SlufixEmh+8CLHNgTfAfCT1icNOF7bXboWabhHr1+hIolqlvfwYJGe7HgRcpI3ChE7HWASmEKLkMu34rxseJjQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", - "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/type-utils": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", - "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", - "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", - "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/highlight.js": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", - "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} From 963c7386b1b69e2a17a7a00b303dd0492de5cfcc Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 10:45:25 +0300 Subject: [PATCH 11/27] chore(ci): remove accidental workflow --- .github/workflows/ci.yml | 49 ---------------------------------------- 1 file changed, 49 deletions(-) delete mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 4cd298de8..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: CI - -on: - push: - branches: - - master - pull_request: - -permissions: - actions: read - contents: read - -jobs: - main: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - filter: tree:0 - fetch-depth: 0 - - - - uses: pnpm/action-setup@v4 - name: Install pnpm - with: - run_install: false - - # This enables task distribution via Nx Cloud - # Run this command as early as possible, before dependencies are installed - # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun - # Connect your workspace by running "nx connect" and uncomment this line to enable task distribution - # - run: pnpm dlx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="e2e-ci" - - - # Cache node_modules - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: 'pnpm' - - - run: pnpm install --frozen-lockfile - - run: pnpm exec playwright install --with-deps - - uses: nrwl/nx-set-shas@v4 - - # Prepend any command with "nx-cloud record --" to record its logs to Nx Cloud - # - run: pnpm exec nx-cloud record -- echo Hello World - # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected - # When you enable task distribution, run the e2e-ci task instead of e2e - - run: pnpm exec nx affected -t lint test build e2e From b27d0171742f7b0b5a078b9374e4afbbab3b7f91 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 07:48:05 +0000 Subject: [PATCH 12/27] chore(deps): update dependency @types/mime-types to v3.0.1 --- pnpm-lock.yaml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e34d4dba..a0d3b5f9d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11679,6 +11679,10 @@ packages: resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + socks@2.8.5: + resolution: {integrity: sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sort-keys-length@1.0.1: resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} engines: {node: '>=0.10.0'} @@ -26441,7 +26445,7 @@ snapshots: dependencies: agent-base: 6.0.2 debug: 4.4.1(supports-color@6.0.0) - socks: 2.8.4 + socks: 2.8.5 transitivePeerDependencies: - supports-color @@ -26458,6 +26462,11 @@ snapshots: ip-address: 9.0.5 smart-buffer: 4.2.0 + socks@2.8.5: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + sort-keys-length@1.0.1: dependencies: sort-keys: 1.1.2 From c8530bca758226043f2e470d8cf231918fda1c90 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 08:34:14 +0000 Subject: [PATCH 13/27] chore(deps): update dependency serve-favicon to v2.5.1 --- apps/server/package.json | 2 +- pnpm-lock.yaml | 19 +++++++------------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index 4db0cd810..cc466bea4 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -94,7 +94,7 @@ "sanitize-filename": "1.6.3", "sanitize-html": "2.17.0", "sax": "1.4.1", - "serve-favicon": "2.5.0", + "serve-favicon": "2.5.1", "stream-throttle": "0.1.3", "strip-bom": "5.0.0", "striptags": "3.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a0d3b5f9d..f8d0c5cb2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -723,8 +723,8 @@ importers: specifier: 1.4.1 version: 1.4.1 serve-favicon: - specifier: 2.5.0 - version: 2.5.0 + specifier: 2.5.1 + version: 2.5.1 stream-throttle: specifier: 0.1.3 version: 0.1.3 @@ -11273,9 +11273,6 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} - safe-buffer@5.1.1: - resolution: {integrity: sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -11523,8 +11520,8 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - serve-favicon@2.5.0: - resolution: {integrity: sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==} + serve-favicon@2.5.1: + resolution: {integrity: sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==} engines: {node: '>= 0.8.0'} serve-index@1.9.1: @@ -26007,8 +26004,6 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 - safe-buffer@5.1.1: {} - safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -26260,13 +26255,13 @@ snapshots: dependencies: randombytes: 2.1.0 - serve-favicon@2.5.0: + serve-favicon@2.5.1: dependencies: etag: 1.8.1 fresh: 0.5.2 - ms: 2.1.1 + ms: 2.1.3 parseurl: 1.3.3 - safe-buffer: 5.1.1 + safe-buffer: 5.2.1 serve-index@1.9.1: dependencies: From 509e3284ed2cf5af9e6a4faf42a7425f909fd187 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 08:46:50 +0000 Subject: [PATCH 14/27] chore(deps): update vitest monorepo to v3.2.3 --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8d0c5cb2..5f34ad048 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7449,8 +7449,8 @@ packages: picomatch: optional: true - fdir@6.4.5: - resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -21550,7 +21550,7 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - fdir@6.4.5(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -27169,7 +27169,7 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.5(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 tinypool@1.1.0: {} From e7285573acc3875800aeaffef1b936e063db823a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 08:59:30 +0000 Subject: [PATCH 15/27] chore(deps): update dependency openai to v5.3.0 --- apps/server/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index cc466bea4..87640e702 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -88,7 +88,7 @@ "multer": "2.0.1", "normalize-strings": "1.1.1", "ollama": "0.5.16", - "openai": "5.2.0", + "openai": "5.3.0", "rand-token": "1.0.1", "safe-compare": "1.1.4", "sanitize-filename": "1.6.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5f34ad048..33608bc9e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -705,8 +705,8 @@ importers: specifier: 0.5.16 version: 0.5.16 openai: - specifier: 5.2.0 - version: 5.2.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@3.24.4) + specifier: 5.3.0 + version: 5.3.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@3.24.4) rand-token: specifier: 1.0.1 version: 1.0.1 @@ -9786,8 +9786,8 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - openai@5.2.0: - resolution: {integrity: sha512-b+Sf2Yk2eApDkhqHr7C4d5hux9gkHUvyqQ7RrdSfLsjrXkCZpJPqkME0u5Py7RPB28Ozz+RkJZpW7YPTOoChew==} + openai@5.3.0: + resolution: {integrity: sha512-VIKmoF7y4oJCDOwP/oHXGzM69+x0dpGFmN9QmYO+uPbLFOmmnwO+x1GbsgUtI+6oraxomGZ566Y421oYVu191w==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -24475,7 +24475,7 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@5.2.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@3.24.4): + openai@5.3.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@3.24.4): optionalDependencies: ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) zod: 3.24.4 From 51d06ec40d7c26e3904cdc664766a6da1e67dd67 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 12:13:54 +0300 Subject: [PATCH 16/27] chore(deps): fix lockfile --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 33608bc9e..d7a1bd99c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27715,7 +27715,7 @@ snapshots: vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.87.0)(sass@1.87.0)(stylus@0.64.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.5 - fdir: 6.4.5(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.3 rollup: 4.40.0 From 5b4ceb27c5564cc03e65512f7d0aea921fb16a5d Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 12:42:12 +0300 Subject: [PATCH 17/27] refactor(canvas): remove unnecessary ref --- apps/client/src/widgets/type_widgets/canvas_el.ts | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts index c9cf6f735..ef63a8b3b 100644 --- a/apps/client/src/widgets/type_widgets/canvas_el.ts +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -12,7 +12,6 @@ export default class Canvas { private currentSceneVersion: number; private opts: ExcalidrawProps; - private excalidrawWrapperRef?: RefObject; excalidrawApi!: ExcalidrawImperativeAPI; constructor(opts: ExcalidrawProps) { @@ -30,13 +29,11 @@ export default class Canvas { } private createCanvasElement(opts: ExcalidrawProps) { - this.excalidrawWrapperRef = createRef(); return createElement(Fragment, null, createElement( "div", { className: "excalidraw-wrapper", - ref: this.excalidrawWrapperRef }, createElement(Excalidraw, opts) )); @@ -81,14 +78,6 @@ export default class Canvas { appState.theme = theme; - if (this.excalidrawWrapperRef?.current) { - const boundingClientRect = this.excalidrawWrapperRef.current.getBoundingClientRect(); - appState.width = boundingClientRect.width; - appState.height = boundingClientRect.height; - appState.offsetLeft = boundingClientRect.left; - appState.offsetTop = boundingClientRect.top; - } - const sceneData: SceneData = { elements, appState From dab9b0299034931642bbeef50119eabda4a6582b Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 12:44:24 +0300 Subject: [PATCH 18/27] refactor(canvas): remove unnecessary fragment --- apps/client/src/widgets/type_widgets/canvas_el.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts index ef63a8b3b..a6e611ac4 100644 --- a/apps/client/src/widgets/type_widgets/canvas_el.ts +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -2,6 +2,7 @@ import "@excalidraw/excalidraw/index.css"; import { Excalidraw, getSceneVersion, exportToSvg } from "@excalidraw/excalidraw"; import { createElement, createRef, Fragment, RefObject, render, useEffect, useState } from "preact/compat"; import { AppState, BinaryFileData, ExcalidrawImperativeAPI, ExcalidrawProps, SceneData } from "@excalidraw/excalidraw/types"; +import type { ComponentType, VNode } from "preact"; /** -1 indicates that it is fresh. excalidraw scene version is always >0 */ const SCENE_VERSION_INITIAL = -1; @@ -29,14 +30,9 @@ export default class Canvas { } private createCanvasElement(opts: ExcalidrawProps) { - return createElement(Fragment, null, - createElement( - "div", - { - className: "excalidraw-wrapper", - }, - createElement(Excalidraw, opts) - )); + return createElement("div", { className: "excalidraw-wrapper", }, + createElement(Excalidraw as ComponentType, opts) + ); } /** From 0da05a7dbec5f2e9d5e03bd5d9be6403a0b9d0cd Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 13:32:17 +0300 Subject: [PATCH 19/27] refactor(canvas): don't expose API directly --- .../client/src/widgets/type_widgets/canvas.ts | 35 +++++---------- .../src/widgets/type_widgets/canvas_el.ts | 43 ++++++++++++++++--- 2 files changed, 46 insertions(+), 32 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas.ts b/apps/client/src/widgets/type_widgets/canvas.ts index 427c1697d..9a0d6e34f 100644 --- a/apps/client/src/widgets/type_widgets/canvas.ts +++ b/apps/client/src/widgets/type_widgets/canvas.ts @@ -1,9 +1,8 @@ import TypeWidget from "./type_widget.js"; -import utils from "../../services/utils.js"; import server from "../../services/server.js"; import type FNote from "../../entities/fnote.js"; import options from "../../services/options.js"; -import type { AppState, BinaryFileData, ExcalidrawImperativeAPI, LibraryItem, SceneData } from "@excalidraw/excalidraw/types"; +import type { AppState, BinaryFileData, LibraryItem } from "@excalidraw/excalidraw/types"; import type { ExcalidrawElement, Theme } from "@excalidraw/excalidraw/element/types"; import type Canvas from "./canvas_el.js"; @@ -109,8 +108,6 @@ export default class ExcalidrawTypeWidget extends TypeWidget { private librarycache: LibraryItem[]; private attachmentMetadata: AttachmentMetadata[]; private themeStyle!: Theme; - private excalidrawApi!: ExcalidrawImperativeAPI; - private excalidrawWrapperRef!: React.RefObject; private $render!: JQuery; private reactHandlers!: JQuery; @@ -209,11 +206,15 @@ export default class ExcalidrawTypeWidget extends TypeWidget { * called to populate the widget container with the note content */ async doRefresh(note: FNote) { + if (!this.canvasInstance) { + await this.#init(); + } + // see if the note changed, since we do not get a new class for a new note const noteChanged = this.currentNoteId !== note.noteId; if (noteChanged) { // reset the scene to omit unnecessary onchange handler - this.canvasInstance?.resetSceneVersion(); + this.canvasInstance.resetSceneVersion(); } this.currentNoteId = note.noteId; @@ -221,10 +222,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { const blob = await note.getBlob(); // before we load content into excalidraw, make sure excalidraw has loaded - while (!this.canvasInstance?.excalidrawApi) { - console.log("excalidrawApi not yet loaded, sleep 200ms..."); - await utils.sleep(200); - } + await this.canvasInstance.waitForApiToBecomeAvailable(); /** * new and empty note - make sure that canvas is empty. @@ -233,15 +231,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { * newly instantiated? */ if (!blob?.content?.trim()) { - const sceneData: SceneData = { - elements: [], - appState: { - theme: this.themeStyle - } - }; - - // TODO: Props mismatch. - this.canvasInstance.excalidrawApi.updateScene(sceneData as any); + this.canvasInstance.resetScene(this.themeStyle); } else if (blob.content) { let content: CanvasContent; @@ -285,7 +275,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { const metadata = results.map((result) => result.metadata); // Update the library and save to independent variables - this.canvasInstance.excalidrawApi.updateLibrary({ libraryItems, merge: false }); + this.canvasInstance.updateLibrary(libraryItems); // save state of library to compare it to the new state later. this.librarycache = libraryItems; @@ -313,12 +303,7 @@ export default class ExcalidrawTypeWidget extends TypeWidget { // this.libraryChanged is unset in dataSaved() // there's no separate method to get library items, so have to abuse this one - const libraryItems = await this.canvasInstance.excalidrawApi.updateLibrary({ - libraryItems() { - return []; - }, - merge: true - }); + const libraryItems = await this.canvasInstance.getLibraryItems(); // excalidraw saves the library as a own state. the items are saved to libraryItems. then we compare the library right now with a libraryitemcache. The cache is filled when we first load the Library into the note. //We need the cache to delete old attachments later in the server. diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts index a6e611ac4..80d7c5fb8 100644 --- a/apps/client/src/widgets/type_widgets/canvas_el.ts +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -1,19 +1,19 @@ import "@excalidraw/excalidraw/index.css"; import { Excalidraw, getSceneVersion, exportToSvg } from "@excalidraw/excalidraw"; -import { createElement, createRef, Fragment, RefObject, render, useEffect, useState } from "preact/compat"; -import { AppState, BinaryFileData, ExcalidrawImperativeAPI, ExcalidrawProps, SceneData } from "@excalidraw/excalidraw/types"; -import type { ComponentType, VNode } from "preact"; +import { createElement, render } from "preact/compat"; +import { AppState, BinaryFileData, ExcalidrawImperativeAPI, ExcalidrawProps, LibraryItem, SceneData } from "@excalidraw/excalidraw/types"; +import type { ComponentType } from "preact"; +import utils from "../../services/utils"; +import { Theme } from "@excalidraw/excalidraw/element/types"; -/** -1 indicates that it is fresh. excalidraw scene version is always >0 */ +/** Indicates that it is fresh. excalidraw scene version is always >0 */ const SCENE_VERSION_INITIAL = -1; -/** -2 indicates error */ -const SCENE_VERSION_ERROR = -2; export default class Canvas { private currentSceneVersion: number; private opts: ExcalidrawProps; - excalidrawApi!: ExcalidrawImperativeAPI; + private excalidrawApi!: ExcalidrawImperativeAPI; constructor(opts: ExcalidrawProps) { this.opts = opts; @@ -29,6 +29,13 @@ export default class Canvas { }), targetEl); } + async waitForApiToBecomeAvailable() { + while (!this.excalidrawApi) { + console.log("excalidrawApi not yet loaded, sleep 200ms..."); + await utils.sleep(200); + } + } + private createCanvasElement(opts: ExcalidrawProps) { return createElement("div", { className: "excalidraw-wrapper", }, createElement(Excalidraw as ComponentType, opts) @@ -68,6 +75,15 @@ export default class Canvas { return this.currentSceneVersion === SCENE_VERSION_INITIAL; } + resetScene(theme: Theme) { + this.excalidrawApi.updateScene({ + elements: [], + appState: { + theme + } + }); + } + loadData(content: any, theme: any) { const { elements, files } = content; const appState: Partial = content.appState ?? {}; @@ -143,4 +159,17 @@ export default class Canvas { } } + async getLibraryItems() { + return this.excalidrawApi.updateLibrary({ + libraryItems() { + return []; + }, + merge: true + }); + } + + async updateLibrary(libraryItems: LibraryItem[]) { + this.excalidrawApi.updateLibrary({ libraryItems, merge: false }); + } + } From 9d296dd6924adc7c0553084f43874a03e0063e93 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 13:41:54 +0300 Subject: [PATCH 20/27] refactor(canvas): use deferred promise instead of sleep --- apps/client/src/widgets/type_widgets/canvas_el.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts index 80d7c5fb8..c90d4f035 100644 --- a/apps/client/src/widgets/type_widgets/canvas_el.ts +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -3,7 +3,6 @@ import { Excalidraw, getSceneVersion, exportToSvg } from "@excalidraw/excalidraw import { createElement, render } from "preact/compat"; import { AppState, BinaryFileData, ExcalidrawImperativeAPI, ExcalidrawProps, LibraryItem, SceneData } from "@excalidraw/excalidraw/types"; import type { ComponentType } from "preact"; -import utils from "../../services/utils"; import { Theme } from "@excalidraw/excalidraw/element/types"; /** Indicates that it is fresh. excalidraw scene version is always >0 */ @@ -14,10 +13,12 @@ export default class Canvas { private currentSceneVersion: number; private opts: ExcalidrawProps; private excalidrawApi!: ExcalidrawImperativeAPI; + private initializedPromise: JQuery.Deferred; constructor(opts: ExcalidrawProps) { this.opts = opts; this.currentSceneVersion = SCENE_VERSION_INITIAL; + this.initializedPromise = $.Deferred(); } renderCanvas(targetEl: HTMLElement) { @@ -25,14 +26,14 @@ export default class Canvas { ...this.opts, excalidrawAPI: (api: ExcalidrawImperativeAPI) => { this.excalidrawApi = api; + this.initializedPromise.resolve(); }, }), targetEl); } async waitForApiToBecomeAvailable() { while (!this.excalidrawApi) { - console.log("excalidrawApi not yet loaded, sleep 200ms..."); - await utils.sleep(200); + await this.initializedPromise; } } From bb762cfab6fb5f4a9677ae95574632268fdd49d2 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 14:01:24 +0300 Subject: [PATCH 21/27] refactor(canvas): remove use of any --- .../client/src/widgets/type_widgets/canvas.ts | 11 +++----- .../src/widgets/type_widgets/canvas_el.ts | 26 ++++++++++--------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas.ts b/apps/client/src/widgets/type_widgets/canvas.ts index 9a0d6e34f..8971ed6e2 100644 --- a/apps/client/src/widgets/type_widgets/canvas.ts +++ b/apps/client/src/widgets/type_widgets/canvas.ts @@ -2,9 +2,10 @@ import TypeWidget from "./type_widget.js"; import server from "../../services/server.js"; import type FNote from "../../entities/fnote.js"; import options from "../../services/options.js"; -import type { AppState, BinaryFileData, LibraryItem } from "@excalidraw/excalidraw/types"; -import type { ExcalidrawElement, Theme } from "@excalidraw/excalidraw/element/types"; +import type { LibraryItem } from "@excalidraw/excalidraw/types"; +import type { Theme } from "@excalidraw/excalidraw/element/types"; import type Canvas from "./canvas_el.js"; +import { CanvasContent } from "./canvas_el.js"; const TPL = /*html*/`
@@ -46,11 +47,7 @@ const TPL = /*html*/`
`; -interface CanvasContent { - elements: ExcalidrawElement[]; - files: BinaryFileData[]; - appState: Partial; -} + interface AttachmentMetadata { title: string; diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts index c90d4f035..1af6d8940 100644 --- a/apps/client/src/widgets/type_widgets/canvas_el.ts +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -1,9 +1,15 @@ import "@excalidraw/excalidraw/index.css"; import { Excalidraw, getSceneVersion, exportToSvg } from "@excalidraw/excalidraw"; import { createElement, render } from "preact/compat"; -import { AppState, BinaryFileData, ExcalidrawImperativeAPI, ExcalidrawProps, LibraryItem, SceneData } from "@excalidraw/excalidraw/types"; +import { AppState, BinaryFileData, ExcalidrawImperativeAPI, ExcalidrawProps, LibraryItem } from "@excalidraw/excalidraw/types"; import type { ComponentType } from "preact"; -import { Theme } from "@excalidraw/excalidraw/element/types"; +import { ExcalidrawElement, NonDeletedExcalidrawElement, Theme } from "@excalidraw/excalidraw/element/types"; + +export interface CanvasContent { + elements: ExcalidrawElement[]; + files: BinaryFileData[]; + appState: Partial; +} /** Indicates that it is fresh. excalidraw scene version is always >0 */ const SCENE_VERSION_INITIAL = -1; @@ -85,17 +91,11 @@ export default class Canvas { }); } - loadData(content: any, theme: any) { + loadData(content: CanvasContent, theme: Theme) { const { elements, files } = content; const appState: Partial = content.appState ?? {}; - appState.theme = theme; - const sceneData: SceneData = { - elements, - appState - }; - // files are expected in an array when loading. they are stored as a key-index object // see example for loading here: // https://github.com/excalidraw/excalidraw/blob/c5a7723185f6ca05e0ceb0b0d45c4e3fbcb81b2a/src/packages/excalidraw/example/App.js#L68 @@ -111,7 +111,10 @@ export default class Canvas { // Update the scene // TODO: Fix type of sceneData - this.excalidrawApi.updateScene(sceneData as any); + this.excalidrawApi.updateScene({ + elements, + appState: appState as AppState + }); this.excalidrawApi.addFiles(fileArray); this.excalidrawApi.history.clear(); } @@ -135,8 +138,7 @@ export default class Canvas { const svgString = svg.outerHTML; const activeFiles: Record = {}; - // TODO: Used any where upstream typings appear to be broken. - elements.forEach((element: any) => { + elements.forEach((element: NonDeletedExcalidrawElement) => { if ("fileId" in element && element.fileId) { activeFiles[element.fileId] = files[element.fileId]; } From 892c27c9456e57c52e18a6de0c87a85effc873c9 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 14:11:53 +0300 Subject: [PATCH 22/27] chore(canvas): set up cleanup --- apps/client/src/widgets/type_widgets/canvas_el.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/type_widgets/canvas_el.ts b/apps/client/src/widgets/type_widgets/canvas_el.ts index 1af6d8940..1ba54d2c2 100644 --- a/apps/client/src/widgets/type_widgets/canvas_el.ts +++ b/apps/client/src/widgets/type_widgets/canvas_el.ts @@ -1,6 +1,6 @@ import "@excalidraw/excalidraw/index.css"; import { Excalidraw, getSceneVersion, exportToSvg } from "@excalidraw/excalidraw"; -import { createElement, render } from "preact/compat"; +import { createElement, render, unmountComponentAtNode } from "preact/compat"; import { AppState, BinaryFileData, ExcalidrawImperativeAPI, ExcalidrawProps, LibraryItem } from "@excalidraw/excalidraw/types"; import type { ComponentType } from "preact"; import { ExcalidrawElement, NonDeletedExcalidrawElement, Theme } from "@excalidraw/excalidraw/element/types"; @@ -28,6 +28,7 @@ export default class Canvas { } renderCanvas(targetEl: HTMLElement) { + unmountComponentAtNode(targetEl); render(this.createCanvasElement({ ...this.opts, excalidrawAPI: (api: ExcalidrawImperativeAPI) => { From 9bab8f0bdbd5bf62849f60a0f2651ae622f69084 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 17:25:52 +0300 Subject: [PATCH 23/27] refactor(canvas): remove unnecessary env setup --- apps/client/src/widgets/type_widgets/canvas.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/canvas.ts b/apps/client/src/widgets/type_widgets/canvas.ts index 8971ed6e2..a018c7dcf 100644 --- a/apps/client/src/widgets/type_widgets/canvas.ts +++ b/apps/client/src/widgets/type_widgets/canvas.ts @@ -163,15 +163,6 @@ export default class ExcalidrawTypeWidget extends TypeWidget { throw new Error("Unable to find element to render."); } - // See https://github.com/excalidraw/excalidraw/issues/7899. - if (!window.process) { - (window.process as any) = {}; - } - if (!window.process.env) { - window.process.env = {}; - } - (window.process.env as any).PREACT = false; - const Canvas = (await import("./canvas_el.js")).default; this.canvasInstance = new Canvas({ // this makes sure that 1) manual theme switch button is hidden 2) theme stays as it should after opening menu From 6596431154761b020244cf3c40b20d4e3341d05c Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 18:59:41 +0300 Subject: [PATCH 24/27] chore(client): force mermaid to avoid double packaging --- package.json | 1 + pnpm-lock.yaml | 347 +------------------------------------------------ 2 files changed, 7 insertions(+), 341 deletions(-) diff --git a/package.json b/package.json index 2a772489e..cb3af2e2d 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ }, "overrides": { "node-abi": "4.9.0", + "mermaid": "11.6.0", "@types/express-serve-static-core": "5.0.6", "flat@<5.0.1": ">=5.0.1", "debug@>=3.2.0 <3.2.7": ">=3.2.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7a1bd99c..5207c4569 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,7 @@ settings: overrides: node-abi: 4.9.0 + mermaid: 11.6.0 '@types/express-serve-static-core': 5.0.6 flat@<5.0.1: '>=5.0.1' debug@>=3.2.0 <3.2.7: '>=3.2.7' @@ -3292,7 +3293,7 @@ packages: '@mermaid-js/layout-elk@0.1.7': resolution: {integrity: sha512-G3AJ2jMaCAqky2CT3z/sf3pK5UuS3tne98GsXDl3PkKByCmPmOYmJPf+6oX5PUlV3HNWWHuSgtZ9NU/CZDSuHQ==} peerDependencies: - mermaid: ^11.0.0 + mermaid: 11.6.0 '@mermaid-js/parser@0.4.0': resolution: {integrity: sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA==} @@ -4656,9 +4657,6 @@ packages: '@types/marked@4.3.2': resolution: {integrity: sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==} - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - '@types/methods@1.1.4': resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} @@ -4799,9 +4797,6 @@ packages: '@types/turndown@5.0.5': resolution: {integrity: sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==} - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@types/which@2.0.2': resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} @@ -5870,9 +5865,6 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - chardet@2.1.0: resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} @@ -6602,9 +6594,6 @@ packages: resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} engines: {node: '>=12'} - dagre-d3-es@7.0.10: - resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} - dagre-d3-es@7.0.11: resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} @@ -6698,9 +6687,6 @@ packages: decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} - decode-named-character-reference@1.1.0: - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} - decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} @@ -8886,10 +8872,6 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} @@ -9169,12 +9151,6 @@ packages: mathml-tag-names@2.1.3: resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} - mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - - mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} @@ -9221,9 +9197,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@10.9.3: - resolution: {integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==} - mermaid@11.6.0: resolution: {integrity: sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg==} @@ -9231,69 +9204,6 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - - micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - - micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - - micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - - micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - - micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - - micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - - micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - - micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - - micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - - micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - - micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - - micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - - micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - - micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - - micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - - micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - - micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - - micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - - micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - - micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -9471,10 +9381,6 @@ packages: resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==} engines: {node: '>= 0.4'} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -9638,9 +9544,6 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - non-layered-tidy-tree-layout@2.0.2: - resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} - nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -11261,10 +11164,6 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - safaridriver@1.0.0: resolution: {integrity: sha512-J92IFbskyo7OYB3Dt4aTdyhag1GlInrfbPCmMteb7aBK7PwlnGz1HI0+oyNN97j7pV9DqUAVoVgkNRMrfY47mQ==} engines: {node: '>=18.0.0'} @@ -12534,9 +12433,6 @@ packages: resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} engines: {node: ^18.17.0 || >=20.5.0} - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -12641,15 +12537,6 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - - uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -12874,9 +12761,6 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - web-worker@1.5.0: - resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} - webdriver@9.15.0: resolution: {integrity: sha512-JCW5xvhZtL6kjbckdePgVYMOlvWbh22F1VFkIf9pw3prwXI2EHED5Eq/nfDnNfHiqr0AfFKWmIDPziSafrVv4Q==} engines: {node: '>=18.20.0'} @@ -15602,7 +15486,7 @@ snapshots: '@excalidraw/mermaid-to-excalidraw@1.1.2': dependencies: '@excalidraw/markdown-to-text': 0.1.2 - mermaid: 10.9.3 + mermaid: 11.6.0 nanoid: 5.1.5 transitivePeerDependencies: - supports-color @@ -17819,6 +17703,7 @@ snapshots: '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 + optional: true '@types/deep-eql@4.0.2': {} @@ -17953,10 +17838,6 @@ snapshots: '@types/marked@4.3.2': {} - '@types/mdast@3.0.15': - dependencies: - '@types/unist': 2.0.11 - '@types/methods@1.1.4': {} '@types/mime-types@3.0.0': {} @@ -17967,7 +17848,8 @@ snapshots: '@types/minimatch@5.1.2': {} - '@types/ms@2.1.0': {} + '@types/ms@2.1.0': + optional: true '@types/multer@1.4.13': dependencies: @@ -18109,8 +17991,6 @@ snapshots: '@types/turndown@5.0.5': {} - '@types/unist@2.0.11': {} - '@types/which@2.0.2': {} '@types/ws@8.18.1': @@ -19526,8 +19406,6 @@ snapshots: char-regex@1.0.2: {} - character-entities@2.0.2: {} - chardet@2.1.0: {} check-error@2.1.1: {} @@ -20465,11 +20343,6 @@ snapshots: d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 - dagre-d3-es@7.0.10: - dependencies: - d3: 7.9.0 - lodash-es: 4.17.21 - dagre-d3-es@7.0.11: dependencies: d3: 7.9.0 @@ -20548,10 +20421,6 @@ snapshots: decimal.js@10.5.0: {} - decode-named-character-reference@1.1.0: - dependencies: - character-entities: 2.0.2 - decode-uri-component@0.2.2: {} decompress-response@6.0.0: @@ -23312,8 +23181,6 @@ snapshots: kind-of@6.0.3: {} - kleur@4.1.5: {} - klona@2.0.6: {} knockout@3.5.1: {} @@ -23653,27 +23520,6 @@ snapshots: mathml-tag-names@2.1.3: {} - mdast-util-from-markdown@1.3.1: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.11 - decode-named-character-reference: 1.1.0 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - - mdast-util-to-string@3.2.0: - dependencies: - '@types/mdast': 3.0.15 - mdn-data@2.0.14: {} mdn-data@2.0.28: {} @@ -23709,31 +23555,6 @@ snapshots: merge2@1.4.1: {} - mermaid@10.9.3: - dependencies: - '@braintree/sanitize-url': 6.0.2 - '@types/d3-scale': 4.0.9 - '@types/d3-scale-chromatic': 3.1.0 - cytoscape: 3.31.2 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.2) - d3: 7.9.0 - d3-sankey: 0.12.3 - dagre-d3-es: 7.0.10 - dayjs: 1.11.13 - dompurify: 3.2.5 - elkjs: 0.9.3 - katex: 0.16.22 - khroma: 2.1.0 - lodash-es: 4.17.21 - mdast-util-from-markdown: 1.3.1 - non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.3.6 - ts-dedent: 2.2.0 - uuid: 9.0.1 - web-worker: 1.5.0 - transitivePeerDependencies: - - supports-color - mermaid@11.6.0: dependencies: '@braintree/sanitize-url': 7.1.1 @@ -23761,139 +23582,6 @@ snapshots: methods@1.1.2: {} - micromark-core-commonmark@1.1.0: - dependencies: - decode-named-character-reference: 1.1.0 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-factory-destination@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-factory-label@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-factory-space@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 - - micromark-factory-title@1.1.0: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-factory-whitespace@1.1.0: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-character@1.2.0: - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-chunked@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - - micromark-util-classify-character@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-combine-extensions@1.1.0: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-decode-numeric-character-reference@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - - micromark-util-decode-string@1.1.0: - dependencies: - decode-named-character-reference: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 - - micromark-util-encode@1.1.0: {} - - micromark-util-html-tag-name@1.2.0: {} - - micromark-util-normalize-identifier@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - - micromark-util-resolve-all@1.1.0: - dependencies: - micromark-util-types: 1.1.0 - - micromark-util-sanitize-uri@1.2.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 - - micromark-util-subtokenize@1.1.0: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-util-symbol@1.1.0: {} - - micromark-util-types@1.1.0: {} - - micromark@3.2.0: - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@6.0.0) - decode-named-character-reference: 1.1.0 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -24102,8 +23790,6 @@ snapshots: hasown: 2.0.2 isarray: 2.0.5 - mri@1.2.0: {} - mrmime@2.0.1: {} ms@2.0.0: {} @@ -24279,8 +23965,6 @@ snapshots: node-releases@2.0.19: {} - non-layered-tidy-tree-layout@2.0.2: {} - nopt@5.0.0: dependencies: abbrev: 1.1.1 @@ -25990,10 +25674,6 @@ snapshots: tslib: 2.8.1 optional: true - sade@1.8.1: - dependencies: - mri: 1.2.0 - safaridriver@1.0.0: {} safe-array-concat@1.1.3: @@ -27513,10 +27193,6 @@ snapshots: dependencies: imurmurhash: 0.1.4 - unist-util-stringify-position@3.0.3: - dependencies: - '@types/unist': 2.0.11 - universalify@0.1.2: {} universalify@0.2.0: {} @@ -27599,15 +27275,6 @@ snapshots: uuid@8.3.2: {} - uuid@9.0.1: {} - - uvu@0.5.6: - dependencies: - dequal: 2.0.3 - diff: 5.2.0 - kleur: 4.1.5 - sade: 1.8.1 - v8-compile-cache-lib@3.0.1: {} v8-to-istanbul@9.3.0: @@ -27888,8 +27555,6 @@ snapshots: web-streams-polyfill@3.3.3: {} - web-worker@1.5.0: {} - webdriver@9.15.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/node': 20.17.32 From 89d32db6017c5ce946f4019587af212817fcf0f7 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 19:27:56 +0300 Subject: [PATCH 25/27] fix(canvas): loading of fonts under dev mode --- apps/client/src/types-assets.d.ts | 2 +- apps/client/src/types.d.ts | 2 ++ .../client/src/widgets/type_widgets/canvas.ts | 25 ++++++++++++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/apps/client/src/types-assets.d.ts b/apps/client/src/types-assets.d.ts index 34a964be8..010ec6b44 100644 --- a/apps/client/src/types-assets.d.ts +++ b/apps/client/src/types-assets.d.ts @@ -3,7 +3,7 @@ declare module "*.png" { export default path; } -declare module "@triliumnext/ckeditor5/emoji_definitions/en.json?url" { +declare module "*?url" { var path: string; export default path; } diff --git a/apps/client/src/types.d.ts b/apps/client/src/types.d.ts index 113b94d76..be42284c7 100644 --- a/apps/client/src/types.d.ts +++ b/apps/client/src/types.d.ts @@ -57,6 +57,8 @@ declare global { process?: ElectronProcess; glob?: CustomGlobals; + + EXCALIDRAW_ASSET_PATH?: string; } interface AutoCompleteConfig { diff --git a/apps/client/src/widgets/type_widgets/canvas.ts b/apps/client/src/widgets/type_widgets/canvas.ts index a018c7dcf..a15715c64 100644 --- a/apps/client/src/widgets/type_widgets/canvas.ts +++ b/apps/client/src/widgets/type_widgets/canvas.ts @@ -113,10 +113,6 @@ export default class ExcalidrawTypeWidget extends TypeWidget { constructor() { super(); - // currently required by excalidraw, in order to allows self-hosting fonts locally. - // this avoids making excalidraw load the fonts from an external CDN. - (window as any).EXCALIDRAW_ASSET_PATH = `${window.location.pathname}/node_modules/@excalidraw/excalidraw/dist/prod`; - // temporary vars this.currentNoteId = ""; @@ -187,6 +183,8 @@ export default class ExcalidrawTypeWidget extends TypeWidget { this.saveData(); }, }); + + await setupFonts(); this.canvasInstance.renderCanvas(renderElement); } @@ -377,3 +375,22 @@ export default class ExcalidrawTypeWidget extends TypeWidget { } } + +async function setupFonts() { + if (window.EXCALIDRAW_ASSET_PATH) { + return; + } + + // currently required by excalidraw, in order to allows self-hosting fonts locally. + // this avoids making excalidraw load the fonts from an external CDN. + let path: string; + if (!glob.isDev) { + path = `${window.location.pathname}/node_modules/@excalidraw/excalidraw/dist/prod`; + } else { + path = (await import("../../../node_modules/@excalidraw/excalidraw/dist/prod/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2?url")).default; + let pathComponents = path.split("/"); + path = pathComponents.slice(0, pathComponents.length - 2).join("/"); + } + + window.EXCALIDRAW_ASSET_PATH = path; +} From 26f44ea1f8d45157ceb03383474b119155c233a4 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 19:42:44 +0300 Subject: [PATCH 26/27] chore(deps): deduplicate preact --- package.json | 1 + pnpm-lock.yaml | 8 ++------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 01df5697a..11b877e65 100644 --- a/package.json +++ b/package.json @@ -93,6 +93,7 @@ "overrides": { "node-abi": "4.9.0", "mermaid": "11.6.0", + "preact": "10.26.8", "@types/express-serve-static-core": "5.0.6", "flat@<5.0.1": ">=5.0.1", "debug@>=3.2.0 <3.2.7": ">=3.2.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 246871b32..efabbc82a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,7 @@ settings: overrides: node-abi: 4.9.0 mermaid: 11.6.0 + preact: 10.26.8 '@types/express-serve-static-core': 5.0.6 flat@<5.0.1: '>=5.0.1' debug@>=3.2.0 <3.2.7: '>=3.2.7' @@ -10640,9 +10641,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - preact@10.12.1: - resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==} - preact@10.26.8: resolution: {integrity: sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==} @@ -15624,7 +15622,7 @@ snapshots: '@fullcalendar/core@6.1.17': dependencies: - preact: 10.12.1 + preact: 10.26.8 '@fullcalendar/daygrid@6.1.17(@fullcalendar/core@6.1.17)': dependencies: @@ -24985,8 +24983,6 @@ snapshots: dependencies: commander: 9.5.0 - preact@10.12.1: {} - preact@10.26.8: {} prebuild-install@7.1.3: From 7c2a29edce0ef40c089bb81ea9aab4a83ad50208 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Jun 2025 19:45:36 +0300 Subject: [PATCH 27/27] chore(deps): deduplicate roughjs --- package.json | 1 + pnpm-lock.yaml | 13 ++----------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 11b877e65..58db587a3 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,7 @@ "node-abi": "4.9.0", "mermaid": "11.6.0", "preact": "10.26.8", + "roughjs": "4.6.6", "@types/express-serve-static-core": "5.0.6", "flat@<5.0.1": ">=5.0.1", "debug@>=3.2.0 <3.2.7": ">=3.2.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efabbc82a..934e48765 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,7 @@ overrides: node-abi: 4.9.0 mermaid: 11.6.0 preact: 10.26.8 + roughjs: 4.6.6 '@types/express-serve-static-core': 5.0.6 flat@<5.0.1: '>=5.0.1' debug@>=3.2.0 <3.2.7: '>=3.2.7' @@ -11104,9 +11105,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - roughjs@4.6.4: - resolution: {integrity: sha512-s6EZ0BntezkFYMf/9mGn7M8XGIoaav9QQBCnJROWB3brUWQ683Q2LbRD/hq0Z3bAJ/9NVpU/5LpiTWvQMyLDhw==} - roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} @@ -15412,7 +15410,7 @@ snapshots: pwacompat: 2.0.17 react: 16.14.0 react-dom: 19.1.0(react@16.14.0) - roughjs: 4.6.4 + roughjs: 4.6.6 sass: 1.51.0 tunnel-rat: 0.1.2(@types/react@19.1.7)(react@16.14.0) transitivePeerDependencies: @@ -25512,13 +25510,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.40.0 fsevents: 2.3.3 - roughjs@4.6.4: - dependencies: - hachure-fill: 0.5.2 - path-data-parser: 0.1.0 - points-on-curve: 0.2.0 - points-on-path: 0.2.1 - roughjs@4.6.6: dependencies: hachure-fill: 0.5.2