diff --git a/.gitignore b/.gitignore index 2d77136..93db083 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,17 @@ dist node_modules -build \ No newline at end of file +build +HOC +adapters +chartGenerators +contexts +dateHelper +dateformat +domHelper +gridHelper +helper +hooks +network +providers +recursionHelper +validators \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..46f0252 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,6 @@ +@Library('jenkins-shared') _ +kanikoPipeline( + repoName: 'utils', + branch: env.BRANCH_NAME ?: 'main', + isNpmLib: true +) \ No newline at end of file diff --git a/build-tools/build.sh b/build-tools/build.sh index 0daf942..35ca06b 100755 --- a/build-tools/build.sh +++ b/build-tools/build.sh @@ -3,10 +3,34 @@ # Get the directory of the current script SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -rm -rf build -npx tsc -vite build +# Default values +DEV_FLAG="" +# Parse arguments +for arg in "$@" +do + case $arg in + --dev) + DEV_FLAG="--dev" + shift # Remove --dev from processing + ;; + esac +done + +echo "[BUILD:SH] Dev flag is: $DEV_FLAG" +echo "[BUILD:SH] Removing build if exists" +rm -rf build +echo "[BUILD:SH] Checking TS Types" +npx tsc +echo "[BUILD:SH] Initiating build..." +# Conditionally use vite-dev.config.ts if --dev flag is present +if [ "$DEV_FLAG" == "--dev" ]; then + vite build --config vite-dev.config.ts +else + vite build +fi + +echo "[BUILD:SH] Running post processor scripts..." # Run Post processors: Update style imports in .js files, create component modules -node "$SCRIPT_DIR/post-processor.js" build/cjs -node "$SCRIPT_DIR/post-processor.js" build/es +node "$SCRIPT_DIR/post-processor.js" build/cjs $DEV_FLAG +node "$SCRIPT_DIR/post-processor.js" build/es $DEV_FLAG \ No newline at end of file diff --git a/build-tools/generate-module.js b/build-tools/generate-module.js index 802cda7..3c0085e 100644 --- a/build-tools/generate-module.js +++ b/build-tools/generate-module.js @@ -7,17 +7,17 @@ const __dirname = dirname(__filename) const exclusions = ["enums.js", "v4.js", "index.js"] -async function generateModule(fileName) { - if (!exclusions.includes(fileName)) { +async function generateModule(fileName, isDev) { + if (!exclusions.includes(fileName) && !fileName.endsWith(".js.map")) { const dir = fileName.slice(0, -3) const name = `@armco/utils/${dir}` const packageJsonContent = { name, - main: `../cjs/${dir}.js`, - module: `../es/${dir}.js`, - types: `../types/${dir}.d.ts`, + main: `../${isDev ? "build/" : ""}cjs/${dir}.js`, + module: `../${isDev ? "build/" : ""}es/${dir}.js`, + types: `../${isDev ? "build/" : ""}types/${dir}.d.ts`, } - const dirPath = resolve(__dirname, `../build/${dir}`) + const dirPath = resolve(__dirname, `../${isDev ? "" : "build/"}${dir}`) try { await fs.mkdir(dirPath, { recursive: true }) await fs.writeFile( diff --git a/build-tools/post-processor.js b/build-tools/post-processor.js index 53c993f..6c6cf6f 100644 --- a/build-tools/post-processor.js +++ b/build-tools/post-processor.js @@ -1,12 +1,12 @@ import { readdir } from "fs/promises" import generateModule from "./generate-module.js" -async function postProcessor(dir) { +async function postProcessor(dir, isDev) { try { const files = await readdir(dir) await Promise.all( files.map(async (file) => { - await generateModule(file, dir) + await generateModule(file, isDev) }), ) } catch (error) { @@ -15,8 +15,10 @@ async function postProcessor(dir) { } const targetDir = process.argv[2] +const isDev = process.argv.includes("--dev") + if (targetDir) { - postProcessor(targetDir) + postProcessor(targetDir, isDev) } else { console.error("Please provide the build directory to run post processor on.") process.exit(1) diff --git a/package-lock.json b/package-lock.json index 884ac06..0ba1ade 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,91 +1,75 @@ { "name": "@armco/utils", - "version": "0.0.18", + "version": "0.0.29", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@armco/utils", - "version": "0.0.18", + "version": "0.0.29", "license": "ISC", "dependencies": { - "@armco/configs": "^0.0.7", - "@armco/types": "^0.0.9", - "d3": "^7.9.0", - "uuid": "^10.0.0" + "@armco/configs": "^0.0.12" }, "devDependencies": { + "@armco/types": "^0.0.21", "@types/d3": "^7.4.3", - "@types/node": "^22.5.5", - "@types/react": "^18.3.7", - "@types/uuid": "^10.0.0", - "@vitejs/plugin-react": "^4.3.1", - "glob": "^11.0.0", - "react": "^18.3.1", - "typescript": "^5.0.2", - "vite": "^5.4.6", - "vite-plugin-dts": "^4.2.1", - "vite-plugin-externalize-deps": "^0.8.0", - "vitest": "^2.1.1" + "@types/node": "^24.10.0", + "@types/react": "^19.2.2", + "@vitejs/plugin-react": "^5.1.0", + "glob": "^11.0.3", + "react-dom": "18.3.1", + "typescript": "^5.9.3", + "vite-plugin-dts": "^4.5.4", + "vite-plugin-externalize-deps": "^0.10.0", + "vitest": "^4.0.8" }, "peerDependencies": { - "react": ">16.8.1" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" + "@armco/types": "^0.0.18", + "d3": "^7.9.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.18.2", + "uuid": "^9.0.0" } }, "node_modules/@armco/configs": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@armco/configs/-/configs-0.0.7.tgz", - "integrity": "sha512-iniTmpR0kaOmRXAKw7cmXMyVnd1M+gOG/gNEOvmNAxRt8AuvW8WBra96o6oHnk0LFPgZhzmKSHvWzO1ADErxZQ==", + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@armco/configs/-/configs-0.0.12.tgz", + "integrity": "sha512-vFmZ6ZPFAbTldyt7UdhUFl+KxRyBpQ0qVPWfeR9HTxzHRwqBK6i/vd+j728OLUk5+k9qLnvea1R65iRFDvBQrw==", "license": "ISC", "dependencies": { - "@armco/types": "^0.0.10", - "uuid": "^10.0.0" + "@types/uuid": "^10.0.0" + }, + "peerDependencies": { + "@armco/types": "^0.0.18", + "uuid": "^9.0.1" } }, - "node_modules/@armco/configs/node_modules/@armco/types": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@armco/types/-/types-0.0.10.tgz", - "integrity": "sha512-PKmehb5PsX6o6b3yaItCyDJxYy5nyXBduONnWv6slQwBMareFquGUcrCORPQhvnVLprCTs5aIZyPerZdjVuuxg==", - "license": "MIT" - }, "node_modules/@armco/types": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@armco/types/-/types-0.0.9.tgz", - "integrity": "sha512-RLCt0Q20Nm52sTUcKVhjzeq7sbojgryEeqqChATOW6yAkWCL5NrQ2RLXpK4veePz1RLdu1eTsWVy5fMGe85qQw==", + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@armco/types/-/types-0.0.21.tgz", + "integrity": "sha512-ixOJBpJP9a+uDnqndaMGyCsGQTOhdwbFazb7+eAYFng2+CCLS9WF//f8ldAlXmeWapeS9+VZxyxe6apaxjQ0yA==", "license": "MIT" }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "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/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -93,22 +77,22 @@ } }, "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -124,31 +108,32 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "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.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@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" }, @@ -156,31 +141,40 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "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.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -190,33 +184,19 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "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": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "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": { @@ -224,9 +204,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -234,9 +214,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "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": { @@ -244,43 +224,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -290,13 +254,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", - "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "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.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -306,13 +270,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", - "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "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.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -322,58 +286,57 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "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.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@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.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -384,13 +347,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -401,13 +364,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -418,13 +381,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -435,13 +398,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -452,13 +415,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -469,13 +432,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -486,13 +449,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -503,13 +466,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -520,13 +483,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -537,13 +500,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -554,13 +517,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -571,13 +534,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -588,13 +551,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -605,13 +568,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -622,13 +585,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -639,13 +602,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -656,13 +619,30 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -673,13 +653,30 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -690,13 +687,30 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -707,13 +721,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -724,13 +738,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -741,13 +755,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -758,7 +772,30 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/@isaacs/cliui": { @@ -780,18 +817,25 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -804,27 +848,17 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -833,51 +867,41 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.47.7", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.47.7.tgz", - "integrity": "sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==", + "version": "7.54.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.54.0.tgz", + "integrity": "sha512-t0SEcbVUPy4yAVykPafTNWktBg728X6p9t8qCuGDsYr1/lz2VQFihYDP2CnBFSArP5vwJPcvxktoKVSqH326cA==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/api-extractor-model": "7.29.6", - "@microsoft/tsdoc": "~0.15.0", - "@microsoft/tsdoc-config": "~0.17.0", - "@rushstack/node-core-library": "5.7.0", - "@rushstack/rig-package": "0.5.3", - "@rushstack/terminal": "0.14.0", - "@rushstack/ts-command-line": "4.22.6", + "@microsoft/api-extractor-model": "7.31.3", + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.18.0", + "@rushstack/rig-package": "0.6.0", + "@rushstack/terminal": "0.19.3", + "@rushstack/ts-command-line": "5.1.3", + "diff": "~8.0.2", "lodash": "~4.17.15", - "minimatch": "~3.0.3", + "minimatch": "10.0.3", "resolve": "~1.22.1", "semver": "~7.5.4", "source-map": "~0.6.1", - "typescript": "5.4.2" + "typescript": "5.8.2" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.29.6", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.29.6.tgz", - "integrity": "sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==", + "version": "7.31.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.31.3.tgz", + "integrity": "sha512-dv4quQI46p0U03TCEpasUf6JrJL3qjMN7JUAobsPElxBv4xayYYvWW9aPpfYV+Jx6hqUcVaLVOeV7+5hxsyoFQ==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "~0.15.0", - "@microsoft/tsdoc-config": "~0.17.0", - "@rushstack/node-core-library": "5.7.0" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.18.0" } }, "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { @@ -894,16 +918,19 @@ } }, "node_modules/@microsoft/api-extractor/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": "*" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@microsoft/api-extractor/node_modules/semver": { @@ -923,9 +950,9 @@ } }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -944,46 +971,52 @@ "license": "ISC" }, "node_modules/@microsoft/tsdoc": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", - "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", "dev": true, "license": "MIT" }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz", - "integrity": "sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", + "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "0.15.0", + "@microsoft/tsdoc": "0.15.1", "ajv": "~8.12.0", "jju": "~1.4.0", "resolve": "~1.22.2" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, + "node_modules/@remix-run/router": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", "license": "MIT", - "optional": true, + "peer": true, "engines": { - "node": ">=14" + "node": ">=14.0.0" } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.43", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.43.tgz", + "integrity": "sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" @@ -998,9 +1031,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz", - "integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.1.tgz", + "integrity": "sha512-bxZtughE4VNVJlL1RdoSE545kc4JxL7op57KKoi59/gwuU5rV6jLWFXXc8jwgFoT6vtj+ZjO+Z2C5nrY0Cl6wA==", "cpu": [ "arm" ], @@ -1012,9 +1045,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz", - "integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.1.tgz", + "integrity": "sha512-44a1hreb02cAAfAKmZfXVercPFaDjqXCK+iKeVOlJ9ltvnO6QqsBHgKVPTu+MJHSLLeMEUbeG2qiDYgbFPU48g==", "cpu": [ "arm64" ], @@ -1026,9 +1059,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz", - "integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.1.tgz", + "integrity": "sha512-usmzIgD0rf1syoOZ2WZvy8YpXK5G1V3btm3QZddoGSa6mOgfXWkkv+642bfUUldomgrbiLQGrPryb7DXLovPWQ==", "cpu": [ "arm64" ], @@ -1040,9 +1073,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz", - "integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.1.tgz", + "integrity": "sha512-is3r/k4vig2Gt8mKtTlzzyaSQ+hd87kDxiN3uDSDwggJLUV56Umli6OoL+/YZa/KvtdrdyNfMKHzL/P4siOOmg==", "cpu": [ "x64" ], @@ -1053,10 +1086,38 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.1.tgz", + "integrity": "sha512-QJ1ksgp/bDJkZB4daldVmHaEQkG4r8PUXitCOC2WRmRaSaHx5RwPoI3DHVfXKwDkB+Sk6auFI/+JHacTekPRSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.1.tgz", + "integrity": "sha512-J6ma5xgAzvqsnU6a0+jgGX/gvoGokqpkx6zY4cWizRrm0ffhHDpJKQgC8dtDb3+MqfZDIqs64REbfHDMzxLMqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz", - "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.1.tgz", + "integrity": "sha512-JzWRR41o2U3/KMNKRuZNsDUAcAVUYhsPuMlx5RUldw0E4lvSIXFUwejtYz1HJXohUmqs/M6BBJAUBzKXZVddbg==", "cpu": [ "arm" ], @@ -1068,9 +1129,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz", - "integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.1.tgz", + "integrity": "sha512-L8kRIrnfMrEoHLHtHn+4uYA52fiLDEDyezgxZtGUTiII/yb04Krq+vk3P2Try+Vya9LeCE9ZHU8CXD6J9EhzHQ==", "cpu": [ "arm" ], @@ -1082,9 +1143,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz", - "integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.1.tgz", + "integrity": "sha512-ysAc0MFRV+WtQ8li8hi3EoFi7us6d1UzaS/+Dp7FYZfg3NdDljGMoVyiIp6Ucz7uhlYDBZ/zt6XI0YEZbUO11Q==", "cpu": [ "arm64" ], @@ -1096,9 +1157,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz", - "integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.1.tgz", + "integrity": "sha512-UV6l9MJpDbDZZ/fJvqNcvO1PcivGEf1AvKuTcHoLjVZVFeAMygnamCTDikCVMRnA+qJe+B3pSbgX2+lBMqgBhA==", "cpu": [ "arm64" ], @@ -1109,10 +1170,24 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz", - "integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.1.tgz", + "integrity": "sha512-UDUtelEprkA85g95Q+nj3Xf0M4hHa4DiJ+3P3h4BuGliY4NReYYqwlc0Y8ICLjN4+uIgCEvaygYlpf0hUj90Yg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.1.tgz", + "integrity": "sha512-vrRn+BYhEtNOte/zbc2wAUQReJXxEx2URfTol6OEfY2zFEUK92pkFBSXRylDM7aHi+YqEPJt9/ABYzmcrS4SgQ==", "cpu": [ "ppc64" ], @@ -1124,9 +1199,23 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz", - "integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.1.tgz", + "integrity": "sha512-gto/1CxHyi4A7YqZZNznQYrVlPSaodOBPKM+6xcDSCMVZN/Fzb4K+AIkNz/1yAYz9h3Ng+e2fY9H6bgawVq17w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.1.tgz", + "integrity": "sha512-KZ6Vx7jAw3aLNjFR8eYVcQVdFa/cvBzDNRFM3z7XhNNunWjA03eUrEwJYPk0G8V7Gs08IThFKcAPS4WY/ybIrQ==", "cpu": [ "riscv64" ], @@ -1138,9 +1227,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz", - "integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.1.tgz", + "integrity": "sha512-HvEixy2s/rWNgpwyKpXJcHmE7om1M89hxBTBi9Fs6zVuLU4gOrEMQNbNsN/tBVIMbLyysz/iwNiGtMOpLAOlvA==", "cpu": [ "s390x" ], @@ -1152,9 +1241,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz", - "integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.1.tgz", + "integrity": "sha512-E/n8x2MSjAQgjj9IixO4UeEUeqXLtiA7pyoXCFYLuXpBA/t2hnbIdxHfA7kK9BFsYAoNU4st1rHYdldl8dTqGA==", "cpu": [ "x64" ], @@ -1166,9 +1255,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz", - "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.1.tgz", + "integrity": "sha512-IhJ087PbLOQXCN6Ui/3FUkI9pWNZe/Z7rEIVOzMsOs1/HSAECCvSZ7PkIbkNqL/AZn6WbZvnoVZw/qwqYMo4/w==", "cpu": [ "x64" ], @@ -1179,10 +1268,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.1.tgz", + "integrity": "sha512-0++oPNgLJHBblreu0SFM7b3mAsBJBTY0Ksrmu9N6ZVrPiTkRgda52mWR7TKhHAsUb9noCjFvAw9l6ZO1yzaVbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz", - "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.1.tgz", + "integrity": "sha512-VJXivz61c5uVdbmitLkDlbcTk9Or43YC2QVLRkqp86QoeFSqI81bNgjhttqhKNMKnQMWnecOCm7lZz4s+WLGpQ==", "cpu": [ "arm64" ], @@ -1194,9 +1297,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz", - "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.1.tgz", + "integrity": "sha512-NmZPVTUOitCXUH6erJDzTQ/jotYw4CnkMDjCYRxNHVD9bNyfrGoIse684F9okwzKCV4AIHRbUkeTBc9F2OOH5Q==", "cpu": [ "ia32" ], @@ -1207,10 +1310,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.1.tgz", + "integrity": "sha512-2SNj7COIdAf6yliSpLdLG8BEsp5lgzRehgfkP0Av8zKfQFKku6JcvbobvHASPJu4f3BFxej5g+HuQPvqPhHvpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz", - "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.1.tgz", + "integrity": "sha512-rLarc1Ofcs3DHtgSzFO31pZsCh8g05R2azN1q3fF+H423Co87My0R+tazOEvYVKXSLh8C4LerMK41/K7wlklcg==", "cpu": [ "x64" ], @@ -1222,16 +1339,16 @@ ] }, "node_modules/@rushstack/node-core-library": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.7.0.tgz", - "integrity": "sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.18.0.tgz", + "integrity": "sha512-XDebtBdw5S3SuZIt+Ra2NieT8kQ3D2Ow1HxhDQ/2soinswnOu9e7S69VSwTOLlQnx5mpWbONu+5JJjDxMAb6Fw==", "dev": true, "license": "MIT", "dependencies": { "ajv": "~8.13.0", "ajv-draft-04": "~1.0.0", "ajv-formats": "~3.0.1", - "fs-extra": "~7.0.1", + "fs-extra": "~11.3.0", "import-lazy": "~4.0.0", "jju": "~1.4.0", "resolve": "~1.22.1", @@ -1299,10 +1416,25 @@ "dev": true, "license": "ISC" }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", + "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@rushstack/rig-package": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz", - "integrity": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", + "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", "dev": true, "license": "MIT", "dependencies": { @@ -1311,13 +1443,14 @@ } }, "node_modules/@rushstack/terminal": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.0.tgz", - "integrity": "sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.3.tgz", + "integrity": "sha512-0P8G18gK9STyO+CNBvkKPnWGMxESxecTYqOcikHOVIHXa9uAuTK+Fw8TJq2Gng1w7W6wTC9uPX6hGNvrMll2wA==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/node-core-library": "5.7.0", + "@rushstack/node-core-library": "5.18.0", + "@rushstack/problem-matcher": "0.1.1", "supports-color": "~8.1.1" }, "peerDependencies": { @@ -1329,45 +1462,26 @@ } } }, - "node_modules/@rushstack/terminal/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@rushstack/terminal/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/@rushstack/ts-command-line": { - "version": "4.22.6", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.22.6.tgz", - "integrity": "sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.3.tgz", + "integrity": "sha512-Kdv0k/BnnxIYFlMVC1IxrIS0oGQd4T4b7vKfx52Y2+wk2WZSDFIvedr7JrhenzSlm3ou5KwtoTGTGd5nbODRug==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/terminal": "0.14.0", + "@rushstack/terminal": "0.19.3", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", @@ -1390,9 +1504,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": { @@ -1411,13 +1525,24 @@ } }, "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.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, "node_modules/@types/d3": { @@ -1460,9 +1585,9 @@ } }, "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", "dev": true, "license": "MIT" }, @@ -1519,9 +1644,9 @@ "license": "MIT" }, "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", "dev": true, "license": "MIT" }, @@ -1601,9 +1726,9 @@ } }, "node_modules/@types/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", "dev": true, "license": "MIT" }, @@ -1629,9 +1754,9 @@ "license": "MIT" }, "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", "dev": true, "license": "MIT", "dependencies": { @@ -1639,23 +1764,23 @@ } }, "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", - "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-selection": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", - "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", "dev": true, "license": "MIT", "dependencies": { @@ -1663,9 +1788,9 @@ } }, "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", "dev": true, "license": "MIT" }, @@ -1684,9 +1809,9 @@ "license": "MIT" }, "node_modules/@types/d3-transition": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", - "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", "dev": true, "license": "MIT", "dependencies": { @@ -1704,45 +1829,44 @@ "@types/d3-selection": "*" } }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "22.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", - "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "version": "24.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", + "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~7.16.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.7.tgz", - "integrity": "sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "dev": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.0.2" } }, @@ -1750,63 +1874,64 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true, "license": "MIT" }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", - "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.0.tgz", + "integrity": "sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@babel/core": "^7.28.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.43", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" + "react-refresh": "^0.18.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/@vitest/expect": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz", - "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.8.tgz", + "integrity": "sha512-Rv0eabdP/xjAHQGr8cjBm+NnLHNoL268lMDK85w2aAGLFoVKLd8QGnVon5lLtkXQCoYaNL0wg04EGnyKkkKhPA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.1", - "@vitest/utils": "2.1.1", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.8", + "@vitest/utils": "4.0.8", + "chai": "^6.2.0", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz", - "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.8.tgz", + "integrity": "sha512-9FRM3MZCedXH3+pIh+ME5Up2NBBHDq0wqwhOKkN4VnvCiKbVxddqH9mSGPZeawjd12pCOGnl+lo/ZGHt0/dQSg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "^2.1.0-beta.1", + "@vitest/spy": "4.0.8", "estree-walker": "^3.0.3", - "magic-string": "^0.30.11" + "magic-string": "^0.30.21" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/spy": "2.1.1", - "msw": "^2.3.5", - "vite": "^5.0.0" + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -1828,127 +1953,123 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", - "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.8.tgz", + "integrity": "sha512-qRrjdRkINi9DaZHAimV+8ia9Gq6LeGz2CgIEmMLz3sBDYV53EsnLZbJMR1q84z1HZCMsf7s0orDgZn7ScXsZKg==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^1.2.0" + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz", - "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.8.tgz", + "integrity": "sha512-mdY8Sf1gsM8hKJUQfiPT3pn1n8RF4QBcJYFslgWh41JTfrK1cbqY8whpGCFzBl45LN028g0njLCYm0d7XxSaQQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.1", - "pathe": "^1.1.2" + "@vitest/utils": "4.0.8", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz", - "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.8.tgz", + "integrity": "sha512-Nar9OTU03KGiubrIOFhcfHg8FYaRaNT+bh5VUlNz8stFhCZPNrJvmZkhsr1jtaYvuefYFwK2Hwrq026u4uPWCw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.1", - "magic-string": "^0.30.11", - "pathe": "^1.1.2" + "@vitest/pretty-format": "4.0.8", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz", - "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.8.tgz", + "integrity": "sha512-nvGVqUunyCgZH7kmo+Ord4WgZ7lN0sOULYXUOYuHr55dvg9YvMz3izfB189Pgp28w0vWFbEEfNc/c3VTrqrXeA==", "dev": true, "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.0" - }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", - "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.8.tgz", + "integrity": "sha512-pdk2phO5NDvEFfUTxcTP8RFYjVj/kfLSPIN5ebP2Mu9kcIMeAQTbknqcFEyBcC4z2pJlJI9aS5UQjcYfhmKAow==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.1", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" + "@vitest/pretty-format": "4.0.8", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@volar/language-core": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.5.tgz", - "integrity": "sha512-F4tA0DCO5Q1F5mScHmca0umsi2ufKULAnMOVBfMsZdT4myhVl4WdKRwCaKcfOkIEuyrAVvtq1ESBdZ+rSyLVww==", + "version": "2.4.23", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.23.tgz", + "integrity": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==", "dev": true, "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.5" + "@volar/source-map": "2.4.23" } }, "node_modules/@volar/source-map": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.5.tgz", - "integrity": "sha512-varwD7RaKE2J/Z+Zu6j3mNNJbNT394qIxXwdvz/4ao/vxOfyClZpSDtLKkwWmecinkOVos5+PWkWraelfMLfpw==", + "version": "2.4.23", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.23.tgz", + "integrity": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==", "dev": true, "license": "MIT" }, "node_modules/@volar/typescript": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.5.tgz", - "integrity": "sha512-mcT1mHvLljAEtHviVcBuOyAwwMKz1ibXTi5uYtP/pf4XxoAzpdkQ+Br2IC0NPCvLCbjPZmbf3I0udndkfB1CDg==", + "version": "2.4.23", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.23.tgz", + "integrity": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.5", + "@volar/language-core": "2.4.23", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.6.tgz", - "integrity": "sha512-r+gNu6K4lrvaQLQGmf+1gc41p3FO2OUJyWmNqaIITaJU6YFiV5PtQSFZt8jfztYyARwqhoCayjprC7KMvT3nRA==", + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.24.tgz", + "integrity": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.6", + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.24", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.6.tgz", - "integrity": "sha512-xRXqxDrIqK8v8sSScpistyYH0qYqxakpsIvqMD2e5sV/PXQ1mTwtXp4k42yHK06KXxKSmitop9e45Ui/3BrTEw==", + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.24.tgz", + "integrity": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.6", - "@vue/shared": "3.5.6" + "@vue/compiler-core": "3.5.24", + "@vue/shared": "3.5.24" } }, "node_modules/@vue/compiler-vue2": { @@ -1963,17 +2084,17 @@ } }, "node_modules/@vue/language-core": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.6.tgz", - "integrity": "sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", + "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "~2.4.1", - "@vue/compiler-dom": "^3.4.0", + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.4.0", - "computeds": "^0.0.1", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.4.9", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" @@ -2004,16 +2125,16 @@ } }, "node_modules/@vue/shared": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.6.tgz", - "integrity": "sha512-eidH0HInnL39z6wAt6SFIwBrvGOpDWsDxlw3rCgo1B+CQ1781WzQUSU3YjxgdkcJo9Q8S6LmXTkvI+cLHGkQfA==", + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.24.tgz", + "integrity": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==", "dev": true, "license": "MIT" }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -2073,10 +2194,17 @@ } } }, + "node_modules/alien-signals": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", + "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", + "dev": true, + "license": "MIT" + }, "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -2087,16 +2215,16 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { @@ -2126,10 +2254,20 @@ "dev": true, "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.25", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz", + "integrity": "sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2137,9 +2275,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "dev": true, "funding": [ { @@ -2157,10 +2295,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -2169,20 +2308,10 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001660", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", - "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", + "version": "1.0.30001754", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", + "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", "dev": true, "funding": [ { @@ -2201,61 +2330,32 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.0.tgz", + "integrity": "sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 16" + "node": ">=18" } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, @@ -2264,6 +2364,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -2275,24 +2376,10 @@ "dev": true, "license": "MIT" }, - "node_modules/computeds": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", - "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, "node_modules/confbox": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", "dev": true, "license": "MIT" }, @@ -2304,9 +2391,9 @@ "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -2330,6 +2417,7 @@ "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", "license": "ISC", + "peer": true, "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -2371,6 +2459,7 @@ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "license": "ISC", + "peer": true, "dependencies": { "internmap": "1 - 2" }, @@ -2383,6 +2472,7 @@ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -2392,6 +2482,7 @@ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "license": "ISC", + "peer": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -2408,6 +2499,7 @@ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "license": "ISC", + "peer": true, "dependencies": { "d3-path": "1 - 3" }, @@ -2420,6 +2512,7 @@ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -2429,6 +2522,7 @@ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", "license": "ISC", + "peer": true, "dependencies": { "d3-array": "^3.2.0" }, @@ -2441,6 +2535,7 @@ "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "license": "ISC", + "peer": true, "dependencies": { "delaunator": "5" }, @@ -2453,6 +2548,7 @@ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -2462,6 +2558,7 @@ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "license": "ISC", + "peer": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -2475,6 +2572,7 @@ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "license": "ISC", + "peer": true, "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -2500,6 +2598,7 @@ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=12" } @@ -2509,6 +2608,7 @@ "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "license": "ISC", + "peer": true, "dependencies": { "d3-dsv": "1 - 3" }, @@ -2521,6 +2621,7 @@ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "license": "ISC", + "peer": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -2535,6 +2636,7 @@ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -2544,6 +2646,7 @@ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", "license": "ISC", + "peer": true, "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -2556,6 +2659,7 @@ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -2565,6 +2669,7 @@ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "license": "ISC", + "peer": true, "dependencies": { "d3-color": "1 - 3" }, @@ -2577,6 +2682,7 @@ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -2586,6 +2692,7 @@ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -2595,6 +2702,7 @@ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -2604,6 +2712,7 @@ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -2613,6 +2722,7 @@ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "license": "ISC", + "peer": true, "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -2629,6 +2739,7 @@ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "license": "ISC", + "peer": true, "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -2642,6 +2753,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -2651,6 +2763,7 @@ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "license": "ISC", + "peer": true, "dependencies": { "d3-path": "^3.1.0" }, @@ -2663,6 +2776,7 @@ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "license": "ISC", + "peer": true, "dependencies": { "d3-array": "2 - 3" }, @@ -2675,6 +2789,7 @@ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "license": "ISC", + "peer": true, "dependencies": { "d3-time": "1 - 3" }, @@ -2687,6 +2802,7 @@ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -2696,6 +2812,7 @@ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "license": "ISC", + "peer": true, "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -2715,6 +2832,7 @@ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "license": "ISC", + "peer": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -2734,9 +2852,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -2751,25 +2869,26 @@ } } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/delaunator": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", "license": "ISC", + "peer": true, "dependencies": { "robust-predicates": "^3.0.2" } }, + "node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2778,9 +2897,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.25", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", - "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", + "version": "1.5.249", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.249.tgz", + "integrity": "sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==", "dev": true, "license": "ISC" }, @@ -2804,10 +2923,17 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2815,32 +2941,35 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/escalade": { @@ -2853,16 +2982,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -2870,6 +2989,23 @@ "dev": true, "license": "MIT" }, + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2877,14 +3013,32 @@ "dev": true, "license": "MIT" }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "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==", "dev": true, "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -2895,18 +3049,18 @@ } }, "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=14.14" } }, "node_modules/fsevents": { @@ -2944,26 +3098,16 @@ "node": ">=6.9.0" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/glob": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", - "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" @@ -2978,16 +3122,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2996,13 +3130,13 @@ "license": "ISC" }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/hasown": { @@ -3033,6 +3167,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -3055,14 +3190,15 @@ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "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": { @@ -3093,9 +3229,9 @@ "license": "ISC" }, "node_modules/jackspeak": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -3106,9 +3242,6 @@ }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jju": { @@ -3122,20 +3255,19 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-schema-traverse": { @@ -3159,11 +3291,14 @@ } }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -3176,14 +3311,15 @@ "license": "MIT" }, "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", "dev": true, "license": "MIT", "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" }, "engines": { "node": ">=14" @@ -3203,7 +3339,6 @@ "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", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -3212,16 +3347,6 @@ "loose-envify": "cli.js" } }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3233,23 +3358,23 @@ } }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { "node": "20 || >=22" @@ -3269,16 +3394,35 @@ } }, "node_modules/mlly": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", - "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.1.1", - "ufo": "^1.5.3" + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, "node_modules/ms": { @@ -3296,9 +3440,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -3315,16 +3459,16 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, "license": "BlueOak-1.0.0" }, @@ -3353,9 +3497,9 @@ "license": "MIT" }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -3370,9 +3514,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", - "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", "dev": true, "license": "ISC", "engines": { @@ -3380,58 +3524,48 @@ } }, "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pkg-types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", - "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.7.1", - "pathe": "^1.1.2" + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -3449,8 +3583,8 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -3467,12 +3601,29 @@ "node": ">=6" } }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "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", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -3480,16 +3631,63 @@ "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==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, "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.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", + "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@remix-run/router": "1.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", + "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@remix-run/router": "1.23.0", + "react-router": "6.30.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -3501,19 +3699,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3522,16 +3723,17 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "license": "Unlicense" + "license": "Unlicense", + "peer": true }, "node_modules/rollup": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz", - "integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==", + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.1.tgz", + "integrity": "sha512-n2I0V0lN3E9cxxMqBCT3opWOiQBzRN7UG60z/WDKqdX2zHUS/39lezBcsckZFsV6fUTSnfqI7kHf60jDAPGKug==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -3541,22 +3743,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.3", - "@rollup/rollup-android-arm64": "4.21.3", - "@rollup/rollup-darwin-arm64": "4.21.3", - "@rollup/rollup-darwin-x64": "4.21.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", - "@rollup/rollup-linux-arm-musleabihf": "4.21.3", - "@rollup/rollup-linux-arm64-gnu": "4.21.3", - "@rollup/rollup-linux-arm64-musl": "4.21.3", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", - "@rollup/rollup-linux-riscv64-gnu": "4.21.3", - "@rollup/rollup-linux-s390x-gnu": "4.21.3", - "@rollup/rollup-linux-x64-gnu": "4.21.3", - "@rollup/rollup-linux-x64-musl": "4.21.3", - "@rollup/rollup-win32-arm64-msvc": "4.21.3", - "@rollup/rollup-win32-ia32-msvc": "4.21.3", - "@rollup/rollup-win32-x64-msvc": "4.21.3", + "@rollup/rollup-android-arm-eabi": "4.53.1", + "@rollup/rollup-android-arm64": "4.53.1", + "@rollup/rollup-darwin-arm64": "4.53.1", + "@rollup/rollup-darwin-x64": "4.53.1", + "@rollup/rollup-freebsd-arm64": "4.53.1", + "@rollup/rollup-freebsd-x64": "4.53.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.1", + "@rollup/rollup-linux-arm-musleabihf": "4.53.1", + "@rollup/rollup-linux-arm64-gnu": "4.53.1", + "@rollup/rollup-linux-arm64-musl": "4.53.1", + "@rollup/rollup-linux-loong64-gnu": "4.53.1", + "@rollup/rollup-linux-ppc64-gnu": "4.53.1", + "@rollup/rollup-linux-riscv64-gnu": "4.53.1", + "@rollup/rollup-linux-riscv64-musl": "4.53.1", + "@rollup/rollup-linux-s390x-gnu": "4.53.1", + "@rollup/rollup-linux-x64-gnu": "4.53.1", + "@rollup/rollup-linux-x64-musl": "4.53.1", + "@rollup/rollup-openharmony-arm64": "4.53.1", + "@rollup/rollup-win32-arm64-msvc": "4.53.1", + "@rollup/rollup-win32-ia32-msvc": "4.53.1", + "@rollup/rollup-win32-x64-gnu": "4.53.1", + "@rollup/rollup-win32-x64-msvc": "4.53.1", "fsevents": "~2.3.2" } }, @@ -3564,13 +3772,24 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "license": "MIT", + "peer": true + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/semver": { "version": "6.3.1", @@ -3660,9 +3879,9 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, @@ -3741,9 +3960,9 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -3794,16 +4013,19 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -3827,56 +4049,43 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", - "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, "license": "MIT" }, - "node_modules/tinypool": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", - "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, "license": "MIT", "engines": { "node": ">=14.0.0" } }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3888,33 +4097,33 @@ } }, "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", "dev": true, "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": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "dev": true, "funding": [ { @@ -3932,8 +4141,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -3953,34 +4162,38 @@ } }, "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", + "peer": true, "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/vite": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", - "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz", + "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -3989,19 +4202,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -4022,50 +4241,31 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz", - "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.6", - "pathe": "^1.1.2", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/vite-plugin-dts": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.2.1.tgz", - "integrity": "sha512-/QlYvgUMiv8+ZTEerhNCYnYaZMM07cdlX6hQCR/w/g/nTh0tUXPoYwbT6SitizLJ9BybT1lnrcZgqheI6wromQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", + "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/api-extractor": "7.47.7", - "@rollup/pluginutils": "^5.1.0", - "@volar/typescript": "^2.4.4", - "@vue/language-core": "2.1.6", + "@microsoft/api-extractor": "^7.50.1", + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.11", + "@vue/language-core": "2.2.0", "compare-versions": "^6.1.1", - "debug": "^4.3.6", + "debug": "^4.4.0", "kolorist": "^1.8.0", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.11" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17" }, "peerDependencies": { "typescript": "*", @@ -4078,59 +4278,63 @@ } }, "node_modules/vite-plugin-externalize-deps": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/vite-plugin-externalize-deps/-/vite-plugin-externalize-deps-0.8.0.tgz", - "integrity": "sha512-MdC8kRNQ1ZjhUicU2HcqGVhL0UUFqv83Zp1JZdHjE82PoPR8wsSWZ3axpot7B6img3sW6g8shYJikE0CKA0chA==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/vite-plugin-externalize-deps/-/vite-plugin-externalize-deps-0.10.0.tgz", + "integrity": "sha512-eQrtpT/Do7AvDn76l1yL6ZHyXJ+UWH2LaHVqhAes9go54qaAnPZuMbgxcroQ/7WY3ZyetZzYW2quQnDF0DV5qg==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/voracious" }, "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/vitest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz", - "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.8.tgz", + "integrity": "sha512-urzu3NCEV0Qa0Y2PwvBtRgmNtxhj5t5ULw7cuKhIHh3OrkKTLlut0lnBOv9qe5OvbkMH2g38G7KPDCTpIytBVg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "2.1.1", - "@vitest/mocker": "2.1.1", - "@vitest/pretty-format": "^2.1.1", - "@vitest/runner": "2.1.1", - "@vitest/snapshot": "2.1.1", - "@vitest/spy": "2.1.1", - "@vitest/utils": "2.1.1", - "chai": "^5.1.1", - "debug": "^4.3.6", - "magic-string": "^0.30.11", - "pathe": "^1.1.2", - "std-env": "^3.7.0", + "@vitest/expect": "4.0.8", + "@vitest/mocker": "4.0.8", + "@vitest/pretty-format": "4.0.8", + "@vitest/runner": "4.0.8", + "@vitest/snapshot": "4.0.8", + "@vitest/spy": "4.0.8", + "@vitest/utils": "4.0.8", + "debug": "^4.4.3", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", "tinybench": "^2.9.0", - "tinyexec": "^0.3.0", - "tinypool": "^1.0.0", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.1.1", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.1", - "@vitest/ui": "2.1.1", + "@types/debug": "^4.1.12", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.8", + "@vitest/browser-preview": "4.0.8", + "@vitest/browser-webdriverio": "4.0.8", + "@vitest/ui": "4.0.8", "happy-dom": "*", "jsdom": "*" }, @@ -4138,10 +4342,19 @@ "@edge-runtime/vm": { "optional": true }, + "@types/debug": { + "optional": true + }, "@types/node": { "optional": true }, - "@vitest/browser": { + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { "optional": true }, "@vitest/ui": { @@ -4156,9 +4369,9 @@ } }, "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "dev": true, "license": "MIT" }, @@ -4258,26 +4471,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4313,19 +4506,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/package.json b/package.json index e1d7f92..95b7abf 100644 --- a/package.json +++ b/package.json @@ -1,36 +1,37 @@ { "name": "@armco/utils", - "version": "0.0.18", + "version": "0.0.29", "type": "module", "scripts": { "build": "./build-tools/build.sh", + "build:sm": "./build-tools/build.sh --dev", "format": "prettier --write .", "lint": "eslint .", "publish:sh": "./publish.sh", "publish:local": "./publish-local.sh" }, - "devDependencies": { - "@types/d3": "^7.4.3", - "@types/node": "^22.5.5", - "@types/react": "^18.3.7", - "@types/uuid": "^10.0.0", - "@vitejs/plugin-react": "^4.3.1", - "glob": "^11.0.0", - "react": "^18.3.1", - "typescript": "^5.0.2", - "vite": "^5.4.6", - "vite-plugin-dts": "^4.2.1", - "vite-plugin-externalize-deps": "^0.8.0", - "vitest": "^2.1.1" - }, "dependencies": { - "@armco/configs": "^0.0.7", - "@armco/types": "^0.0.9", - "d3": "^7.9.0", - "uuid": "^10.0.0" + "@armco/configs": "^0.0.12" }, "peerDependencies": { - "react": ">16.8.1" + "@armco/types": "^0.0.18", + "d3": "^7.9.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.18.2", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@armco/types": "^0.0.21", + "@types/d3": "^7.4.3", + "@types/node": "^24.10.0", + "@types/react": "^19.2.2", + "@vitejs/plugin-react": "^5.1.0", + "glob": "^11.0.3", + "react-dom": "18.3.1", + "typescript": "^5.9.3", + "vite-plugin-dts": "^4.5.4", + "vite-plugin-externalize-deps": "^0.10.0", + "vitest": "^4.0.8" }, "eslintConfig": { "plugins": [ @@ -46,7 +47,7 @@ "types": "build/types/index.d.ts", "repository": { "type": "git", - "url": "git+https://github.com/ReStruct-Corporate-Advantage/utils.git" + "url": "git+https://gitea.armco.dev/ReStruct-Corporate-Advantage/utils.git" }, "files": [ "build" @@ -59,7 +60,7 @@ ], "license": "ISC", "bugs": { - "url": "https://github.com/ReStruct-Corporate-Advantage/utils/issues" + "url": "https://gitea.armco.dev/ReStruct-Corporate-Advantage/utils/issues" }, - "homepage": "https://github.com/ReStruct-Corporate-Advantage/utils#readme" + "homepage": "https://gitea.armco.dev/ReStruct-Corporate-Advantage/utils#readme" } diff --git a/publish.sh b/publish.sh index 94621ea..12314a8 100755 --- a/publish.sh +++ b/publish.sh @@ -6,11 +6,23 @@ set -e npm --no-git-tag-version version ${semver} npm run build cp package.json build/ -sed -i '' -E 's/"build"/"*"/' build/package.json -sed -i '' 's#"build/cjs/index.js"#"cjs/index.js"#' build/package.json -sed -i '' 's#"build/es/index.js"#"es/index.js"#' build/package.json -sed -i '' 's#"build/types/index.d.ts"#"types/index.d.ts"#' build/package.json +# Use Node.js for portable package.json normalization +# Pass the target path via env var to avoid Node treating it as a module/script argument +PKG_PATH="$(pwd)/build/package.json" node - <<'EOF' +const fs = require('fs'); +const path = process.env.PKG_PATH; +const pkg = JSON.parse(fs.readFileSync(path, 'utf8')); +pkg.private = false; +delete pkg.scripts; +delete pkg.devDependencies; +if (!pkg.files) pkg.files = ['*']; +else pkg.files = pkg.files.map(x => x === 'build' ? '*' : x); +['main','module','types'].forEach(k => { + if (pkg[k]) pkg[k] = pkg[k].replace(/^build\//, ''); +}); +fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + '\n'); +EOF cd build npm publish --access public --loglevel verbose diff --git a/react-app-env.d/package.json b/react-app-env.d/package.json new file mode 100644 index 0000000..5d87b8e --- /dev/null +++ b/react-app-env.d/package.json @@ -0,0 +1,6 @@ +{ + "name": "@armco/utils/react-app-env.d", + "main": "../build/cjs/react-app-env.d.js", + "module": "../build/es/react-app-env.d.js", + "types": "../build/types/react-app-env.d.d.ts" +} \ No newline at end of file diff --git a/src/adapters.ts b/src/adapters.ts deleted file mode 100644 index 3d81edf..0000000 --- a/src/adapters.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { - ComponentDescription, - ProgressiveChartData, - ThreeDChartDataArrayFormat, - ThreeDChartDataObjectFormat, - TreeListData, - RecusionConditionTypes, -} from "@armco/types" -import { injectIds } from "./recursionHelper" - -const years = Array.from({ length: 60 }, (_, i) => 1964 + i) -const countries = ["IN", "US", "RU", "CN", "UK", "JP", "FR", "IT", "SP"] - -// Shuffle the years -for (let i = years.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)) - ;[years[i], years[j]] = [years[j], years[i]] -} - -const dummyProgressiveChartData: ThreeDChartDataArrayFormat = countries.flatMap( - (country) => { - return years.map((year) => { - return [year, country, Math.floor(Math.random() * 100000000000000)] as [ - string | number, - string | number, - number, - ] - }) - }, -) - -export function adaptToTreeFromComponentConfig(data: any): Array { - const returnTreeList: Array = [] - Object.keys(data).forEach((key) => { - const groupConfig = data[key as keyof any] - const components = groupConfig.components - components.sort((c1: ComponentDescription, c2: ComponentDescription) => - (c1.name as any) > (c2.name as any) ? 1 : -1, - ) - const obj: TreeListData = { - label: groupConfig.label, - children: [], - data: { ...groupConfig }, - } - components.forEach((item: any) => { - const treeItem: TreeListData = { - label: typeof item === "string" ? item : item.name, - data: { - component: typeof item === "string" ? item : item.name, - hierarchy: key, - }, - } - const children: Array = [] - treeItem.children = children - if (item.variants && Object.keys(item.variants.length > 0)) { - Object.keys(item.variants).forEach((variantKey) => { - const variants = item.variants[variantKey] - treeItem.children && - treeItem.children.push({ - label: variantKey, - data: { name: typeof item === "string" ? item : item.name }, - children: variants.map((v: string) => ({ - label: v, - data: { - component: typeof item === "string" ? item : item.name, - props: { [variantKey]: v }, - hierarchy: key, - }, - })), - }) - }) - } - obj.children && obj.children.push(treeItem) - }) - returnTreeList.push(obj) - }) - injectIds({ - data: returnTreeList, - condition: { type: RecusionConditionTypes.KEY_EXISTS, key: "label" }, - iterateOn: "children", - }) - return returnTreeList -} - -export function adaptToProgressiveChart( - inputData: ProgressiveChartData, - demo?: boolean, -): ThreeDChartDataObjectFormat { - if (demo && !inputData) { - inputData = dummyProgressiveChartData - } - let unsortedData: ThreeDChartDataObjectFormat = {} - - // Transform the data into the desired format - if (Array.isArray(inputData)) { - inputData.forEach(([key, xValue, yValue]) => { - if (!unsortedData[key]) { - unsortedData[key] = [[xValue, yValue]] - } else { - unsortedData[key].push([xValue, yValue]) - } - }) - } else { - unsortedData = inputData - } - - // Sort the keys - const keys = Object.keys(unsortedData) - keys.sort((a, b) => { - if (typeof a === "number" && typeof b === "number") { - return a - b - } else { - return a.localeCompare(b) - } - }) - - // Create a new object with the sorted keys - let sortedData: ThreeDChartDataObjectFormat = {} - keys.forEach((key) => { - sortedData[key] = unsortedData[key] - }) - - return sortedData -} diff --git a/src/chartGenerators.ts b/src/chartGenerators.ts deleted file mode 100644 index 6c221b0..0000000 --- a/src/chartGenerators.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as d3 from "d3" -import { ArrayType, ObjectType } from "@armco/types" - -export const generateBubbleChart = (data: ArrayType | ObjectType) => { - const svg = d3.select("#ar-ArViz__chart-container") - if (svg && data) { - svg - .selectAll("circle") - .data(data as ArrayType) - .enter() - .append("circle") - .attr("cx", function (d) { - return (d as ObjectType).x as number - }) - .attr("cy", function (d) { - return (d as ObjectType).y as number - }) - .attr("r", function (d) { - return Math.sqrt((d as ObjectType).val as number) / Math.PI - }) - .attr("fill", function (d) { - return (d as ObjectType).color as string - }) - - // Step 5 - svg - .selectAll("text") - .data(data as ArrayType) - .enter() - .append("text") - .attr("x", function (d) { - const x = (d as ObjectType).x as number - const sqrt = Math.sqrt((d as ObjectType).val as number) as number - return x + sqrt / Math.PI - }) - .attr("y", function (d) { - return ((d as ObjectType).y as number) + 4 - }) - .text(function (d) { - return (d as ObjectType).source as string - }) - .style("font-family", "arial") - .style("font-size", "12px") - } -} diff --git a/src/contexts.ts b/src/contexts.ts index fa50951..135c136 100644 --- a/src/contexts.ts +++ b/src/contexts.ts @@ -18,4 +18,5 @@ export const ArContext = createContext({ setRightPanelContent: () => {}, setTheme: () => {}, setUser: () => {}, + clearUser: () => {}, }) diff --git a/src/dateHelper.ts b/src/dateHelper.ts deleted file mode 100644 index 7c529f0..0000000 --- a/src/dateHelper.ts +++ /dev/null @@ -1,546 +0,0 @@ -import { CalendarDate, Event, ArDateFormats } from "@armco/types" -import { MONTH_INDEX } from "@armco/configs/constants" -import { pad } from "./helper" - -export interface CalendarOptions { - /** - * Date object indicating the selected start date - */ - startDate?: CalendarDate | null - - /** - * Date object indicating the selected end date - */ - endDate?: CalendarDate | null - - /** - * Calculate dates from sibling months (before and after the current month, based on weekStart) - */ - siblingMonths?: boolean - - /** - * Calculate the week days - */ - weekNumbers?: boolean - - /** - * Day of the week to start the calendar, respects `Date.prototype.getDay` (defaults to `0`, Sunday) - */ - weekStart?: number -} - -export const sub = (num: number, separator?: string) => { - return ("" + num).substring(2) + (separator ? separator : "") -} - -export const str = (num: number, trim?: boolean, separator?: string) => { - const month = MONTH_INDEX[num] - return (trim ? month.substring(0, 4) : month) + (separator ? separator : "") -} - -export type CalendarInstance = Calendar -/** - * Calendar object - */ -class Calendar { - startDate: CalendarDate | null - endDate: CalendarDate | null - siblingMonths: boolean - weekNumbers: boolean - weekStart: number - - /** - * Calendar constructor - * - * @param options Calendar options - */ - constructor({ - startDate = null, - endDate = null, - siblingMonths = false, - weekNumbers = false, - weekStart = 0, - }: CalendarOptions = {}) { - this.startDate = startDate - this.endDate = endDate - this.siblingMonths = siblingMonths - this.weekNumbers = weekNumbers - this.weekStart = weekStart - } - - /** - * Calculate a calendar month - * - * @param year Year - * @param month Month [0-11] - * @return Calendar days - */ - getCalendar(year: number, month: number) { - const date = new Date(Date.UTC(year, month, 1, 0, 0, 0, 0)) - - year = date.getFullYear() - month = date.getMonth() - - const calendar: (CalendarDate | false)[] = [] - const firstDay = date.getDay() - const firstDate = -((7 - this.weekStart + firstDay) % 7) - const lastDate = Calendar.daysInMonth(year, month) - const lastDay = (lastDate - firstDate) % 7 - const lastDatePreviousMonth = Calendar.daysInMonth(year, month - 1) - - let i = firstDate - let currentDay - let currentDate - let currentDateObject: CalendarDate | false = false - let currentWeekNumber = null - let otherMonth - let otherYear - - const max = lastDate - i + (lastDay !== 0 ? 7 - lastDay : 0) + firstDate - - while (i < max) { - currentDate = i + 1 - currentDay = ((i < 1 ? 7 + i : i) + firstDay) % 7 - if (currentDate < 1 || currentDate > lastDate) { - if (this.siblingMonths) { - if (currentDate < 1) { - otherMonth = month - 1 - otherYear = year - if (otherMonth < 0) { - otherMonth = 11 - otherYear-- - } - currentDate = lastDatePreviousMonth + currentDate - } else if (currentDate > lastDate) { - otherMonth = month + 1 - otherYear = year - if (otherMonth > 11) { - otherMonth = 0 - otherYear++ - } - currentDate = i - lastDate + 1 - } - - if (otherMonth !== undefined && otherYear !== undefined) { - currentDateObject = { - day: currentDate, - weekDay: currentDay, - month: otherMonth, - year: otherYear, - siblingMonth: true, - } - } - } else { - currentDateObject = false - } - } else { - currentDateObject = { - day: currentDate, - weekDay: currentDay, - month: month, - year: year, - } - } - - if (currentDateObject && this.weekNumbers) { - if (currentWeekNumber === null) { - currentWeekNumber = Calendar.calculateWeekNumber(currentDateObject) - } else if (currentDay === 1 && currentWeekNumber === 52) { - currentWeekNumber = 1 - } else if (currentDay === 1) { - currentWeekNumber++ - } - currentDateObject.weekNumber = currentWeekNumber - } - - if (currentDateObject && this.startDate) { - currentDateObject.selected = this.isDateSelected(currentDateObject) - } - - calendar.push(currentDateObject) - i++ - } - - return calendar - } - - /** - * Checks if a date is selected - * - * @param date Date object - * @return Selected status of the date - */ - isDateSelected(date: CalendarDate, endDate?: CalendarDate | null) { - // Hack to disregard this.endDate in further calculations for finding selectable candidates (hovered) - // by explicitly sending a "null" endDate, if endDate is not sent at all (undefined) then only function behaves as - // initially intended and considers endDate for calculations - if (!this.startDate || endDate === null) { - return false - } - let startDate = this.startDate - if (endDate) { - if (Calendar.compare(this.startDate, endDate) === 1) { - startDate = endDate - endDate = this.startDate - } - } else { - endDate = this.endDate - } - if ( - date.year === startDate.year && - date.month === startDate.month && - date.day === startDate.day - ) { - return true - } - - if (!endDate) { - return false - } - - if ( - date.year === startDate.year && - date.month === startDate.month && - date.day < startDate.day - ) { - return false - } - - if ( - date.year === endDate.year && - date.month === endDate.month && - date.day > endDate.day - ) { - return false - } - - if (date.year === startDate.year && date.month < startDate.month) { - return false - } - - if (date.year === endDate.year && date.month > endDate.month) { - return false - } - - if (date.year < startDate.year) { - return false - } - - if (date.year > endDate.year) { - return false - } - - return true - } - - /** - * Sets the selected period start - * - * @param date Date object - */ - setStartDate(date: CalendarDate | null) { - this.startDate = date - } - - /** - * Sets the selected period end - * - * @param date Date object - */ - setEndDate(date: CalendarDate | null) { - this.endDate = date - } - - /** - * Sets one selected date - * - * @param date Date object - */ - setDate(date: CalendarDate) { - return this.setStartDate(date) - } - - /** - * Calculates the difference between two dates (date1 - date2), in days - * - * @param dateLeft Date object - * @param dateRight Date object - * @return Days between the dates - */ - static diff(dateLeft: CalendarDate, dateRight: CalendarDate) { - const dateLeftDate = new Date( - Date.UTC(dateLeft.year, dateLeft.month, dateLeft.day, 0, 0, 0, 0), - ) - const dateRightDate = new Date( - Date.UTC(dateRight.year, dateRight.month, dateRight.day, 0, 0, 0, 0), - ) - return Math.ceil( - (dateLeftDate.getTime() - dateRightDate.getTime()) / 86400000, - ) - } - - /** - * Calculates the interval between two dates - * - * @param dateLeft Date object - * @param dateRight Date object - * @return Number of days between dates - */ - static interval(dateLeft: CalendarDate, dateRight: CalendarDate) { - return Math.abs(Calendar.diff(dateLeft, dateRight)) + 1 - } - - /** - * Quickly compare two dates - * - * @param dateLeft Left `CalendarDate` object - * @param dateRight Right `CalendarDate` object - * @return Comparison result: -1 (left < right), 0 (equal) or 1 (left > right) - */ - static compare(dateLeft: CalendarDate, dateRight: CalendarDate) { - if ( - typeof dateLeft !== "object" || - typeof dateRight !== "object" || - dateLeft === null || - dateRight === null - ) { - throw new TypeError("dates must be objects") - } - - if (dateLeft.year < dateRight.year) { - return -1 - } - - if (dateLeft.year > dateRight.year) { - return 1 - } - - if (dateLeft.month < dateRight.month) { - return -1 - } - - if (dateLeft.month > dateRight.month) { - return 1 - } - - if (dateLeft.day < dateRight.day) { - return -1 - } - - if (dateLeft.day > dateRight.day) { - return 1 - } - - return 0 - } - - /** - * Calculates the number of days in a month - * - * @param year Year - * @param month Month [0-11] - * @return Length of the month - */ - static daysInMonth(year: number, month: number) { - return new Date(year, month + 1, 0).getDate() - } - - /** - * Calculates if a given year is a leap year - * - * @param year Year - * @return Leap year or not - */ - static isLeapYear(year: number) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 - } - - /** - * Calculates the week number for a given date - * - * @param date Date object - * @return Week number - */ - // Adapted from http://techblog.procurios.nl/k/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html - static calculateWeekNumber(date: CalendarDate) { - // Creates the requested date - const current = new Date( - Date.UTC(date.year, date.month, date.day, 0, 0, 0, 0), - ) - - // Create a copy of the object - const target = new Date(current.valueOf()) - - // ISO week date weeks start on monday so correct the day number - const dayNr = (current.getUTCDay() + 6) % 7 - - // ISO 8601 states that week 1 is the week with the first thursday of that - // year. Set the target date to the thursday in the target week. - target.setUTCDate(target.getUTCDate() - dayNr + 3) - - // Store the millisecond value of the target date - const firstThursday = target.valueOf() - - // Set the target to the first thursday of the year - - // First set the target to january first - target.setUTCMonth(0, 1) - - // Not a thursday? Correct the date to the next thursday - if (target.getUTCDay() !== 4) { - target.setUTCMonth(0, 1 + ((4 - target.getUTCDay() + 7) % 7)) - } - - // The week number is the number of weeks between the first thursday of the - // year and the thursday in the target week. - // 604800000 = 7 * 24 * 3600 * 1000 - return 1 + Math.ceil((firstThursday - target.getTime()) / 604800000) - } - - static toString( - date: CalendarDate, - separator: string = "/", - format: string = "DDMMYYYY", - ) { - const day = pad(date.day, separator) - const month = pad(date.month + 1, separator) - const year = date.year - - switch (format) { - case ArDateFormats.MMDDYY: - return month + day + sub(year) - case ArDateFormats.DDMMYYYY: - return day + month + year - case ArDateFormats.MMDDYYYY: - return month + day + year - case ArDateFormats.DDMMMYY: - return day + str(date.month + 1, true, separator) + sub(year) - case ArDateFormats.DDMMMYYYY: - return day + str(date.month + 1, true, separator) + year - case ArDateFormats.MMMDDYY: - return str(date.month + 1, true, separator) + day + sub(year) - case ArDateFormats.MMMDDYYYY: - return str(date.month + 1, true, separator) + day + year - case ArDateFormats.YYMMDD: - return sub(year) + month + day - case ArDateFormats.YYMMMDD: - return sub(year) + str(date.month + 1, true, separator) + day - case ArDateFormats.YYYYMMDD: - return year + month + day - case ArDateFormats.YYYYMMMDD: - return year + str(date.month + 1, true, separator) + day - case ArDateFormats.DDMMYY: - default: - return day + month + sub(year) - } - } - - static getPreviousMonth(date: Date) { - const month = date.getMonth() - const year = date.getFullYear() - - const previousMonth = month === 0 ? 11 : month - 1 - const previousYear = month === 0 ? year - 1 : year - - const returnDate = new Date() - returnDate.setDate(date.getDate()) - returnDate.setMonth(previousMonth) - returnDate.setFullYear(previousYear) - - return returnDate - } - - static getNextMonth(date: Date) { - const month = date.getMonth() - const year = date.getFullYear() - - const previousMonth = month === 11 ? 0 : month + 1 - const previousYear = month === 11 ? year + 1 : year - - const returnDate = new Date() - returnDate.setDate(date.getDate()) - returnDate.setMonth(previousMonth) - returnDate.setFullYear(previousYear) - - return returnDate - } - - static getPreviousYear(date: Date) { - const year = date.getFullYear() - const returnDate = new Date() - returnDate.setDate(date.getDate()) - returnDate.setMonth(date.getMonth()) - returnDate.setFullYear(year === 1 ? 1 : year - 1) - return returnDate - } - - static getNextYear(date: Date) { - const year = date.getFullYear() - const returnDate = new Date() - returnDate.setDate(date.getDate()) - returnDate.setMonth(date.getMonth()) - returnDate.setFullYear(year + 1) - return returnDate - } -} - -export const toDate = ( - calDate: CalendarDate, - hour?: number, - minute?: number, - ampm: string = "AM", -) => { - if (hour) { - let adjustedHour = hour - if (ampm === "PM" && hour !== 12) { - adjustedHour += 12 // Add 12 hours for PM time, except when it's 12 PM - } else if (ampm === "AM" && hour === 12) { - adjustedHour = 0 // 12 AM is equivalent to 0 hours - } - - return new Date( - calDate.year, - calDate.month, - calDate.day, - adjustedHour, - minute, - ) - } else return new Date(calDate.year, calDate.month, calDate.day) -} - -export const isWithinSchedule = (date: CalendarDate, event: Event) => { - const startDate = event.schedule?.starts - const endDate = event.schedule?.ends - - const startCalDate = startDate && { - day: (startDate as Date).getDate(), - month: (startDate as Date).getMonth(), - year: (startDate as Date).getFullYear(), - } - - const endCalDate = endDate && { - day: (endDate as Date).getDate(), - month: (endDate as Date).getMonth(), - year: (endDate as Date).getFullYear(), - } - - if (startCalDate && endCalDate) { - const checkStart = Calendar.compare(date, startCalDate) - const checkEnd = Calendar.compare(date, endCalDate) - const amPm = (endDate as Date) - ?.toLocaleString("en-US", { hour12: true }) - .split(" ")[2] - const shouldExcludeEnd = - (endDate as Date).getHours() === 0 && - amPm === "AM" && - date.day === endCalDate.day - - return checkStart >= 0 && checkEnd <= 0 && !shouldExcludeEnd - } - return false -} - -/** - * Exports the Calendar - */ -export { Calendar as CalHelper } diff --git a/src/dateformat.ts b/src/dateformat.ts deleted file mode 100644 index 0a633dd..0000000 --- a/src/dateformat.ts +++ /dev/null @@ -1,337 +0,0 @@ -import { ArDateMasks, FunctionType } from "@armco/types" - -const token = - /d{1,4}|D{3,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|W{1,2}|[LlopSZN]|"[^"]*"|'[^']*'/g -const timezone = - /\b(?:[A-Z]{1,3}[A-Z][TC])(?:[-+]\d{4})?|((?:Australian )?(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time)\b/g -const timezoneClip = /[^-+\dA-Z]/g - -/** - * @param {string | number | Date} date - * @param {string} mask - * @param {boolean} utc - * @param {boolean} gmt - */ -export function dateFormat( - date?: number | Date, - mask?: ArDateMasks | string, - utc?: boolean, - gmt?: boolean, -) { - // You can't provide utc if you skip other args (use the 'UTC:' mask prefix) - if (arguments.length === 1 && typeof date === "string" && !/\d/.test(date)) { - mask = date - date = undefined - } - - date = date || date === 0 ? date : new Date() - - if (isNaN(date as number)) { - throw TypeError("Invalid date") - } - - if (!(date instanceof Date)) { - date = new Date(date) - } - - mask = String( - ArDateMasksRecord[mask as string] || mask || ArDateMasksRecord["DEFAULT"], - ) - - // Allow setting the utc/gmt argument via the mask - const maskSlice = mask.slice(0, 4) - if (maskSlice === "UTC:" || maskSlice === "GMT:") { - mask = mask.slice(4) - utc = true - if (maskSlice === "GMT:") { - gmt = true - } - } - - const _ = () => (utc ? "getUTC" : "get") - const d = () => (date as Date)[(_() + "Date") as "getDate" | "getUTCDate"]() - const D = () => (date as Date)[(_() + "Day") as "getDay" | "getUTCDay"]() - const m = () => - (date as Date)[(_() + "Month") as "getMonth" | "getUTCMonth"]() - const y = () => - (date as Date)[(_() + "FullYear") as "getFullYear" | "getUTCFullYear"]() - const H = () => - (date as Date)[(_() + "Hours") as "getHours" | "getUTCHours"]() - const M = () => - (date as Date)[(_() + "Minutes") as "getMinutes" | "getUTCMinutes"]() - const s = () => - (date as Date)[(_() + "Seconds") as "getSeconds" | "getUTCSeconds"]() - const L = () => - (date as Date)[ - (_() + "Milliseconds") as "getMilliseconds" | "getUTCMilliseconds" - ]() - const o = () => (utc ? 0 : (date as Date).getTimezoneOffset()) - const W = () => date instanceof Date && getWeek(date) - const N = () => date instanceof Date && getDayOfWeek(date) - - const flags: { [key: string]: FunctionType } = { - d: () => d(), - dd: () => pad(d()), - ddd: () => i18n.dayNames[D()], - DDD: () => - getDayName({ - y: y(), - m: m(), - d: d(), - _: _(), - dayName: i18n.dayNames[D()], - short: true, - }), - dddd: () => i18n.dayNames[D() + 7], - DDDD: () => - getDayName({ - y: y(), - m: m(), - d: d(), - _: _(), - dayName: i18n.dayNames[D() + 7], - }), - m: () => m() + 1, - mm: () => pad(m() + 1), - mmm: () => i18n.monthNames[m()], - mmmm: () => i18n.monthNames[m() + 12], - yy: () => String(y()).slice(2), - yyyy: () => pad(y(), 4), - h: () => H() % 12 || 12, - hh: () => pad(H() % 12 || 12), - H: () => H(), - HH: () => pad(H()), - M: () => M(), - MM: () => pad(M()), - s: () => s(), - ss: () => pad(s()), - l: () => pad(L(), 3), - L: () => pad(Math.floor(L() / 10)), - t: () => (H() < 12 ? i18n.timeNames[0] : i18n.timeNames[1]), - tt: () => (H() < 12 ? i18n.timeNames[2] : i18n.timeNames[3]), - T: () => (H() < 12 ? i18n.timeNames[4] : i18n.timeNames[5]), - TT: () => (H() < 12 ? i18n.timeNames[6] : i18n.timeNames[7]), - Z: () => - gmt ? "GMT" : utc ? "UTC" : date instanceof Date && formatTimezone(date), - o: () => - (o() > 0 ? "-" : "+") + - pad(Math.floor(Math.abs(o()) / 60) * 100 + (Math.abs(o()) % 60), 4), - p: () => - (o() > 0 ? "-" : "+") + - pad(Math.floor(Math.abs(o()) / 60), 2) + - ":" + - pad(Math.floor(Math.abs(o()) % 60), 2), - S: () => - ["th", "st", "nd", "rd"][ - d() % 10 > 3 ? 0 : (+((d() % 100) - (d() % 10) !== 10) * d()) % 10 - ], - W: () => W(), - WW: () => { - const date = W() - date && pad(date) - }, - N: () => N(), - } - - return mask.replace(token, (match) => { - if (match in flags) { - return flags[match]() - } - return match.slice(1, match.length - 1) - }) -} - -const ArDateMasksRecord: Record = { - DEFAULT: ArDateMasks.DEFAULT, - SHORTDATE: ArDateMasks.SHORTDATE, - PADDEDSHORTDATE: ArDateMasks.PADDEDSHORTDATE, - MEDIUMDATE: ArDateMasks.MEDIUMDATE, - LONGDATE: ArDateMasks.LONGDATE, - FULLDATE: ArDateMasks.FULLDATE, - SHORTTIME: ArDateMasks.SHORTTIME, - MEDIUMTIME: ArDateMasks.MEDIUMTIME, - LONGTIME: ArDateMasks.LONGTIME, - ISODATE: ArDateMasks.ISODATE, - ISOTIME: ArDateMasks.ISOTIME, - ISODATETIME: ArDateMasks.ISODATETIME, - ISOUTCDATETIME: ArDateMasks.ISOUTCDATETIME, - EXPIRESHEADERFORMAT: ArDateMasks.EXPIRESHEADERFORMAT, -} - -// Internationalization strings -export let i18n = { - dayNames: [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - ], - monthNames: [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ], - timeNames: ["a", "p", "am", "pm", "A", "P", "AM", "PM"], -} - -const pad = (val: number, len = 2) => String(val).padStart(len, "0") - -/** - * Get day name - * Yesterday, Today, Tomorrow if the date lies within, else fallback to Monday - Sunday - * @param {Object} - * @return {String} - */ -const getDayName = ({ - y, - m, - d, - _, - dayName, - short = false, -}: { - y: number - m: number - d: number - _: string - dayName: string - short?: boolean -}) => { - const today = new Date() - const yesterday = new Date() - const tomorrow = new Date() - const dateAccessor = (_ + "Date") as "getDate" | "getUTCDate" - const monthAccessor = (_ + "Month") as "getMonth" | "getUTCMonth" - const yearAccessor = (_ + "FullYear") as "getFullYear" | "getUTCFullYear" - yesterday.setDate(yesterday[dateAccessor]() - 1) - tomorrow.setDate(tomorrow[dateAccessor]() + 1) - const today_d = () => today[dateAccessor]() - const today_m = () => today[monthAccessor]() - const today_y = () => today[yearAccessor]() - const yesterday_d = () => yesterday[dateAccessor]() - const yesterday_m = () => yesterday[monthAccessor]() - const yesterday_y = () => yesterday[yearAccessor]() - const tomorrow_d = () => tomorrow[dateAccessor]() - const tomorrow_m = () => tomorrow[monthAccessor]() - const tomorrow_y = () => tomorrow[yearAccessor]() - - if (today_y() === y && today_m() === m && today_d() === d) { - return short ? "Tdy" : "Today" - } else if ( - yesterday_y() === y && - yesterday_m() === m && - yesterday_d() === d - ) { - return short ? "Ysd" : "Yesterday" - } else if (tomorrow_y() === y && tomorrow_m() === m && tomorrow_d() === d) { - return short ? "Tmw" : "Tomorrow" - } - return dayName -} - -/** - * Get the ISO 8601 week number - * Based on comments from - * http://techblog.procurios.nl/k/n618/news/view/33796/14863/Calculate-ISO-8601-week-and-year-in-javascript.html - * - * @param {Date} `date` - * @return {Number} - */ -const getWeek = (date: Date) => { - // Remove time components of date - const targetThursday = new Date( - date.getFullYear(), - date.getMonth(), - date.getDate(), - ) - - // Change date to Thursday same week - targetThursday.setDate( - targetThursday.getDate() - ((targetThursday.getDay() + 6) % 7) + 3, - ) - - // Take January 4th as it is always in week 1 (see ISO 8601) - const firstThursday = new Date(targetThursday.getFullYear(), 0, 4) - - // Change date to Thursday same week - firstThursday.setDate( - firstThursday.getDate() - ((firstThursday.getDay() + 6) % 7) + 3, - ) - - // Check if daylight-saving-time-switch occurred and correct for it - const ds = - targetThursday.getTimezoneOffset() - firstThursday.getTimezoneOffset() - targetThursday.setHours(targetThursday.getHours() - ds) - - // Number of weeks between target Thursday and first Thursday - const weekDiff = - (targetThursday.getTime() - firstThursday.getTime()) / (86400000 * 7) - return 1 + Math.floor(weekDiff) -} - -/** - * Get ISO-8601 numeric representation of the day of the week - * 1 (for Monday) through 7 (for Sunday) - * - * @param {Date} `date` - * @return {Number} - */ -const getDayOfWeek = (date: Date) => { - let dow = date.getDay() - if (dow === 0) { - dow = 7 - } - return dow -} - -/** - * Get proper timezone abbreviation or timezone offset. - * - * This will fall back to `GMT+xxxx` if it does not recognize the - * timezone within the `timezone` RegEx above. Currently only common - * American and Australian timezone abbreviations are supported. - * - * @param {String | Date} date - * @return {String} - */ -export const formatTimezone = (date: Date) => { - const strDate = String(date) - const match = strDate.match(timezone) || [""] - return match - .pop() - ?.replace(timezoneClip, "") - .replace(/GMT\+0000/g, "UTC") -} - -export { dateFormat as DateFormatter } \ No newline at end of file diff --git a/src/domHelper.ts b/src/domHelper.ts index 4079032..03d066f 100644 --- a/src/domHelper.ts +++ b/src/domHelper.ts @@ -1,440 +1,3 @@ -import { Children } from "react" -import { - CarouselProps, - IconProps, - ArPopoverPositions, - ObjectType, - Position, -} from "@armco/types" -import { getStylesFromClass } from "./helper" - -const style = window.getComputedStyle(document.documentElement) -const fontSize = parseFloat(style.fontSize) -const markerSize = 7 - -export function outerWidth(el: HTMLElement) { - let width = el.offsetWidth - const style = getComputedStyle(el) - - width += parseInt(style.marginLeft) + parseInt(style.marginRight) - return width -} - -export function translate( - position: number, - metric: "px" | "%", - axis: "horizontal" | "vertical", -) { - const positionPercent = position === 0 ? position : position + metric - const positionCss = - axis === "horizontal" ? [positionPercent, 0, 0] : [0, positionPercent, 0] - const transitionProp = "translate3d" - - const translatedPosition = "(" + positionCss.join(",") + ")" - - return transitionProp + translatedPosition -} - -export function hexToHsl(color: string, returnRaw?: boolean) { - const [r, g, b] = hexToRgb(color) - return rgbToHsl(r, g, b, returnRaw) -} - -export function hexToRgb(color: string) { - const r = parseInt(color.substring(1, 3), 16) // Grab the hex representation of red (chars 1-2) and convert to decimal (base 10). - const g = parseInt(color.substring(3, 5), 16) - const b = parseInt(color.substring(5, 7), 16) - return [r, g, b] -} - -/** - * Converts an RGB color value to HSL. Conversion formula - * adapted from http://en.wikipedia.org/wiki/HSL_color_space. - * Assumes r, g, and b are contained in the set [0, 255] and - * returns h, s, and l in the set [0, 1]. - * - * @param Number r The red color value - * @param Number g The green color value - * @param Number b The blue color value - * @return Array The HSL representation - */ -export function rgbToHsl(r: number, g: number, b: number, returnRaw?: boolean) { - r /= 255 - g /= 255 - b /= 255 - - const max = Math.max(r, g, b), - min = Math.min(r, g, b) - let h, - s, - l = (max + min) / 2 - - if (max === min) { - h = s = 0 // achromatic - } else { - const d = max - min - s = l > 0.5 ? d / (2 - max - min) : d / (max + min) - - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0) - break - case g: - h = (b - r) / d + 2 - break - case b: - h = (r - g) / d + 4 - break - } - - // @ts-ignore - h /= 6 - } - const colorInHSL = "hsl(" + h + ", " + s + "%, " + l + "%)" - return returnRaw ? [h, s, l] : colorInHSL -} - -export function hslToRgb(h: number, s: number, l: number) { - let r, g, b - let hue2rgb - if (s === 0) { - r = g = b = l // achromatic - } else { - hue2rgb = (p: number, q: number, t: number) => { - if (t < 0) t += 1 - if (t > 1) t -= 1 - if (t < 1 / 6) return p + (q - p) * 6 * t - if (t < 1 / 2) return q - if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6 - return p - } - - const q = l < 0.5 ? l * (1 + s) : l + s - l * s - const p = 2 * l - q - - r = hue2rgb && hue2rgb(p, q, h + 1 / 3) - g = hue2rgb && hue2rgb(p, q, h) - b = hue2rgb && hue2rgb(p, q, h - 1 / 3) - } - - return [r * 255, g * 255, b * 255] -} - -export function rgbToHex(r: number, g: number, b: number) { - function componentToHex(c: number) { - var hex = c.toString(16) - return hex.length === 1 ? "0" + hex : hex - } - return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b) -} - -export function hslToHex(h: number, s: number, l: number) { - const [r, g, b] = hslToRgb(h, s, l) - return rgbToHex(Math.round(r), Math.round(g), Math.round(b)) -} - -export function implementSvgStyles( - svg: SVGSVGElement, - svgProps?: IconProps["attributes"], - flags?: Array, -) { - const { size, classes, colors, strokeWidth } = svgProps || {} - const { fillColor, strokeColor } = colors || {} - const [skipPathColorFill] = flags || [] - let styles = null - if (classes) { - styles = getStylesFromClass(classes) - styles = Object.entries(styles || {}) - .map(([property, value]) => `${property}: ${value}`) - .join("; ") - } - svg.setAttribute("height", size || "1rem") - svg.setAttribute("width", size || "1rem") - svg.setAttribute("class", classes || "") - svg.setAttribute("style", styles || "") - svg.setAttribute("stroke", strokeColor || "black") - strokeWidth - ? svg.setAttribute("stroke-width", strokeWidth) - : strokeColor && svg.setAttribute("stroke-width", "1") - let path: SVGPathElement | NodeListOf = - svg.querySelectorAll("path") - if (path.length === 1 && !skipPathColorFill) { - path = path[0] - // Override stroke and color of "path" node inside SVG at below line. - path && - strokeColor && - !!path.getAttribute("stroke") && - path.setAttribute("stroke", strokeColor) - path && - strokeWidth && - !!path.getAttribute("stroke-width") && - path.setAttribute("stroke-width", strokeWidth) - path && - fillColor && - !!path.getAttribute("fill") && - path.setAttribute("fill", fillColor) - } - svg.style.color = fillColor || "black" - return svg -} - -/** - * Gets the list 'position' relative to a current index - * @param index - */ -export function getPosition(index: number, props: CarouselProps): number { - if (props.infiniteLoop) { - // index has to be added by 1 because of the first cloned slide - ++index - } - - if (index === 0) { - return 0 - } - - const childrenLength = Children.count(props.children) - if (props.centerMode && props.axis === "horizontal") { - let currentPosition = -index * props.centerSlidePercentage - const lastPosition = childrenLength - 1 - - if (index && (index !== lastPosition || props.infiniteLoop)) { - currentPosition += (100 - props.centerSlidePercentage) / 2 - } else if (index === lastPosition) { - currentPosition += 100 - props.centerSlidePercentage - } - - return currentPosition - } - - return -index * 100 -} - -/** - * Sets the 'position' transform for sliding animations - * @param position - * @param forceReflow - */ -export function setPosition( - position: number, - axis: "horizontal" | "vertical", -): React.CSSProperties { - const style = {} - ;[ - "WebkitTransform", - "MozTransform", - "MsTransform", - "OTransform", - "transform", - "msTransform", - ].forEach((prop) => { - // @ts-ignore - style[prop] = CSSTranslate(position, "%", axis) - }) - - return style -} - -export function isKeyboardEvent( - e?: React.MouseEvent | React.KeyboardEvent, -): e is React.KeyboardEvent { - return e ? e.hasOwnProperty("key") : false -} - -export function getDocumentElement(demo?: boolean) { - // Check if the component is running inside an iframe - if (demo) { - const iframeElement = - document.querySelector(".ar-Editor__frame") - if (iframeElement) { - return iframeElement.contentDocument - } - } - // Return the parent document element by default - return document -} - -export function getWindowElement(demo?: boolean) { - // Check if the component is running inside an iframe - if (demo) { - const iframeElement = - document.querySelector(".ar-Editor__frame") - - if (iframeElement) { - return iframeElement.contentWindow - } - } - // Return the parent document element by default - return window -} - -export function shouldUsePosition( - position: ArPopoverPositions, - anchorRect: DOMRect, - popoverRect: DOMRect, - demo?: boolean, -) { - const windowObj = getWindowElement(demo) || window - const exceeds: ObjectType = { - bottom: - anchorRect.top + anchorRect.height + popoverRect.height > - windowObj.innerHeight, - right: - anchorRect.left + anchorRect.width + popoverRect.width > - windowObj.innerWidth, - left: anchorRect.left - popoverRect.width < 0, - top: anchorRect.top - popoverRect.height < 0, - } - if (exceeds[position]) return false - if (position === "left" || position === "right") { - if ( - fontSize > anchorRect.top || - fontSize > anchorRect.bottom - ) - return false - } else { - if ( - fontSize > anchorRect.left || - fontSize > anchorRect.right - ) - return false - } - return position -} - -export function adjustPosition( - position: ArPopoverPositions, - anchorRect: DOMRect, - popoverRect: DOMRect, - hideMarker?: boolean, - topOffset?: number, -) { - const popoverPositions: { [key: string]: Position } = { - [ArPopoverPositions.BOTTOM]: { - top: - anchorRect.top + - anchorRect.height + - (hideMarker ? 0 : markerSize) + - (topOffset || 0), - left: anchorRect.left + (anchorRect.width - popoverRect.width) / 2, - }, - [ArPopoverPositions.RIGHT]: { - top: anchorRect.top + (anchorRect.height - popoverRect.height) / 2, - left: - anchorRect.left + - anchorRect.width + - (hideMarker ? 0 : markerSize), - }, - [ArPopoverPositions.LEFT]: { - top: anchorRect.top + (anchorRect.height - popoverRect.height) / 2, - left: - anchorRect.left - - popoverRect.width - - (hideMarker ? 0 : markerSize), - }, - [ArPopoverPositions.TOP]: { - top: - anchorRect.top - - popoverRect.height - - (hideMarker ? 0 : markerSize) - - (topOffset || 0), - left: anchorRect.left + (anchorRect.width - popoverRect.width) / 2, - }, - } - let { left, top } = popoverPositions[position] - if ( - position === ArPopoverPositions.BOTTOM || - position === ArPopoverPositions.TOP - ) { - if ((left as number) < 0) { - left = fontSize - } - if ((left as number) + popoverRect.width > window.innerWidth) { - left = `calc(100% - ${popoverRect.width}px - ${fontSize}px)` - } - } else { - if ((top as number) < 0) { - top = fontSize - } - if ((top as number) + popoverRect.height > window.innerHeight) { - top = `calc(100% - ${popoverRect.height}px - ${fontSize}px)` - } - } - return { left, top } -} - -export function getPositionToUse( - anchorRect: DOMRect, - popoverRect: DOMRect, - requestedPosition?: ArPopoverPositions, - demo?: boolean, -) { - if (requestedPosition && requestedPosition !== ArPopoverPositions.AUTO) { - return requestedPosition - } - const positionsPriority = [ - ArPopoverPositions.BOTTOM, - ArPopoverPositions.RIGHT, - ArPopoverPositions.LEFT, - ArPopoverPositions.TOP, - ] - - for (const position of positionsPriority) { - if ( - shouldUsePosition(position, anchorRect, popoverRect, demo) - ) { - return position - } - continue - } - - return ArPopoverPositions.BOTTOM -} - -export function calculatePopoverPosition( - anchorRect: DOMRect, - popoverRect: DOMRect, - requestedPosition?: ArPopoverPositions, - hideMarker?: boolean, - clickCoordinates?: Array | null, - demo?: boolean, - topOffset?: number, -) { - const windowObj = getWindowElement(demo) || window - anchorRect = clickCoordinates - ? { - left: clickCoordinates[0], - x: clickCoordinates[0], - top: clickCoordinates[1], - y: clickCoordinates[1], - height: 0, - width: 0, - right: windowObj.screen.width - clickCoordinates[0], - bottom: windowObj.screen.height - clickCoordinates[1], - toJSON: () => {}, - } - : anchorRect - const position = getPositionToUse( - anchorRect, - popoverRect, - requestedPosition, - demo, - ) - const { left, top } = adjustPosition( - position, - anchorRect, - popoverRect, - hideMarker, - topOffset, - ) - return { - leftTop: { - top: ("" + top).startsWith("calc") ? top : top + "px", - left: ("" + left).startsWith("calc") ? left : left + "px", - }, - position, - } -} - export function openInNewTab(url: string) { const win = window.open(url, "_blank") if (win != null) { @@ -444,7 +7,8 @@ export function openInNewTab(url: string) { export function download(data: string | Blob, filename?: string) { const anchor = document.createElement("a") - anchor.href = typeof data === "string" ? data : window.URL.createObjectURL(data) + anchor.href = + typeof data === "string" ? data : window.URL.createObjectURL(data) anchor.download = filename || "edited-image.png" document.body.appendChild(anchor) anchor.click() diff --git a/src/enums.ts b/src/enums.ts new file mode 100644 index 0000000..c6803fb --- /dev/null +++ b/src/enums.ts @@ -0,0 +1,17 @@ +export enum ArThemes { + LIGHT1 = "th-light-1", + DARK1 = "th-dark-1", +} + +export enum ArAlertType { + SUCCESS = "success", + WARNING = "warning", + ERROR = "error", + INFORMATION = "information", +} + + +export enum RecusionConditionTypes { + KEY_EXISTS = "keyExists", + KEY_VALUE = "keyValue", +} \ No newline at end of file diff --git a/src/gridHelper.ts b/src/gridHelper.ts deleted file mode 100644 index 28d3d88..0000000 --- a/src/gridHelper.ts +++ /dev/null @@ -1,733 +0,0 @@ -import { v4 as uuid } from "uuid" -import { FunctionType, GridToolbarSpecs, SlotDescriptor } from "@armco/types" -import { getDocumentElement } from "./domHelper" - - // For x and y toolbars only -export function generateGridToolbarSpecs( - gridArea: Array>, - rowHeight?: Array | string, - colWidth?: Array | string, -) { - const rowToolsGridArea = gridArea.map((row) => [ - row.every((cell) => cell === row[0]) ? row[0] : "ga-" + uuid(), - ]) - const colToolsGridArea = gridArea[0].map((_, i) => - gridArea.every((row) => row[i] === gridArea[0][i]) - ? gridArea[0][i] - : "ga-" + uuid(), - ) - const rowSlots = countOccurrences( - rowToolsGridArea.map((ga) => ga[0]), - ).map((slotConfig) => { - return { - slot: slotConfig.slotId, - gridArea: slotConfig.slotId, - row: slotConfig.location, - column: 0, - rowSpan: slotConfig.span, - colSpan: 1, - style: { gridArea: slotConfig.slotId }, - } - }) - const colSlots = countOccurrences(colToolsGridArea).map( - (slotConfig) => { - return { - slot: slotConfig.slotId, - gridArea: slotConfig.slotId, - row: 0, - column: slotConfig.location, - rowSpan: 1, - colSpan: slotConfig.span, - style: { gridArea: slotConfig.slotId }, - } - }, - ) - return { - rowTools: { - slots: rowSlots, - gridTemplate: generateGridTemplate( - rowToolsGridArea, - rowHeight || "minmax(auto, 1fr)", - colWidth || "1fr", - ), - }, - colTools: { - slots: colSlots, - gridTemplate: generateGridTemplate( - [colToolsGridArea], - "1fr", - "1fr", - ), - }, - } -} - -export function calculateRowHeights( - slots: Array, - rowHeights?: Array | string, - demo?: boolean, -): Array { - const totalRows = Math.max(...slots.map((slot) => slot.row + slot.rowSpan)) - const allRowHeights: Array = [] - const doc = getDocumentElement(demo) - rowHeights = Array.isArray(rowHeights) - ? rowHeights - : (Array.from( - { length: totalRows }, - () => rowHeights || "minmax(2rem, auto)", - ) as Array) - - for (let rowIndex = 0; rowIndex < totalRows; rowIndex++) { - if ( - rowHeights[rowIndex] && - rowHeights[rowIndex] !== "" && - rowHeights[rowIndex].indexOf("auto") === -1 - ) { - allRowHeights[rowIndex] = rowHeights[rowIndex] - continue - } - - const rowSlots = slots.filter( - (slot) => slot.row <= rowIndex && rowIndex < slot.row + slot.rowSpan, - ) - const heights = rowSlots.map((slot) => { - const element = doc?.getElementById(slot.slot) - return element - ? Math.floor(element.getBoundingClientRect().height / slot.rowSpan) - : 0 - }) - const maxHeight = Math.max(...heights) - allRowHeights[rowIndex] = - maxHeight === 0 ? "minmax(2rem, auto)" : `${maxHeight}px` - } - - return allRowHeights -} - -export function generateGridAreaAndSizes( - slots: Array, - currentRowHeights?: string | Array, -): { gridArea: Array>; rowHeights: Array } { - let gridArea: Array> = [[]] - const rowHeights: Array = [] - slots.forEach((slot) => { - let endRow = slot.row + slot.rowSpan - let endColumn = slot.column + slot.colSpan - for (let row = slot.row; row < endRow; row++) { - const currentRowHeight = Array.isArray(currentRowHeights) - ? currentRowHeights[row] - : currentRowHeights - if (slot.content) { - rowHeights[row] = currentRowHeight || "auto" - } else { - rowHeights[row] = "minmax(2rem, auto)" - } - if (!gridArea[row]) { - gridArea[row] = [] - } - for (let col = slot.column; col < endColumn; col++) { - gridArea[row][col] = slot.gridArea - } - } - }) - - return { gridArea, rowHeights } -} - -export function generateGridTemplate( - gridArea: Array>, - rowHeight?: Array | string, - colWidth?: Array | string, -): string { - let areas = gridArea - .map( - (row, i) => - `"${row.join(" ")}" ${ - Array.isArray(rowHeight) - ? rowHeight[i] || "auto" - : rowHeight || "minmax(3rem, 1fr)" - }`, - ) - .join(" ") - - const gridTemplateColumns = - " / " + - (Array.isArray(colWidth) - ? colWidth.join(" ") - : Array.from( - { length: gridArea[0].length }, - () => colWidth || "1fr", - ).join(" ")) - areas += gridTemplateColumns - - return areas.trim() -} - -export function mergeHandler( - setSlots: FunctionType, - slotConfigs: Array, - minMaxSelections: { - minRow: number - maxRow: number - minColumn: number - maxColumn: number - }, - primarySlotConfig?: SlotDescriptor, -) { - if (slotConfigs) { - slotConfigs = JSON.parse(JSON.stringify(slotConfigs)) - const selectedSlotConfigs = slotConfigs.filter((sc) => sc.isSelected) - selectedSlotConfigs.sort((a, b) => { - if (a.row !== b.row) { - return a.row - b.row - } else { - return a.column - b.column - } - }) - const firstSlotConfig = selectedSlotConfigs[0] - if (primarySlotConfig) { - primarySlotConfig = slotConfigs.find( - (s) => s.slot === primarySlotConfig?.slot, - ) as SlotDescriptor - primarySlotConfig.row = firstSlotConfig.row - primarySlotConfig.column = firstSlotConfig.column - } else { - primarySlotConfig = firstSlotConfig - } - primarySlotConfig.rowSpan = - minMaxSelections.maxRow - minMaxSelections.minRow + 1 - primarySlotConfig.colSpan = - minMaxSelections.maxColumn - minMaxSelections.minColumn + 1 - selectedSlotConfigs.forEach((ssc) => { - const matchedSlotConfigIndex = slotConfigs.findIndex( - (sc) => sc.slot === ssc.slot, - ) - const matchedSlotConfig = slotConfigs[matchedSlotConfigIndex] - if ( - matchedSlotConfig && - matchedSlotConfig.slot !== primarySlotConfig?.slot - ) { - slotConfigs.splice(matchedSlotConfigIndex, 1) - } - }) - // slotConfigs.forEach((slotConfig) => (slotConfig.isSelected = false)) - setSlots(slotConfigs) - } -} - -export function splitHandler( - setSlots: FunctionType, - slotConfigs: Array, - orientation: "horizontal" | "vertical", - placement: "before" | "after", - slot?: SlotDescriptor, -) { - slotConfigs = JSON.parse(JSON.stringify(slotConfigs)) - let selectedSlots = [] - if (slot) { - slot = slotConfigs.find((s) => s.slot === slot?.slot) - slot && selectedSlots.push(slot) - } else { - selectedSlots = slotConfigs.filter((sc) => sc.isSelected) - } - selectedSlots.forEach((selectedSlot) => { - const { - row, - slot: selectedSlotId, - column, - colSpan, - rowSpan, - } = selectedSlot - const isHorizontal = orientation === "horizontal" - const isAfter = placement === "after" - const slotId = uuid() - const gridAreaValue = `ga-${slotId}` - const span = isHorizontal ? "rowSpan" : "colSpan" - const dimension = isHorizontal ? "row" : "column" - let newDimSpan = selectedSlot[span] - if (newDimSpan > 1) { - newDimSpan = selectedSlot[span] - 1 - selectedSlot[span] = newDimSpan - } - const newSlot: SlotDescriptor = { - slot: slotId, - row: isHorizontal ? (isAfter ? newDimSpan + row : row) : row, - column: isHorizontal ? column : isAfter ? newDimSpan + column : column, - rowSpan: isHorizontal ? 1 : rowSpan, - colSpan: isHorizontal ? colSpan : 1, - gridArea: gridAreaValue, - splitFrom: selectedSlotId, - } - - const shouldUpdateOtherSlots = isHorizontal - ? rowSpan === 1 - : colSpan === 1 - - // Update slot configs - shouldUpdateOtherSlots && - slotConfigs.forEach((slot) => { - const { - row: currRow, - column: currColumn, - slot: currSlot, - colSpan: currColSpan, - rowSpan: currRowSpan, - } = slot - if (isHorizontal) { - if ( - row >= currRow && - row < currRow + currRowSpan && - currSlot !== selectedSlotId - ) { - slot.rowSpan += 1 - } else if (currRow > row) { - slot.row += 1 - } - } else { - if ( - column >= currColumn && - column < currColumn + currColSpan && - currSlot !== selectedSlotId - ) { - slot.colSpan += 1 - } else if (currColumn > column) { - slot.column += 1 - } - } - }) - if (!isAfter) { - selectedSlot[dimension] += 1 - } - slotConfigs.push(newSlot) - }) - - setSlots(slotConfigs) -} - -export function removeHandler( - slotConfigs: Array, - gridToolbarSpecs: GridToolbarSpecs, - type: string, - isInlineDelete?: boolean, -): Array { - slotConfigs = JSON.parse(JSON.stringify(slotConfigs)) - const isRow = type === "row" - const toolbarSlots = isRow - ? gridToolbarSpecs.rowTools.slots - : gridToolbarSpecs.colTools.slots - // Find and sort selected slots from toolbarSpecs - const selectedToolbarSlots = toolbarSlots - .filter((slot) => - isInlineDelete ? slot.isSelectedForInlineDelete : slot.isSelected, - ) - .sort((a, b) => (isRow ? a.row - b.row : a.column - b.column)) - - // Iterate over each selected slot - selectedToolbarSlots.forEach((toolbarSlot) => { - // Find intersecting slots from slotConfigs - const intersectingSlots = slotConfigs.filter((slot) => - isRow - ? toolbarSlot.row >= slot.row && - toolbarSlot.row < slot.row + slot.rowSpan - : toolbarSlot.column >= slot.column && - toolbarSlot.column < slot.column + slot.colSpan, - ) - - // Delete slots with colSpan 1, decrement colSpan of rest by 1 - intersectingSlots.forEach((intersectingSlot) => { - if ( - isRow - ? intersectingSlot.rowSpan <= toolbarSlot.rowSpan - : intersectingSlot.colSpan <= toolbarSlot.colSpan - ) { - const index = slotConfigs.indexOf(intersectingSlot) - if (index !== -1) slotConfigs.splice(index, 1) - } else { - isRow - ? (intersectingSlot.rowSpan -= 1) - : (intersectingSlot.colSpan -= 1) - } - }) - - // Find next slots and decrement their row/column value by 1 - let succeedingSlots = slotConfigs.filter((slot) => - isRow ? slot.row > toolbarSlot.row : slot.column > toolbarSlot.column, - ) - succeedingSlots.forEach((succeedingSlot) => - isRow ? (succeedingSlot.row -= 1) : (succeedingSlot.column -= 1), - ) - - // Find succeeding toolbar slot and decrement their row/column value by 1 - succeedingSlots = toolbarSlots.filter((currToolbarSlot) => - isRow - ? currToolbarSlot.row > toolbarSlot.row - : currToolbarSlot.column > toolbarSlot.column, - ) - succeedingSlots.forEach((succeedingSlot) => - isRow ? (succeedingSlot.row -= 1) : (succeedingSlot.column -= 1), - ) - toolbarSlots.splice(toolbarSlots.indexOf(toolbarSlot), 1) - }) - - return slotConfigs -} -export function checkIfAdjacent(slotConfigs: Array) { - const selectedSlotConfigs = slotConfigs.filter((sc) => sc.isSelected) - let minRow = Infinity - let maxRow = -Infinity - let minColumn = Infinity - let maxColumn = -Infinity - let totalCells = 0 - selectedSlotConfigs.forEach((config: SlotDescriptor) => { - if (config.row !== undefined && config.column !== undefined) { - minRow = Math.min(minRow, config.row) - maxRow = Math.max(maxRow, config.row + (config.rowSpan - 1)) - minColumn = Math.min(minColumn, config.column) - maxColumn = Math.max(maxColumn, config.column + (config.colSpan - 1)) - totalCells += config.rowSpan * config.colSpan - } - }) - const rectangleArea = (maxRow - minRow + 1) * (maxColumn - minColumn + 1) - - return { - areAdjacent: - selectedSlotConfigs.length > 1 && rectangleArea === totalCells, - minRow, - maxRow, - minColumn, - maxColumn, - } -} - -export function isSlotSelected( - slot: SlotDescriptor, - rowSlots: Array, - colSlots: Array, - selectForDelete?: boolean, -) { - const { row, rowSpan, column, colSpan } = slot - // For cells spanning multiple rows or columns we check if all rows or columns (toolbar cells) - // corresponding to this slot are selected, if either or all rows or all columns intersecting this cell - // are selected, we mark this cell selected. - const allRowsSelected = rowSlots - .filter((ts) => ts.row < row + rowSpan && ts.row + ts.rowSpan > row) - .every((ts) => - selectForDelete !== undefined - ? ts.isSelectedForInlineDelete - : ts.isSelected, - ) - const allColumnSelected = colSlots - .filter( - (ts) => ts.column < column + colSpan && ts.column + ts.colSpan > column, - ) - .every((ts) => - selectForDelete !== undefined - ? ts.isSelectedForInlineDelete - : ts.isSelected, - ) - return allRowsSelected || allColumnSelected -} - -export function selectCellsInSelectedRowCol( - gridToolbarSpecs: GridToolbarSpecs, - slots: Array, - selectForDelete?: boolean, -) { - const rowSlots = gridToolbarSpecs.rowTools.slots - const colSlots = gridToolbarSpecs.colTools.slots - slots.forEach((slot) => { - slot[ - selectForDelete !== undefined - ? "isSelectedForInlineDelete" - : "isSelected" - ] = isSlotSelected(slot, rowSlots, colSlots, selectForDelete) - }) - return [...slots] -} - -export function countOccurrences(array: Array) { - const slots: Array<{ slotId: string; span: number; location: number }> = [] - for (let i = 0; i < array.length; i++) { - const value = array[i] - const existingObject = slots.find((obj) => obj.slotId === value) - if (existingObject === undefined) { - slots.push({ slotId: value, span: 1, location: i }) - } else { - existingObject.span++ - } - } - return slots -} - -export function isIntersecting( - toolSlot: SlotDescriptor, - slot: SlotDescriptor, - isRow: boolean, -) { - const dimension = isRow ? "row" : "column" - const span = isRow ? "rowSpan" : "colSpan" - const sRow = slot[dimension] - const sSpan = slot[span] - const tRow = toolSlot[dimension] - const tSpan = toolSlot[span] - return sRow <= tRow && sRow + sSpan >= tRow + tSpan -} - -export function findIntersectingSlots( - slots: Array, - toolSlot: SlotDescriptor, - isRow: boolean, -) { - return slots.filter((slot) => isIntersecting(toolSlot, slot, isRow)) -} - -export function getCreateOrExtend( - slot: SlotDescriptor, - selectedToolSlot: SlotDescriptor, - placement: "before" | "after", - isRow: boolean, -) { - const dimension = isRow ? "row" : "column" - const span = isRow ? "rowSpan" : "colSpan" - return placement === "before" - ? slot[dimension] === selectedToolSlot[dimension] - : slot[dimension] + slot[span] === - selectedToolSlot[dimension] + selectedToolSlot[span] -} - -export function insertDimension( - type: "row" | "column", - gridToolbarSpecs: GridToolbarSpecs, - slots: Array, - setSlots: FunctionType, - placement: "before" | "after", - selection?: number, -) { - slots = JSON.parse(JSON.stringify(slots)) - const isRow = type === "row" - let referenceSlots = gridToolbarSpecs[isRow ? "colTools" : "rowTools"].slots - let newSlots: Array = [] - if (referenceSlots.length > 0) { - const insertAt: Array = generateInsertionIndexes( - gridToolbarSpecs, - isRow, - placement, - selection, - ) - insertAt.sort() - const trackedSlotsForSpanIncrease: { - [key: string]: { d: SlotDescriptor; count: number } - } = {} - insertAt.forEach((insertionIndex, index) => { - // Insertion indexes represent which row/column new item will end up, and not what was actually selected, - // Below line gets the selected slot by adjusting index back - const selectedToolSlot = - gridToolbarSpecs[isRow ? "rowTools" : "colTools"].slots[ - insertionIndex - index - (placement === "after" ? 1 : 0) - ] - const intersectedSlots = findIntersectingSlots( - slots, - selectedToolSlot, - isRow, - ) - const newSlotsAtCurrentDimension = referenceSlots - .map((referenceSlot) => { - const lateralRefToolIntersectedSlot = intersectedSlots.find((s) => - isIntersecting(referenceSlot, s, !isRow), - ) - if (lateralRefToolIntersectedSlot) { - const shouldCreate = getCreateOrExtend( - lateralRefToolIntersectedSlot, - selectedToolSlot, - placement, - isRow, - ) - if (shouldCreate) { - const slotId = uuid() - const gridArea = `ga-${slotId}` - return { - slot: slotId, - row: isRow ? insertionIndex : referenceSlot.row, - column: isRow ? referenceSlot.column : insertionIndex, - rowSpan: isRow ? 1 : referenceSlot.rowSpan, - colSpan: isRow ? referenceSlot.colSpan : 1, - gridArea, - } - } else { - if ( - !trackedSlotsForSpanIncrease[ - lateralRefToolIntersectedSlot.slot - ] - ) { - trackedSlotsForSpanIncrease[ - lateralRefToolIntersectedSlot.slot - ] = { d: lateralRefToolIntersectedSlot, count: 1 } - } else { - trackedSlotsForSpanIncrease[ - lateralRefToolIntersectedSlot.slot - ].count += 1 - } - } - } - }) - .filter((s) => !!s) as Array - newSlots = newSlots.concat(newSlotsAtCurrentDimension) - }) - insertAt.forEach((dimNum) => { - const fixDim = isRow ? "row" : "column" - const correctableSlots = slots.filter((s) => s[fixDim] >= dimNum) - correctableSlots.forEach((s) => s[fixDim]++) - }) - Object.values(trackedSlotsForSpanIncrease).forEach( - (obj) => (obj.d[isRow ? "rowSpan" : "colSpan"] += obj.count), - ) - } else { - const slotId = uuid() - const gridArea = `ga-${slotId}` - newSlots.push({ - slot: uuid(), - row: 0, - column: 0, - rowSpan: 1, - colSpan: 1, - gridArea, - }) - } - slots = slots.concat(newSlots) - setSlots(slots) -} - -export function generateInsertionIndexes( - gridToolbarSpecs: GridToolbarSpecs, - isRow: boolean, - placement: "before" | "after", - selection?: number, -) { - let insertAt: Array = [] - if (selection !== undefined) { - insertAt.push(placement === "after" ? selection + 1 : selection) - } else { - if (isRow) { - insertAt = generateInsertionIndexesForDimension( - gridToolbarSpecs, - "rowTools", - "row", - placement, - isRow, - ) - } else { - insertAt = generateInsertionIndexesForDimension( - gridToolbarSpecs, - "colTools", - "column", - placement, - isRow, - ) - } - } - insertAt.sort() - // If multiple row/col to be added, indexes of all rows (columns) except the first one will change by a value - // equal to their index value in insertAt array (second should be incremented by 1, third by 2 and so on hence we can use indexes) - insertAt = insertAt.map((dimNum, index) => dimNum + index) - return insertAt -} - -export function generateInsertionIndexesForDimension( - gridToolbarSpecs: GridToolbarSpecs, - tools: "rowTools" | "colTools", - dimension: "row" | "column", - placement: "before" | "after", - isRow: boolean, -) { - let insertAt: Array = [] - const reverseDimSlots = - gridToolbarSpecs[isRow ? "rowTools" : "colTools"].slots - const selections = gridToolbarSpecs[tools].slots - .filter((s) => s.isSelected) - .map((s) => s[dimension] + (placement === "before" ? 0 : 1)) - if (selections.length > 0) { - insertAt = insertAt.concat(selections) - } else { - if (placement === "before") { - insertAt.push(0) - } else { - insertAt.push( - Math.max(...reverseDimSlots.map((rS) => rS[dimension])) + 1, - ) - } - } - return insertAt -} - -export function generateSlots(rows: Array): Array { - const slotConfigs: Array = [] - const processedGridAreas = new Set() - - rows.forEach((row, rowIndex) => { - const parts = row.split(" ") - - parts.forEach((part, partIndex) => { - const gridArea = part.trim() - - if (!processedGridAreas.has(gridArea)) { - processedGridAreas.add(gridArea) - - // Calculate rowSpan and colSpan based on the repetitions in the grid template - const rowSpan = rows.filter((row) => row.includes(gridArea)).length - const colSpan = parts.filter((part) => part === gridArea).length - - slotConfigs.push({ - slot: gridArea, - gridArea, - row: rowIndex, - column: partIndex, - rowSpan, - colSpan, - }) - } - }) - }) - - return slotConfigs -} - -export function generateSlotConfigs(gridTemplate: string): { - slotConfigs: Array - rowHeights: Array - colWidths: Array -} { - // Split by double quotes to separate row and column definitions - const parts = gridTemplate - .split('"') - .map((p) => p.trim()) - .filter((p) => p) - let colWidths - - const rowsAndHeights: { [key: string]: string } = {} - - // Identify row and column parts - parts.forEach((part, index) => { - if (part.startsWith("ga-")) { - rowsAndHeights[part] = "auto" - } else { - if (part.includes("calc(")) { - const calcEndIndex = part.lastIndexOf(")") - const calcExpression = part.substring(0, calcEndIndex + 1) - rowsAndHeights[parts[index - 1]] = calcExpression - - const remainingPart = part.substring(calcEndIndex + 1).trim() - if (remainingPart.includes("/")) { - const colPart = remainingPart.split("/")[1].trim() - colWidths = colPart.split(" ").map((p) => p.trim()) - } - } else { - rowsAndHeights[parts[index - 1]] = part - } - } - }) - - const rowHeights = Object.values(rowsAndHeights) - const slotConfigs = generateSlots(Object.keys(rowsAndHeights)) - - return { slotConfigs, rowHeights, colWidths: colWidths || [] } -} \ No newline at end of file diff --git a/src/helper.tsx b/src/helper.tsx index 700afda..da62e50 100644 --- a/src/helper.tsx +++ b/src/helper.tsx @@ -1,57 +1,27 @@ -import { lazy } from "react" +import { JSX, lazy } from "react" import { FunctionType, ObjectType, - PageInfoType, - SearchArgs, - ComponentDescription, - ComponentList, RouteConfig, } from "@armco/types" -const validImageMimeTypes = [ - "image/jpeg", - "image/png", - "image/gif", - "image/webp", - "image/svg+xml", - "image/tiff", - "image/bmp", - "image/x-icon", -] - -interface ReplacerFunction { - (key: string, value: any): any +export interface SearchArgs { + obj: ObjectType | Array + key: string + value?: string + parent?: ObjectType | Array } -interface StringifyOnce { - (obj: any, replacer?: ReplacerFunction | null, indent?: number): string -} - -/** - * - * @param pathOrComponentName - * @param fallback - * @returns Lazy component, can be used as - */ -export function lazyImport(pathOrComponentName: string, fallback: FunctionType) { - return lazy(() => - import(pathOrComponentName) - .catch(() => import(`@armco/components/${pathOrComponentName}`)) - .catch(() => import(`@armco/shared-components/${pathOrComponentName}`)) - .catch(fallback), - ) -} - -export function populatePagesInRoutes(routes: RouteConfig[], fallback: FunctionType) { +export function populatePagesInRoutes( + routes: RouteConfig[], + fallback: FunctionType, +) { routes && routes.forEach((route) => { if (typeof route.element === "string") { const elementName = route.element const Component: JSX.ElementType = lazy(() => - import(`../pages/${elementName}/${elementName}.tsx`).catch( - fallback, - ), + import(`../pages/${elementName}/${elementName}.tsx`).catch(fallback), ) route.element = if (route.children) { @@ -85,6 +55,17 @@ export function populateComponentsInRoutes( }) } +/** + * WHAT: Recursively filters through an array of objects based on a filter string. + * HOW: Checks specified keys in each object for a match with the filter string. + * If an object has children, it recursively filters the children as well. + * An object is included in the result if it or any of its children match the filter. + * @param data + * @param filter + * @param matchCase + * @param searchKeys + * @returns + */ export function recrusiveFilter( data: Array, filter: string, @@ -107,16 +88,10 @@ export function recrusiveFilter( (matchCase ? obj[key].indexOf(filter) > -1 : obj[key] && - obj[key] - .toString() - .toLowerCase() - .indexOf(filter.toLowerCase()) > -1) + obj[key].toString().toLowerCase().indexOf(filter.toLowerCase()) > + -1) if (obj.children) { - obj.children = recrusiveFilter( - obj.children, - filter, - matchCase, - ) + obj.children = recrusiveFilter(obj.children, filter, matchCase) isMatch = isMatch || obj.children.length > 0 } return acc || isMatch @@ -126,7 +101,19 @@ export function recrusiveFilter( return filteredItems } -export function search({ obj, key, value }: SearchArgs): ObjectType | undefined { +/** + * WHAT: Searches through a nested object or array to find an object with a specific key-value pair. + * HOW: Recursively traverses the object/array, checking each object's keys and values. + * If the specified key is found and its value matches (if provided), the object is returned. + * If the object contains nested objects or arrays, the function calls itself on those nested structures. + * @param param0 + * @returns + */ +export function search({ + obj, + key, + value, +}: SearchArgs): ObjectType | undefined { if (Array.isArray(obj)) { for (const item of obj) { const result = search({ obj: item, key, value }) @@ -146,119 +133,18 @@ export function search({ obj, key, value }: SearchArgs): ObjectType | undefined return undefined } -export function filterTreeStructure( - args: SearchArgs, -): boolean | Array | ObjectType | void { - let { obj, key, value } = args - if (Array.isArray(obj)) { - return obj.filter((item, index) => { - if (typeof item === "object" && !(item instanceof Date)) { - args.obj = item - - const match = filterTreeStructure(args) - if (Array.isArray(match) && match.length > 0) { - ;(obj as unknown as Array>).splice( - index, - 1, - match, - ) - } - return match - } - return false - }) - } else { - if (obj) { - let found = false - if (key in obj && (value === undefined || obj[key] === value)) { - obj.hasMatched = true - } - Object.keys(obj).forEach((key) => { - const item = (obj as ObjectType)[key] - if (typeof item === "object" && !(item instanceof Date)) { - args.obj = item as ObjectType - - const match = filterTreeStructure(args) - if (Array.isArray(match) ? match.length > 0 : match) { - found = true - } else { - delete (obj as ObjectType)[key] - } - if (Array.isArray(match) && match.length > 0) { - ;(obj as ObjectType)[key] = match - } - } else - (obj as ObjectType).hasMatched || delete (obj as ObjectType)[key] - }) - return (obj.hasMatched as boolean) || found - } - return false - } -} - -export function generateSlices( - count: number, - sliceLength: number, - labelFormat: string, +/** + * WHAT: Converts a string to camelCase format. + * @param str + * @param separater + * @param includeFirst + * @returns + */ +export function toCamelCase( + str: string, + separater: string, + includeFirst: boolean, ) { - let i = 0, - j = 0 - const slices: Array = [] - while (i < count) { - let addUp = sliceLength - if (i + sliceLength > count) { - addUp = count % sliceLength - } - const label = - labelFormat === "range" ? i + 1 + " - " + (i + addUp) : "" + (j + 1) - slices.push({ - label, - name: label.replace(/ /g, "").replace(/-/g, "to"), - sliceIndex: j, - startIndex: i, - endIndex: i + addUp - 1, - }) - i += sliceLength - j++ - } - return slices -} - -export function aggregate( - data: any, - aggregator: string, -): { [key: string]: Array } { - let aggregated: { [key: string]: Array } = {} - data.forEach((item: any) => { - const key = item[aggregator] - let aggregatedArray: Array | undefined = aggregated[key] - if (!aggregatedArray) { - aggregatedArray = [] - aggregated[key] = aggregatedArray - } - aggregatedArray.push(item) - }) - return aggregated -} - -export function generateCategories( - data: any, - categories: Array | undefined, -): { [key: string]: { [key: string]: Array } } { - const groups: { [key: string]: { [key: string]: Array } } = {} - if (categories && data) { - categories.forEach((key) => { - let group: { [key: string]: Array } = aggregate( - data, - key, - ) - groups[key] = group - }) - } - return groups -} - -export function toCamelCase(str: string, separater: string, includeFirst: boolean) { const strParts = str.split(separater || " ") return strParts .map((part, i) => @@ -269,12 +155,11 @@ export function toCamelCase(str: string, separater: string, includeFirst: boolea .join("") } -export function generateRandomId(length: number = 8) { - return Math.random() - .toString(36) - .substring(2, length + 2) -} - +/** + * WHAT: Copies text to clipboard or prompts user to copy if clipboard access is not available. + * @param text + * @param cb + */ export function copyOrPrompt(text?: string, cb?: FunctionType) { if (copyToClipboard(text)) { cb && cb() @@ -283,6 +168,11 @@ export function copyOrPrompt(text?: string, cb?: FunctionType) { } } +/** + * WHAT: Copies text to clipboard if supported by the browser. + * @param text + * @returns + */ export function copyToClipboard(text?: string) { const isNotSafari = typeof (window as any).safari === "undefined" if (isNotSafari) { @@ -293,72 +183,6 @@ export function copyToClipboard(text?: string) { } } -export function findComponentDescription( - componentName: string, - components: ComponentList, -) { - let hierarchy - let selectedItem = components.ATOMS.components.find( - (item: ComponentDescription) => - (typeof item === "string" ? item : item.name) === componentName, - ) - if (!selectedItem) { - selectedItem = components.MOLECULES.components.find( - (item: ComponentDescription) => - (typeof item === "string" ? item : item.name) === componentName, - ) - if (selectedItem) { - hierarchy = "MOLECULES" - } - } else { - hierarchy = "ATOMS" - } - return { - selectedItem: JSON.parse( - JSON.stringify(selectedItem), - ) as ComponentDescription, - hierarchy, - component: componentName, - } -} - -export function matchArrayFilters( - searchList: Array | undefined, - filters: Array | false | undefined, - match: string, - type?: string, -) { - if (filters && searchList) { - return type && type === "starts" - ? searchList.filter( - (item) => - filters.findIndex((al) => - item[match].toLowerCase().startsWith(al.toLowerCase()), - ) > -1, - ) - : searchList.filter( - (item) => - filters.findIndex( - (al) => item[match].toLowerCase() === al.value.toLowerCase(), - ) > -1, - ) - } - return searchList -} - -export function importComponent( - name: string, - hierarchy: string, - fallback: FunctionType, -) { - return lazy( - () => - import(`../components/${hierarchy}/${name}/${name}.tsx`).catch( - fallback, - ), - ) -} - export function getStylesFromClass(className: string): Record { const styleSheet = Array.from(document.styleSheets).find((sheet) => Array.from(sheet.cssRules).some( @@ -386,6 +210,14 @@ export function getStylesFromClass(className: string): Record { return {} } +/** + * WHAT: Creates a debounced version of a function that delays its execution until after a specified wait time has elapsed since the last time it was invoked. + * HOW: Uses a timeout to track the delay period. If the debounced function is called again before the timeout expires, the previous timeout is cleared and a new one is set. + * @param func + * @param wait + * @param immediate + * @returns + */ export function debounce void>( func: T, wait?: number, @@ -412,118 +244,72 @@ export function debounce void>( } } +/** + * WHAT: Detects if the current device is a mobile device based on the user agent string. + * HOW: Uses a regular expression to match common mobile device identifiers in the user agent string. + * @returns + */ export function isMobile(): boolean { let check = false - ;(function (a: string) { - if ( - /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test( - a, - ) || - /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test( - a.substr(0, 4), + ; (function (a: string) { + if ( + /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test( + a, + ) || + /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test( + a.substr(0, 4), + ) ) + check = true + })( + (navigator.userAgent || + navigator.vendor || + ("opera" in window && window.opera)) as string, ) - check = true - })( - (navigator.userAgent || - navigator.vendor || - ("opera" in window && window.opera)) as string, - ) return check } +export function getCookie(cookieName: string) { + return ( + document.cookie + .match("(^|;)\\s*" + cookieName + "\\s*=\\s*([^;]+)") + ?.pop() || "" + ) +} + +export function setCookie(cname: string, cvalue: string, exdays: number) { + const d = new Date() + d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000) + let expires = "expires=" + d.toUTCString() + document.cookie = cname + "=" + cvalue + ";" + expires + ";Path=/" +} + +export function clearCookie(cname: string) { + document.cookie = cname + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;" +} + +/** + * Pads a number with leading zeros to ensure it has at least two digits. + * Optionally appends a separator at the end. + * @param num + * @param separator + * @returns + */ export function pad(num: number, separator?: string) { return ("" + num).padStart(2, "0") + (separator ? separator : "") } +/** + * Accepts a string and converts it to a more readable format. + * HOW: Splits camelCase words and capitalizes the first letter of each word. + * + * @param str Input string to be converted + * @returns Converted string + */ export function toReadable(str?: string) { return str ?.replace(/([a-z])([A-Z])/g, "$1 $2") .split(" ") .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) .join(" ") -} - -export function generateFileKey(file: File | { name: string }) { - return "size" in file - ? `${file.name}_${file.size}_${file.type}_${file.lastModified}` - : file.name + "-preexisting-" + Date.now() -} - -export function convertToBytes(input: string): number { - const trimmedInput = input.trim().toLowerCase() - - try { - if (trimmedInput.endsWith("kb")) { - const number = parseFloat(trimmedInput.slice(0, -2)) - return number * 1024 - } else if (trimmedInput.endsWith("mb")) { - const number = parseFloat(trimmedInput.slice(0, -2)) - return number * 1024 * 1024 - } else if (trimmedInput.endsWith("bytes")) { - const number = parseFloat(trimmedInput.slice(0, -5)) - return number - } else if (!isNaN(parseFloat(trimmedInput))) { - return parseFloat(trimmedInput) - } else { - return -1 - } - } catch (error) { - return -1 - } -} - -export function isImage(type: string) { - return !!type && validImageMimeTypes.indexOf(type) > -1 -} - -export const stringifyOnce: StringifyOnce = (obj, replacer, indent) => { - const printedObjects: any[] = [] - const printedObjectKeys: string[] = [] - - function printOnceReplacer(key: string, value: any): any { - if (printedObjects.length > 2000) { - // browsers will not print more than 20K, I don't see the point to allow 2K.. algorithm will not be fast anyway if we have too many objects - return "object too long" - } - - let printedObjIndex: number | false = false - printedObjects.forEach((obj, index) => { - if (obj === value) { - printedObjIndex = index - } - }) - - if (key === "") { - // root element - printedObjects.push(obj) - printedObjectKeys.push("root") - return value - } else if (printedObjIndex !== false && typeof value === "object") { - if (printedObjectKeys[printedObjIndex] === "root") { - return "(pointer to root)" - } else { - return ( - "(see " + - (!!value && !!value.constructor - ? value.constructor.name.toLowerCase() - : typeof value) + - " with key " + - printedObjectKeys[printedObjIndex] + - ")" - ) - } - } else { - const qualifiedKey = key || "(empty key)" - printedObjects.push(value) - printedObjectKeys.push(qualifiedKey) - if (replacer) { - return replacer(key, value) - } else { - return value - } - } - } - - return JSON.stringify(obj, printOnceReplacer, indent) -} +} \ No newline at end of file diff --git a/src/hooks.ts b/src/hooks.ts index e2f8219..23d5a5e 100644 --- a/src/hooks.ts +++ b/src/hooks.ts @@ -1,6 +1,9 @@ -import { useContext, useEffect, useState } from "react" +import { useCallback, useContext, useEffect, useState } from "react" +import { useNavigate } from "react-router-dom" +import { v4 as uuid } from "uuid" import { AlertProps, + ArAlertType, ArThemes, DrawerProps, FunctionType, @@ -8,7 +11,11 @@ import { PanelContent, User, } from "@armco/types" +import { SESSION_TOKEN_NAME } from "@armco/configs/constants" +import { ENDPOINTS, IAM } from "@armco/configs/endpoints" import { ArContext, SlotterContext } from "./contexts" +import { clearCookie, setCookie } from "./helper" +import { get, post } from "./network" export function useSlotted(componentName: string) { const { slotted, setSlotted } = useContext(SlotterContext) @@ -17,59 +24,6 @@ export function useSlotted(componentName: string) { setSlotted([...slotted, componentName]) } -export function useStateWithHistory( - initialState?: T, -): [T | undefined, FunctionType, FunctionType, FunctionType, boolean, boolean] { - const [past, setPast] = useState([]) - const [present, setPresent] = useState() - const [future, setFuture] = useState([]) - - useEffect(() => { - !present && setPresent(initialState) - // eslint-disable-next-line - }, [initialState]) - - const undo = () => { - if (past.length === 0) return - - const newPast = [...past] - const newPresent = newPast.pop() - - setPast(newPast) - present && setFuture([present, ...future]) - setPresent(newPresent) - } - - const redo = () => { - if (future.length === 0) return - - const newFuture = [...future] - const newPresent = newFuture.shift() - - past && present && setPast([...past, present]) - setFuture(newFuture) - setPresent(newPresent) - } - - const updatePresent = (newState: any, skipHistory?: boolean) => { - if (!newState) { - debugger - } - !skipHistory && past && present && setPast([...past, present]) - setPresent(newState) - !skipHistory && setFuture([]) - } - - return [ - present, - updatePresent, - undo, - redo, - past.length > 0, - future.length > 0, - ] -} - export const useTheme = (): { theme: ArThemes setTheme: (theme: ArThemes) => void @@ -110,7 +64,7 @@ export const useNotification = (): { } export const useDrawerState = (): { - drawerState: DrawerProps + drawerState?: DrawerProps setDrawerState: (drawerState: DrawerProps) => void } => { const context = useContext(ArContext) @@ -138,8 +92,9 @@ export const useLoggedIn = (): { } export const useUser = (): { - user?: User - setUser: (user: User) => void + user?: User | null + setUser: (user: User | null) => void + clearUser: () => void } => { const context = useContext(ArContext) if (!context) { @@ -148,6 +103,7 @@ export const useUser = (): { return { user: context.user, setUser: context.setUser, + clearUser: context.clearUser, } } @@ -168,3 +124,122 @@ export const usePanelContent = ( : context.setRightPanelContent, } } + +export function useClearSession() { + const { setLoggedIn } = useLoggedIn() + const { clearUser } = useUser() + + return () => { + setLoggedIn(false) + clearUser() + clearCookie(SESSION_TOKEN_NAME) + } +} + +export function useAuth() { + const { setUser } = useUser() + const { isLoggedIn, setLoggedIn } = useLoggedIn() + const { notify } = useNotification() + const clearSession = useClearSession() + const navigate = useNavigate() + const { setPanelContent: setRightPanelContent } = usePanelContent(false) + + const postAuthSuccess = useCallback( + ( + response: { status: number; body: any }, + shouldNotify?: boolean, + shouldLoginParent?: boolean, + ) => { + if (response && response.body && response.status === 200) { + const user = response.body.user as User + if (user?.username) { + if (!user.name && user.firstName) { + user.name = `${user.firstName}${ + user.lastName ? " " + user.lastName : "" + }` + } + !isLoggedIn && setLoggedIn(true) + setUser(user) + setCookie("auth-session-user", user.username, 30) + shouldNotify && + notify({ + show: true, + message: "Logged in successfully!", + type: ArAlertType.SUCCESS, + uid: uuid(), + }) + if (shouldLoginParent) { + window.parent.postMessage( + { event: "LOGGED_IN", user: response.body }, + "*", + ) + } else { + setRightPanelContent({ componentName: "" }) + window.location.pathname === "/" && navigate(`/${user.username}`) + } + } else { + notify({ + message: "Malformed user details, try again or contact support!", + type: ArAlertType.ERROR, + uid: uuid(), + }) + } + } else { + clearSession() + notify({ + message: "Unknown error occurred on fetching user details!", + type: ArAlertType.ERROR, + uid: uuid(), + }) + } + }, + [], + ) + + const postAuthFailure = useCallback( + ( + error: { status: number }, + shouldNotify?: boolean, + shouldLogoutParent?: boolean, + ) => { + if (!error.status || error.status === 403) { + shouldNotify && + notify({ + message: "Unable to fetch user details, logging out...", + type: ArAlertType.ERROR, + uid: uuid(), + }) + console.error( + "Attempt fetching user details at page load failed", + error, + ) + clearSession() + if (shouldLogoutParent) { + window.parent.postMessage({ event: "NOT_LOGGED_IN" }, "*") + } else { + setRightPanelContent({ componentName: "" }) + window.location.pathname !== "/" && navigate("/") + } + } + }, + [], + ) + + return { + check: () => { + return get( + IAM[process.env.NODE_ENV] + + ENDPOINTS.USERS.ROOT + + ENDPOINTS.USERS.CHECK, + ) + }, + postAuthSuccess, + postAuthFailure, + login: (credentials: { [key: string]: string | number | File }) => { + return post( + IAM[process.env.NODE_ENV] + ENDPOINTS.AUTH.ROOT + ENDPOINTS.AUTH.LOGIN, + credentials, + ) + }, + } +} diff --git a/src/index.ts b/src/index.ts index 4b80c79..d3887b8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,14 +1,10 @@ -export * from "./dateformat" export * from "./domHelper" -export * from "./adapters" export * from "./helper" export * from "./network" -export * from "./validators" -export * from "./gridHelper" +export * from "../../taskerclient/src/validators" export * from "./recursionHelper" -export * from "./dateHelper" -export * from "./chartGenerators" export * from "./hooks" export * from "./contexts" export * from "./providers" export * from "./HOC" +export * from "./enums" diff --git a/src/network.ts b/src/network.ts index 92e2bde..0db1740 100644 --- a/src/network.ts +++ b/src/network.ts @@ -1,5 +1,7 @@ import { FunctionType, ObjectType } from "@armco/types" import { HOST, STATIC_HOST } from "@armco/configs/endpoints" +import { SESSION_TOKEN_NAME } from "@armco/configs/constants" +import { getCookie } from "./helper" interface Options extends RequestInit { // headers?: { @@ -36,210 +38,215 @@ class Error { } } - const MAX_ATTEMPTS_LIMIT = 10 +const MAX_ATTEMPTS_LIMIT = 10 - export async function get(url: string, queryParams?: object, options?: Options) { - const urlString = stringifyUrl(url, queryParams) - options = { - method: "GET", - mode: "cors", - credentials: "include", - ...options, - } - return crud(urlString, options) +export async function get( + url: string, + queryParams?: object, + options?: Options, +) { + const urlString = stringifyUrl(url, queryParams) + options = { + method: "GET", + mode: "cors", + credentials: "include", + ...options, } + return crud(urlString, options) +} - export async function getStatic( - url: string, - queryParams?: object | null, - options?: Options | null, - ) { - let urlString = stringifyUrl(url, queryParams) - const environment = process.env.NODE_ENV || "development" - const host = urlString.startsWith("http") - ? "" - : STATIC_HOST[environment as keyof object] - urlString = host ? host + urlString : urlString - options = { - method: "GET", - mode: "cors", - credentials: "include", - ...options, - } - return crud(urlString, options) +export async function getStatic( + url: string, + queryParams?: object | null, + options?: Options | null, +) { + let urlString = stringifyUrl(url, queryParams) + const environment = process.env.NODE_ENV || "development" + const host = urlString.startsWith("http") + ? "" + : STATIC_HOST[environment as keyof object] + urlString = host ? host + urlString : urlString + options = { + method: "GET", + mode: "cors", + credentials: "include", + ...options, } + return crud(urlString, options) +} - export async function post( - url: string, - data: object, - queryParams?: object, - options?: Options, - noStringify?: boolean, - noHeaders?: boolean, - ) { - const urlString = stringifyUrl(url, queryParams) - options = { - method: "POST", - // @ts-ignore - body: noStringify ? data : JSON.stringify(data), - mode: "cors", - credentials: "include", - } - !noHeaders && - options && - (options.headers = { "Content-Type": "application/json" }) +export async function post( + url: string, + data: object, + queryParams?: object, + options?: Options, + noStringify?: boolean, + noHeaders?: boolean, +) { + const urlString = stringifyUrl(url, queryParams) + options = { + method: "POST", // @ts-ignore - return crud(urlString, options) + body: noStringify ? data : JSON.stringify(data), + mode: "cors", + credentials: "include", } + !noHeaders && + options && + (options.headers = { "Content-Type": "application/json" }) + // @ts-ignore + return crud(urlString, options) +} - export async function upload( - url: string, - file: File, - queryParams?: object, - options?: Options, - ) { - let urlString = stringifyUrl(url, queryParams) - const environment = process.env.NODE_ENV || "development" - const host = urlString.startsWith("http") - ? "" - : STATIC_HOST[environment as keyof object] - urlString = host ? host + urlString : urlString - const formData = new FormData() - formData.append("file", file) - options = { - method: "POST", - mode: "cors", - body: formData, - credentials: "include", - ...options, - } - return crud(urlString, options) +export async function upload( + url: string, + file: File, + queryParams?: object, + options?: Options, +) { + let urlString = stringifyUrl(url, queryParams) + const environment = process.env.NODE_ENV || "development" + const host = urlString.startsWith("http") + ? "" + : STATIC_HOST[environment as keyof object] + urlString = host ? host + urlString : urlString + const formData = new FormData() + formData.append("file", file) + options = { + method: "POST", + mode: "cors", + body: formData, + credentials: "include", + ...options, } + return crud(urlString, options) +} - export async function put(url: string, data: object, queryParams?: object) { - const urlString = stringifyUrl(url, queryParams) - const options: Options = { - method: "PUT", - body: JSON.stringify(data), - mode: "cors", - credentials: "include", - headers: { - "Content-Type": "application/json", - }, - } - return crud(urlString, options) +export async function put(url: string, data: object, queryParams?: object) { + const urlString = stringifyUrl(url, queryParams) + const options: Options = { + method: "PUT", + body: JSON.stringify(data), + mode: "cors", + credentials: "include", + headers: { + "Content-Type": "application/json", + }, } + return crud(urlString, options) +} - export async function deleteRec(url: string, queryParams: object) { - const urlString = stringifyUrl(url, queryParams) - const options = { - method: "DELETE", - noInject: true, - } - return crud(urlString, options) +export async function deleteRec(url: string, queryParams: object) { + const urlString = stringifyUrl(url, queryParams) + const options = { + method: "DELETE", + noInject: true, } + return crud(urlString, options) +} - export async function crud(urlString: string, options: Options) { - const environment = process.env.NODE_ENV || "development" - const host = urlString.startsWith("http") - ? "" - : HOST[environment as keyof object] - const extras = options?.extras - urlString = host ? host + urlString : urlString - if (!options.headers) { - options.headers = {} - } - options.toggleLoader && options.toggleLoader({ [urlString]: true }) - options.headers["Origin"] = - window.location.protocol + "//" + window.location.host - const response = await fetch(urlString, options) - const { ok, status, headers } = response - if (ok) { - if (headers.get("content-type")) { - if (headers.get("content-type")!.indexOf("application/json") !== -1) { - const body = await response.json() - options.toggleLoader && options.toggleLoader({ [urlString]: false }) - return { status, body, headers } - } else if ( - headers.get("content-type")!.indexOf("application/zip") !== -1 || - headers.get("content-type")!.indexOf("image/png") !== -1 || - headers.get("content-type")!.indexOf("application/pdf") !== -1 || - headers.get("content-type")!.indexOf("video/mp4") !== -1 || - headers.get("content-type")!.indexOf("image/gif") !== -1 - ) { - const body = await response.blob() - options.toggleLoader && options.toggleLoader({ [urlString]: false }) - return { status, body, headers } - } +export async function crud(urlString: string, options: Options) { + const environment = process.env.NODE_ENV || "development" + const host = urlString.startsWith("http") + ? "" + : HOST[environment as keyof object] + const extras = options?.extras + urlString = host ? host + urlString : urlString + if (!options.headers) { + options.headers = {} + } + options.toggleLoader && options.toggleLoader({ [urlString]: true }) + options.headers["Origin"] = + window.location.protocol + "//" + window.location.host + options.headers[SESSION_TOKEN_NAME] = getCookie(SESSION_TOKEN_NAME) + const response = await fetch(urlString, options) + const { ok, status, headers } = response + if (ok) { + if (headers.get("content-type")) { + if (headers.get("content-type")!.indexOf("application/json") !== -1) { + const body = await response.json() + options.toggleLoader && options.toggleLoader({ [urlString]: false }) + return { status, body, headers } + } else if ( + headers.get("content-type")!.indexOf("application/zip") !== -1 || + headers.get("content-type")!.indexOf("image/png") !== -1 || + headers.get("content-type")!.indexOf("application/pdf") !== -1 || + headers.get("content-type")!.indexOf("video/mp4") !== -1 || + headers.get("content-type")!.indexOf("image/gif") !== -1 + ) { + const body = await response.blob() + options.toggleLoader && options.toggleLoader({ [urlString]: false }) + return { status, body, headers } } - const body = await response.text() - options.toggleLoader && options.toggleLoader({ [urlString]: false }) - return { status, body, headers } } - const err = await response.json() + const body = await response.text() options.toggleLoader && options.toggleLoader({ [urlString]: false }) - console.log(err) - throw new Error(err.error || err.message, status, extras) + return { status, body, headers } } + const err = await response.json() + options.toggleLoader && options.toggleLoader({ [urlString]: false }) + console.log(err) + throw new Error(err.error || err.message, status, extras) +} - export function stringifyUrl(url: string, queryParams?: any) { - if (!queryParams) { - return url || "" - } - const arrLength = Object.keys(queryParams).length - return url && arrLength - ? Object.keys(queryParams) - .filter((k) => queryParams[k] !== undefined) - .reduce( - (acc, key, index) => - acc.concat( - `${encodeURIComponent(key)}=${encodeURIComponent( - queryParams[key], - ).replace(/'/g, "%27")}` + (index < arrLength - 1 ? "&" : ""), - ), - url + "?", - ) - : "" +export function stringifyUrl(url: string, queryParams?: any) { + if (!queryParams) { + return url || "" } + const arrLength = Object.keys(queryParams).length + return url && arrLength + ? Object.keys(queryParams) + .filter((k) => queryParams[k] !== undefined) + .reduce( + (acc, key, index) => + acc.concat( + `${encodeURIComponent(key)}=${encodeURIComponent( + queryParams[key], + ).replace(/'/g, "%27")}` + (index < arrLength - 1 ? "&" : ""), + ), + url + "?", + ) + : "" +} - export async function retry( - fn: FunctionType, - retryOptions: RetryOptions | undefined = {}, - ) { - let { - retryDescriptor = [1, 3, 5], - maxAttempts = 5, - onRetry, - onSuccess, - onFailure, - } = retryOptions - maxAttempts = Math.min(maxAttempts, MAX_ATTEMPTS_LIMIT) - let attempts = 0 +export async function retry( + fn: FunctionType, + retryOptions: RetryOptions | undefined = {}, +) { + let { + retryDescriptor = [1, 3, 5], + maxAttempts = 5, + onRetry, + onSuccess, + onFailure, + } = retryOptions + maxAttempts = Math.min(maxAttempts, MAX_ATTEMPTS_LIMIT) + let attempts = 0 - const attempt = async () => { - try { - const result = await fn() - onSuccess && onSuccess() - return result - } catch (error) { - if (attempts < Math.min(retryDescriptor.length, maxAttempts)) { - const waitTime = retryDescriptor[attempts] * 1000 - attempts++ - onRetry && onRetry(attempts, waitTime) - console.warn(`Retrying in ${waitTime / 1000} seconds...`) - await new Promise((resolve) => setTimeout(resolve, waitTime)) - return attempt() - } else { - const errorObj = new Error( - "Max retries reached", - 500, - error as ObjectType, - ) - onFailure && onFailure(errorObj) - throw errorObj - } + const attempt = async () => { + try { + const result = await fn() + onSuccess && onSuccess() + return result + } catch (error) { + if (attempts < Math.min(retryDescriptor.length, maxAttempts)) { + const waitTime = retryDescriptor[attempts] * 1000 + attempts++ + onRetry && onRetry(attempts, waitTime) + console.warn(`Retrying in ${waitTime / 1000} seconds...`) + await new Promise((resolve) => setTimeout(resolve, waitTime)) + return attempt() + } else { + const errorObj = new Error( + "Max retries reached", + 500, + error as ObjectType, + ) + onFailure && onFailure(errorObj) + throw errorObj } } - - return attempt() } + + return attempt() +} diff --git a/src/providers.tsx b/src/providers.tsx index 3b0758c..ffe5182 100644 --- a/src/providers.tsx +++ b/src/providers.tsx @@ -11,9 +11,9 @@ import { ArContext } from "./contexts" import { isMobile } from "./helper" export const ArProvider = ({ children }: { children: ReactNode }) => { - const [theme, setTheme] = useState(ArThemes.DARK1) + const [theme, setTheme] = useState(ArThemes.LIGHT1) const [isLoggedIn, setLoggedIn] = useState() - const [user, setUser] = useState() + const [user, setUser] = useState() const [modalState, setModalState] = useState( undefined, ) @@ -43,6 +43,7 @@ export const ArProvider = ({ children }: { children: ReactNode }) => { setDrawerState, user, setUser, + clearUser: () => setUser(null), leftPanelContent, setLeftPanelContent, rightPanelContent, diff --git a/src/react-app-env.d.ts b/src/react-app-env.d.ts new file mode 100644 index 0000000..0f9692d --- /dev/null +++ b/src/react-app-env.d.ts @@ -0,0 +1,71 @@ +/// +/// +/// + +declare namespace NodeJS { + interface ProcessEnv { + readonly NODE_ENV: "development" | "production" + readonly PUBLIC_URL: string + } +} + +declare module "*.avif" { + const src: string + export default src +} + +declare module "*.bmp" { + const src: string + export default src +} + +declare module "*.gif" { + const src: string + export default src +} + +declare module "*.jpg" { + const src: string + export default src +} + +declare module "*.jpeg" { + const src: string + export default src +} + +declare module "*.png" { + const src: string + export default src +} + +declare module "*.webp" { + const src: string + export default src +} + +declare module "*.svg" { + import * as React from "react" + + export const ReactComponent: React.FunctionComponent< + React.SVGProps & { title?: string } + > + + const src: string + export default src +} + +declare module "*.module.css" { + const classes: { readonly [key: string]: string } + export default classes +} + +declare module "*.module.scss" { + const classes: { readonly [key: string]: string } + export default classes +} + +declare module "*.module.sass" { + const classes: { readonly [key: string]: string } + export default classes +} diff --git a/src/recursionHelper.tsx b/src/recursionHelper.tsx index f06e81c..8bfd265 100644 --- a/src/recursionHelper.tsx +++ b/src/recursionHelper.tsx @@ -1,5 +1,16 @@ import { v4 as uuid } from "uuid" -import { RecursionArgs, ObjectType, RecusionConditionTypes } from "@armco/types" +import { FunctionType, ObjectType } from "@armco/types" +import { RecusionConditionTypes } from "./enums" + +export interface RecursionArgs { + data: any + preop?: FunctionType + postop?: FunctionType + isBrute?: boolean + condition?: ObjectType + iterateOn?: string +} + export function recur(args: RecursionArgs) { const { condition, data, isBrute, preop, postop, iterateOn } = args diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..d9d8b54 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,50 @@ +import { CSSProperties, ReactNode } from "react" +import { ArAlertType } from "./enums" +import { BaseProps, FunctionType } from "@armco/types" + +export interface DrawerProps extends BaseProps { + children?: ReactNode + collapsed?: boolean + contentClasses?: string + isCollapsible?: boolean + title?: string +} + +export interface ModalProps extends BaseProps { + body?: ReactNode + closeHandler?: FunctionType + content?: ReactNode + contentClasses?: string + footer?: ReactNode + header?: ReactNode + hideClose?: boolean + isSticky?: boolean + modalClasses?: string + primaryButtonLabel?: string + primaryHandler?: FunctionType + secondaryButtonLabel?: string + shouldScale?: boolean + shouldFadeIn?: boolean + show?: boolean +} + +// Contexts +export interface ArContextType { + theme: ArThemes + modalState?: ModalProps + notification?: AlertProps + drawerState?: DrawerProps + isLoggedIn?: boolean + user?: User | null + leftPanelContent?: PanelContent + setLeftPanelContent: (leftPanelContent: PanelContent) => void + rightPanelContent?: PanelContent + setRightPanelContent: (rightPanelContent: PanelContent) => void + setTheme: (theme: ArThemes) => void + setLoggedIn: (isLoggedIn: boolean) => void + setUser: (user: User | null) => void + clearUser: () => void + setModalState: (modalState: ModalProps | undefined) => void + notify: (notification: AlertProps | undefined) => void + setDrawerState: (drawerState: DrawerProps) => void +} diff --git a/src/validators.ts b/src/validators.ts deleted file mode 100644 index 7da11ca..0000000 --- a/src/validators.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ObjectType } from "@armco/types" - -export function validateTask(taskObj: ObjectType) { - return ( - taskObj && - taskObj.name && - taskObj.client && - taskObj.target && - (taskObj.target as ObjectType).endpoint && - taskObj.schedule && - (taskObj.schedule as ObjectType).cron - ) -} diff --git a/tsconfig.json b/tsconfig.json index a951d6b..f331297 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,5 +23,5 @@ }, "include": [ "src" - ] +, "../taskerclient/src/validators.ts" ], } diff --git a/vite-dev.config.ts b/vite-dev.config.ts new file mode 100644 index 0000000..c53119f --- /dev/null +++ b/vite-dev.config.ts @@ -0,0 +1,42 @@ +import { resolve } from "node:path" +import { glob } from "glob" +import { defineConfig } from "vitest/config" +import react from "@vitejs/plugin-react" +import dts from "vite-plugin-dts" +import { externalizeDeps } from "vite-plugin-externalize-deps" + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), dts({ outDir: "build/types" }), externalizeDeps()], + build: { + outDir: "build", + sourcemap: true, + lib: { + entry: glob.sync(resolve(__dirname, "src/**/*.{ts,tsx}")), + }, + rollupOptions: { + treeshake: true, + external: [ + new RegExp("^react.*"), + new RegExp("^@armco/.*"), + "@armco/icon", + "uuid", + "d3", + ], + output: [ + { + format: "es", + dir: "build/es", + entryFileNames: "[name].js", + chunkFileNames: "[name].js", + }, + { + format: "cjs", + dir: "build/cjs", + entryFileNames: "[name].js", + chunkFileNames: "[name].js", + }, + ], + }, + }, +}) diff --git a/vite.config.ts b/vite.config.ts index 9622bba..d29867c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,5 +1,5 @@ import { resolve } from "node:path" -import {glob} from "glob" +import { glob } from "glob" import { defineConfig } from "vitest/config" import react from "@vitejs/plugin-react" import dts from "vite-plugin-dts" @@ -15,6 +15,13 @@ export default defineConfig({ }, rollupOptions: { treeshake: true, + external: [ + new RegExp("^react.*"), + new RegExp("^@armco/.*"), + "@armco/icon", + "uuid", + "d3", + ], output: [ { format: "es",