From b6804cc2f16a3a651bcd20dda2db0ef01dfce4ac Mon Sep 17 00:00:00 2001 From: "douboer@gmail.com" Date: Thu, 12 Feb 2026 17:30:41 +0800 Subject: [PATCH] update at 2026-02-12 17:30:41 --- .eslintrc.cjs | 23 + .gitignore | 2 + .prettierrc.json | 6 + README.md | 42 + index.html | 12 + miniapp/README.md | 10 + miniapp/app.js | 1 + miniapp/app.json | 10 + miniapp/app.wxss | 5 + miniapp/pages/index/index.js | 25 + miniapp/pages/index/index.json | 4 + miniapp/pages/index/index.wxml | 100 + miniapp/pages/index/index.wxss | 178 + miniapp/sitemap.json | 4 + package-lock.json | 3821 ++++++++++++++++++++++ package.json | 37 + public/data/example.xlsx | Bin 0 -> 10162 bytes public/data/example0.xlsx | Bin 0 -> 9548 bytes public/data/example00.xlsx | Bin 0 -> 9935 bytes public/data/example1.xlsx | Bin 0 -> 10223 bytes public/data/拉流切图节点与算法池信息.csv | 32 + src/App.vue | 588 ++++ src/core/index.ts | 3 + src/core/parser.ts | 96 + src/core/sankey.ts | 168 + src/core/types.ts | 49 + src/main.ts | 5 + src/styles.css | 450 +++ src/types/shims-vue.d.ts | 6 + tests/core.spec.ts | 47 + tsconfig.json | 18 + vite.config.ts | 23 + 32 files changed, 5765 insertions(+) create mode 100644 .eslintrc.cjs create mode 100644 .prettierrc.json create mode 100644 README.md create mode 100644 index.html create mode 100644 miniapp/README.md create mode 100644 miniapp/app.js create mode 100644 miniapp/app.json create mode 100644 miniapp/app.wxss create mode 100644 miniapp/pages/index/index.js create mode 100644 miniapp/pages/index/index.json create mode 100644 miniapp/pages/index/index.wxml create mode 100644 miniapp/pages/index/index.wxss create mode 100644 miniapp/sitemap.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/data/example.xlsx create mode 100644 public/data/example0.xlsx create mode 100644 public/data/example00.xlsx create mode 100644 public/data/example1.xlsx create mode 100644 public/data/拉流切图节点与算法池信息.csv create mode 100644 src/App.vue create mode 100644 src/core/index.ts create mode 100644 src/core/parser.ts create mode 100644 src/core/sankey.ts create mode 100644 src/core/types.ts create mode 100644 src/main.ts create mode 100644 src/styles.css create mode 100644 src/types/shims-vue.d.ts create mode 100644 tests/core.spec.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..1778c48 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,23 @@ +module.exports = { + root: true, + env: { + browser: true, + es2022: true, + node: true + }, + extends: [ + 'eslint:recommended', + 'plugin:vue/vue3-recommended', + 'plugin:@typescript-eslint/recommended', + 'eslint-config-prettier' + ], + parser: 'vue-eslint-parser', + parserOptions: { + parser: '@typescript-eslint/parser', + ecmaVersion: 'latest', + sourceType: 'module' + }, + rules: { + 'vue/multi-word-component-names': 'off' + } +}; diff --git a/.gitignore b/.gitignore index 165fa27..99d3f2e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,8 @@ lerna-debug.log* node_modules .npm-cache +dist +coverage *.local # Editor directories and files diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..4f6f5ce --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "semi": true, + "singleQuote": true, + "printWidth": 100, + "trailingComma": "none" +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..7ad07b3 --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +# 星程桑基图 + +基于 `Vue3 + TypeScript + ECharts` 的桑基图制作工具,支持 `CSV / XLS / XLSX` 上传、列映射配置、目标描述列合并语义聚合、实时预览与 `PNG / SVG` 导出。 + +## 已实现(本轮) + +- Web 端(Figma `3044:158`) + - 顶部工具条:主题选择、文件上传、导出按钮 + - 列映射:源数据列单选、源描述列多选、目标描述列多选 + - 解析规则:支持“目标描述列空值沿用上行非空值” + - 图表预览:方向切换、节点间距、预览边距配置 + - 导出:PNG / SVG +- 小程序端骨架(Figma `584:64`) + - 页面结构、图标布局与主题底部弹层 + +## 本地运行 + +```bash +npm install +npm run dev +``` + +## 质量检查 + +```bash +npm run test +npm run type-check +npm run lint +``` + +## 测试数据 + +按你的要求,测试 Excel 文件放在 `data/`: + +- `data/example.xlsx` +- `data/example0.xlsx` +- `data/example00.xlsx` +- `data/example1.xlsx` + +## 图标资源 + +所有 SVG 图标统一放在 `assets/icons/`,Web 与小程序都直接复用该目录。 diff --git a/index.html b/index.html new file mode 100644 index 0000000..ddda780 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + 星程桑基图 + + +
+ + + diff --git a/miniapp/README.md b/miniapp/README.md new file mode 100644 index 0000000..2886bce --- /dev/null +++ b/miniapp/README.md @@ -0,0 +1,10 @@ +# 小程序端骨架 + +当前目录提供了与 Figma `node-id=584:64` 对齐的页面骨架: + +- 顶部 Logo/主题/上传/导出区域 +- 效果预览区域 +- 源数据与目标数据列选择区域 +- 主题底部选择器(底部弹层) + +后续接入时建议直接复用 `src/core` 的解析与聚合逻辑,保持 Web 与小程序一致的数据行为。 diff --git a/miniapp/app.js b/miniapp/app.js new file mode 100644 index 0000000..3482935 --- /dev/null +++ b/miniapp/app.js @@ -0,0 +1 @@ +App({}); diff --git a/miniapp/app.json b/miniapp/app.json new file mode 100644 index 0000000..b7ee0a9 --- /dev/null +++ b/miniapp/app.json @@ -0,0 +1,10 @@ +{ + "pages": ["pages/index/index"], + "window": { + "navigationBarTitleText": "星程桑基图", + "navigationBarBackgroundColor": "#ffffff", + "navigationBarTextStyle": "black" + }, + "style": "v2", + "sitemapLocation": "sitemap.json" +} diff --git a/miniapp/app.wxss b/miniapp/app.wxss new file mode 100644 index 0000000..44aeb08 --- /dev/null +++ b/miniapp/app.wxss @@ -0,0 +1,5 @@ +page { + background: #f3f4f6; + font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; + color: #1d2129; +} diff --git a/miniapp/pages/index/index.js b/miniapp/pages/index/index.js new file mode 100644 index 0000000..1779c63 --- /dev/null +++ b/miniapp/pages/index/index.js @@ -0,0 +1,25 @@ +Page({ + data: { + selectedThemeIndex: 1, + sourceColumns: ['列1', '列2'], + targetColumns: ['列1', '列2'], + sourceDataIndex: 1, + sourceDescChecked: [1], + targetDescChecked: [1], + showThemeSheet: false + }, + + /** + * 主题选择按钮点击后,切换底部选择器。 + */ + onToggleThemeSheet() { + this.setData({ showThemeSheet: !this.data.showThemeSheet }); + }, + + /** + * 关闭主题底部选择器。 + */ + onCloseThemeSheet() { + this.setData({ showThemeSheet: false }); + } +}); diff --git a/miniapp/pages/index/index.json b/miniapp/pages/index/index.json new file mode 100644 index 0000000..f946597 --- /dev/null +++ b/miniapp/pages/index/index.json @@ -0,0 +1,4 @@ +{ + "navigationBarTitleText": "星程桑基图", + "usingComponents": {} +} diff --git a/miniapp/pages/index/index.wxml b/miniapp/pages/index/index.wxml new file mode 100644 index 0000000..e11661a --- /dev/null +++ b/miniapp/pages/index/index.wxml @@ -0,0 +1,100 @@ + + + + + + + + + 选择主题 + + + + + + 文件上传 + + + + + + + + + + + + 效果预览 + + + + + + 源数据 + + + + 数据列 + + + + + {{item}} + + + + + + + + 描述列 + + + + + {{item}} + + + + + + + 目标数据 + + + + 描述列 + + + + + {{item}} + + + + + + + @版权说明:星程社所有,反馈邮箱:douboer@gmail.com + + + + 选择配色主题 + + + + + + diff --git a/miniapp/pages/index/index.wxss b/miniapp/pages/index/index.wxss new file mode 100644 index 0000000..8a53ea9 --- /dev/null +++ b/miniapp/pages/index/index.wxss @@ -0,0 +1,178 @@ +.page { + padding: 8px; +} + +.header { + height: 48px; + display: flex; + align-items: center; + gap: 8px; +} + +.logo { + width: 48px; + height: 48px; + border-radius: 12px; +} + +.title { + width: 160px; +} + +.toolbar { + margin-top: 8px; + display: flex; + align-items: center; + gap: 6px; +} + +.tool-item { + display: flex; + align-items: center; + gap: 3px; + font-size: 12px; +} + +.tool-icon { + width: 24px; + height: 24px; +} + +.tiny-icon { + width: 10px; + height: 10px; +} + +.export-box { + margin-left: auto; + background: #fff; + border: 1px solid #e5e6eb; + border-radius: 4px; + padding: 2px 4px; + display: flex; + align-items: center; + gap: 4px; +} + +.export-main { + width: 10px; + height: 20px; +} + +.export-icon { + width: 24px; + height: 24px; +} + +.preview-block, +.block { + margin-top: 8px; + border: 1px solid #fbaca3; + border-radius: 8px; + background: #fff; + padding: 4px; +} + +.block-title { + font-size: 16px; + font-weight: 600; +} + +.preview-canvas { + margin-top: 4px; + min-height: 300px; + background: #f7f8fa; + border-radius: 4px; +} + +.bottom-grid { + margin-top: 8px; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; +} + +.field { + margin-top: 8px; +} + +.field-title { + display: flex; + align-items: center; + gap: 4px; + font-size: 14px; + font-weight: 600; +} + +.field-title image { + width: 14px; + height: 14px; +} + +.row { + height: 24px; + border-bottom: 1px solid #c9cdd4; + display: flex; + align-items: center; + gap: 6px; + padding-bottom: 6px; + margin-top: 4px; +} + +.row image { + width: 18px; + height: 18px; +} + +.label { + flex: 1; + color: #86909c; + font-size: 12px; +} + +.footer { + margin-top: 8px; + color: #86909c; + font-size: 14px; +} + +.theme-sheet-mask { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.2); +} + +.theme-sheet { + position: fixed; + left: 0; + right: 0; + bottom: 0; + background: #fff; + border-radius: 16px 16px 0 0; + padding: 12px; +} + +.theme-title { + color: #9b6bc2; + font-size: 14px; + text-align: center; +} + +.theme-row { + margin-top: 8px; + display: flex; + align-items: center; + gap: 8px; +} + +.theme-row image { + width: 18px; + height: 18px; +} + +.theme-bar { + flex: 1; + height: 20px; + border-radius: 2px; + background: linear-gradient(90deg, #f72585, #3f37c9, #4cc9f0); +} diff --git a/miniapp/sitemap.json b/miniapp/sitemap.json new file mode 100644 index 0000000..96e0352 --- /dev/null +++ b/miniapp/sitemap.json @@ -0,0 +1,4 @@ +{ + "desc": "星程桑基图小程序", + "rules": [] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8707807 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3821 @@ +{ + "name": "xingcheng-sankey", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "xingcheng-sankey", + "version": "0.1.0", + "dependencies": { + "echarts": "^5.6.0", + "papaparse": "^5.5.3", + "vue": "^3.5.18", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@types/node": "^24.3.1", + "@types/papaparse": "^5.3.16", + "@typescript-eslint/eslint-plugin": "^8.42.0", + "@typescript-eslint/parser": "^8.42.0", + "@vitejs/plugin-vue": "^6.0.1", + "eslint": "^8.57.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-vue": "^9.33.0", + "prettier": "^3.6.2", + "typescript": "^5.9.2", + "vite": "^7.1.3", + "vitest": "^3.2.4", + "vue-eslint-parser": "^9.4.3", + "vue-tsc": "^3.0.5" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@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.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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/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.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/node": { + "version": "24.10.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.13.tgz", + "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/papaparse": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.5.2.tgz", + "integrity": "sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz", + "integrity": "sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/type-utils": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.55.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz", + "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz", + "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz", + "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz", + "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz", + "integrity": "sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz", + "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz", + "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.55.0", + "@typescript-eslint/tsconfig-utils": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz", + "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz", + "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.4.tgz", + "integrity": "sha512-uM5iXipgYIn13UUQCZNdWkYk+sysBeA97d5mHsAoAt1u/wpN3+zxOmsVJWosuzX+IMGRzeYUNytztrYznboIkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.27.tgz", + "integrity": "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.27" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.27.tgz", + "integrity": "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.27.tgz", + "integrity": "sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.27", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.28.tgz", + "integrity": "sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.28", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.28.tgz", + "integrity": "sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.28", + "@vue/shared": "3.5.28" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.28.tgz", + "integrity": "sha512-6TnKMiNkd6u6VeVDhZn/07KhEZuBSn43Wd2No5zaP5s3xm8IqFTHBj84HJah4UepSUJTro5SoqqlOY22FKY96g==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.28", + "@vue/compiler-dom": "3.5.28", + "@vue/compiler-ssr": "3.5.28", + "@vue/shared": "3.5.28", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.28.tgz", + "integrity": "sha512-JCq//9w1qmC6UGLWJX7RXzrGpKkroubey/ZFqTpvEIDJEKGgntuDMqkuWiZvzTzTA5h2qZvFBFHY7fAAa9475g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.28", + "@vue/shared": "3.5.28" + } + }, + "node_modules/@vue/language-core": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.4.tgz", + "integrity": "sha512-bqBGuSG4KZM45KKTXzGtoCl9cWju5jsaBKaJJe3h5hRAAWpZUuj5G+L+eI01sPIkm4H6setKRlw7E85wLdDNew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.27", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.0.0", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.2" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.28.tgz", + "integrity": "sha512-gr5hEsxvn+RNyu9/9o1WtdYdwDjg5FgjUSBEkZWqgTKlo/fvwZ2+8W6AfKsc9YN2k/+iHYdS9vZYAhpi10kNaw==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.28" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.28.tgz", + "integrity": "sha512-POVHTdbgnrBBIpnbYU4y7pOMNlPn2QVxVzkvEA2pEgvzbelQq4ZOUxbp2oiyo+BOtiYlm8Q44wShHJoBvDPAjQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.28", + "@vue/shared": "3.5.28" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.28.tgz", + "integrity": "sha512-4SXxSF8SXYMuhAIkT+eBRqOkWEfPu6nhccrzrkioA6l0boiq7sp18HCOov9qWJA5HML61kW8p/cB4MmBiG9dSA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.28", + "@vue/runtime-core": "3.5.28", + "@vue/shared": "3.5.28", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.28.tgz", + "integrity": "sha512-pf+5ECKGj8fX95bNincbzJ6yp6nyzuLDhYZCeFxUNp8EBrQpPpQaLX3nNCp49+UbgbPun3CeVE+5CXVV1Xydfg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.28", + "@vue/shared": "3.5.28" + }, + "peerDependencies": { + "vue": "3.5.28" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.28.tgz", + "integrity": "sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==", + "license": "MIT" + }, + "node_modules/acorn": { + "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", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/alien-signals": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.2.tgz", + "integrity": "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "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": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "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/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/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/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-spawn": { + "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": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/echarts": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz", + "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.6.1" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "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.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", + "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "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/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/papaparse": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", + "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "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.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "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/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": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.27.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": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.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 + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "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" + }, + "node_modules/vue": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.28.tgz", + "integrity": "sha512-BRdrNfeoccSoIZeIhyPBfvWSLFP4q8J3u8Ju8Ug5vu3LdD+yTM13Sg4sKtljxozbnuMu1NB1X5HBHRYUzFocKg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.28", + "@vue/compiler-sfc": "3.5.28", + "@vue/runtime-dom": "3.5.28", + "@vue/server-renderer": "3.5.28", + "@vue/shared": "3.5.28" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-tsc": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.2.4.tgz", + "integrity": "sha512-xj3YCvSLNDKt1iF9OcImWHhmYcihVu9p4b9s4PGR/qp6yhW+tZJaypGxHScRyOrdnHvaOeF+YkZOdKwbgGvp5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.27", + "@vue/language-core": "3.2.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zrender": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz", + "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b151118 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "name": "xingcheng-sankey", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview", + "type-check": "vue-tsc --noEmit", + "lint": "eslint . --ext .ts,.vue --max-warnings=0", + "test": "vitest run", + "format": "prettier --check ." + }, + "dependencies": { + "echarts": "^5.6.0", + "papaparse": "^5.5.3", + "vue": "^3.5.18", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@types/node": "^24.3.1", + "@types/papaparse": "^5.3.16", + "@typescript-eslint/eslint-plugin": "^8.42.0", + "@typescript-eslint/parser": "^8.42.0", + "@vitejs/plugin-vue": "^6.0.1", + "eslint": "^8.57.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-vue": "^9.33.0", + "prettier": "^3.6.2", + "typescript": "^5.9.2", + "vite": "^7.1.3", + "vitest": "^3.2.4", + "vue-eslint-parser": "^9.4.3", + "vue-tsc": "^3.0.5" + } +} diff --git a/public/data/example.xlsx b/public/data/example.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..47c553d427804c78959cc02482d7ee4afb3db2f6 GIT binary patch literal 10162 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 literal 0 HcmV?d00001 diff --git a/public/data/example00.xlsx b/public/data/example00.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9d89343803e0a17609d85e77d78656d37f07c0a0 GIT binary patch literal 9935 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

rbKQcqp&F0Kbv78SQ5%#V;-_1RLBF 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 literal 0 HcmV?d00001 diff --git a/public/data/拉流切图节点与算法池信息.csv b/public/data/拉流切图节点与算法池信息.csv new file mode 100644 index 0000000..9806e00 --- /dev/null +++ b/public/data/拉流切图节点与算法池信息.csv @@ -0,0 +1,32 @@ +分析云切图节点,当前负载,算力池信息,算法地址,模型,算法版本,最大容量(路数),当前算法负载 +宁波北欧1,3197,宁波通算+嘉善智算,http://14.174.128.46:8899/api/v1/detect,小模型+大模型,0109,10000,9364 +宁波北欧2,2729,,,,,, +宁波鄞中24,3438,,,,,, +宁波北欧5,1677,宁波通算+嘉善智算,http://14.174.128.49:8899/api/v1/detect,小模型+大模型,0109,10000,6876 +宁波北欧8,2594,,,,,, +宁波鄞中25,2605,,,,,, +宁波北欧3,281,金华林田通算+嘉善智算,http://14.182.3.216:8899/api/v1/detect,小模型+大模型,0109,18000,15561 +宁波北欧6,3154,,,,,, +宁波北欧7,2761,,,,,, +宁波北欧9,3321,,,,,, +宁波北欧11,2647,,,,,, +宁波鄞中14,3397,,,,,, +宁波北欧4,2014,金华林田通算+嘉善智算,http://14.182.3.218:8899/api/v1/detect,小模型+大模型,0109,18000,6399 +宁波北欧13,0,,,,,, +宁波鄞中21,3571,,,,,, +宁波鄞中22,814,,,,,, +台州1,0,嘉善算力池0109版本(172.64.142.10:8888),http://172.64.142.10:8888/ai/aiFactoryServer/v1/apis/1/servicecode-qr22:1.1,,,, +宁波鄞中18,3363,湖州通算+嘉善智算,http://14.172.0.11:8897/api/v1/detect,小模型,0908,18000,6530 +宁波鄞中19,3167,,,,,, +宁波鄞中20,2391,湖州通算+嘉善智算,http://14.172.0.12:8888/ai/aiFactoryServer/v1/apis/1/servicecode-bz0t:1.1,小模型,0908,8000,2391 +宁波北欧10,2582,嘉兴四级算力池,http://14.173.1.216:8898/api/v1/detect,小模型,0908,12000,11623 +宁波北欧12,2610,,,,,, +宁波鄞中15,507,,,,,, +宁波鄞中26,2914,,,,,, +宁波鄞中27,3010,,,,,, +嘉兴1,0,嘉兴四级算力池,http://172.61.142.10:8898/api/v1/detect,小模型,0908,2000,1418 +丽水1,1418,,,,,, +宁波鄞中16,1534,台州四级算力池,http://172.67.14.15:8888/ai/aiFactoryServer/v1/apis/1/servicecode-tqs9:1.1,小模型,0908,8000,2292 +宁波鄞中17,758,,,,,, +嘉兴2,0,,,,,, +丽水2,0,,,,,, \ No newline at end of file diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..166e072 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,588 @@ + + + diff --git a/src/core/index.ts b/src/core/index.ts new file mode 100644 index 0000000..14d2f80 --- /dev/null +++ b/src/core/index.ts @@ -0,0 +1,3 @@ +export * from './types'; +export * from './parser'; +export * from './sankey'; diff --git a/src/core/parser.ts b/src/core/parser.ts new file mode 100644 index 0000000..85725cf --- /dev/null +++ b/src/core/parser.ts @@ -0,0 +1,96 @@ +import Papa from 'papaparse'; +import * as XLSX from 'xlsx'; +import type { RawTable } from './types'; + +/** + * 将任意单元格值转换为字符串,统一处理 null/undefined 场景。 + */ +function normalizeCell(value: unknown): string { + if (value === null || value === undefined) { + return ''; + } + return String(value).trim(); +} + +/** + * 将二维数组标准化为 RawTable。 + * 约定第一行为表头,后续为数据行。 + */ +function toRawTable(rows: unknown[][]): RawTable { + if (rows.length === 0) { + return { headers: [], rows: [] }; + } + + const firstRow = rows[0] ?? []; + const maxColumns = rows.reduce((max, row) => Math.max(max, row.length), firstRow.length); + + const headers = Array.from({ length: maxColumns }, (_, index) => { + const header = normalizeCell(firstRow[index]); + return header || `列${index + 1}`; + }); + + const dataRows = rows.slice(1).map((row) => { + return Array.from({ length: maxColumns }, (_, index) => normalizeCell(row[index])); + }); + + return { + headers, + rows: dataRows + }; +} + +/** + * 解析 CSV 文本为统一表结构。 + */ +export function parseCsvText(csvText: string): RawTable { + const parsed = Papa.parse(csvText, { + skipEmptyLines: false + }); + + if (parsed.errors.length > 0) { + const firstError = parsed.errors[0]; + throw new Error(`CSV 解析失败: ${firstError.message}`); + } + + const rows = parsed.data.map((row: string[]) => row ?? []); + return toRawTable(rows); +} + +/** + * 解析 xlsx 的二进制数据。 + */ +export function parseXlsxBuffer(buffer: ArrayBuffer): RawTable { + const workbook = XLSX.read(buffer, { type: 'array' }); + const firstSheetName = workbook.SheetNames[0]; + + if (!firstSheetName) { + throw new Error('Excel 文件中没有工作表'); + } + + const sheet = workbook.Sheets[firstSheetName]; + const rows = XLSX.utils.sheet_to_json(sheet, { + header: 1, + raw: false, + defval: '' + }); + + return toRawTable(rows); +} + +/** + * 根据文件后缀自动判断并解析文件。 + */ +export async function parseDataFile(file: File): Promise { + const lowerName = file.name.toLowerCase(); + if (lowerName.endsWith('.csv')) { + const text = await file.text(); + return parseCsvText(text); + } + + if (lowerName.endsWith('.xlsx') || lowerName.endsWith('.xls')) { + const buffer = await file.arrayBuffer(); + return parseXlsxBuffer(buffer); + } + + throw new Error('仅支持 .csv / .xlsx / .xls 文件'); +} diff --git a/src/core/sankey.ts b/src/core/sankey.ts new file mode 100644 index 0000000..15ed1a3 --- /dev/null +++ b/src/core/sankey.ts @@ -0,0 +1,168 @@ +import type { + DirectionMode, + MappingConfig, + RawTable, + SankeyBuildResult, + SankeyLink, + SankeyNode +} from './types'; + +/** + * 统一清洗字符串,避免因为前后空格导致节点重复。 + */ +function normalizeText(value: string): string { + return value.trim(); +} + +/** + * 将字符串解析为数字,支持千分位(例如 12,000)。 + */ +function parseNumericValue(text: string): number | null { + const normalized = text.replace(/,/g, '').trim(); + if (!normalized) { + return null; + } + + const parsed = Number(normalized); + if (Number.isNaN(parsed)) { + return null; + } + + return parsed; +} + +/** + * 按照配置生成 source 名称。 + * 若未选择描述列,则回退为数据列文本。 + */ +function buildSourceName(row: string[], config: MappingConfig): string { + const sourceDataValue = config.sourceDataColumn === null ? '' : row[config.sourceDataColumn] ?? ''; + + if (config.sourceDescriptionColumns.length === 0) { + return normalizeText(sourceDataValue); + } + + const parts = config.sourceDescriptionColumns + .map((column) => normalizeText(row[column] ?? '')) + .filter((item) => item.length > 0); + + return parts.join(config.delimiter); +} + +/** + * 生成 target 名称,并实现“合并单元格向下补全”的语义。 + */ +function buildTargetName( + row: string[], + config: MappingConfig, + lastNonEmptyTargetValueByColumn: Map +): string { + const parts = config.targetDescriptionColumns + .map((column) => { + const raw = normalizeText(row[column] ?? ''); + if (raw.length > 0) { + lastNonEmptyTargetValueByColumn.set(column, raw); + return raw; + } + + return lastNonEmptyTargetValueByColumn.get(column) ?? ''; + }) + .filter((item) => item.length > 0); + + return parts.join(config.delimiter); +} + +/** + * 将映射配置应用到表格数据,输出桑基图节点和连线。 + */ +export function buildSankeyData(table: RawTable, config: MappingConfig): SankeyBuildResult { + if (config.sourceDataColumn === null) { + throw new Error('必须选择源数据列'); + } + + if (config.targetDescriptionColumns.length === 0) { + throw new Error('必须至少选择一个目标描述列'); + } + + const linkValueMap = new Map(); + const warnings: string[] = []; + let droppedRows = 0; + + const lastNonEmptyTargetValueByColumn = new Map(); + + table.rows.forEach((row, rowIndex) => { + const excelRow = rowIndex + 2; + const sourceRaw = normalizeText(row[config.sourceDataColumn as number] ?? ''); + const sourceValue = parseNumericValue(sourceRaw); + + if (sourceValue === null) { + warnings.push(`第 ${excelRow} 行: 源数据不是有效数字,已跳过`); + droppedRows += 1; + return; + } + + const sourceName = buildSourceName(row, config); + if (!sourceName) { + warnings.push(`第 ${excelRow} 行: 源描述为空,已跳过`); + droppedRows += 1; + return; + } + + const targetName = buildTargetName(row, config, lastNonEmptyTargetValueByColumn); + if (!targetName) { + warnings.push(`第 ${excelRow} 行: 目标描述为空,已跳过`); + droppedRows += 1; + return; + } + + const key = `${sourceName}@@${targetName}`; + const prev = linkValueMap.get(key) ?? 0; + linkValueMap.set(key, prev + sourceValue); + }); + + const links: SankeyLink[] = []; + const sourceSet = new Set(); + const targetSet = new Set(); + + linkValueMap.forEach((value, key) => { + const [source, target] = key.split('@@'); + if (!source || !target) { + return; + } + + sourceSet.add(source); + targetSet.add(target); + links.push({ source, target, value }); + }); + + const nodes: SankeyNode[] = [ + ...Array.from(sourceSet).map((name) => ({ name, kind: 'source' as const })), + ...Array.from(targetSet) + .filter((name) => !sourceSet.has(name)) + .map((name) => ({ name, kind: 'target' as const })) + ]; + + return { + nodes, + links, + meta: { + droppedRows, + warnings + } + }; +} + +/** + * 用于方向切换:仅交换连线方向,不改动原始聚合结果。 + */ +export function applyDirection(links: SankeyLink[], direction: DirectionMode): SankeyLink[] { + if (direction === 'source-to-target') { + return links; + } + + return links.map((link) => ({ + source: link.target, + target: link.source, + value: link.value + })); +} diff --git a/src/core/types.ts b/src/core/types.ts new file mode 100644 index 0000000..3cfb16a --- /dev/null +++ b/src/core/types.ts @@ -0,0 +1,49 @@ +/** + * 统一后的表格结构。 + * headers 表示首行列名,rows 表示去掉首行后每一行的字符串值。 + */ +export interface RawTable { + headers: string[]; + rows: string[][]; +} + +/** + * 用户在界面上配置的列映射规则。 + */ +export interface MappingConfig { + sourceDataColumn: number | null; + sourceDescriptionColumns: number[]; + targetDescriptionColumns: number[]; + delimiter: string; +} + +/** + * 渲染桑基图所需的节点。 + */ +export interface SankeyNode { + name: string; + kind: 'source' | 'target'; +} + +/** + * 渲染桑基图所需的边。 + */ +export interface SankeyLink { + source: string; + target: string; + value: number; +} + +/** + * 聚合后的业务输出,包括告警信息。 + */ +export interface SankeyBuildResult { + nodes: SankeyNode[]; + links: SankeyLink[]; + meta: { + droppedRows: number; + warnings: string[]; + }; +} + +export type DirectionMode = 'source-to-target' | 'target-to-source'; diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..27a79bf --- /dev/null +++ b/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import App from './App.vue'; +import './styles.css'; + +createApp(App).mount('#app'); diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..fd7d19b --- /dev/null +++ b/src/styles.css @@ -0,0 +1,450 @@ +:root { + --primary-7: #8552a1; + --primary-6: #9b6bc2; + --fill-1: #f7f8fa; + --fill-3: #e5e6eb; + --fill-4: #c9cdd4; + --text-1: #ffffff; + --text-3: #86909c; + --text-4: #4e5969; + --danger-3: #fbaca3; + --font-pingfang: 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; +} + +* { + box-sizing: border-box; +} + +html, +body, +#app { + margin: 0; + min-height: 100%; +} + +body { + background: #f3f4f6; + color: #1d2129; + font-family: var(--font-pingfang); +} + +.page { + position: relative; + width: 100%; + min-height: 100vh; + padding: 16px 16px 10px; +} + +.top-bar { + position: relative; + display: flex; + justify-content: space-between; + gap: 16px; + align-items: center; + margin-bottom: 12px; + padding: 0 8px; +} + +.brand { + display: flex; + align-items: center; + gap: 8px; +} + +.logo { + width: 64px; + height: 64px; + border-radius: 16px; +} + +.title-logo { + width: 174px; + height: auto; +} + +.toolbar { + display: flex; + align-items: center; + gap: 12px; + flex: 1; + justify-content: flex-end; +} + +.tool-item { + display: flex; + align-items: center; + gap: 4px; +} + +.tool-label { + color: #1d2129; + font-size: 14px; + white-space: nowrap; +} + +.icon-btn { + border: 0; + background: transparent; + cursor: pointer; + padding: 0; + width: 36px; + height: 36px; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.icon-btn img { + max-width: 100%; + max-height: 100%; + object-fit: contain; +} + +.icon-btn.tiny { + width: 14px; + height: 14px; +} + +.upload-area { + min-width: 280px; + max-width: 420px; + flex: 1; + min-height: 38px; + border-radius: 6px; + display: flex; + align-items: center; + padding: 4px 10px; + background: var(--fill-1); + cursor: pointer; + position: relative; +} + +.hidden-input { + display: none; +} + +.upload-text { + color: var(--text-4); + font-size: 12px; +} + +.upload-tip { + position: absolute; + left: 0; + top: 44px; + z-index: 5; + width: 100%; + border: 1px solid var(--primary-7); + background: #fff; + border-radius: 8px; + padding: 8px; + color: var(--text-4); + font-size: 12px; +} + +.upload-tip a { + color: var(--primary-7); + text-decoration: none; + font-weight: 500; +} + +.export-box { + display: flex; + gap: 6px; + align-items: center; + background: #fff; + border: 1px solid var(--fill-3); + border-radius: 8px; + padding: 2px 8px; +} + +.export-main { + width: 18px; + height: 34px; +} + +.export-item { + width: 40px; + height: 40px; +} + +.theme-popover { + position: absolute; + top: 80px; + right: 290px; + width: 280px; + border: 1px solid var(--primary-7); + border-radius: 24px 24px 0 0; + background: #fff; + z-index: 10; + padding: 8px; +} + +.theme-header { + text-align: center; + color: var(--primary-6); + font-size: 14px; + margin-bottom: 8px; +} + +.theme-list { + max-height: 180px; + overflow: auto; +} + +.theme-row { + width: 100%; + border: 0; + background: #fff; + display: flex; + align-items: center; + gap: 8px; + padding: 6px; + cursor: pointer; +} + +.theme-row img { + width: 18px; + height: 18px; +} + +.palette { + flex: 1; + display: grid; + grid-template-columns: repeat(9, 1fr); + height: 20px; +} + +.palette-cell { + display: block; +} + +.content { + display: grid; + grid-template-columns: 360px 1fr; + gap: 8px; + min-height: calc(100vh - 140px); +} + +.left-pane { + display: flex; + flex-direction: column; + gap: 8px; +} + +.panel { + border: 1px solid #f7dede; + border-radius: 16px; + background: #fff; +} + +.block-panel { + padding: 8px; +} + +.block-panel h2, +.preview-head h2 { + margin: 0; + font-size: 24px; + font-weight: 400; +} + +.field-block { + margin-top: 12px; +} + +.field-title-wrap { + display: flex; + align-items: center; + gap: 6px; + margin-bottom: 8px; +} + +.field-title-wrap h3 { + margin: 0; + font-size: 18px; + font-weight: 500; +} + +.expand-icon { + width: 16px; + height: 16px; +} + +.column-row { + display: flex; + align-items: center; + gap: 8px; + border-bottom: 1px solid var(--fill-4); + height: 32px; + padding-bottom: 6px; +} + +.column-icon { + width: 18px; + height: 18px; +} + +.column-label { + flex: 1; + color: var(--text-3); + font-size: 12px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.select-btn { + border: 0; + background: transparent; + cursor: pointer; + padding: 0; + width: 20px; + height: 20px; +} + +.select-btn img { + width: 20px; + height: 20px; +} + +.preview-panel { + padding: 8px; + display: flex; + flex-direction: column; +} + +.preview-head { + display: flex; + justify-content: space-between; + gap: 12px; + align-items: center; + margin-bottom: 6px; +} + +.preview-controls { + display: flex; + align-items: center; + gap: 8px; +} + +.preview-controls label { + display: inline-flex; + align-items: center; + gap: 4px; + color: var(--text-4); + font-size: 12px; +} + +.preview-controls select, +.preview-controls input { + accent-color: var(--primary-7); +} + +.example-line { + margin: 4px 0 8px; + color: var(--text-4); + font-size: 12px; +} + +.chart-area { + background: var(--fill-1); + border-radius: 8px; + min-height: 480px; + flex: 1; +} + +.warning-area { + margin-top: 8px; + font-size: 12px; + color: var(--text-4); +} + +.warning-area ul { + margin: 6px 0 0; + padding-left: 18px; +} + +.error-text { + color: #cb272d; + font-size: 12px; + margin-bottom: 6px; +} + +.footer { + margin-top: 6px; + color: var(--text-3); + font-size: 16px; +} + +@media (max-width: 1024px) { + .top-bar { + flex-direction: column; + align-items: stretch; + } + + .toolbar { + justify-content: flex-start; + flex-wrap: wrap; + } + + .theme-popover { + right: 12px; + top: 120px; + } + + .content { + grid-template-columns: 1fr; + } + + .left-pane { + flex-direction: row; + flex-wrap: wrap; + } + + .block-panel { + flex: 1; + min-width: 280px; + } + + .chart-area { + min-height: 360px; + } + + .footer { + font-size: 14px; + } +} + +@media (max-width: 640px) { + .page { + padding: 8px; + } + + .logo { + width: 48px; + height: 48px; + border-radius: 12px; + } + + .title-logo { + width: 160px; + } + + .tool-label { + font-size: 12px; + } + + .upload-area { + min-width: 220px; + } + + .block-panel h2, + .preview-head h2 { + font-size: 20px; + } + + .field-title-wrap h3 { + font-size: 16px; + } +} diff --git a/src/types/shims-vue.d.ts b/src/types/shims-vue.d.ts new file mode 100644 index 0000000..6aff71b --- /dev/null +++ b/src/types/shims-vue.d.ts @@ -0,0 +1,6 @@ +declare module '*.vue' { + import type { DefineComponent } from 'vue'; + + const component: DefineComponent, Record, unknown>; + export default component; +} diff --git a/tests/core.spec.ts b/tests/core.spec.ts new file mode 100644 index 0000000..8a149bf --- /dev/null +++ b/tests/core.spec.ts @@ -0,0 +1,47 @@ +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { describe, expect, it } from 'vitest'; +import { buildSankeyData, parseCsvText, parseXlsxBuffer } from '../src/core'; + +describe('core parser & sankey', () => { + it('可以解析 CSV 并生成列名与数据行', () => { + const table = parseCsvText('A,B,C\n1,2,3\n4,5,6'); + + expect(table.headers).toEqual(['A', 'B', 'C']); + expect(table.rows).toEqual([ + ['1', '2', '3'], + ['4', '5', '6'] + ]); + }); + + it('支持合并单元格语义向下补全并聚合', () => { + const table = { + headers: ['站点', '值', '目标', '模型'], + rows: [ + ['宁波北欧10', '2582', '嘉兴四级算力池', '小模型'], + ['宁波北欧12', '2610', '', ''], + ['宁波鄞中15', '507', '嘉兴四级算力池', '小模型'] + ] + }; + + const result = buildSankeyData(table, { + sourceDataColumn: 1, + sourceDescriptionColumns: [0, 1], + targetDescriptionColumns: [2, 3], + delimiter: '-' + }); + + expect(result.meta.droppedRows).toBe(0); + expect(result.links).toHaveLength(3); + expect(result.links[1].target).toBe('嘉兴四级算力池-小模型'); + }); + + it('可以解析 data/example0.xlsx', () => { + const filePath = resolve(process.cwd(), 'data/example0.xlsx'); + const fileBuffer = readFileSync(filePath); + const table = parseXlsxBuffer(fileBuffer.buffer.slice(fileBuffer.byteOffset, fileBuffer.byteOffset + fileBuffer.byteLength)); + + expect(table.headers.length).toBeGreaterThan(1); + expect(table.rows.length).toBeGreaterThan(0); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..fd7b98c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "jsx": "preserve", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["vite/client", "vitest/globals", "node"], + "skipLibCheck": true, + "baseUrl": "." + }, + "include": ["src/**/*.ts", "src/**/*.vue", "tests/**/*.ts", "vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..4d1408a --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import { readFileSync } from 'node:fs'; +import { homedir } from 'node:os'; +import { join } from 'node:path'; + +const certDir = join(homedir(), 'mac.biboer.cn_ecc'); +const httpsCert = readFileSync(join(certDir, 'fullchain.cer')); +const httpsKey = readFileSync(join(certDir, 'mac.biboer.cn.key')); + +export default defineConfig({ + plugins: [vue()], + server: { + host: '0.0.0.0', + port: 5173, + strictPort: true, + allowedHosts: ['mac.biboer.cn'], + https: { + cert: httpsCert, + key: httpsKey + } + } +});