Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
dae0d532
Unverified
Commit
dae0d532
authored
Jan 16, 2026
by
Wesley Liddick
Committed by
GitHub
Jan 16, 2026
Browse files
Merge pull request #315 from mt21625457/main
perf(前端): 优化页面加载性能和用户体验 和 修复静态 import 导致入口文件膨胀问题
parents
34415db7
74a3c745
Changes
18
Hide whitespace changes
Inline
Side-by-side
deploy/Caddyfile
View file @
dae0d532
...
...
@@ -33,6 +33,22 @@
# 修改为你的域名
example.com {
# =========================================================================
# 静态资源长期缓存(高优先级,放在最前面)
# 带 hash 的文件可以永久缓存,浏览器和 CDN 都会缓存
# =========================================================================
@static {
path /assets/*
path /logo.png
path /favicon.ico
}
header @static {
Cache-Control "public, max-age=31536000, immutable"
# 移除可能干扰缓存的头
-Pragma
-Expires
}
# =========================================================================
# TLS 安全配置
# =========================================================================
...
...
frontend/package-lock.json
View file @
dae0d532
...
...
@@ -28,14 +28,18 @@
"@typescript-eslint/eslint-plugin"
:
"^7.18.0"
,
"@typescript-eslint/parser"
:
"^7.18.0"
,
"@vitejs/plugin-vue"
:
"^5.2.3"
,
"@vitest/coverage-v8"
:
"^2.1.9"
,
"@vue/test-utils"
:
"^2.4.6"
,
"autoprefixer"
:
"^10.4.16"
,
"eslint"
:
"^8.57.0"
,
"eslint-plugin-vue"
:
"^9.25.0"
,
"jsdom"
:
"^24.1.3"
,
"postcss"
:
"^8.4.32"
,
"tailwindcss"
:
"^3.4.0"
,
"typescript"
:
"~5.6.0"
,
"vite"
:
"^5.0.10"
,
"vite-plugin-checker"
:
"^0.9.1"
,
"vitest"
:
"^2.1.9"
,
"vue-tsc"
:
"^2.2.0"
}
},
...
...
@@ -52,6 +56,20 @@
"url"
:
"https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@ampproject/remapping"
:
{
"version"
:
"2.3.0"
,
"resolved"
:
"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz"
,
"integrity"
:
"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="
,
"dev"
:
true
,
"license"
:
"Apache-2.0"
,
"dependencies"
:
{
"@jridgewell/gen-mapping"
:
"^0.3.5"
,
"@jridgewell/trace-mapping"
:
"^0.3.24"
},
"engines"
:
{
"node"
:
">=6.0.0"
}
},
"node_modules/@ant-design/cssinjs"
:
{
"version"
:
"2.0.2"
,
"resolved"
:
"https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-2.0.2.tgz"
,
...
...
@@ -71,6 +89,20 @@
"react-dom"
:
">=16.0.0"
}
},
"node_modules/@asamuzakjp/css-color"
:
{
"version"
:
"3.2.0"
,
"resolved"
:
"https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz"
,
"integrity"
:
"sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@csstools/css-calc"
:
"^2.1.3"
,
"@csstools/css-color-parser"
:
"^3.0.9"
,
"@csstools/css-parser-algorithms"
:
"^3.0.4"
,
"@csstools/css-tokenizer"
:
"^3.0.3"
,
"lru-cache"
:
"^10.4.3"
}
},
"node_modules/@babel/code-frame"
:
{
"version"
:
"7.27.1"
,
"resolved"
:
"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz"
,
...
...
@@ -210,6 +242,128 @@
"node"
:
">=6.9.0"
}
},
"node_modules/@bcoe/v8-coverage"
:
{
"version"
:
"0.2.3"
,
"resolved"
:
"https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz"
,
"integrity"
:
"sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/@csstools/color-helpers"
:
{
"version"
:
"5.1.0"
,
"resolved"
:
"https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz"
,
"integrity"
:
"sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA=="
,
"dev"
:
true
,
"funding"
:
[
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/csstools"
},
{
"type"
:
"opencollective"
,
"url"
:
"https://opencollective.com/csstools"
}
],
"license"
:
"MIT-0"
,
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@csstools/css-calc"
:
{
"version"
:
"2.1.4"
,
"resolved"
:
"https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz"
,
"integrity"
:
"sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ=="
,
"dev"
:
true
,
"funding"
:
[
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/csstools"
},
{
"type"
:
"opencollective"
,
"url"
:
"https://opencollective.com/csstools"
}
],
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=18"
},
"peerDependencies"
:
{
"@csstools/css-parser-algorithms"
:
"^3.0.5"
,
"@csstools/css-tokenizer"
:
"^3.0.4"
}
},
"node_modules/@csstools/css-color-parser"
:
{
"version"
:
"3.1.0"
,
"resolved"
:
"https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz"
,
"integrity"
:
"sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA=="
,
"dev"
:
true
,
"funding"
:
[
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/csstools"
},
{
"type"
:
"opencollective"
,
"url"
:
"https://opencollective.com/csstools"
}
],
"license"
:
"MIT"
,
"dependencies"
:
{
"@csstools/color-helpers"
:
"^5.1.0"
,
"@csstools/css-calc"
:
"^2.1.4"
},
"engines"
:
{
"node"
:
">=18"
},
"peerDependencies"
:
{
"@csstools/css-parser-algorithms"
:
"^3.0.5"
,
"@csstools/css-tokenizer"
:
"^3.0.4"
}
},
"node_modules/@csstools/css-parser-algorithms"
:
{
"version"
:
"3.0.5"
,
"resolved"
:
"https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz"
,
"integrity"
:
"sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ=="
,
"dev"
:
true
,
"funding"
:
[
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/csstools"
},
{
"type"
:
"opencollective"
,
"url"
:
"https://opencollective.com/csstools"
}
],
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=18"
},
"peerDependencies"
:
{
"@csstools/css-tokenizer"
:
"^3.0.4"
}
},
"node_modules/@csstools/css-tokenizer"
:
{
"version"
:
"3.0.4"
,
"resolved"
:
"https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz"
,
"integrity"
:
"sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="
,
"dev"
:
true
,
"funding"
:
[
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/csstools"
},
{
"type"
:
"opencollective"
,
"url"
:
"https://opencollective.com/csstools"
}
],
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/@emotion/babel-plugin"
:
{
"version"
:
"11.13.5"
,
"resolved"
:
"https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz"
,
...
...
@@ -951,6 +1105,63 @@
"url"
:
"https://github.com/sponsors/kazupon"
}
},
"node_modules/@isaacs/cliui"
:
{
"version"
:
"8.0.2"
,
"resolved"
:
"https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz"
,
"integrity"
:
"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"dependencies"
:
{
"string-width"
:
"^5.1.2"
,
"string-width-cjs"
:
"npm:string-width@^4.2.0"
,
"strip-ansi"
:
"^7.0.1"
,
"strip-ansi-cjs"
:
"npm:strip-ansi@^6.0.1"
,
"wrap-ansi"
:
"^8.1.0"
,
"wrap-ansi-cjs"
:
"npm:wrap-ansi@^7.0.0"
},
"engines"
:
{
"node"
:
">=12"
}
},
"node_modules/@isaacs/cliui/node_modules/ansi-regex"
:
{
"version"
:
"6.2.2"
,
"resolved"
:
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz"
,
"integrity"
:
"sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=12"
},
"funding"
:
{
"url"
:
"https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/strip-ansi"
:
{
"version"
:
"7.1.2"
,
"resolved"
:
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz"
,
"integrity"
:
"sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"ansi-regex"
:
"^6.0.1"
},
"engines"
:
{
"node"
:
">=12"
},
"funding"
:
{
"url"
:
"https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/@istanbuljs/schema"
:
{
"version"
:
"0.1.3"
,
"resolved"
:
"https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz"
,
"integrity"
:
"sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=8"
}
},
"node_modules/@jridgewell/gen-mapping"
:
{
"version"
:
"0.3.13"
,
"resolved"
:
"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"
,
...
...
@@ -1050,6 +1261,24 @@
"node"
:
">= 8"
}
},
"node_modules/@one-ini/wasm"
:
{
"version"
:
"0.1.1"
,
"resolved"
:
"https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz"
,
"integrity"
:
"sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/@pkgjs/parseargs"
:
{
"version"
:
"0.11.0"
,
"resolved"
:
"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz"
,
"integrity"
:
"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"optional"
:
true
,
"engines"
:
{
"node"
:
">=14"
}
},
"node_modules/@rc-component/util"
:
{
"version"
:
"1.7.0"
,
"resolved"
:
"https://registry.npmjs.org/@rc-component/util/-/util-1.7.0.tgz"
,
...
...
@@ -1671,6 +1900,162 @@
"vue"
:
"^3.2.25"
}
},
"node_modules/@vitest/coverage-v8"
:
{
"version"
:
"2.1.9"
,
"resolved"
:
"https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz"
,
"integrity"
:
"sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@ampproject/remapping"
:
"^2.3.0"
,
"@bcoe/v8-coverage"
:
"^0.2.3"
,
"debug"
:
"^4.3.7"
,
"istanbul-lib-coverage"
:
"^3.2.2"
,
"istanbul-lib-report"
:
"^3.0.1"
,
"istanbul-lib-source-maps"
:
"^5.0.6"
,
"istanbul-reports"
:
"^3.1.7"
,
"magic-string"
:
"^0.30.12"
,
"magicast"
:
"^0.3.5"
,
"std-env"
:
"^3.8.0"
,
"test-exclude"
:
"^7.0.1"
,
"tinyrainbow"
:
"^1.2.0"
},
"funding"
:
{
"url"
:
"https://opencollective.com/vitest"
},
"peerDependencies"
:
{
"@vitest/browser"
:
"2.1.9"
,
"vitest"
:
"2.1.9"
},
"peerDependenciesMeta"
:
{
"@vitest/browser"
:
{
"optional"
:
true
}
}
},
"node_modules/@vitest/expect"
:
{
"version"
:
"2.1.9"
,
"resolved"
:
"https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz"
,
"integrity"
:
"sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@vitest/spy"
:
"2.1.9"
,
"@vitest/utils"
:
"2.1.9"
,
"chai"
:
"^5.1.2"
,
"tinyrainbow"
:
"^1.2.0"
},
"funding"
:
{
"url"
:
"https://opencollective.com/vitest"
}
},
"node_modules/@vitest/mocker"
:
{
"version"
:
"2.1.9"
,
"resolved"
:
"https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz"
,
"integrity"
:
"sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@vitest/spy"
:
"2.1.9"
,
"estree-walker"
:
"^3.0.3"
,
"magic-string"
:
"^0.30.12"
},
"funding"
:
{
"url"
:
"https://opencollective.com/vitest"
},
"peerDependencies"
:
{
"msw"
:
"^2.4.9"
,
"vite"
:
"^5.0.0"
},
"peerDependenciesMeta"
:
{
"msw"
:
{
"optional"
:
true
},
"vite"
:
{
"optional"
:
true
}
}
},
"node_modules/@vitest/mocker/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/@vitest/pretty-format"
:
{
"version"
:
"2.1.9"
,
"resolved"
:
"https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz"
,
"integrity"
:
"sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"tinyrainbow"
:
"^1.2.0"
},
"funding"
:
{
"url"
:
"https://opencollective.com/vitest"
}
},
"node_modules/@vitest/runner"
:
{
"version"
:
"2.1.9"
,
"resolved"
:
"https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz"
,
"integrity"
:
"sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@vitest/utils"
:
"2.1.9"
,
"pathe"
:
"^1.1.2"
},
"funding"
:
{
"url"
:
"https://opencollective.com/vitest"
}
},
"node_modules/@vitest/snapshot"
:
{
"version"
:
"2.1.9"
,
"resolved"
:
"https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz"
,
"integrity"
:
"sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@vitest/pretty-format"
:
"2.1.9"
,
"magic-string"
:
"^0.30.12"
,
"pathe"
:
"^1.1.2"
},
"funding"
:
{
"url"
:
"https://opencollective.com/vitest"
}
},
"node_modules/@vitest/spy"
:
{
"version"
:
"2.1.9"
,
"resolved"
:
"https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz"
,
"integrity"
:
"sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"tinyspy"
:
"^3.0.2"
},
"funding"
:
{
"url"
:
"https://opencollective.com/vitest"
}
},
"node_modules/@vitest/utils"
:
{
"version"
:
"2.1.9"
,
"resolved"
:
"https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz"
,
"integrity"
:
"sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@vitest/pretty-format"
:
"2.1.9"
,
"loupe"
:
"^3.1.2"
,
"tinyrainbow"
:
"^1.2.0"
},
"funding"
:
{
"url"
:
"https://opencollective.com/vitest"
}
},
"node_modules/@volar/language-core"
:
{
"version"
:
"2.4.15"
,
"resolved"
:
"https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz"
,
...
...
@@ -1842,6 +2227,17 @@
"integrity"
:
"sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A=="
,
"license"
:
"MIT"
},
"node_modules/@vue/test-utils"
:
{
"version"
:
"2.4.6"
,
"resolved"
:
"https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz"
,
"integrity"
:
"sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"js-beautify"
:
"^1.14.9"
,
"vue-component-type-helpers"
:
"^2.0.0"
}
},
"node_modules/@vueuse/core"
:
{
"version"
:
"10.11.1"
,
"resolved"
:
"https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz"
,
...
...
@@ -1878,6 +2274,16 @@
"url"
:
"https://github.com/sponsors/antfu"
}
},
"node_modules/abbrev"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz"
,
"integrity"
:
"sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"engines"
:
{
"node"
:
"^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/acorn"
:
{
"version"
:
"8.15.0"
,
"resolved"
:
"https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
,
...
...
@@ -1910,6 +2316,16 @@
"node"
:
">=0.8"
}
},
"node_modules/agent-base"
:
{
"version"
:
"7.1.4"
,
"resolved"
:
"https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz"
,
"integrity"
:
"sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">= 14"
}
},
"node_modules/ajv"
:
{
"version"
:
"6.12.6"
,
"resolved"
:
"https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
,
...
...
@@ -2025,6 +2441,16 @@
"node"
:
">=8"
}
},
"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/asynckit"
:
{
"version"
:
"0.4.0"
,
"resolved"
:
"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
,
...
...
@@ -2188,6 +2614,16 @@
"node"
:
"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/cac"
:
{
"version"
:
"6.7.14"
,
"resolved"
:
"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz"
,
"integrity"
:
"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=8"
}
},
"node_modules/call-bind-apply-helpers"
:
{
"version"
:
"1.0.2"
,
"resolved"
:
"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz"
,
...
...
@@ -2254,8 +2690,25 @@
"node"
:
">=0.8"
}
},
"node_modules/chalk"
:
{
"version"
:
"4.1.2"
,
"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
,
...
...
@@ -2283,6 +2736,16 @@
"pnpm"
:
">=8"
}
},
"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/chokidar"
:
{
"version"
:
"3.6.0"
,
"resolved"
:
"https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz"
,
...
...
@@ -2388,6 +2851,17 @@
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/config-chain"
:
{
"version"
:
"1.1.13"
,
"resolved"
:
"https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz"
,
"integrity"
:
"sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"ini"
:
"^1.3.4"
,
"proto-list"
:
"~1.2.1"
}
},
"node_modules/convert-source-map"
:
{
"version"
:
"1.9.0"
,
"resolved"
:
"https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
,
...
...
@@ -2450,12 +2924,47 @@
"node"
:
">=4"
}
},
"node_modules/cssstyle"
:
{
"version"
:
"4.6.0"
,
"resolved"
:
"https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz"
,
"integrity"
:
"sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@asamuzakjp/css-color"
:
"^3.2.0"
,
"rrweb-cssom"
:
"^0.8.0"
},
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/cssstyle/node_modules/rrweb-cssom"
:
{
"version"
:
"0.8.0"
,
"resolved"
:
"https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz"
,
"integrity"
:
"sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"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/data-urls"
:
{
"version"
:
"5.0.0"
,
"resolved"
:
"https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz"
,
"integrity"
:
"sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"whatwg-mimetype"
:
"^4.0.0"
,
"whatwg-url"
:
"^14.0.0"
},
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/de-indent"
:
{
"version"
:
"1.0.2"
,
"resolved"
:
"https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz"
,
...
...
@@ -2480,6 +2989,23 @@
}
}
},
"node_modules/decimal.js"
:
{
"version"
:
"10.6.0"
,
"resolved"
:
"https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz"
,
"integrity"
:
"sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"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"
,
...
...
@@ -2556,6 +3082,58 @@
"node"
:
">= 0.4"
}
},
"node_modules/eastasianwidth"
:
{
"version"
:
"0.2.0"
,
"resolved"
:
"https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz"
,
"integrity"
:
"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/editorconfig"
:
{
"version"
:
"1.0.4"
,
"resolved"
:
"https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz"
,
"integrity"
:
"sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@one-ini/wasm"
:
"0.1.1"
,
"commander"
:
"^10.0.0"
,
"minimatch"
:
"9.0.1"
,
"semver"
:
"^7.5.3"
},
"bin"
:
{
"editorconfig"
:
"bin/editorconfig"
},
"engines"
:
{
"node"
:
">=14"
}
},
"node_modules/editorconfig/node_modules/commander"
:
{
"version"
:
"10.0.1"
,
"resolved"
:
"https://registry.npmjs.org/commander/-/commander-10.0.1.tgz"
,
"integrity"
:
"sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=14"
}
},
"node_modules/editorconfig/node_modules/minimatch"
:
{
"version"
:
"9.0.1"
,
"resolved"
:
"https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz"
,
"integrity"
:
"sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w=="
,
"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/electron-to-chromium"
:
{
"version"
:
"1.5.267"
,
"resolved"
:
"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz"
,
...
...
@@ -2563,6 +3141,13 @@
"dev"
:
true
,
"license"
:
"ISC"
},
"node_modules/emoji-regex"
:
{
"version"
:
"9.2.2"
,
"resolved"
:
"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz"
,
"integrity"
:
"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/entities"
:
{
"version"
:
"7.0.0"
,
"resolved"
:
"https://registry.npmjs.org/entities/-/entities-7.0.0.tgz"
,
...
...
@@ -2602,6 +3187,13 @@
"node"
:
">= 0.4"
}
},
"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/es-object-atoms"
:
{
"version"
:
"1.1.1"
,
"resolved"
:
"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz"
,
...
...
@@ -2894,6 +3486,16 @@
"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"
,
...
...
@@ -3070,6 +3672,23 @@
}
}
},
"node_modules/foreground-child"
:
{
"version"
:
"3.3.1"
,
"resolved"
:
"https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz"
,
"integrity"
:
"sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"dependencies"
:
{
"cross-spawn"
:
"^7.0.6"
,
"signal-exit"
:
"^4.0.1"
},
"engines"
:
{
"node"
:
">=14"
},
"funding"
:
{
"url"
:
"https://github.com/sponsors/isaacs"
}
},
"node_modules/form-data"
:
{
"version"
:
"4.0.5"
,
"resolved"
:
"https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz"
,
...
...
@@ -3366,6 +3985,67 @@
"integrity"
:
"sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
,
"license"
:
"MIT"
},
"node_modules/html-encoding-sniffer"
:
{
"version"
:
"4.0.0"
,
"resolved"
:
"https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz"
,
"integrity"
:
"sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"whatwg-encoding"
:
"^3.1.1"
},
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/html-escaper"
:
{
"version"
:
"2.0.2"
,
"resolved"
:
"https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz"
,
"integrity"
:
"sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/http-proxy-agent"
:
{
"version"
:
"7.0.2"
,
"resolved"
:
"https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz"
,
"integrity"
:
"sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"agent-base"
:
"^7.1.0"
,
"debug"
:
"^4.3.4"
},
"engines"
:
{
"node"
:
">= 14"
}
},
"node_modules/https-proxy-agent"
:
{
"version"
:
"7.0.6"
,
"resolved"
:
"https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz"
,
"integrity"
:
"sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"agent-base"
:
"^7.1.2"
,
"debug"
:
"4"
},
"engines"
:
{
"node"
:
">= 14"
}
},
"node_modules/iconv-lite"
:
{
"version"
:
"0.6.3"
,
"resolved"
:
"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
,
"integrity"
:
"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"safer-buffer"
:
">= 2.1.2 < 3.0.0"
},
"engines"
:
{
"node"
:
">=0.10.0"
}
},
"node_modules/ignore"
:
{
"version"
:
"5.3.2"
,
"resolved"
:
"https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
,
...
...
@@ -3421,6 +4101,13 @@
"dev"
:
true
,
"license"
:
"ISC"
},
"node_modules/ini"
:
{
"version"
:
"1.3.8"
,
"resolved"
:
"https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"
,
"integrity"
:
"sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
,
"dev"
:
true
,
"license"
:
"ISC"
},
"node_modules/is-arrayish"
:
{
"version"
:
"0.2.1"
,
"resolved"
:
"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
,
...
...
@@ -3465,6 +4152,16 @@
"node"
:
">=0.10.0"
}
},
"node_modules/is-fullwidth-code-point"
:
{
"version"
:
"3.0.0"
,
"resolved"
:
"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
,
"integrity"
:
"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=8"
}
},
"node_modules/is-glob"
:
{
"version"
:
"4.0.3"
,
"resolved"
:
"https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
,
...
...
@@ -3504,6 +4201,13 @@
"node"
:
">=8"
}
},
"node_modules/is-potential-custom-element-name"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz"
,
"integrity"
:
"sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/isexe"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
,
...
...
@@ -3511,6 +4215,76 @@
"dev"
:
true
,
"license"
:
"ISC"
},
"node_modules/istanbul-lib-coverage"
:
{
"version"
:
"3.2.2"
,
"resolved"
:
"https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz"
,
"integrity"
:
"sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="
,
"dev"
:
true
,
"license"
:
"BSD-3-Clause"
,
"engines"
:
{
"node"
:
">=8"
}
},
"node_modules/istanbul-lib-report"
:
{
"version"
:
"3.0.1"
,
"resolved"
:
"https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz"
,
"integrity"
:
"sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="
,
"dev"
:
true
,
"license"
:
"BSD-3-Clause"
,
"dependencies"
:
{
"istanbul-lib-coverage"
:
"^3.0.0"
,
"make-dir"
:
"^4.0.0"
,
"supports-color"
:
"^7.1.0"
},
"engines"
:
{
"node"
:
">=10"
}
},
"node_modules/istanbul-lib-source-maps"
:
{
"version"
:
"5.0.6"
,
"resolved"
:
"https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz"
,
"integrity"
:
"sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A=="
,
"dev"
:
true
,
"license"
:
"BSD-3-Clause"
,
"dependencies"
:
{
"@jridgewell/trace-mapping"
:
"^0.3.23"
,
"debug"
:
"^4.1.1"
,
"istanbul-lib-coverage"
:
"^3.0.0"
},
"engines"
:
{
"node"
:
">=10"
}
},
"node_modules/istanbul-reports"
:
{
"version"
:
"3.2.0"
,
"resolved"
:
"https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz"
,
"integrity"
:
"sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="
,
"dev"
:
true
,
"license"
:
"BSD-3-Clause"
,
"dependencies"
:
{
"html-escaper"
:
"^2.0.0"
,
"istanbul-lib-report"
:
"^3.0.0"
},
"engines"
:
{
"node"
:
">=8"
}
},
"node_modules/jackspeak"
:
{
"version"
:
"3.4.3"
,
"resolved"
:
"https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz"
,
"integrity"
:
"sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="
,
"dev"
:
true
,
"license"
:
"BlueOak-1.0.0"
,
"dependencies"
:
{
"@isaacs/cliui"
:
"^8.0.2"
},
"funding"
:
{
"url"
:
"https://github.com/sponsors/isaacs"
},
"optionalDependencies"
:
{
"@pkgjs/parseargs"
:
"^0.11.0"
}
},
"node_modules/jiti"
:
{
"version"
:
"1.21.7"
,
"resolved"
:
"https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz"
,
...
...
@@ -3521,6 +4295,59 @@
"jiti"
:
"bin/jiti.js"
}
},
"node_modules/js-beautify"
:
{
"version"
:
"1.15.4"
,
"resolved"
:
"https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz"
,
"integrity"
:
"sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"config-chain"
:
"^1.1.13"
,
"editorconfig"
:
"^1.0.4"
,
"glob"
:
"^10.4.2"
,
"js-cookie"
:
"^3.0.5"
,
"nopt"
:
"^7.2.1"
},
"bin"
:
{
"css-beautify"
:
"js/bin/css-beautify.js"
,
"html-beautify"
:
"js/bin/html-beautify.js"
,
"js-beautify"
:
"js/bin/js-beautify.js"
},
"engines"
:
{
"node"
:
">=14"
}
},
"node_modules/js-beautify/node_modules/glob"
:
{
"version"
:
"10.5.0"
,
"resolved"
:
"https://registry.npmjs.org/glob/-/glob-10.5.0.tgz"
,
"integrity"
:
"sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"dependencies"
:
{
"foreground-child"
:
"^3.1.0"
,
"jackspeak"
:
"^3.1.2"
,
"minimatch"
:
"^9.0.4"
,
"minipass"
:
"^7.1.2"
,
"package-json-from-dist"
:
"^1.0.0"
,
"path-scurry"
:
"^1.11.1"
},
"bin"
:
{
"glob"
:
"dist/esm/bin.mjs"
},
"funding"
:
{
"url"
:
"https://github.com/sponsors/isaacs"
}
},
"node_modules/js-cookie"
:
{
"version"
:
"3.0.5"
,
"resolved"
:
"https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz"
,
"integrity"
:
"sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=14"
}
},
"node_modules/js-tokens"
:
{
"version"
:
"4.0.0"
,
"resolved"
:
"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
,
...
...
@@ -3540,6 +4367,57 @@
"js-yaml"
:
"bin/js-yaml.js"
}
},
"node_modules/jsdom"
:
{
"version"
:
"24.1.3"
,
"resolved"
:
"https://registry.npmjs.org/jsdom/-/jsdom-24.1.3.tgz"
,
"integrity"
:
"sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"cssstyle"
:
"^4.0.1"
,
"data-urls"
:
"^5.0.0"
,
"decimal.js"
:
"^10.4.3"
,
"form-data"
:
"^4.0.0"
,
"html-encoding-sniffer"
:
"^4.0.0"
,
"http-proxy-agent"
:
"^7.0.2"
,
"https-proxy-agent"
:
"^7.0.5"
,
"is-potential-custom-element-name"
:
"^1.0.1"
,
"nwsapi"
:
"^2.2.12"
,
"parse5"
:
"^7.1.2"
,
"rrweb-cssom"
:
"^0.7.1"
,
"saxes"
:
"^6.0.0"
,
"symbol-tree"
:
"^3.2.4"
,
"tough-cookie"
:
"^4.1.4"
,
"w3c-xmlserializer"
:
"^5.0.0"
,
"webidl-conversions"
:
"^7.0.0"
,
"whatwg-encoding"
:
"^3.1.1"
,
"whatwg-mimetype"
:
"^4.0.0"
,
"whatwg-url"
:
"^14.0.0"
,
"ws"
:
"^8.18.0"
,
"xml-name-validator"
:
"^5.0.0"
},
"engines"
:
{
"node"
:
">=18"
},
"peerDependencies"
:
{
"canvas"
:
"^2.11.2"
},
"peerDependenciesMeta"
:
{
"canvas"
:
{
"optional"
:
true
}
}
},
"node_modules/jsdom/node_modules/xml-name-validator"
:
{
"version"
:
"5.0.0"
,
"resolved"
:
"https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz"
,
"integrity"
:
"sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="
,
"dev"
:
true
,
"license"
:
"Apache-2.0"
,
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/jsesc"
:
{
"version"
:
"3.1.0"
,
"resolved"
:
"https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz"
,
...
...
@@ -3652,11 +4530,25 @@
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/lucide-react"
:
{
"version"
:
"0.469.0"
,
"resolved"
:
"https://registry.npmjs.org/lucide-react/-/lucide-react-0.469.0.tgz"
,
"integrity"
:
"sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw=="
,
"license"
:
"ISC"
,
"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/lru-cache"
:
{
"version"
:
"10.4.3"
,
"resolved"
:
"https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz"
,
"integrity"
:
"sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
,
"dev"
:
true
,
"license"
:
"ISC"
},
"node_modules/lucide-react"
:
{
"version"
:
"0.469.0"
,
"resolved"
:
"https://registry.npmjs.org/lucide-react/-/lucide-react-0.469.0.tgz"
,
"integrity"
:
"sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw=="
,
"license"
:
"ISC"
,
"peerDependencies"
:
{
"react"
:
"^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
...
...
@@ -3670,6 +4562,34 @@
"@jridgewell/sourcemap-codec"
:
"^1.5.5"
}
},
"node_modules/magicast"
:
{
"version"
:
"0.3.5"
,
"resolved"
:
"https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz"
,
"integrity"
:
"sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/parser"
:
"^7.25.4"
,
"@babel/types"
:
"^7.25.4"
,
"source-map-js"
:
"^1.2.0"
}
},
"node_modules/make-dir"
:
{
"version"
:
"4.0.0"
,
"resolved"
:
"https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz"
,
"integrity"
:
"sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"semver"
:
"^7.5.3"
},
"engines"
:
{
"node"
:
">=10"
},
"funding"
:
{
"url"
:
"https://github.com/sponsors/sindresorhus"
}
},
"node_modules/math-intrinsics"
:
{
"version"
:
"1.1.0"
,
"resolved"
:
"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
,
...
...
@@ -3740,6 +4660,16 @@
"url"
:
"https://github.com/sponsors/isaacs"
}
},
"node_modules/minipass"
:
{
"version"
:
"7.1.2"
,
"resolved"
:
"https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz"
,
"integrity"
:
"sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"engines"
:
{
"node"
:
">=16 || 14 >=14.17"
}
},
"node_modules/ms"
:
{
"version"
:
"2.1.3"
,
"resolved"
:
"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
,
...
...
@@ -3797,6 +4727,22 @@
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/nopt"
:
{
"version"
:
"7.2.1"
,
"resolved"
:
"https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz"
,
"integrity"
:
"sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"dependencies"
:
{
"abbrev"
:
"^2.0.0"
},
"bin"
:
{
"nopt"
:
"bin/nopt.js"
},
"engines"
:
{
"node"
:
"^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/normalize-path"
:
{
"version"
:
"3.0.0"
,
"resolved"
:
"https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
,
...
...
@@ -3850,6 +4796,13 @@
"url"
:
"https://github.com/fb55/nth-check?sponsor=1"
}
},
"node_modules/nwsapi"
:
{
"version"
:
"2.2.23"
,
"resolved"
:
"https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz"
,
"integrity"
:
"sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/object-assign"
:
{
"version"
:
"4.1.1"
,
"resolved"
:
"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
,
...
...
@@ -3930,6 +4883,13 @@
"url"
:
"https://github.com/sponsors/sindresorhus"
}
},
"node_modules/package-json-from-dist"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz"
,
"integrity"
:
"sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="
,
"dev"
:
true
,
"license"
:
"BlueOak-1.0.0"
},
"node_modules/parent-module"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
,
...
...
@@ -3960,6 +4920,32 @@
"url"
:
"https://github.com/sponsors/sindresorhus"
}
},
"node_modules/parse5"
:
{
"version"
:
"7.3.0"
,
"resolved"
:
"https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz"
,
"integrity"
:
"sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"entities"
:
"^6.0.0"
},
"funding"
:
{
"url"
:
"https://github.com/inikulin/parse5?sponsor=1"
}
},
"node_modules/parse5/node_modules/entities"
:
{
"version"
:
"6.0.1"
,
"resolved"
:
"https://registry.npmjs.org/entities/-/entities-6.0.1.tgz"
,
"integrity"
:
"sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="
,
"dev"
:
true
,
"license"
:
"BSD-2-Clause"
,
"engines"
:
{
"node"
:
">=0.12"
},
"funding"
:
{
"url"
:
"https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/path-browserify"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz"
,
...
...
@@ -4003,6 +4989,23 @@
"integrity"
:
"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
,
"license"
:
"MIT"
},
"node_modules/path-scurry"
:
{
"version"
:
"1.11.1"
,
"resolved"
:
"https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz"
,
"integrity"
:
"sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="
,
"dev"
:
true
,
"license"
:
"BlueOak-1.0.0"
,
"dependencies"
:
{
"lru-cache"
:
"^10.2.0"
,
"minipass"
:
"^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines"
:
{
"node"
:
">=16 || 14 >=14.18"
},
"funding"
:
{
"url"
:
"https://github.com/sponsors/isaacs"
}
},
"node_modules/path-type"
:
{
"version"
:
"4.0.0"
,
"resolved"
:
"https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
,
...
...
@@ -4012,6 +5015,23 @@
"node"
:
">=8"
}
},
"node_modules/pathe"
:
{
"version"
:
"1.1.2"
,
"resolved"
:
"https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz"
,
"integrity"
:
"sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
,
"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"
,
...
...
@@ -4257,12 +5277,32 @@
"node"
:
">= 0.8.0"
}
},
"node_modules/proto-list"
:
{
"version"
:
"1.2.4"
,
"resolved"
:
"https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz"
,
"integrity"
:
"sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="
,
"dev"
:
true
,
"license"
:
"ISC"
},
"node_modules/proxy-from-env"
:
{
"version"
:
"1.1.0"
,
"resolved"
:
"https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
,
"integrity"
:
"sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
,
"license"
:
"MIT"
},
"node_modules/psl"
:
{
"version"
:
"1.15.0"
,
"resolved"
:
"https://registry.npmjs.org/psl/-/psl-1.15.0.tgz"
,
"integrity"
:
"sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"punycode"
:
"^2.3.1"
},
"funding"
:
{
"url"
:
"https://github.com/sponsors/lupomontero"
}
},
"node_modules/punycode"
:
{
"version"
:
"2.3.1"
,
"resolved"
:
"https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
,
...
...
@@ -4273,6 +5313,13 @@
"node"
:
">=6"
}
},
"node_modules/querystringify"
:
{
"version"
:
"2.2.0"
,
"resolved"
:
"https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz"
,
"integrity"
:
"sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/queue-microtask"
:
{
"version"
:
"1.2.3"
,
"resolved"
:
"https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
,
...
...
@@ -4323,6 +5370,13 @@
"node"
:
">=8.10.0"
}
},
"node_modules/requires-port"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"
,
"integrity"
:
"sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/resolve"
:
{
"version"
:
"1.22.11"
,
"resolved"
:
"https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz"
,
...
...
@@ -4425,6 +5479,13 @@
"fsevents"
:
"~2.3.2"
}
},
"node_modules/rrweb-cssom"
:
{
"version"
:
"0.7.1"
,
"resolved"
:
"https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz"
,
"integrity"
:
"sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/run-parallel"
:
{
"version"
:
"1.2.0"
,
"resolved"
:
"https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
,
...
...
@@ -4449,6 +5510,26 @@
"queue-microtask"
:
"^1.2.2"
}
},
"node_modules/safer-buffer"
:
{
"version"
:
"2.1.2"
,
"resolved"
:
"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
,
"integrity"
:
"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/saxes"
:
{
"version"
:
"6.0.0"
,
"resolved"
:
"https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz"
,
"integrity"
:
"sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"dependencies"
:
{
"xmlchars"
:
"^2.2.0"
},
"engines"
:
{
"node"
:
">=v12.22.7"
}
},
"node_modules/semver"
:
{
"version"
:
"7.7.3"
,
"resolved"
:
"https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
,
...
...
@@ -4485,6 +5566,26 @@
"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/signal-exit"
:
{
"version"
:
"4.1.0"
,
"resolved"
:
"https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz"
,
"integrity"
:
"sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"engines"
:
{
"node"
:
">=14"
},
"funding"
:
{
"url"
:
"https://github.com/sponsors/isaacs"
}
},
"node_modules/slash"
:
{
"version"
:
"3.0.0"
,
"resolved"
:
"https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
,
...
...
@@ -4525,6 +5626,90 @@
"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/string-width"
:
{
"version"
:
"5.1.2"
,
"resolved"
:
"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz"
,
"integrity"
:
"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"eastasianwidth"
:
"^0.2.0"
,
"emoji-regex"
:
"^9.2.2"
,
"strip-ansi"
:
"^7.0.1"
},
"engines"
:
{
"node"
:
">=12"
},
"funding"
:
{
"url"
:
"https://github.com/sponsors/sindresorhus"
}
},
"node_modules/string-width-cjs"
:
{
"name"
:
"string-width"
,
"version"
:
"4.2.3"
,
"resolved"
:
"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
,
"integrity"
:
"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"emoji-regex"
:
"^8.0.0"
,
"is-fullwidth-code-point"
:
"^3.0.0"
,
"strip-ansi"
:
"^6.0.1"
},
"engines"
:
{
"node"
:
">=8"
}
},
"node_modules/string-width-cjs/node_modules/emoji-regex"
:
{
"version"
:
"8.0.0"
,
"resolved"
:
"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
,
"integrity"
:
"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/string-width/node_modules/ansi-regex"
:
{
"version"
:
"6.2.2"
,
"resolved"
:
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz"
,
"integrity"
:
"sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=12"
},
"funding"
:
{
"url"
:
"https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/string-width/node_modules/strip-ansi"
:
{
"version"
:
"7.1.2"
,
"resolved"
:
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz"
,
"integrity"
:
"sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"ansi-regex"
:
"^6.0.1"
},
"engines"
:
{
"node"
:
">=12"
},
"funding"
:
{
"url"
:
"https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/strip-ansi"
:
{
"version"
:
"6.0.1"
,
"resolved"
:
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
,
...
...
@@ -4538,6 +5723,20 @@
"node"
:
">=8"
}
},
"node_modules/strip-ansi-cjs"
:
{
"name"
:
"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"
,
...
...
@@ -4605,6 +5804,13 @@
"url"
:
"https://github.com/sponsors/ljharb"
}
},
"node_modules/symbol-tree"
:
{
"version"
:
"3.2.4"
,
"resolved"
:
"https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz"
,
"integrity"
:
"sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/tailwindcss"
:
{
"version"
:
"3.4.19"
,
"resolved"
:
"https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz"
,
...
...
@@ -4643,6 +5849,42 @@
"node"
:
">=14.0.0"
}
},
"node_modules/test-exclude"
:
{
"version"
:
"7.0.1"
,
"resolved"
:
"https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz"
,
"integrity"
:
"sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"dependencies"
:
{
"@istanbuljs/schema"
:
"^0.1.2"
,
"glob"
:
"^10.4.1"
,
"minimatch"
:
"^9.0.4"
},
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/test-exclude/node_modules/glob"
:
{
"version"
:
"10.5.0"
,
"resolved"
:
"https://registry.npmjs.org/glob/-/glob-10.5.0.tgz"
,
"integrity"
:
"sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="
,
"dev"
:
true
,
"license"
:
"ISC"
,
"dependencies"
:
{
"foreground-child"
:
"^3.1.0"
,
"jackspeak"
:
"^3.1.2"
,
"minimatch"
:
"^9.0.4"
,
"minipass"
:
"^7.1.2"
,
"package-json-from-dist"
:
"^1.0.0"
,
"path-scurry"
:
"^1.11.1"
},
"bin"
:
{
"glob"
:
"dist/esm/bin.mjs"
},
"funding"
:
{
"url"
:
"https://github.com/sponsors/isaacs"
}
},
"node_modules/text-table"
:
{
"version"
:
"0.2.0"
,
"resolved"
:
"https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
,
...
...
@@ -4680,6 +5922,20 @@
"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"
,
...
...
@@ -4710,6 +5966,36 @@
"url"
:
"https://github.com/sponsors/jonschlinkert"
}
},
"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"
:
"1.2.0"
,
"resolved"
:
"https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz"
,
"integrity"
:
"sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=14.0.0"
}
},
"node_modules/tinyspy"
:
{
"version"
:
"3.0.2"
,
"resolved"
:
"https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz"
,
"integrity"
:
"sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=14.0.0"
}
},
"node_modules/to-regex-range"
:
{
"version"
:
"5.0.1"
,
"resolved"
:
"https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
,
...
...
@@ -4723,6 +6009,35 @@
"node"
:
">=8.0"
}
},
"node_modules/tough-cookie"
:
{
"version"
:
"4.1.4"
,
"resolved"
:
"https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz"
,
"integrity"
:
"sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag=="
,
"dev"
:
true
,
"license"
:
"BSD-3-Clause"
,
"dependencies"
:
{
"psl"
:
"^1.1.33"
,
"punycode"
:
"^2.1.1"
,
"universalify"
:
"^0.2.0"
,
"url-parse"
:
"^1.5.3"
},
"engines"
:
{
"node"
:
">=6"
}
},
"node_modules/tr46"
:
{
"version"
:
"5.1.1"
,
"resolved"
:
"https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz"
,
"integrity"
:
"sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"punycode"
:
"^2.3.1"
},
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/ts-api-utils"
:
{
"version"
:
"1.4.3"
,
"resolved"
:
"https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz"
,
...
...
@@ -4803,6 +6118,16 @@
"url"
:
"https://github.com/sponsors/sindresorhus"
}
},
"node_modules/universalify"
:
{
"version"
:
"0.2.0"
,
"resolved"
:
"https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz"
,
"integrity"
:
"sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">= 4.0.0"
}
},
"node_modules/update-browserslist-db"
:
{
"version"
:
"1.2.3"
,
"resolved"
:
"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz"
,
...
...
@@ -4844,6 +6169,17 @@
"punycode"
:
"^2.1.0"
}
},
"node_modules/url-parse"
:
{
"version"
:
"1.5.10"
,
"resolved"
:
"https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz"
,
"integrity"
:
"sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"querystringify"
:
"^2.1.1"
,
"requires-port"
:
"^1.0.0"
}
},
"node_modules/use-merge-value"
:
{
"version"
:
"1.2.0"
,
"resolved"
:
"https://registry.npmjs.org/use-merge-value/-/use-merge-value-1.2.0.tgz"
,
...
...
@@ -4920,6 +6256,29 @@
}
}
},
"node_modules/vite-node"
:
{
"version"
:
"2.1.9"
,
"resolved"
:
"https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz"
,
"integrity"
:
"sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"cac"
:
"^6.7.14"
,
"debug"
:
"^4.3.7"
,
"es-module-lexer"
:
"^1.5.4"
,
"pathe"
:
"^1.1.2"
,
"vite"
:
"^5.0.0"
},
"bin"
:
{
"vite-node"
:
"vite-node.mjs"
},
"engines"
:
{
"node"
:
"^18.0.0 || >=20.0.0"
},
"funding"
:
{
"url"
:
"https://opencollective.com/vitest"
}
},
"node_modules/vite-plugin-checker"
:
{
"version"
:
"0.9.3"
,
"resolved"
:
"https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.9.3.tgz"
,
...
...
@@ -5054,6 +6413,72 @@
"url"
:
"https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/vitest"
:
{
"version"
:
"2.1.9"
,
"resolved"
:
"https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz"
,
"integrity"
:
"sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@vitest/expect"
:
"2.1.9"
,
"@vitest/mocker"
:
"2.1.9"
,
"@vitest/pretty-format"
:
"^2.1.9"
,
"@vitest/runner"
:
"2.1.9"
,
"@vitest/snapshot"
:
"2.1.9"
,
"@vitest/spy"
:
"2.1.9"
,
"@vitest/utils"
:
"2.1.9"
,
"chai"
:
"^5.1.2"
,
"debug"
:
"^4.3.7"
,
"expect-type"
:
"^1.1.0"
,
"magic-string"
:
"^0.30.12"
,
"pathe"
:
"^1.1.2"
,
"std-env"
:
"^3.8.0"
,
"tinybench"
:
"^2.9.0"
,
"tinyexec"
:
"^0.3.1"
,
"tinypool"
:
"^1.0.1"
,
"tinyrainbow"
:
"^1.2.0"
,
"vite"
:
"^5.0.0"
,
"vite-node"
:
"2.1.9"
,
"why-is-node-running"
:
"^2.3.0"
},
"bin"
:
{
"vitest"
:
"vitest.mjs"
},
"engines"
:
{
"node"
:
"^18.0.0 || >=20.0.0"
},
"funding"
:
{
"url"
:
"https://opencollective.com/vitest"
},
"peerDependencies"
:
{
"@edge-runtime/vm"
:
"*"
,
"@types/node"
:
"^18.0.0 || >=20.0.0"
,
"@vitest/browser"
:
"2.1.9"
,
"@vitest/ui"
:
"2.1.9"
,
"happy-dom"
:
"*"
,
"jsdom"
:
"*"
},
"peerDependenciesMeta"
:
{
"@edge-runtime/vm"
:
{
"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"
,
...
...
@@ -5092,6 +6517,13 @@
"vue"
:
"^3.0.0-0 || ^2.7.0"
}
},
"node_modules/vue-component-type-helpers"
:
{
"version"
:
"2.2.12"
,
"resolved"
:
"https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.12.tgz"
,
"integrity"
:
"sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/vue-demi"
:
{
"version"
:
"0.14.10"
,
"resolved"
:
"https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz"
,
...
...
@@ -5196,6 +6628,77 @@
"typescript"
:
">=5.0.0"
}
},
"node_modules/w3c-xmlserializer"
:
{
"version"
:
"5.0.0"
,
"resolved"
:
"https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz"
,
"integrity"
:
"sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"xml-name-validator"
:
"^5.0.0"
},
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/w3c-xmlserializer/node_modules/xml-name-validator"
:
{
"version"
:
"5.0.0"
,
"resolved"
:
"https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz"
,
"integrity"
:
"sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="
,
"dev"
:
true
,
"license"
:
"Apache-2.0"
,
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/webidl-conversions"
:
{
"version"
:
"7.0.0"
,
"resolved"
:
"https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz"
,
"integrity"
:
"sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
,
"dev"
:
true
,
"license"
:
"BSD-2-Clause"
,
"engines"
:
{
"node"
:
">=12"
}
},
"node_modules/whatwg-encoding"
:
{
"version"
:
"3.1.1"
,
"resolved"
:
"https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz"
,
"integrity"
:
"sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="
,
"deprecated"
:
"Use @exodus/bytes instead for a more spec-conformant and faster implementation"
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"iconv-lite"
:
"0.6.3"
},
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/whatwg-mimetype"
:
{
"version"
:
"4.0.0"
,
"resolved"
:
"https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz"
,
"integrity"
:
"sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/whatwg-url"
:
{
"version"
:
"14.2.0"
,
"resolved"
:
"https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz"
,
"integrity"
:
"sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"tr46"
:
"^5.1.0"
,
"webidl-conversions"
:
"^7.0.0"
},
"engines"
:
{
"node"
:
">=18"
}
},
"node_modules/which"
:
{
"version"
:
"2.0.2"
,
"resolved"
:
"https://registry.npmjs.org/which/-/which-2.0.2.tgz"
,
...
...
@@ -5212,6 +6715,23 @@
"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"
,
...
...
@@ -5240,6 +6760,107 @@
"node"
:
">=0.10.0"
}
},
"node_modules/wrap-ansi"
:
{
"version"
:
"8.1.0"
,
"resolved"
:
"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz"
,
"integrity"
:
"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"ansi-styles"
:
"^6.1.0"
,
"string-width"
:
"^5.0.1"
,
"strip-ansi"
:
"^7.0.1"
},
"engines"
:
{
"node"
:
">=12"
},
"funding"
:
{
"url"
:
"https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs"
:
{
"name"
:
"wrap-ansi"
,
"version"
:
"7.0.0"
,
"resolved"
:
"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
,
"integrity"
:
"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"ansi-styles"
:
"^4.0.0"
,
"string-width"
:
"^4.1.0"
,
"strip-ansi"
:
"^6.0.0"
},
"engines"
:
{
"node"
:
">=10"
},
"funding"
:
{
"url"
:
"https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs/node_modules/emoji-regex"
:
{
"version"
:
"8.0.0"
,
"resolved"
:
"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
,
"integrity"
:
"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/wrap-ansi-cjs/node_modules/string-width"
:
{
"version"
:
"4.2.3"
,
"resolved"
:
"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
,
"integrity"
:
"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"emoji-regex"
:
"^8.0.0"
,
"is-fullwidth-code-point"
:
"^3.0.0"
,
"strip-ansi"
:
"^6.0.1"
},
"engines"
:
{
"node"
:
">=8"
}
},
"node_modules/wrap-ansi/node_modules/ansi-regex"
:
{
"version"
:
"6.2.2"
,
"resolved"
:
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz"
,
"integrity"
:
"sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=12"
},
"funding"
:
{
"url"
:
"https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/wrap-ansi/node_modules/ansi-styles"
:
{
"version"
:
"6.2.3"
,
"resolved"
:
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz"
,
"integrity"
:
"sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=12"
},
"funding"
:
{
"url"
:
"https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/wrap-ansi/node_modules/strip-ansi"
:
{
"version"
:
"7.1.2"
,
"resolved"
:
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz"
,
"integrity"
:
"sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"dependencies"
:
{
"ansi-regex"
:
"^6.0.1"
},
"engines"
:
{
"node"
:
">=12"
},
"funding"
:
{
"url"
:
"https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/wrappy"
:
{
"version"
:
"1.0.2"
,
"resolved"
:
"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
,
...
...
@@ -5247,6 +6868,28 @@
"dev"
:
true
,
"license"
:
"ISC"
},
"node_modules/ws"
:
{
"version"
:
"8.19.0"
,
"resolved"
:
"https://registry.npmjs.org/ws/-/ws-8.19.0.tgz"
,
"integrity"
:
"sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="
,
"dev"
:
true
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=10.0.0"
},
"peerDependencies"
:
{
"bufferutil"
:
"^4.0.1"
,
"utf-8-validate"
:
">=5.0.2"
},
"peerDependenciesMeta"
:
{
"bufferutil"
:
{
"optional"
:
true
},
"utf-8-validate"
:
{
"optional"
:
true
}
}
},
"node_modules/xlsx"
:
{
"version"
:
"0.18.5"
,
"resolved"
:
"https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz"
,
...
...
@@ -5278,6 +6921,13 @@
"node"
:
">=12"
}
},
"node_modules/xmlchars"
:
{
"version"
:
"2.2.0"
,
"resolved"
:
"https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz"
,
"integrity"
:
"sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
,
"dev"
:
true
,
"license"
:
"MIT"
},
"node_modules/yaml"
:
{
"version"
:
"1.10.2"
,
"resolved"
:
"https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
,
...
...
frontend/package.json
View file @
dae0d532
...
...
@@ -9,7 +9,10 @@
"preview"
:
"vite preview"
,
"lint"
:
"eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix"
,
"lint:check"
:
"eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts"
,
"typecheck"
:
"vue-tsc --noEmit"
"typecheck"
:
"vue-tsc --noEmit"
,
"test"
:
"vitest"
,
"test:run"
:
"vitest run"
,
"test:coverage"
:
"vitest run --coverage"
},
"dependencies"
:
{
"@lobehub/icons"
:
"^4.0.2"
,
...
...
@@ -29,17 +32,21 @@
"@types/file-saver"
:
"^2.0.7"
,
"@types/mdx"
:
"^2.0.13"
,
"@types/node"
:
"^20.10.5"
,
"@vitejs/plugin-vue"
:
"^5.2.3"
,
"autoprefixer"
:
"^10.4.16"
,
"@typescript-eslint/eslint-plugin"
:
"^7.18.0"
,
"@typescript-eslint/parser"
:
"^7.18.0"
,
"@vitejs/plugin-vue"
:
"^5.2.3"
,
"@vitest/coverage-v8"
:
"^2.1.9"
,
"@vue/test-utils"
:
"^2.4.6"
,
"autoprefixer"
:
"^10.4.16"
,
"eslint"
:
"^8.57.0"
,
"eslint-plugin-vue"
:
"^9.25.0"
,
"jsdom"
:
"^24.1.3"
,
"postcss"
:
"^8.4.32"
,
"tailwindcss"
:
"^3.4.0"
,
"typescript"
:
"~5.6.0"
,
"vite"
:
"^5.0.10"
,
"vite-plugin-checker"
:
"^0.9.1"
,
"vitest"
:
"^2.1.9"
,
"vue-tsc"
:
"^2.2.0"
}
}
frontend/pnpm-lock.yaml
View file @
dae0d532
...
...
@@ -63,6 +63,12 @@ importers:
'
@vitejs/plugin-vue'
:
specifier
:
^5.2.3
version
:
5.2.4(vite@5.4.21(@types/node@20.19.27))(vue@3.5.26(typescript@5.6.3))
'
@vitest/coverage-v8'
:
specifier
:
^2.1.9
version
:
2.1.9(vitest@2.1.9(@types/node@20.19.27)(jsdom@24.1.3))
'
@vue/test-utils'
:
specifier
:
^2.4.6
version
:
2.4.6
autoprefixer
:
specifier
:
^10.4.16
version
:
10.4.23(postcss@8.5.6)
...
...
@@ -72,6 +78,9 @@ importers:
eslint-plugin-vue
:
specifier
:
^9.25.0
version
:
9.33.0(eslint@8.57.1)
jsdom
:
specifier
:
^24.1.3
version
:
24.1.3
postcss
:
specifier
:
^8.4.32
version
:
8.5.6
...
...
@@ -87,6 +96,9 @@ importers:
vite-plugin-checker
:
specifier
:
^0.9.1
version
:
0.9.3(eslint@8.57.1)(optionator@0.9.4)(typescript@5.6.3)(vite@5.4.21(@types/node@20.19.27))(vue-tsc@2.2.12(typescript@5.6.3))
vitest
:
specifier
:
^2.1.9
version
:
2.1.9(@types/node@20.19.27)(jsdom@24.1.3)
vue-tsc
:
specifier
:
^2.2.0
version
:
2.2.12(typescript@5.6.3)
...
...
@@ -97,6 +109,10 @@ packages:
resolution
:
{
integrity
:
sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
}
engines
:
{
node
:
'
>=10'
}
'
@ampproject/remapping@2.3.0'
:
resolution
:
{
integrity
:
sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
}
engines
:
{
node
:
'
>=6.0.0'
}
'
@ant-design/colors@8.0.0'
:
resolution
:
{
integrity
:
sha512-6YzkKCw30EI/E9kHOIXsQDHmMvTllT8STzjMb4K2qzit33RW2pqCJP0sk+hidBntXxE+Vz4n1+RvCTfBw6OErw==
}
...
...
@@ -135,6 +151,9 @@ packages:
'
@antfu/install-pkg@1.1.0'
:
resolution
:
{
integrity
:
sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==
}
'
@asamuzakjp/css-color@3.2.0'
:
resolution
:
{
integrity
:
sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==
}
'
@babel/code-frame@7.27.1'
:
resolution
:
{
integrity
:
sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==
}
engines
:
{
node
:
'
>=6.9.0'
}
...
...
@@ -201,6 +220,9 @@ packages:
'
@types/react'
:
optional
:
true
'
@bcoe/v8-coverage@0.2.3'
:
resolution
:
{
integrity
:
sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
}
'
@braintree/sanitize-url@7.1.1'
:
resolution
:
{
integrity
:
sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==
}
...
...
@@ -219,6 +241,34 @@ packages:
'
@chevrotain/utils@11.0.3'
:
resolution
:
{
integrity
:
sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==
}
'
@csstools/color-helpers@5.1.0'
:
resolution
:
{
integrity
:
sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==
}
engines
:
{
node
:
'
>=18'
}
'
@csstools/css-calc@2.1.4'
:
resolution
:
{
integrity
:
sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==
}
engines
:
{
node
:
'
>=18'
}
peerDependencies
:
'
@csstools/css-parser-algorithms'
:
^3.0.5
'@csstools/css-tokenizer'
:
^3.0.4
'
@csstools/css-color-parser@3.1.0'
:
resolution
:
{
integrity
:
sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==
}
engines
:
{
node
:
'
>=18'
}
peerDependencies
:
'
@csstools/css-parser-algorithms'
:
^3.0.5
'@csstools/css-tokenizer'
:
^3.0.4
'
@csstools/css-parser-algorithms@3.0.5'
:
resolution
:
{
integrity
:
sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==
}
engines
:
{
node
:
'
>=18'
}
peerDependencies
:
'
@csstools/css-tokenizer'
:
^3.0.4
'
@csstools/css-tokenizer@3.0.4'
:
resolution
:
{
integrity
:
sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==
}
engines
:
{
node
:
'
>=18'
}
'
@dnd-kit/accessibility@3.1.1'
:
resolution
:
{
integrity
:
sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==
}
peerDependencies
:
...
...
@@ -523,6 +573,14 @@ packages:
resolution
:
{
integrity
:
sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==
}
engines
:
{
node
:
'
>=
16'
}
'
@isaacs/cliui@8.0.2'
:
resolution
:
{
integrity
:
sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
}
engines
:
{
node
:
'
>=12'
}
'
@istanbuljs/schema@0.1.3'
:
resolution
:
{
integrity
:
sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
}
engines
:
{
node
:
'
>=8'
}
'
@jridgewell/gen-mapping@0.3.13'
:
resolution
:
{
integrity
:
sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
}
...
...
@@ -596,6 +654,13 @@ packages:
resolution
:
{
integrity
:
sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
}
engines
:
{
node
:
'
>=
8'
}
'
@one-ini/wasm@0.1.1'
:
resolution
:
{
integrity
:
sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==
}
'
@pkgjs/parseargs@0.11.0'
:
resolution
:
{
integrity
:
sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
}
engines
:
{
node
:
'
>=14'
}
'
@primer/octicons@19.21.1'
:
resolution
:
{
integrity
:
sha512-7tgtBkCNcg75YJnckinzvES+uxysYQCe+CHSEnzr3VYgxttzKRvfmrnVogl3aEuHCQP4xhiE9k2lFDhYwGtTzQ==
}
...
...
@@ -1505,6 +1570,44 @@ packages:
vite
:
^5.0.0 || ^6.0.0
vue
:
^3.2.25
'
@vitest/coverage-v8@2.1.9'
:
resolution
:
{
integrity
:
sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==
}
peerDependencies
:
'
@vitest/browser'
:
2.1.9
vitest
:
2.1.9
peerDependenciesMeta
:
'
@vitest/browser'
:
optional
:
true
'
@vitest/expect@2.1.9'
:
resolution
:
{
integrity
:
sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==
}
'
@vitest/mocker@2.1.9'
:
resolution
:
{
integrity
:
sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==
}
peerDependencies
:
msw
:
^2.4.9
vite
:
^5.0.0
peerDependenciesMeta
:
msw
:
optional
:
true
vite
:
optional
:
true
'
@vitest/pretty-format@2.1.9'
:
resolution
:
{
integrity
:
sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==
}
'
@vitest/runner@2.1.9'
:
resolution
:
{
integrity
:
sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==
}
'
@vitest/snapshot@2.1.9'
:
resolution
:
{
integrity
:
sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==
}
'
@vitest/spy@2.1.9'
:
resolution
:
{
integrity
:
sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==
}
'
@vitest/utils@2.1.9'
:
resolution
:
{
integrity
:
sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==
}
'
@volar/language-core@2.4.15'
:
resolution
:
{
integrity
:
sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==
}
...
...
@@ -1557,6 +1660,9 @@ packages:
'
@vue/shared@3.5.26'
:
resolution
:
{
integrity
:
sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==
}
'
@vue/test-utils@2.4.6'
:
resolution
:
{
integrity
:
sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==
}
'
@vueuse/core@10.11.1'
:
resolution
:
{
integrity
:
sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==
}
...
...
@@ -1566,6 +1672,10 @@ packages:
'
@vueuse/shared@10.11.1'
:
resolution
:
{
integrity
:
sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==
}
abbrev@2.0.0
:
resolution
:
{
integrity
:
sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==
}
engines
:
{
node
:
^14.17.0 || ^16.13.0 || >=18.0.0
}
acorn-jsx@5.3.2
:
resolution
:
{
integrity
:
sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
}
peerDependencies
:
...
...
@@ -1580,6 +1690,10 @@ packages:
resolution
:
{
integrity
:
sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==
}
engines
:
{
node
:
'
>=0.8'
}
agent-base@7.1.4
:
resolution
:
{
integrity
:
sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==
}
engines
:
{
node
:
'
>=
14'
}
ahooks@3.9.6
:
resolution
:
{
integrity
:
sha512-Mr7f05swd5SmKlR9SZo5U6M0LsL4ErweLzpdgXjA1JPmnZ78Vr6wzx0jUtvoxrcqGKYnX0Yjc02iEASVxHFPjQ==
}
peerDependencies
:
...
...
@@ -1604,6 +1718,10 @@ packages:
resolution
:
{
integrity
:
sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
}
engines
:
{
node
:
'
>=8'
}
ansi-styles@6.2.3
:
resolution
:
{
integrity
:
sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==
}
engines
:
{
node
:
'
>=12'
}
antd-style@4.1.0
:
resolution
:
{
integrity
:
sha512-vnPBGg0OVlSz90KRYZhxd89aZiOImTiesF+9MQqN8jsLGZUQTjbP04X9jTdEfsztKUuMbBWg/RmB/wHTakbtMQ==
}
peerDependencies
:
...
...
@@ -1633,6 +1751,10 @@ packages:
resolution
:
{
integrity
:
sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
}
engines
:
{
node
:
'
>=8'
}
assertion-error@2.0.1
:
resolution
:
{
integrity
:
sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==
}
engines
:
{
node
:
'
>=12'
}
assign-symbols@1.0.0
:
resolution
:
{
integrity
:
sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
}
engines
:
{
node
:
'
>=0.10.0'
}
...
...
@@ -1694,6 +1816,10 @@ packages:
engines
:
{
node
:
^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7
}
hasBin
:
true
cac@6.7.14
:
resolution
:
{
integrity
:
sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==
}
engines
:
{
node
:
'
>=8'
}
call-bind-apply-helpers@1.0.2
:
resolution
:
{
integrity
:
sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
}
engines
:
{
node
:
'
>=
0.4'
}
...
...
@@ -1716,6 +1842,10 @@ packages:
resolution
:
{
integrity
:
sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==
}
engines
:
{
node
:
'
>=0.8'
}
chai@5.3.3
:
resolution
:
{
integrity
:
sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==
}
engines
:
{
node
:
'
>=18'
}
chalk@4.1.2
:
resolution
:
{
integrity
:
sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
}
engines
:
{
node
:
'
>=10'
}
...
...
@@ -1736,6 +1866,10 @@ packages:
resolution
:
{
integrity
:
sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==
}
engines
:
{
pnpm
:
'
>=8'
}
check-error@2.1.3
:
resolution
:
{
integrity
:
sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==
}
engines
:
{
node
:
'
>=
16'
}
chevrotain-allstar@0.3.1
:
resolution
:
{
integrity
:
sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==
}
peerDependencies
:
...
...
@@ -1793,6 +1927,10 @@ packages:
comma-separated-tokens@2.0.3
:
resolution
:
{
integrity
:
sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==
}
commander@10.0.1
:
resolution
:
{
integrity
:
sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
}
engines
:
{
node
:
'
>=14'
}
commander@4.1.1
:
resolution
:
{
integrity
:
sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
}
engines
:
{
node
:
'
>=
6'
}
...
...
@@ -1814,6 +1952,9 @@ packages:
confbox@0.1.8
:
resolution
:
{
integrity
:
sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==
}
config-chain@1.1.13
:
resolution
:
{
integrity
:
sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
}
convert-source-map@1.9.0
:
resolution
:
{
integrity
:
sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
}
...
...
@@ -1841,6 +1982,10 @@ packages:
engines
:
{
node
:
'
>=4'
}
hasBin
:
true
cssstyle@4.6.0
:
resolution
:
{
integrity
:
sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==
}
engines
:
{
node
:
'
>=18'
}
csstype@3.2.3
:
resolution
:
{
integrity
:
sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
}
...
...
@@ -2000,6 +2145,10 @@ packages:
dagre-d3-es@7.0.13
:
resolution
:
{
integrity
:
sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==
}
data-urls@5.0.0
:
resolution
:
{
integrity
:
sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==
}
engines
:
{
node
:
'
>=18'
}
dayjs@1.11.19
:
resolution
:
{
integrity
:
sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==
}
...
...
@@ -2015,6 +2164,9 @@ packages:
supports-color
:
optional
:
true
decimal.js@10.6.0
:
resolution
:
{
integrity
:
sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==
}
decode-named-character-reference@1.2.0
:
resolution
:
{
integrity
:
sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==
}
...
...
@@ -2022,6 +2174,10 @@ packages:
resolution
:
{
integrity
:
sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==
}
engines
:
{
node
:
'
>=14.16'
}
deep-eql@5.0.2
:
resolution
:
{
integrity
:
sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==
}
engines
:
{
node
:
'
>=6'
}
deep-is@0.1.4
:
resolution
:
{
integrity
:
sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
}
...
...
@@ -2063,6 +2219,14 @@ packages:
resolution
:
{
integrity
:
sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
}
engines
:
{
node
:
'
>=
0.4'
}
eastasianwidth@0.2.0
:
resolution
:
{
integrity
:
sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
}
editorconfig@1.0.4
:
resolution
:
{
integrity
:
sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==
}
engines
:
{
node
:
'
>=14'
}
hasBin
:
true
electron-to-chromium@1.5.267
:
resolution
:
{
integrity
:
sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==
}
...
...
@@ -2072,6 +2236,12 @@ packages:
emoji-regex@10.6.0
:
resolution
:
{
integrity
:
sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==
}
emoji-regex@8.0.0
:
resolution
:
{
integrity
:
sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
}
emoji-regex@9.2.2
:
resolution
:
{
integrity
:
sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
}
entities@6.0.1
:
resolution
:
{
integrity
:
sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==
}
engines
:
{
node
:
'
>=0.12'
}
...
...
@@ -2091,6 +2261,9 @@ packages:
resolution
:
{
integrity
:
sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
}
engines
:
{
node
:
'
>=
0.4'
}
es-module-lexer@1.7.0
:
resolution
:
{
integrity
:
sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==
}
es-object-atoms@1.1.1
:
resolution
:
{
integrity
:
sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
}
engines
:
{
node
:
'
>=
0.4'
}
...
...
@@ -2189,6 +2362,10 @@ packages:
resolution
:
{
integrity
:
sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
}
engines
:
{
node
:
'
>=0.10.0'
}
expect-type@1.3.0
:
resolution
:
{
integrity
:
sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==
}
engines
:
{
node
:
'
>=12.0.0'
}
extend-shallow@2.0.1
:
resolution
:
{
integrity
:
sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==
}
engines
:
{
node
:
'
>=0.10.0'
}
...
...
@@ -2271,6 +2448,10 @@ packages:
resolution
:
{
integrity
:
sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==
}
engines
:
{
node
:
'
>=0.10.0'
}
foreground-child@3.3.1
:
resolution
:
{
integrity
:
sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==
}
engines
:
{
node
:
'
>=14'
}
form-data@4.0.5
:
resolution
:
{
integrity
:
sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==
}
engines
:
{
node
:
'
>=
6'
}
...
...
@@ -2334,6 +2515,10 @@ packages:
resolution
:
{
integrity
:
sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
}
engines
:
{
node
:
'
>=10.13.0'
}
glob@10.5.0
:
resolution
:
{
integrity
:
sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==
}
hasBin
:
true
glob@7.2.3
:
resolution
:
{
integrity
:
sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
}
deprecated
:
Glob versions prior to v9 are no longer supported
...
...
@@ -2421,12 +2606,27 @@ packages:
hoist-non-react-statics@3.3.2
:
resolution
:
{
integrity
:
sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
}
html-encoding-sniffer@4.0.0
:
resolution
:
{
integrity
:
sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==
}
engines
:
{
node
:
'
>=18'
}
html-escaper@2.0.2
:
resolution
:
{
integrity
:
sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
}
html-url-attributes@3.0.1
:
resolution
:
{
integrity
:
sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==
}
html-void-elements@3.0.0
:
resolution
:
{
integrity
:
sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==
}
http-proxy-agent@7.0.2
:
resolution
:
{
integrity
:
sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==
}
engines
:
{
node
:
'
>=
14'
}
https-proxy-agent@7.0.6
:
resolution
:
{
integrity
:
sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==
}
engines
:
{
node
:
'
>=
14'
}
iconv-lite@0.6.3
:
resolution
:
{
integrity
:
sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
}
engines
:
{
node
:
'
>=0.10.0'
}
...
...
@@ -2453,6 +2653,9 @@ packages:
inherits@2.0.4
:
resolution
:
{
integrity
:
sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
}
ini@1.3.8
:
resolution
:
{
integrity
:
sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
}
inline-style-parser@0.2.7
:
resolution
:
{
integrity
:
sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==
}
...
...
@@ -2499,6 +2702,10 @@ packages:
resolution
:
{
integrity
:
sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
}
engines
:
{
node
:
'
>=0.10.0'
}
is-fullwidth-code-point@3.0.0
:
resolution
:
{
integrity
:
sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
}
engines
:
{
node
:
'
>=8'
}
is-glob@4.0.3
:
resolution
:
{
integrity
:
sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
}
engines
:
{
node
:
'
>=0.10.0'
}
...
...
@@ -2525,6 +2732,9 @@ packages:
resolution
:
{
integrity
:
sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
}
engines
:
{
node
:
'
>=0.10.0'
}
is-potential-custom-element-name@1.0.1
:
resolution
:
{
integrity
:
sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
}
isexe@2.0.0
:
resolution
:
{
integrity
:
sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
}
...
...
@@ -2532,10 +2742,34 @@ packages:
resolution
:
{
integrity
:
sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
}
engines
:
{
node
:
'
>=0.10.0'
}
istanbul-lib-coverage@3.2.2
:
resolution
:
{
integrity
:
sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==
}
engines
:
{
node
:
'
>=8'
}
istanbul-lib-report@3.0.1
:
resolution
:
{
integrity
:
sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==
}
engines
:
{
node
:
'
>=10'
}
istanbul-lib-source-maps@5.0.6
:
resolution
:
{
integrity
:
sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==
}
engines
:
{
node
:
'
>=10'
}
istanbul-reports@3.2.0
:
resolution
:
{
integrity
:
sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==
}
engines
:
{
node
:
'
>=8'
}
jackspeak@3.4.3
:
resolution
:
{
integrity
:
sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
}
jiti@1.21.7
:
resolution
:
{
integrity
:
sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==
}
hasBin
:
true
js-beautify@1.15.4
:
resolution
:
{
integrity
:
sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==
}
engines
:
{
node
:
'
>=14'
}
hasBin
:
true
js-cookie@3.0.5
:
resolution
:
{
integrity
:
sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==
}
engines
:
{
node
:
'
>=14'
}
...
...
@@ -2547,6 +2781,15 @@ packages:
resolution
:
{
integrity
:
sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==
}
hasBin
:
true
jsdom@24.1.3
:
resolution
:
{
integrity
:
sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==
}
engines
:
{
node
:
'
>=18'
}
peerDependencies
:
canvas
:
^2.11.2
peerDependenciesMeta
:
canvas
:
optional
:
true
jsesc@3.1.0
:
resolution
:
{
integrity
:
sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
}
engines
:
{
node
:
'
>=6'
}
...
...
@@ -2636,6 +2879,12 @@ packages:
resolution
:
{
integrity
:
sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
}
hasBin
:
true
loupe@3.2.1
:
resolution
:
{
integrity
:
sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==
}
lru-cache@10.4.3
:
resolution
:
{
integrity
:
sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
}
lucide-react@0.469.0
:
resolution
:
{
integrity
:
sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw==
}
peerDependencies
:
...
...
@@ -2649,6 +2898,13 @@ packages:
magic-string@0.30.21
:
resolution
:
{
integrity
:
sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==
}
magicast@0.3.5
:
resolution
:
{
integrity
:
sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==
}
make-dir@4.0.0
:
resolution
:
{
integrity
:
sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==
}
engines
:
{
node
:
'
>=10'
}
markdown-extensions@2.0.0
:
resolution
:
{
integrity
:
sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==
}
engines
:
{
node
:
'
>=16'
}
...
...
@@ -2877,10 +3133,18 @@ packages:
minimatch@3.1.2
:
resolution
:
{
integrity
:
sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
}
minimatch@9.0.1
:
resolution
:
{
integrity
:
sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==
}
engines
:
{
node
:
'
>=16
||
14
>=14.17'
}
minimatch@9.0.5
:
resolution
:
{
integrity
:
sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
}
engines
:
{
node
:
'
>=16
||
14
>=14.17'
}
minipass@7.1.2
:
resolution
:
{
integrity
:
sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
}
engines
:
{
node
:
'
>=16
||
14
>=14.17'
}
mixin-deep@1.3.2
:
resolution
:
{
integrity
:
sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
}
engines
:
{
node
:
'
>=0.10.0'
}
...
...
@@ -2928,6 +3192,11 @@ packages:
node-releases@2.0.27
:
resolution
:
{
integrity
:
sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==
}
nopt@7.2.1
:
resolution
:
{
integrity
:
sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==
}
engines
:
{
node
:
^14.17.0 || ^16.13.0 || >=18.0.0
}
hasBin
:
true
normalize-path@3.0.0
:
resolution
:
{
integrity
:
sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
}
engines
:
{
node
:
'
>=0.10.0'
}
...
...
@@ -2942,6 +3211,9 @@ packages:
numeral@2.0.6
:
resolution
:
{
integrity
:
sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==
}
nwsapi@2.2.23
:
resolution
:
{
integrity
:
sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==
}
object-assign@4.1.1
:
resolution
:
{
integrity
:
sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
}
engines
:
{
node
:
'
>=0.10.0'
}
...
...
@@ -2975,6 +3247,9 @@ packages:
resolution
:
{
integrity
:
sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
}
engines
:
{
node
:
'
>=10'
}
package-json-from-dist@1.0.1
:
resolution
:
{
integrity
:
sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
}
package-manager-detector@1.6.0
:
resolution
:
{
integrity
:
sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==
}
...
...
@@ -3017,13 +3292,24 @@ packages:
path-parse@1.0.7
:
resolution
:
{
integrity
:
sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
}
path-scurry@1.11.1
:
resolution
:
{
integrity
:
sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
}
engines
:
{
node
:
'
>=16
||
14
>=14.18'
}
path-type@4.0.0
:
resolution
:
{
integrity
:
sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
}
engines
:
{
node
:
'
>=8'
}
pathe@1.1.2
:
resolution
:
{
integrity
:
sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==
}
pathe@2.0.3
:
resolution
:
{
integrity
:
sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==
}
pathval@2.0.1
:
resolution
:
{
integrity
:
sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==
}
engines
:
{
node
:
'
>=
14.16'
}
picocolors@1.1.1
:
resolution
:
{
integrity
:
sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
}
...
...
@@ -3122,9 +3408,15 @@ packages:
property-information@7.1.0
:
resolution
:
{
integrity
:
sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==
}
proto-list@1.2.4
:
resolution
:
{
integrity
:
sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==
}
proxy-from-env@1.1.0
:
resolution
:
{
integrity
:
sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
}
psl@1.15.0
:
resolution
:
{
integrity
:
sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==
}
punycode@2.3.1
:
resolution
:
{
integrity
:
sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
}
engines
:
{
node
:
'
>=6'
}
...
...
@@ -3133,6 +3425,9 @@ packages:
resolution
:
{
integrity
:
sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw==
}
engines
:
{
node
:
'
>=18'
}
querystringify@2.2.0
:
resolution
:
{
integrity
:
sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
}
queue-microtask@1.2.3
:
resolution
:
{
integrity
:
sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
}
...
...
@@ -3369,6 +3664,9 @@ packages:
remark-stringify@11.0.0
:
resolution
:
{
integrity
:
sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==
}
requires-port@1.0.0
:
resolution
:
{
integrity
:
sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
}
reselect@5.1.1
:
resolution
:
{
integrity
:
sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==
}
...
...
@@ -3404,6 +3702,12 @@ packages:
roughjs@4.6.6
:
resolution
:
{
integrity
:
sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==
}
rrweb-cssom@0.7.1
:
resolution
:
{
integrity
:
sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==
}
rrweb-cssom@0.8.0
:
resolution
:
{
integrity
:
sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==
}
run-parallel@1.2.0
:
resolution
:
{
integrity
:
sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
}
...
...
@@ -3413,6 +3717,10 @@ packages:
safer-buffer@2.1.2
:
resolution
:
{
integrity
:
sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
}
saxes@6.0.0
:
resolution
:
{
integrity
:
sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==
}
engines
:
{
node
:
'
>=v12.22.7'
}
scheduler@0.27.0
:
resolution
:
{
integrity
:
sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==
}
...
...
@@ -3457,6 +3765,13 @@ packages:
shiki@3.20.0
:
resolution
:
{
integrity
:
sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==
}
siginfo@2.0.0
:
resolution
:
{
integrity
:
sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==
}
signal-exit@4.1.0
:
resolution
:
{
integrity
:
sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
}
engines
:
{
node
:
'
>=14'
}
slash@3.0.0
:
resolution
:
{
integrity
:
sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
}
engines
:
{
node
:
'
>=8'
}
...
...
@@ -3488,9 +3803,23 @@ packages:
resolution
:
{
integrity
:
sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==
}
engines
:
{
node
:
'
>=0.8'
}
stackback@0.0.2
:
resolution
:
{
integrity
:
sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==
}
std-env@3.10.0
:
resolution
:
{
integrity
:
sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==
}
string-convert@0.2.1
:
resolution
:
{
integrity
:
sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==
}
string-width@4.2.3
:
resolution
:
{
integrity
:
sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
}
engines
:
{
node
:
'
>=8'
}
string-width@5.1.2
:
resolution
:
{
integrity
:
sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
}
engines
:
{
node
:
'
>=12'
}
stringify-entities@4.0.4
:
resolution
:
{
integrity
:
sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==
}
...
...
@@ -3536,6 +3865,9 @@ packages:
peerDependencies
:
react
:
^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
symbol-tree@3.2.4
:
resolution
:
{
integrity
:
sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
}
tabbable@6.4.0
:
resolution
:
{
integrity
:
sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==
}
...
...
@@ -3544,6 +3876,10 @@ packages:
engines
:
{
node
:
'
>=14.0.0'
}
hasBin
:
true
test-exclude@7.0.1
:
resolution
:
{
integrity
:
sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==
}
engines
:
{
node
:
'
>=18'
}
text-table@0.2.0
:
resolution
:
{
integrity
:
sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
}
...
...
@@ -3561,6 +3897,12 @@ packages:
tiny-invariant@1.3.3
:
resolution
:
{
integrity
:
sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
}
tinybench@2.9.0
:
resolution
:
{
integrity
:
sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==
}
tinyexec@0.3.2
:
resolution
:
{
integrity
:
sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==
}
tinyexec@1.0.2
:
resolution
:
{
integrity
:
sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==
}
engines
:
{
node
:
'
>=18'
}
...
...
@@ -3569,6 +3911,18 @@ packages:
resolution
:
{
integrity
:
sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==
}
engines
:
{
node
:
'
>=12.0.0'
}
tinypool@1.1.1
:
resolution
:
{
integrity
:
sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==
}
engines
:
{
node
:
^18.0.0 || >=20.0.0
}
tinyrainbow@1.2.0
:
resolution
:
{
integrity
:
sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==
}
engines
:
{
node
:
'
>=14.0.0'
}
tinyspy@3.0.2
:
resolution
:
{
integrity
:
sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==
}
engines
:
{
node
:
'
>=14.0.0'
}
to-regex-range@5.0.1
:
resolution
:
{
integrity
:
sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
}
engines
:
{
node
:
'
>=8.0'
}
...
...
@@ -3576,6 +3930,14 @@ packages:
to-vfile@8.0.0
:
resolution
:
{
integrity
:
sha512-IcmH1xB5576MJc9qcfEC/m/nQCFt3fzMHz45sSlgJyTWjRbKW1HAkJpuf3DgE57YzIlZcwcBZA5ENQbBo4aLkg==
}
tough-cookie@4.1.4
:
resolution
:
{
integrity
:
sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
}
engines
:
{
node
:
'
>=6'
}
tr46@5.1.1
:
resolution
:
{
integrity
:
sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==
}
engines
:
{
node
:
'
>=18'
}
trim-lines@3.0.1
:
resolution
:
{
integrity
:
sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==
}
...
...
@@ -3655,6 +4017,10 @@ packages:
unist-util-visit@5.0.0
:
resolution
:
{
integrity
:
sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==
}
universalify@0.2.0
:
resolution
:
{
integrity
:
sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
}
engines
:
{
node
:
'
>=
4.0.0'
}
update-browserslist-db@1.2.3
:
resolution
:
{
integrity
:
sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==
}
hasBin
:
true
...
...
@@ -3668,6 +4034,9 @@ packages:
resolution
:
{
integrity
:
sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==
}
engines
:
{
node
:
^12.20.0 || ^14.13.1 || >=16.0.0
}
url-parse@1.5.10
:
resolution
:
{
integrity
:
sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
}
use-merge-value@1.2.0
:
resolution
:
{
integrity
:
sha512-DXgG0kkgJN45TcyoXL49vJnn55LehnrmoHc7MbKi+QDBvr8dsesqws8UlyIWGHMR+JXgxc1nvY+jDGMlycsUcw==
}
peerDependencies
:
...
...
@@ -3701,6 +4070,11 @@ packages:
vfile@6.0.3
:
resolution
:
{
integrity
:
sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==
}
vite-node@2.1.9
:
resolution
:
{
integrity
:
sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==
}
engines
:
{
node
:
^18.0.0 || >=20.0.0
}
hasBin
:
true
vite-plugin-checker@0.9.3
:
resolution
:
{
integrity
:
sha512-Tf7QBjeBtG7q11zG0lvoF38/2AVUzzhMNu+Wk+mcsJ00Rk/FpJ4rmUviVJpzWkagbU13cGXvKpt7CMiqtxVTbQ==
}
engines
:
{
node
:
'
>=14.16'
}
...
...
@@ -3766,6 +4140,31 @@ packages:
terser
:
optional
:
true
vitest@2.1.9
:
resolution
:
{
integrity
:
sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==
}
engines
:
{
node
:
^18.0.0 || >=20.0.0
}
hasBin
:
true
peerDependencies
:
'
@edge-runtime/vm'
:
'
*'
'
@types/node'
:
^18.0.0 || >=20.0.0
'@vitest/browser'
:
2.1.9
'@vitest/ui'
:
2.1.9
happy-dom
:
'
*'
jsdom
:
'
*'
peerDependenciesMeta
:
'
@edge-runtime/vm'
:
optional
:
true
'
@types/node'
:
optional
:
true
'
@vitest/browser'
:
optional
:
true
'
@vitest/ui'
:
optional
:
true
happy-dom
:
optional
:
true
jsdom
:
optional
:
true
vscode-jsonrpc@8.2.0
:
resolution
:
{
integrity
:
sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==
}
engines
:
{
node
:
'
>=14.0.0'
}
...
...
@@ -3795,6 +4194,9 @@ packages:
chart.js
:
^4.1.1
vue
:
^3.0.0-0 || ^2.7.0
vue-component-type-helpers@2.2.12
:
resolution
:
{
integrity
:
sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==
}
vue-demi@0.14.10
:
resolution
:
{
integrity
:
sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==
}
engines
:
{
node
:
'
>=12'
}
...
...
@@ -3837,14 +4239,40 @@ packages:
typescript
:
optional
:
true
w3c-xmlserializer@5.0.0
:
resolution
:
{
integrity
:
sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==
}
engines
:
{
node
:
'
>=18'
}
web-namespaces@2.0.1
:
resolution
:
{
integrity
:
sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==
}
webidl-conversions@7.0.0
:
resolution
:
{
integrity
:
sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
}
engines
:
{
node
:
'
>=12'
}
whatwg-encoding@3.1.1
:
resolution
:
{
integrity
:
sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==
}
engines
:
{
node
:
'
>=18'
}
deprecated
:
Use @exodus/bytes instead for a more spec-conformant and faster implementation
whatwg-mimetype@4.0.0
:
resolution
:
{
integrity
:
sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
}
engines
:
{
node
:
'
>=18'
}
whatwg-url@14.2.0
:
resolution
:
{
integrity
:
sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==
}
engines
:
{
node
:
'
>=18'
}
which@2.0.2
:
resolution
:
{
integrity
:
sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
}
engines
:
{
node
:
'
>=
8'
}
hasBin
:
true
why-is-node-running@2.3.0
:
resolution
:
{
integrity
:
sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==
}
engines
:
{
node
:
'
>=8'
}
hasBin
:
true
wmf@1.0.2
:
resolution
:
{
integrity
:
sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==
}
engines
:
{
node
:
'
>=0.8'
}
...
...
@@ -3857,9 +4285,29 @@ packages:
resolution
:
{
integrity
:
sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==
}
engines
:
{
node
:
'
>=0.8'
}
wrap-ansi@7.0.0
:
resolution
:
{
integrity
:
sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
}
engines
:
{
node
:
'
>=10'
}
wrap-ansi@8.1.0
:
resolution
:
{
integrity
:
sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
}
engines
:
{
node
:
'
>=12'
}
wrappy@1.0.2
:
resolution
:
{
integrity
:
sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
}
ws@8.19.0
:
resolution
:
{
integrity
:
sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==
}
engines
:
{
node
:
'
>=10.0.0'
}
peerDependencies
:
bufferutil
:
^4.0.1
utf-8-validate
:
'
>=5.0.2'
peerDependenciesMeta
:
bufferutil
:
optional
:
true
utf-8-validate
:
optional
:
true
xlsx@0.18.5
:
resolution
:
{
integrity
:
sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==
}
engines
:
{
node
:
'
>=0.8'
}
...
...
@@ -3869,6 +4317,13 @@ packages:
resolution
:
{
integrity
:
sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
}
engines
:
{
node
:
'
>=12'
}
xml-name-validator@5.0.0
:
resolution
:
{
integrity
:
sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==
}
engines
:
{
node
:
'
>=18'
}
xmlchars@2.2.0
:
resolution
:
{
integrity
:
sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
}
yaml@1.10.2
:
resolution
:
{
integrity
:
sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
}
engines
:
{
node
:
'
>=
6'
}
...
...
@@ -3893,6 +4348,11 @@ snapshots:
'
@alloc/quick-lru@5.2.0'
:
{}
'
@ampproject/remapping@2.3.0'
:
dependencies
:
'
@jridgewell/gen-mapping'
:
0.3.13
'@jridgewell/trace-mapping'
:
0.3.31
'
@ant-design/colors@8.0.0'
:
dependencies
:
'
@ant-design/fast-color'
:
3.0.0
...
...
@@ -3944,6 +4404,14 @@ snapshots:
package-manager-detector
:
1.6.0
tinyexec
:
1.0.2
'
@asamuzakjp/css-color@3.2.0'
:
dependencies
:
'
@csstools/css-calc'
:
2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
'@csstools/css-color-parser'
:
3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
'@csstools/css-parser-algorithms'
:
3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer'
:
3.0.4
lru-cache
:
10.4.3
'
@babel/code-frame@7.27.1'
:
dependencies
:
'
@babel/helper-validator-identifier'
:
7.28.5
...
...
@@ -4025,6 +4493,8 @@ snapshots:
optionalDependencies
:
'
@types/react'
:
19.2.7
'
@bcoe/v8-coverage@0.2.3'
:
{}
'
@braintree/sanitize-url@7.1.1'
:
{}
'
@chevrotain/cst-dts-gen@11.0.3'
:
...
...
@@ -4044,6 +4514,26 @@ snapshots:
'
@chevrotain/utils@11.0.3'
:
{}
'
@csstools/color-helpers@5.1.0'
:
{}
'
@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)'
:
dependencies
:
'
@csstools/css-parser-algorithms'
:
3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer'
:
3.0.4
'
@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)'
:
dependencies
:
'
@csstools/color-helpers'
:
5.1.0
'@csstools/css-calc'
:
2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
'@csstools/css-parser-algorithms'
:
3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer'
:
3.0.4
'
@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)'
:
dependencies
:
'
@csstools/css-tokenizer'
:
3.0.4
'
@csstools/css-tokenizer@3.0.4'
:
{}
'
@dnd-kit/accessibility@3.1.1(react@19.2.3)'
:
dependencies
:
react
:
19.2.3
...
...
@@ -4320,6 +4810,17 @@ snapshots:
'
@intlify/shared@9.14.5'
:
{}
'
@isaacs/cliui@8.0.2'
:
dependencies
:
string-width
:
5.1.2
string-width-cjs
:
string-width@4.2.3
strip-ansi
:
7.1.2
strip-ansi-cjs
:
strip-ansi@6.0.1
wrap-ansi
:
8.1.0
wrap-ansi-cjs
:
wrap-ansi@7.0.0
'
@istanbuljs/schema@0.1.3'
:
{}
'
@jridgewell/gen-mapping@0.3.13'
:
dependencies
:
'
@jridgewell/sourcemap-codec'
:
1.5.5
...
...
@@ -4505,6 +5006,11 @@ snapshots:
'
@nodelib/fs.scandir'
:
2.1.5
fastq
:
1.20.1
'
@one-ini/wasm@0.1.1'
:
{}
'
@pkgjs/parseargs@0.11.0'
:
optional
:
true
'
@primer/octicons@19.21.1'
:
dependencies
:
object-assign
:
4.1.1
...
...
@@ -5439,6 +5945,64 @@ snapshots:
vite
:
5.4.21(@types/node@20.19.27)
vue
:
3.5.26(typescript@5.6.3)
'
@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@20.19.27)(jsdom@24.1.3))'
:
dependencies
:
'
@ampproject/remapping'
:
2.3.0
'@bcoe/v8-coverage'
:
0.2.3
debug
:
4.4.3
istanbul-lib-coverage
:
3.2.2
istanbul-lib-report
:
3.0.1
istanbul-lib-source-maps
:
5.0.6
istanbul-reports
:
3.2.0
magic-string
:
0.30.21
magicast
:
0.3.5
std-env
:
3.10.0
test-exclude
:
7.0.1
tinyrainbow
:
1.2.0
vitest
:
2.1.9(@types/node@20.19.27)(jsdom@24.1.3)
transitivePeerDependencies
:
-
supports-color
'
@vitest/expect@2.1.9'
:
dependencies
:
'
@vitest/spy'
:
2.1.9
'@vitest/utils'
:
2.1.9
chai
:
5.3.3
tinyrainbow
:
1.2.0
'
@vitest/mocker@2.1.9(vite@5.4.21(@types/node@20.19.27))'
:
dependencies
:
'
@vitest/spy'
:
2.1.9
estree-walker
:
3.0.3
magic-string
:
0.30.21
optionalDependencies
:
vite
:
5.4.21(@types/node@20.19.27)
'
@vitest/pretty-format@2.1.9'
:
dependencies
:
tinyrainbow
:
1.2.0
'
@vitest/runner@2.1.9'
:
dependencies
:
'
@vitest/utils'
:
2.1.9
pathe
:
1.1.2
'
@vitest/snapshot@2.1.9'
:
dependencies
:
'
@vitest/pretty-format'
:
2.1.9
magic-string
:
0.30.21
pathe
:
1.1.2
'
@vitest/spy@2.1.9'
:
dependencies
:
tinyspy
:
3.0.2
'
@vitest/utils@2.1.9'
:
dependencies
:
'
@vitest/pretty-format'
:
2.1.9
loupe
:
3.2.1
tinyrainbow
:
1.2.0
'
@volar/language-core@2.4.15'
:
dependencies
:
'
@volar/source-map'
:
2.4.15
...
...
@@ -5525,6 +6089,11 @@ snapshots:
'
@vue/shared@3.5.26'
:
{}
'
@vue/test-utils@2.4.6'
:
dependencies
:
js-beautify
:
1.15.4
vue-component-type-helpers
:
2.2.12
'
@vueuse/core@10.11.1(vue@3.5.26(typescript@5.6.3))'
:
dependencies
:
'
@types/web-bluetooth'
:
0.0.20
...
...
@@ -5544,6 +6113,8 @@ snapshots:
-
'
@vue/composition-api'
-
vue
abbrev@2.0.0
:
{}
acorn-jsx@5.3.2(acorn@8.15.0)
:
dependencies
:
acorn
:
8.15.0
...
...
@@ -5552,6 +6123,8 @@ snapshots:
adler-32@1.3.1
:
{}
agent-base@7.1.4
:
{}
ahooks@3.9.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
:
dependencies
:
'
@babel/runtime'
:
7.28.4
...
...
@@ -5584,6 +6157,8 @@ snapshots:
dependencies
:
color-convert
:
2.0.1
ansi-styles@6.2.3
:
{}
antd-style@4.1.0(@types/react@19.2.7)(antd@6.1.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
:
dependencies
:
'
@ant-design/cssinjs'
:
2.0.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
...
...
@@ -5671,6 +6246,8 @@ snapshots:
array-union@2.1.0
:
{}
assertion-error@2.0.1
:
{}
assign-symbols@1.0.0
:
{}
astring@1.9.0
:
{}
...
...
@@ -5733,6 +6310,8 @@ snapshots:
node-releases
:
2.0.27
update-browserslist-db
:
1.2.3(browserslist@4.28.1)
cac@6.7.14
:
{}
call-bind-apply-helpers@1.0.2
:
dependencies
:
es-errors
:
1.3.0
...
...
@@ -5751,6 +6330,14 @@ snapshots:
adler-32
:
1.3.1
crc-32
:
1.2.2
chai@5.3.3
:
dependencies
:
assertion-error
:
2.0.1
check-error
:
2.1.3
deep-eql
:
5.0.2
loupe
:
3.2.1
pathval
:
2.0.1
chalk@4.1.2
:
dependencies
:
ansi-styles
:
4.3.0
...
...
@@ -5768,6 +6355,8 @@ snapshots:
dependencies
:
'
@kurkle/color'
:
0.3.4
check-error@2.1.3
:
{}
chevrotain-allstar@0.3.1(chevrotain@11.0.3)
:
dependencies
:
chevrotain
:
11.0.3
...
...
@@ -5828,6 +6417,8 @@ snapshots:
comma-separated-tokens@2.0.3
:
{}
commander@10.0.1
:
{}
commander@4.1.1
:
{}
commander@7.2.0
:
{}
...
...
@@ -5840,6 +6431,11 @@ snapshots:
confbox@0.1.8
:
{}
config-chain@1.1.13
:
dependencies
:
ini
:
1.3.8
proto-list
:
1.2.4
convert-source-map@1.9.0
:
{}
cose-base@1.0.3
:
...
...
@@ -5868,6 +6464,11 @@ snapshots:
cssesc@3.0.0
:
{}
cssstyle@4.6.0
:
dependencies
:
'
@asamuzakjp/css-color'
:
3.2.0
rrweb-cssom
:
0.8.0
csstype@3.2.3
:
{}
cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1)
:
...
...
@@ -6054,6 +6655,11 @@ snapshots:
d3
:
7.9.0
lodash-es
:
4.17.22
data-urls@5.0.0
:
dependencies
:
whatwg-mimetype
:
4.0.0
whatwg-url
:
14.2.0
dayjs@1.11.19
:
{}
de-indent@1.0.2
:
{}
...
...
@@ -6062,12 +6668,16 @@ snapshots:
dependencies
:
ms
:
2.1.3
decimal.js@10.6.0
:
{}
decode-named-character-reference@1.2.0
:
dependencies
:
character-entities
:
2.0.2
decode-uri-component@0.4.1
:
{}
deep-eql@5.0.2
:
{}
deep-is@0.1.4
:
{}
delaunator@5.0.1
:
...
...
@@ -6106,12 +6716,25 @@ snapshots:
es-errors
:
1.3.0
gopd
:
1.2.0
eastasianwidth@0.2.0
:
{}
editorconfig@1.0.4
:
dependencies
:
'
@one-ini/wasm'
:
0.1.1
commander
:
10.0.1
minimatch
:
9.0.1
semver
:
7.7.3
electron-to-chromium@1.5.267
:
{}
emoji-mart@5.6.0
:
{}
emoji-regex@10.6.0
:
{}
emoji-regex@8.0.0
:
{}
emoji-regex@9.2.2
:
{}
entities@6.0.1
:
{}
entities@7.0.0
:
{}
...
...
@@ -6124,6 +6747,8 @@ snapshots:
es-errors@1.3.0
:
{}
es-module-lexer@1.7.0
:
{}
es-object-atoms@1.1.1
:
dependencies
:
es-errors
:
1.3.0
...
...
@@ -6300,6 +6925,8 @@ snapshots:
esutils@2.0.3
:
{}
expect-type@1.3.0
:
{}
extend-shallow@2.0.1
:
dependencies
:
is-extendable
:
0.1.1
...
...
@@ -6368,6 +6995,11 @@ snapshots:
for-in@1.0.2
:
{}
foreground-child@3.3.1
:
dependencies
:
cross-spawn
:
7.0.6
signal-exit
:
4.1.0
form-data@4.0.5
:
dependencies
:
asynckit
:
0.4.0
...
...
@@ -6431,6 +7063,15 @@ snapshots:
dependencies
:
is-glob
:
4.0.3
glob@10.5.0
:
dependencies
:
foreground-child
:
3.3.1
jackspeak
:
3.4.3
minimatch
:
9.0.5
minipass
:
7.1.2
package-json-from-dist
:
1.0.1
path-scurry
:
1.11.1
glob@7.2.3
:
dependencies
:
fs.realpath
:
1.0.0
...
...
@@ -6618,10 +7259,30 @@ snapshots:
dependencies
:
react-is
:
16.13.1
html-encoding-sniffer@4.0.0
:
dependencies
:
whatwg-encoding
:
3.1.1
html-escaper@2.0.2
:
{}
html-url-attributes@3.0.1
:
{}
html-void-elements@3.0.0
:
{}
http-proxy-agent@7.0.2
:
dependencies
:
agent-base
:
7.1.4
debug
:
4.4.3
transitivePeerDependencies
:
-
supports-color
https-proxy-agent@7.0.6
:
dependencies
:
agent-base
:
7.1.4
debug
:
4.4.3
transitivePeerDependencies
:
-
supports-color
iconv-lite@0.6.3
:
dependencies
:
safer-buffer
:
2.1.2
...
...
@@ -6644,6 +7305,8 @@ snapshots:
inherits@2.0.4
:
{}
ini@1.3.8
:
{}
inline-style-parser@0.2.7
:
{}
internmap@1.0.1
:
{}
...
...
@@ -6679,6 +7342,8 @@ snapshots:
is-extglob@2.1.1
:
{}
is-fullwidth-code-point@3.0.0
:
{}
is-glob@4.0.3
:
dependencies
:
is-extglob
:
2.1.1
...
...
@@ -6697,12 +7362,49 @@ snapshots:
dependencies
:
isobject
:
3.0.1
is-potential-custom-element-name@1.0.1
:
{}
isexe@2.0.0
:
{}
isobject@3.0.1
:
{}
istanbul-lib-coverage@3.2.2
:
{}
istanbul-lib-report@3.0.1
:
dependencies
:
istanbul-lib-coverage
:
3.2.2
make-dir
:
4.0.0
supports-color
:
7.2.0
istanbul-lib-source-maps@5.0.6
:
dependencies
:
'
@jridgewell/trace-mapping'
:
0.3.31
debug
:
4.4.3
istanbul-lib-coverage
:
3.2.2
transitivePeerDependencies
:
-
supports-color
istanbul-reports@3.2.0
:
dependencies
:
html-escaper
:
2.0.2
istanbul-lib-report
:
3.0.1
jackspeak@3.4.3
:
dependencies
:
'
@isaacs/cliui'
:
8.0.2
optionalDependencies
:
'
@pkgjs/parseargs'
:
0.11.0
jiti@1.21.7
:
{}
js-beautify@1.15.4
:
dependencies
:
config-chain
:
1.1.13
editorconfig
:
1.0.4
glob
:
10.5.0
js-cookie
:
3.0.5
nopt
:
7.2.1
js-cookie@3.0.5
:
{}
js-tokens@4.0.0
:
{}
...
...
@@ -6711,6 +7413,34 @@ snapshots:
dependencies
:
argparse
:
2.0.1
jsdom@24.1.3
:
dependencies
:
cssstyle
:
4.6.0
data-urls
:
5.0.0
decimal.js
:
10.6.0
form-data
:
4.0.5
html-encoding-sniffer
:
4.0.0
http-proxy-agent
:
7.0.2
https-proxy-agent
:
7.0.6
is-potential-custom-element-name
:
1.0.1
nwsapi
:
2.2.23
parse5
:
7.3.0
rrweb-cssom
:
0.7.1
saxes
:
6.0.0
symbol-tree
:
3.2.4
tough-cookie
:
4.1.4
w3c-xmlserializer
:
5.0.0
webidl-conversions
:
7.0.0
whatwg-encoding
:
3.1.1
whatwg-mimetype
:
4.0.0
whatwg-url
:
14.2.0
ws
:
8.19.0
xml-name-validator
:
5.0.0
transitivePeerDependencies
:
-
bufferutil
-
supports-color
-
utf-8-validate
jsesc@3.1.0
:
{}
json-buffer@3.0.1
:
{}
...
...
@@ -6809,6 +7539,10 @@ snapshots:
dependencies
:
js-tokens
:
4.0.0
loupe@3.2.1
:
{}
lru-cache@10.4.3
:
{}
lucide-react@0.469.0(react@19.2.3)
:
dependencies
:
react
:
19.2.3
...
...
@@ -6821,6 +7555,16 @@ snapshots:
dependencies
:
'
@jridgewell/sourcemap-codec'
:
1.5.5
magicast@0.3.5
:
dependencies
:
'
@babel/parser'
:
7.28.5
'@babel/types'
:
7.28.5
source-map-js
:
1.2.1
make-dir@4.0.0
:
dependencies
:
semver
:
7.7.3
markdown-extensions@2.0.0
:
{}
markdown-table@3.0.4
:
{}
...
...
@@ -7351,10 +8095,16 @@ snapshots:
dependencies
:
brace-expansion
:
1.1.12
minimatch@9.0.1
:
dependencies
:
brace-expansion
:
2.0.2
minimatch@9.0.5
:
dependencies
:
brace-expansion
:
2.0.2
minipass@7.1.2
:
{}
mixin-deep@1.3.2
:
dependencies
:
for-in
:
1.0.2
...
...
@@ -7398,6 +8148,10 @@ snapshots:
node-releases@2.0.27
:
{}
nopt@7.2.1
:
dependencies
:
abbrev
:
2.0.0
normalize-path@3.0.0
:
{}
npm-run-path@6.0.0
:
...
...
@@ -7411,6 +8165,8 @@ snapshots:
numeral@2.0.6
:
{}
nwsapi@2.2.23
:
{}
object-assign@4.1.1
:
{}
object-hash@3.0.0
:
{}
...
...
@@ -7446,6 +8202,8 @@ snapshots:
dependencies
:
p-limit
:
3.1.0
package-json-from-dist@1.0.1
:
{}
package-manager-detector@1.6.0
:
{}
parent-module@1.0.1
:
...
...
@@ -7487,10 +8245,19 @@ snapshots:
path-parse@1.0.7
:
{}
path-scurry@1.11.1
:
dependencies
:
lru-cache
:
10.4.3
minipass
:
7.1.2
path-type@4.0.0
:
{}
pathe@1.1.2
:
{}
pathe@2.0.3
:
{}
pathval@2.0.1
:
{}
picocolors@1.1.1
:
{}
picomatch@2.3.1
:
{}
...
...
@@ -7575,8 +8342,14 @@ snapshots:
property-information@7.1.0
:
{}
proto-list@1.2.4
:
{}
proxy-from-env@1.1.0
:
{}
psl@1.15.0
:
dependencies
:
punycode
:
2.3.1
punycode@2.3.1
:
{}
query-string@9.3.1
:
...
...
@@ -7585,6 +8358,8 @@ snapshots:
filter-obj
:
5.1.0
split-on-first
:
3.0.0
querystringify@2.2.0
:
{}
queue-microtask@1.2.3
:
{}
rc-collapse@4.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
:
...
...
@@ -7928,6 +8703,8 @@ snapshots:
mdast-util-to-markdown
:
2.1.2
unified
:
11.0.5
requires-port@1.0.0
:
{}
reselect@5.1.1
:
{}
resize-observer-polyfill@1.5.1
:
{}
...
...
@@ -7983,6 +8760,10 @@ snapshots:
points-on-curve
:
0.2.0
points-on-path
:
0.2.1
rrweb-cssom@0.7.1
:
{}
rrweb-cssom@0.8.0
:
{}
run-parallel@1.2.0
:
dependencies
:
queue-microtask
:
1.2.3
...
...
@@ -7991,6 +8772,10 @@ snapshots:
safer-buffer@2.1.2
:
{}
saxes@6.0.0
:
dependencies
:
xmlchars
:
2.2.0
scheduler@0.27.0
:
{}
screenfull@5.2.0
:
{}
...
...
@@ -8034,6 +8819,10 @@ snapshots:
'@shikijs/vscode-textmate'
:
10.0.2
'@types/hast'
:
3.0.4
siginfo@2.0.0
:
{}
signal-exit@4.1.0
:
{}
slash@3.0.0
:
{}
source-map-js@1.2.1
:
{}
...
...
@@ -8054,8 +8843,24 @@ snapshots:
dependencies
:
frac
:
1.1.2
stackback@0.0.2
:
{}
std-env@3.10.0
:
{}
string-convert@0.2.1
:
{}
string-width@4.2.3
:
dependencies
:
emoji-regex
:
8.0.0
is-fullwidth-code-point
:
3.0.0
strip-ansi
:
6.0.1
string-width@5.1.2
:
dependencies
:
eastasianwidth
:
0.2.0
emoji-regex
:
9.2.2
strip-ansi
:
7.1.2
stringify-entities@4.0.4
:
dependencies
:
character-entities-html4
:
2.1.0
...
...
@@ -8105,6 +8910,8 @@ snapshots:
react
:
19.2.3
use-sync-external-store
:
1.6.0(react@19.2.3)
symbol-tree@3.2.4
:
{}
tabbable@6.4.0
:
{}
tailwindcss@3.4.19
:
...
...
@@ -8135,6 +8942,12 @@ snapshots:
-
tsx
-
yaml
test-exclude@7.0.1
:
dependencies
:
'
@istanbuljs/schema'
:
0.1.3
glob
:
10.5.0
minimatch
:
9.0.5
text-table@0.2.0
:
{}
thenify-all@1.6.0
:
...
...
@@ -8149,6 +8962,10 @@ snapshots:
tiny-invariant@1.3.3
:
{}
tinybench@2.9.0
:
{}
tinyexec@0.3.2
:
{}
tinyexec@1.0.2
:
{}
tinyglobby@0.2.15
:
...
...
@@ -8156,6 +8973,12 @@ snapshots:
fdir
:
6.5.0(picomatch@4.0.3)
picomatch
:
4.0.3
tinypool@1.1.1
:
{}
tinyrainbow@1.2.0
:
{}
tinyspy@3.0.2
:
{}
to-regex-range@5.0.1
:
dependencies
:
is-number
:
7.0.0
...
...
@@ -8164,6 +8987,17 @@ snapshots:
dependencies
:
vfile
:
6.0.3
tough-cookie@4.1.4
:
dependencies
:
psl
:
1.15.0
punycode
:
2.3.1
universalify
:
0.2.0
url-parse
:
1.5.10
tr46@5.1.1
:
dependencies
:
punycode
:
2.3.1
trim-lines@3.0.1
:
{}
trough@2.2.0
:
{}
...
...
@@ -8243,6 +9077,8 @@ snapshots:
unist-util-is
:
6.0.1
unist-util-visit-parents
:
6.0.2
universalify@0.2.0
:
{}
update-browserslist-db@1.2.3(browserslist@4.28.1)
:
dependencies
:
browserslist
:
4.28.1
...
...
@@ -8255,6 +9091,11 @@ snapshots:
url-join@5.0.0
:
{}
url-parse@1.5.10
:
dependencies
:
querystringify
:
2.2.0
requires-port
:
1.0.0
use-merge-value@1.2.0(react@19.2.3)
:
dependencies
:
react
:
19.2.3
...
...
@@ -8286,6 +9127,24 @@ snapshots:
'
@types/unist'
:
3.0.3
vfile-message
:
4.0.3
vite-node@2.1.9(@types/node@20.19.27)
:
dependencies
:
cac
:
6.7.14
debug
:
4.4.3
es-module-lexer
:
1.7.0
pathe
:
1.1.2
vite
:
5.4.21(@types/node@20.19.27)
transitivePeerDependencies
:
-
'
@types/node'
-
less
-
lightningcss
-
sass
-
sass-embedded
-
stylus
-
sugarss
-
supports-color
-
terser
vite-plugin-checker@0.9.3(eslint@8.57.1)(optionator@0.9.4)(typescript@5.6.3)(vite@5.4.21(@types/node@20.19.27))(vue-tsc@2.2.12(typescript@5.6.3))
:
dependencies
:
'
@babel/code-frame'
:
7.27.1
...
...
@@ -8313,6 +9172,42 @@ snapshots:
'
@types/node'
:
20.19.27
fsevents
:
2.3.3
vitest@2.1.9(@types/node@20.19.27)(jsdom@24.1.3)
:
dependencies
:
'
@vitest/expect'
:
2.1.9
'@vitest/mocker'
:
2.1.9(vite@5.4.21(@types/node@20.19.27))
'@vitest/pretty-format'
:
2.1.9
'@vitest/runner'
:
2.1.9
'@vitest/snapshot'
:
2.1.9
'@vitest/spy'
:
2.1.9
'@vitest/utils'
:
2.1.9
chai
:
5.3.3
debug
:
4.4.3
expect-type
:
1.3.0
magic-string
:
0.30.21
pathe
:
1.1.2
std-env
:
3.10.0
tinybench
:
2.9.0
tinyexec
:
0.3.2
tinypool
:
1.1.1
tinyrainbow
:
1.2.0
vite
:
5.4.21(@types/node@20.19.27)
vite-node
:
2.1.9(@types/node@20.19.27)
why-is-node-running
:
2.3.0
optionalDependencies
:
'
@types/node'
:
20.19.27
jsdom
:
24.1.3
transitivePeerDependencies
:
-
less
-
lightningcss
-
msw
-
sass
-
sass-embedded
-
stylus
-
sugarss
-
supports-color
-
terser
vscode-jsonrpc@8.2.0
:
{}
vscode-languageserver-protocol@3.17.5
:
...
...
@@ -8337,6 +9232,8 @@ snapshots:
chart.js
:
4.5.1
vue
:
3.5.26(typescript@5.6.3)
vue-component-type-helpers@2.2.12
:
{}
vue-demi@0.14.10(vue@3.5.26(typescript@5.6.3))
:
dependencies
:
vue
:
3.5.26(typescript@5.6.3)
...
...
@@ -8382,20 +9279,56 @@ snapshots:
optionalDependencies
:
typescript
:
5.6.3
w3c-xmlserializer@5.0.0
:
dependencies
:
xml-name-validator
:
5.0.0
web-namespaces@2.0.1
:
{}
webidl-conversions@7.0.0
:
{}
whatwg-encoding@3.1.1
:
dependencies
:
iconv-lite
:
0.6.3
whatwg-mimetype@4.0.0
:
{}
whatwg-url@14.2.0
:
dependencies
:
tr46
:
5.1.1
webidl-conversions
:
7.0.0
which@2.0.2
:
dependencies
:
isexe
:
2.0.0
why-is-node-running@2.3.0
:
dependencies
:
siginfo
:
2.0.0
stackback
:
0.0.2
wmf@1.0.2
:
{}
word-wrap@1.2.5
:
{}
word@0.3.0
:
{}
wrap-ansi@7.0.0
:
dependencies
:
ansi-styles
:
4.3.0
string-width
:
4.2.3
strip-ansi
:
6.0.1
wrap-ansi@8.1.0
:
dependencies
:
ansi-styles
:
6.2.3
string-width
:
5.1.2
strip-ansi
:
7.1.2
wrappy@1.0.2
:
{}
ws@8.19.0
:
{}
xlsx@0.18.5
:
dependencies
:
adler-32
:
1.3.1
...
...
@@ -8408,6 +9341,10 @@ snapshots:
xml-name-validator@4.0.0
:
{}
xml-name-validator@5.0.0
:
{}
xmlchars@2.2.0
:
{}
yaml@1.10.2
:
{}
yocto-queue@0.1.0
:
{}
...
...
frontend/src/App.vue
View file @
dae0d532
...
...
@@ -2,6 +2,7 @@
import
{
RouterView
,
useRouter
,
useRoute
}
from
'
vue-router
'
import
{
onMounted
,
watch
}
from
'
vue
'
import
Toast
from
'
@/components/common/Toast.vue
'
import
NavigationProgress
from
'
@/components/common/NavigationProgress.vue
'
import
{
useAppStore
,
useAuthStore
,
useSubscriptionStore
}
from
'
@/stores
'
import
{
getSetupStatus
}
from
'
@/api/setup
'
...
...
@@ -84,6 +85,7 @@ onMounted(async () => {
</
script
>
<
template
>
<NavigationProgress
/>
<RouterView
/>
<Toast
/>
</
template
>
frontend/src/__tests__/integration/navigation.spec.ts
0 → 100644
View file @
dae0d532
/**
* 导航集成测试
* 测试完整的页面导航流程、预加载和错误恢复机制
*/
import
{
describe
,
it
,
expect
,
vi
,
beforeEach
,
afterEach
}
from
'
vitest
'
import
{
createRouter
,
createWebHistory
,
type
Router
}
from
'
vue-router
'
import
{
createPinia
,
setActivePinia
}
from
'
pinia
'
import
{
mount
,
flushPromises
}
from
'
@vue/test-utils
'
import
{
defineComponent
,
h
,
nextTick
}
from
'
vue
'
import
{
useNavigationLoadingState
,
_resetNavigationLoadingInstance
}
from
'
@/composables/useNavigationLoading
'
import
{
useRoutePrefetch
}
from
'
@/composables/useRoutePrefetch
'
// Mock 视图组件
const
MockDashboard
=
defineComponent
({
name
:
'
MockDashboard
'
,
render
()
{
return
h
(
'
div
'
,
{
class
:
'
dashboard
'
},
'
Dashboard
'
)
}
})
const
MockKeys
=
defineComponent
({
name
:
'
MockKeys
'
,
render
()
{
return
h
(
'
div
'
,
{
class
:
'
keys
'
},
'
Keys
'
)
}
})
const
MockUsage
=
defineComponent
({
name
:
'
MockUsage
'
,
render
()
{
return
h
(
'
div
'
,
{
class
:
'
usage
'
},
'
Usage
'
)
}
})
// Mock stores
vi
.
mock
(
'
@/stores/auth
'
,
()
=>
({
useAuthStore
:
()
=>
({
isAuthenticated
:
true
,
isAdmin
:
false
,
isSimpleMode
:
false
,
checkAuth
:
vi
.
fn
()
})
}))
vi
.
mock
(
'
@/stores/app
'
,
()
=>
({
useAppStore
:
()
=>
({
siteName
:
'
Test Site
'
})
}))
// 创建测试路由
function
createTestRouter
():
Router
{
return
createRouter
({
history
:
createWebHistory
(),
routes
:
[
{
path
:
'
/
'
,
redirect
:
'
/dashboard
'
},
{
path
:
'
/dashboard
'
,
name
:
'
Dashboard
'
,
component
:
MockDashboard
,
meta
:
{
requiresAuth
:
true
,
title
:
'
Dashboard
'
}
},
{
path
:
'
/keys
'
,
name
:
'
Keys
'
,
component
:
MockKeys
,
meta
:
{
requiresAuth
:
true
,
title
:
'
Keys
'
}
},
{
path
:
'
/usage
'
,
name
:
'
Usage
'
,
component
:
MockUsage
,
meta
:
{
requiresAuth
:
true
,
title
:
'
Usage
'
}
}
]
})
}
// 测试用 App 组件
const
TestApp
=
defineComponent
({
name
:
'
TestApp
'
,
setup
()
{
return
()
=>
h
(
'
div
'
,
{
id
:
'
app
'
},
[
h
(
'
router-view
'
)])
}
})
describe
(
'
Navigation Integration Tests
'
,
()
=>
{
let
router
:
Router
let
originalRequestIdleCallback
:
typeof
window
.
requestIdleCallback
let
originalCancelIdleCallback
:
typeof
window
.
cancelIdleCallback
beforeEach
(()
=>
{
// 设置 Pinia
setActivePinia
(
createPinia
())
// 重置导航加载状态
_resetNavigationLoadingInstance
()
// 创建新的路由实例
router
=
createTestRouter
()
// Mock requestIdleCallback
originalRequestIdleCallback
=
window
.
requestIdleCallback
originalCancelIdleCallback
=
window
.
cancelIdleCallback
vi
.
stubGlobal
(
'
requestIdleCallback
'
,
(
cb
:
IdleRequestCallback
)
=>
{
const
id
=
setTimeout
(()
=>
cb
({
didTimeout
:
false
,
timeRemaining
:
()
=>
50
}),
0
)
return
id
})
vi
.
stubGlobal
(
'
cancelIdleCallback
'
,
(
id
:
number
)
=>
clearTimeout
(
id
))
})
afterEach
(()
=>
{
vi
.
restoreAllMocks
()
window
.
requestIdleCallback
=
originalRequestIdleCallback
window
.
cancelIdleCallback
=
originalCancelIdleCallback
})
describe
(
'
完整页面导航流程
'
,
()
=>
{
it
(
'
导航时应该触发加载状态变化
'
,
async
()
=>
{
const
navigationLoading
=
useNavigationLoadingState
()
// 初始状态
expect
(
navigationLoading
.
isLoading
.
value
).
toBe
(
false
)
// 挂载应用
const
wrapper
=
mount
(
TestApp
,
{
global
:
{
plugins
:
[
router
]
}
})
// 等待路由初始化
await
router
.
isReady
()
await
flushPromises
()
// 导航到 /dashboard
await
router
.
push
(
'
/dashboard
'
)
await
flushPromises
()
await
nextTick
()
// 导航结束后状态应该重置
expect
(
navigationLoading
.
isLoading
.
value
).
toBe
(
false
)
wrapper
.
unmount
()
})
it
(
'
导航到新页面应该正确渲染组件
'
,
async
()
=>
{
const
wrapper
=
mount
(
TestApp
,
{
global
:
{
plugins
:
[
router
]
}
})
await
router
.
isReady
()
await
router
.
push
(
'
/dashboard
'
)
await
flushPromises
()
await
nextTick
()
// 检查当前路由
expect
(
router
.
currentRoute
.
value
.
path
).
toBe
(
'
/dashboard
'
)
wrapper
.
unmount
()
})
it
(
'
连续快速导航应该正确处理路由状态
'
,
async
()
=>
{
const
wrapper
=
mount
(
TestApp
,
{
global
:
{
plugins
:
[
router
]
}
})
await
router
.
isReady
()
await
router
.
push
(
'
/dashboard
'
)
// 快速连续导航
router
.
push
(
'
/keys
'
)
router
.
push
(
'
/usage
'
)
router
.
push
(
'
/dashboard
'
)
await
flushPromises
()
await
nextTick
()
// 应该最终停在 /dashboard
expect
(
router
.
currentRoute
.
value
.
path
).
toBe
(
'
/dashboard
'
)
wrapper
.
unmount
()
})
})
describe
(
'
路由预加载
'
,
()
=>
{
it
(
'
导航后应该触发相关路由预加载
'
,
async
()
=>
{
const
routePrefetch
=
useRoutePrefetch
()
const
triggerSpy
=
vi
.
spyOn
(
routePrefetch
,
'
triggerPrefetch
'
)
// 设置 afterEach 守卫
router
.
afterEach
((
to
)
=>
{
routePrefetch
.
triggerPrefetch
(
to
)
})
const
wrapper
=
mount
(
TestApp
,
{
global
:
{
plugins
:
[
router
]
}
})
await
router
.
isReady
()
await
router
.
push
(
'
/dashboard
'
)
await
flushPromises
()
// 应该触发预加载
expect
(
triggerSpy
).
toHaveBeenCalled
()
wrapper
.
unmount
()
})
it
(
'
已预加载的路由不应重复预加载
'
,
async
()
=>
{
const
routePrefetch
=
useRoutePrefetch
()
const
wrapper
=
mount
(
TestApp
,
{
global
:
{
plugins
:
[
router
]
}
})
await
router
.
isReady
()
await
router
.
push
(
'
/dashboard
'
)
await
flushPromises
()
// 手动触发预加载
routePrefetch
.
triggerPrefetch
(
router
.
currentRoute
.
value
)
await
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
100
))
const
prefetchedCount
=
routePrefetch
.
prefetchedRoutes
.
value
.
size
// 再次触发相同路由预加载
routePrefetch
.
triggerPrefetch
(
router
.
currentRoute
.
value
)
await
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
100
))
// 预加载数量不应增加
expect
(
routePrefetch
.
prefetchedRoutes
.
value
.
size
).
toBe
(
prefetchedCount
)
wrapper
.
unmount
()
})
it
(
'
路由变化时应取消之前的预加载任务
'
,
async
()
=>
{
const
routePrefetch
=
useRoutePrefetch
()
const
wrapper
=
mount
(
TestApp
,
{
global
:
{
plugins
:
[
router
]
}
})
await
router
.
isReady
()
// 触发预加载
routePrefetch
.
triggerPrefetch
(
router
.
currentRoute
.
value
)
// 立即导航到新路由(这会在内部调用 cancelPendingPrefetch)
routePrefetch
.
triggerPrefetch
({
path
:
'
/keys
'
}
as
any
)
// 由于 triggerPrefetch 内部调用 cancelPendingPrefetch,检查是否有预加载被正确管理
expect
(
routePrefetch
.
prefetchedRoutes
.
value
.
size
).
toBeLessThanOrEqual
(
2
)
wrapper
.
unmount
()
})
})
describe
(
'
Chunk 加载错误恢复
'
,
()
=>
{
it
(
'
chunk 加载失败应该被正确捕获
'
,
async
()
=>
{
const
errorHandler
=
vi
.
fn
()
// 创建带错误处理的路由
const
errorRouter
=
createRouter
({
history
:
createWebHistory
(),
routes
:
[
{
path
:
'
/dashboard
'
,
name
:
'
Dashboard
'
,
component
:
MockDashboard
},
{
path
:
'
/error-page
'
,
name
:
'
ErrorPage
'
,
// 模拟加载失败的组件
component
:
()
=>
Promise
.
reject
(
new
Error
(
'
Failed to fetch dynamically imported module
'
))
}
]
})
errorRouter
.
onError
(
errorHandler
)
const
wrapper
=
mount
(
TestApp
,
{
global
:
{
plugins
:
[
errorRouter
]
}
})
await
errorRouter
.
isReady
()
await
errorRouter
.
push
(
'
/dashboard
'
)
await
flushPromises
()
// 尝试导航到会失败的页面
try
{
await
errorRouter
.
push
(
'
/error-page
'
)
}
catch
{
// 预期会失败
}
await
flushPromises
()
// 错误处理器应该被调用
expect
(
errorHandler
).
toHaveBeenCalled
()
wrapper
.
unmount
()
})
it
(
'
chunk 加载错误应该包含正确的错误信息
'
,
async
()
=>
{
let
capturedError
:
Error
|
null
=
null
const
errorRouter
=
createRouter
({
history
:
createWebHistory
(),
routes
:
[
{
path
:
'
/dashboard
'
,
name
:
'
Dashboard
'
,
component
:
MockDashboard
},
{
path
:
'
/chunk-error
'
,
name
:
'
ChunkError
'
,
component
:
()
=>
{
const
error
=
new
Error
(
'
Loading chunk failed
'
)
error
.
name
=
'
ChunkLoadError
'
return
Promise
.
reject
(
error
)
}
}
]
})
errorRouter
.
onError
((
error
)
=>
{
capturedError
=
error
})
const
wrapper
=
mount
(
TestApp
,
{
global
:
{
plugins
:
[
errorRouter
]
}
})
await
errorRouter
.
isReady
()
try
{
await
errorRouter
.
push
(
'
/chunk-error
'
)
}
catch
{
// 预期会失败
}
await
flushPromises
()
expect
(
capturedError
).
not
.
toBeNull
()
expect
(
capturedError
!
.
name
).
toBe
(
'
ChunkLoadError
'
)
wrapper
.
unmount
()
})
})
describe
(
'
导航状态管理
'
,
()
=>
{
it
(
'
导航开始时 isLoading 应该变为 true
'
,
async
()
=>
{
const
navigationLoading
=
useNavigationLoadingState
()
// 创建一个延迟加载的组件来模拟真实场景
const
DelayedComponent
=
defineComponent
({
name
:
'
DelayedComponent
'
,
async
setup
()
{
await
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
50
))
return
()
=>
h
(
'
div
'
,
'
Delayed
'
)
}
})
const
delayRouter
=
createRouter
({
history
:
createWebHistory
(),
routes
:
[
{
path
:
'
/dashboard
'
,
name
:
'
Dashboard
'
,
component
:
MockDashboard
},
{
path
:
'
/delayed
'
,
name
:
'
Delayed
'
,
component
:
DelayedComponent
}
]
})
// 设置导航守卫
delayRouter
.
beforeEach
(()
=>
{
navigationLoading
.
startNavigation
()
})
delayRouter
.
afterEach
(()
=>
{
navigationLoading
.
endNavigation
()
})
const
wrapper
=
mount
(
TestApp
,
{
global
:
{
plugins
:
[
delayRouter
]
}
})
await
delayRouter
.
isReady
()
await
delayRouter
.
push
(
'
/dashboard
'
)
await
flushPromises
()
// 导航结束后 isLoading 应该为 false
expect
(
navigationLoading
.
isLoading
.
value
).
toBe
(
false
)
wrapper
.
unmount
()
})
it
(
'
导航取消时应该正确重置状态
'
,
async
()
=>
{
const
navigationLoading
=
useNavigationLoadingState
()
const
testRouter
=
createRouter
({
history
:
createWebHistory
(),
routes
:
[
{
path
:
'
/dashboard
'
,
name
:
'
Dashboard
'
,
component
:
MockDashboard
},
{
path
:
'
/keys
'
,
name
:
'
Keys
'
,
component
:
MockKeys
,
beforeEnter
:
(
_to
,
_from
,
next
)
=>
{
// 模拟导航取消
next
(
false
)
}
}
]
})
testRouter
.
beforeEach
(()
=>
{
navigationLoading
.
startNavigation
()
})
testRouter
.
afterEach
(()
=>
{
navigationLoading
.
endNavigation
()
})
const
wrapper
=
mount
(
TestApp
,
{
global
:
{
plugins
:
[
testRouter
]
}
})
await
testRouter
.
isReady
()
await
testRouter
.
push
(
'
/dashboard
'
)
await
flushPromises
()
// 尝试导航到被取消的路由
await
testRouter
.
push
(
'
/keys
'
).
catch
(()
=>
{})
await
flushPromises
()
// 导航被取消后,状态应该被重置
// 注意:由于 afterEach 仍然会被调用,isLoading 应该为 false
expect
(
navigationLoading
.
isLoading
.
value
).
toBe
(
false
)
wrapper
.
unmount
()
})
})
})
frontend/src/__tests__/setup.ts
0 → 100644
View file @
dae0d532
/**
* Vitest 测试环境设置
* 提供全局 mock 和测试工具
*/
import
{
config
}
from
'
@vue/test-utils
'
import
{
vi
}
from
'
vitest
'
// Mock requestIdleCallback (Safari < 15 不支持)
if
(
typeof
globalThis
.
requestIdleCallback
===
'
undefined
'
)
{
globalThis
.
requestIdleCallback
=
((
callback
:
IdleRequestCallback
)
=>
{
return
window
.
setTimeout
(()
=>
callback
({
didTimeout
:
false
,
timeRemaining
:
()
=>
50
}),
1
)
})
as
unknown
as
typeof
requestIdleCallback
}
if
(
typeof
globalThis
.
cancelIdleCallback
===
'
undefined
'
)
{
globalThis
.
cancelIdleCallback
=
((
id
:
number
)
=>
{
window
.
clearTimeout
(
id
)
})
as
unknown
as
typeof
cancelIdleCallback
}
// Mock IntersectionObserver
class
MockIntersectionObserver
{
observe
=
vi
.
fn
()
disconnect
=
vi
.
fn
()
unobserve
=
vi
.
fn
()
}
globalThis
.
IntersectionObserver
=
MockIntersectionObserver
as
unknown
as
typeof
IntersectionObserver
// Mock ResizeObserver
class
MockResizeObserver
{
observe
=
vi
.
fn
()
disconnect
=
vi
.
fn
()
unobserve
=
vi
.
fn
()
}
globalThis
.
ResizeObserver
=
MockResizeObserver
as
unknown
as
typeof
ResizeObserver
// Vue Test Utils 全局配置
config
.
global
.
stubs
=
{
// 可以在这里添加全局 stub
}
// 设置全局测试超时
vi
.
setConfig
({
testTimeout
:
10000
})
frontend/src/components/common/NavigationProgress.vue
0 → 100644
View file @
dae0d532
<
script
setup
lang=
"ts"
>
/**
* 导航进度条组件
* 在页面顶部显示加载进度,提供导航反馈
*/
import
{
computed
}
from
'
vue
'
import
{
useNavigationLoadingState
}
from
'
@/composables/useNavigationLoading
'
const
{
isLoading
}
=
useNavigationLoadingState
()
// 进度条可见性
const
isVisible
=
computed
(()
=>
isLoading
.
value
)
</
script
>
<
template
>
<Transition
name=
"progress-fade"
>
<div
v-show=
"isVisible"
class=
"navigation-progress"
role=
"progressbar"
aria-label=
"Loading"
aria-valuenow=
"0"
aria-valuemin=
"0"
aria-valuemax=
"100"
>
<div
class=
"navigation-progress-bar"
/>
</div>
</Transition>
</
template
>
<
style
scoped
>
.navigation-progress
{
position
:
fixed
;
top
:
0
;
left
:
0
;
right
:
0
;
height
:
3px
;
z-index
:
9999
;
overflow
:
hidden
;
background
:
transparent
;
}
.navigation-progress-bar
{
height
:
100%
;
width
:
100%
;
background
:
linear-gradient
(
90deg
,
transparent
0%
,
theme
(
'colors.primary.400'
)
20%
,
theme
(
'colors.primary.500'
)
50%
,
theme
(
'colors.primary.400'
)
80%
,
transparent
100%
);
animation
:
progress-slide
1.5s
ease-in-out
infinite
;
}
/* 暗色模式下的进度条颜色 */
:root
.dark
.navigation-progress-bar
{
background
:
linear-gradient
(
90deg
,
transparent
0%
,
theme
(
'colors.primary.500'
)
20%
,
theme
(
'colors.primary.400'
)
50%
,
theme
(
'colors.primary.500'
)
80%
,
transparent
100%
);
}
/* 进度条滑动动画 */
@keyframes
progress-slide
{
0
%
{
transform
:
translateX
(
-100%
);
}
100
%
{
transform
:
translateX
(
100%
);
}
}
/* 淡入淡出过渡 */
.progress-fade-enter-active
{
transition
:
opacity
0.15s
ease-out
;
}
.progress-fade-leave-active
{
transition
:
opacity
0.3s
ease-out
;
}
.progress-fade-enter-from
,
.progress-fade-leave-to
{
opacity
:
0
;
}
/* 减少动画模式 */
@media
(
prefers-reduced-motion
:
reduce
)
{
.navigation-progress-bar
{
animation
:
progress-pulse
2s
ease-in-out
infinite
;
}
@keyframes
progress-pulse
{
0
%,
100
%
{
opacity
:
0.4
;
}
50
%
{
opacity
:
1
;
}
}
}
</
style
>
frontend/src/components/common/__tests__/NavigationProgress.spec.ts
0 → 100644
View file @
dae0d532
/**
* NavigationProgress 组件单元测试
*/
import
{
describe
,
it
,
expect
,
vi
,
beforeEach
}
from
'
vitest
'
import
{
mount
}
from
'
@vue/test-utils
'
import
{
ref
}
from
'
vue
'
import
NavigationProgress
from
'
../../common/NavigationProgress.vue
'
// Mock useNavigationLoadingState
const
mockIsLoading
=
ref
(
false
)
vi
.
mock
(
'
@/composables/useNavigationLoading
'
,
()
=>
({
useNavigationLoadingState
:
()
=>
({
isLoading
:
mockIsLoading
})
}))
describe
(
'
NavigationProgress
'
,
()
=>
{
beforeEach
(()
=>
{
mockIsLoading
.
value
=
false
})
it
(
'
isLoading=false 时进度条应该隐藏
'
,
()
=>
{
mockIsLoading
.
value
=
false
const
wrapper
=
mount
(
NavigationProgress
)
const
progressBar
=
wrapper
.
find
(
'
.navigation-progress
'
)
// v-show 会设置 display: none
expect
(
progressBar
.
isVisible
()).
toBe
(
false
)
})
it
(
'
isLoading=true 时进度条应该可见
'
,
async
()
=>
{
mockIsLoading
.
value
=
true
const
wrapper
=
mount
(
NavigationProgress
)
await
wrapper
.
vm
.
$nextTick
()
const
progressBar
=
wrapper
.
find
(
'
.navigation-progress
'
)
expect
(
progressBar
.
exists
()).
toBe
(
true
)
expect
(
progressBar
.
isVisible
()).
toBe
(
true
)
})
it
(
'
应该有正确的 ARIA 属性
'
,
()
=>
{
mockIsLoading
.
value
=
true
const
wrapper
=
mount
(
NavigationProgress
)
const
progressBar
=
wrapper
.
find
(
'
.navigation-progress
'
)
expect
(
progressBar
.
attributes
(
'
role
'
)).
toBe
(
'
progressbar
'
)
expect
(
progressBar
.
attributes
(
'
aria-label
'
)).
toBe
(
'
Loading
'
)
expect
(
progressBar
.
attributes
(
'
aria-valuemin
'
)).
toBe
(
'
0
'
)
expect
(
progressBar
.
attributes
(
'
aria-valuemax
'
)).
toBe
(
'
100
'
)
})
it
(
'
进度条应该有动画 class
'
,
()
=>
{
mockIsLoading
.
value
=
true
const
wrapper
=
mount
(
NavigationProgress
)
const
bar
=
wrapper
.
find
(
'
.navigation-progress-bar
'
)
expect
(
bar
.
exists
()).
toBe
(
true
)
})
it
(
'
应该正确响应 isLoading 状态变化
'
,
async
()
=>
{
// 测试初始状态为 false
mockIsLoading
.
value
=
false
const
wrapper
=
mount
(
NavigationProgress
)
await
wrapper
.
vm
.
$nextTick
()
// 初始状态隐藏
expect
(
wrapper
.
find
(
'
.navigation-progress
'
).
isVisible
()).
toBe
(
false
)
// 卸载后重新挂载以测试 true 状态
wrapper
.
unmount
()
// 改变为 true 后重新挂载
mockIsLoading
.
value
=
true
const
wrapper2
=
mount
(
NavigationProgress
)
await
wrapper2
.
vm
.
$nextTick
()
expect
(
wrapper2
.
find
(
'
.navigation-progress
'
).
isVisible
()).
toBe
(
true
)
// 清理
wrapper2
.
unmount
()
})
})
frontend/src/composables/__tests__/useNavigationLoading.spec.ts
0 → 100644
View file @
dae0d532
/**
* useNavigationLoading 组合式函数单元测试
*/
import
{
describe
,
it
,
expect
,
vi
,
beforeEach
,
afterEach
}
from
'
vitest
'
import
{
useNavigationLoading
,
_resetNavigationLoadingInstance
}
from
'
../useNavigationLoading
'
describe
(
'
useNavigationLoading
'
,
()
=>
{
beforeEach
(()
=>
{
vi
.
useFakeTimers
()
_resetNavigationLoadingInstance
()
})
afterEach
(()
=>
{
vi
.
useRealTimers
()
})
describe
(
'
startNavigation
'
,
()
=>
{
it
(
'
导航开始时 isNavigating 应变为 true
'
,
()
=>
{
const
{
isNavigating
,
startNavigation
}
=
useNavigationLoading
()
expect
(
isNavigating
.
value
).
toBe
(
false
)
startNavigation
()
expect
(
isNavigating
.
value
).
toBe
(
true
)
})
it
(
'
导航开始后延迟显示加载指示器(防闪烁)
'
,
()
=>
{
const
{
isLoading
,
startNavigation
,
ANTI_FLICKER_DELAY
}
=
useNavigationLoading
()
startNavigation
()
// 立即检查,不应该显示
expect
(
isLoading
.
value
).
toBe
(
false
)
// 经过防闪烁延迟后应该显示
vi
.
advanceTimersByTime
(
ANTI_FLICKER_DELAY
)
expect
(
isLoading
.
value
).
toBe
(
true
)
})
})
describe
(
'
endNavigation
'
,
()
=>
{
it
(
'
导航结束时 isLoading 应变为 false
'
,
()
=>
{
const
{
isLoading
,
startNavigation
,
endNavigation
,
ANTI_FLICKER_DELAY
}
=
useNavigationLoading
()
startNavigation
()
vi
.
advanceTimersByTime
(
ANTI_FLICKER_DELAY
)
expect
(
isLoading
.
value
).
toBe
(
true
)
endNavigation
()
expect
(
isLoading
.
value
).
toBe
(
false
)
})
it
(
'
导航结束时 isNavigating 应变为 false
'
,
()
=>
{
const
{
isNavigating
,
startNavigation
,
endNavigation
}
=
useNavigationLoading
()
startNavigation
()
expect
(
isNavigating
.
value
).
toBe
(
true
)
endNavigation
()
expect
(
isNavigating
.
value
).
toBe
(
false
)
})
})
describe
(
'
快速导航(< 100ms)防闪烁
'
,
()
=>
{
it
(
'
快速导航不应触发显示加载指示器
'
,
()
=>
{
const
{
isLoading
,
startNavigation
,
endNavigation
,
ANTI_FLICKER_DELAY
}
=
useNavigationLoading
()
startNavigation
()
// 在防闪烁延迟之前结束导航
vi
.
advanceTimersByTime
(
ANTI_FLICKER_DELAY
-
50
)
endNavigation
()
// 不应该显示加载指示器
expect
(
isLoading
.
value
).
toBe
(
false
)
// 即使继续等待也不应该显示
vi
.
advanceTimersByTime
(
100
)
expect
(
isLoading
.
value
).
toBe
(
false
)
})
})
describe
(
'
cancelNavigation
'
,
()
=>
{
it
(
'
导航取消时应正确重置状态
'
,
()
=>
{
const
{
isLoading
,
startNavigation
,
cancelNavigation
,
ANTI_FLICKER_DELAY
}
=
useNavigationLoading
()
startNavigation
()
vi
.
advanceTimersByTime
(
ANTI_FLICKER_DELAY
/
2
)
cancelNavigation
()
// 取消后不应该触发显示
vi
.
advanceTimersByTime
(
ANTI_FLICKER_DELAY
)
expect
(
isLoading
.
value
).
toBe
(
false
)
})
})
describe
(
'
getNavigationDuration
'
,
()
=>
{
it
(
'
应该返回正确的导航持续时间
'
,
()
=>
{
const
{
startNavigation
,
getNavigationDuration
}
=
useNavigationLoading
()
expect
(
getNavigationDuration
()).
toBeNull
()
startNavigation
()
vi
.
advanceTimersByTime
(
500
)
const
duration
=
getNavigationDuration
()
expect
(
duration
).
toBe
(
500
)
})
it
(
'
导航结束后应返回 null
'
,
()
=>
{
const
{
startNavigation
,
endNavigation
,
getNavigationDuration
}
=
useNavigationLoading
()
startNavigation
()
vi
.
advanceTimersByTime
(
500
)
endNavigation
()
expect
(
getNavigationDuration
()).
toBeNull
()
})
})
describe
(
'
resetState
'
,
()
=>
{
it
(
'
应该重置所有状态
'
,
()
=>
{
const
{
isLoading
,
isNavigating
,
startNavigation
,
resetState
,
ANTI_FLICKER_DELAY
}
=
useNavigationLoading
()
startNavigation
()
vi
.
advanceTimersByTime
(
ANTI_FLICKER_DELAY
)
expect
(
isLoading
.
value
).
toBe
(
true
)
expect
(
isNavigating
.
value
).
toBe
(
true
)
resetState
()
expect
(
isLoading
.
value
).
toBe
(
false
)
expect
(
isNavigating
.
value
).
toBe
(
false
)
})
})
describe
(
'
连续导航场景
'
,
()
=>
{
it
(
'
连续快速导航应正确处理状态
'
,
()
=>
{
const
{
isLoading
,
startNavigation
,
cancelNavigation
,
endNavigation
,
ANTI_FLICKER_DELAY
}
=
useNavigationLoading
()
// 第一次导航
startNavigation
()
vi
.
advanceTimersByTime
(
30
)
// 第二次导航(取消第一次)
cancelNavigation
()
startNavigation
()
vi
.
advanceTimersByTime
(
30
)
// 第三次导航(取消第二次)
cancelNavigation
()
startNavigation
()
// 这次等待足够长时间
vi
.
advanceTimersByTime
(
ANTI_FLICKER_DELAY
)
expect
(
isLoading
.
value
).
toBe
(
true
)
// 结束导航
endNavigation
()
expect
(
isLoading
.
value
).
toBe
(
false
)
})
})
describe
(
'
ANTI_FLICKER_DELAY 常量
'
,
()
=>
{
it
(
'
应该为 100ms
'
,
()
=>
{
const
{
ANTI_FLICKER_DELAY
}
=
useNavigationLoading
()
expect
(
ANTI_FLICKER_DELAY
).
toBe
(
100
)
})
})
})
frontend/src/composables/__tests__/useRoutePrefetch.spec.ts
0 → 100644
View file @
dae0d532
/**
* useRoutePrefetch 组合式函数单元测试
*/
import
{
describe
,
it
,
expect
,
vi
,
beforeEach
,
afterEach
}
from
'
vitest
'
import
type
{
RouteLocationNormalized
,
Router
,
RouteRecordNormalized
}
from
'
vue-router
'
import
{
useRoutePrefetch
,
_adminPrefetchMap
,
_userPrefetchMap
}
from
'
../useRoutePrefetch
'
// Mock 路由对象
const
createMockRoute
=
(
path
:
string
):
RouteLocationNormalized
=>
({
path
,
name
:
undefined
,
params
:
{},
query
:
{},
hash
:
''
,
fullPath
:
path
,
matched
:
[],
meta
:
{},
redirectedFrom
:
undefined
})
// Mock Router
const
createMockRouter
=
():
Router
=>
{
const
mockImportFn
=
vi
.
fn
().
mockResolvedValue
({
default
:
{}
})
const
routes
:
Partial
<
RouteRecordNormalized
>
[]
=
[
{
path
:
'
/admin/dashboard
'
,
components
:
{
default
:
mockImportFn
}
},
{
path
:
'
/admin/accounts
'
,
components
:
{
default
:
mockImportFn
}
},
{
path
:
'
/admin/users
'
,
components
:
{
default
:
mockImportFn
}
},
{
path
:
'
/admin/groups
'
,
components
:
{
default
:
mockImportFn
}
},
{
path
:
'
/admin/subscriptions
'
,
components
:
{
default
:
mockImportFn
}
},
{
path
:
'
/admin/redeem
'
,
components
:
{
default
:
mockImportFn
}
},
{
path
:
'
/dashboard
'
,
components
:
{
default
:
mockImportFn
}
},
{
path
:
'
/keys
'
,
components
:
{
default
:
mockImportFn
}
},
{
path
:
'
/usage
'
,
components
:
{
default
:
mockImportFn
}
},
{
path
:
'
/redeem
'
,
components
:
{
default
:
mockImportFn
}
},
{
path
:
'
/profile
'
,
components
:
{
default
:
mockImportFn
}
}
]
return
{
getRoutes
:
()
=>
routes
as
RouteRecordNormalized
[]
}
as
Router
}
describe
(
'
useRoutePrefetch
'
,
()
=>
{
let
originalRequestIdleCallback
:
typeof
window
.
requestIdleCallback
let
originalCancelIdleCallback
:
typeof
window
.
cancelIdleCallback
let
mockRouter
:
Router
beforeEach
(()
=>
{
mockRouter
=
createMockRouter
()
// 保存原始函数
originalRequestIdleCallback
=
window
.
requestIdleCallback
originalCancelIdleCallback
=
window
.
cancelIdleCallback
// Mock requestIdleCallback 立即执行
vi
.
stubGlobal
(
'
requestIdleCallback
'
,
(
cb
:
IdleRequestCallback
)
=>
{
const
id
=
setTimeout
(()
=>
cb
({
didTimeout
:
false
,
timeRemaining
:
()
=>
50
}),
0
)
return
id
})
vi
.
stubGlobal
(
'
cancelIdleCallback
'
,
(
id
:
number
)
=>
clearTimeout
(
id
))
})
afterEach
(()
=>
{
vi
.
restoreAllMocks
()
// 恢复原始函数
window
.
requestIdleCallback
=
originalRequestIdleCallback
window
.
cancelIdleCallback
=
originalCancelIdleCallback
})
describe
(
'
_isAdminRoute
'
,
()
=>
{
it
(
'
应该正确识别管理员路由
'
,
()
=>
{
const
{
_isAdminRoute
}
=
useRoutePrefetch
(
mockRouter
)
expect
(
_isAdminRoute
(
'
/admin/dashboard
'
)).
toBe
(
true
)
expect
(
_isAdminRoute
(
'
/admin/users
'
)).
toBe
(
true
)
expect
(
_isAdminRoute
(
'
/admin/accounts
'
)).
toBe
(
true
)
})
it
(
'
应该正确识别非管理员路由
'
,
()
=>
{
const
{
_isAdminRoute
}
=
useRoutePrefetch
(
mockRouter
)
expect
(
_isAdminRoute
(
'
/dashboard
'
)).
toBe
(
false
)
expect
(
_isAdminRoute
(
'
/keys
'
)).
toBe
(
false
)
expect
(
_isAdminRoute
(
'
/usage
'
)).
toBe
(
false
)
})
})
describe
(
'
_getPrefetchConfig
'
,
()
=>
{
it
(
'
管理员 dashboard 应该返回正确的预加载配置
'
,
()
=>
{
const
{
_getPrefetchConfig
}
=
useRoutePrefetch
(
mockRouter
)
const
route
=
createMockRoute
(
'
/admin/dashboard
'
)
const
config
=
_getPrefetchConfig
(
route
)
expect
(
config
).
toHaveLength
(
2
)
})
it
(
'
普通用户 dashboard 应该返回正确的预加载配置
'
,
()
=>
{
const
{
_getPrefetchConfig
}
=
useRoutePrefetch
(
mockRouter
)
const
route
=
createMockRoute
(
'
/dashboard
'
)
const
config
=
_getPrefetchConfig
(
route
)
expect
(
config
).
toHaveLength
(
2
)
})
it
(
'
未定义的路由应该返回空数组
'
,
()
=>
{
const
{
_getPrefetchConfig
}
=
useRoutePrefetch
(
mockRouter
)
const
route
=
createMockRoute
(
'
/unknown-route
'
)
const
config
=
_getPrefetchConfig
(
route
)
expect
(
config
).
toHaveLength
(
0
)
})
})
describe
(
'
triggerPrefetch
'
,
()
=>
{
it
(
'
应该在浏览器空闲时触发预加载
'
,
async
()
=>
{
const
{
triggerPrefetch
,
prefetchedRoutes
}
=
useRoutePrefetch
(
mockRouter
)
const
route
=
createMockRoute
(
'
/admin/dashboard
'
)
triggerPrefetch
(
route
)
// 等待 requestIdleCallback 执行
await
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
100
))
expect
(
prefetchedRoutes
.
value
.
has
(
'
/admin/dashboard
'
)).
toBe
(
true
)
})
it
(
'
应该避免重复预加载同一路由
'
,
async
()
=>
{
const
{
triggerPrefetch
,
prefetchedRoutes
}
=
useRoutePrefetch
(
mockRouter
)
const
route
=
createMockRoute
(
'
/admin/dashboard
'
)
triggerPrefetch
(
route
)
await
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
100
))
// 第二次触发
triggerPrefetch
(
route
)
await
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
100
))
// 只应该预加载一次
expect
(
prefetchedRoutes
.
value
.
size
).
toBe
(
1
)
})
})
describe
(
'
cancelPendingPrefetch
'
,
()
=>
{
it
(
'
应该取消挂起的预加载任务
'
,
()
=>
{
const
{
triggerPrefetch
,
cancelPendingPrefetch
,
prefetchedRoutes
}
=
useRoutePrefetch
(
mockRouter
)
const
route
=
createMockRoute
(
'
/admin/dashboard
'
)
triggerPrefetch
(
route
)
cancelPendingPrefetch
()
// 不应该有预加载完成
expect
(
prefetchedRoutes
.
value
.
size
).
toBe
(
0
)
})
})
describe
(
'
路由变化时取消之前的预加载
'
,
()
=>
{
it
(
'
应该在路由变化时取消之前的预加载任务
'
,
async
()
=>
{
const
{
triggerPrefetch
,
prefetchedRoutes
}
=
useRoutePrefetch
(
mockRouter
)
// 触发第一个路由的预加载
triggerPrefetch
(
createMockRoute
(
'
/admin/dashboard
'
))
// 立即切换到另一个路由
triggerPrefetch
(
createMockRoute
(
'
/admin/users
'
))
// 等待执行
await
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
100
))
// 只有最后一个路由应该被预加载
expect
(
prefetchedRoutes
.
value
.
has
(
'
/admin/users
'
)).
toBe
(
true
)
})
})
describe
(
'
resetPrefetchState
'
,
()
=>
{
it
(
'
应该重置所有预加载状态
'
,
async
()
=>
{
const
{
triggerPrefetch
,
resetPrefetchState
,
prefetchedRoutes
}
=
useRoutePrefetch
(
mockRouter
)
const
route
=
createMockRoute
(
'
/admin/dashboard
'
)
triggerPrefetch
(
route
)
await
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
100
))
expect
(
prefetchedRoutes
.
value
.
size
).
toBeGreaterThan
(
0
)
resetPrefetchState
()
expect
(
prefetchedRoutes
.
value
.
size
).
toBe
(
0
)
})
})
describe
(
'
预加载映射表
'
,
()
=>
{
it
(
'
管理员预加载映射表应该包含正确的路由
'
,
()
=>
{
expect
(
_adminPrefetchMap
).
toHaveProperty
(
'
/admin/dashboard
'
)
expect
(
_adminPrefetchMap
[
'
/admin/dashboard
'
]).
toHaveLength
(
2
)
})
it
(
'
用户预加载映射表应该包含正确的路由
'
,
()
=>
{
expect
(
_userPrefetchMap
).
toHaveProperty
(
'
/dashboard
'
)
expect
(
_userPrefetchMap
[
'
/dashboard
'
]).
toHaveLength
(
2
)
})
})
describe
(
'
requestIdleCallback 超时处理
'
,
()
=>
{
it
(
'
超时后仍能正常执行预加载
'
,
async
()
=>
{
// 模拟超时情况
vi
.
stubGlobal
(
'
requestIdleCallback
'
,
(
cb
:
IdleRequestCallback
,
options
?:
IdleRequestOptions
)
=>
{
const
timeout
=
options
?.
timeout
||
2000
return
setTimeout
(()
=>
cb
({
didTimeout
:
true
,
timeRemaining
:
()
=>
0
}),
timeout
)
})
const
{
triggerPrefetch
,
prefetchedRoutes
}
=
useRoutePrefetch
(
mockRouter
)
const
route
=
createMockRoute
(
'
/dashboard
'
)
triggerPrefetch
(
route
)
// 等待超时执行
await
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
2100
))
expect
(
prefetchedRoutes
.
value
.
has
(
'
/dashboard
'
)).
toBe
(
true
)
})
})
describe
(
'
预加载失败处理
'
,
()
=>
{
it
(
'
预加载失败时应该静默处理不影响页面功能
'
,
async
()
=>
{
const
{
triggerPrefetch
}
=
useRoutePrefetch
(
mockRouter
)
const
route
=
createMockRoute
(
'
/admin/dashboard
'
)
// 不应该抛出异常
expect
(()
=>
triggerPrefetch
(
route
)).
not
.
toThrow
()
})
})
describe
(
'
无 router 时的行为
'
,
()
=>
{
it
(
'
没有传入 router 时应该正常工作但不执行预加载
'
,
async
()
=>
{
const
{
triggerPrefetch
,
prefetchedRoutes
}
=
useRoutePrefetch
()
const
route
=
createMockRoute
(
'
/admin/dashboard
'
)
triggerPrefetch
(
route
)
await
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
100
))
// 没有 router,无法获取组件,所以不会预加载
expect
(
prefetchedRoutes
.
value
.
size
).
toBe
(
0
)
})
})
})
frontend/src/composables/useNavigationLoading.ts
0 → 100644
View file @
dae0d532
/**
* 导航加载状态组合式函数
* 管理路由切换时的加载状态,支持防闪烁逻辑
*/
import
{
ref
,
readonly
,
computed
}
from
'
vue
'
/**
* 导航加载状态管理
*
* 功能:
* 1. 在路由切换时显示加载状态
* 2. 快速导航(< 100ms)不显示加载指示器(防闪烁)
* 3. 导航取消时正确重置状态
*/
export
function
useNavigationLoading
()
{
// 内部加载状态
const
_isLoading
=
ref
(
false
)
// 导航开始时间(用于防闪烁计算)
let
navigationStartTime
:
number
|
null
=
null
// 防闪烁延迟计时器
let
showLoadingTimer
:
ReturnType
<
typeof
setTimeout
>
|
null
=
null
// 是否应该显示加载指示器(考虑防闪烁逻辑)
const
shouldShowLoading
=
ref
(
false
)
// 防闪烁延迟时间(毫秒)
const
ANTI_FLICKER_DELAY
=
100
/**
* 清理计时器
*/
const
clearTimer
=
():
void
=>
{
if
(
showLoadingTimer
!==
null
)
{
clearTimeout
(
showLoadingTimer
)
showLoadingTimer
=
null
}
}
/**
* 导航开始时调用
*/
const
startNavigation
=
():
void
=>
{
navigationStartTime
=
Date
.
now
()
_isLoading
.
value
=
true
// 延迟显示加载指示器,实现防闪烁
clearTimer
()
showLoadingTimer
=
setTimeout
(()
=>
{
if
(
_isLoading
.
value
)
{
shouldShowLoading
.
value
=
true
}
},
ANTI_FLICKER_DELAY
)
}
/**
* 导航结束时调用
*/
const
endNavigation
=
():
void
=>
{
clearTimer
()
_isLoading
.
value
=
false
shouldShowLoading
.
value
=
false
navigationStartTime
=
null
}
/**
* 导航取消时调用(比如快速连续点击不同链接)
*/
const
cancelNavigation
=
():
void
=>
{
clearTimer
()
// 保持加载状态,因为新的导航会立即开始
// 但重置导航开始时间
navigationStartTime
=
null
}
/**
* 重置所有状态(用于测试)
*/
const
resetState
=
():
void
=>
{
clearTimer
()
_isLoading
.
value
=
false
shouldShowLoading
.
value
=
false
navigationStartTime
=
null
}
/**
* 获取导航持续时间(毫秒)
*/
const
getNavigationDuration
=
():
number
|
null
=>
{
if
(
navigationStartTime
===
null
)
{
return
null
}
return
Date
.
now
()
-
navigationStartTime
}
// 公开的加载状态(只读)
const
isLoading
=
computed
(()
=>
shouldShowLoading
.
value
)
// 内部加载状态(用于测试,不考虑防闪烁)
const
isNavigating
=
readonly
(
_isLoading
)
return
{
isLoading
,
isNavigating
,
startNavigation
,
endNavigation
,
cancelNavigation
,
resetState
,
getNavigationDuration
,
// 导出常量用于测试
ANTI_FLICKER_DELAY
}
}
// 创建单例实例,供全局使用
let
navigationLoadingInstance
:
ReturnType
<
typeof
useNavigationLoading
>
|
null
=
null
export
function
useNavigationLoadingState
()
{
if
(
!
navigationLoadingInstance
)
{
navigationLoadingInstance
=
useNavigationLoading
()
}
return
navigationLoadingInstance
}
// 导出重置函数(用于测试)
export
function
_resetNavigationLoadingInstance
():
void
{
if
(
navigationLoadingInstance
)
{
navigationLoadingInstance
.
resetState
()
}
navigationLoadingInstance
=
null
}
frontend/src/composables/useRoutePrefetch.ts
0 → 100644
View file @
dae0d532
/**
* 路由预加载组合式函数
* 在浏览器空闲时预加载可能访问的下一个页面,提升导航体验
*
* 优化说明:
* - 不使用静态 import() 映射表,避免增加入口文件大小
* - 通过路由配置动态获取组件的 import 函数
* - 只在实际需要预加载时才执行
*/
import
{
ref
,
readonly
}
from
'
vue
'
import
type
{
RouteLocationNormalized
,
Router
}
from
'
vue-router
'
/**
* 组件导入函数类型
*/
type
ComponentImportFn
=
()
=>
Promise
<
unknown
>
/**
* 预加载邻接表:定义每个路由应该预加载哪些相邻路由
* 只存储路由路径,不存储 import 函数,避免打包问题
*/
const
PREFETCH_ADJACENCY
:
Record
<
string
,
string
[]
>
=
{
// Admin routes - 预加载最常访问的相邻页面
'
/admin/dashboard
'
:
[
'
/admin/accounts
'
,
'
/admin/users
'
],
'
/admin/accounts
'
:
[
'
/admin/dashboard
'
,
'
/admin/users
'
],
'
/admin/users
'
:
[
'
/admin/groups
'
,
'
/admin/dashboard
'
],
'
/admin/groups
'
:
[
'
/admin/subscriptions
'
,
'
/admin/users
'
],
'
/admin/subscriptions
'
:
[
'
/admin/groups
'
,
'
/admin/redeem
'
],
// User routes
'
/dashboard
'
:
[
'
/keys
'
,
'
/usage
'
],
'
/keys
'
:
[
'
/dashboard
'
,
'
/usage
'
],
'
/usage
'
:
[
'
/keys
'
,
'
/redeem
'
],
'
/redeem
'
:
[
'
/usage
'
,
'
/profile
'
],
'
/profile
'
:
[
'
/dashboard
'
,
'
/keys
'
]
}
/**
* requestIdleCallback 的返回类型
*/
type
IdleCallbackHandle
=
number
|
ReturnType
<
typeof
setTimeout
>
/**
* requestIdleCallback polyfill (Safari < 15)
*/
const
scheduleIdleCallback
=
(
callback
:
IdleRequestCallback
,
options
?:
IdleRequestOptions
):
IdleCallbackHandle
=>
{
if
(
typeof
window
.
requestIdleCallback
===
'
function
'
)
{
return
window
.
requestIdleCallback
(
callback
,
options
)
}
return
setTimeout
(()
=>
{
callback
({
didTimeout
:
false
,
timeRemaining
:
()
=>
50
})
},
1000
)
}
const
cancelScheduledCallback
=
(
handle
:
IdleCallbackHandle
):
void
=>
{
if
(
typeof
window
.
cancelIdleCallback
===
'
function
'
&&
typeof
handle
===
'
number
'
)
{
window
.
cancelIdleCallback
(
handle
)
}
else
{
clearTimeout
(
handle
)
}
}
/**
* 路由预加载组合式函数
*
* @param router - Vue Router 实例,用于获取路由组件
*/
export
function
useRoutePrefetch
(
router
?:
Router
)
{
// 当前挂起的预加载任务句柄
const
pendingPrefetchHandle
=
ref
<
IdleCallbackHandle
|
null
>
(
null
)
// 已预加载的路由集合
const
prefetchedRoutes
=
ref
<
Set
<
string
>>
(
new
Set
())
/**
* 从路由配置中获取组件的 import 函数
*/
const
getComponentImporter
=
(
path
:
string
):
ComponentImportFn
|
null
=>
{
if
(
!
router
)
return
null
const
routes
=
router
.
getRoutes
()
const
route
=
routes
.
find
((
r
)
=>
r
.
path
===
path
)
if
(
route
&&
route
.
components
?.
default
)
{
const
component
=
route
.
components
.
default
// 检查是否是懒加载组件(函数形式)
if
(
typeof
component
===
'
function
'
)
{
return
component
as
ComponentImportFn
}
}
return
null
}
/**
* 获取当前路由应该预加载的路由路径列表
*/
const
getPrefetchPaths
=
(
route
:
RouteLocationNormalized
):
string
[]
=>
{
return
PREFETCH_ADJACENCY
[
route
.
path
]
||
[]
}
/**
* 执行单个组件的预加载
*/
const
prefetchComponent
=
async
(
importFn
:
ComponentImportFn
):
Promise
<
void
>
=>
{
try
{
await
importFn
()
}
catch
(
error
)
{
// 静默处理预加载错误
if
(
import
.
meta
.
env
.
DEV
)
{
console
.
debug
(
'
[Prefetch] Failed to prefetch component:
'
,
error
)
}
}
}
/**
* 取消挂起的预加载任务
*/
const
cancelPendingPrefetch
=
():
void
=>
{
if
(
pendingPrefetchHandle
.
value
!==
null
)
{
cancelScheduledCallback
(
pendingPrefetchHandle
.
value
)
pendingPrefetchHandle
.
value
=
null
}
}
/**
* 触发路由预加载
*/
const
triggerPrefetch
=
(
route
:
RouteLocationNormalized
):
void
=>
{
cancelPendingPrefetch
()
const
prefetchPaths
=
getPrefetchPaths
(
route
)
if
(
prefetchPaths
.
length
===
0
)
return
pendingPrefetchHandle
.
value
=
scheduleIdleCallback
(
()
=>
{
pendingPrefetchHandle
.
value
=
null
const
routePath
=
route
.
path
if
(
prefetchedRoutes
.
value
.
has
(
routePath
))
return
// 获取需要预加载的组件 import 函数
const
importFns
:
ComponentImportFn
[]
=
[]
for
(
const
path
of
prefetchPaths
)
{
const
importFn
=
getComponentImporter
(
path
)
if
(
importFn
)
{
importFns
.
push
(
importFn
)
}
}
if
(
importFns
.
length
>
0
)
{
Promise
.
all
(
importFns
.
map
(
prefetchComponent
)).
then
(()
=>
{
prefetchedRoutes
.
value
.
add
(
routePath
)
})
}
},
{
timeout
:
2000
}
)
}
/**
* 重置预加载状态
*/
const
resetPrefetchState
=
():
void
=>
{
cancelPendingPrefetch
()
prefetchedRoutes
.
value
.
clear
()
}
/**
* 判断是否为管理员路由
*/
const
isAdminRoute
=
(
path
:
string
):
boolean
=>
{
return
path
.
startsWith
(
'
/admin
'
)
}
/**
* 获取预加载配置(兼容旧 API)
*/
const
getPrefetchConfig
=
(
route
:
RouteLocationNormalized
):
ComponentImportFn
[]
=>
{
const
paths
=
getPrefetchPaths
(
route
)
const
importFns
:
ComponentImportFn
[]
=
[]
for
(
const
path
of
paths
)
{
const
importFn
=
getComponentImporter
(
path
)
if
(
importFn
)
importFns
.
push
(
importFn
)
}
return
importFns
}
return
{
prefetchedRoutes
:
readonly
(
prefetchedRoutes
),
triggerPrefetch
,
cancelPendingPrefetch
,
resetPrefetchState
,
_getPrefetchConfig
:
getPrefetchConfig
,
_isAdminRoute
:
isAdminRoute
}
}
// 兼容旧测试的导出
export
const
_adminPrefetchMap
=
PREFETCH_ADJACENCY
export
const
_userPrefetchMap
=
PREFETCH_ADJACENCY
frontend/src/router/index.ts
View file @
dae0d532
...
...
@@ -6,6 +6,8 @@
import
{
createRouter
,
createWebHistory
,
type
RouteRecordRaw
}
from
'
vue-router
'
import
{
useAuthStore
}
from
'
@/stores/auth
'
import
{
useAppStore
}
from
'
@/stores/app
'
import
{
useNavigationLoadingState
}
from
'
@/composables/useNavigationLoading
'
import
{
useRoutePrefetch
}
from
'
@/composables/useRoutePrefetch
'
/**
* Route definitions with lazy loading
...
...
@@ -326,7 +328,15 @@ const router = createRouter({
*/
let
authInitialized
=
false
// 初始化导航加载状态和预加载
const
navigationLoading
=
useNavigationLoadingState
()
// 延迟初始化预加载,传入 router 实例
let
routePrefetch
:
ReturnType
<
typeof
useRoutePrefetch
>
|
null
=
null
router
.
beforeEach
((
to
,
_from
,
next
)
=>
{
// 开始导航加载状态
navigationLoading
.
startNavigation
()
const
authStore
=
useAuthStore
()
// Restore auth state from localStorage on first navigation (page refresh)
...
...
@@ -398,6 +408,21 @@ router.beforeEach((to, _from, next) => {
next
()
})
/**
* Navigation guard: End loading and trigger prefetch
*/
router
.
afterEach
((
to
)
=>
{
// 结束导航加载状态
navigationLoading
.
endNavigation
()
// 懒初始化预加载(首次导航时创建,传入 router 实例)
if
(
!
routePrefetch
)
{
routePrefetch
=
useRoutePrefetch
(
router
)
}
// 触发路由预加载(在浏览器空闲时执行)
routePrefetch
.
triggerPrefetch
(
to
)
})
/**
* Navigation guard: Error handling
* Handles dynamic import failures caused by deployment updates
...
...
frontend/src/style.css
View file @
dae0d532
@import
url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap')
;
@tailwind
base
;
@tailwind
components
;
@tailwind
utilities
;
...
...
@@ -11,7 +9,6 @@
html
{
@apply
scroll-smooth
antialiased;
font-feature-settings
:
'cv02'
,
'cv03'
,
'cv04'
,
'cv11'
;
}
body
{
...
...
frontend/tailwind.config.js
View file @
dae0d532
...
...
@@ -50,16 +50,19 @@ export default {
},
fontFamily
:
{
sans
:
[
'
Inter
'
,
'
system-ui
'
,
'
-apple-system
'
,
'
BlinkMacSystemFont
'
,
'
Segoe UI
'
,
'
Roboto
'
,
'
Helvetica Neue
'
,
'
Arial
'
,
'
PingFang SC
'
,
'
Hiragino Sans GB
'
,
'
Microsoft YaHei
'
,
'
sans-serif
'
],
mono
:
[
'
JetBrains Mono
'
,
'
Fira Code
'
,
'
Monaco
'
,
'
Consolas
'
,
'
monospace
'
]
mono
:
[
'
ui-monospace
'
,
'
SFMono-Regular
'
,
'
Menlo
'
,
'
Monaco
'
,
'
Consolas
'
,
'
monospace
'
]
},
boxShadow
:
{
glass
:
'
0 8px 32px rgba(0, 0, 0, 0.08)
'
,
...
...
frontend/vite.config.ts
View file @
dae0d532
...
...
@@ -58,7 +58,49 @@ export default defineConfig({
},
build
:
{
outDir
:
'
../backend/internal/web/dist
'
,
emptyOutDir
:
true
emptyOutDir
:
true
,
rollupOptions
:
{
output
:
{
/**
* 手动分包配置
* 分离第三方库并按功能合并应用代码,避免循环依赖
*/
manualChunks
(
id
:
string
)
{
if
(
id
.
includes
(
'
node_modules
'
))
{
// Vue 核心库
if
(
id
.
includes
(
'
/vue/
'
)
||
id
.
includes
(
'
/vue-router/
'
)
||
id
.
includes
(
'
/pinia/
'
)
||
id
.
includes
(
'
/@vue/
'
)
)
{
return
'
vendor-vue
'
}
// UI 工具库(较大,单独分离)
if
(
id
.
includes
(
'
/@vueuse/
'
)
||
id
.
includes
(
'
/xlsx/
'
))
{
return
'
vendor-ui
'
}
// 图表库
if
(
id
.
includes
(
'
/chart.js/
'
)
||
id
.
includes
(
'
/vue-chartjs/
'
))
{
return
'
vendor-chart
'
}
// 国际化
if
(
id
.
includes
(
'
/vue-i18n/
'
)
||
id
.
includes
(
'
/@intlify/
'
))
{
return
'
vendor-i18n
'
}
// 其他小型第三方库合并
return
'
vendor-misc
'
}
// 应用代码:按入口点自动分包,不手动干预
// 这样可以避免循环依赖,同时保持合理的 chunk 数量
}
}
}
},
server
:
{
host
:
'
0.0.0.0
'
,
...
...
frontend/vitest.config.ts
0 → 100644
View file @
dae0d532
import
{
defineConfig
,
mergeConfig
}
from
'
vitest/config
'
import
viteConfig
from
'
./vite.config
'
export
default
mergeConfig
(
viteConfig
,
defineConfig
({
test
:
{
globals
:
true
,
environment
:
'
jsdom
'
,
include
:
[
'
src/**/*.{test,spec}.{js,ts,jsx,tsx}
'
],
exclude
:
[
'
node_modules
'
,
'
dist
'
],
coverage
:
{
provider
:
'
v8
'
,
reporter
:
[
'
text
'
,
'
json
'
,
'
html
'
],
include
:
[
'
src/**/*.{js,ts,vue}
'
],
exclude
:
[
'
node_modules
'
,
'
src/**/*.d.ts
'
,
'
src/**/*.spec.ts
'
,
'
src/**/*.test.ts
'
,
'
src/main.ts
'
],
thresholds
:
{
global
:
{
statements
:
80
,
branches
:
80
,
functions
:
80
,
lines
:
80
}
}
},
setupFiles
:
[
'
./src/__tests__/setup.ts
'
]
}
})
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment