diff --git a/package-lock.json b/package-lock.json index d8cf9fde8..43c42a0a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,8 +45,6 @@ }, "examples/svelte-example/node_modules/react": { "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "dev": true, "license": "MIT", "engines": { @@ -55,8 +53,6 @@ }, "examples/svelte-example/node_modules/react-dom": { "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "dev": true, "license": "MIT", "dependencies": { @@ -143,41 +139,41 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.20.2.tgz", - "integrity": "sha512-IS8JSFsDD33haaKIIFaL7qj3bEIG9GldZfb3ILW0QF3at7TcrIJYy58hrDvFee5T3p3E2aH/+wqIr0eha8jB/w==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.24.0.tgz", + "integrity": "sha512-pNTIB5YqVVwu6UogvdX8TqsRZENaflqMMjdY7/XIPMNGrBoNH9tewINLI7+qc9tIaOLcAp3ZldqoEwAihZZ3ig==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2", - "@algolia/requester-browser-xhr": "5.20.2", - "@algolia/requester-fetch": "5.20.2", - "@algolia/requester-node-http": "5.20.2" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.20.2.tgz", - "integrity": "sha512-k0KxCfcX/HZySqPasKy6GkiiDuebaMh2v/nE0HHg1PbsyeyagLapDi6Ktjkxhz8NlUq6eTJR+ddGJegippKQtQ==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.24.0.tgz", + "integrity": "sha512-IF+r9RRQsIf0ylIBNFxo7c6hDxxuhIfIbffhBXEF1HD13rjhP5AVfiaea9RzbsAZoySkm318plDpH/nlGIjbRA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2", - "@algolia/requester-browser-xhr": "5.20.2", - "@algolia/requester-fetch": "5.20.2", - "@algolia/requester-node-http": "5.20.2" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.2.tgz", - "integrity": "sha512-xoZcL/Uu49KYDb3feu2n06gALD17p5CslO8Zk3mZ7+uTurK3lgjLws7LNetZ172Ap/GpzPCRXI83d2iDoYQD6Q==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.24.0.tgz", + "integrity": "sha512-p8K6tiXQTebRBxbrzWIfGCvfkT+Umml+2lzI92acZjHsvl6KYH6igOfVstKqXJRei9pvRzEEvVDNDLXDVleGTA==", "dev": true, "license": "MIT", "engines": { @@ -185,151 +181,151 @@ } }, "node_modules/@algolia/client-insights": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.20.2.tgz", - "integrity": "sha512-fy7aCbo9y7WHt/9G03EYc471Dd5kIaM8PNP4z6AEQYr9a9X8c4inwNs6tePxAEfRHwVQi0CZ7kuVdn6/MjWx1A==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.24.0.tgz", + "integrity": "sha512-jOHF0+tixR3IZJMhZPquFNdCVPzwzzXoiqVsbTvfKojeaY6ZXybgUiTSB8JNX+YpsUT8Ebhu3UvRy4mw2PbEzw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2", - "@algolia/requester-browser-xhr": "5.20.2", - "@algolia/requester-fetch": "5.20.2", - "@algolia/requester-node-http": "5.20.2" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.20.2.tgz", - "integrity": "sha512-ocL1ZXulfuXzJAwsKw2kMscKMD0rs/f4CFYu6Gjh4mK4um6rGfa1a6u1MSc4swFqRQer0wNP9Pi+kVfKhuKt5A==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.24.0.tgz", + "integrity": "sha512-Fx/Fp6d8UmDBHecTt0XYF8C9TAaA3qeCQortfGSZzWp4gVmtrUCFNZ1SUwb8ULREnO9DanVrM5hGE8R8C4zZTQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2", - "@algolia/requester-browser-xhr": "5.20.2", - "@algolia/requester-fetch": "5.20.2", - "@algolia/requester-node-http": "5.20.2" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.20.2.tgz", - "integrity": "sha512-Xjs4Tj1zkLCnmq1ys8RRhLQPy002I6GuT/nbHVdSQmQu4yKCI0gOFbwxHdM6yYPEuE3cJx7A4wSQjCH21mUKsg==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.24.0.tgz", + "integrity": "sha512-F8ypOedSMhz6W7zuT5O1SXXsdXSOVhY2U6GkRbYk/mzrhs3jWFR3uQIfeQVWmsJjUwIGZmPoAr9E+T/Zm2M4wA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2", - "@algolia/requester-browser-xhr": "5.20.2", - "@algolia/requester-fetch": "5.20.2", - "@algolia/requester-node-http": "5.20.2" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.20.2.tgz", - "integrity": "sha512-2cD3RGB5byusLS0DAX1Nvl5MLiv7OoGgQrRs+94dTalqjvK8lGKzxxJhXoVojgx2qcROyIUAIDXFdTqv6NIHaA==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.24.0.tgz", + "integrity": "sha512-k+nuciQuq7WERNNE+hsx3DX636zIy+9R4xdtvW3PANT2a2BDGOv3fv2mta8+QUMcVTVcGe/Mo3QCb4pc1HNoxA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2", - "@algolia/requester-browser-xhr": "5.20.2", - "@algolia/requester-fetch": "5.20.2", - "@algolia/requester-node-http": "5.20.2" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.20.2.tgz", - "integrity": "sha512-S593Kmhc98+5zdzGet4GrZEBEBGl4vVtqg/MPfW8dCRf9qDRNYSkhBsIzlhQe9JWiohe9oB9LW5meibwOgRmww==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.24.0.tgz", + "integrity": "sha512-/lqVxmrvwoA+OyVK4XLMdz/PJaCTW4qYchX1AZ+98fdnH3K6XM/kMydQLfP0bUNGBQbmVrF88MqhqZRnZEn/MA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2", - "@algolia/requester-browser-xhr": "5.20.2", - "@algolia/requester-fetch": "5.20.2", - "@algolia/requester-node-http": "5.20.2" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.20.2.tgz", - "integrity": "sha512-bW41aWLYgBv/coJUIT85mkN3kk1VBKsM8tlwB5S/s446Mgc7r8t5TX7kA8kCR2UbwDedOK51i/85/x/rM0ZXbg==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.24.0.tgz", + "integrity": "sha512-cRisDXQJhvfZCXL4hD22qca2CmW52TniOx6L7pvkaBDx0oQk1k9o+3w11fgfcCG+47OndMeNx5CMpu+K+COMzg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2", - "@algolia/requester-browser-xhr": "5.20.2", - "@algolia/requester-fetch": "5.20.2", - "@algolia/requester-node-http": "5.20.2" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.20.2.tgz", - "integrity": "sha512-wBMf3J1L5ogvU8p8ifHkknDXWn1zdZ2epkqpt2MkUaZynE3G77rrFU9frcO+Pu1FQJQ5xCDTKcYUUcJCDD00rg==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.24.0.tgz", + "integrity": "sha512-JTMz0JqN2gidvKa2QCF/rMe8LNtdHaght03px2cluZaZfBRYy8TgHgkCeBspKKvV/abWJwl7J0FzWThCshqT3w==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2", - "@algolia/requester-browser-xhr": "5.20.2", - "@algolia/requester-fetch": "5.20.2", - "@algolia/requester-node-http": "5.20.2" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.2.tgz", - "integrity": "sha512-w+VMzOkIq2XDGg6Ybzr74RlBZvJQnuIdKpVusQSXCXknvxwAwbO457LmoavhZWl06Lcsk9YDx1X2k0zb+iJQmw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.24.0.tgz", + "integrity": "sha512-B2Gc+iSxct1WSza5CF6AgfNgmLvVb61d5bqmIWUZixtJIhyAC6lSQZuF+nvt+lmKhQwuY2gYjGGClil8onQvKQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2" + "@algolia/client-common": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.2.tgz", - "integrity": "sha512-wpjnbvbi3A13b0DvijE45DRYDvwcP5Ttz7RTMkPWTkF1s6AHuo6O2UcwGyaogMAGa1QOOzFYfp5u4YQwMOQx5g==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.24.0.tgz", + "integrity": "sha512-6E5+hliqGc5w8ZbyTAQ+C3IGLZ/GiX623Jl2bgHA974RPyFWzVSj4rKqkboUAxQmrFY7Z02ybJWVZS5OhPQocA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2" + "@algolia/client-common": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.2.tgz", - "integrity": "sha512-YuSSdtgUt1dFBTNYUb+2TA5j0Hd0eDXE0bVISjUvTCqmoaGsGLwW+rKI7p1eLQ1r7RESwBAvUwcY1qP2Wl3Lyw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.24.0.tgz", + "integrity": "sha512-zM+nnqZpiQj20PyAh6uvgdSz+hD7Rj7UfAZwizqNP+bLvcbGXZwABERobuilkCQqyDBBH4uv0yqIcPRl8dSBEg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.20.2" + "@algolia/client-common": "5.24.0" }, "engines": { "node": ">= 14.0.0" @@ -356,38 +352,38 @@ "dev": true }, "node_modules/@asamuzakjp/css-color": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.3.tgz", - "integrity": "sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.7.tgz", + "integrity": "sha512-Ok5fYhtwdyJQmU1PpEv6Si7Y+A4cYb8yNM9oiIJC9TzXPMuN9fvdonKJqcnz9TbFqV6bQ8z0giRq0iaOpGZV2g==", "dev": true, "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.1.1", - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", + "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", "dev": true, "license": "MIT", "engines": { @@ -395,22 +391,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -436,14 +432,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", - "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -453,14 +449,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -497,29 +493,29 @@ "license": "ISC" }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -529,9 +525,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -539,9 +535,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -549,9 +545,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { @@ -559,9 +555,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -569,27 +565,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.27.1" }, "bin": { "parser": "bin/babel-parser.js" @@ -599,13 +595,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -615,13 +611,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -631,32 +627,32 @@ } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", - "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -675,23 +671,23 @@ } }, "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@csstools/color-helpers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", - "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", "dev": true, "funding": [ { @@ -709,9 +705,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", - "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz", + "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==", "dev": true, "funding": [ { @@ -733,9 +729,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", - "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz", + "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==", "dev": true, "funding": [ { @@ -749,8 +745,8 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.1.1" + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.3" }, "engines": { "node": ">=18" @@ -1320,9 +1316,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", "dependencies": { @@ -1540,9 +1536,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1564,9 +1560,9 @@ } }, "node_modules/@iconify-json/simple-icons": { - "version": "1.2.24", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.24.tgz", - "integrity": "sha512-06ZWXZx3PHCE+02zn+iIGOKKNgE3kyPd0Yh7IUEIa0bCYI6UmGlsYYghRx8As9TnTNYMCEiy5V0zI4Jb6EY6XA==", + "version": "1.2.34", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.34.tgz", + "integrity": "sha512-1FRWEA94hSl5zmBogRh6lQL36l7bVTfrl0n5+QJ+WmXmw70RccPT5phqeiSynwo3IhUWKoW2LiajyUMeweXW8g==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -1747,7 +1743,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -2002,9 +1997,9 @@ } }, "node_modules/@mapbox/node-pre-gyp/node_modules/abbrev": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", - "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2020,13 +2015,12 @@ } }, "node_modules/@mapbox/node-pre-gyp/node_modules/minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "license": "MIT", "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" + "minipass": "^7.1.2" }, "engines": { "node": ">= 18" @@ -2062,21 +2056,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@mapbox/node-pre-gyp/node_modules/tar": { "version": "7.4.3", "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", @@ -2104,9 +2083,9 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.0.tgz", - "integrity": "sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz", + "integrity": "sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3018,12 +2997,152 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "license": "MIT", "optional": true, "engines": { "node": ">=14" } }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.3.tgz", + "integrity": "sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz", + "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-virtual": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz", + "integrity": "sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.40.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", @@ -3031,7 +3150,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3045,7 +3163,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3059,7 +3176,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3073,7 +3189,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3087,7 +3202,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3101,7 +3215,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3115,7 +3228,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3129,7 +3241,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3143,7 +3254,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3157,7 +3267,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3171,7 +3280,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3185,7 +3293,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3199,7 +3306,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3213,7 +3319,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3227,7 +3332,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3241,7 +3345,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3255,7 +3358,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3269,7 +3371,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3283,7 +3384,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3297,7 +3397,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3305,89 +3404,89 @@ ] }, "node_modules/@shikijs/core": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.3.2.tgz", - "integrity": "sha512-s7vyL3LzUKm3Qwf36zRWlavX9BQMZTIq9B1almM63M5xBuSldnsTHCmsXzoF/Kyw4k7Xgas7yAyJz9VR/vcP1A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-javascript": "2.3.2", - "@shikijs/engine-oniguruma": "2.3.2", - "@shikijs/types": "2.3.2", - "@shikijs/vscode-textmate": "^10.0.1", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "node_modules/@shikijs/engine-javascript": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.3.2.tgz", - "integrity": "sha512-w3IEMu5HfL/OaJTsMbIfZ1HRPnWVYRANeDtmsdIIEgUOcLjzFJFQwlnkckGjKHekEzNqlMLbgB/twnfZ/EEAGg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "2.3.2", - "@shikijs/vscode-textmate": "^10.0.1", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^3.1.0" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.3.2.tgz", - "integrity": "sha512-vikMY1TroyZXUHIXbMnvY/mjtOxMn+tavcfAeQPgWS9FHcgFSUoEtywF5B5sOLb9NXb8P2vb7odkh3nj15/00A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "2.3.2", - "@shikijs/vscode-textmate": "^10.0.1" + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.3.2.tgz", - "integrity": "sha512-UqI6bSxFzhexIJficZLKeB1L2Sc3xoNiAV0yHpfbg5meck93du+EKQtsGbBv66Ki53XZPhnR/kYkOr85elIuFw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "2.3.2" + "@shikijs/types": "2.5.0" } }, "node_modules/@shikijs/themes": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.3.2.tgz", - "integrity": "sha512-QAh7D/hhfYKHibkG2tti8vxNt3ekAH5EqkXJeJbTh7FGvTCWEI7BHqNCtMdjFvZ0vav5nvUgdvA7/HI7pfsB4w==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "2.3.2" + "@shikijs/types": "2.5.0" } }, "node_modules/@shikijs/transformers": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.3.2.tgz", - "integrity": "sha512-2HDnJumw8A/9GecRpTgvfqSbPjEbJ4DPWq5J++OVP1gNMLvbV0MqFsP4canqRNM1LqB7VmWY45Stipb0ZIJ+0A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "2.3.2", - "@shikijs/types": "2.3.2" + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" } }, "node_modules/@shikijs/types": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.3.2.tgz", - "integrity": "sha512-CBaMY+a3pepyC4SETi7+bSzO0f6hxEQJUUuS4uD7zppzjmrN4ZRtBqxaT+wOan26CR9eeJ5iBhc4qvWEwn7Eeg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/vscode-textmate": "^10.0.1", + "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", - "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true, "license": "MIT" }, @@ -3529,9 +3628,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -3621,9 +3720,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -3642,9 +3741,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, "license": "MIT", "dependencies": { @@ -3685,6 +3784,18 @@ "@types/unist": "*" } }, + "node_modules/@types/jsdom": { + "version": "21.1.7", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", + "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -3741,12 +3852,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.17.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.19.tgz", - "integrity": "sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==", + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", + "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.21.0" } }, "node_modules/@types/normalize-package-data": { @@ -3756,6 +3868,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -3764,9 +3889,26 @@ "license": "MIT" }, "node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, "license": "MIT" }, @@ -3807,22 +3949,26 @@ "resolved": "packages/sql", "link": true }, + "node_modules/@uwdata/publish": { + "resolved": "packages/publish", + "link": true + }, "node_modules/@uwdata/vgplot": { "resolved": "packages/vgplot", "link": true }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", - "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", + "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.0", + "@babel/core": "^7.26.10", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" + "react-refresh": "^0.17.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -3832,9 +3978,9 @@ } }, "node_modules/@vitejs/plugin-vue": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", - "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", "dev": true, "license": "MIT", "engines": { @@ -3972,6 +4118,19 @@ "source-map-js": "^1.2.0" } }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/@vue/compiler-core/node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -4027,35 +4186,35 @@ } }, "node_modules/@vue/devtools-api": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.2.tgz", - "integrity": "sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.6.tgz", + "integrity": "sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-kit": "^7.7.2" + "@vue/devtools-kit": "^7.7.6" } }, "node_modules/@vue/devtools-kit": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz", - "integrity": "sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.6.tgz", + "integrity": "sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-shared": "^7.7.2", - "birpc": "^0.2.19", + "@vue/devtools-shared": "^7.7.6", + "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", - "superjson": "^2.2.1" + "superjson": "^2.2.2" } }, "node_modules/@vue/devtools-shared": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz", - "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.6.tgz", + "integrity": "sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==", "dev": true, "license": "MIT", "dependencies": { @@ -4118,15 +4277,15 @@ "license": "MIT" }, "node_modules/@vueuse/core": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.6.1.tgz", - "integrity": "sha512-FpgM1tXGAHsAC5n4Tflyg0vSoJUmdevfKaAhKFdxiK9BTIdHOHOiWmo+xivwdzjYFIvI8cEeJWYuqs646jOM2w==", + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "12.6.1", - "@vueuse/shared": "12.6.1", + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", "vue": "^3.5.13" }, "funding": { @@ -4134,14 +4293,14 @@ } }, "node_modules/@vueuse/integrations": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.6.1.tgz", - "integrity": "sha512-TsX9noygHqZGGoAcvvu+DoSGtbeuVl49V6gZZLgNxmKGeAxH2wQrlS3/7TM2wNczIkKV541bbOmhcQH6D+CM4Q==", + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", "dev": true, "license": "MIT", "dependencies": { - "@vueuse/core": "12.6.1", - "@vueuse/shared": "12.6.1", + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", "vue": "^3.5.13" }, "funding": { @@ -4201,9 +4360,9 @@ } }, "node_modules/@vueuse/metadata": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.6.1.tgz", - "integrity": "sha512-2094HNXGdsU3aqRbad0vmlRgGncMC4u2f6nFdW1mUn7b7ym4hORrDZfyeq8G5BfGvX4y0zZynWfCdtB2WwpyVw==", + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", "dev": true, "license": "MIT", "funding": { @@ -4211,9 +4370,9 @@ } }, "node_modules/@vueuse/shared": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.6.1.tgz", - "integrity": "sha512-ukTb2na19KT1/YVjj4CYBDOgiV/xmsSJRL6TcKeiz2db+P5bT3I0OJxy38eRR3WSN8CmSnt7MdVJ16vX6VZFxg==", + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", "dev": true, "license": "MIT", "dependencies": { @@ -4312,43 +4471,10 @@ "node": ">= 0.6" } }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", "bin": { @@ -4445,25 +4571,25 @@ } }, "node_modules/algoliasearch": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.20.2.tgz", - "integrity": "sha512-8evxG++iWyWnhng3g5RP+kwn6j+2vKLfew8pVoekn87FcfsDm92zJXKwSrU6pl+m5eAbGFhFF/gCYEQiRdbPlA==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.24.0.tgz", + "integrity": "sha512-CkaUygzZ91Xbw11s0CsHMawrK3tl+Ue57725HGRgRzKgt2Z4wvXVXRCtQfvzh8K7Tp4Zp7f1pyHAtMROtTJHxg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-abtesting": "5.20.2", - "@algolia/client-analytics": "5.20.2", - "@algolia/client-common": "5.20.2", - "@algolia/client-insights": "5.20.2", - "@algolia/client-personalization": "5.20.2", - "@algolia/client-query-suggestions": "5.20.2", - "@algolia/client-search": "5.20.2", - "@algolia/ingestion": "1.20.2", - "@algolia/monitoring": "1.20.2", - "@algolia/recommend": "5.20.2", - "@algolia/requester-browser-xhr": "5.20.2", - "@algolia/requester-fetch": "5.20.2", - "@algolia/requester-node-http": "5.20.2" + "@algolia/client-abtesting": "5.24.0", + "@algolia/client-analytics": "5.24.0", + "@algolia/client-common": "5.24.0", + "@algolia/client-insights": "5.24.0", + "@algolia/client-personalization": "5.24.0", + "@algolia/client-query-suggestions": "5.24.0", + "@algolia/client-search": "5.24.0", + "@algolia/ingestion": "1.24.0", + "@algolia/monitoring": "1.24.0", + "@algolia/recommend": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" @@ -4565,6 +4691,21 @@ "arrow2csv": "bin/arrow2csv.cjs" } }, + "node_modules/apache-arrow/node_modules/@types/node": { + "version": "20.17.46", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.46.tgz", + "integrity": "sha512-0PQHLhZPWOxGW4auogW0eOQAuNIlCYvibIpG67ja0TOJ6/sehu+1en7sfceUn+QQtx4Rk3GxbLNwPh0Cav7TWw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/apache-arrow/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -4673,9 +4814,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", - "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", "dev": true, "license": "MIT", "dependencies": { @@ -4764,9 +4905,9 @@ "license": "MIT" }, "node_modules/birpc": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", - "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.3.0.tgz", + "integrity": "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==", "dev": true, "license": "MIT", "funding": { @@ -4830,9 +4971,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "dev": true, "funding": [ { @@ -4850,10 +4991,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -5018,9 +5159,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001699", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", - "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", + "version": "1.0.30001717", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz", + "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==", "dev": true, "funding": [ { @@ -5038,6 +5179,15 @@ ], "license": "CC-BY-4.0" }, + "node_modules/cargo-cp-artifact": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/cargo-cp-artifact/-/cargo-cp-artifact-0.1.9.tgz", + "integrity": "sha512-6F+UYzTaGB+awsTXg0uSJA1/b/B3DDJzpKVRu0UmyI7DmNeaAl2RFHuTGIN6fEgpadRxoXGb7gbC1xo4C3IdyA==", + "license": "MIT", + "bin": { + "cargo-cp-artifact": "bin/cargo-cp-artifact.js" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -5449,6 +5599,12 @@ "dev": true, "license": "ISC" }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -5483,9 +5639,9 @@ } }, "node_modules/consola": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", - "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", "engines": { "node": "^14.18.0 || >=16.10.0" @@ -5804,13 +5960,13 @@ } }, "node_modules/cssstyle": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", - "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz", + "integrity": "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^2.8.2", + "@asamuzakjp/css-color": "^3.1.2", "rrweb-cssom": "^0.8.0" }, "engines": { @@ -6350,13 +6506,28 @@ "dev": true, "license": "MIT" }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "license": "MIT", - "peerDependencies": { + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "peerDependenciesMeta": { @@ -6386,7 +6557,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6478,9 +6648,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -6819,6 +6989,15 @@ "encoding": "^0.1.13" } }, + "node_modules/duckdb/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/duckdb/node_modules/node-gyp": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", @@ -6977,9 +7156,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.100", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz", - "integrity": "sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg==", + "version": "1.5.151", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.151.tgz", + "integrity": "sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==", "dev": true, "license": "ISC" }, @@ -7040,9 +7219,9 @@ } }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -7456,9 +7635,9 @@ "license": "MIT" }, "node_modules/eventsource": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz", - "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "dev": true, "license": "MIT", "dependencies": { @@ -7577,29 +7756,6 @@ "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -7911,9 +8067,9 @@ "license": "Apache-2.0" }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, @@ -7949,12 +8105,12 @@ } }, "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -7992,6 +8148,29 @@ "node": ">= 6" } }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", @@ -8110,7 +8289,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -8125,7 +8303,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8433,6 +8610,7 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -8466,6 +8644,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -8475,6 +8654,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -8619,7 +8799,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -8629,9 +8808,9 @@ } }, "node_modules/hast-util-to-html": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz", - "integrity": "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "dev": true, "license": "MIT", "dependencies": { @@ -8642,7 +8821,7 @@ "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" @@ -8711,9 +8890,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-errors": { @@ -9077,7 +9256,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -9153,6 +9331,12 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "license": "MIT" }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -9211,13 +9395,12 @@ "license": "MIT" }, "node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "license": "MIT", "dependencies": { - "@types/estree": "^1.0.6" + "@types/estree": "*" } }, "node_modules/is-ssh": { @@ -9325,6 +9508,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -10008,21 +10192,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/loupe": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", @@ -10034,13 +10203,13 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, "license": "ISC" }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -10086,6 +10255,16 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/make-fetch-happen/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -10487,9 +10666,9 @@ "license": "MIT" }, "node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "dev": true, "funding": [ { @@ -10518,9 +10697,9 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", "engines": { @@ -10528,13 +10707,13 @@ } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -10550,6 +10729,18 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -10710,9 +10901,9 @@ } }, "node_modules/minisearch": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.1.tgz", - "integrity": "sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz", + "integrity": "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==", "dev": true, "license": "MIT" }, @@ -10830,9 +11021,9 @@ "license": "ISC" }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -10856,9 +11047,10 @@ "license": "MIT" }, "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -10881,6 +11073,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", "funding": [ { "type": "github", @@ -11226,9 +11419,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", - "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", "dev": true, "license": "MIT" }, @@ -11357,7 +11550,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11415,9 +11607,9 @@ } }, "node_modules/oniguruma-to-es": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.0.tgz", - "integrity": "sha512-BJ3Jy22YlgejHSO7Fvmz1kKazlaPmRSUH+4adTDUS/dKQ4wLxI+gALZ8updbaux7/m7fIlpgOZ5fp/Inq5jUAw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11693,6 +11885,12 @@ "node": ">=6" } }, + "node_modules/parenthesis": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", + "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==", + "license": "MIT" + }, "node_modules/parse-conflict-json": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", @@ -11762,13 +11960,13 @@ } }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -11784,6 +11982,12 @@ "node": ">= 0.8" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -11816,13 +12020,13 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -12035,9 +12239,9 @@ } }, "node_modules/preact": { - "version": "10.25.4", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz", - "integrity": "sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==", + "version": "10.26.6", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.6.tgz", + "integrity": "sha512-5SRRBinwpwkaD+OqlBDeITlRgvd8I8QlxHJw9AxSdMNV6O+LodN9nUyYGpSF7sadHjs6RzeFShMexC6DbtWr9g==", "dev": true, "license": "MIT", "funding": { @@ -12163,9 +12367,9 @@ } }, "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "dev": true, "license": "MIT", "funding": { @@ -12291,49 +12495,6 @@ "node": ">= 0.8" } }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -12342,9 +12503,9 @@ "license": "MIT" }, "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", "engines": { @@ -12684,7 +12845,6 @@ "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", @@ -12816,9 +12976,9 @@ } }, "node_modules/rimraf/node_modules/glob": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", - "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", "dev": true, "license": "ISC", "dependencies": { @@ -12840,9 +13000,9 @@ } }, "node_modules/rimraf/node_modules/jackspeak": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.3.tgz", - "integrity": "sha512-oSwM7q8PTHQWuZAlp995iPpPJ4Vkl7qT0ZRD+9duL9j2oBy6KcTfyxc8mEuHJYC+z/kbps80aJLkaNzTOrf/kw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -12856,9 +13016,9 @@ } }, "node_modules/rimraf/node_modules/lru-cache": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", - "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", "dev": true, "license": "ISC", "engines": { @@ -12908,7 +13068,6 @@ "version": "4.40.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.7" @@ -13066,13 +13225,6 @@ "node": ">=v12.22.7" } }, - "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true, - "license": "MIT" - }, "node_modules/search-insights": { "version": "2.17.3", "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", @@ -13116,33 +13268,10 @@ "node": ">= 18" } }, - "node_modules/send/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/seroval": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.2.1.tgz", - "integrity": "sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.1.tgz", + "integrity": "sha512-F+T9EQPdLzgdewgxnBh4mSc+vde+EOkU6dC9BDuu/bfGb+UyUlqM6t8znFCTPQSuai/ZcfFg0gu79h+bVW2O0w==", "dev": true, "license": "MIT", "engines": { @@ -13150,9 +13279,9 @@ } }, "node_modules/seroval-plugins": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.2.1.tgz", - "integrity": "sha512-H5vs53+39+x4Udwp4J5rNZfgFuA+Lt+uU+09w1gYBVWomtAl98B+E9w7yC05Xc81/HgLvJdlyqJbU0fJCKCmdw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.3.1.tgz", + "integrity": "sha512-dOlUoiI3fgZbQIcj6By+l865pzeWdP3XCSLdI3xlKnjCk5983yLWPsXytFOUI0BUZKG9qwqbj78n9yVcVwUqaQ==", "dev": true, "license": "MIT", "engines": { @@ -13226,19 +13355,19 @@ } }, "node_modules/shiki": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.3.2.tgz", - "integrity": "sha512-UZhz/gsUz7DHFbQBOJP7eXqvKyYvMGramxQiSDc83M/7OkWm6OdVHAReEc3vMLh6L6TRhgL9dvhXz9XDkCDaaw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "2.3.2", - "@shikijs/engine-javascript": "2.3.2", - "@shikijs/engine-oniguruma": "2.3.2", - "@shikijs/langs": "2.3.2", - "@shikijs/themes": "2.3.2", - "@shikijs/types": "2.3.2", - "@shikijs/vscode-textmate": "^10.0.1", + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, @@ -13349,18 +13478,362 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/skia-canvas": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/skia-canvas/-/skia-canvas-2.0.2.tgz", + "integrity": "sha512-LUa7P41NRNoCWhvPyX4aKP5SpeWDXmWYbonCt4FfkEdTuSssxpvYiK5Y69B0MudDR6LVNt9RBwpZfuCRpVSbbw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "cargo-cp-artifact": "^0.1", + "glob": "^11.0.0", + "path-browserify": "^1.0.1", + "simple-get": "^4.0.1", + "string-split-by": "^1.0.0" + } + }, + "node_modules/skia-canvas/node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/skia-canvas/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, + "node_modules/skia-canvas/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/skia-canvas/node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/skia-canvas/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/skia-canvas/node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/skia-canvas/node_modules/glob": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/skia-canvas/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/skia-canvas/node_modules/jackspeak": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/skia-canvas/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/skia-canvas/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/skia-canvas/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/skia-canvas/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/skia-canvas/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/skia-canvas/node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/skia-canvas/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/skia-canvas/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/skia-canvas/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/skia-canvas/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/skia-canvas/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, "node_modules/slash": { "version": "3.0.0", @@ -13412,9 +13885,9 @@ } }, "node_modules/solid-js": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.5.tgz", - "integrity": "sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.6.tgz", + "integrity": "sha512-PoasAJvLk60hRtOTe9ulvALOdLjjqxuxcGZRolBQqxOnXrBXHGzqMT4ijNhGsDAYdOgEa8ZYaAE94PSldrFSkA==", "dev": true, "license": "MIT", "dependencies": { @@ -13478,7 +13951,14 @@ "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", @@ -13489,13 +13969,6 @@ "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, "node_modules/spdx-license-ids": { "version": "3.0.21", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", @@ -13588,6 +14061,15 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-split-by": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", + "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", + "license": "MIT", + "dependencies": { + "parenthesis": "^3.1.5" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -13750,7 +14232,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -13760,9 +14241,9 @@ } }, "node_modules/svelte": { - "version": "5.25.6", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.25.6.tgz", - "integrity": "sha512-RGkaeAXDuJdvhA1fdSM5GgD++vYfJYijZL0uN6kM2s/TRJ663jktBhZlF0qjzAJGR/34PtaeT3G8MKJY1EKeqg==", + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.28.2.tgz", + "integrity": "sha512-FbWBxgWOpQfhKvoGJv/TFwzqb4EhJbwCD17dB0tEpQiw1XyUEKZJtgm4nA4xq3LLsMo7hu5UY/BOFmroAxKTMg==", "dev": true, "license": "MIT", "dependencies": { @@ -13785,6 +14266,16 @@ "node": ">=18" } }, + "node_modules/svelte/node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -14056,22 +14547,22 @@ } }, "node_modules/tldts": { - "version": "6.1.77", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.77.tgz", - "integrity": "sha512-lBpoWgy+kYmuXWQ83+R7LlJCnsd9YW8DGpZSHhrMl4b8Ly/1vzOie3OdtmUJDkKxcgRGOehDu5btKkty+JEe+g==", + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.77" + "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.77", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.77.tgz", - "integrity": "sha512-bCaqm24FPk8OgBkM0u/SrEWJgHnhBWYqeBo6yUmcZJDCHt/IfyWBb+14CXdGi4RInMv4v7eUAin15W0DoA+Ytg==", + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", "dev": true, "license": "MIT" }, @@ -14139,9 +14630,9 @@ } }, "node_modules/tough-cookie": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.1.tgz", - "integrity": "sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14152,9 +14643,9 @@ } }, "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", "dependencies": { @@ -14196,19 +14687,19 @@ } }, "node_modules/ts-json-schema-generator": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-2.3.0.tgz", - "integrity": "sha512-t4lBQAwZc0sOJq9LJt3NgbznIcslVnm0JeEMFq8qIRklpMRY8jlYD0YmnRWbqBKANxkby91P1XanSSlSOFpUmg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-2.4.0.tgz", + "integrity": "sha512-HbmNsgs58CfdJq0gpteRTxPXG26zumezOs+SB9tgky6MpqiFgQwieCn2MW70+sxpHouZ/w9LW0V6L4ZQO4y1Ug==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.15", - "commander": "^12.0.0", - "glob": "^10.3.12", + "commander": "^13.1.0", + "glob": "^11.0.1", "json5": "^2.2.3", "normalize-path": "^3.0.0", - "safe-stable-stringify": "^2.4.3", - "tslib": "^2.6.2", - "typescript": "^5.4.5" + "safe-stable-stringify": "^2.5.0", + "tslib": "^2.8.1", + "typescript": "^5.8.2" }, "bin": { "ts-json-schema-generator": "bin/ts-json-schema-generator.js" @@ -14217,15 +14708,102 @@ "node": ">=18.0.0" } }, + "node_modules/ts-json-schema-generator/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/ts-json-schema-generator/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "license": "MIT", "engines": { "node": ">=18" } }, + "node_modules/ts-json-schema-generator/node_modules/glob": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ts-json-schema-generator/node_modules/jackspeak": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ts-json-schema-generator/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/ts-json-schema-generator/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ts-json-schema-generator/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -14313,29 +14891,6 @@ "node": ">= 0.6" } }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -14387,9 +14942,10 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, "license": "MIT" }, "node_modules/unique-filename": { @@ -14530,9 +15086,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -14601,17 +15157,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/validate-npm-package-name": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", @@ -15276,9 +15821,9 @@ } }, "node_modules/vitefu": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.5.tgz", - "integrity": "sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.6.tgz", + "integrity": "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==", "dev": true, "license": "MIT", "workspaces": [ @@ -15992,13 +16537,13 @@ } }, "node_modules/whatwg-url": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", - "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "license": "MIT", "dependencies": { - "tr46": "^5.0.0", + "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" }, "engines": { @@ -16432,6 +16977,27 @@ "d3": "^7.9.0" } }, + "packages/publish": { + "name": "@uwdata/publish", + "version": "1.0.0", + "dependencies": { + "@rollup/plugin-commonjs": "^28.0.3", + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-virtual": "^3.0.2", + "chalk": "^4.1.2", + "rollup": "^4.35.0", + "skia-canvas": "^2.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "mosaic-publish": "dist/cli.js" + }, + "devDependencies": { + "@types/jsdom": "^21.1.7", + "@types/yargs": "^17.0.33", + "typescript": "^5.6.3" + } + }, "packages/spec": { "name": "@uwdata/mosaic-spec", "version": "0.16.2", @@ -16476,8 +17042,6 @@ }, "packages/widget/node_modules/uuid": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" diff --git a/packages/core/src/Coordinator.js b/packages/core/src/Coordinator.js index 9bf51bb40..230977ea0 100644 --- a/packages/core/src/Coordinator.js +++ b/packages/core/src/Coordinator.js @@ -3,11 +3,13 @@ /** @import { QueryResult } from './util/query-result.js' */ /** @import { SelectionClause } from './util/selection-types.js' */ /** @import { MosaicClient } from './MosaicClient.js' */ +/** @import { ClauseSource } from './util/selection-types.js' */ /** @import { Selection } from './Selection.js' */ /** @import { Logger, QueryType } from './types.js' */ import { socketConnector } from './connectors/socket.js'; import { PreAggregator } from './preagg/PreAggregator.js'; import { voidLogger } from './util/void-logger.js'; +import { isClauseSource } from './util/is-clause-source.js'; import { QueryManager, Priority } from './QueryManager.js'; /** @@ -75,6 +77,7 @@ export class Coordinator { this.filterGroups = new Map; this.clients?.forEach(client => this.disconnect(client)); this.clients = new Set; + this.clauseSources = new Set; } if (cache) this.manager.cache().clear(); } @@ -222,6 +225,22 @@ export class Coordinator { : Promise.resolve(client.update()); } + /** + * Register a clause source with the coordinator. + * @param {ClauseSource} clauseSource The clause source to register. + */ + connectClauseSource(clauseSource) { + this.clauseSources.add(clauseSource); + } + + /** + * Deregister a clause source from the coordinator. + * @param {ClauseSource} clauseSource The clause source to deregister. + */ + disconnectClauseSource(clauseSource) { + this.clauseSources.delete(clauseSource); + } + /** * Connect a client to the coordinator. * @param {MosaicClient} client The Mosaic client to connect. @@ -244,6 +263,11 @@ export class Coordinator { // connect filter selection connectSelection(this, client.filterBy, client); + + // Connect this client as a clause source if necessary + if (isClauseSource(client)) { + this.connectClauseSource(client); + } } /** @@ -256,6 +280,11 @@ export class Coordinator { clients.delete(client); client.coordinator = null; + // Remove direct clause sources + if (isClauseSource(client)) { + this.disconnectClauseSource(client); + } + const group = filterGroups.get(client.filterBy); if (group) { group.clients.delete(client); diff --git a/packages/core/src/QueryManager.js b/packages/core/src/QueryManager.js index 54683a2fe..adbc975ec 100644 --- a/packages/core/src/QueryManager.js +++ b/packages/core/src/QueryManager.js @@ -115,8 +115,8 @@ export class QueryManager { /** * Get or set the current query cache. - * @param {Cache | boolean} [value] - * @returns {Cache} + * @param {Cache | boolean} [value] The cache instance or `true` to create an LRU cache. + * @returns {Cache} The cache instance. */ cache(value) { return value !== undefined diff --git a/packages/core/src/index.js b/packages/core/src/index.js index b5bfeee52..76d83ec8b 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -25,4 +25,4 @@ export { throttle } from './util/throttle.js'; export { toDataColumns } from './util/to-data-columns.js'; export { queryFieldInfo } from './util/field-info.js'; export { jsType } from './util/js-type.js'; -export { isActivatable } from './util/is-activatable.js'; +export { isClauseSource } from './util/is-clause-source.js'; diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index f81471a34..c7f5fdb79 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -53,23 +53,20 @@ export interface ColumnDescription { null: 'YES' | 'NO' } -/** - * Interface for components that perform selection activation. - */ -export interface Activatable { - /** - * Activate the selection that this component publishes to. - */ - activate(): void; -} - /** * Interface for cache implementations. */ export interface Cache { + /** Retrieves a value from the cache. */ get(key: string): any; + /** Stores a value in the cache and returns it. */ set(key: string, value: any): any; + /** Clears all entries in the cache. */ clear(): void; + /** Exports the cache as a Map where keys are strings and values are Arrow IPC binary format (Uint8Array), or null if the cache is empty. */ + export(): Map | null; + /** Imports the cache from a Map where keys are strings and values are Arrow IPC binary format (Uint8Array). */ + import(data: Map): void; } /** diff --git a/packages/core/src/util/cache.js b/packages/core/src/util/cache.js index 5b9d4f2c6..c25c1c0a0 100644 --- a/packages/core/src/util/cache.js +++ b/packages/core/src/util/cache.js @@ -1,4 +1,6 @@ /** @import { Cache } from '../types.js' */ +import { tableToIPC } from "@uwdata/flechette"; +import { decodeIPC } from "./decode-ipc.js"; const requestIdle = typeof requestIdleCallback !== 'undefined' ? requestIdleCallback @@ -6,26 +8,28 @@ const requestIdle = typeof requestIdleCallback !== 'undefined' /** * Create a new cache that ignores all values. - * @returns {Cache} + * @returns {Cache} A void cache that doesn't store or retrieve values. */ export function voidCache() { return { get: () => undefined, set: (key, value) => value, - clear: () => {} + clear: () => {}, + export: () => null, + import: () => {} }; } /** * Create a new cache that uses an LRU eviction policy. * @param {object} [options] Cache options. - * @param {number} [options.max] Maximum number of cache entries. - * @param {number} [options.ttl] Time-to-live for cache entries. - * @returns {Cache} + * @param {number} [options.max=1000] Maximum number of cache entries. + * @param {number} [options.ttl=10800000] Time-to-live for cache entries in ms (default: 3 hours). + * @returns {Cache} An LRU cache instance. */ export function lruCache({ - max = 1000, // max entries - ttl = 3 * 60 * 60 * 1000 // time-to-live, default 3 hours + max = 1000, + ttl = 3 * 60 * 60 * 1000 } = {}) { let cache = new Map; @@ -55,19 +59,31 @@ export function lruCache({ } } + function get(key) { + const entry = cache.get(key); + if (entry) { + entry.last = performance.now(); + return entry.value; + } + } + + function set(key, value) { + cache.set(key, { last: performance.now(), value }); + if (cache.size > max) requestIdle(evict); + return value; + } + return { - get(key) { - const entry = cache.get(key); - if (entry) { - entry.last = performance.now(); - return entry.value; - } - }, - set(key, value) { - cache.set(key, { last: performance.now(), value }); - if (cache.size > max) requestIdle(evict); - return value; + get, + set, + clear() { cache = new Map; }, + export() { + return new Map(Array.from(cache).map(([key, entry]) => [key, tableToIPC(entry.value, {})])); }, - clear() { cache = new Map; } + import(data) { + for (const [key, entry] of data) { + set(key, decodeIPC(entry)); + } + } }; } diff --git a/packages/core/src/util/is-activatable.js b/packages/core/src/util/is-activatable.js deleted file mode 100644 index 631791ece..000000000 --- a/packages/core/src/util/is-activatable.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Test if a value implements the Activatable interface. - * @param {*} value The value to test. - * @returns {value is import('../types.js').Activatable} - */ -export function isActivatable(value) { - return typeof value?.activate === 'function' && value.activate.length === 0; -} diff --git a/packages/core/src/util/is-clause-source.js b/packages/core/src/util/is-clause-source.js new file mode 100644 index 000000000..46ae604c1 --- /dev/null +++ b/packages/core/src/util/is-clause-source.js @@ -0,0 +1,12 @@ +/** + * Test if a value implements the ClauseSource interface. + * @param {*} value The value to test. + * @returns {value is import('./selection-types.js').ClauseSource} + */ +export function isClauseSource(value) { + return typeof value?.activate === 'function' && // Activate exists + value.activate.length === 0 && // No arguments + typeof value?.reset === 'function' && // Reset exists + value.reset.length === 0 && // No arguments + typeof value?.clause === 'function'; // Clause exists +} diff --git a/packages/core/src/util/selection-types.ts b/packages/core/src/util/selection-types.ts index d2caf9ea9..a11abe122 100644 --- a/packages/core/src/util/selection-types.ts +++ b/packages/core/src/util/selection-types.ts @@ -135,3 +135,29 @@ export interface SelectionClause { */ meta?: ClauseMetadata; } + +/** + * Interface for components that perform selection activation. + */ +export interface ClauseSource { + /** + * Activate the selection that this component publishes to. + * Optionally, no-op + */ + activate: () => void; + + /** + * Reset this component and respective selection(s) removing all published clauses. + * Optionally, no-op + */ + reset: () => void; + + + /** + * Get the selection clause that this component publishes. + * Note: this function **must** be callable with no arguments + * + * @param {...unknown} args - Any number of arguments that may be needed to construct the clause. + */ + clause: (...args: unknown[]) => SelectionClause; +} \ No newline at end of file diff --git a/packages/inputs/src/Menu.js b/packages/inputs/src/Menu.js index bb7005a13..9d74248e5 100644 --- a/packages/inputs/src/Menu.js +++ b/packages/inputs/src/Menu.js @@ -149,22 +149,25 @@ export class Menu extends Input { } } + clause(value) { + return clausePoint(this.field, value ?? 0, { source: this }); + } + reset() { this.select.selectedIndex = this.from ? 0 : -1; } activate() { if (isSelection(this.selection)) { - this.selection.activate(clausePoint(this.field, 0, { source: this })); + this.selection.activate(this.clause()); } } publish(value) { - const { selection, field } = this; + const { selection } = this; if (isSelection(selection)) { if (value === '') value = undefined; // 'All' option - const clause = clausePoint(field, value, { source: this }); - selection.update(clause); + selection.update(this.clause(value)); } else if (isParam(selection)) { selection.update(value); } diff --git a/packages/inputs/src/Slider.js b/packages/inputs/src/Slider.js index e23910e31..306e335d2 100644 --- a/packages/inputs/src/Slider.js +++ b/packages/inputs/src/Slider.js @@ -196,6 +196,8 @@ export class Slider extends Input { } } + reset() { /* No-op */ } + activate() { if (isSelection(this.selection)) { this.selection.activate(this.clause(0)); diff --git a/packages/inputs/src/Table.js b/packages/inputs/src/Table.js index 469942226..655f532e6 100644 --- a/packages/inputs/src/Table.js +++ b/packages/inputs/src/Table.js @@ -275,6 +275,10 @@ export class Table extends Input { } } + reset() { + this.currentRow = -1; + } + sort(event, column) { if (column === this.sortColumn) { this.sortDesc = !this.sortDesc; diff --git a/packages/inputs/src/input.js b/packages/inputs/src/input.js index d61e86568..1917db992 100644 --- a/packages/inputs/src/input.js +++ b/packages/inputs/src/input.js @@ -16,8 +16,8 @@ export function input(InputClass, ...params) { /** * Base class for input components. - * @import {Activatable} from '@uwdata/mosaic-core' - * @implements {Activatable} + * @import {ClauseSource} from '@uwdata/mosaic-core' + * @implements {ClauseSource} */ export class Input extends MosaicClient { /** @@ -37,4 +37,13 @@ export class Input extends MosaicClient { activate() { // subclasses should override } + + reset() { + // subclasses should override + } + + clause() { + // subclasses should override + return null; + } } diff --git a/packages/inputs/tsconfig.json b/packages/inputs/tsconfig.json index d6eaae601..efe21b3cd 100644 --- a/packages/inputs/tsconfig.json +++ b/packages/inputs/tsconfig.json @@ -6,6 +6,7 @@ "emitDeclarationOnly": true, "outDir": "dist/types", "module": "node16", - "skipLibCheck": true + "skipLibCheck": true, + "strictFunctionTypes": true } } \ No newline at end of file diff --git a/packages/plot/src/interactors/Interval1D.js b/packages/plot/src/interactors/Interval1D.js index 50825feb7..44730b37e 100644 --- a/packages/plot/src/interactors/Interval1D.js +++ b/packages/plot/src/interactors/Interval1D.js @@ -7,8 +7,8 @@ import { invert } from './util/invert.js'; import { sanitizeStyles } from './util/sanitize-styles.js'; /** - * @import {Activatable} from '@uwdata/mosaic-core' - * @implements {Activatable} + * @import {ClauseSource} from '@uwdata/mosaic-core' + * @implements {ClauseSource} */ export class Interval1D { constructor(mark, { @@ -28,6 +28,9 @@ export class Interval1D { this.style = style && sanitizeStyles(style); this.brush = channel === 'y' ? brushY() : brushX(); this.brush.on('brush end', ({ selection }) => this.publish(selection)); + + // Register with coordinator + mark.coordinator?.connectClauseSource(this); } reset() { @@ -36,7 +39,7 @@ export class Interval1D { } activate() { - this.selection.activate(this.clause(this.value || [0, 1])); + this.selection.activate(this.clause()); } publish(extent) { @@ -55,7 +58,9 @@ export class Interval1D { clause(value) { const { mark, pixelSize, field, scale } = this; - return clauseInterval(field, value, { + const clauseValue = value || this.value || [0, 1]; + + return clauseInterval(field, clauseValue, { source: this, clients: this.peers ? mark.plot.markSet : new Set().add(mark), scale, diff --git a/packages/plot/src/interactors/Interval2D.js b/packages/plot/src/interactors/Interval2D.js index 3b6a630ed..572a3d4e4 100644 --- a/packages/plot/src/interactors/Interval2D.js +++ b/packages/plot/src/interactors/Interval2D.js @@ -7,8 +7,8 @@ import { invert } from './util/invert.js'; import { sanitizeStyles } from './util/sanitize-styles.js'; /** - * @import {Activatable} from '@uwdata/mosaic-core' - * @implements {Activatable} + * @import {ClauseSource} from '@uwdata/mosaic-core' + * @implements {ClauseSource} */ export class Interval2D { constructor(mark, { @@ -28,6 +28,9 @@ export class Interval2D { this.style = style && sanitizeStyles(style); this.brush = brush(); this.brush.on('brush end', ({ selection }) => this.publish(selection)); + + // Register with coordinator + mark.coordinator?.connectClauseSource(this); } reset() { @@ -36,7 +39,7 @@ export class Interval2D { } activate() { - this.selection.activate(this.clause(this.value || [[0, 1], [0, 1]])); + this.selection.activate(this.clause()); } publish(extent) { @@ -59,7 +62,9 @@ export class Interval2D { clause(value) { const { mark, pixelSize, xfield, yfield, xscale, yscale } = this; - return clauseIntervals([xfield, yfield], value, { + const clauseValue = value || this.value || [[0, 1], [0, 1]]; + + return clauseIntervals([xfield, yfield], clauseValue, { source: this, clients: this.peers ? mark.plot.markSet : new Set().add(mark), scales: [xscale, yscale], @@ -71,6 +76,7 @@ export class Interval2D { const { brush, style, value } = this; const xscale = this.xscale = svg.scale('x'); const yscale = this.yscale = svg.scale('y'); + const rx = xscale.range; const ry = yscale.range; brush.extent([[min(rx), min(ry)], [max(rx), max(ry)]]); diff --git a/packages/plot/src/interactors/Nearest.js b/packages/plot/src/interactors/Nearest.js index fe6fcceb7..8add9ffc6 100644 --- a/packages/plot/src/interactors/Nearest.js +++ b/packages/plot/src/interactors/Nearest.js @@ -3,8 +3,8 @@ import { select, pointer, min } from 'd3'; import { getField } from './util/get-field.js'; /** - * @import {Activatable} from '@uwdata/mosaic-core' - * @implements {Activatable} + * @import {ClauseSource} from '@uwdata/mosaic-core' + * @implements {ClauseSource} */ export class Nearest { constructor(mark, { @@ -24,16 +24,21 @@ export class Nearest { this.fields = fields || this.channels.map(c => getField(mark, [c])); this.maxRadius = maxRadius; this.valueIndex = -1; + + // Register with coordinator + mark.coordinator?.connectClauseSource(this); } clause(value) { const { clients, fields } = this; const opt = { source: this, clients }; + const clauseValue = value || this.channels.map(() => 0); + // if only one field, use a simpler clause that passes the value // this allows a single field selection value to act like a param return fields.length > 1 - ? clausePoints(fields, value ? [value] : value, opt) - : clausePoint(fields[0], value?.[0], opt); + ? clausePoints(fields, clauseValue ? [clauseValue] : clauseValue, opt) + : clausePoint(fields[0], clauseValue?.[0], opt); } init(svg) { @@ -80,8 +85,11 @@ export class Nearest { } activate() { - const v = this.channels.map(() => 0); - this.selection.activate(this.clause(v)); + this.selection.activate(this.clause()); + } + + reset() { + this.valueIndex = -1; } } diff --git a/packages/plot/src/interactors/PanZoom.js b/packages/plot/src/interactors/PanZoom.js index 552ee8437..8fd9e561d 100644 --- a/packages/plot/src/interactors/PanZoom.js +++ b/packages/plot/src/interactors/PanZoom.js @@ -5,8 +5,8 @@ import { getField } from './util/get-field.js'; const asc = (a, b) => a - b; /** - * @import {Activatable} from '@uwdata/mosaic-core' - * @implements {Activatable} + * @import {ClauseSource} from '@uwdata/mosaic-core' + * @implements {ClauseSource} */ export class PanZoom { constructor(mark, { @@ -38,6 +38,9 @@ export class PanZoom { if (plot.setAttribute('yDomain', value)) plot.update(); }); } + + // Register with coordinator + mark.coordinator?.connectClauseSource(this); } publish(transform) { @@ -52,6 +55,10 @@ export class PanZoom { } clause(value, field, scale) { + if (value == null || field == null) { + throw new Error('PanZoom clause requires value and field parameters'); + } + return clauseInterval(field, value, { source: this, clients: this.mark.plot.markSet, @@ -105,6 +112,8 @@ export class PanZoom { this.ysel.activate(this.clause(yscale.domain, yfield, yscale)); } } + + reset() { /* No-op */ } } function extent(ext, defaultTrue, defaultFalse) { diff --git a/packages/plot/src/interactors/Region.js b/packages/plot/src/interactors/Region.js index 8a616682f..f0c26e5f3 100644 --- a/packages/plot/src/interactors/Region.js +++ b/packages/plot/src/interactors/Region.js @@ -9,8 +9,8 @@ import { neqSome } from './util/neq.js'; import { getDatum } from './util/get-datum.js'; /** - * @import {Activatable} from '@uwdata/mosaic-core' - * @implements {Activatable} + * @import {ClauseSource} from '@uwdata/mosaic-core' + * @implements {ClauseSource} */ export class Region { constructor(mark, { @@ -36,6 +36,9 @@ export class Region { const { fields, as } = getFields(mark, channels); this.fields = fields; this.as = as; + + // Register with coordinator + mark.coordinator?.connectClauseSource(this); } reset() { @@ -45,12 +48,14 @@ export class Region { } activate() { - this.selection.activate(this.clause([this.fields.map(() => 0)])); + this.selection.activate(this.clause()); } clause(value) { const { fields, mark } = this; - return clausePoints(fields, value, { + const clauseValue = value || [fields.map(() => 0)]; + + return clausePoints(fields, clauseValue, { source: this, clients: this.peers ? mark.plot.markSet : new Set().add(mark) }); diff --git a/packages/plot/src/interactors/Toggle.js b/packages/plot/src/interactors/Toggle.js index 0f8d60bd3..73ce5b10d 100644 --- a/packages/plot/src/interactors/Toggle.js +++ b/packages/plot/src/interactors/Toggle.js @@ -3,8 +3,8 @@ import { getDatum } from './util/get-datum.js'; import { neq, neqSome } from './util/neq.js'; /** - * @import {Activatable} from '@uwdata/mosaic-core' - * @implements {Activatable} + * @import {ClauseSource} from '@uwdata/mosaic-core' + * @implements {ClauseSource} */ export class Toggle { /** @@ -37,11 +37,16 @@ export class Toggle { } throw new Error(`Missing channel: ${c}`); }); + + // Register with coordinator + mark.coordinator?.connectClauseSource(this); } clause(value) { const { fields, mark } = this; - return clausePoints(fields, value, { + const clauseValue = value || [fields.map(() => 0)]; + + return clausePoints(fields, clauseValue, { source: this, clients: this.peers ? mark.plot.markSet : new Set().add(mark) }); @@ -84,7 +89,11 @@ export class Toggle { } activate() { - this.selection.activate(this.clause([this.fields.map(() => 0)])); + this.selection.activate(this.clause()); + } + + reset() { + this.value = null; } } diff --git a/packages/publish/README.md b/packages/publish/README.md new file mode 100644 index 000000000..dfc7fb472 --- /dev/null +++ b/packages/publish/README.md @@ -0,0 +1,57 @@ +# mosaic-publish +> ⚠️ **EXPERIMENTAL PACKAGE** ⚠️ - This package is in a development state and things may change without notice. Use with caution in production environments. + +A CLI tool and API for compiling and performing publish time optimizations to Mosaic specifications. The tool processes spec files, incrementally applying data preparation and projection, pre-computation of data assets for optimization, and pre-rendering of visual outputs. + +## Package Structure + +- **`src/MosaicPublisher.ts`** - Core publisher class that handles spec compilation and optimization +- **`src/cli.ts`** - Command-line interface implementation using yargs +- **`src/util/`** - Utility modules including constants, logging, and helper functions +- **`test/`** - Test files for both API and CLI functionality + +## CLI Installation + +This tool is designed to be used via `npx` or can be installed globally. + +### Run with `npx` + +```bash +npx @uwdata/publish ./path/to/spec.yaml -o most +``` + +### Global Installation + +To install the CLI tool globally: + +```bash +npm install -g @uwdata/publish +``` + +Now you can run the tool from anywhere: + +```bash +mosaic-publish ./path/to/spec.yaml -o most +``` + +## API Usage + +The functionality of mosaic-publish can also be accessed programmatically via its API. For example: + +```js +import { MosaicPublisher } from '@uwdata/publish'; +import fs from 'fs'; + +const publisher = new MosaicPublisher({ + spec: fs.readFileSync('./path/to/spec.yaml', 'utf8'), + outputPath: './path/to/output/directory' +}); + +publisher.publish() + .then(() => { + console.log('Specification compiled and optimized successfully.'); + }) + .catch(err => { + console.error('Error during publish:', err); + }); +``` \ No newline at end of file diff --git a/packages/publish/package.json b/packages/publish/package.json new file mode 100644 index 000000000..41993a169 --- /dev/null +++ b/packages/publish/package.json @@ -0,0 +1,33 @@ +{ + "name": "@uwdata/publish", + "version": "1.0.0", + "description": "CLI tool for spec optimization", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "bin": { + "mosaic-publish": "./dist/cli.js" + }, + "scripts": { + "build": "tsc", + "start": "node dist/index.js", + "test": "npm run build && vitest run" + }, + "dependencies": { + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-virtual": "^3.0.2", + "@rollup/plugin-commonjs": "^28.0.3", + "chalk": "^4.1.2", + "rollup": "^4.35.0", + "skia-canvas": "^2.0.2", + "yargs": "^17.7.2" + }, + "devDependencies": { + "@types/jsdom": "^21.1.7", + "@types/yargs": "^17.0.33", + "typescript": "^5.6.3" + }, + "files": [ + "dist" + ], + "type": "module" +} diff --git a/packages/publish/src/MosaicPublisher.ts b/packages/publish/src/MosaicPublisher.ts new file mode 100644 index 000000000..48ea04154 --- /dev/null +++ b/packages/publish/src/MosaicPublisher.ts @@ -0,0 +1,441 @@ +import yaml from "yaml"; +import fs from 'fs'; +import { JSDOM } from 'jsdom'; +import path from "path"; +import { rollup } from "rollup"; +import virtual from "@rollup/plugin-virtual"; +import resolve from "@rollup/plugin-node-resolve"; +import commonjs from "@rollup/plugin-commonjs"; + + +// Mosaic modules +import { + parseSpec, astToESM, astToDOM, + SpecNode, DataNode, FileDataNode, + ParquetDataNode, OptionsNode, + CodegenContext, +} from '@uwdata/mosaic-spec'; +import { MosaicClient, isClauseSource } from '@uwdata/mosaic-core'; + +// Utility imports +import { + preamble, PreambleOptions, htmlTemplate, templateCSS, + publishConnector, PublishContext, mockCanvas, + VGPLOT, FLECHETTE, + LogLevel, Logger, + clientsReady, + OPTIMIZATION_LEVEL_TO_OPTIMIZATIONS, Optimizations, +} from './util/index.js'; +import { binary, map, tableFromArrays, tableToIPC, utf8 } from "@uwdata/flechette"; + +/** + * Enum for publish exit codes. + */ +export enum PublishExitCode { + SUCCESS = 0, + FILE_READ_ERROR = 1, + SPEC_PARSE_ERROR = 2, + PUBLISH_ERROR = 3, + OUTPUT_DIR_ERROR = 4, + FILE_WRITE_ERROR = 5, + BUNDLE_ERROR = 6, + UNKNOWN_ERROR = 10 +} + +/** + * Error class for known publishing errors, with exit code. + * @param message Error message. + * @param code Exit code. + */ +export class PublishError extends Error { + code: PublishExitCode; + constructor(message: string, code: PublishExitCode = PublishExitCode.PUBLISH_ERROR) { + super(message); + this.name = 'PublishError'; + this.code = code; + } +} + +export type MosaicPublisherOptions = { + spec: string; + outputPath?: string; + title?: string; + optimize?: 'none' | 'minimal' | 'more' | 'most'; + logger?: Logger; + customScript?: string; + overwrite?: boolean; +}; + +/** + * Class to facilitate publishing a Mosaic specification. + * @param options Options for configuring the MosaicPublisher instance. + * @param options.spec Contents of JSON Mosaic specification file. + * @param options.outputPath Path to the desired output directory. + * @param options.title Optional title for the HTML file. + * @param options.optimize Level of optimization for published visualization. + * @param options.logger Optional logger instance to use for logging. + * @param options.customScript Optional custom script to include in the output. + * @param options.overwrite Whether to overwrite the output directory if it exists. + * + * The `publish` method is the main entry point for the class + */ +export class MosaicPublisher { + private spec: string; + private outputPath: string; + private title: string; + private optimizations: Optimizations[]; + private logger: Logger; + private customScript: string = ''; + private overwrite: boolean; + + // Internal references used throughout + private ctx: PublishContext; + private ast?: SpecNode; + private data?: Record; + private db: ReturnType; + + constructor({ + spec, + outputPath = 'out', + title = 'Mosaic Visualization', + optimize = 'minimal', + logger = new Logger(LogLevel.INFO), + customScript = '', + overwrite = false + }: MosaicPublisherOptions) { + this.spec = spec; + this.outputPath = outputPath; + this.title = title; + this.optimizations = OPTIMIZATION_LEVEL_TO_OPTIMIZATIONS[optimize]; + this.logger = logger; + this.customScript = customScript; + this.overwrite = overwrite; + + // Create PublishContext + this.db = publishConnector(); + this.ctx = new PublishContext(this.db); + } + + /** + * Main entry point for publishing a Mosaic specification. + * @param returnData If true, return generated HTML/JS as an object instead of writing files. + */ + public async publish(returnData?: boolean): Promise { + this.logger.info('Parsing and processing spec...'); + + // Parse specification + try { + this.ast = parseSpec(yaml.parse(this.spec)); + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to parse specification: ${err}`, PublishExitCode.SPEC_PARSE_ERROR); + } + if (!this.ast) return; + this.data = this.ast.data; + + // Setup jsdom + try { + const dom = new JSDOM( + ``, + { pretendToBeVisual: true } + ); + globalThis.window = dom.window as any; + globalThis.document = dom.window.document; + globalThis.navigator ??= dom.window.navigator; + globalThis.requestAnimationFrame = window.requestAnimationFrame; + mockCanvas(globalThis.window); + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to initialize DOM: ${err}`, PublishExitCode.PUBLISH_ERROR); + } + + // Load the visualization in the DOM and gather interactors/inputs + let element; + try { + const domResult = await astToDOM(this.ast, { api: this.ctx.api }); + element = domResult.element; + document.body.appendChild(element); + await clientsReady(this.ctx); + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to process spec DOM: ${err}`, PublishExitCode.PUBLISH_ERROR); + } + + const clauseSources = this.ctx.coordinator.clauseSources; + if (!clauseSources) throw new PublishError( + 'No clause sources on coordinator. This should never happen.', + PublishExitCode.PUBLISH_ERROR + ); + const isInteractive = clauseSources.size !== 0; + const needsJS = isInteractive || !this.optimizations.includes(Optimizations.PRERENDER); + + // If spec is valid create relevant output directory + try { + if (fs.existsSync(this.outputPath)) { + if (!this.overwrite) { + throw new PublishError( + `Output directory '${this.outputPath}' already exists. Use --overwrite to allow replacing it\n\tNOTE: This will delete all existing files in the directory.`, + PublishExitCode.OUTPUT_DIR_ERROR + ); + } + this.logger.warn(`Clearing output directory: ${this.outputPath}`); + fs.rmSync(this.outputPath, { recursive: true }); + fs.mkdirSync(this.outputPath, { recursive: true }); + } else { + this.logger.info(`Creating output directory: ${this.outputPath}`); + fs.mkdirSync(this.outputPath, { recursive: true }); + } + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to create or clear output directory: ${err}`, PublishExitCode.OUTPUT_DIR_ERROR); + } + + let postLoad; + if (needsJS) { + // Activate interactors and inputs + if (isInteractive) await this.activateClauseSources(clauseSources); + + // Modify AST and process data (extensions, data definitions, etc.) + const og = FileDataNode.prototype.codegenQuery; + FileDataNode.prototype.codegenQuery = function (ctx: CodegenContext) { + const code = og.call(this, ctx); + const { file } = this; + return code?.replace(`"${file}"`, `window.location.origin + "/${file}"`); + }; + + const tables = this.db.tables(); + postLoad = await this.updateDataNodes(tables); + // Export relevant data from DuckDB to Parquet + try { + await this.exportDataFromDuckDB(tables); + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to export data from DuckDB: ${err}`, PublishExitCode.FILE_WRITE_ERROR); + } + } + + let result; + try { + result = await this.writeFiles( + needsJS, + this.optimizations.includes(Optimizations.PRERENDER) ? element : undefined, + postLoad, + returnData + ); + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to write output files: ${err}`, PublishExitCode.FILE_WRITE_ERROR); + } + if (returnData) return result; + } + + /** + * Activate the Interactors and Inputs, waiting + * for queries to finish. + */ + private async activateClauseSources(clauseSources: Set) { + for (const cs of clauseSources) { + if (isClauseSource(cs)) cs.activate(); + await this.waitForQueryToFinish(); + } + } + + private async waitForQueryToFinish() { + while (this.ctx.coordinator.manager.pendingExec) { + await new Promise(resolve => setTimeout(resolve, 100)); + } + } + + /** + * Process data definitions (DataNodes) and converts them to ParquetDataNode + * objects based on specified tables. + */ + private async updateDataNodes(tables: Record | null>): Promise { + // process data definitions + for (const node of Object.values(this.data!)) { + if (!(node.name in tables)) { + delete this.ast!.data[node.name]; + continue; + } + const name = node.name; + const file = `data/${name}.parquet`; + this.ast!.data[name] = new ParquetDataNode(name, file, new OptionsNode({})); + } + + // process tables from DuckDB + const db_tables = await this.ctx.coordinator.query('SHOW ALL TABLES', { cache: false, type: 'json' }); + this.logger.debug(`DB Tables: ${JSON.stringify(db_tables, null, 2)}`); + if (this.optimizations.includes(Optimizations.PREAGREGATE) + && db_tables.some((table: any) => table.name.startsWith('preagg_'))) { + let postLoad = "getVgInstance().coordinator().exec([\n\t'CREATE SCHEMA IF NOT EXISTS mosaic;',\n"; + const genCtx = new CodegenContext({ + namespace: 'getVgInstance()' + }); + + for (const table of db_tables) { + if (table.name.startsWith('preagg_')) { + const name = `${table.schema}.${table.name}`; + tables[name] = null; + const file = `data/.mosaic/${table.name}.parquet`; + this.ast!.data[name] = new ParquetDataNode(name, file, new OptionsNode({})); + postLoad += `\t${this.ast!.data[name].codegenQuery(genCtx)},\n`; + } else if (table.name in tables && tables[table.name] == new Set(table.column_names)) { + tables[table.name] = null; + } + } + postLoad += "], {priority: 2})"; + return postLoad; + } + return undefined; + } + + /** + * Write out the index.js, index.html, and create data/ directory as needed. + */ + private async writeFiles( + needsJS: boolean, + element?: HTMLElement | SVGElement, + postLoad?: string, + returnData?: boolean + ): Promise { + let preambleOptions: PreambleOptions = { cacheFile: undefined } + if (this.optimizations.includes(Optimizations.LOAD_CACHE) && needsJS) { + const cache = this.ctx.coordinator.manager.cache().export(); + const cacheFile = '.cache.arrow'; + if (cache) { + try { + const cacheBytes = tableToIPC(tableFromArrays({ cache: [cache] }, { + types: { + cache: map(utf8(), binary()) + } + }), {})!; + fs.writeFileSync(path.join(this.outputPath, cacheFile), cacheBytes); + preambleOptions.cacheFile = cacheFile; + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to write cache file: ${err}`, PublishExitCode.FILE_WRITE_ERROR); + } + } + } + + let code, html; + try { + code = astToESM(this.ast!, { + connector: 'wasm', + imports: new Map([[VGPLOT, '* as vg'], [FLECHETTE, '{ tableFromIPC }']]), + preamble: preamble(preambleOptions), + }); + html = htmlTemplate({ + title: this.title, + css: templateCSS, + postLoad, + needsJS, + element, + customScript: this.customScript, + }); + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to generate code or HTML: ${err}`, PublishExitCode.PUBLISH_ERROR); + } + + if (returnData) { + return needsJS ? { html, js: code } : { html }; + } + + try { + fs.writeFileSync(path.join(this.outputPath, 'index.html'), html); + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to write index.html: ${err}`, PublishExitCode.FILE_WRITE_ERROR); + } + if (needsJS) { + let bundle; + try { + bundle = await rollup({ + input: 'entry.js', + plugins: [ // We ts-ignore these because they use cjs default exports + // @ts-ignore + virtual({ 'entry.js': code }), + // @ts-ignore + resolve({ browser: true }), + // @ts-ignore + commonjs({ defaultIsModuleExports: true }), + ], + output: { + manualChunks: { + vgplot: ['@uwdata/vgplot'], + flechette: ['@uwdata/flechette'], + }, + minifyInternalExports: true, + }, + logLevel: 'silent', + treeshake: true, + }); + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to bundle JavaScript: ${err}`, PublishExitCode.BUNDLE_ERROR); + } + try { + await bundle.write({ + dir: this.outputPath, + format: 'esm', + entryFileNames: 'index.js', + }); + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to write bundle files: ${err}`, PublishExitCode.FILE_WRITE_ERROR); + } + } + } + + /** + * Export relevant data from DuckDB to local Parquet + */ + private async exportDataFromDuckDB(tables: Record | null>) { + const table_copy_queries: string[] = []; + const materialized_view_copy_queries: string[] = []; + for (const node of Object.values(this.data!)) { + if (!(node instanceof ParquetDataNode)) continue; + const table = node.name; + const file = node.file; + const relevant_columns = tables[table]; + if (relevant_columns?.size === 0 && this.optimizations.includes(Optimizations.DATASHAKE)) { + this.logger.warn(`Skipping export of table: ${table}`); + this.logger.warn(`No columns are being used from this table.`); + continue; + } + + let query: string; + if (this.optimizations.includes(Optimizations.PROJECTION) && relevant_columns) { + this.logger.warn(`Partially exporting table: ${table}`); + query = `COPY (SELECT ${Array.from(relevant_columns).join(', ')} FROM ${table}) TO '${this.outputPath}/${file}' (FORMAT PARQUET)`; + } else { + query = `COPY (SELECT * FROM ${table}) TO '${this.outputPath}/${file}' (FORMAT PARQUET)`; + } + + if (table.startsWith('mosaic.preagg_')) { + materialized_view_copy_queries.push(query); + delete this.ast!.data[table]; + } else { + table_copy_queries.push(query); + } + } + + try { + if (table_copy_queries.length > 0 || materialized_view_copy_queries.length > 0) { + this.logger.info('Exporting data tables to Parquet...'); + fs.mkdirSync(path.join(this.outputPath, 'data'), { recursive: true }); + await this.ctx.coordinator.exec(table_copy_queries); + + if (materialized_view_copy_queries.length > 0) { + this.logger.info('Exporting materialized views to Parquet...'); + fs.mkdirSync(path.join(this.outputPath, 'data/.mosaic'), { recursive: true }); + await this.ctx.coordinator.exec(materialized_view_copy_queries); + } + } + } catch (err) { + if (err instanceof PublishError) throw err; + throw new PublishError(`Failed to export Parquet files: ${err}`, PublishExitCode.FILE_WRITE_ERROR); + } + } +} diff --git a/packages/publish/src/cli.ts b/packages/publish/src/cli.ts new file mode 100755 index 000000000..7de749ebb --- /dev/null +++ b/packages/publish/src/cli.ts @@ -0,0 +1,131 @@ +#!/usr/bin/env node + +import { MosaicPublisher, PublishError, PublishExitCode } from './MosaicPublisher.js'; +import { LogLevel, toLogLevel, Logger } from './util/index.js'; +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; +import chalk from 'chalk'; +import fs, { read } from 'fs'; + +const parsed = yargs(hideBin(process.argv)) + .scriptName('mosaic-publish') + .usage('$0 [options]') + .positional('spec', { + describe: 'Path to the specification file', + type: 'string', + demandOption: true + }) + .options({ + optimize: { + alias: 'o', + type: 'string', + describe: 'Level of optimizations', + choices: ['none', 'minimal', 'more', 'most'] as const, + default: 'more', + group: 'Optimization Options:', + }, + output: { + alias: 'out', + type: 'string', + describe: 'Output folder path for the result', + group: 'Output Options:', + }, + overwrite: { + type: 'boolean', + describe: 'Allow overwriting the output directory if it exists', + default: false, + group: 'Output Options:', + }, + title: { + alias: 't', + type: 'string', + describe: 'Title of published visualization', + group: 'Output Options:', + }, + logLevel: { + alias: 'l', + type: 'string', + group: 'Logging:', + describe: 'Logging level (overridden by --quiet or --verbose)', + choices: Object.values(LogLevel) + .filter((key) => typeof key === 'string') + .map((key) => key.toLowerCase()), + default: 'info' + }, + quiet: { + type: 'boolean', + describe: 'Suppress all output except errors (sets log level to error)', + group: 'Logging:', + conflicts: 'verbose' + }, + verbose: { + type: 'boolean', + describe: 'Enable debug logging (sets log level to debug)', + group: 'Logging:', + conflicts: 'quiet' + } + }) + .middleware(argv => { + if (argv.quiet) argv.logLevel = 'error'; + if (argv.verbose) argv.logLevel = 'debug'; + }) + .help() + .parseSync(); + +const argv = { + spec: parsed._[0] as string, + optimize: parsed.optimize as 'none' | 'minimal' | 'more' | 'most', + output: parsed.output as string | undefined, + title: parsed.title as string | undefined, + overwrite: parsed.overwrite as boolean, +}; +const logger = new Logger(toLogLevel(parsed.logLevel)); + +logger.info(chalk.dim('================================')); +logger.info(chalk.bold(chalk.yellow('Publishing Configuration'))); +logger.info(chalk.blue('Spec Path:'), argv.spec); +logger.info(chalk.blue('Optimization Level:'), argv.optimize); +if (argv.output) { + logger.info(chalk.blue('Output Path:'), argv.output); +} +if (argv.title) { + logger.info(chalk.bold('Visualization Title:'), argv.title); +} +logger.info(chalk.dim('================================')); + +let spec: string; +try { + spec = fs.readFileSync(argv.spec, 'utf-8'); + logger.info(chalk.greenBright('Specification file successfully read.')); +} catch (err) { + logger.error(chalk.redBright('Error: ') + 'Failed to read the spec file.'); + logger.error(err instanceof Error ? err.message : String(err)); + process.exit(PublishExitCode.FILE_READ_ERROR); +} + +// Instantiate the publisher +const publisher = new MosaicPublisher({ + spec, + outputPath: argv.output, + title: argv.title, + optimize: argv.optimize, + logger, + overwrite: argv.overwrite +}); + +// Execute publishing in an async context +(async () => { + try { + await publisher.publish(); + logger.info(chalk.greenBright('✔ Publishing complete! ✔')); + } catch (err) { + if (err instanceof PublishError) { + logger.error(chalk.redBright('Publisher Error: ') + err.message); + process.exit(err.code ?? PublishExitCode.PUBLISH_ERROR); + } else { + logger.error(chalk.redBright('Unknown Error:')); + logger.error(err instanceof Error ? err.message : String(err)); + process.exit(PublishExitCode.UNKNOWN_ERROR); + } + } +})(); \ No newline at end of file diff --git a/packages/publish/src/index.ts b/packages/publish/src/index.ts new file mode 100644 index 000000000..f02746489 --- /dev/null +++ b/packages/publish/src/index.ts @@ -0,0 +1 @@ +export { MosaicPublisher, PublishError } from './MosaicPublisher.js'; \ No newline at end of file diff --git a/packages/publish/src/util/Logger.ts b/packages/publish/src/util/Logger.ts new file mode 100644 index 000000000..a22232209 --- /dev/null +++ b/packages/publish/src/util/Logger.ts @@ -0,0 +1,54 @@ +import chalk from 'chalk'; +import { format } from 'util'; + +export enum LogLevel { + DEBUG = -1, + INFO = 0, + WARN = 1, + ERROR = 2, + SILENT = 3 +} + +export const toLogLevel = (level: string): LogLevel => { + switch (level.toUpperCase()) { + case 'DEBUG': return LogLevel.DEBUG; + case 'INFO': return LogLevel.INFO; + case 'WARN': return LogLevel.WARN; + case 'ERROR': return LogLevel.ERROR; + case 'SILENT': return LogLevel.SILENT; + default: throw new Error(`Invalid log level: ${level}`); + } +} + +export class Logger { + constructor(private level: LogLevel) { } + + private log(logFunction: (message: string) => void, prefix: string, ...args: any[]) { + const str = args.map(arg => format('%s', arg)).join(' '); + logFunction(str.split('\n').map(line => prefix + line).join('\n')); + } + + debug(...args: unknown[]) { + if (this.level <= LogLevel.DEBUG) { + this.log(console.debug, chalk.cyanBright('[DEBUG] '), ...args); + } + } + + info(...args: unknown[]) { + if (this.level <= LogLevel.INFO) { + this.log(console.log, chalk.blueBright('[INFO] '), ...args); + } + } + + warn(...args: any[]) { + if (this.level <= LogLevel.WARN) { + this.log(console.warn, chalk.yellowBright('[WARN] '), ...args); + } + } + + error(...args: any[]) { + if (this.level <= LogLevel.ERROR) { + this.log(console.error, chalk.redBright('[ERROR] '), ...args); + } + } +} \ No newline at end of file diff --git a/packages/publish/src/util/constants.ts b/packages/publish/src/util/constants.ts new file mode 100644 index 000000000..8667bf493 --- /dev/null +++ b/packages/publish/src/util/constants.ts @@ -0,0 +1,217 @@ +export const jsTemplate = (postLoad?: string) => ``; + +export type HTMLTemplateOptions = { + title: string; + needsJS: boolean; + postLoad?: string; + customScript?: string; + element?: HTMLElement | SVGElement; + css?: string; +}; +export const htmlTemplate = (options: HTMLTemplateOptions) => ` + + + + ${options.title} + + +
+ ${options.needsJS && options.element ? '
' : ''} + ${options.element?.outerHTML ?? ''} +
+ +${options.needsJS ? jsTemplate(options.postLoad) : ''} + +${options.customScript ? ` +` : ''} + +${options.css} +`; + +export const templateCSS = ``; + +// export const VGPLOT = 'https://cdn.jsdelivr.net/npm/@uwdata/vgplot@latest/dist/vgplot.js'; +// export const FLECHETTE = 'https://cdn.jsdelivr.net/npm/@uwdata/flechette@latest/dist/flechette.js'; +export const VGPLOT = '@uwdata/vgplot'; +export const FLECHETTE = '@uwdata/flechette'; + +const loadCache = (cacheFile: string) => ` +const cacheBytes = await fetch(window.location.origin + "/${cacheFile}").then(res => res.arrayBuffer()); +vg.coordinator().manager.cache().import(tableFromIPC(cacheBytes).get(0).cache);`; + +export type PreambleOptions = { cacheFile?: string }; +export const preamble = (options: PreambleOptions) => { + return ` +export function getVgInstance() { + return vg; +} + +export function clientsReady() { + const clients = [...vg.coordinator().clients]; + return Promise.allSettled(clients.map(c => c._pending)) +} + +${options.cacheFile ? loadCache(options.cacheFile) : ''} +` +} + +export enum Optimizations { + PREAGREGATE = 'preaggregate', + PROJECTION = 'projection', + DATASHAKE = 'datashake', + LOAD_CACHE = 'loadCache', + PRERENDER = 'prerender', +} + +export const OPTIMIZATION_LEVEL_TO_OPTIMIZATIONS = { + none: [], + minimal: [Optimizations.PROJECTION, Optimizations.DATASHAKE], + more: [Optimizations.PROJECTION, Optimizations.DATASHAKE, Optimizations.PREAGREGATE, Optimizations.LOAD_CACHE], + most: [Optimizations.PROJECTION, Optimizations.DATASHAKE, Optimizations.PREAGREGATE, Optimizations.LOAD_CACHE, Optimizations.PRERENDER], +}; \ No newline at end of file diff --git a/packages/publish/src/util/index.ts b/packages/publish/src/util/index.ts new file mode 100644 index 000000000..0e4422e4f --- /dev/null +++ b/packages/publish/src/util/index.ts @@ -0,0 +1,4 @@ +export * from './constants.js'; +export * from './publishHelpers.js'; +export * from './renderHelpers.js'; +export * from './Logger.js'; \ No newline at end of file diff --git a/packages/publish/src/util/publishHelpers.ts b/packages/publish/src/util/publishHelpers.ts new file mode 100644 index 000000000..b66f4a4e1 --- /dev/null +++ b/packages/publish/src/util/publishHelpers.ts @@ -0,0 +1,88 @@ +import { Coordinator, decodeIPC } from "@uwdata/mosaic-core"; +// @ts-ignore -- no types +import { DuckDB } from "@uwdata/mosaic-duckdb"; +import { InstantiateContext } from "@uwdata/mosaic-spec"; +// @ts-ignore -- no types +import { createAPIContext } from "@uwdata/vgplot"; + +const SCAN_OP = 'SEQ_SCAN '; +const NO_EXPLAIN = ['CREATE', 'INSTALL', 'LOAD'] + +export function publishConnector() { + const db = new DuckDB(); + db.exec('PRAGMA force_compression=Uncompressed'); + + type Query = { + type: 'exec' | 'arrow' | 'json'; + sql: string; + } + + const tables: Record> = {}; + + return { + query: async (query: Query) => { + // Find SEQ_SCAN by recursively looping over the plan + const toCheck: Record> = {}; + const findSeqScan = (node: any): void => { + if (node.name === SCAN_OP) { + const info = node.extra_info; + if (info.Table && info.Projections) { + const table = info.Table.toLowerCase(); + const columns = typeof info.Projections === 'string' ? [info.Projections] : info.Projections + if (!(table in tables)) tables[table] = new Set(); + columns.forEach((col: string) => tables[table].add(col)); + } + if (info.Table && info.Filters) { + const table = info.Table.toLowerCase(); + const filters = typeof info.Filters === 'string' ? [info.Filters] : info.Filters + if (!(table in toCheck)) toCheck[table] = new Set(); + filters.forEach((filter: string) => toCheck[table].add(filter)); + } + } + if (node.children) { + node.children.some(findSeqScan); + } + }; + // run an explain query and extract the result + if (!NO_EXPLAIN.some(cmd => query.sql.startsWith(cmd))) { + const explain = await db.query(`EXPLAIN (FORMAT json) ${query.sql}`); + if (explain.length !== 0 && explain[0].explain_value) { + const plan = JSON.parse(explain[0].explain_value); + plan.some(findSeqScan); + + for (const table in toCheck) { + const desc = await db.query(`DESCRIBE ${table}`); + const columns = desc.map((col: any) => col.column_name); + const filters = Array.from(toCheck[table]).join(' '); + for (const col of columns) { + if (filters.includes(col)) { + if (!(table in tables)) tables[table] = new Set(); + tables[table].add(col); + } + } + } + } + } + + const { type, sql } = query; + switch (type) { + case 'exec': + return db.exec(sql); + case 'arrow': + return decodeIPC(await db.arrowBuffer(sql)); + default: + return db.query(sql); + } + }, + tables: () => tables, + }; +} + +export class PublishContext extends InstantiateContext { + constructor(connector: any) { + const coordinator = new Coordinator(connector); + coordinator.logger(undefined) // Disable logging + const api = createAPIContext({ coordinator }); + super({ api }); + } +} \ No newline at end of file diff --git a/packages/publish/src/util/renderHelpers.ts b/packages/publish/src/util/renderHelpers.ts new file mode 100644 index 000000000..98de45d68 --- /dev/null +++ b/packages/publish/src/util/renderHelpers.ts @@ -0,0 +1,33 @@ +import { MosaicClient } from "@uwdata/mosaic-core"; +import { InstantiateContext } from "@uwdata/mosaic-spec"; +import { Canvas } from "skia-canvas"; + +export function mockCanvas(window: any) { + const og = window.document.createElement + window.document.createElement = function (tagName: string) { + if (tagName !== 'canvas') { + return og.call(this, tagName) + } else { + const canvas = new Canvas(); + const el = og.call(this, tagName) as HTMLCanvasElement; + el.getContext = canvas.getContext.bind(canvas) as unknown as HTMLCanvasElement['getContext']; + el.toDataURL = canvas.toDataURLSync.bind(canvas) as unknown as HTMLCanvasElement['toDataURL']; + const set = el.setAttribute; + el.setAttribute = function (name: string, value: string) { + if (name !== 'width' && name !== 'height') { + set.call(this, name, value); + } else { + canvas[name] = parseInt(value); + } + } + return el; + } + } +} + +export function clientsReady(ctx: InstantiateContext) { + if (!ctx.coordinator.clients) return Promise.resolve([]); + + const clients = [...ctx.coordinator.clients] as MosaicClient[]; + return Promise.allSettled(clients.map(c => c.pending)); +} \ No newline at end of file diff --git a/packages/publish/test/api.test.ts b/packages/publish/test/api.test.ts new file mode 100644 index 000000000..7b7527363 --- /dev/null +++ b/packages/publish/test/api.test.ts @@ -0,0 +1,31 @@ +import { describe, it, expect, afterAll, afterEach } from 'vitest'; +import { MosaicPublisher } from '../src/MosaicPublisher'; +import fs from 'fs'; +import { Logger, LogLevel } from '../src/util'; + +describe('MosaicPublisher API', () => { + it('should instantiate and publish without error', async () => { + const dummySpec = { + meta: { title: 'Test Spec' }, + plot: [] + }; + + const publisher = new MosaicPublisher({ + spec: JSON.stringify(dummySpec), + outputPath: './.tmp', + title: 'Test Spec', + optimize: 'minimal', + logger: new Logger(LogLevel.SILENT) + }); + + await expect(publisher.publish()).resolves.toBeUndefined(); + + // Check that the output directory was created and contains an index.html file + expect(fs.existsSync('./.tmp')).toBe(true); + expect(fs.existsSync('./.tmp/index.html')).toBe(true); + }, 10000); + + afterEach(() => { + fs.rmSync('./.tmp', { recursive: true }); + }); +}); diff --git a/packages/publish/test/cli.test.ts b/packages/publish/test/cli.test.ts new file mode 100644 index 000000000..70d142cd8 --- /dev/null +++ b/packages/publish/test/cli.test.ts @@ -0,0 +1,21 @@ +import { describe, it, expect } from 'vitest'; +import { execFileSync, ExecFileSyncOptionsWithStringEncoding } from 'child_process'; +import { join } from 'path'; + +const cliPath = join(__dirname, '..', 'dist', 'cli.js'); + +function runCli(args: string[], options: ExecFileSyncOptionsWithStringEncoding): string { + return execFileSync('node', [cliPath, ...args], options); +} + +describe('CLI', () => { + it('should display help information when run with --help', () => { + const output = runCli(['--help'], { encoding: 'utf8' }); + expect(output).toContain('mosaic-publish [options]'); + expect(output).toContain('Options:'); + }); + + it('should fail when run without required arguments', () => { + expect(() => runCli([], { encoding: 'utf8', stdio: 'pipe' })).toThrow(); + }); +}); diff --git a/packages/publish/tsconfig.json b/packages/publish/tsconfig.json new file mode 100644 index 000000000..6663df935 --- /dev/null +++ b/packages/publish/tsconfig.json @@ -0,0 +1,14 @@ +{ + "include": ["src/**/*.js", "src/**/*.ts"], + "exclude": ["node_modules", "dist"], + "compilerOptions": { + "allowJs": true, + "outDir": "dist/", + "declaration": true, + "strict": true, + "moduleResolution": "Node16", + "module": "Node16", + "esModuleInterop": true, + "skipLibCheck": true, + }, +} diff --git a/packages/publish/vitest.config.ts b/packages/publish/vitest.config.ts new file mode 100644 index 000000000..c049f46e1 --- /dev/null +++ b/packages/publish/vitest.config.ts @@ -0,0 +1,3 @@ +import { defineConfig } from 'vite'; + +export default defineConfig({}); diff --git a/packages/spec/src/ast-to-dom.js b/packages/spec/src/ast-to-dom.js index 54d7f84db..071d776c4 100644 --- a/packages/spec/src/ast-to-dom.js +++ b/packages/spec/src/ast-to-dom.js @@ -1,5 +1,5 @@ /** - * @import { Param, Selection } from '@uwdata/mosaic-core' + * @import { Coordinator, Param, Selection } from '@uwdata/mosaic-core' * @import { SpecNode } from './ast/SpecNode.js' */ import { createAPIContext, loadExtension } from '@uwdata/vgplot'; @@ -71,6 +71,7 @@ export class InstantiateContext { this.plotDefaults = plotDefaults; this.activeParams = params; this.baseURL = baseURL; + /** @type {Coordinator} */ this.coordinator = api.context.coordinator; }