diff --git a/REUSE.toml b/REUSE.toml index 5f4a3e6a..00752534 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -16,6 +16,9 @@ path = [ "**/tsconfig.json", "**/package*.json", + # patches folder + "code/patches/**", + # code/ directory licensing "cleanup-storage/src/whitelist.json", "code/config/**", diff --git a/code/Dockerfile b/code/Dockerfile index 22807b2e..2857ddc0 100644 --- a/code/Dockerfile +++ b/code/Dockerfile @@ -12,6 +12,7 @@ RUN apt-get install -y bash g++ make python3 RUN apt-get install -y build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev libtool autoconf automake WORKDIR /app +COPY /patches ./patches COPY package*.json ./ RUN npm pkg delete scripts.prepare RUN npm install diff --git a/code/fonts/ARIAL.TTF b/code/fonts/ARIAL.TTF new file mode 100644 index 00000000..8682d946 Binary files /dev/null and b/code/fonts/ARIAL.TTF differ diff --git a/code/fonts/ARIALBD.TTF b/code/fonts/ARIALBD.TTF new file mode 100644 index 00000000..a6037e68 Binary files /dev/null and b/code/fonts/ARIALBD.TTF differ diff --git a/code/fonts/ARIALBI.TTF b/code/fonts/ARIALBI.TTF new file mode 100644 index 00000000..6a1fa0fa Binary files /dev/null and b/code/fonts/ARIALBI.TTF differ diff --git a/code/fonts/ARIALI 1.TTF b/code/fonts/ARIALI 1.TTF new file mode 100644 index 00000000..38019978 Binary files /dev/null and b/code/fonts/ARIALI 1.TTF differ diff --git a/code/fonts/ARIALI.TTF b/code/fonts/ARIALI.TTF new file mode 100644 index 00000000..38019978 Binary files /dev/null and b/code/fonts/ARIALI.TTF differ diff --git a/code/fonts/FuzzyBubbles-Bold.ttf b/code/fonts/FuzzyBubbles-Bold.ttf new file mode 100644 index 00000000..627055fa Binary files /dev/null and b/code/fonts/FuzzyBubbles-Bold.ttf differ diff --git a/code/fonts/FuzzyBubbles-Regular.ttf b/code/fonts/FuzzyBubbles-Regular.ttf new file mode 100644 index 00000000..f3bea8f5 Binary files /dev/null and b/code/fonts/FuzzyBubbles-Regular.ttf differ diff --git a/code/fonts/Impact.ttf b/code/fonts/Impact.ttf deleted file mode 100644 index 12ea83ee..00000000 Binary files a/code/fonts/Impact.ttf and /dev/null differ diff --git a/code/fonts/NotoSansMono-Bold.ttf b/code/fonts/NotoSansMono-Bold.ttf new file mode 100644 index 00000000..c56c765c Binary files /dev/null and b/code/fonts/NotoSansMono-Bold.ttf differ diff --git a/code/fonts/NotoSansMono-Regular.ttf b/code/fonts/NotoSansMono-Regular.ttf new file mode 100644 index 00000000..5470d503 Binary files /dev/null and b/code/fonts/NotoSansMono-Regular.ttf differ diff --git a/code/fonts/RobotoMono-Bold.ttf b/code/fonts/RobotoMono-Bold.ttf new file mode 100644 index 00000000..bef439f3 Binary files /dev/null and b/code/fonts/RobotoMono-Bold.ttf differ diff --git a/code/fonts/RobotoMono-BoldItalic.ttf b/code/fonts/RobotoMono-BoldItalic.ttf new file mode 100644 index 00000000..642dd058 Binary files /dev/null and b/code/fonts/RobotoMono-BoldItalic.ttf differ diff --git a/code/fonts/RobotoMono-Italic.ttf b/code/fonts/RobotoMono-Italic.ttf new file mode 100644 index 00000000..781eff8c Binary files /dev/null and b/code/fonts/RobotoMono-Italic.ttf differ diff --git a/code/fonts/RobotoMono-Regular.ttf b/code/fonts/RobotoMono-Regular.ttf new file mode 100644 index 00000000..3806bfb1 Binary files /dev/null and b/code/fonts/RobotoMono-Regular.ttf differ diff --git a/code/fonts/SpecialGothicCondensedOne-Regular.ttf b/code/fonts/SpecialGothicCondensedOne-Regular.ttf new file mode 100644 index 00000000..ea760aab Binary files /dev/null and b/code/fonts/SpecialGothicCondensedOne-Regular.ttf differ diff --git a/code/fonts/Verdana-Bold.ttf b/code/fonts/Verdana-Bold.ttf deleted file mode 100755 index caecbf8b..00000000 Binary files a/code/fonts/Verdana-Bold.ttf and /dev/null differ diff --git a/code/fonts/Verdana-BoldItalic.ttf b/code/fonts/Verdana-BoldItalic.ttf deleted file mode 100755 index e0b3cb10..00000000 Binary files a/code/fonts/Verdana-BoldItalic.ttf and /dev/null differ diff --git a/code/fonts/Verdana-Italic.ttf b/code/fonts/Verdana-Italic.ttf deleted file mode 100755 index 2e2ec543..00000000 Binary files a/code/fonts/Verdana-Italic.ttf and /dev/null differ diff --git a/code/fonts/Verdana.ttf b/code/fonts/Verdana.ttf deleted file mode 100755 index bbf2eae7..00000000 Binary files a/code/fonts/Verdana.ttf and /dev/null differ diff --git a/code/package-lock.json b/code/package-lock.json index 74a7ca1a..272ee9d2 100644 --- a/code/package-lock.json +++ b/code/package-lock.json @@ -15,9 +15,11 @@ "@azure/web-pubsub": "^1.2.0", "@google/genai": "^1.32.0", "@imgly/background-removal-node": "^1.4.5", - "@inditextech/weave-sdk": "2.23.0", - "@inditextech/weave-store-azure-web-pubsub": "2.23.0", - "@inditextech/weave-store-standalone": "2.23.0", + "@inditextech/weave-renderer-konva-base": "3.1.0", + "@inditextech/weave-renderer-konva-react-reconciler": "3.1.0", + "@inditextech/weave-sdk": "3.1.0", + "@inditextech/weave-store-azure-web-pubsub": "3.1.0", + "@inditextech/weave-store-standalone": "3.1.0", "@mastra/ai-sdk": "^0.3.1", "@mastra/core": "^0.24.5", "@mastra/libsql": "^0.16.2", @@ -92,6 +94,7 @@ "husky": "^9.1.7", "nodemon": "^3.1.9", "npkill": "^0.12.2", + "patch-package": "^8.0.1", "prettier": "^3.5.3", "prettier-eslint": "^16.3.0", "sequelize-cli": "^6.6.3", @@ -211,13 +214,13 @@ } }, "node_modules/@ai-sdk/gateway": { - "version": "2.0.44", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.44.tgz", - "integrity": "sha512-hunEcN60Fugfc3NVqCS1H4WqoaVwTjnSskNMwcp3ztzSmBn/QQ7ox1DWd2Jh1FAZEDcjxYtdgneRrXQId3ovtw==", + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.54.tgz", + "integrity": "sha512-bK47JS1IYanXc5ruhfEVLDUcig7Im3gQr5p52AB4x//mT/wcGLf85SxwGWzw42pyOsW8ee38Wy567WWJc90s/A==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.1", - "@ai-sdk/provider-utils": "3.0.21", + "@ai-sdk/provider-utils": "3.0.22", "@vercel/oidc": "3.1.0" }, "engines": { @@ -240,9 +243,9 @@ } }, "node_modules/@ai-sdk/gateway/node_modules/@ai-sdk/provider-utils": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.21.tgz", - "integrity": "sha512-veuMwTLxsgh31Jjn0SnBABnM1f7ebHhRWcV2ZuY3hP3iJDCZ8VXBaYqcHXoOQDqUXTCas08sKQcHyWK+zl882Q==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.22.tgz", + "integrity": "sha512-fFT1KfUUKktfAFm5mClJhS1oux9tP2qgzmEZVl5UdwltQ1LO/s8hd7znVrgKzivwv1s1FIPza0s9OpJaNB/vHw==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.1", @@ -769,9 +772,9 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.2.tgz", - "integrity": "sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.23.0.tgz", + "integrity": "sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -779,7 +782,7 @@ "@azure/core-tracing": "^1.3.0", "@azure/core-util": "^1.13.0", "@azure/logger": "^1.3.0", - "@typespec/ts-http-runtime": "^0.3.0", + "@typespec/ts-http-runtime": "^0.3.4", "tslib": "^2.6.2" }, "engines": { @@ -2341,9 +2344,9 @@ } }, "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", - "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -2469,9 +2472,9 @@ "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", - "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -2544,9 +2547,9 @@ "license": "MIT" }, "node_modules/@google/genai": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.42.0.tgz", - "integrity": "sha512-+3nlMTcrQufbQ8IumGkOphxD5Pd5kKyJOzLcnY0/1IuE8upJk5aLmoexZ2BJhBp1zAjRJMEB4a2CJwKI9e2EYw==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.44.0.tgz", + "integrity": "sha512-kRt9ZtuXmz+tLlcNntN/VV4LRdpl6ZOu5B1KbfNgfR65db15O6sUQcwnwLka8sT/V6qysD93fWrgJHF2L7dA9A==", "license": "Apache-2.0", "dependencies": { "google-auth-library": "^10.3.0", @@ -2656,9 +2659,9 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", - "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -2705,9 +2708,9 @@ } }, "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", "license": "MIT", "engines": { "node": ">=18" @@ -3221,9 +3224,9 @@ } }, "node_modules/@imgly/background-removal-node/node_modules/tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", + "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", "license": "MIT", "dependencies": { "pump": "^3.0.0", @@ -3234,20 +3237,110 @@ "bare-path": "^3.0.0" } }, - "node_modules/@inditextech/weave-sdk": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/@inditextech/weave-sdk/-/weave-sdk-2.23.0.tgz", - "integrity": "sha512-jVy2bKfhMWOzemdvFKwQfib/1c2r4JSfztheuga4s+j09kFgsXkwiUgc9pZnOC/+lTU/ZHMtwAZ9bweTAgLxfQ==", + "node_modules/@inditextech/weave-renderer-konva-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@inditextech/weave-renderer-konva-base/-/weave-renderer-konva-base-3.1.0.tgz", + "integrity": "sha512-YiUIGY1j+5zIMMalK4SUKGyqtVdqS3a4RDk0YcyB+F4tForGfhjp7K5OAE0/1oslsogcmYQJClElklvJvgEWHQ==", + "license": "Apache-2.0", + "dependencies": { + "@inditextech/weave-sdk": "3.1.0", + "@inditextech/weave-types": "3.1.0", + "pino": "9.6.0", + "pino-pretty": "13.0.0" + }, + "engines": { + "node": ">=18.12", + "npm": ">= 8.19.x" + }, + "peerDependencies": { + "canvas": "3.2.0", + "konva": "10.0.2", + "skia-canvas": "3.0.8" + } + }, + "node_modules/@inditextech/weave-renderer-konva-base/node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "license": "MIT" + }, + "node_modules/@inditextech/weave-renderer-konva-base/node_modules/pino": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.6.0.tgz", + "integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/@inditextech/weave-renderer-konva-base/node_modules/pino-pretty": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.0.0.tgz", + "integrity": "sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pump": "^3.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/@inditextech/weave-renderer-konva-base/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@inditextech/weave-renderer-konva-react-reconciler": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@inditextech/weave-renderer-konva-react-reconciler/-/weave-renderer-konva-react-reconciler-3.1.0.tgz", + "integrity": "sha512-CBaLVDYIrBwU5sw60tG/bPM/4XXRi9meMSaAVY65Tsj7FQvUIiaJFzpUbV0RmhoYO9YyYThps4R34+qdpuTckg==", "license": "Apache-2.0", "dependencies": { - "@inditextech/weave-types": "2.23.0", + "@inditextech/weave-sdk": "3.1.0", + "@inditextech/weave-types": "3.1.0", "@syncedstore/core": "0.6.0", "pino": "9.6.0", "pino-pretty": "13.0.0", "react-reconciler": "~0.28.0" }, "engines": { - "node": "^18.12 || ^20.11 || ^22.11", + "node": ">=18.12", "npm": ">= 8.19.x" }, "peerDependencies": { @@ -3259,6 +3352,96 @@ "yjs": "13.6.27" } }, + "node_modules/@inditextech/weave-renderer-konva-react-reconciler/node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "license": "MIT" + }, + "node_modules/@inditextech/weave-renderer-konva-react-reconciler/node_modules/pino": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.6.0.tgz", + "integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/@inditextech/weave-renderer-konva-react-reconciler/node_modules/pino-pretty": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.0.0.tgz", + "integrity": "sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pump": "^3.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/@inditextech/weave-renderer-konva-react-reconciler/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@inditextech/weave-sdk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@inditextech/weave-sdk/-/weave-sdk-3.1.0.tgz", + "integrity": "sha512-fvTkxKS5rKWmy5XLxfMHMbREd4ddQLs1R87UJNXmnboxmfLDmvOWD7RtoUDwb2O6dwF7snNZFyow7R2cCA+BTg==", + "license": "Apache-2.0", + "dependencies": { + "@inditextech/weave-types": "3.1.0", + "@syncedstore/core": "0.6.0", + "pino": "9.6.0", + "pino-pretty": "13.0.0" + }, + "engines": { + "node": ">=18.12", + "npm": ">= 8.19.x" + }, + "peerDependencies": { + "canvas": "3.2.0", + "konva": "10.0.2", + "skia-canvas": "3.0.8", + "yjs": "13.6.27" + } + }, "node_modules/@inditextech/weave-sdk/node_modules/fast-copy": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", @@ -3328,15 +3511,15 @@ "license": "MIT" }, "node_modules/@inditextech/weave-store-azure-web-pubsub": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/@inditextech/weave-store-azure-web-pubsub/-/weave-store-azure-web-pubsub-2.23.0.tgz", - "integrity": "sha512-P/Da4Fq10hivb6XOH0PvKB09dAwoxST7+LsdPvITfpijrh+1FXn5DKncq4CbcodSaabDXLuKgHXhDfFBk788Yg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@inditextech/weave-store-azure-web-pubsub/-/weave-store-azure-web-pubsub-3.1.0.tgz", + "integrity": "sha512-ySjOH2WiTg3CvTnO2w71OjP33Mor7MupNolgnk2ZK0i8zvK49PZtqACUEH73JTuFw639G/U+YqGrVukNTxVHQg==", "license": "Apache-2.0", "dependencies": { "@azure/identity": "4.10.2", "@azure/web-pubsub": "1.2.0", - "@inditextech/weave-sdk": "2.23.0", - "@inditextech/weave-types": "2.23.0", + "@inditextech/weave-sdk": "3.1.0", + "@inditextech/weave-types": "3.1.0", "@syncedstore/core": "0.6.0", "buffer": "6.0.3", "reconnecting-websocket": "4.4.0", @@ -3344,7 +3527,7 @@ "ws": "8.18.1" }, "engines": { - "node": "^18.12 || ^20.11 || ^22.11", + "node": ">=18.12", "npm": ">= 8.19.x" }, "peerDependencies": { @@ -3397,17 +3580,17 @@ } }, "node_modules/@inditextech/weave-store-standalone": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/@inditextech/weave-store-standalone/-/weave-store-standalone-2.23.0.tgz", - "integrity": "sha512-byUeyIS5LD7j0BapDU6w0JCIxEr4t/qr5dRMp0K/GonqorBwEvWfVU32RZrfw6f2fcHjDDG/PG9hz94ljtUTdQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@inditextech/weave-store-standalone/-/weave-store-standalone-3.1.0.tgz", + "integrity": "sha512-4jHCG5UymgSZNQGuPaZ1qL/e7dcGprGxXcdzienWptt8jbGZPEi6eweYpRVNE+6hlwpf6IEhEeG4W8e2HdKPmQ==", "license": "Apache-2.0", "dependencies": { - "@inditextech/weave-sdk": "2.23.0", - "@inditextech/weave-types": "2.23.0", + "@inditextech/weave-sdk": "3.1.0", + "@inditextech/weave-types": "3.1.0", "@syncedstore/core": "0.6.0" }, "engines": { - "node": "^18.12 || ^20.11 || ^22.11", + "node": ">=18.12", "npm": ">= 8.19.x" }, "peerDependencies": { @@ -3416,12 +3599,12 @@ } }, "node_modules/@inditextech/weave-types": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/@inditextech/weave-types/-/weave-types-2.23.0.tgz", - "integrity": "sha512-l0pHh4UY5YaRDtN3YAqdGFrXC0XGxqlAkqJXOy0Nc1L9aSNkerd9c1WpzKuNEctcKt8c69pgwnFZ6CgJdCPCPQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@inditextech/weave-types/-/weave-types-3.1.0.tgz", + "integrity": "sha512-UJE2oq0WLt9aiykoJ9Yu0iPgOq5r3opVb1GTPyJFc6qL0oT+PM7j8WLwj4gOEAXFZo6vnF3mhGcVFDCiD5GieA==", "license": "Apache-2.0", "engines": { - "node": "^18.12 || ^20.11 || ^22.11", + "node": ">=18.12", "npm": ">= 8.19.x" }, "peerDependencies": { @@ -3430,9 +3613,9 @@ } }, "node_modules/@ioredis/commands": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.0.tgz", - "integrity": "sha512-eUgLqrMf8nJkZxT24JvVRrQya1vZkQh8BBeYNwGDqa5I0VUi8ACx7uFvAaLxintokpTenkK6DASvo/bvNbBGow==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.1.tgz", + "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==", "license": "MIT", "peer": true }, @@ -4273,9 +4456,9 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.5.1.tgz", - "integrity": "sha512-MHbu8XxCHcBn6RwvCt2Vpn1WnLMNECfNKYB14LI5XypcgH4IE0/DiVifVR9tAkwPMyLXN8dOoPJfya3IryLQVw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.6.0.tgz", + "integrity": "sha512-L8UyDwqpTcbkIK5cgwDRDYDoEhQoj8wp8BwsO19w3LB1Z41yEQm2VJyNfAi9DrLP/YTqXqWpKHyZfR9/tFYo1Q==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" @@ -4285,9 +4468,9 @@ } }, "node_modules/@opentelemetry/core": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.1.tgz", - "integrity": "sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", + "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -5910,9 +6093,9 @@ } }, "node_modules/@opentelemetry/resource-detector-aws": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.12.0.tgz", - "integrity": "sha512-VelueKblsnQEiBVqEYcvM9VEb+B8zN6nftltdO9HAD7qi/OlicP4z/UGJ9EeW2m++WabdMoj0G3QVL8YV0P9tw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.13.0.tgz", + "integrity": "sha512-ZPCn7gZhGqUYUoD+RCHIlayoHBMaJaEjfqlgz2EPKoXJ4y7Ru7CUm+Tm3yJVMKF92cN9xUQR0j5KALyF0fg9aw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -5978,12 +6161,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.5.1.tgz", - "integrity": "sha512-BViBCdE/GuXRlp9k7nS1w6wJvY5fnFX5XvuEtWsTAOQFIO89Eru7lGW3WbfbxtCuZ/GbrJfAziXG0w0dpxL7eQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.0.tgz", + "integrity": "sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", + "@opentelemetry/core": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -6042,13 +6225,13 @@ } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.5.1.tgz", - "integrity": "sha512-RKMn3QKi8nE71ULUo0g/MBvq1N4icEBo7cQSKnL3URZT16/YH3nSVgWegOjwx7FRBTrjOIkMJkCUn/ZFIEfn4A==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.0.tgz", + "integrity": "sha512-CicxWZxX6z35HR83jl+PLgtFgUrKRQ9LCXyxgenMnz5A1lgYWfAog7VtdOvGkJYyQgMNPhXQwkYrDLujk7z1Iw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -6187,13 +6370,13 @@ } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.5.1.tgz", - "integrity": "sha512-iZH3Gw8cxQn0gjpOjJMmKLd9GIaNh/E3v3ST67vyzLSxHBs14HsG4dy7jMYyC5WXGdBVEcM7U/XTF5hCQxjDMw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.0.tgz", + "integrity": "sha512-g/OZVkqlxllgFM7qMKqbPV9c1DUPhQ7d4n3pgZFcrnrNft9eJXZM2TNHTPYREJBrtNdRytYyvwjgL5geDKl3EQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -6204,14 +6387,14 @@ } }, "node_modules/@opentelemetry/sdk-trace-node": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.5.1.tgz", - "integrity": "sha512-9lopQ6ZoElETOEN0csgmtEV5/9C7BMfA7VtF4Jape3i954b6sTY2k3Xw3CxUTKreDck/vpAuJM+EDo4zheUw+A==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.6.0.tgz", + "integrity": "sha512-YhswtasmsbIGEFvLGvR9p/y3PVRTfFf+mgY8van4Ygpnv4sA3vooAjvh+qAn9PNWxs4/IwGGqiQS0PPsaRJ0vQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/context-async-hooks": "2.5.1", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1" + "@opentelemetry/context-async-hooks": "2.6.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -6221,9 +6404,9 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz", - "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz", + "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -7240,9 +7423,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.19.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.11.tgz", - "integrity": "sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==", + "version": "22.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", + "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -7258,9 +7441,9 @@ } }, "node_modules/@types/pg": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.16.0.tgz", - "integrity": "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.18.0.tgz", + "integrity": "sha512-gT+oueVQkqnj6ajGJXblFR4iavIXWsGAFCk3dP4Kki5+a9R4NMt0JARdk6s8cUKcfUoqP5dAtDSLU8xYUTFV+Q==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -7285,9 +7468,9 @@ "peer": true }, "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -7630,9 +7813,9 @@ } }, "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.3.tgz", - "integrity": "sha512-91fp6CAAJSRtH5ja95T1FHSKa8aPW9/Zw6cta81jlZTUw/+Vq8jM/AfF/14h2b71wwR84JUTW/3Y8QPhDAawFA==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.4.tgz", + "integrity": "sha512-CI0NhTrz4EBaa0U+HaaUZrJhPoso8sG7ZFya8uQoBA57fjzrjRSv87ekCjLZOFExN+gXE/z0xuN2QfH4H2HrLQ==", "license": "MIT", "dependencies": { "http-proxy-agent": "^7.0.0", @@ -7651,9 +7834,9 @@ "license": "ISC" }, "node_modules/@upstash/redis": { - "version": "1.36.2", - "resolved": "https://registry.npmjs.org/@upstash/redis/-/redis-1.36.2.tgz", - "integrity": "sha512-C0Yt8hc12vLaQYRG1fMci8iPrLtnTdbJG0HR5T8vKnvEP/1RdMMblsOJs5/jp0JXZJ1oSzMnQz4J9EVezNpI6A==", + "version": "1.36.3", + "resolved": "https://registry.npmjs.org/@upstash/redis/-/redis-1.36.3.tgz", + "integrity": "sha512-wxo1ei4OHDHm4UGMgrNVz9QUEela9N/Iwi4p1JlHNSowQiPi+eljlGnfbZVkV0V4PIrjGtGFJt5GjWM5k28enA==", "license": "MIT", "dependencies": { "uncrypto": "^0.1.3" @@ -7674,6 +7857,13 @@ "integrity": "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==", "license": "MIT" }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", @@ -7783,14 +7973,14 @@ } }, "node_modules/ai": { - "version": "5.0.138", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.138.tgz", - "integrity": "sha512-ORkQfHFBnLHgaNhJh1N3fmMQwETLxIHNy5eIDae8qOOZ7FHYxZZVMPQs8T0FiC7MGYFScBmiDJ3s61XvJVBomw==", + "version": "5.0.149", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.149.tgz", + "integrity": "sha512-ebOvqbUZ4njabaKC7gpuFBbNsyvH8y/9eyIDgKefu9PB8j5GdkWKsXNtPxhz4PDFnDb0GClCtsJ4j/gWy71UNg==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "2.0.44", + "@ai-sdk/gateway": "2.0.54", "@ai-sdk/provider": "2.0.1", - "@ai-sdk/provider-utils": "3.0.21", + "@ai-sdk/provider-utils": "3.0.22", "@opentelemetry/api": "1.9.0" }, "engines": { @@ -7887,9 +8077,9 @@ } }, "node_modules/ai/node_modules/@ai-sdk/provider-utils": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.21.tgz", - "integrity": "sha512-veuMwTLxsgh31Jjn0SnBABnM1f7ebHhRWcV2ZuY3hP3iJDCZ8VXBaYqcHXoOQDqUXTCas08sKQcHyWK+zl882Q==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.22.tgz", + "integrity": "sha512-fFT1KfUUKktfAFm5mClJhS1oux9tP2qgzmEZVl5UdwltQ1LO/s8hd7znVrgKzivwv1s1FIPza0s9OpJaNB/vHw==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.1", @@ -8114,9 +8304,9 @@ } }, "node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -8148,11 +8338,10 @@ } }, "node_modules/bare-fs": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.4.tgz", - "integrity": "sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.5.tgz", + "integrity": "sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==", "license": "Apache-2.0", - "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", @@ -8173,11 +8362,10 @@ } }, "node_modules/bare-os": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.7.0.tgz", - "integrity": "sha512-64Rcwj8qlnTZU8Ps6JJEdSmxBEUGgI7g8l+lMtsJLl4IsfTcHMTfJ188u2iGV6P6YPRZrtv72B2kjn+hp+Yv3g==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.7.1.tgz", + "integrity": "sha512-ebvMaS5BgZKmJlvuWh14dg9rbUI84QeV3WlWn6Ph6lFI8jJoh7ADtVTyD2c93euwbe+zgi0DVrl4YmqXeM9aIA==", "license": "Apache-2.0", - "optional": true, "engines": { "bare": ">=1.14.0" } @@ -8187,7 +8375,6 @@ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", "license": "Apache-2.0", - "optional": true, "dependencies": { "bare-os": "^3.0.1" } @@ -8197,7 +8384,6 @@ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.0.tgz", "integrity": "sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==", "license": "Apache-2.0", - "optional": true, "dependencies": { "streamx": "^2.21.0", "teex": "^1.0.1" @@ -8220,7 +8406,6 @@ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", "license": "Apache-2.0", - "optional": true, "dependencies": { "bare-path": "^3.0.0" } @@ -8378,9 +8563,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -8523,6 +8708,25 @@ "node": ">= 0.8" } }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -8563,9 +8767,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001774", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", - "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", + "version": "1.0.30001777", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz", + "integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==", "funding": [ { "type": "opencollective", @@ -8672,6 +8876,21 @@ "node": ">=18" } }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cjs-module-lexer": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", @@ -9110,9 +9329,9 @@ } }, "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9403,6 +9622,24 @@ "native-promise-only": "^0.8.1" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -9581,15 +9818,15 @@ } }, "node_modules/editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz", + "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", "dev": true, "license": "MIT", "dependencies": { "@one-ini/wasm": "0.1.1", "commander": "^10.0.0", - "minimatch": "9.0.1", + "minimatch": "^9.0.1", "semver": "^7.5.3" }, "bin": { @@ -9627,13 +9864,13 @@ } }, "node_modules/editorconfig/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -9649,9 +9886,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.302", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", - "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "version": "1.5.307", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -10089,9 +10326,9 @@ } }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", - "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -10637,9 +10874,9 @@ "license": "MIT" }, "node_modules/fast-xml-parser": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", - "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.2.tgz", + "integrity": "sha512-pw/6pIl4k0CSpElPEJhDppLzaixDEuWui2CUQQBH/ECDf7+y6YwA4Gf7Tyb0Rfe4DIMuZipYj4AEL0nACKglvQ==", "funding": [ { "type": "github", @@ -10923,6 +11160,16 @@ "yaml": "^2.3.4" } }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -10938,9 +11185,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.4.tgz", + "integrity": "sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==", "dev": true, "license": "ISC" }, @@ -11060,9 +11307,9 @@ "license": "MIT" }, "node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -11308,6 +11555,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "deprecated": "This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead.", "dev": true, "license": "MIT", "dependencies": { @@ -11362,13 +11610,28 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.7.tgz", - "integrity": "sha512-MOwgjc8tfrpn5QQEvjijjmDVtMw2oL88ugTevzxQnzRLm6l3fVEF2gzU0kYeYYKD8C66+IdGX6peJ4MyUlUnPg==", - "license": "ISC", + "node_modules/glob/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==", + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.2" + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -11437,6 +11700,16 @@ "node": ">= 4" } }, + "node_modules/globby/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/google-auth-library": { "version": "10.6.1", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.1.tgz", @@ -11558,6 +11831,19 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -11613,9 +11899,9 @@ "license": "MIT" }, "node_modules/hono": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.2.tgz", - "integrity": "sha512-gJnaDHXKDayjt8ue0n8Gs0A007yKXj4Xzb8+cNjZeYsSzzwKc0Lr+OZgYwVfB0pHfUs17EPoLvrOsEaJ9mj+Tg==", + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.5.tgz", + "integrity": "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -11967,13 +12253,13 @@ } }, "node_modules/ioredis": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.9.3.tgz", - "integrity": "sha512-VI5tMCdeoxZWU5vjHWsiE/Su76JGhBvWF1MJnV9ZtGltHk9BmD48oDq8Tj8haZ85aceXZMxLNDQZRVo5QKNgXA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.10.0.tgz", + "integrity": "sha512-HVBe9OFuqs+Z6n64q09PQvP1/R4Bm+30PAyyD4wIEqssh3v9L21QjCVk4kRLucMBcDokJTcLjsGeVRlq/nH6DA==", "license": "MIT", "peer": true, "dependencies": { - "@ioredis/commands": "1.5.0", + "@ioredis/commands": "1.5.1", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", @@ -12126,9 +12412,9 @@ "license": "MIT" }, "node_modules/is-network-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", - "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", + "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", "license": "MIT", "engines": { "node": ">=16" @@ -12282,9 +12568,10 @@ } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, "license": "MIT" }, "node_modules/isexe": { @@ -12510,6 +12797,26 @@ "node": ">=10" } }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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", @@ -12558,6 +12865,16 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -12636,6 +12953,16 @@ "json-buffer": "3.0.1" } }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, "node_modules/konva": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/konva/-/konva-10.0.2.tgz", @@ -12668,6 +12995,12 @@ "node": ">= 0.6.3" } }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, "node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -13408,9 +13741,9 @@ } }, "node_modules/minimatch": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", - "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" @@ -13452,18 +13785,6 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -13471,15 +13792,15 @@ "license": "MIT" }, "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz", + "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==", "license": "MIT", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", - "ufo": "^1.6.1" + "ufo": "^1.6.3" } }, "node_modules/module-alias": { @@ -13565,21 +13886,22 @@ "license": "MIT" }, "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz", + "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", "busboy": "^1.6.0", "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" + "type-is": "^1.6.18" }, "engines": { "node": ">= 10.16.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/multer/node_modules/media-typer": { @@ -13769,9 +14091,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "license": "MIT" }, "node_modules/nodemon": { @@ -13849,9 +14171,9 @@ } }, "node_modules/npm": { - "version": "11.10.1", - "resolved": "https://registry.npmjs.org/npm/-/npm-11.10.1.tgz", - "integrity": "sha512-woavuY2OgDFQ1K/tB9QHsUuW989nKfvsKTN/h5qGyS+3+BhvXN/DA2TNzx569JaFfTqrET5bEQNHwVhFk+U1gg==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.11.0.tgz", + "integrity": "sha512-82gRxKrh/eY5UnNorkTFcdBQAGpgjWehkfGVqAGlJjejEtJZGGJUqjo3mbBTNbc5BTnPKGVtGPBZGhElujX5cw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -13929,7 +14251,7 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.3.1", + "@npmcli/arborist": "^9.4.0", "@npmcli/config": "^10.7.1", "@npmcli/fs": "^5.0.0", "@npmcli/map-workspaces": "^5.0.3", @@ -13954,16 +14276,16 @@ "is-cidr": "^6.0.3", "json-parse-even-better-errors": "^5.0.0", "libnpmaccess": "^10.0.3", - "libnpmdiff": "^8.1.2", - "libnpmexec": "^10.2.2", - "libnpmfund": "^7.0.16", + "libnpmdiff": "^8.1.3", + "libnpmexec": "^10.2.3", + "libnpmfund": "^7.0.17", "libnpmorg": "^8.0.1", - "libnpmpack": "^9.1.2", + "libnpmpack": "^9.1.3", "libnpmpublish": "^11.1.3", "libnpmsearch": "^9.0.1", "libnpmteam": "^8.0.2", "libnpmversion": "^8.0.3", - "make-fetch-happen": "^15.0.3", + "make-fetch-happen": "^15.0.4", "minimatch": "^10.2.2", "minipass": "^7.1.3", "minipass-pipeline": "^1.2.4", @@ -13978,7 +14300,7 @@ "npm-registry-fetch": "^19.1.1", "npm-user-validate": "^4.0.0", "p-map": "^7.0.4", - "pacote": "^21.3.1", + "pacote": "^21.4.0", "parse-conflict-json": "^5.0.1", "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", @@ -14031,6 +14353,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/@gar/promise-retry": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "retry": "^0.13.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@gar/promise-retry/node_modules/retry": { + "version": "0.13.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/npm/node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "inBundle": true, @@ -14063,7 +14404,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "9.3.1", + "version": "9.4.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -14138,16 +14479,16 @@ } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "7.0.1", + "version": "7.0.2", "inBundle": true, "license": "ISC", "dependencies": { + "@gar/promise-retry": "^1.0.0", "@npmcli/promise-spawn": "^9.0.0", "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^6.0.0" }, @@ -14393,11 +14734,11 @@ "license": "MIT" }, "node_modules/npm/node_modules/balanced-match": { - "version": "4.0.3", + "version": "4.0.4", "inBundle": true, "license": "MIT", "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/npm/node_modules/bin-links": { @@ -14427,14 +14768,14 @@ } }, "node_modules/npm/node_modules/brace-expansion": { - "version": "5.0.2", + "version": "5.0.3", "inBundle": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/npm/node_modules/cacache": { @@ -14550,15 +14891,6 @@ "node": ">=0.3.1" } }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/npm/node_modules/env-paths": { "version": "2.2.1", "inBundle": true, @@ -14658,7 +14990,7 @@ } }, "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", + "version": "0.7.2", "inBundle": true, "license": "MIT", "optional": true, @@ -14667,6 +14999,10 @@ }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/npm/node_modules/ignore-walk": { @@ -14786,11 +15122,11 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "8.1.2", + "version": "8.1.3", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.3.1", + "@npmcli/arborist": "^9.4.0", "@npmcli/installed-package-contents": "^4.0.0", "binary-extensions": "^3.0.0", "diff": "^8.0.2", @@ -14804,18 +15140,18 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "10.2.2", + "version": "10.2.3", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.3.1", + "@gar/promise-retry": "^1.0.0", + "@npmcli/arborist": "^9.4.0", "@npmcli/package-json": "^7.0.0", "@npmcli/run-script": "^10.0.0", "ci-info": "^4.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "read": "^5.0.1", "semver": "^7.3.7", "signal-exit": "^4.1.0", @@ -14826,11 +15162,11 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "7.0.16", + "version": "7.0.17", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.3.1" + "@npmcli/arborist": "^9.4.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -14849,11 +15185,11 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "9.1.2", + "version": "9.1.3", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.3.1", + "@npmcli/arborist": "^9.4.0", "@npmcli/run-script": "^10.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2" @@ -14927,10 +15263,11 @@ } }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "15.0.3", + "version": "15.0.4", "inBundle": true, "license": "ISC", "dependencies": { + "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", @@ -14940,7 +15277,6 @@ "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "ssri": "^13.0.0" }, "engines": { @@ -14981,7 +15317,7 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "5.0.1", + "version": "5.0.2", "inBundle": true, "license": "MIT", "dependencies": { @@ -14993,7 +15329,7 @@ "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { - "encoding": "^0.1.13" + "iconv-lite": "^0.7.2" } }, "node_modules/npm/node_modules/minipass-flush": { @@ -15183,7 +15519,7 @@ } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "10.0.3", + "version": "10.0.4", "inBundle": true, "license": "ISC", "dependencies": { @@ -15258,10 +15594,11 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "21.3.1", + "version": "21.4.0", "inBundle": true, "license": "ISC", "dependencies": { + "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", @@ -15275,7 +15612,6 @@ "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" @@ -15510,7 +15846,7 @@ } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.22", + "version": "3.0.23", "inBundle": true, "license": "CC0-1.0" }, @@ -15728,6 +16064,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/on-exit-leak-free": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", @@ -16049,6 +16395,153 @@ "node": ">= 0.8" } }, + "node_modules/patch-package": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", + "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^10.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.2.4", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/patch-package/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, + "license": "MIT", + "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/patch-package/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/patch-package/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/patch-package/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/patch-package/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package/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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -16147,14 +16640,14 @@ "license": "0BSD" }, "node_modules/pg": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.18.0.tgz", - "integrity": "sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", + "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.11.0", - "pg-pool": "^3.11.0", - "pg-protocol": "^1.11.0", + "pg-connection-string": "^2.12.0", + "pg-pool": "^3.13.0", + "pg-protocol": "^1.13.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, @@ -16195,15 +16688,15 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.11.0.tgz", - "integrity": "sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.12.0.tgz", + "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==", "license": "MIT" }, "node_modules/pg-cursor": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/pg-cursor/-/pg-cursor-2.17.0.tgz", - "integrity": "sha512-2Uio3Xfl5ldwJfls+RgGL+YbPcKQncWACWjYQFqlamvHZ4HJFjZhhZBbqd7jQ2LIkZYSvU90bm2dNW0rno+QFQ==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/pg-cursor/-/pg-cursor-2.19.0.tgz", + "integrity": "sha512-J5cF1MUz7LRJ9emOqF/06QjabMHMZy587rSPF0UuA8rCwKeeYl2co8Pp+6k5UU9YrAYHMzWkLxilfZB0hqsWWw==", "dev": true, "license": "MIT", "peer": true, @@ -16231,9 +16724,9 @@ } }, "node_modules/pg-pool": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.11.0.tgz", - "integrity": "sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.13.0.tgz", + "integrity": "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==", "license": "MIT", "peerDependencies": { "pg": ">=8.0" @@ -16287,9 +16780,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.11.0.tgz", - "integrity": "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", + "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", "license": "MIT" }, "node_modules/pg-query-stream": { @@ -16674,9 +17167,9 @@ } }, "node_modules/prettier-eslint/node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", - "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -16980,9 +17473,9 @@ } }, "node_modules/prettier-eslint/node_modules/eslint/node_modules/minimatch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", - "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -17089,9 +17582,9 @@ } }, "node_modules/prettier-eslint/node_modules/glob/node_modules/minimatch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", - "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -17421,9 +17914,9 @@ "license": "MIT" }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -17646,9 +18139,9 @@ } }, "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.8.tgz", - "integrity": "sha512-7RN35vit8DeBclkofOVmBY0eDAZZQd1HzmukRdSyz95CRh8FT54eqnbj0krQr3mrHR6sfRyYkyhwBWjoV5uqlQ==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -18378,6 +18871,24 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -18675,13 +19186,13 @@ } }, "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/sonic-boom": { @@ -18825,12 +19336,12 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -18897,9 +19408,9 @@ } }, "node_modules/strnum": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", + "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", "funding": [ { "type": "github", @@ -18949,9 +19460,9 @@ } }, "node_modules/swr": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.0.tgz", - "integrity": "sha512-sUlC20T8EOt1pHmDiqueUWMmRRX03W7w5YxovWX7VR2KHEPCTMly85x05vpkP5i6Bu4h44ePSMD9Tc+G2MItFw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.1.tgz", + "integrity": "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==", "license": "MIT", "dependencies": { "dequal": "^2.0.3", @@ -18981,9 +19492,9 @@ } }, "node_modules/tar": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", - "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.10.tgz", + "integrity": "sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -19045,12 +19556,13 @@ } }, "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", "license": "MIT", "dependencies": { "b4a": "^1.6.4", + "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } @@ -19107,7 +19619,6 @@ "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", "license": "MIT", - "optional": true, "dependencies": { "streamx": "^2.12.5" } @@ -19225,6 +19736,16 @@ "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", "license": "MIT" }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/code/package.json b/code/package.json index e182312f..a9a76dbc 100644 --- a/code/package.json +++ b/code/package.json @@ -9,11 +9,12 @@ "license": "Apache-2.0", "type": "module", "scripts": { + "apply:patches": "patch-package", "build": "tsc && tsc-alias && mkdir -p ./dist/public && mkdir -p ./dist/temp && cp -r ./public ./dist", "bump:snapshot": "npm version $npm_package_version.$(date \"+%s\")", "cleanup": "rm package-lock.json && npkill -D -y", "copy:assets": "mkdir -p ./public && cp -r node_modules/@imgly/background-removal-node/dist/. public", - "copy:fonts": "cp -r fonts/. dist/fonts", + "copy:fonts": "mkdir -p ./dist && cp -r fonts/. dist/fonts", "db:generate:migration": "sequelize-cli migration:generate --name migration-definition", "db:migrate:dev": "cross-env NODE_ENV=development sequelize-cli db:migrate --config ./config/config.cjs", "db:undo:dev": "cross-env NODE_ENV=development sequelize-cli db:migrate:undo --config ./config/config.cjs", @@ -33,7 +34,7 @@ "lint": "eslint src/**/* --no-warn-ignored --ext .ts", "lint:fix": "eslint src/**/* --no-warn-ignored --ext .ts --fix", "llm:studio": "mastra dev --dir=./src/mastra/studio --env=.env", - "postinstall": "npm run copy:assets", + "postinstall": "npm run copy:assets && npm run apply:patches", "prepare": "cd ../ && node code/.husky/install.mjs", "publish:snapshot": "nx run-many -t publish:snapshot -- --verbose --tag next --registry $NPM_PUBLISHING_REGISTRY --unsafe-perm", "start": "node --experimental-specifier-resolution=node --env-file=.env --loader ts-node/esm dist/server.js", @@ -59,9 +60,11 @@ "@azure/web-pubsub": "^1.2.0", "@google/genai": "^1.32.0", "@imgly/background-removal-node": "^1.4.5", - "@inditextech/weave-sdk": "2.23.0", - "@inditextech/weave-store-azure-web-pubsub": "2.23.0", - "@inditextech/weave-store-standalone": "2.23.0", + "@inditextech/weave-renderer-konva-base": "3.1.0", + "@inditextech/weave-renderer-konva-react-reconciler": "3.1.0", + "@inditextech/weave-sdk": "3.1.0", + "@inditextech/weave-store-azure-web-pubsub": "3.1.0", + "@inditextech/weave-store-standalone": "3.1.0", "@mastra/ai-sdk": "^0.3.1", "@mastra/core": "^0.24.5", "@mastra/libsql": "^0.16.2", @@ -136,6 +139,7 @@ "husky": "^9.1.7", "nodemon": "^3.1.9", "npkill": "^0.12.2", + "patch-package": "^8.0.1", "prettier": "^3.5.3", "prettier-eslint": "^16.3.0", "sequelize-cli": "^6.6.3", diff --git a/code/patches/konva+10.0.2.patch b/code/patches/konva+10.0.2.patch new file mode 100644 index 00000000..efc19cea --- /dev/null +++ b/code/patches/konva+10.0.2.patch @@ -0,0 +1,14 @@ +diff --git a/node_modules/konva/lib/shapes/Text.js b/node_modules/konva/lib/shapes/Text.js +index c882d0a..a34a9c9 100644 +--- a/node_modules/konva/lib/shapes/Text.js ++++ b/node_modules/konva/lib/shapes/Text.js +@@ -279,8 +279,7 @@ export class Text extends Shape { + _getContextFont() { + return (this.fontStyle() + + SPACE + +- this.fontVariant() + +- SPACE + ++ (this.fontVariant() === "normal" ? "" : this.fontVariant() + SPACE) + + (this.fontSize() + PX_SPACE) + + normalizeFontFamily(this.fontFamily())); + } diff --git a/code/src/canvas/fonts.ts b/code/src/canvas/fonts.ts index 2c952bec..48b2b20d 100644 --- a/code/src/canvas/fonts.ts +++ b/code/src/canvas/fonts.ts @@ -16,136 +16,285 @@ export const registerSkiaFonts = () => { FontLibrary.reset(); - const fonts: SkiaFont[] = [ - // Impact font family - { - family: "Impact", - paths: [path.resolve(process.cwd(), "fonts/Impact.ttf")], - }, - // Verdana font family - { - family: "Verdana", - paths: [ - path.resolve(process.cwd(), "fonts/Verdana-Italic.ttf"), - path.resolve(process.cwd(), "fonts/Verdana-Bold.ttf"), - path.resolve(process.cwd(), "fonts/Verdana-BoldItalic.ttf"), - path.resolve(process.cwd(), "fonts/Verdana.ttf"), - ], - }, - // Inter font family - { - family: "Inter", - paths: [ - path.resolve(process.cwd(), "fonts/inter-bold.ttf"), - path.resolve(process.cwd(), "fonts/inter-italic.ttf"), - path.resolve(process.cwd(), "fonts/inter-italic-bold.ttf"), - path.resolve(process.cwd(), "fonts/inter-regular.ttf"), - ], - }, - // Sansita font family - { - family: "Sansita", - paths: [ - path.resolve(process.cwd(), "fonts/sansita-bold.ttf"), - path.resolve(process.cwd(), "fonts/sansita-regular.ttf"), - ], - }, - ]; + const fonts: SkiaFont[] = []; + + // Arial font family + + fonts.push({ + family: "Arial", + paths: [ + path.resolve(process.cwd(), "fonts/ARIAL.TTF"), + path.resolve(process.cwd(), "fonts/ARIALBD.TTF"), + path.resolve(process.cwd(), "fonts/ARIALI 1.TTF"), + path.resolve(process.cwd(), "fonts/ARIALBI.TTF"), + ], + }); + + // Fuzzy Bubbles font family + + fonts.push({ + family: "Fuzzy Bubbles", + paths: [ + path.resolve(process.cwd(), "fonts/FuzzyBubbles-Regular.ttf"), + path.resolve(process.cwd(), "fonts/FuzzyBubbles-Bold.ttf"), + ], + }); + + // Inter font family + + fonts.push({ + family: "Inter", + paths: [ + path.resolve(process.cwd(), "fonts/inter-bold.ttf"), + path.resolve(process.cwd(), "fonts/inter-italic.ttf"), + path.resolve(process.cwd(), "fonts/inter-italic-bold.ttf"), + path.resolve(process.cwd(), "fonts/inter-regular.ttf"), + ], + }); + + // Noto Sans font family + + fonts.push({ + family: "Noto Sans Mono", + paths: [ + path.resolve(process.cwd(), "fonts/NotoSansMono-Regular.ttf"), + path.resolve(process.cwd(), "fonts/NotoSansMono-Bold.ttf"), + ], + }); + + // Roboto Mono font family + + fonts.push({ + family: "Roboto Mono", + paths: [ + path.resolve(process.cwd(), "fonts/RobotoMono-Regular.ttf"), + path.resolve(process.cwd(), "fonts/RobotoMono-Bold.ttf"), + path.resolve(process.cwd(), "fonts/RobotoMono-Italic.ttf"), + path.resolve(process.cwd(), "fonts/RobotoMono-BoldItalic.ttf"), + ], + }); + + // Sansita font family + + fonts.push({ + family: "Sansita", + paths: [ + path.resolve(process.cwd(), "fonts/sansita-bold.ttf"), + path.resolve(process.cwd(), "fonts/sansita-regular.ttf"), + ], + }); + + // Special Gothic Condensed One font family + + fonts.push({ + family: "Special Gothic Condensed One", + paths: [ + path.resolve( + process.cwd(), + "fonts/SpecialGothicCondensedOne-Regular.ttf", + ), + ], + }); for (const font of fonts) { FontLibrary.use(font.family, font.paths); } + console.log(FontLibrary.family("Arial")); // Log registered font families + registered = true; }; export const registerCanvasFonts = () => { - const fonts: CanvasFont[] = [ - // Impact font family - { - path: path.resolve(process.cwd(), "fonts/Impact.ttf"), - fontFace: { - family: "Impact", - weight: "400", - style: "normal", - }, - }, - // Verdana font family - { - path: path.resolve(process.cwd(), "fonts/Verdana.ttf"), - fontFace: { - family: "Verdana", - weight: "400", - style: "normal", - }, - }, - { - path: path.resolve(process.cwd(), "fonts/Verdana-Bold.ttf"), - fontFace: { - family: "Verdana", - weight: "700", - style: "normal", - }, - }, - { - path: path.resolve(process.cwd(), "fonts/Verdana-Italic.ttf"), - fontFace: { - family: "Verdana", - weight: "400", - style: "italic", - }, - }, - { - path: path.resolve(process.cwd(), "fonts/Verdana-BoldItalic.ttf"), - fontFace: { - family: "Verdana", - weight: "700", - style: "italic", - }, - }, - // Inter font family - { - path: path.resolve(process.cwd(), "fonts/inter-regular.ttf"), - fontFace: { - family: "Inter", - weight: "400", - style: "normal", - }, - }, - { - path: path.resolve(process.cwd(), "fonts/inter-bold.ttf"), - fontFace: { - family: "Inter", - weight: "700", - style: "normal", - }, - }, - { - path: path.resolve(process.cwd(), "fonts/inter-italic.ttf"), - fontFace: { - family: "Inter", - weight: "400", - style: "italic", - }, - }, - { - path: path.resolve(process.cwd(), "fonts/inter-italic-bold.ttf"), - fontFace: { - family: "Inter", - weight: "700", - style: "italic", - }, - }, - // Sansita font family - { - path: path.resolve(process.cwd(), "fonts/sansita-regular.ttf"), - fontFace: { - family: "Sansita", - weight: "400", - style: "normal", - }, - }, - ]; + const fonts: CanvasFont[] = []; + + // Arial font family + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/ARIAL.TTF"), + fontFace: { + family: "Arial", + weight: "400", + style: "normal", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/ARIALBD.TTF"), + fontFace: { + family: "Arial", + weight: "700", + style: "normal", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/ARIALI.TTF"), + fontFace: { + family: "Arial", + weight: "400", + style: "italic", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/ARIALBI.TTF"), + fontFace: { + family: "Arial", + weight: "700", + style: "italic", + }, + }); + + // Fuzzy Bubbles font family + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/FuzzyBubbles-Regular.ttf"), + fontFace: { + family: "Fuzzy Bubbles", + weight: "400", + style: "normal", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/FuzzyBubbles-Bold.ttf"), + fontFace: { + family: "Fuzzy Bubbles", + weight: "700", + style: "normal", + }, + }); + + // Inter font family + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/inter-regular.ttf"), + fontFace: { + family: "Inter", + weight: "400", + style: "normal", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/inter-bold.ttf"), + fontFace: { + family: "Inter", + weight: "700", + style: "normal", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/inter-italic.ttf"), + fontFace: { + family: "Inter", + weight: "400", + style: "italic", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/inter-italic-bold.ttf"), + fontFace: { + family: "Inter", + weight: "700", + style: "italic", + }, + }); + + // Noto Sans Mono font family + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/NotoSansMono-Regular.ttf"), + fontFace: { + family: "Noto Sans Mono", + weight: "400", + style: "normal", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/NotoSansMono-Bold.ttf"), + fontFace: { + family: "Noto Sans Mono", + weight: "700", + style: "normal", + }, + }); + + // Roboto Mono font family + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/RobotoMono-Regular.ttf"), + fontFace: { + family: "Roboto Mono", + weight: "400", + style: "normal", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/RobotoMono-Bold.ttf"), + fontFace: { + family: "Roboto Mono", + weight: "700", + style: "normal", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/RobotoMono-Italic.ttf"), + fontFace: { + family: "Roboto Mono", + weight: "400", + style: "italic", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/RobotoMono-BoldItalic.ttf"), + fontFace: { + family: "Roboto Mono", + weight: "700", + style: "italic", + }, + }); + + // Sansita font family + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/sansita-regular.ttf"), + fontFace: { + family: "Sansita", + weight: "400", + style: "normal", + }, + }); + + fonts.push({ + path: path.resolve(process.cwd(), "fonts/sansita-bold.ttf"), + fontFace: { + family: "Sansita", + weight: "700", + style: "normal", + }, + }); + + // Special Gothic Condensed One font family + + fonts.push({ + path: path.resolve( + process.cwd(), + "fonts/SpecialGothicCondensedOne-Regular.ttf", + ), + fontFace: { + family: "Special Gothic Condensed One", + weight: "400", + style: "normal", + }, + }); for (const font of fonts) { registerFont(font.path, font.fontFace); diff --git a/code/src/canvas/nodes/measure/measure.ts b/code/src/canvas/nodes/measure/measure.ts index f3508f9f..6abd2714 100644 --- a/code/src/canvas/nodes/measure/measure.ts +++ b/code/src/canvas/nodes/measure/measure.ts @@ -13,7 +13,7 @@ import { type WeaveNodesSelectionPluginOnNodesChangeEvent, type WeaveNodesSelectionPlugin, type WeaveStageZoomPluginOnZoomChangeEvent, -} from "@inditextech/weave-sdk"; +} from "@inditextech/weave-sdk/server"; import { MEASURE_NODE_DEFAULT_CONFIG, MEASURE_NODE_TYPE } from "./constants.js"; import type { Vector2d } from "konva/lib/types"; import type { MeasureNodeParams, MeasureNodeProperties } from "./types.js"; @@ -29,7 +29,7 @@ export class MeasureNode extends WeaveNode { this.config = mergeExceptArrays( MEASURE_NODE_DEFAULT_CONFIG, - params?.config ?? {} + params?.config ?? {}, ); this.eventsInitiated = false; @@ -61,7 +61,7 @@ export class MeasureNode extends WeaveNode { unit, unitPerPixel: newUnitPerPixel, }); - } + }, ); this.instance.addEventListener<{ unit: string; unitPerPixel: number }>( @@ -78,10 +78,10 @@ export class MeasureNode extends WeaveNode { measure.setAttr("unitPerPixel", unitPerPixel); this.instance.updateNode( - this.serialize(measure as WeaveElementInstance) + this.serialize(measure as WeaveElementInstance), ); } - } + }, ); this.instance.addEventListener<{ @@ -105,7 +105,7 @@ export class MeasureNode extends WeaveNode { measure.setAttr("unitPerPixel", unitPerPixel); this.instance.updateNode( - this.serialize(measure as WeaveElementInstance) + this.serialize(measure as WeaveElementInstance), ); const measureNodes = stage.find(`.${MEASURE_NODE_TYPE}`); @@ -119,7 +119,7 @@ export class MeasureNode extends WeaveNode { measure.setAttr("unitPerPixel", unitPerPixel); this.instance.updateNode( - this.serialize(measure as WeaveElementInstance) + this.serialize(measure as WeaveElementInstance), ); } } @@ -155,7 +155,7 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, fromPoint, - (separation + separationLine.padding) * orientation + (separation + separationLine.padding) * orientation, ); const linePerpFrom = new Konva.Line({ @@ -182,7 +182,7 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, toPoint, - (separation + separationLine.padding) * orientation + (separation + separationLine.padding) * orientation, ); const linePerpTo = new Konva.Line({ @@ -201,7 +201,7 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, fromPoint, - separation * orientation + separation * orientation, ); // Circle drawn at the end of the 'fromPoint' perpendicular line @@ -221,7 +221,7 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, toPoint, - separation * orientation + separation * orientation, ); // Circle drawn at the end of the 'toPoint' perpendicular line @@ -279,7 +279,7 @@ export class MeasureNode extends WeaveNode { fromPerp.left, toPerp.left, midPoint, - (textSize.height + separationLine.padding) * orientation + (textSize.height + separationLine.padding) * orientation, ); measureText.x(perpPointTextMid.left.x); measureText.y(perpPointTextMid.left.y); @@ -295,7 +295,7 @@ export class MeasureNode extends WeaveNode { textSize.width > this.distanceBetweenPoints(fromPerp.left, toPerp.left) ? 0 : textOffsetX + textConfig.padding, - false + false, ); // A point perpendicular from the mid point of the measure line, at a distance @@ -306,7 +306,7 @@ export class MeasureNode extends WeaveNode { textSize.width > this.distanceBetweenPoints(fromPerp.left, toPerp.left) ? 0 : textOffsetX + textConfig.padding, - true + true, ); // A line draw from the 'fromPoint' perpendicular line circle center to the pointLeftText @@ -371,7 +371,7 @@ export class MeasureNode extends WeaveNode { this.updateSelectionHandlers(measure); } } - } + }, ); this.instance.addEventListener( @@ -396,7 +396,7 @@ export class MeasureNode extends WeaveNode { if (!isSelected) { this.destroySelectionHandlers(measure); } - } + }, ); this.initEvents(); @@ -425,17 +425,17 @@ export class MeasureNode extends WeaveNode { const angle = this.getAngle(fromPoint, toPoint); const moveToCircleAct = node.findOne(`#moveToCircle-${node.getAttrs().id}`); const crosshairFromAct = node.findOne( - `#crosshairFrom-${node.getAttrs().id}` + `#crosshairFrom-${node.getAttrs().id}`, ); const moveFromCircleAct = node.findOne( - `#moveFromCircle-${node.getAttrs().id}` + `#moveFromCircle-${node.getAttrs().id}`, ); const crosshairToAct = node.findOne(`#crosshairTo-${node.getAttrs().id}`); const moveSeparationRectAct = node.findOne( - `#moveSeparationRect-${node.getAttrs().id}` + `#moveSeparationRect-${node.getAttrs().id}`, ); const measureText = node.findOne( - `#measureText-${node.getAttrs().id}` + `#measureText-${node.getAttrs().id}`, ) as Konva.Text; if ( @@ -467,7 +467,7 @@ export class MeasureNode extends WeaveNode { "crosshairFrom", node, fromPoint, - angle + angle, ); const moveToCircle = new Konva.Circle({ @@ -487,28 +487,28 @@ export class MeasureNode extends WeaveNode { "crosshairTo", node, toPoint, - angle + angle, ); const fromPerp = this.perpendicularPoint( fromPoint, toPoint, fromPoint, - separation * orientation + separation * orientation, ); const toPerp = this.perpendicularPoint( fromPoint, toPoint, toPoint, - separation * orientation + separation * orientation, ); const pointMidMeasure = this.pointFromMid( fromPerp.left, toPerp.left, 0, - false + false, ); const isTextBiggerThanMeasureSpace = @@ -522,7 +522,7 @@ export class MeasureNode extends WeaveNode { fromPerp.left, toPerp.left, pointMidMeasure, - multiplier * (textSize?.height ?? 0) * orientation + multiplier * (textSize?.height ?? 0) * orientation, ); const moveSeparationRect = new Konva.Rect({ @@ -578,7 +578,7 @@ export class MeasureNode extends WeaveNode { }); this.onUpdate( realNode as WeaveElementInstance, - this.serialize(realNode as WeaveElementInstance).props + this.serialize(realNode as WeaveElementInstance).props, ); }); @@ -600,7 +600,7 @@ export class MeasureNode extends WeaveNode { fromPoint: newFromPoint, }); this.instance.updateNode( - this.serialize(realNode as WeaveElementInstance) + this.serialize(realNode as WeaveElementInstance), ); }); @@ -628,7 +628,7 @@ export class MeasureNode extends WeaveNode { }); this.onUpdate( realNode as WeaveElementInstance, - this.serialize(realNode as WeaveElementInstance).props + this.serialize(realNode as WeaveElementInstance).props, ); }); @@ -650,7 +650,7 @@ export class MeasureNode extends WeaveNode { toPoint: newToPoint, }); this.instance.updateNode( - this.serialize(realNode as WeaveElementInstance) + this.serialize(realNode as WeaveElementInstance), ); }); @@ -684,13 +684,13 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, midPoint, - multiplier * (textSize?.height ?? 0) * orientation + multiplier * (textSize?.height ?? 0) * orientation, ); const pointInLine = this.projectPointToLine( separatorPoint.left, originalSeparationHandlerPosition, - pos + pos, ); if (isNaN(pointInLine.t)) { @@ -698,7 +698,7 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, separatorPoint.left, - (multiplier * (textSize?.height ?? 0) + 1) * orientation + (multiplier * (textSize?.height ?? 0) + 1) * orientation, ); moveSeparationRect.position(point); originalSeparationHandlerPosition = point; @@ -726,7 +726,7 @@ export class MeasureNode extends WeaveNode { this.onUpdate( realNode as WeaveElementInstance, - this.serialize(realNode as WeaveElementInstance).props + this.serialize(realNode as WeaveElementInstance).props, ); }); @@ -748,13 +748,13 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, midPoint, - multiplier * (textSize?.height ?? 0) * orientation + multiplier * (textSize?.height ?? 0) * orientation, ); const pointInLine = this.projectPointToLine( separatorPoint.left, originalSeparationHandlerPosition, - pos + pos, ); moveSeparationRect.position(pointInLine); @@ -774,7 +774,7 @@ export class MeasureNode extends WeaveNode { }); this.instance.updateNode( - this.serialize(realNode as WeaveElementInstance) + this.serialize(realNode as WeaveElementInstance), ); }); } @@ -788,19 +788,19 @@ export class MeasureNode extends WeaveNode { const toPoint = node.getAttrs().toPoint as { x: number; y: number }; const moveToCircle = node.findOne( - `#moveToCircle-${node.getAttrs().id}` + `#moveToCircle-${node.getAttrs().id}`, ) as Konva.Circle; const crosshairFrom = node.findOne( - `#crosshairFrom-${node.getAttrs().id}` + `#crosshairFrom-${node.getAttrs().id}`, ) as Konva.Group; const moveFromCircle = node.findOne( - `#moveFromCircle-${node.getAttrs().id}` + `#moveFromCircle-${node.getAttrs().id}`, ) as Konva.Circle; const crosshairTo = node.findOne( - `#crosshairTo-${node.getAttrs().id}` + `#crosshairTo-${node.getAttrs().id}`, ) as Konva.Group; const moveSeparationRect = node.findOne( - `#moveSeparationRect-${node.getAttrs().id}` + `#moveSeparationRect-${node.getAttrs().id}`, ) as Konva.Rect; if (moveToCircle) { @@ -821,7 +821,7 @@ export class MeasureNode extends WeaveNode { if (moveSeparationRect) { const measureText = node.findOne( - `#measureText-${node.getAttrs().id}` + `#measureText-${node.getAttrs().id}`, ) as Konva.Text; const angle = this.getAngle(fromPoint, toPoint); @@ -833,21 +833,21 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, fromPoint, - separation * orientation + separation * orientation, ); const toPerp = this.perpendicularPoint( fromPoint, toPoint, toPoint, - separation * orientation + separation * orientation, ); const pointMidMeasure = this.pointFromMid( fromPerp.left, toPerp.left, 0, - false + false, ); const isTextBiggerThanMeasureSpace = @@ -862,7 +862,7 @@ export class MeasureNode extends WeaveNode { fromPerp.left, toPerp.left, pointMidMeasure, - multiplier * (textSize?.height ?? 0) * orientation + multiplier * (textSize?.height ?? 0) * orientation, ); moveSeparationRect.x(separatorPoint.left.x); @@ -876,11 +876,11 @@ export class MeasureNode extends WeaveNode { const moveToCircle = node.findOne(`#moveToCircle-${node.getAttrs().id}`); const crosshairFrom = node.findOne(`#crosshairFrom-${node.getAttrs().id}`); const moveFromCircle = node.findOne( - `#moveFromCircle-${node.getAttrs().id}` + `#moveFromCircle-${node.getAttrs().id}`, ); const crosshairTo = node.findOne(`#crosshairTo-${node.getAttrs().id}`); const moveSeparationRect = node.findOne( - `#moveSeparationRect-${node.getAttrs().id}` + `#moveSeparationRect-${node.getAttrs().id}`, ); if (moveToCircle) { @@ -904,7 +904,7 @@ export class MeasureNode extends WeaveNode { from: Konva.Vector2d, to: Konva.Vector2d, distance: number, - towardsSecond = true + towardsSecond = true, ) { // midpoint const mx = (from.x + to.x) / 2; @@ -941,7 +941,7 @@ export class MeasureNode extends WeaveNode { from: Konva.Vector2d, to: Konva.Vector2d, point: Konva.Vector2d, - distance: number + distance: number, ) { const dx = to.x - from.x; const dy = to.y - from.y; @@ -971,7 +971,7 @@ export class MeasureNode extends WeaveNode { onUpdate( nodeInstance: WeaveElementInstance, - nextProps: WeaveElementAttributes + nextProps: WeaveElementAttributes, ): void { nodeInstance.setAttrs({ ...nextProps, @@ -993,11 +993,11 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, fromPoint, - (separation + separationLine.padding) * orientation + (separation + separationLine.padding) * orientation, ); const linePerpFrom = measure.findOne( - `#linePerpFrom-${nextProps.id}` + `#linePerpFrom-${nextProps.id}`, ) as Konva.Line; linePerpFrom?.points([ fromPoint.x, @@ -1010,11 +1010,11 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, toPoint, - (separation + separationLine.padding) * orientation + (separation + separationLine.padding) * orientation, ); const linePerpTo = measure.findOne( - `#linePerpTo-${nextProps.id}` + `#linePerpTo-${nextProps.id}`, ) as Konva.Line; linePerpTo?.points([ toPoint.x, @@ -1027,11 +1027,11 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, fromPoint, - separation * orientation + separation * orientation, ); const fromCircle = measure.findOne( - `#fromCircle-${nextProps.id}` + `#fromCircle-${nextProps.id}`, ) as Konva.Circle; fromCircle?.position({ x: fromPerp.left.x, @@ -1042,11 +1042,11 @@ export class MeasureNode extends WeaveNode { fromPoint, toPoint, toPoint, - separation * orientation + separation * orientation, ); const toCircle = measure.findOne( - `#toCircle-${nextProps.id}` + `#toCircle-${nextProps.id}`, ) as Konva.Circle; toCircle?.position({ x: toPerp.left.x, @@ -1069,7 +1069,7 @@ export class MeasureNode extends WeaveNode { : `${distance.toFixed(2)} px`; const measureText = measure.findOne( - `#measureText-${nextProps.id}` + `#measureText-${nextProps.id}`, ) as Konva.Text; const angle = this.getAngle(fromPoint, toPoint); @@ -1089,7 +1089,7 @@ export class MeasureNode extends WeaveNode { fromPerp.left, toPerp.left, midPoint, - (textSize.height + separationLine.padding) * orientation + (textSize.height + separationLine.padding) * orientation, ); measureText.x(perpPointTextMid.left.x); measureText.y(perpPointTextMid.left.y); @@ -1101,7 +1101,7 @@ export class MeasureNode extends WeaveNode { textSize.width > this.distanceBetweenPoints(fromPerp.left, toPerp.left) ? 0 : textOffsetX + textConfig.padding, - false + false, ); const pointRightText = this.pointFromMid( @@ -1110,7 +1110,7 @@ export class MeasureNode extends WeaveNode { textSize.width > this.distanceBetweenPoints(fromPerp.left, toPerp.left) ? 0 : textOffsetX + textConfig.padding, - true + true, ); const lineLeft = measure.findOne(`#lineLeft-${nextProps.id}`) as Konva.Line; @@ -1122,7 +1122,7 @@ export class MeasureNode extends WeaveNode { ]); const lineRight = measure.findOne( - `#lineRight-${nextProps.id}` + `#lineRight-${nextProps.id}`, ) as Konva.Line; lineRight?.points([ pointRightText.x, @@ -1135,11 +1135,11 @@ export class MeasureNode extends WeaveNode { fromPerp.left, toPerp.left, 0, - false + false, ); const crosshairFrom = measure.findOne( - `#crosshairFrom-${measure.getAttrs().id}` + `#crosshairFrom-${measure.getAttrs().id}`, ); if (crosshairFrom) { @@ -1149,7 +1149,7 @@ export class MeasureNode extends WeaveNode { } const crosshairTo = measure.findOne( - `#crosshairTo-${measure.getAttrs().id}` + `#crosshairTo-${measure.getAttrs().id}`, ); if (crosshairTo) { @@ -1159,7 +1159,7 @@ export class MeasureNode extends WeaveNode { } const moveSeparationRect = measure.findOne( - `#moveSeparationRect-${measure.getAttrs().id}` + `#moveSeparationRect-${measure.getAttrs().id}`, ); if (moveSeparationRect) { @@ -1176,7 +1176,7 @@ export class MeasureNode extends WeaveNode { fromPerp.left, toPerp.left, pointMidMeasure, - multiplier * textSize.height * orientation + multiplier * textSize.height * orientation, ); moveSeparationRect.x(separatorPoint.left.x); @@ -1188,7 +1188,7 @@ export class MeasureNode extends WeaveNode { private projectPointToLine( fromPoint: Konva.Vector2d, toPoint: Konva.Vector2d, - pointToProject: Konva.Vector2d + pointToProject: Konva.Vector2d, ): { x: number; y: number; t: number; flipped: boolean } { const dx = toPoint.x - fromPoint.x; const dy = toPoint.y - fromPoint.y; @@ -1215,7 +1215,7 @@ export class MeasureNode extends WeaveNode { name: string, node: Konva.Group, point: Vector2d, - angle: number + angle: number, ) { const props = node.getAttrs(); @@ -1257,7 +1257,7 @@ export class MeasureNode extends WeaveNode { fromPoint: Konva.Vector2d, toPoint: Konva.Vector2d, point: Konva.Vector2d, - distance: number + distance: number, ) { const dx = toPoint.x - fromPoint.x; const dy = toPoint.y - fromPoint.y; @@ -1300,10 +1300,10 @@ export class MeasureNode extends WeaveNode { const scale = stage.scaleX(); const fromCircle = node.findOne( - `#fromCircle-${node.getAttrs().id}` + `#fromCircle-${node.getAttrs().id}`, ) as Konva.Circle; const toCircle = node.findOne( - `#toCircle-${node.getAttrs().id}` + `#toCircle-${node.getAttrs().id}`, ) as Konva.Circle; if (fromCircle && toCircle) { diff --git a/code/src/canvas/nodes/pantone/pantone.ts b/code/src/canvas/nodes/pantone/pantone.ts index 704c14da..6bfff3fd 100644 --- a/code/src/canvas/nodes/pantone/pantone.ts +++ b/code/src/canvas/nodes/pantone/pantone.ts @@ -6,7 +6,7 @@ import type { WeaveElementAttributes, WeaveElementInstance, } from "@inditextech/weave-types"; -import { WeaveNode } from "@inditextech/weave-sdk"; +import { WeaveNode } from "@inditextech/weave-sdk/server"; import Konva from "konva"; import { getNearestPantone } from "pantone-tcx"; @@ -178,7 +178,7 @@ export class PantoneNode extends WeaveNode { onUpdate( nodeInstance: WeaveElementInstance, - nextProps: WeaveElementAttributes + nextProps: WeaveElementAttributes, ) { const { id, pantone, pantoneStroke, pantoneStrokeWidth, dash } = nextProps; diff --git a/code/src/canvas/weave.ts b/code/src/canvas/weave.ts index 3b85e2ab..8b738ade 100644 --- a/code/src/canvas/weave.ts +++ b/code/src/canvas/weave.ts @@ -24,6 +24,8 @@ import { setupSkiaBackend, // setupCanvasBackend, } from "@inditextech/weave-sdk/server"; +import { WeaveKonvaBaseRenderer } from "@inditextech/weave-renderer-konva-base/server"; +// import { WeaveKonvaReactReconcilerRenderer } from "@inditextech/weave-renderer-konva-react-reconciler/server"; import { ColorTokenNode } from "./nodes/color-token/color-token.js"; import { isAbsoluteUrl, sleep } from "../utils.js"; import { ServiceConfig } from "../types.js"; @@ -77,9 +79,13 @@ export const renderWeaveRoom = ( }, ); + const renderer = new WeaveKonvaBaseRenderer(); + // const renderer = new WeaveKonvaReactReconcilerRenderer(); + weave = new Weave( { store, + renderer, nodes: getNodes(config), actions: [], plugins: [], diff --git a/code/src/database/database.ts b/code/src/database/database.ts index bc0fb85f..1ab7c65f 100644 --- a/code/src/database/database.ts +++ b/code/src/database/database.ts @@ -19,11 +19,10 @@ import { defineChatMessageModel } from "./models/chat-message.js"; let logger = null as unknown as ReturnType; let activeSequelize: Sequelize | null = null; -let standbySequelize: Sequelize | null = null; -const RENEW_TOKEN_CHECK_INTERVAL = 60 * 1000; // 1 minute -const RENEW_TOKEN_THRESHOLD = 5 * 60 * 1000; // 5 minutes -const CLOSE_STANDBY_SEQUELIZE_DELAY = 5 * 60 * 1000; // 5 minutes +// const RENEW_TOKEN_CHECK_INTERVAL = 60 * 1000; // 1 minute +// const RENEW_TOKEN_THRESHOLD = 5 * 60 * 1000; // 5 minutes +// const CLOSE_STANDBY_SEQUELIZE_DELAY = 5 * 60 * 1000; // 5 minutes export const setupDatabase = async () => { logger = getLogger().child({ module: "database" }); @@ -35,9 +34,10 @@ export const setupDatabase = async () => { let currentAccessToken: AccessToken | undefined = undefined; async function initSequelize( - initialize: boolean = true + initialize: boolean = true, ): Promise { if (config.database.kind === "connection_string") { + logger.info("Initializing database connection (connection string)"); const { database: { connection: { connectionString }, @@ -47,6 +47,12 @@ export const setupDatabase = async () => { const sequelize = new Sequelize(connectionString, { dialect: "postgres", logging: false, + pool: { + max: 5, + min: 0, + acquire: 30000, + idle: 10000, + }, // logging: (msg: string) => logger.debug(msg), }); @@ -54,7 +60,7 @@ export const setupDatabase = async () => { await sequelize.authenticate(); } catch (error) { throw new Error( - `Unable to connect to the database: ${(error as Error).message}` + `Unable to connect to the database: ${(error as Error).message}`, ); } @@ -82,6 +88,7 @@ export const setupDatabase = async () => { } if (config.database.kind === "properties") { + logger.info("Initializing database connection (properties)"); const { database: { connection: { host, port, db, username, password, ssl }, @@ -99,6 +106,12 @@ export const setupDatabase = async () => { host, port, dialect: "postgres", + pool: { + max: 5, + min: 0, + acquire: 30000, + idle: 10000, + }, ...(ssl && { dialectOptions: { ssl: { @@ -111,11 +124,18 @@ export const setupDatabase = async () => { // logging: (msg: string) => logger.debug(msg), }); + if (config.database.connection.cloudCredentials) { + sequelize.addHook("beforeConnect", async (config) => { + const accessToken = await getDatabaseCloudCredentialsToken(); + config.password = accessToken.token; + }); + } + try { await sequelize.authenticate(); } catch (error) { throw new Error( - `Unable to connect to the database: ${(error as Error).message}` + `Unable to connect to the database: ${(error as Error).message}`, ); } @@ -146,54 +166,19 @@ export const setupDatabase = async () => { return null; } - function tokenRenewalInterval() { - setInterval(async () => { - if (!activeSequelize) { - logger.info("Not active..."); - return; - } - - if ( - currentAccessToken?.expiresOnTimestamp && - Date.now() > - currentAccessToken.expiresOnTimestamp - RENEW_TOKEN_THRESHOLD - ) { - logger.info("Renewing access token"); - - standbySequelize = await initSequelize(false); - - if (!standbySequelize) { - throw new Error("Database settings not defined on database module"); - } - - const old = activeSequelize; - activeSequelize = standbySequelize; - standbySequelize = null; - - setTimeout(() => { - old.close().catch(console.error); - }, CLOSE_STANDBY_SEQUELIZE_DELAY); - } - }, RENEW_TOKEN_CHECK_INTERVAL); - - logger.info("Token renewal interval started"); - } - activeSequelize = await initSequelize(); if (!activeSequelize) { throw new Error("Database settings not defined on database module"); } - tokenRenewalInterval(); - return activeSequelize; }; export const getDatabaseInstance = () => { - if (!activeSequelize && !standbySequelize) { + if (!activeSequelize) { throw new Error("Database module not initialized"); } - return standbySequelize ?? activeSequelize; + return activeSequelize; }; diff --git a/code/src/store.ts b/code/src/store.ts index 6bcc752b..3096b591 100644 --- a/code/src/store.ts +++ b/code/src/store.ts @@ -71,7 +71,7 @@ export const getStore = () => { export const performPersistRoom = async ( docName: string, - actualState: Uint8Array + actualState: Uint8Array, ) => { if (!isStorageInitialized()) { await setupStorage(); @@ -87,16 +87,16 @@ export const performPersistRoom = async ( const actualStateJson = getStateAsJson(actualState); const firstLevelNodes = actualStateJson.props.children.find( // eslint-disable-next-line @typescript-eslint/no-explicit-any - (c: any) => c.key === "mainLayer" + (c: any) => c.key === "mainLayer", ).props.children; logger.info( `Persisting room ${docName} state change. Amount of first-level nodes: ${ firstLevelNodes.length - }` + }`, ); const mainLayer = actualStateJson.props.children?.find( - (child: any) => child.key === "mainLayer" + (child: any) => child.key === "mainLayer", ); let images: string[] = []; @@ -135,7 +135,7 @@ export const setupStore = () => { connectionHandlers: { onConnect: async ( connectionId: string, - queries: Record | undefined + queries: Record | undefined, ) => { logger.info(`onConnect called with <${connectionId}>`); @@ -169,7 +169,7 @@ export const setupStore = () => { if (connection) { logger.info( - `Room of connectionId <${connection.connectionId}> is <${connection.roomId}>` + `Room of connectionId <${connection.connectionId}> is <${connection.roomId}>`, ); } @@ -177,7 +177,7 @@ export const setupStore = () => { } catch (ex) { console.error(ex); logger.error( - `Error getting connection room: <${(ex as Error)?.message}>` + `Error getting connection room: <${(ex as Error)?.message}>`, ); } @@ -190,7 +190,7 @@ export const setupStore = () => { const connections = await getRoomConnections({ roomId }); logger.info( - `Room with roomId <${roomId}> has <${connections.length}> connections` + `Room with roomId <${roomId}> has <${connections.length}> connections`, ); return connections.map((conn) => conn.connectionId); @@ -234,7 +234,7 @@ export const setupStore = () => { }, persistRoom: async ( docName: string, - actualState: Uint8Array + actualState: Uint8Array, ) => { await persistenceQueue.add(async () => { await performPersistRoom(docName, actualState); @@ -249,65 +249,69 @@ export const setupStore = () => { ({ context, queries }) => { logger.info( { queries }, - `Client with connection Id <${context.connectionId}> connect` + `Client with connection Id <${context.connectionId}> connect`, ); - } + }, ); azureWebPubsubServer.addEventListener( "onConnected", ({ context }) => { logger.info( - `Client with connection Id <${context.connectionId}> connected` + `Client with connection Id <${context.connectionId}> connected`, ); - } + }, ); azureWebPubsubServer.addEventListener( "onDisconnected", ({ context }) => { logger.info( - `Client with connection Id <${context.connectionId}> disconnected` + `Client with connection Id <${context.connectionId}> disconnected`, ); - } + }, ); azureWebPubsubServer.addEventListener( "onWsOpen", ({ group }) => { - logger.info(`WebSocket server connection opened for group <${group}>`); - } + logger.info( + `Azure Web PubSub server connection opened for group <${group}>`, + ); + }, ); azureWebPubsubServer.addEventListener( "onWsJoinGroup", ({ group }) => { - logger.info(`WebSocket server connection joined group <${group}>`); - } + logger.info(`Azure Web PubSub server connection joined group <${group}>`); + }, ); azureWebPubsubServer.addEventListener( "onWsClose", ({ event, group }) => { logger.info( - `WebSocket server connection closed for group <${group}>, code <${event.code}>` + `Azure Web PubSub server connection closed for group <${group}>, code <${event.code}>`, ); - } + }, ); azureWebPubsubServer.addEventListener( "onWsError", ({ group, error }) => { - logger.info(`WebSocket server connection error for group <${group}>`); + logger.info( + `Azure Web PubSub server connection error for group <${group}>`, + ); console.error(error); - } + }, ); azureWebPubsubServer.addEventListener( "onWsTokenRefresh", ({ group }) => { - logger.info(`WebSocket server token refresh for group <${group}>`); - } + logger.info(`Azure Web PubSub server token refresh for group <${group}>`); + }, ); logger.info("Module ready"); @@ -337,13 +341,13 @@ export const setupStoreRoomsCleanup = () => { const connections = await listGroupConnections(roomId); if (connections.length === 0) { logger.info( - `Performing cleanup of room <${roomId}>, has no active connections` + `Performing cleanup of room <${roomId}>, has no active connections`, ); await storeSyncHandler.destroyRoomInstance(roomId); logger.info(`Cleanup of room <${roomId}> successful`); } else { logger.info( - `Room <${roomId}> has active connections <${connections.length}>, skipping cleanup` + `Room <${roomId}> has active connections <${connections.length}>, skipping cleanup`, ); } } diff --git a/code/src/weave.d.ts b/code/src/weave.d.ts index 1282428a..cf8fe694 100644 --- a/code/src/weave.d.ts +++ b/code/src/weave.d.ts @@ -45,10 +45,6 @@ declare global { weave: Weave; weaveOnFieldFocus?: boolean; weaveTextEditing?: Record; - weaveDragImageURL?: string; - weaveDragImageId?: string; - weaveDragVideoParams?: WeaveVideoToolDragParams; - weaveDragVideoId?: string; colorTokenDragColor?: string; } } diff --git a/code/src/workloads/jobs/export-image/job.ts b/code/src/workloads/jobs/export-image/job.ts index 5be04298..6cc5ffb6 100644 --- a/code/src/workloads/jobs/export-image/job.ts +++ b/code/src/workloads/jobs/export-image/job.ts @@ -184,7 +184,7 @@ export class ExportImageJob { roomData: string; nodes: string[]; options: { - format: "image/png" | "image/jpeg"; + format: "image/png" | "image/jpeg" | "image/webp"; backgroundColor: string; padding: number; pixelRatio: number; diff --git a/code/src/workloads/jobs/export-image/types.ts b/code/src/workloads/jobs/export-image/types.ts index 2ea968ab..11b1f59b 100644 --- a/code/src/workloads/jobs/export-image/types.ts +++ b/code/src/workloads/jobs/export-image/types.ts @@ -11,7 +11,7 @@ export type ExportImageJobNew = { roomData: string; nodes: string[]; options: { - format: "image/png" | "image/jpeg"; + format: "image/png" | "image/jpeg" | "image/webp"; backgroundColor: string; padding: number; pixelRatio: number; @@ -30,7 +30,7 @@ export type ExportImageJobProcessing = { roomData: string; nodes: string[]; options: { - format: "image/png" | "image/jpeg"; + format: "image/png" | "image/jpeg" | "image/webp"; backgroundColor: string; padding: number; pixelRatio: number; @@ -49,7 +49,7 @@ export type ExportImageJobComplete = { roomData: string; nodes: string[]; options: { - format: "image/png" | "image/jpeg"; + format: "image/png" | "image/jpeg" | "image/webp"; backgroundColor: string; padding: number; pixelRatio: number; @@ -69,7 +69,7 @@ export type ExportImageJobFailed = { roomData: string; nodes: string[]; options: { - format: "image/png" | "image/jpeg"; + format: "image/png" | "image/jpeg" | "image/webp"; backgroundColor: string; padding: number; pixelRatio: number; @@ -88,7 +88,7 @@ export type ExportImageJobData = { roomData: string; nodes: string[]; options: { - format: "image/png" | "image/jpeg"; + format: "image/png" | "image/jpeg" | "image/webp"; backgroundColor: string; padding: number; pixelRatio: number; @@ -107,7 +107,7 @@ export type ExportImageJobWorkData = { roomData: string; nodes: string[]; options: { - format: "image/png" | "image/jpeg"; + format: "image/png" | "image/jpeg" | "image/webp"; backgroundColor: string; padding: number; pixelRatio: number; diff --git a/code/src/workloads/jobs/generate-images/job.ts b/code/src/workloads/jobs/generate-images/job.ts index 97baeab0..fe142be9 100644 --- a/code/src/workloads/jobs/generate-images/job.ts +++ b/code/src/workloads/jobs/generate-images/job.ts @@ -31,7 +31,7 @@ export class GenerateImagesJob { private persistenceHandler: ImagesPersistenceHandler; static async create( - tasksManagerInstance: pgBoss + tasksManagerInstance: pgBoss, ): Promise { this.createJobQueue(tasksManagerInstance); await tasksManagerInstance.purgeQueue(JOB_GENERATE_IMAGES_QUEUE_NAME); @@ -71,7 +71,7 @@ export class GenerateImagesJob { payload, imagesIds, }); - } + }, ); } @@ -103,7 +103,7 @@ export class GenerateImagesJob { const controller = new AbortController(); const timeout = setTimeout( () => controller.abort(), - config.azureCsClient.timeoutSecs * 1000 + config.azureCsClient.timeoutSecs * 1000, ); const response = await fetch( @@ -116,7 +116,7 @@ export class GenerateImagesJob { }, body: JSON.stringify(requestBody), signal: controller.signal, - } + }, ); clearTimeout(timeout); @@ -135,7 +135,7 @@ export class GenerateImagesJob { await this.persistenceHandler?.persist( fileName, { size: data.length, mimeType: "image/png" }, - data + data, ); } } catch (ex) { @@ -163,9 +163,11 @@ export class GenerateImagesJob { const controller = new AbortController(); const timeout = setTimeout( () => controller.abort(), - config.liteLLM.timeoutSecs * 1000 + config.liteLLM.timeoutSecs * 1000, ); + console.log("AQUI 1"); + const response = await fetch( `${config.liteLLM.endpoint}/litellm/v1/chat/completions`, { @@ -176,11 +178,13 @@ export class GenerateImagesJob { }, body: JSON.stringify(requestBody), signal: controller.signal, - } + }, ); clearTimeout(timeout); + console.log("AQUI 2", response.status, response.statusText); + if (!response.ok) { throw new Error("Error generating the images"); } @@ -197,7 +201,7 @@ export class GenerateImagesJob { await this.persistenceHandler?.persist( fileName, { size: data.length, mimeType }, - data + data, ); } } catch (ex) { @@ -285,7 +289,7 @@ export class GenerateImagesJob { clientId: string, roomId: string, userId: string, - parameters: GenerateImagesParameters + parameters: GenerateImagesParameters, ): Promise { const { sampleCount } = parameters; @@ -307,7 +311,7 @@ export class GenerateImagesJob { JOB_GENERATE_IMAGES_QUEUE_NAME, jobData, {}, - 1 + 1, ); if (!jobId) { @@ -373,7 +377,7 @@ export class GenerateImagesJob { }); this.logger.info( - `Generate images / created new job / ${jobId} / ${clientId}` + `Generate images / created new job / ${jobId} / ${clientId}`, ); } @@ -388,7 +392,7 @@ export class GenerateImagesJob { }, { status: "working", - } + }, ); } @@ -400,7 +404,7 @@ export class GenerateImagesJob { roomId, userId, status: "active", - } + }, ); broadcastToRoom(roomId, { @@ -410,7 +414,7 @@ export class GenerateImagesJob { }); this.logger.info( - `Generate images / job stated active / ${jobId} / ${clientId}` + `Generate images / job stated active / ${jobId} / ${clientId}`, ); } @@ -425,7 +429,7 @@ export class GenerateImagesJob { }, { status: "completed", - } + }, ); } @@ -435,7 +439,7 @@ export class GenerateImagesJob { }, { status: "completed", - } + }, ); broadcastToRoom(roomId, { @@ -445,7 +449,7 @@ export class GenerateImagesJob { }); this.logger.info( - `Generate images / job completed / ${jobId} / ${clientId})` + `Generate images / job completed / ${jobId} / ${clientId})`, ); } @@ -460,7 +464,7 @@ export class GenerateImagesJob { }, { status: "failed", - } + }, ); } @@ -470,7 +474,7 @@ export class GenerateImagesJob { }, { status: "failed", - } + }, ); broadcastToRoom(roomId, { @@ -480,7 +484,7 @@ export class GenerateImagesJob { }); this.logger.error( - `Generate images / job failed: / ${jobId} / ${clientId} / ${error}` + `Generate images / job failed: / ${jobId} / ${clientId} / ${error}`, ); } }