diff --git a/apps/frontend-vue/.env.development b/apps/frontend-vue/.env.development deleted file mode 100644 index 97235773..00000000 --- a/apps/frontend-vue/.env.development +++ /dev/null @@ -1 +0,0 @@ -VITE_API_TARGET=http://127.0.0.1:3000 diff --git a/apps/frontend-vue/.env.example b/apps/frontend-vue/.env.example deleted file mode 100644 index 97235773..00000000 --- a/apps/frontend-vue/.env.example +++ /dev/null @@ -1 +0,0 @@ -VITE_API_TARGET=http://127.0.0.1:3000 diff --git a/apps/frontend-vue/.gitignore b/apps/frontend-vue/.gitignore deleted file mode 100644 index db98efbd..00000000 --- a/apps/frontend-vue/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? -.ace-tool/ diff --git a/apps/frontend-vue/.prettierignore b/apps/frontend-vue/.prettierignore deleted file mode 100644 index bdf2bb93..00000000 --- a/apps/frontend-vue/.prettierignore +++ /dev/null @@ -1,4 +0,0 @@ -dist -node_modules -src/auto-imports.d.ts -src/components.d.ts diff --git a/apps/frontend-vue/.prettierrc.json b/apps/frontend-vue/.prettierrc.json deleted file mode 100644 index 3ee2d113..00000000 --- a/apps/frontend-vue/.prettierrc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "semi": false, - "singleQuote": true, - "printWidth": 100, - "trailingComma": "all" -} diff --git a/apps/frontend-vue/.vscode/extensions.json b/apps/frontend-vue/.vscode/extensions.json deleted file mode 100644 index a7cea0b0..00000000 --- a/apps/frontend-vue/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": ["Vue.volar"] -} diff --git a/apps/frontend-vue/README.md b/apps/frontend-vue/README.md deleted file mode 100644 index 16b0db47..00000000 --- a/apps/frontend-vue/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# 快手轻量前端 - -这是快手自动发货拆分后的 Vue 3 前端,只保留快手领取和运营后台相关入口。 - -## 功能范围 - -- `/claim/:token` 快手 Cloud 领取页 -- `/admin` 运营后台 -- 91 卡券订单补全与任务生成 -- 快手小店核销配置 -- Cloudtentacles 履约配置与调试 -- 内部通知和定时任务配置 - -## 本地开发 - -```bash -npm install -npm run dev -``` - -开发环境默认通过 `VITE_API_TARGET` 代理后端: - -```bash -VITE_API_TARGET=http://localhost:3000 npm run dev -``` - -## 验证 - -```bash -npm run typecheck -npm run build -``` diff --git a/apps/frontend-vue/eslint.config.js b/apps/frontend-vue/eslint.config.js deleted file mode 100644 index 6c034421..00000000 --- a/apps/frontend-vue/eslint.config.js +++ /dev/null @@ -1,34 +0,0 @@ -import js from '@eslint/js' -import prettier from 'eslint-config-prettier' -import pluginVue from 'eslint-plugin-vue' -import globals from 'globals' -import tseslint from 'typescript-eslint' - -export default tseslint.config( - { - ignores: ['dist/**', 'node_modules/**', 'src/auto-imports.d.ts', 'src/components.d.ts'], - }, - js.configs.recommended, - ...tseslint.configs.recommended, - ...pluginVue.configs['flat/recommended'], - prettier, - { - files: ['**/*.{ts,vue}'], - languageOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - globals: { - ...globals.browser, - }, - parserOptions: { - parser: tseslint.parser, - extraFileExtensions: ['.vue'], - }, - }, - rules: { - 'vue/attributes-order': 'off', - 'vue/multi-word-component-names': 'off', - 'vue/no-mutating-props': ['error', { shallowOnly: true }], - }, - }, -) diff --git a/apps/frontend-vue/index.html b/apps/frontend-vue/index.html deleted file mode 100644 index 3dfc7eba..00000000 --- a/apps/frontend-vue/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - 自动兑换前端 - - -
- - - diff --git a/apps/frontend-vue/package-lock.json b/apps/frontend-vue/package-lock.json deleted file mode 100644 index 913dee90..00000000 --- a/apps/frontend-vue/package-lock.json +++ /dev/null @@ -1,4211 +0,0 @@ -{ - "name": "order-site-rewrite", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "order-site-rewrite", - "version": "0.0.0", - "dependencies": { - "@types/qrcode": "^1.5.6", - "axios": "^1.9.0", - "element-plus": "^2.10.2", - "qrcode": "^1.5.4", - "vue": "^3.5.30", - "vue-router": "^4.5.1" - }, - "devDependencies": { - "@eslint/js": "^10.0.1", - "@types/node": "^24.12.0", - "@vitejs/plugin-vue": "^6.0.5", - "@vue/tsconfig": "^0.9.0", - "eslint": "^10.3.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-vue": "^10.9.1", - "globals": "^17.6.0", - "prettier": "^3.8.3", - "sass": "^1.99.0", - "typescript": "~5.9.3", - "typescript-eslint": "^8.59.3", - "unplugin-auto-import": "^21.0.0", - "unplugin-vue-components": "^32.0.0", - "vite": "^8.0.7", - "vue-tsc": "^3.2.5" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ctrl/tinycolor": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", - "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/@element-plus/icons-vue": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", - "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", - "license": "MIT", - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/@emnapi/core": { - "version": "1.9.2", - "resolved": "https://registry.npmmirror.com/@emnapi/core/-/core-1.9.2.tgz", - "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.9.2", - "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.9.2.tgz", - "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", - "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", - "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/js": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", - "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "eslint": "^10.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/@eslint/object-schema": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", - "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", - "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", - "license": "MIT" - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", - "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.123.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.123.0.tgz", - "integrity": "sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", - "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.6", - "@parcel/watcher-darwin-arm64": "2.5.6", - "@parcel/watcher-darwin-x64": "2.5.6", - "@parcel/watcher-freebsd-x64": "2.5.6", - "@parcel/watcher-linux-arm-glibc": "2.5.6", - "@parcel/watcher-linux-arm-musl": "2.5.6", - "@parcel/watcher-linux-arm64-glibc": "2.5.6", - "@parcel/watcher-linux-arm64-musl": "2.5.6", - "@parcel/watcher-linux-x64-glibc": "2.5.6", - "@parcel/watcher-linux-x64-musl": "2.5.6", - "@parcel/watcher-win32-arm64": "2.5.6", - "@parcel/watcher-win32-ia32": "2.5.6", - "@parcel/watcher-win32-x64": "2.5.6" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", - "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", - "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", - "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", - "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", - "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", - "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", - "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", - "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", - "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", - "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", - "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", - "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", - "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@popperjs/core": { - "name": "@sxzz/popperjs-es", - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz", - "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.13.tgz", - "integrity": "sha512-5ZiiecKH2DXAVJTNN13gNMUcCDg4Jy8ZjbXEsPnqa248wgOVeYRX0iqXXD5Jz4bI9BFHgKsI2qmyJynstbmr+g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.13.tgz", - "integrity": "sha512-tz/v/8G77seu8zAB3A5sK3UFoOl06zcshEzhUO62sAEtrEuW/H1CcyoupOrD+NbQJytYgA4CppXPzlrmp4JZKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.13.tgz", - "integrity": "sha512-8DakphqOz8JrMYWTJmWA+vDJxut6LijZ8Xcdc4flOlAhU7PNVwo2MaWBF9iXjJAPo5rC/IxEFZDhJ3GC7NHvug==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.13.tgz", - "integrity": "sha512-4wBQFfjDuXYN/SVI8inBF3Aa+isq40rc6VMFbk5jcpolUBTe5cYnMsHZ51nFWsx3PVyyNN3vgoESki0Hmr/4BA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.13.tgz", - "integrity": "sha512-JW/e4yPIXLms+jmnbwwy5LA/LxVwZUWLN8xug+V200wzaVi5TEGIWQlh8o91gWYFxW609euI98OCCemmWGuPrw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.13.tgz", - "integrity": "sha512-ZfKWpXiUymDnavepCaM6KG/uGydJ4l2nBmMxg60Ci4CbeefpqjPWpfaZM7PThOhk2dssqBAcwLc6rAyr0uTdXg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.13.tgz", - "integrity": "sha512-bmRg3O6Z0gq9yodKKWCIpnlH051sEfdVwt+6m5UDffAQMUUqU0xjnQqqAUm+Gu7ofAAly9DqiQDtKu2nPDEABA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.13.tgz", - "integrity": "sha512-8Wtnbw4k7pMYN9B/mOEAsQ8HOiq7AZ31Ig4M9BKn2So4xRaFEhtCSa4ZJaOutOWq50zpgR4N5+L/opnlaCx8wQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.13.tgz", - "integrity": "sha512-D/0Nlo8mQuxSMohNJUF2lDXWRsFDsHldfRRgD9bRgktj+EndGPj4DOV37LqDKPYS+osdyhZEH7fTakTAEcW7qg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.13.tgz", - "integrity": "sha512-eRrPvat2YaVQcwwKi/JzOP6MKf1WRnOCr+VaI3cTWz3ZoLcP/654z90lVCJ4dAuMEpPdke0n+qyAqXDZdIC4rA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.13.tgz", - "integrity": "sha512-PsdONiFRp8hR8KgVjTWjZ9s7uA3uueWL0t74/cKHfM4dR5zXYv4AjB8BvA+QDToqxAFg4ZkcVEqeu5F7inoz5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.13.tgz", - "integrity": "sha512-hCNXgC5dI3TVOLrPT++PKFNZ+1EtS0mLQwfXXXSUD/+rGlB65gZDwN/IDuxLpQP4x8RYYHqGomlUXzpO8aVI2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.13.tgz", - "integrity": "sha512-viLS5C5et8NFtLWw9Sw3M/w4vvnVkbWkO7wSNh3C+7G1+uCkGpr6PcjNDSFcNtmXY/4trjPBqUfcOL+P3sWy/g==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.9.1", - "@emnapi/runtime": "1.9.1", - "@napi-rs/wasm-runtime": "^1.1.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", - "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", - "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.13.tgz", - "integrity": "sha512-Fqa3Tlt1xL4wzmAYxGNFV36Hb+VfPc9PYU+E25DAnswXv3ODDu/yyWjQDbXMo5AGWkQVjLgQExuVu8I/UaZhPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.13.tgz", - "integrity": "sha512-/pLI5kPkGEi44TDlnbio3St/5gUFeN51YWNAk/Gnv6mEQBOahRBh52qVFVBpmrnU01n2yysvBML9Ynu7K4kGAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", - "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", - "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", - "license": "MIT" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", - "license": "MIT", - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/node": { - "version": "24.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", - "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/qrcode": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.6.tgz", - "integrity": "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", - "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/type-utils": "8.59.3", - "@typescript-eslint/utils": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.59.3", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", - "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", - "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.3", - "@typescript-eslint/types": "^8.59.3", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", - "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", - "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", - "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/utils": "8.59.3", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", - "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", - "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.59.3", - "@typescript-eslint/tsconfig-utils": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", - "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", - "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.3", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.5.tgz", - "integrity": "sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "1.0.0-rc.2" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@volar/language-core": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", - "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "2.4.28" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/typescript": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.28", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.32.tgz", - "integrity": "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/shared": "3.5.32", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz", - "integrity": "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==", - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.32", - "@vue/shared": "3.5.32" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz", - "integrity": "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/compiler-core": "3.5.32", - "@vue/compiler-dom": "3.5.32", - "@vue/compiler-ssr": "3.5.32", - "@vue/shared": "3.5.32", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.8", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz", - "integrity": "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.32", - "@vue/shared": "3.5.32" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", - "license": "MIT" - }, - "node_modules/@vue/language-core": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.6.tgz", - "integrity": "sha512-xYYYX3/aVup576tP/23sEUpgiEnujrENaoNRbaozC1/MA9I6EGFQRJb4xrt/MmUCAGlxTKL2RmT8JLTPqagCkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.28", - "@vue/compiler-dom": "^3.5.0", - "@vue/shared": "^3.5.0", - "alien-signals": "^3.0.0", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1", - "picomatch": "^4.0.2" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.32.tgz", - "integrity": "sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==", - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.32" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.32.tgz", - "integrity": "sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.32", - "@vue/shared": "3.5.32" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.32.tgz", - "integrity": "sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.32", - "@vue/runtime-core": "3.5.32", - "@vue/shared": "3.5.32", - "csstype": "^3.2.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.32.tgz", - "integrity": "sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.32", - "@vue/shared": "3.5.32" - }, - "peerDependencies": { - "vue": "3.5.32" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.32.tgz", - "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==", - "license": "MIT" - }, - "node_modules/@vue/tsconfig": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.9.1.tgz", - "integrity": "sha512-buvjm+9NzLCJL29KY1j1991YYJ5e6275OiK+G4jtmfIb+z4POywbdm0wXusT9adVWqe0xqg70TbI7+mRx4uU9w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": ">= 5.8", - "vue": "^3.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vue": { - "optional": true - } - } - }, - "node_modules/@vueuse/core": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.0.0.tgz", - "integrity": "sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==", - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "12.0.0", - "@vueuse/shared": "12.0.0", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/metadata": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.0.0.tgz", - "integrity": "sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.0.0.tgz", - "integrity": "sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==", - "license": "MIT", - "dependencies": { - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/alien-signals": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.2.tgz", - "integrity": "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", - "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "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", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/dayjs": { - "version": "1.11.20", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", - "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/dijkstrajs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", - "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", - "license": "MIT" - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/element-plus": { - "version": "2.13.6", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.13.6.tgz", - "integrity": "sha512-XHgwXr8Fjz6i+6BaqFhAbae/dJbG7bBAAlHrY3pWL7dpj+JcqcOyKYt4Oy5KP86FQwS1k4uIZDjCx2FyUR5lDg==", - "license": "MIT", - "dependencies": { - "@ctrl/tinycolor": "^4.2.0", - "@element-plus/icons-vue": "^2.3.2", - "@floating-ui/dom": "^1.0.1", - "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", - "@types/lodash": "^4.17.20", - "@types/lodash-es": "^4.17.12", - "@vueuse/core": "12.0.0", - "async-validator": "^4.2.5", - "dayjs": "^1.11.19", - "lodash": "^4.17.23", - "lodash-es": "^4.17.23", - "lodash-unified": "^1.0.3", - "memoize-one": "^6.0.0", - "normalize-wheel-es": "^1.2.0", - "vue-component-type-helpers": "^3.2.4" - }, - "peerDependencies": { - "vue": "^3.3.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz", - "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.5.5", - "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-vue": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.9.1.tgz", - "integrity": "sha512-cHB0Tf4Duvzwecwd/AqWzZvF/QszE13BhjVUpVXWCy9AeMR5GjkAjP3i85vqgLgOuTmkHR1OJ5oMeqLHtuw8zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^7.1.0", - "semver": "^7.6.3", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", - "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "vue-eslint-parser": "^10.3.0" - }, - "peerDependenciesMeta": { - "@stylistic/eslint-plugin": { - "optional": true - }, - "@typescript-eslint/parser": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", - "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", - "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", - "dev": true, - "license": "MIT" - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-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==", - "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", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/local-pkg": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", - "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", - "license": "MIT" - }, - "node_modules/lodash-unified": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", - "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", - "license": "MIT", - "peerDependencies": { - "@types/lodash-es": "*", - "lodash": "*", - "lodash-es": "*" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/normalize-wheel-es": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", - "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", - "license": "BSD-3-Clause" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", - "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qrcode": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", - "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", - "license": "MIT", - "dependencies": { - "dijkstrajs": "^1.0.1", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "license": "ISC" - }, - "node_modules/rolldown": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.13.tgz", - "integrity": "sha512-bvVj8YJmf0rq4pSFmH7laLa6pYrhghv3PRzrCdRAr23g66zOKVJ4wkvFtgohtPLWmthgg8/rkaqRHrpUEh0Zbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.123.0", - "@rolldown/pluginutils": "1.0.0-rc.13" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.13", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.13", - "@rolldown/binding-darwin-x64": "1.0.0-rc.13", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.13", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.13", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.13", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.13", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.13", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.13", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.13", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.13", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.13", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.13", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.13", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.13" - } - }, - "node_modules/rolldown/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.13.tgz", - "integrity": "sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==", - "dev": true, - "license": "MIT" - }, - "node_modules/sass": { - "version": "1.99.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", - "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/sass/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "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/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-literal": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", - "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", - "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.59.3", - "@typescript-eslint/parser": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/utils": "8.59.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, - "node_modules/unimport": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-5.7.0.tgz", - "integrity": "sha512-njnL6sp8lEA8QQbZrt+52p/g4X0rw3bnGGmUcJnt1jeG8+iiqO779aGz0PirCtydAIVcuTBRlJ52F0u46z309Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "local-pkg": "^1.1.2", - "magic-string": "^0.30.21", - "mlly": "^1.8.0", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "pkg-types": "^2.3.0", - "scule": "^1.3.0", - "strip-literal": "^3.1.0", - "tinyglobby": "^0.2.15", - "unplugin": "^2.3.11", - "unplugin-utils": "^0.3.1" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unimport/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/unplugin": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", - "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "acorn": "^8.15.0", - "picomatch": "^4.0.3", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unplugin-auto-import": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-21.0.0.tgz", - "integrity": "sha512-vWuC8SwqJmxZFYwPojhOhOXDb5xFhNNcEVb9K/RFkyk/3VnfaOjzitWN7v+8DEKpMjSsY2AEGXNgt6I0yQrhRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "local-pkg": "^1.1.2", - "magic-string": "^0.30.21", - "picomatch": "^4.0.3", - "unimport": "^5.6.0", - "unplugin": "^2.3.11", - "unplugin-utils": "^0.3.1" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@nuxt/kit": "^4.0.0", - "@vueuse/core": "*" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - }, - "@vueuse/core": { - "optional": true - } - } - }, - "node_modules/unplugin-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", - "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", - "dev": true, - "license": "MIT", - "dependencies": { - "pathe": "^2.0.3", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/unplugin-vue-components": { - "version": "32.0.0", - "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-32.0.0.tgz", - "integrity": "sha512-uLdccgS7mf3pv1bCCP20y/hm+u1eOjAmygVkh+Oa70MPkzgl1eQv1L0CwdHNM3gscO8/GDMGIET98Ja47CBbZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^5.0.0", - "local-pkg": "^1.1.2", - "magic-string": "^0.30.21", - "mlly": "^1.8.2", - "obug": "^2.1.1", - "picomatch": "^4.0.3", - "tinyglobby": "^0.2.15", - "unplugin": "^3.0.0", - "unplugin-utils": "^0.3.1" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@nuxt/kit": "^3.2.2 || ^4.0.0", - "vue": "^3.0.0" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - } - } - }, - "node_modules/unplugin-vue-components/node_modules/unplugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz", - "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "picomatch": "^4.0.3", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.7.tgz", - "integrity": "sha512-P1PbweD+2/udplnThz3btF4cf6AgPky7kk23RtHUkJIU5BIxwPprhRGmOAHs6FTI7UiGbTNrgNP6jSYD6JaRnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.13", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.32.tgz", - "integrity": "sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.32", - "@vue/compiler-sfc": "3.5.32", - "@vue/runtime-dom": "3.5.32", - "@vue/server-renderer": "3.5.32", - "@vue/shared": "3.5.32" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-component-type-helpers": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.2.6.tgz", - "integrity": "sha512-O02tnvIfOQVmnvoWwuSydwRoHjZVt8UEBR+2p4rT35p8GAy5VTlWP8o5qXfJR/GWCN0nVZoYWsVUvx2jwgdBmQ==", - "license": "MIT" - }, - "node_modules/vue-eslint-parser": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz", - "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.4.0", - "eslint-scope": "^8.2.0 || ^9.0.0", - "eslint-visitor-keys": "^4.2.0 || ^5.0.0", - "espree": "^10.3.0 || ^11.0.0", - "esquery": "^1.6.0", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/vue-router": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", - "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.6.4" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "node_modules/vue-tsc": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.2.6.tgz", - "integrity": "sha512-gYW/kWI0XrwGzd0PKc7tVB/qpdeAkIZLNZb10/InizkQjHjnT8weZ/vBarZoj4kHKbUTZT/bAVgoOr8x4NsQ/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/typescript": "2.4.28", - "@vue/language-core": "3.2.6" - }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" - }, - "peerDependencies": { - "typescript": ">=5.0.0" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "license": "ISC" - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/apps/frontend-vue/package.json b/apps/frontend-vue/package.json deleted file mode 100644 index ba58d4d3..00000000 --- a/apps/frontend-vue/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "order-site-rewrite", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vue-tsc -b && vite build", - "preview": "vite preview", - "typecheck": "vue-tsc --noEmit -p tsconfig.app.json", - "lint": "eslint .", - "format": "prettier --write .", - "format:check": "prettier --check ." - }, - "dependencies": { - "@types/qrcode": "^1.5.6", - "axios": "^1.9.0", - "element-plus": "^2.10.2", - "qrcode": "^1.5.4", - "vue": "^3.5.30", - "vue-router": "^4.5.1" - }, - "devDependencies": { - "@eslint/js": "^10.0.1", - "@types/node": "^24.12.0", - "@vitejs/plugin-vue": "^6.0.5", - "@vue/tsconfig": "^0.9.0", - "eslint": "^10.3.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-vue": "^10.9.1", - "globals": "^17.6.0", - "prettier": "^3.8.3", - "sass": "^1.99.0", - "typescript": "~5.9.3", - "typescript-eslint": "^8.59.3", - "unplugin-auto-import": "^21.0.0", - "unplugin-vue-components": "^32.0.0", - "vite": "^8.0.7", - "vue-tsc": "^3.2.5" - } -} diff --git a/apps/frontend-vue/public/favicon.svg b/apps/frontend-vue/public/favicon.svg deleted file mode 100644 index 6893eb13..00000000 --- a/apps/frontend-vue/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/frontend-vue/public/kuaishou-cloud-guide/1.png b/apps/frontend-vue/public/kuaishou-cloud-guide/1.png deleted file mode 100644 index 6fb49bd6..00000000 Binary files a/apps/frontend-vue/public/kuaishou-cloud-guide/1.png and /dev/null differ diff --git a/apps/frontend-vue/public/kuaishou-cloud-guide/2.png b/apps/frontend-vue/public/kuaishou-cloud-guide/2.png deleted file mode 100644 index 5c839ae7..00000000 Binary files a/apps/frontend-vue/public/kuaishou-cloud-guide/2.png and /dev/null differ diff --git a/apps/frontend-vue/public/kuaishou-cloud-guide/3.png b/apps/frontend-vue/public/kuaishou-cloud-guide/3.png deleted file mode 100644 index e01e0b80..00000000 Binary files a/apps/frontend-vue/public/kuaishou-cloud-guide/3.png and /dev/null differ diff --git a/apps/frontend-vue/public/kuaishou-cloud-guide/4.jpg b/apps/frontend-vue/public/kuaishou-cloud-guide/4.jpg deleted file mode 100644 index bcec284c..00000000 Binary files a/apps/frontend-vue/public/kuaishou-cloud-guide/4.jpg and /dev/null differ diff --git a/apps/frontend-vue/src/App.vue b/apps/frontend-vue/src/App.vue deleted file mode 100644 index 1210025e..00000000 --- a/apps/frontend-vue/src/App.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/apps/frontend-vue/src/auto-imports.d.ts b/apps/frontend-vue/src/auto-imports.d.ts deleted file mode 100644 index 72370df8..00000000 --- a/apps/frontend-vue/src/auto-imports.d.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* eslint-disable */ -/* prettier-ignore */ -// @ts-nocheck -// noinspection JSUnusedGlobalSymbols -// Generated by unplugin-auto-import -// biome-ignore lint: disable -export {} -declare global { - const EffectScope: typeof import('vue').EffectScope - const computed: typeof import('vue').computed - const createApp: typeof import('vue').createApp - const customRef: typeof import('vue').customRef - const defineAsyncComponent: typeof import('vue').defineAsyncComponent - const defineComponent: typeof import('vue').defineComponent - const effectScope: typeof import('vue').effectScope - const getCurrentInstance: typeof import('vue').getCurrentInstance - const getCurrentScope: typeof import('vue').getCurrentScope - const getCurrentWatcher: typeof import('vue').getCurrentWatcher - const h: typeof import('vue').h - const inject: typeof import('vue').inject - const isProxy: typeof import('vue').isProxy - const isReactive: typeof import('vue').isReactive - const isReadonly: typeof import('vue').isReadonly - const isRef: typeof import('vue').isRef - const isShallow: typeof import('vue').isShallow - const markRaw: typeof import('vue').markRaw - const nextTick: typeof import('vue').nextTick - const onActivated: typeof import('vue').onActivated - const onBeforeMount: typeof import('vue').onBeforeMount - const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave - const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate - const onBeforeUnmount: typeof import('vue').onBeforeUnmount - const onBeforeUpdate: typeof import('vue').onBeforeUpdate - const onDeactivated: typeof import('vue').onDeactivated - const onErrorCaptured: typeof import('vue').onErrorCaptured - const onMounted: typeof import('vue').onMounted - const onRenderTracked: typeof import('vue').onRenderTracked - const onRenderTriggered: typeof import('vue').onRenderTriggered - const onScopeDispose: typeof import('vue').onScopeDispose - const onServerPrefetch: typeof import('vue').onServerPrefetch - const onUnmounted: typeof import('vue').onUnmounted - const onUpdated: typeof import('vue').onUpdated - const onWatcherCleanup: typeof import('vue').onWatcherCleanup - const provide: typeof import('vue').provide - const reactive: typeof import('vue').reactive - const readonly: typeof import('vue').readonly - const ref: typeof import('vue').ref - const resolveComponent: typeof import('vue').resolveComponent - const shallowReactive: typeof import('vue').shallowReactive - const shallowReadonly: typeof import('vue').shallowReadonly - const shallowRef: typeof import('vue').shallowRef - const toRaw: typeof import('vue').toRaw - const toRef: typeof import('vue').toRef - const toRefs: typeof import('vue').toRefs - const toValue: typeof import('vue').toValue - const triggerRef: typeof import('vue').triggerRef - const unref: typeof import('vue').unref - const useAttrs: typeof import('vue').useAttrs - const useCssModule: typeof import('vue').useCssModule - const useCssVars: typeof import('vue').useCssVars - const useId: typeof import('vue').useId - const useLink: typeof import('vue-router').useLink - const useModel: typeof import('vue').useModel - const useRoute: typeof import('vue-router').useRoute - const useRouter: typeof import('vue-router').useRouter - const useSlots: typeof import('vue').useSlots - const useTemplateRef: typeof import('vue').useTemplateRef - const watch: typeof import('vue').watch - const watchEffect: typeof import('vue').watchEffect - const watchPostEffect: typeof import('vue').watchPostEffect - const watchSyncEffect: typeof import('vue').watchSyncEffect -} -// for type re-export -declare global { - // @ts-ignore - export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' - import('vue') -} diff --git a/apps/frontend-vue/src/components.d.ts b/apps/frontend-vue/src/components.d.ts deleted file mode 100644 index 86fba41d..00000000 --- a/apps/frontend-vue/src/components.d.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* eslint-disable */ -// @ts-nocheck -// biome-ignore lint: disable -// oxlint-disable -// ------ -// Generated by unplugin-vue-components -// Read more: https://github.com/vuejs/core/pull/3399 - -export {} - -/* prettier-ignore */ -declare module 'vue' { - export interface GlobalComponents { - AdminPageHeader: typeof import('./components/admin/AdminPageHeader.vue')['default'] - AdminResultCard: typeof import('./components/admin/AdminResultCard.vue')['default'] - AdminStatusTag: typeof import('./components/admin/AdminStatusTag.vue')['default'] - ElAlert: typeof import('element-plus/es')['ElAlert'] - ElButton: typeof import('element-plus/es')['ElButton'] - ElCard: typeof import('element-plus/es')['ElCard'] - ElCol: typeof import('element-plus/es')['ElCol'] - ElCollapse: typeof import('element-plus/es')['ElCollapse'] - ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem'] - ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] - ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] - ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'] - ElDialog: typeof import('element-plus/es')['ElDialog'] - ElDropdown: typeof import('element-plus/es')['ElDropdown'] - ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] - ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] - ElEmpty: typeof import('element-plus/es')['ElEmpty'] - ElForm: typeof import('element-plus/es')['ElForm'] - ElFormItem: typeof import('element-plus/es')['ElFormItem'] - ElIcon: typeof import('element-plus/es')['ElIcon'] - ElInput: typeof import('element-plus/es')['ElInput'] - ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] - ElLink: typeof import('element-plus/es')['ElLink'] - ElMenu: typeof import('element-plus/es')['ElMenu'] - ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] - ElOption: typeof import('element-plus/es')['ElOption'] - ElPagination: typeof import('element-plus/es')['ElPagination'] - ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] - ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] - ElResult: typeof import('element-plus/es')['ElResult'] - ElRow: typeof import('element-plus/es')['ElRow'] - ElSelect: typeof import('element-plus/es')['ElSelect'] - ElSkeleton: typeof import('element-plus/es')['ElSkeleton'] - ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] - ElSwitch: typeof import('element-plus/es')['ElSwitch'] - ElTable: typeof import('element-plus/es')['ElTable'] - ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] - ElTabPane: typeof import('element-plus/es')['ElTabPane'] - ElTabs: typeof import('element-plus/es')['ElTabs'] - ElTag: typeof import('element-plus/es')['ElTag'] - ElTooltip: typeof import('element-plus/es')['ElTooltip'] - RouterLink: typeof import('vue-router')['RouterLink'] - RouterView: typeof import('vue-router')['RouterView'] - } - export interface GlobalDirectives { - vLoading: typeof import('element-plus/es')['ElLoadingDirective'] - } -} diff --git a/apps/frontend-vue/src/components/admin/AdminPageHeader.vue b/apps/frontend-vue/src/components/admin/AdminPageHeader.vue deleted file mode 100644 index f79b1fcc..00000000 --- a/apps/frontend-vue/src/components/admin/AdminPageHeader.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/components/admin/AdminResultCard.vue b/apps/frontend-vue/src/components/admin/AdminResultCard.vue deleted file mode 100644 index eedd256e..00000000 --- a/apps/frontend-vue/src/components/admin/AdminResultCard.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/components/admin/AdminStatusTag.vue b/apps/frontend-vue/src/components/admin/AdminStatusTag.vue deleted file mode 100644 index 134fb47d..00000000 --- a/apps/frontend-vue/src/components/admin/AdminStatusTag.vue +++ /dev/null @@ -1,167 +0,0 @@ - - - diff --git a/apps/frontend-vue/src/composables/useAdminAction.ts b/apps/frontend-vue/src/composables/useAdminAction.ts deleted file mode 100644 index 2bcb9321..00000000 --- a/apps/frontend-vue/src/composables/useAdminAction.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ref } from 'vue' - -import { isFeedbackDismissed, showConfirm, showError, showSuccess } from '@/lib/feedback' - -export interface RunActionOptions { - id: number | string - action: () => Promise - successMessage: string - confirmText: string - onAfterAction?: () => Promise | void -} - -export function useAdminAction() { - const actionLoadingId = ref(null) - - async function runAction(options: RunActionOptions) { - try { - await showConfirm(options.confirmText, '确认操作', { - type: 'warning', - confirmButtonText: '继续执行', - cancelButtonText: '取消', - }) - } catch (error) { - if (isFeedbackDismissed(error)) return - throw error - } - - actionLoadingId.value = options.id - - try { - await options.action() - showSuccess(options.successMessage) - if (options.onAfterAction) await options.onAfterAction() - } catch (error) { - showError(error instanceof Error ? error.message : '操作失败') - } finally { - actionLoadingId.value = null - } - } - - return { actionLoadingId, runAction } -} diff --git a/apps/frontend-vue/src/composables/useAdminListPage.ts b/apps/frontend-vue/src/composables/useAdminListPage.ts deleted file mode 100644 index f9838368..00000000 --- a/apps/frontend-vue/src/composables/useAdminListPage.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { ref } from 'vue' - -import type { ApiEnvelope } from '@/lib/http' -import type { AdminPagination } from '@/types/admin' - -export interface AdminListPageData { - items: TItem[] - pagination: AdminPagination -} - -export interface UseAdminListPageOptions { - defaultErrorMessage: string - pageSize?: number - fetchPage: (page: number, pageSize: number) => Promise>> -} - -export function useAdminListPage(options: UseAdminListPageOptions) { - const loading = ref(true) - const errorMessage = ref('') - const items = ref([]) - const pagination = ref({ - page: 1, - pageSize: options.pageSize ?? 20, - total: 0, - }) - let latestRequestId = 0 - - async function loadPage(page = pagination.value.page) { - const requestId = ++latestRequestId - loading.value = true - errorMessage.value = '' - - try { - const response = await options.fetchPage(page, pagination.value.pageSize) - - if (requestId !== latestRequestId) { - return - } - - items.value = response.data.items - pagination.value = response.data.pagination - } catch (error) { - if (requestId !== latestRequestId) { - return - } - - errorMessage.value = error instanceof Error ? error.message : options.defaultErrorMessage - } finally { - if (requestId === latestRequestId) { - loading.value = false - } - } - } - - return { - loading, - errorMessage, - items, - pagination, - loadPage, - } -} diff --git a/apps/frontend-vue/src/composables/useAdminListQuerySync.ts b/apps/frontend-vue/src/composables/useAdminListQuerySync.ts deleted file mode 100644 index de0227f7..00000000 --- a/apps/frontend-vue/src/composables/useAdminListQuerySync.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { RouteLocationNormalizedLoaded, Router } from 'vue-router' - -export interface ListQueryFilters { - [key: string]: string | string[] | undefined -} - -export function useAdminListQuerySync(route: RouteLocationNormalizedLoaded, router: Router) { - function readQueryString(key: string): string { - const value = route.query[key] - const rawValue = Array.isArray(value) ? value[0] : value - return typeof rawValue === 'string' ? rawValue.trim() : '' - } - - function readQueryPage(): number { - const page = Number(readQueryString('page')) - return Number.isInteger(page) && page > 0 ? page : 1 - } - - async function syncRouteQuery(page: number, filters: ListQueryFilters = {}) { - const query: Record = {} - if (page > 1) { query.page = String(page) } - for (const [key, value] of Object.entries(filters)) { - const trimmed = (Array.isArray(value) ? value.join(',') : value)?.trim() - if (trimmed) { query[key] = trimmed } - } - await router.replace({ path: route.path, query }) - } - - return { readQueryString, readQueryPage, syncRouteQuery } -} diff --git a/apps/frontend-vue/src/domain/task-status.ts b/apps/frontend-vue/src/domain/task-status.ts deleted file mode 100644 index 796e27da..00000000 --- a/apps/frontend-vue/src/domain/task-status.ts +++ /dev/null @@ -1,59 +0,0 @@ -export const TASK_STATUS = { - PENDING_PAYMENT: "pending_payment", - PAID: "paid", - LINK_GENERATED: "link_generated", - CLAIMED: "claimed", - PENDING_BINDING_PREPARE: "pending_binding_prepare", - WAITING_BINDING: "waiting_binding", - ROLE_CONFIRMED: "role_confirmed", - REDEEMING: "redeeming", - DISPATCHED_PENDING_RETURN: "dispatched_pending_return", - COMPLETED: "completed", - REDEEMED: "redeemed", - RETRY_PENDING: "retry_pending", - MANUAL_REVIEW: "manual_review", - FAILED: "failed", - EXPIRED: "expired", - CLOSED: "closed", -} as const; - -export type KnownTaskStatus = (typeof TASK_STATUS)[keyof typeof TASK_STATUS]; -export type TaskStatus = KnownTaskStatus | (string & {}); - -const CLAIM_INACTIVE_STATUSES = new Set([ - TASK_STATUS.COMPLETED, - TASK_STATUS.REDEEMED, - TASK_STATUS.MANUAL_REVIEW, - TASK_STATUS.FAILED, - TASK_STATUS.EXPIRED, - TASK_STATUS.CLOSED, -]); - -const KUAISHOU_CLOUD_RESULT_STATUSES = new Set([ - TASK_STATUS.DISPATCHED_PENDING_RETURN, - TASK_STATUS.COMPLETED, - TASK_STATUS.REDEEMED, - TASK_STATUS.MANUAL_REVIEW, - TASK_STATUS.FAILED, -]); - -export function normalizeTaskStatus(value: unknown): TaskStatus { - return String(value || "").trim() as TaskStatus; -} - -export function isClaimInactiveTaskStatus(status: unknown): boolean { - return CLAIM_INACTIVE_STATUSES.has(normalizeTaskStatus(status)); -} - -export function isKuaishouCloudRoleConfirmedStatus(status: unknown): boolean { - return normalizeTaskStatus(status) === TASK_STATUS.ROLE_CONFIRMED; -} - -export function isKuaishouCloudCompletedStatus(status: unknown): boolean { - const normalized = normalizeTaskStatus(status); - return normalized === TASK_STATUS.COMPLETED || normalized === TASK_STATUS.REDEEMED; -} - -export function hasKuaishouCloudRedeemResultStatus(status: unknown): boolean { - return KUAISHOU_CLOUD_RESULT_STATUSES.has(normalizeTaskStatus(status)); -} diff --git a/apps/frontend-vue/src/lib/feedback.ts b/apps/frontend-vue/src/lib/feedback.ts deleted file mode 100644 index b19cf838..00000000 --- a/apps/frontend-vue/src/lib/feedback.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { ElMessage, ElMessageBox } from 'element-plus' -import type { ElMessageBoxOptions, MessageOptions } from 'element-plus' - -import 'element-plus/theme-chalk/el-message.css' -import 'element-plus/theme-chalk/el-overlay.css' -import 'element-plus/theme-chalk/el-message-box.css' - -const baseMessageOptions: Partial = { - grouping: true, -} - -const baseConfirmOptions: ElMessageBoxOptions = { - type: 'warning', - confirmButtonText: '继续执行', - cancelButtonText: '取消', - closeOnClickModal: false, - closeOnPressEscape: false, - autofocus: false, - distinguishCancelAndClose: true, -} - -const basePromptOptions: ElMessageBoxOptions = { - confirmButtonText: '提交', - cancelButtonText: '取消', - closeOnClickModal: false, - closeOnPressEscape: false, - autofocus: false, - distinguishCancelAndClose: true, -} - -export function showSuccess(message: string, options: Partial = {}) { - return ElMessage.success({ - ...baseMessageOptions, - ...options, - message, - }) -} - -export function showError(message: string, options: Partial = {}) { - return ElMessage.error({ - ...baseMessageOptions, - ...options, - message, - }) -} - -export function showConfirm( - message: string, - title = '确认操作', - options: ElMessageBoxOptions = {}, -) { - return ElMessageBox.confirm(message, title, { - ...baseConfirmOptions, - ...options, - }) -} - -export function showPrompt(message: string, title: string, options: ElMessageBoxOptions = {}) { - return ElMessageBox.prompt(message, title, { - ...basePromptOptions, - ...options, - }) -} - -export function isFeedbackDismissed(error: unknown) { - return error === 'cancel' || error === 'close' -} diff --git a/apps/frontend-vue/src/lib/http.ts b/apps/frontend-vue/src/lib/http.ts deleted file mode 100644 index dfb08252..00000000 --- a/apps/frontend-vue/src/lib/http.ts +++ /dev/null @@ -1,136 +0,0 @@ -import axios from 'axios' -import { clearAdminSession, getAdminToken } from '@/utils/admin-auth' - -export interface ApiEnvelope { - code: number - msg: string - data: T - errorCode?: string -} - -const http = axios.create({ - baseURL: '/', - timeout: 50_000, - headers: { - 'Content-Type': 'application/json', - }, -}) - -http.interceptors.response.use( - (response) => { - const data = response.data as ApiEnvelope - - // Business-level error: HTTP 200 but code !== 0 - if (typeof data?.code === 'number' && data.code !== 0) { - const error = new Error(data.msg || '操作失败') as Error & { - errorCode?: string - code?: number - } - error.errorCode = data.errorCode - error.code = data.code - return Promise.reject(error) - } - - return response.data - }, - (error) => { - const responseMessage = - typeof error?.response?.data?.msg === 'string' ? error.response.data.msg.trim() : '' - const fallbackMessage = resolveFallbackHttpMessage(error) - const normalizedError = new Error(responseMessage || fallbackMessage) as Error & { - errorCode?: string - status?: number - } - - if (error?.response?.data?.errorCode) { - normalizedError.errorCode = String(error.response.data.errorCode) - } - - if (typeof error?.response?.status === 'number') { - normalizedError.status = error.response.status - } - - if (error?.config?.url && String(error.config.url).startsWith('/api/v1/admin')) { - const status = Number(error?.response?.status || 0) - const errorCode = String(error?.response?.data?.errorCode || '').trim() - - if (status === 401 && shouldClearAdminSession(errorCode)) { - clearAdminSession() - - if ( - window.location.hash.startsWith('#/admin') && - !window.location.hash.startsWith('#/admin/login') - ) { - window.location.hash = '#/admin/login' - } - } - } - - return Promise.reject(normalizedError) - }, -) - -http.interceptors.request.use((config) => { - if (String(config.url || '').startsWith('/api/v1/admin')) { - const token = getAdminToken() - - if (token) { - config.headers.Authorization = `Bearer ${token}` - } - } - - return config -}) - -function resolveFallbackHttpMessage(error: unknown) { - const message = String((error as { message?: string })?.message ?? '') - - if (message.includes('timeout')) { - return '网络超时' - } - - if (message === 'Network Error') { - return '网络连接错误' - } - - if (typeof (error as { response?: { statusText?: string } })?.response?.statusText === 'string') { - return String((error as { response: { statusText: string } }).response.statusText).trim() - } - - return '接口请求失败' -} - -function shouldClearAdminSession(errorCode: string) { - return [ - 'admin_auth_required', - 'admin_auth_invalid', - 'admin_auth_expired', - 'admin_auth_user_invalid', - 'admin_auth_stale', - ].includes(errorCode) -} - -function request(config: Parameters>>[0]) { - return http.request, ApiEnvelope>(config) -} - -export function apiGet(url: string, params?: Record) { - return request({ method: 'GET', url, params }) -} - -export function apiGetBlob(url: string, params?: Record) { - return http.request({ - method: 'GET', - url, - params, - responseType: 'blob', - }) -} - -export function apiPost(url: string, data?: unknown) { - return request({ method: 'POST', url, data: data as Record }) -} - -export function apiDelete(url: string) { - return request({ method: 'DELETE', url }) -} diff --git a/apps/frontend-vue/src/main.ts b/apps/frontend-vue/src/main.ts deleted file mode 100644 index 28483c5f..00000000 --- a/apps/frontend-vue/src/main.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createApp } from 'vue' - -import App from './App.vue' -import router from './router' -import './styles/tokens.css' -import './styles/main.css' -import './styles/element-overrides.css' - -const app = createApp(App) - -app.use(router) - -app.mount('#app') diff --git a/apps/frontend-vue/src/router/index.ts b/apps/frontend-vue/src/router/index.ts deleted file mode 100644 index 09f9c0f9..00000000 --- a/apps/frontend-vue/src/router/index.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { createRouter, createWebHashHistory } from 'vue-router' -import { getAdminRole, hasAdminSession } from '@/utils/admin-auth' - -const router = createRouter({ - history: createWebHashHistory(), - routes: [ - { - path: '/', - redirect: '/admin/dashboard', - }, - { - path: '/claim/:token', - component: () => import('@/views/claim/ClaimView.vue'), - }, - { - path: '/admin', - redirect: '/admin/dashboard', - }, - { - path: '/admin/login', - component: () => import('@/views/admin/auth/AdminLoginView.vue'), - }, - { - path: '/admin', - component: () => import('@/views/admin/layout/AdminLayout.vue'), - children: [ - { - path: '', - redirect: '/admin/dashboard', - }, - { - path: 'dashboard', - component: () => import('@/views/admin/dashboard/AdminDashboardView.vue'), - }, - { - path: 'users', - meta: { allowedRoles: ['admin'] }, - component: () => import('@/views/admin/users/AdminUsersView.vue'), - }, - { - path: 'orders', - component: () => import('@/views/admin/orders/AdminOrdersView.vue'), - }, - { - path: 'orders/:orderId', - component: () => import('@/views/admin/orders/AdminOrderDetailView.vue'), - }, - { - path: 'tasks', - component: () => import('@/views/admin/tasks/AdminTasksView.vue'), - }, - { - path: 'tasks/:taskId', - component: () => import('@/views/admin/tasks/AdminTaskDetailView.vue'), - }, - { - path: 'cloudtentacles-records', - component: () => - import('@/views/admin/cloudtentacles-records/AdminCloudtentaclesRecordsView.vue'), - }, - { - path: 'platform-shops', - meta: { allowedRoles: ['admin'] }, - component: () => import('@/views/admin/platform-shops/AdminPlatformShopsView.vue'), - }, - { - path: 'platform-fulfillment', - meta: { allowedRoles: ['admin'] }, - component: () => import('@/views/admin/fulfillment/AdminFulfillmentConfigHubView.vue'), - }, - { - path: 'audit-logs', - meta: { allowedRoles: ['admin'] }, - component: () => import('@/views/admin/audit-logs/AdminAuditLogsView.vue'), - }, - ], - }, - { - path: '/:pathMatch(.*)*', - component: () => import('@/views/NotFoundView.vue'), - }, - ], -}) - -router.beforeEach((to) => { - if (!to.path.startsWith('/admin')) { - return true - } - - if (to.path === '/admin/login') { - if (hasAdminSession()) { - return '/admin/dashboard' - } - - return true - } - - if (!hasAdminSession()) { - return '/admin/login' - } - - const allowedRoles = to.matched - .map((record) => (record.meta?.allowedRoles as string[] | undefined) || []) - .find((roles) => Array.isArray(roles) && roles.length > 0) - - if (allowedRoles && !allowedRoles.includes(getAdminRole())) { - return '/admin/dashboard' - } - - return true -}) - -export default router diff --git a/apps/frontend-vue/src/services/admin/audit-logs.ts b/apps/frontend-vue/src/services/admin/audit-logs.ts deleted file mode 100644 index 66030ebe..00000000 --- a/apps/frontend-vue/src/services/admin/audit-logs.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { apiGet } from '@/lib/http' -import type { AdminAuditLogItem, AdminPagination } from '@/types/admin' - -export function fetchAdminAuditLogs(params?: Record) { - return apiGet<{ items: AdminAuditLogItem[]; pagination: AdminPagination }>( - '/api/v1/admin/audit-logs', - params, - ) -} diff --git a/apps/frontend-vue/src/services/admin/auth.ts b/apps/frontend-vue/src/services/admin/auth.ts deleted file mode 100644 index aab2ddd1..00000000 --- a/apps/frontend-vue/src/services/admin/auth.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { apiGet, apiPost } from '@/lib/http' -import type { AdminLoginResponse, AdminSessionSummary } from '@/types/admin' - -export function loginAdmin(payload: { username: string; password: string }) { - return apiPost('/api/v1/admin/auth/login', payload) -} - -export function fetchAdminSession() { - return apiGet('/api/v1/admin/auth/session') -} - -export function logoutAdmin() { - return apiPost<{ success: boolean }>('/api/v1/admin/auth/logout', {}) -} diff --git a/apps/frontend-vue/src/services/admin/dashboard.ts b/apps/frontend-vue/src/services/admin/dashboard.ts deleted file mode 100644 index 518d3902..00000000 --- a/apps/frontend-vue/src/services/admin/dashboard.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { apiGet } from '@/lib/http' -import type { AdminDashboardSummary } from '@/types/admin' - -export function fetchAdminDashboardSummary() { - return apiGet('/api/v1/admin/dashboard/summary') -} diff --git a/apps/frontend-vue/src/services/admin/index.ts b/apps/frontend-vue/src/services/admin/index.ts deleted file mode 100644 index 99c97f94..00000000 --- a/apps/frontend-vue/src/services/admin/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from './auth' -export * from './dashboard' -export * from './users' -export * from './audit-logs' -export * from './platform-config' -export * from './orders' -export * from './tasks' diff --git a/apps/frontend-vue/src/services/admin/orders.ts b/apps/frontend-vue/src/services/admin/orders.ts deleted file mode 100644 index 90fdc551..00000000 --- a/apps/frontend-vue/src/services/admin/orders.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { apiGet, apiPost } from '@/lib/http' -import type { AdminOrderDetail, AdminOrderListItem, AdminPagination } from '@/types/admin' - -export function fetchAdminOrders(params?: Record) { - return apiGet<{ items: AdminOrderListItem[]; pagination: AdminPagination }>( - '/api/v1/admin/orders', - params, - ) -} - -export function fetchAdminOrderDetail(orderId: number | string) { - return apiGet(`/api/v1/admin/orders/${orderId}`) -} - -export function resendAdminOrderKuaishouIndustryVoucherCode(orderId: number | string) { - return apiPost<{ - success: boolean - resentCount: number - failedCount: number - errorMessage: string - }>(`/api/v1/admin/orders/${orderId}/kuaishou-industry/resend-code`, {}) -} diff --git a/apps/frontend-vue/src/services/admin/platform-config/cloudtentacles.ts b/apps/frontend-vue/src/services/admin/platform-config/cloudtentacles.ts deleted file mode 100644 index 30e5890a..00000000 --- a/apps/frontend-vue/src/services/admin/platform-config/cloudtentacles.ts +++ /dev/null @@ -1,336 +0,0 @@ -import { apiDelete, apiGet, apiPost } from '@/lib/http' -import type { - AdminCloudtentaclesLoginTestResult, - AdminCloudtentaclesDeliveryRecordListResult, - AdminCloudtentaclesOverrideRuleConfig, - AdminCloudtentaclesSkuListResult, - AdminCloudtentaclesSendSmsResult, - AdminCloudtentaclesSourceConfigResponse, - AdminCloudtentaclesSourceItem, - AdminCloudtentaclesSourcesConfig, - AdminCloudtentaclesValidateSessionResult, -} from '@/types/admin' - -export function fetchAdminCloudtentaclesSourceConfig() { - return apiGet( - '/api/v1/admin/platform-config/cloudtentacles-source', - ) -} - -export function saveAdminCloudtentaclesSourceConfig( - payload: - | AdminCloudtentaclesSourcesConfig - | ({ sourceKey: string } & Partial), -) { - return apiPost( - '/api/v1/admin/platform-config/cloudtentacles-source', - payload, - ) -} - -export function deleteAdminCloudtentaclesSource(sourceKey: string) { - return apiDelete<{ success: boolean }>( - `/api/v1/admin/platform-config/cloudtentacles-source/${sourceKey}`, - ) -} - -export function fetchAdminCloudtentaclesOverrideRules() { - return apiGet( - '/api/v1/admin/platform-config/cloudtentacles/override-rules', - ) -} - -export function saveAdminCloudtentaclesOverrideRules( - payload: { - enabled: boolean - rules: Array<{ - id?: string - enabled?: boolean - productName?: string - sourceKey?: string - deliveryItems?: Array<{ - cloudSkuId?: number - cloudSkuName?: string - quantity?: number - }> - notes?: string - }> - }, -) { - return apiPost( - '/api/v1/admin/platform-config/cloudtentacles/override-rules', - payload, - ) -} - -export function sendAdminCloudtentaclesSmsCode(payload: { - baseUrl?: string - username?: string - phone?: string - deviceId?: string - deviceType?: number - sourceKey?: string -}) { - return apiPost( - '/api/v1/admin/platform-config/cloudtentacles/send-sms-code', - payload, - ) -} - -export function testAdminCloudtentaclesLogin(payload: { - baseUrl?: string - username?: string - password?: string - phone?: string - code?: string - deviceId?: string - deviceType?: number - sourceKey?: string -}) { - return apiPost( - '/api/v1/admin/platform-config/cloudtentacles/test-login', - payload, - ) -} - -export function validateAdminCloudtentaclesSession(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - sourceKey?: string -}) { - return apiPost( - '/api/v1/admin/platform-config/cloudtentacles/validate-session', - payload, - ) -} - -export function fetchAdminCloudtentaclesAsset(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/asset', - payload, - ) -} - -export function fetchAdminCloudtentaclesCategories(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/categories', - payload, - ) -} - -export function fetchAdminCloudtentaclesSkuList(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - sourceKey?: string -}) { - return apiPost( - '/api/v1/admin/platform-config/cloudtentacles/sku/list', - payload, - ) -} - -export function buyAdminCloudtentaclesSku(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - id?: number - count?: number - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/sku/buy', - payload, - ) -} - -export function useAdminCloudtentaclesSku(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - id?: number - virtualNumberId?: number - phone?: string - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/sku/use', - payload, - ) -} - -export function fetchAdminCloudtentaclesKnapsack(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/knapsack', - payload, - ) -} - -export function fetchAdminCloudtentaclesDeliveryRecords(payload: { - sourceKey?: string - page?: number - size?: number - startDate?: string - endDate?: string - platformOrderId?: string -}) { - return apiPost( - '/api/v1/admin/cloudtentacles-records', - payload, - ) -} - -export function fetchAdminCloudtentaclesRecordSources() { - return apiGet<{ - sources: Array<{ - key: string - label: string - enabled: boolean - hasToken: boolean - loggedInAt: string - }> - }>('/api/v1/admin/cloudtentacles-records/sources') -} - -export function fetchAdminCloudtentaclesVnList(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - key?: string - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/vn/list', - payload, - ) -} - -export function appointAdminCloudtentaclesVn(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - key?: string - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/vn/appoint', - payload, - ) -} - -export function generateAdminCloudtentaclesVnLoginCode(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - key?: string - id?: number - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/vn/generate-login-code', - payload, - ) -} - -export function fetchAdminCloudtentaclesVnCode(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - key?: string - phone?: string - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/vn/fetch-code', - payload, - ) -} - -export function verifyAdminCloudtentaclesVnCode(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - key?: string - id?: number - code?: string - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/vn/verify-code', - payload, - ) -} - -export function fetchAdminCloudtentaclesBindUrl(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - key?: string - id?: number - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/vn/bind-url', - payload, - ) -} - -export function backAdminCloudtentaclesVn(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - key?: string - id?: number - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/vn/back', - payload, - ) -} - -export function runAdminCloudtentaclesFullFlow(payload: { - baseUrl?: string - token?: string - deviceId?: string - deviceType?: number - skuId?: number - skuCount?: number - vnKey?: string - sourceKey?: string -}) { - return apiPost>( - '/api/v1/admin/platform-config/cloudtentacles/debug/full-flow', - payload, - ) -} diff --git a/apps/frontend-vue/src/services/admin/platform-config/index.ts b/apps/frontend-vue/src/services/admin/platform-config/index.ts deleted file mode 100644 index 9f73f850..00000000 --- a/apps/frontend-vue/src/services/admin/platform-config/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './notifications' -export * from './scheduled-jobs' -export * from './ninetyone' -export * from './kuaishou-eticket' -export * from './kuaishou-feifei' -export * from './cloudtentacles' diff --git a/apps/frontend-vue/src/services/admin/platform-config/kuaishou-eticket.ts b/apps/frontend-vue/src/services/admin/platform-config/kuaishou-eticket.ts deleted file mode 100644 index cd324b2e..00000000 --- a/apps/frontend-vue/src/services/admin/platform-config/kuaishou-eticket.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { apiGet, apiPost } from '@/lib/http' -import type { - AdminKuaishouEticketConsumeResult, - AdminKuaishouEticketDetailResult, - AdminKuaishouEticketShopInfoResult, - AdminKuaishouEticketSourceConfig, -} from '@/types/admin' - -export function fetchAdminKuaishouEticketSourceConfig() { - return apiGet<{ - filePath: string - source: AdminKuaishouEticketSourceConfig - }>('/api/v1/admin/platform-config/kuaishou-eticket-source') -} - -export function saveAdminKuaishouEticketSourceConfig(payload: AdminKuaishouEticketSourceConfig) { - return apiPost<{ - filePath: string - source: AdminKuaishouEticketSourceConfig - }>('/api/v1/admin/platform-config/kuaishou-eticket-source', payload) -} - -export function queryAdminKuaishouEticketDetail(payload: { - baseUrl?: string - shopId?: string - cookie?: string - eTicketId: string -}) { - return apiPost( - '/api/v1/admin/platform-config/kuaishou-eticket/query-detail', - payload, - ) -} - -export function queryAdminKuaishouEticketShopInfo(payload: { - baseUrl?: string - shopId?: string - cookie?: string -}) { - return apiPost( - '/api/v1/admin/platform-config/kuaishou-eticket/query-shop-info', - payload, - ) -} - -export function consumeAdminKuaishouEticket(payload: { - baseUrl?: string - shopId?: string - cookie?: string - eTicketId: string - oid?: string - formToken?: string - num?: number - storeId?: string -}) { - return apiPost( - '/api/v1/admin/platform-config/kuaishou-eticket/consume', - payload, - ) -} diff --git a/apps/frontend-vue/src/services/admin/platform-config/kuaishou-feifei.ts b/apps/frontend-vue/src/services/admin/platform-config/kuaishou-feifei.ts deleted file mode 100644 index b5324f95..00000000 --- a/apps/frontend-vue/src/services/admin/platform-config/kuaishou-feifei.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { apiGet, apiPost } from '@/lib/http' -import type { - AdminKuaishouFeifeiConfig, - AdminKuaishouFeifeiConfigResponse, - AdminKuaishouFeifeiMatchResult, - AdminKuaishouFeifeiOrderResult, - AdminKuaishouFeifeiProductListResult, - AdminKuaishouFeifeiProductSyncResult, -} from '@/types/admin' - -export function fetchAdminKuaishouFeifeiConfig() { - return apiGet( - '/api/v1/admin/platform-config/kuaishou-feifei', - ) -} - -export function saveAdminKuaishouFeifeiConfig(payload: AdminKuaishouFeifeiConfig) { - return apiPost( - '/api/v1/admin/platform-config/kuaishou-feifei', - payload, - ) -} - -export function matchAdminKuaishouFeifeiProduct(productName: string) { - return apiPost( - '/api/v1/admin/platform-config/kuaishou-feifei/match', - { productName }, - ) -} - -export function fetchAdminKuaishouFeifeiProducts(payload: { - page?: number - perPage?: number - status?: string - supplyProductName?: string -}) { - return apiPost( - '/api/v1/admin/platform-config/kuaishou-feifei/products', - payload, - ) -} - -export function syncAdminKuaishouFeifeiProducts(payload: { - status?: string - supplyProductName?: string -} = {}) { - return apiPost( - '/api/v1/admin/platform-config/kuaishou-feifei/sync-products', - payload, - ) -} - -export function createAdminKuaishouFeifeiTestOrder(payload: { - platformOrderNo: string - productCode: string - platformBuyNum?: number - platformAmount?: number | null - playerAccount?: string - playerGameRegion?: string - playerGameSrv?: string - playerGameRole?: string - submitPlayer?: boolean - notifyUrl?: string -}) { - return apiPost( - '/api/v1/admin/platform-config/kuaishou-feifei/test-order', - payload, - ) -} - -export function queryAdminKuaishouFeifeiOrder(payload: { - platformOrderNo?: string - orderNo?: string -}) { - return apiPost( - '/api/v1/admin/platform-config/kuaishou-feifei/query-order', - payload, - ) -} diff --git a/apps/frontend-vue/src/services/admin/platform-config/ninetyone.ts b/apps/frontend-vue/src/services/admin/platform-config/ninetyone.ts deleted file mode 100644 index c5ef2aeb..00000000 --- a/apps/frontend-vue/src/services/admin/platform-config/ninetyone.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { apiGet, apiPost } from '@/lib/http' -import type { - AdminNinetyoneOrderActionResult, - AdminNinetyoneOrderListResult, -} from '@/types/admin' - -export function fetchAdminNinetyoneOrders( - params: { - page?: number - pageSize?: number - status?: string - } = {}, -) { - const searchParams = new URLSearchParams() - if (params.page) { - searchParams.set('page', String(params.page)) - } - if (params.pageSize) { - searchParams.set('pageSize', String(params.pageSize)) - } - if (params.status) { - searchParams.set('status', params.status) - } - const queryString = searchParams.toString() - return apiGet( - `/api/v1/admin/platform-config/ninetyone/orders${queryString ? `?${queryString}` : ''}`, - ) -} - -export function retryAdminNinetyoneOrder(orderId: number | string) { - return apiPost( - `/api/v1/admin/platform-config/ninetyone/orders/${orderId}/retry`, - {}, - ) -} - -export function failAdminNinetyoneOrder(orderId: number | string, payload: { reason?: string }) { - return apiPost( - `/api/v1/admin/platform-config/ninetyone/orders/${orderId}/fail`, - payload, - ) -} diff --git a/apps/frontend-vue/src/services/admin/platform-config/notifications.ts b/apps/frontend-vue/src/services/admin/platform-config/notifications.ts deleted file mode 100644 index f5056037..00000000 --- a/apps/frontend-vue/src/services/admin/platform-config/notifications.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { apiGet, apiPost } from '@/lib/http' -import type { AdminNotificationConfig, AdminNotificationTestResult } from '@/types/admin' - -export function fetchAdminNotificationConfig() { - return apiGet<{ - filePath: string - source: AdminNotificationConfig - }>('/api/v1/admin/platform-config/notifications') -} - -export function saveAdminNotificationConfig(payload: AdminNotificationConfig) { - return apiPost<{ - filePath: string - source: AdminNotificationConfig - }>('/api/v1/admin/platform-config/notifications', payload) -} - -export function testAdminNotification(payload: { title?: string; body?: string; url?: string }) { - return apiPost( - '/api/v1/admin/platform-config/notifications/test', - payload, - ) -} diff --git a/apps/frontend-vue/src/services/admin/platform-config/scheduled-jobs.ts b/apps/frontend-vue/src/services/admin/platform-config/scheduled-jobs.ts deleted file mode 100644 index 55089011..00000000 --- a/apps/frontend-vue/src/services/admin/platform-config/scheduled-jobs.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { apiGet, apiPost } from '@/lib/http' -import type { AdminScheduledJobsConfig, AdminScheduledJobsResponse } from '@/types/admin' - -export function fetchAdminScheduledJobsConfig() { - return apiGet('/api/v1/admin/platform-config/scheduled-jobs') -} - -export function saveAdminScheduledJobsConfig(payload: AdminScheduledJobsConfig) { - return apiPost( - '/api/v1/admin/platform-config/scheduled-jobs', - payload, - ) -} - -export function runAdminScheduledJob(jobId: string) { - return apiPost<{ - result: Record - runtime: AdminScheduledJobsResponse['runtime'] - }>(`/api/v1/admin/platform-config/scheduled-jobs/${jobId}/run`, {}) -} diff --git a/apps/frontend-vue/src/services/admin/tasks.ts b/apps/frontend-vue/src/services/admin/tasks.ts deleted file mode 100644 index eb643e0d..00000000 --- a/apps/frontend-vue/src/services/admin/tasks.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { apiGet, apiGetBlob, apiPost } from '@/lib/http' -import type { - AdminPagination, - AdminTaskActionResponse, - AdminTaskDetail, - AdminTaskListItem, -} from '@/types/admin' - -export function fetchAdminTasks(params?: Record) { - return apiGet<{ items: AdminTaskListItem[]; pagination: AdminPagination }>( - '/api/v1/admin/tasks', - params, - ) -} - -export function fetchAdminTaskDetail(taskId: number | string) { - return apiGet(`/api/v1/admin/tasks/${taskId}`) -} - -export function fetchAdminTaskScreenshot(taskId: number | string) { - return apiGetBlob(`/api/v1/admin/tasks/${taskId}/screenshot`) -} - -export function retryAdminTask(taskId: number | string) { - return apiPost(`/api/v1/admin/tasks/${taskId}/retry`, {}) -} - -export function regenerateAdminTaskClaimLink(taskId: number | string) { - return apiPost(`/api/v1/admin/tasks/${taskId}/regenerate-claim-link`, {}) -} - -export function closeAdminTask(taskId: number | string) { - return apiPost(`/api/v1/admin/tasks/${taskId}/close`, {}) -} - -export function markAdminTaskManualReview(taskId: number | string) { - return apiPost(`/api/v1/admin/tasks/${taskId}/mark-manual-review`, {}) -} - -export function completeAdminTaskManualDispatch( - taskId: number | string, - payload: { - outcome: 'delivered' | 'failed' - resultMessage?: string - deliveryReference?: string - deliveredCredential?: string - }, -) { - return apiPost( - `/api/v1/admin/tasks/${taskId}/complete-manual-dispatch`, - payload, - ) -} - -export function prepareAdminTaskKuaishouCloudFulfillment(taskId: number | string) { - return apiPost( - `/api/v1/admin/tasks/${taskId}/kuaishou-cloud/prepare`, - {}, - ) -} - -export function refreshAdminTaskKuaishouCloudRoleInfo(taskId: number | string) { - return apiPost( - `/api/v1/admin/tasks/${taskId}/kuaishou-cloud/refresh-role-info`, - {}, - ) -} - -export function rebindAdminTaskKuaishouCloudRole(taskId: number | string) { - return apiPost( - `/api/v1/admin/tasks/${taskId}/kuaishou-cloud/rebind-role`, - {}, - ) -} - -export function dispatchAdminTaskKuaishouCloudFulfillment( - taskId: number | string, - payload: { - ticketCode?: string - } = {}, -) { - return apiPost( - `/api/v1/admin/tasks/${taskId}/kuaishou-cloud/dispatch`, - payload, - ) -} - -export function returnNumberAdminTaskKuaishouCloudFulfillment(taskId: number | string) { - return apiPost( - `/api/v1/admin/tasks/${taskId}/kuaishou-cloud/return-number`, - {}, - ) -} - -export function resendAdminTaskKuaishouIndustryVoucherCode(taskId: number | string) { - return apiPost( - `/api/v1/admin/tasks/${taskId}/kuaishou-industry/resend-code`, - {}, - ) -} - -export function consumeAdminTaskKuaishouIndustryVoucher( - taskId: number | string, - payload: { - consumeType?: string - storeName?: string - storeAddress?: string - expressCode?: string - expressNo?: string - } = {}, -) { - return apiPost( - `/api/v1/admin/tasks/${taskId}/kuaishou-industry/consume`, - payload, - ) -} diff --git a/apps/frontend-vue/src/services/admin/users.ts b/apps/frontend-vue/src/services/admin/users.ts deleted file mode 100644 index 039a1ddb..00000000 --- a/apps/frontend-vue/src/services/admin/users.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { apiGet, apiPost } from '@/lib/http' -import type { AdminPagination, AdminUserListItem } from '@/types/admin' - -export function fetchAdminUsers(params?: Record) { - return apiGet<{ items: AdminUserListItem[]; pagination: AdminPagination }>( - '/api/v1/admin/users', - params, - ) -} - -export function createAdminUser(payload: { - username: string - password: string - role: string - status?: string -}) { - return apiPost<{ user: AdminUserListItem }>('/api/v1/admin/users', payload) -} - -export function updateAdminUserRole(userId: number | string, payload: { role: string }) { - return apiPost<{ user: AdminUserListItem }>(`/api/v1/admin/users/${userId}/role`, payload) -} - -export function updateAdminUserStatus(userId: number | string, payload: { status: string }) { - return apiPost<{ user: AdminUserListItem }>(`/api/v1/admin/users/${userId}/status`, payload) -} - -export function resetAdminUserPassword(userId: number | string, payload: { password: string }) { - return apiPost<{ user: AdminUserListItem }>( - `/api/v1/admin/users/${userId}/reset-password`, - payload, - ) -} diff --git a/apps/frontend-vue/src/services/claim.ts b/apps/frontend-vue/src/services/claim.ts deleted file mode 100644 index e5b508c2..00000000 --- a/apps/frontend-vue/src/services/claim.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { apiGet, apiPost } from '@/lib/http' -import type { ClaimDetailData } from '@/types/claim' - -export function fetchClaimDetail(token: string) { - return apiGet(`/api/v1/claim/${token}`) -} - -export function verifyKuaishouCloudClaimTicket( - token: string, - payload: { - ticketCode: string - }, -) { - return apiPost(`/api/v1/claim/${token}/kuaishou-cloud/verify-ticket`, payload) -} - -export function confirmKuaishouCloudClaimRole(token: string) { - return apiPost(`/api/v1/claim/${token}/kuaishou-cloud/confirm-role`, {}) -} - -export function rebindKuaishouCloudClaimRole(token: string) { - return apiPost(`/api/v1/claim/${token}/kuaishou-cloud/rebind-role`, {}) -} - -export function redeemKuaishouCloudClaim(token: string) { - return apiPost(`/api/v1/claim/${token}/kuaishou-cloud/redeem`, {}) -} diff --git a/apps/frontend-vue/src/styles/admin-config-pages.css b/apps/frontend-vue/src/styles/admin-config-pages.css deleted file mode 100644 index 80a06eca..00000000 --- a/apps/frontend-vue/src/styles/admin-config-pages.css +++ /dev/null @@ -1,238 +0,0 @@ -/* ============================================================ - 管理员配置页面共享结构样式 - 引入: AdminKuaishouCloudFulfillment.css - 各页面自行覆盖颜色、圆角、主题属性 - ============================================================ */ - -/* ---------- 分区标题 ---------- */ -.section-title-row { - display: flex; - justify-content: space-between; - gap: 16px; - align-items: flex-start; -} - -.section-title-row h3 { - margin: 0; -} - -.section-title-row p { - margin: 6px 0 0; -} - -/* ---------- 头部工具 ---------- */ -.section-header-tools, -.section-mini-stats, -.section-action-group { - display: flex; - flex-wrap: wrap; - gap: 8px; - align-items: center; -} - -.section-header-tools { - justify-content: flex-end; -} - -/* ---------- 卡片容器 ---------- */ -.overview-card, -.table-card, -.empty-block, -.error-copy { - padding: 16px; - background: rgba(255, 255, 255, 0.94); - border: 1px solid rgba(86, 108, 138, 0.1); -} - -.table-card--dense { - padding: 14px 16px 16px; -} - -.overview-card { - display: grid; - gap: 12px; -} - -/* ---------- 概览文件 & 统计 ---------- */ -.overview-file { - display: grid; - gap: 6px; -} - -.overview-file code { - display: inline-flex; - width: 100%; - max-width: 100%; - padding: 8px 12px; - border-radius: 14px; - word-break: break-all; -} - -.overview-stats { - display: grid; - grid-template-columns: repeat(5, minmax(0, 1fr)); - gap: 10px; -} - -.overview-stat { - display: grid; - gap: 4px; - padding: 12px 14px; - background: #f8fafc; - border: 1px solid rgba(148, 163, 184, 0.14); -} - -.overview-stat span { - font-size: var(--text-xs); - font-weight: 700; -} - -.overview-stat strong { - line-height: 1.1; -} - -.overview-notes { - display: flex; - flex-wrap: wrap; - gap: 8px; -} - -/* ---------- 分区工具 ---------- */ -.section-title-row--tight { - align-items: center; -} - -/* ---------- 字段块 ---------- */ -.field-block { - min-width: 0; - display: grid; - gap: 6px; -} - -.field-block span { - font-size: var(--text-xs); - font-weight: 700; -} - -.field-block--action { - align-content: end; -} - -.field-block--action :deep(.el-button) { - width: 100%; -} - -.field-help { - font-size: var(--text-xs); - line-height: 1.5; -} - -/* ---------- 文本输入 ---------- */ -.text-input { - width: 100%; - border-radius: 14px; -} - -/* ---------- 校验 & 错误 ---------- */ -.validation-banner, -.binding-inline-error { - margin: 10px 0 0; - padding: 10px 12px; - border-radius: 14px; - font-weight: 600; -} - -.binding-inline-error { - font-size: var(--text-sm); -} - -/* ---------- 数据表 (用于 el-table,具体单元格样式见各页面 :deep() 规则) ---------- */ -.data-table--config { - width: 100%; - margin-top: 12px; -} - -.cell-stack--config { - display: grid; - gap: 4px; -} - -.cell-subtle { - font-size: var(--text-xs); -} - -/* ---------- 绑定卡片 ---------- */ -.binding-card { - margin-top: 12px; - padding: 14px; - background: #f8fafc; - border: 1px solid rgba(148, 163, 184, 0.18); -} - -.binding-card--invalid { - border-color: rgba(220, 38, 38, 0.3); - box-shadow: 0 0 0 4px rgba(254, 226, 226, 0.85); -} - -.binding-header { - display: flex; - justify-content: space-between; - gap: 12px; - align-items: flex-start; - margin-bottom: 10px; -} - -.binding-summary { - display: grid; - gap: 4px; -} - -.binding-title-row { - display: flex; - gap: 10px; - align-items: center; - flex-wrap: wrap; -} - -.binding-subtle { - font-size: var(--text-sm); -} - -/* ---------- 状态标签 ---------- */ -.binding-status-chip { - display: inline-flex; - align-items: center; - border-radius: var(--radius-full); - padding: 2px 10px; - background: #fff1f2; - color: #be123c; - font-size: var(--text-xs); - font-weight: 700; -} - -.binding-status-chip--done { - background: #ecfdf3; - color: #027a48; -} - -.binding-collapsed-preview { - display: grid; - gap: 6px; -} - -/* ---------- 操作栏 ---------- */ -.binding-actions { - display: flex; - justify-content: space-between; - gap: 12px; - align-items: center; -} - -/* ---------- 工具栏提示 ---------- */ -.toolbar-hint { - margin: 10px 0 0; - font-size: var(--text-xs); -} -.mt-4 { - margin-top: 16px; -} diff --git a/apps/frontend-vue/src/styles/admin-list-pages.css b/apps/frontend-vue/src/styles/admin-list-pages.css deleted file mode 100644 index fda6e0d9..00000000 --- a/apps/frontend-vue/src/styles/admin-list-pages.css +++ /dev/null @@ -1,302 +0,0 @@ -/* ============================================================ - 管理员列表页共享样式 - 引入: AdminOrdersView, AdminTasksView, AdminUsersView - 各页面自行覆盖 grid-template-columns 等布局差异 - ============================================================ */ - -/* ---------- 页面包裹 ---------- */ -.list-page { - display: grid; - gap: 0; -} - -/* ---------- 总量标签 ---------- */ -.total-badge { - display: inline-flex; - align-items: center; - min-height: 32px; - padding: 0 12px; - border: 1px solid rgba(37, 89, 167, 0.14); - border-radius: var(--radius-full); - background: rgba(37, 89, 167, 0.08); - color: #2559a7; - font-size: var(--text-xs); - font-weight: 700; -} - -/* ---------- 卡片区域 ---------- */ -.section-card { - margin-top: var(--space-4); -} - -/* ---------- 筛选网格 ---------- */ -.filter-grid { - display: grid; - gap: var(--space-3); - align-items: center; -} - -.filter-control { - width: 100%; - min-width: 0; -} - -.filter-buttons { - display: flex; - gap: 10px; - min-width: 156px; - justify-content: flex-end; -} - -/* ---------- 摘要条 ---------- */ -.summary-strip { - display: flex; - align-items: center; - gap: var(--space-2); - min-height: 38px; - padding: 0; - margin-top: var(--space-4); - flex-wrap: wrap; -} - -.summary-title { - color: var(--text-secondary); - font-size: var(--text-xs); - font-weight: 700; - margin-right: 2px; -} - -.summary-metric { - display: inline-flex; - align-items: center; - gap: 5px; - min-height: 28px; - padding: 0 10px; - border-radius: var(--radius-full); - border: 1px solid transparent; - color: var(--text-secondary); - background: #f8fafc; - font-size: var(--text-xs); - font-weight: 700; -} - -.summary-metric strong { - color: var(--text-primary); - font-size: var(--text-base); - line-height: 1; -} - -.summary-metric[data-tone='success'] { - color: var(--color-success-dark); - background: var(--color-success-light); - border-color: #bbf7d0; -} -.summary-metric[data-tone='danger'] { - color: var(--color-danger-dark); - background: var(--color-danger-light); - border-color: #fecaca; -} -.summary-metric[data-tone='primary'] { - color: var(--color-primary-dark); - background: var(--color-primary-light); - border-color: #bfdbfe; -} -.summary-metric[data-tone='warning'] { - color: var(--color-warning-dark); - background: var(--color-warning-light); - border-color: #fed7aa; -} -.summary-metric[data-tone='muted'] { - color: var(--text-secondary); - background: #f8fafc; - border-color: var(--border-default); -} - -/* ---------- 表格工具栏 ---------- */ -.table-toolbar { - margin-bottom: var(--space-3); -} - -.table-toolbar strong { - display: block; - color: var(--text-primary); - font-size: var(--text-base); -} - -.table-toolbar span { - display: block; - margin-top: 4px; - color: var(--text-secondary); - font-size: var(--text-xs); -} - -/* ---------- el-table 统一主题变量 ---------- */ -.data-table { - width: 100%; - overflow: hidden; - border: 1px solid var(--border-default); - border-radius: var(--radius-sm); - --el-table-bg-color: transparent; - --el-table-tr-bg-color: transparent; - --el-table-header-bg-color: rgba(239, 246, 255, 0.72); - --el-table-row-hover-bg-color: rgba(239, 246, 255, 0.72); - --el-table-border-color: rgba(86, 108, 138, 0.1); -} - -.data-table :deep(.el-table__inner-wrapper::before) { - display: none; -} - -.data-table :deep(th.el-table__cell) { - height: 42px; - background: var(--el-table-header-bg-color); - color: var(--text-secondary); - font-weight: 700; -} - -/* ---------- 单元格通用 ---------- */ -.cell-stack { - display: grid; - gap: 5px; -} - -.cell-meta-row { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); -} - -.compact-chip { - display: inline-flex; - align-items: center; - min-height: 24px; - max-width: 240px; - padding: 0 9px; - border-radius: var(--radius-full); - background: #f4f7fb; - border: 1px solid var(--border-default); - color: var(--text-secondary); - font-size: var(--text-xs); - font-weight: 600; -} - -.compact-chip--muted { - color: var(--text-muted); -} - -.cell-title { - display: block; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: var(--text-primary); - font-weight: 700; -} - -.cell-subline { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: #475467; - font-size: var(--text-xs); -} - -/* ---------- ID 链接 ---------- */ -.id-link { - display: inline-block; - max-width: 100%; - font-size: var(--text-base); - font-weight: 800; - color: var(--text-primary); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - text-decoration: none; -} - -.id-link:hover { - color: var(--color-primary-dark); -} - -/* ---------- 详情链接按钮 ---------- */ -.detail-link { - display: inline-flex; - align-items: center; - min-height: 28px; - padding: 0 10px; - border-radius: var(--radius-full); - border: 1px solid var(--border-default); - color: var(--color-primary-dark); - background: var(--color-primary-light); - font-size: var(--text-xs); - font-weight: 700; - text-decoration: none; -} - -.detail-link:hover { - border-color: var(--border-hover); - background: #dbeafe; -} - -/* ---------- 操作 & 状态容器 ---------- */ -.action-stack { - display: flex; - flex-wrap: wrap; - gap: 6px; - align-items: center; -} -.action-stack--nowrap { - flex-wrap: nowrap; - white-space: nowrap; -} -.action-stack--vertical { - flex-direction: column; - align-items: center; -} -.action-stack--tight { - gap: var(--space-2); -} - -.status-stack { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - align-items: center; -} - -.status-stack :deep(.el-tag) { - max-width: 100%; -} - -/* ---------- 响应式 ---------- */ -@media (max-width: 1200px) { - .filter-grid { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } -} - -@media (max-width: 900px) { - .filter-grid { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - .filter-buttons { - justify-content: flex-start; - } -} - -@media (max-width: 640px) { - .filter-grid { - grid-template-columns: 1fr; - } - .filter-buttons { - width: 100%; - } - .filter-buttons :deep(.el-button) { - flex: 1 1 auto; - } -} -.mt-4 { - margin-top: 16px; -} diff --git a/apps/frontend-vue/src/styles/element-overrides.css b/apps/frontend-vue/src/styles/element-overrides.css deleted file mode 100644 index 3c3b365b..00000000 --- a/apps/frontend-vue/src/styles/element-overrides.css +++ /dev/null @@ -1,180 +0,0 @@ -/* ===== Element Plus Global Overrides ===== - Single place for all Element Plus style normalization. - Eliminates the need for scattered :deep() overrides in components. -*/ - -/* ---- Buttons ---- */ -.el-button { - border-radius: var(--radius-md); - font-weight: 500; -} - -.el-button--primary { - --el-button-bg-color: var(--color-primary); - --el-button-border-color: var(--color-primary); - --el-button-hover-bg-color: var(--color-primary-dark); - --el-button-hover-border-color: var(--color-primary-dark); -} - -/* ---- Dialogs ---- */ -.el-dialog { - border-radius: var(--radius-xl); -} - -.el-message-box { - border-radius: var(--radius-xl); -} - -/* ---- Cards ---- */ -.el-card { - border-radius: var(--radius-lg); - border: 1px solid var(--border-default); - background: var(--bg-surface); - box-shadow: var(--shadow-md); -} - -/* ---- Tables ---- */ -.el-table { - border-radius: var(--radius-lg); - overflow: hidden; -} - -.el-table th.el-table__cell { - background: var(--bg-subtle); - color: var(--text-secondary); - font-size: var(--text-sm); - font-weight: 600; -} - -/* ---- Tags ---- */ -.el-tag { - border-radius: var(--radius-full); - font-weight: 600; -} - -/* ---- Menus ---- */ -.el-menu { - border-right: none; - background: transparent; -} - -/* ---- Inputs & Selects ---- */ -.el-input .el-input__wrapper, -.el-select .el-select__wrapper, -.el-date-editor.el-input__wrapper { - border-radius: var(--radius-md); - box-shadow: none; - border: 1px solid var(--border-default); -} - -.el-date-editor.el-input__wrapper { - border: 0; - box-shadow: 0 0 0 1px var(--border-default) inset; -} - -.el-input .el-input__wrapper:hover, -.el-select .el-select__wrapper:hover, -.el-date-editor.el-input__wrapper:hover { - border-color: var(--border-hover); -} - -.el-date-editor.el-input__wrapper:hover { - box-shadow: 0 0 0 1px var(--border-hover) inset; -} - -.el-input.is-focus .el-input__wrapper, -.el-select.is-focus .el-select__wrapper, -.el-date-editor.el-input__wrapper.is-active { - border-color: var(--color-primary); - box-shadow: 0 0 0 1px var(--color-primary) inset; -} - -/* ---- Pagination ---- */ -.el-pagination { - justify-content: center; - margin-top: var(--space-4); -} - -/* ---- Tabs ---- */ -.el-tabs__header { - margin-bottom: var(--space-4); -} - -/* ---- Switch ---- */ -.el-switch.is-checked .el-switch__core { - background-color: var(--color-primary); - border-color: var(--color-primary); -} - -/* ---- Skeleton ---- */ -.el-skeleton { - --el-skeleton-color: var(--bg-subtle); -} - -/* ---- Empty ---- */ -.el-empty__description { - color: var(--text-muted); -} - -/* ---- 通用工具类 ---- */ -.mt-4 { - margin-top: var(--space-4); -} -.mb-4 { - margin-bottom: var(--space-4); -} -.w-full { - width: 100%; -} -.text-muted-xs { - font-size: var(--text-xs); - color: var(--text-muted); -} -.text-muted-xs.mt-1 { - margin-top: var(--space-1); -} -.fw-600 { - font-weight: 600; -} -.text-danger { - color: var(--color-danger); -} -.ml-2 { - margin-left: var(--space-2); -} -.pagination-center { - margin-top: var(--space-4); - display: flex; - justify-content: center; -} -.card-header { - display: flex; - justify-content: space-between; - gap: var(--space-3); - align-items: flex-end; -} -.card-header--split { - align-items: center; -} -.card-title { - display: block; - color: var(--text-primary); - font-size: var(--text-lg); - font-weight: 600; -} -.card-desc { - display: block; - margin-top: 4px; - color: var(--text-secondary); - font-size: var(--text-sm); - line-height: 1.6; -} -.card-actions { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - align-items: center; -} -.filter-col-160 { - width: 160px; -} diff --git a/apps/frontend-vue/src/styles/main.css b/apps/frontend-vue/src/styles/main.css deleted file mode 100644 index f2c7b0a4..00000000 --- a/apps/frontend-vue/src/styles/main.css +++ /dev/null @@ -1,57 +0,0 @@ -:root { - color: var(--text-primary); - background: - radial-gradient(circle at top left, rgba(44, 133, 247, 0.22), transparent 32%), - radial-gradient(circle at top right, rgba(114, 184, 255, 0.18), transparent 26%), - linear-gradient(180deg, var(--bg-page) 0%, #f7fbff 100%); - font-family: var(--font-sans); - line-height: 1.5; - font-weight: 400; - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -html, -body, -#app { - min-height: 100%; -} - -body { - margin: 0; -} - -body::before { - content: ''; - position: fixed; - inset: 0; - pointer-events: none; - background-image: - linear-gradient(rgba(20, 47, 95, 0.02) 1px, transparent 1px), - linear-gradient(90deg, rgba(20, 47, 95, 0.02) 1px, transparent 1px); - background-size: 24px 24px; - mask-image: radial-gradient(circle at center, black, transparent 75%); -} - -img { - max-width: 100%; -} - -button, -input, -select, -textarea { - font: inherit; -} - -a { - color: inherit; -} diff --git a/apps/frontend-vue/src/styles/tokens.css b/apps/frontend-vue/src/styles/tokens.css deleted file mode 100644 index bacbb5a6..00000000 --- a/apps/frontend-vue/src/styles/tokens.css +++ /dev/null @@ -1,76 +0,0 @@ -/* ===== Design Tokens ===== - Single source of truth for all visual values. - Every component/view must reference these variables instead of hardcoded values. -*/ - -:root { - /* ---- Color Palette ---- */ - --color-primary: #3b82f6; - --color-primary-light: #eff6ff; - --color-primary-dark: #1d4ed8; - - --color-success: #22c55e; - --color-success-light: #f0fdf4; - --color-success-dark: #15803d; - - --color-warning: #f59e0b; - --color-warning-light: #fffbeb; - --color-warning-dark: #b45309; - - --color-danger: #ef4444; - --color-danger-light: #fef2f2; - --color-danger-dark: #b91c1c; - - /* ---- Surfaces & Backgrounds ---- */ - --bg-page: #f3f7fc; - --bg-surface: rgba(255, 255, 255, 0.94); - --bg-sidebar: rgba(255, 255, 255, 0.92); - --bg-subtle: rgba(15, 93, 216, 0.06); - - /* ---- Text ---- */ - --text-primary: #1e293b; - --text-secondary: #64748b; - --text-muted: #94a3b8; - - /* ---- Borders ---- */ - --border-default: rgba(86, 108, 138, 0.12); - --border-hover: rgba(37, 99, 235, 0.28); - - /* ---- Spacing (4px base) ---- */ - --space-1: 4px; - --space-2: 8px; - --space-3: 12px; - --space-4: 16px; - --space-5: 20px; - --space-6: 24px; - --space-8: 32px; - - /* ---- Border Radius ---- */ - --radius-sm: 8px; - --radius-md: 12px; - --radius-lg: 16px; - --radius-xl: 20px; - --radius-full: 999px; - - /* ---- Shadows ---- */ - --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); - --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.07); - --shadow-lg: 0 10px 30px rgba(30, 49, 78, 0.08); - - /* ---- Typography ---- */ - --font-sans: 'PingFang SC', 'SF Pro Display', 'Segoe UI', sans-serif; - --font-mono: 'JetBrains Mono', 'SFMono-Regular', ui-monospace, monospace; - - --text-xs: 12px; - --text-sm: 13px; - --text-base: 14px; - --text-lg: 16px; - --text-xl: 20px; - --text-2xl: 24px; - --text-3xl: 28px; - - /* ---- Breakpoints (for reference, not used as CSS variables directly) ---- */ - --bp-lg: 1200px; - --bp-md: 900px; - --bp-sm: 640px; -} diff --git a/apps/frontend-vue/src/types/admin/audit-logs.ts b/apps/frontend-vue/src/types/admin/audit-logs.ts deleted file mode 100644 index d54fc10b..00000000 --- a/apps/frontend-vue/src/types/admin/audit-logs.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { AdminRole } from './auth' - -export interface AdminAuditLogItem { - logId: number - actorUserId: number - actorUsername: string - actorRole: AdminRole - action: string - targetType: string - targetId: string - payload: Record - createdAt: string -} diff --git a/apps/frontend-vue/src/types/admin/auth.ts b/apps/frontend-vue/src/types/admin/auth.ts deleted file mode 100644 index d9d23fc7..00000000 --- a/apps/frontend-vue/src/types/admin/auth.ts +++ /dev/null @@ -1,22 +0,0 @@ -export type AdminRole = 'admin' | 'operator' | 'support' -export type AdminUserStatus = 'active' | 'disabled' - -export interface AdminLoginResponse { - token: string - expiresAt: string - user: { - userId: number - username: string - role: AdminRole - } -} - -export interface AdminSessionSummary { - authenticated: boolean - expiresAt: string - user: { - userId: number - username: string - role: AdminRole - } -} diff --git a/apps/frontend-vue/src/types/admin/common.ts b/apps/frontend-vue/src/types/admin/common.ts deleted file mode 100644 index 29821fba..00000000 --- a/apps/frontend-vue/src/types/admin/common.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface AdminPagination { - page: number - pageSize: number - total: number -} diff --git a/apps/frontend-vue/src/types/admin/dashboard.ts b/apps/frontend-vue/src/types/admin/dashboard.ts deleted file mode 100644 index 7d666bf0..00000000 --- a/apps/frontend-vue/src/types/admin/dashboard.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface AdminDashboardSummary { - todayOrders: number - paidPendingClaim: number - claimingTasks: number - redeemedToday: number - abnormalTasks: number -} diff --git a/apps/frontend-vue/src/types/admin/index.ts b/apps/frontend-vue/src/types/admin/index.ts deleted file mode 100644 index db08037a..00000000 --- a/apps/frontend-vue/src/types/admin/index.ts +++ /dev/null @@ -1,81 +0,0 @@ -// Common types -export type { AdminPagination } from './common' - -// Auth types -export type { AdminRole, AdminUserStatus, AdminLoginResponse, AdminSessionSummary } from './auth' - -// Users types -export type { AdminUserListItem } from './users' - -// Audit logs types -export type { AdminAuditLogItem } from './audit-logs' - -// Dashboard types -export type { AdminDashboardSummary } from './dashboard' - -// Orders types -export type { - AdminOrderFulfillmentProgress, - AdminOrderListItem, - AdminOrderDetail, -} from './orders' - -// Tasks types -export type { - AdminTaskListItem, - AdminTaskOperations, - AdminTaskActionResponse, - AdminTaskDetail, -} from './tasks' - -// Platform config types -export type { - AdminNotificationBarkRecipient, - AdminNotificationWpushRecipient, - AdminNotificationConfig, - AdminNotificationSendResult, - AdminNotificationTestResult, - AdminCloudtentaclesMonitorAccount, - AdminScheduledJobAccountRuntime, - AdminScheduledJobCloudtentaclesAccount, - AdminScheduledJobItem, - AdminScheduledJobsConfig, - AdminScheduledJobRuntimeState, - AdminScheduledJobsResponse, - AdminNinetyoneOrderItem, - AdminNinetyoneOrderListResult, - AdminNinetyoneOrderActionResult, - AdminKuaishouEticketSourceConfig, - AdminKuaishouEticketShopConfigItem, - AdminKuaishouEticketShopInfoResult, - AdminKuaishouEticketDetailResult, - AdminKuaishouEticketConsumeResult, - AdminKuaishouFeifeiProductRule, - AdminKuaishouFeifeiConfig, - AdminKuaishouFeifeiEffectiveConfig, - AdminKuaishouFeifeiConfigResponse, - AdminKuaishouFeifeiProductSyncResult, - AdminKuaishouFeifeiProductMatch, - AdminKuaishouFeifeiMatchResult, - AdminKuaishouFeifeiProductItem, - AdminKuaishouFeifeiProductListResult, - AdminKuaishouFeifeiOrderResult, - AdminCloudtentaclesSourceItem, - AdminCloudtentaclesSourcesConfig, - AdminCloudtentaclesSourceConfigResponse, - AdminCloudtentaclesOverrideDeliveryItem, - AdminCloudtentaclesOverrideRule, - AdminCloudtentaclesOverrideRuleConfig, - AdminCloudtentaclesSessionsMap, - AdminCloudtentaclesSourceConfig, - AdminCloudtentaclesPersistedSession, - AdminCloudtentaclesSessionItem, - AdminCloudtentaclesSendSmsResult, - AdminCloudtentaclesSessionSummary, - AdminCloudtentaclesLoginTestResult, - AdminCloudtentaclesValidateSessionResult, - AdminCloudtentaclesSkuItem, - AdminCloudtentaclesSkuListResult, - AdminCloudtentaclesDeliveryRecordItem, - AdminCloudtentaclesDeliveryRecordListResult, -} from './platform-config' diff --git a/apps/frontend-vue/src/types/admin/orders.ts b/apps/frontend-vue/src/types/admin/orders.ts deleted file mode 100644 index 77c5e1a0..00000000 --- a/apps/frontend-vue/src/types/admin/orders.ts +++ /dev/null @@ -1,87 +0,0 @@ -import type { AdminTaskListItem } from './tasks' - -export interface AdminOrderFulfillmentProgress { - totalTaskCount: number - preparedTaskCount: number - completedTaskCount: number - resourceStatus: string - customerStatus: string -} - -export interface AdminOrderListItem { - orderId: number - provider: string - platform: string - shopId: string - shopName: string - platformOrderId: string - orderStatus: string - payStatus: string - buyerId: string - buyerName: string - receiverContact: string - totalAmount: string - totalAmountFen: number - currency: string - paidAt: string | null - createdAt: string - updatedAt: string - itemCount: number - totalQuantity: number - itemSummary: string - taskCount: number - resourceStatus: string - customerStatus: string - preparedTaskCount: number - completedTaskCount: number -} - -export interface AdminOrderDetail { - order: { - orderId: number - provider: string - platform: string - shopId: string - shopName: string - platformOrderId: string - orderStatus: string - payStatus: string - buyerId: string - buyerName: string - receiverContact: string - totalAmount: string - totalAmountFen: number - currency: string - paidAt: string | null - createdAt: string - updatedAt: string - itemSummary: string - rawPayload: Record - fulfillmentProgress: AdminOrderFulfillmentProgress - } - items: Array<{ - orderItemId: number - skuCode: string - skuName: string - itemTitle: string - quantity: number - deliveryMode: string - spec: Record - }> - tasks: AdminTaskListItem[] - kuaishouIndustryVouchers: Array<{ - oid: string - voucherCode: string - unitIndex: number - status: string - sendCallbackStatus: string - sendCallbackAttemptCount: number - sendCallbackLastError: string - sendCallbackSentAt: string | null - consumedAt: string | null - destroyedAt: string | null - }> - operations: { - canResendKuaishouIndustryVoucherCode: boolean - } -} diff --git a/apps/frontend-vue/src/types/admin/platform-config/cloudtentacles.ts b/apps/frontend-vue/src/types/admin/platform-config/cloudtentacles.ts deleted file mode 100644 index 6442d35f..00000000 --- a/apps/frontend-vue/src/types/admin/platform-config/cloudtentacles.ts +++ /dev/null @@ -1,181 +0,0 @@ -export interface AdminCloudtentaclesSourceItem { - key: string - label: string - enabled: boolean - baseUrl: string - username: string - password: string - phone: string - deviceId: string - deviceType: number -} - -export interface AdminCloudtentaclesSourcesConfig { - enabled: boolean - sources: AdminCloudtentaclesSourceItem[] -} - -export interface AdminCloudtentaclesPersistedSession { - token: string - tokenMasked: string - baseUrl: string - username: string - phoneMasked: string - loggedInAt: string - deviceId: string - deviceType: number - hasToken: boolean -} - -export type AdminCloudtentaclesSessionItem = AdminCloudtentaclesPersistedSession - -export interface AdminCloudtentaclesSessionsMap { - [sourceKey: string]: AdminCloudtentaclesPersistedSession -} - -export interface AdminCloudtentaclesSourceConfigResponse { - filePath: string - sessionFilePath: string - enabled: boolean - sources: AdminCloudtentaclesSourceItem[] - sessions: AdminCloudtentaclesSessionsMap -} - -export interface AdminCloudtentaclesOverrideDeliveryItem { - cloudSkuId: number - cloudSkuName: string - quantity: number -} - -export interface AdminCloudtentaclesOverrideRule { - id: string - enabled: boolean - productName: string - normalizedProductName: string - sourceKey: string - deliveryItems: AdminCloudtentaclesOverrideDeliveryItem[] - notes: string -} - -export interface AdminCloudtentaclesOverrideRuleConfig { - filePath: string - enabled: boolean - rules: AdminCloudtentaclesOverrideRule[] -} - -export interface AdminCloudtentaclesSendSmsResult { - baseUrl: string - username: string - phone: string - phoneMasked: string - sentAt: string - responseMessage: string -} - -export interface AdminCloudtentaclesSessionSummary { - tokenMasked: string - permissionCount: number - permissions: string[] - persisted?: boolean -} - -export interface AdminCloudtentaclesLoginTestResult { - baseUrl: string - username: string - phoneMasked: string - loggedInAt: string - responseMessage: string - token: string - session: AdminCloudtentaclesSessionSummary - userInfo: Record - asset: number -} - -export interface AdminCloudtentaclesValidateSessionResult { - baseUrl: string - loggedInAt: string - session: AdminCloudtentaclesSessionSummary - userInfo: Record - asset: number -} - -export interface AdminCloudtentaclesSkuItem { - id: number - categoriesId: number - name: string - description: string - image: string - inventory: number - price: number - listingTime: string - delistingTime: string - buyLimitMin: number - buyLimitMax: number - raw: Record -} - -export interface AdminCloudtentaclesSkuListResult { - baseUrl: string - itemCount: number - items: AdminCloudtentaclesSkuItem[] - rawItems: Record[] -} - -export interface AdminCloudtentaclesDeliveryRecordItem { - createdAt: string - recordId: string - virtualNumberId: number - userId: number - count: number - cdk: string - exchangeUrl: string - name: string - skuId: number - skuName: string - skuImage: string - phone: string - status: number - fulfillUser: string - operatorName: string - platformOrderId: string - taskId: number - taskNo: string - orderShopId: string - orderShopName: string - consumeShopId: string - consumeShopName: string - roleName: string - roleId: string - localTaskStatus: string - localDeliveryStatus: string - localDispatchStatus: string - localDispatchAt: string - localResultCode: string - localResultMessage: string - matchConfidence: string - raw: Record -} - -export interface AdminCloudtentaclesDeliveryRecordListResult { - baseUrl: string - page: number - size: number - total: number - sourceKey?: string - queryStartDate?: string - queryEndDate?: string - localOrderMatched?: boolean - items: AdminCloudtentaclesDeliveryRecordItem[] - raw: Record -} - -/** @deprecated Use AdminCloudtentaclesSourceItem + AdminCloudtentaclesSourcesConfig instead */ -export interface AdminCloudtentaclesSourceConfig { - enabled: boolean - baseUrl: string - username: string - password: string - phone: string - deviceId: string - deviceType: number -} diff --git a/apps/frontend-vue/src/types/admin/platform-config/index.ts b/apps/frontend-vue/src/types/admin/platform-config/index.ts deleted file mode 100644 index 560c4c6d..00000000 --- a/apps/frontend-vue/src/types/admin/platform-config/index.ts +++ /dev/null @@ -1,65 +0,0 @@ -export type { - AdminNotificationBarkRecipient, - AdminNotificationWpushRecipient, - AdminNotificationConfig, - AdminNotificationSendResult, - AdminNotificationTestResult, -} from './notifications' - -export type { - AdminCloudtentaclesMonitorAccount, - AdminScheduledJobAccountRuntime, - AdminScheduledJobCloudtentaclesAccount, - AdminScheduledJobItem, - AdminScheduledJobsConfig, - AdminScheduledJobRuntimeState, - AdminScheduledJobsResponse, -} from './scheduled-jobs' - -export type { - AdminNinetyoneOrderItem, - AdminNinetyoneOrderListResult, - AdminNinetyoneOrderActionResult, -} from './ninetyone' - -export type { - AdminKuaishouEticketSourceConfig, - AdminKuaishouEticketShopConfigItem, - AdminKuaishouEticketShopInfoResult, - AdminKuaishouEticketDetailResult, - AdminKuaishouEticketConsumeResult, -} from './kuaishou-eticket' - -export type { - AdminKuaishouFeifeiProductRule, - AdminKuaishouFeifeiConfig, - AdminKuaishouFeifeiEffectiveConfig, - AdminKuaishouFeifeiConfigResponse, - AdminKuaishouFeifeiProductSyncResult, - AdminKuaishouFeifeiProductMatch, - AdminKuaishouFeifeiMatchResult, - AdminKuaishouFeifeiProductItem, - AdminKuaishouFeifeiProductListResult, - AdminKuaishouFeifeiOrderResult, -} from './kuaishou-feifei' - -export type { - AdminCloudtentaclesSourceItem, - AdminCloudtentaclesSourcesConfig, - AdminCloudtentaclesSourceConfigResponse, - AdminCloudtentaclesOverrideDeliveryItem, - AdminCloudtentaclesOverrideRule, - AdminCloudtentaclesOverrideRuleConfig, - AdminCloudtentaclesSessionsMap, - AdminCloudtentaclesSourceConfig, - AdminCloudtentaclesPersistedSession, - AdminCloudtentaclesSessionItem, - AdminCloudtentaclesSendSmsResult, - AdminCloudtentaclesSessionSummary, - AdminCloudtentaclesLoginTestResult, - AdminCloudtentaclesValidateSessionResult, - AdminCloudtentaclesSkuItem, - AdminCloudtentaclesSkuListResult, - AdminCloudtentaclesDeliveryRecordItem, - AdminCloudtentaclesDeliveryRecordListResult, -} from './cloudtentacles' diff --git a/apps/frontend-vue/src/types/admin/platform-config/kuaishou-eticket.ts b/apps/frontend-vue/src/types/admin/platform-config/kuaishou-eticket.ts deleted file mode 100644 index 046bca9c..00000000 --- a/apps/frontend-vue/src/types/admin/platform-config/kuaishou-eticket.ts +++ /dev/null @@ -1,83 +0,0 @@ -export interface AdminKuaishouEticketShopConfigItem { - shopId: string - kshopName: string - cookie: string - cookieMasked: string - hasCookie: boolean - userAvatar: string - enabled: boolean -} - -export interface AdminKuaishouEticketSourceConfig { - enabled: boolean - baseUrl: string - shops: AdminKuaishouEticketShopConfigItem[] -} - -export interface AdminKuaishouEticketShopInfoResult { - baseUrl: string - ok: boolean - result: number - errorMessage: string - requestId: string - shop: { - shopId: string - kshopName: string - userAvatar: string - settleStatus: number - hasCookie: boolean - } - raw: Record -} - -export interface AdminKuaishouEticketDetailResult { - baseUrl: string - eTicketId: string - ok: boolean - alreadyConsumed: boolean - result: number - errorMessage: string - requestId: string - serverTimestamp: string - detail: { - uid: string - fulfillDetailId: string - sellerId: string - formToken: string - validEndTime: string - validStartTime: string - leftReverseCount: number - eTicketId: string - oid: string - totalCount: number - leftCount: number - status: string - } | null - goods: { - itemId: string - itemPicUrl: string - itemTitle: string - price: string - skuDesc: string - skuId: string - } | null - raw: Record -} - -export interface AdminKuaishouEticketConsumeResult { - baseUrl: string - eTicketId: string - oid: string - formToken: string - num: number - storeId: string - ok: boolean - consumed: boolean - alreadyConsumed: boolean - result: number - errorMessage: string - requestId: string - serverTimestamp: string - detail: AdminKuaishouEticketDetailResult['detail'] - raw: Record -} diff --git a/apps/frontend-vue/src/types/admin/platform-config/kuaishou-feifei.ts b/apps/frontend-vue/src/types/admin/platform-config/kuaishou-feifei.ts deleted file mode 100644 index ecea64ef..00000000 --- a/apps/frontend-vue/src/types/admin/platform-config/kuaishou-feifei.ts +++ /dev/null @@ -1,104 +0,0 @@ -export interface AdminKuaishouFeifeiProductRule { - id: string - enabled: boolean - productName: string - normalizedProductName: string - productCode: string - skuName: string - notes: string -} - -export interface AdminKuaishouFeifeiConfig { - enabled: boolean - baseUrl: string - appKey: string - appSecret: string - timeoutMs: number - notifyUrl: string - productRules: AdminKuaishouFeifeiProductRule[] -} - -export interface AdminKuaishouFeifeiEffectiveConfig { - enabled: boolean - baseUrl: string - timeoutMs: number - notifyUrl: string - hasAppKey: boolean - hasAppSecret: boolean - productRuleCount: number -} - -export interface AdminKuaishouFeifeiConfigResponse { - filePath: string - source: AdminKuaishouFeifeiConfig - effective: AdminKuaishouFeifeiEffectiveConfig -} - -export interface AdminKuaishouFeifeiProductSyncResult extends AdminKuaishouFeifeiConfigResponse { - sync: { - productCount: number - ruleCount: number - status: string - supplyProductName: string - } -} - -export interface AdminKuaishouFeifeiProductMatch { - matchMode: string - productName: string - normalizedProductName: string - productCode: string - skuName: string -} - -export interface AdminKuaishouFeifeiMatchResult { - productName: string - normalizedProductName: string - matched: boolean - match: AdminKuaishouFeifeiProductMatch | null -} - -export interface AdminKuaishouFeifeiProductItem { - productCode: string - name: string - channel: string - externalProductId: string - imageUrl: string - status: string - supplyStatus: string - supplyPricePoints: number - feePoints: number - unitCostPoints: number - maxOrderQuantity: number - salePricePoints: number | null - raw: Record -} - -export interface AdminKuaishouFeifeiProductListResult { - items: AdminKuaishouFeifeiProductItem[] - total: number - page: number - perPage: number - raw: Record -} - -export interface AdminKuaishouFeifeiOrderResult { - orderNo: string - platformOrderNo: string - productCode: string - productName: string - rechargeStatus: number - rechargeStatusLabel: string - pointsCharged: number - playerAccount: string - platformBuyNum: number - rechargeResultMessage: string - createdAt: string - updatedAt: string - rechargeFinishAt: string - h5: { - entryUrl: string - rechargeUrl: string - } - raw: Record -} diff --git a/apps/frontend-vue/src/types/admin/platform-config/ninetyone.ts b/apps/frontend-vue/src/types/admin/platform-config/ninetyone.ts deleted file mode 100644 index 19df7c49..00000000 --- a/apps/frontend-vue/src/types/admin/platform-config/ninetyone.ts +++ /dev/null @@ -1,32 +0,0 @@ -export interface AdminNinetyoneOrderItem { - orderId: number - orderNo: string - outTradeNo: string - orderStatus: string - payStatus: string - shopId: string - shopName: string - productNo: string - productName: string - buyNum: number - taskCount: number - failReason: string - createdAt: string - updatedAt: string - items: Array> -} - -export interface AdminNinetyoneOrderListResult { - page: number - pageSize: number - total: number - items: AdminNinetyoneOrderItem[] -} - -export interface AdminNinetyoneOrderActionResult { - orderId: number - orderNo: string - orderStatus: string - orderItemCount: number - taskCount: number -} diff --git a/apps/frontend-vue/src/types/admin/platform-config/notifications.ts b/apps/frontend-vue/src/types/admin/platform-config/notifications.ts deleted file mode 100644 index 1a847acb..00000000 --- a/apps/frontend-vue/src/types/admin/platform-config/notifications.ts +++ /dev/null @@ -1,50 +0,0 @@ -export interface AdminNotificationBarkRecipient { - id: string - name: string - deviceKey: string - deviceKeyMasked: string - enabled: boolean -} - -export interface AdminNotificationWpushRecipient { - id: string - name: string - apiKey: string - apiKeyMasked: string - enabled: boolean -} - -export interface AdminNotificationConfig { - enabled: boolean - channels: { - bark: { - enabled: boolean - serverUrl: string - recipients: AdminNotificationBarkRecipient[] - } - wpush: { - enabled: boolean - recipients: AdminNotificationWpushRecipient[] - } - } -} - -export interface AdminNotificationSendResult { - channel: string - recipientId: string - recipientName: string - recipientKeyMasked: string - ok: boolean - status: number - errorMessage: string - response: unknown -} - -export interface AdminNotificationTestResult { - enabled: boolean - channel: string - successCount: number - failedCount: number - skippedCount: number - results: AdminNotificationSendResult[] -} diff --git a/apps/frontend-vue/src/types/admin/platform-config/scheduled-jobs.ts b/apps/frontend-vue/src/types/admin/platform-config/scheduled-jobs.ts deleted file mode 100644 index 5a0d82b1..00000000 --- a/apps/frontend-vue/src/types/admin/platform-config/scheduled-jobs.ts +++ /dev/null @@ -1,74 +0,0 @@ -export interface AdminScheduledJobCloudtentaclesAccount { - sourceKey: string - label: string - enabled: boolean - assetThreshold: number -} - -export interface AdminScheduledJobItem { - id: string - type: string - enabled: boolean - intervalSeconds: number - cooldownSeconds: number - config: { - assetThreshold: number - accounts: AdminScheduledJobCloudtentaclesAccount[] - } -} - -export interface AdminScheduledJobsConfig { - enabled: boolean - jobs: AdminScheduledJobItem[] -} - -export interface AdminScheduledJobRuntimeState { - id: string - enabled: boolean - running: boolean - lastRunAt: string - lastFinishedAt: string - nextRunAt: string - lastStatus: string - lastMessage: string - lastAsset: number | null - lastThreshold: number | null - lastAccounts: AdminScheduledJobAccountRuntime[] - lastAccountCount: number - lastCheckedCount: number - lastOkCount: number - lastLowAssetCount: number - lastFailedCount: number - lastManual: boolean -} - -export interface AdminScheduledJobAccountRuntime { - sourceKey: string - label: string - enabled: boolean - hasToken: boolean - ok: boolean - skipped: boolean - status: string - message: string - asset: number | null - threshold: number - checkedAt: string -} - -export interface AdminCloudtentaclesMonitorAccount { - sourceKey: string - label: string - enabled: boolean - username: string - phoneMasked: string - hasToken: boolean - loggedInAt: string -} - -export interface AdminScheduledJobsResponse { - filePath: string - source: AdminScheduledJobsConfig - runtime: AdminScheduledJobRuntimeState[] - cloudtentaclesAccounts: AdminCloudtentaclesMonitorAccount[] -} diff --git a/apps/frontend-vue/src/types/admin/tasks.ts b/apps/frontend-vue/src/types/admin/tasks.ts deleted file mode 100644 index baa0b711..00000000 --- a/apps/frontend-vue/src/types/admin/tasks.ts +++ /dev/null @@ -1,239 +0,0 @@ -export interface AdminTaskListItem { - taskId: number - taskNo: string - platformOrderId: string - skuCode: string - skuName: string - status: string - executorKey: string - deliveryStatus: string - resultCode: string - resultMessage: string - resourceStatus: string - customerStatus: string - loginType: string - roleName: string - roleId: string - runtimeSessionId: string - claimedAt: string | null - roleConfirmedAt: string | null - redeemedAt: string | null - retryCount: number - lastError: string - createdAt: string - updatedAt: string - claimToken: string - screenshotPath: string -} - -export interface AdminTaskOperations { - canRetry: boolean - canRegenerateClaimLink: boolean - canClose: boolean - canMarkManualReview: boolean - canCompleteManualDispatch: boolean - canPrepareKuaishouCloudFulfillment: boolean - canRefreshKuaishouCloudRoleInfo: boolean - canRebindKuaishouCloudRole: boolean - canDispatchKuaishouCloudFulfillment: boolean - canReturnKuaishouCloudFulfillment: boolean - canResendKuaishouIndustryVoucherCode: boolean - canConsumeKuaishouIndustryVoucher: boolean - canViewSensitiveTaskData: boolean -} - -export interface AdminTaskActionResponse { - task: { - taskId: number - taskNo: string - status: string - deliveryStatus: string - resultCode: string - resultMessage: string - primaryClaimTokenId: number | null - lastError: string - updatedAt: string - } - claimUrl?: string - token?: string -} - -export interface AdminTaskDetail { - task: AdminTaskListItem - order: null | { - orderId: number - provider: string - platform: string - shopId: string - shopName: string - platformOrderId: string - payStatus: string - orderStatus: string - } - orderItem: null | { - orderItemId: number - skuCode: string - skuName: string - quantity: number - } - claimToken: null | { - primaryClaimTokenId: number - token: string - status: string - expiredAt: string - claimUrl: string - } - artifacts: Record - screenshotUrl: string - review: { - required: boolean - screenshotCapturedAt: string | null - roleId: string - roleName: string - } - redeemResolution: null | { - status: string - taskStatus: string - replacementCount: number - finishedAt: string | null - attempts: Array<{ - attempt: number - codeMasked: string - credentialType: string - outcome: string - resultCode: string - resultMessage: string - }> - } - kuaishouCloudFulfillment: null | { - flowType: string - configId: string - internalSkuCode: string - internalSkuName: string - ticket: { - code: string - capturedAt: string | null - status: string - verifiedAt: string | null - goodsTitle: string - leftCount: number - } - binding: { - prepareStatus: string - cloudSourceKeys: string[] - cloudSourceLabels: string[] - resolvedSourceKey: string - resolvedSourceLabel: string - skuId: number - skuName: string - vnKey: string - vnId: number - vnPhone: string - bindUrl: string - bindPreparedAt: string | null - bindExpiresAt: string | null - bindProbeAt: string | null - bindProbeStatus: string - bindProbeMessage: string - } - role: { - status: string - name: string - rid: string - refreshedAt: string | null - errorMessage: string - rawInfo: Record | null - } - purchase: { - autoBuyEnabled: boolean - minAssetReserve: number - usedKnapsack: boolean - purchaseTriggered: boolean - assetBefore: number - assetAfter: number - purchaseAt: string | null - } - dispatch: { - status: string - dispatchAt: string | null - sendType: number - note: string - } - returnNumber: { - status: string - returnedAt: string | null - autoReturnEnabled: boolean - } - consume: { - status: string - shopId: string - shopName: string - autoConsumeEnabled: boolean - consumedAt: string | null - errorMessage: string - } - rebind: { - currentAttempt: number - history: Array<{ - attempt: number - source: string - requestedAt: string | null - requestedBy: Record | null - status: string - errorMessage: string - oldBinding: { - vnKey: string - vnId: number - vnPhone: string - bindUrl: string - bindPreparedAt: string | null - bindExpiresAt: string | null - roleName: string - roleId: string - } - newBinding: null | { - vnKey: string - vnId: number - vnPhone: string - bindUrl: string - bindPreparedAt: string | null - bindExpiresAt: string | null - } - }> - } - notes: string - } - kuaishouIndustryVoucher: null | { - oid: string - voucherCode: string - unitIndex: number - status: string - sendCallbackStatus: string - sendCallbackLastError: string - sendCallbackAttemptCount: number - sendCallbackSentAt: string | null - consumeSerialNum: string - consumeDetails: Array> - consumedAt: string | null - destroyedAt: string | null - } - manualDispatch: null | { - outcome: string - deliveryReference: string - deliveredCredential: string - resultMessage: string - completedAt: string | null - completedBy: null | { - userId: number - username: string - role: string - } - } - events: Array<{ - eventId: number - eventType: string - payload: Record - createdAt: string - }> - operations: AdminTaskOperations -} diff --git a/apps/frontend-vue/src/types/admin/users.ts b/apps/frontend-vue/src/types/admin/users.ts deleted file mode 100644 index 7c5438a2..00000000 --- a/apps/frontend-vue/src/types/admin/users.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { AdminRole, AdminUserStatus } from './auth' - -export interface AdminUserListItem { - userId: number - username: string - role: AdminRole - status: AdminUserStatus - createdAt: string - updatedAt: string -} diff --git a/apps/frontend-vue/src/types/claim.ts b/apps/frontend-vue/src/types/claim.ts deleted file mode 100644 index d1370129..00000000 --- a/apps/frontend-vue/src/types/claim.ts +++ /dev/null @@ -1,168 +0,0 @@ -import type { KnownTaskStatus } from '@/domain/task-status' - -export type ClaimTokenStatus = 'active' | 'used' | 'expired' | 'revoked' | (string & {}) - -export type ClaimTaskStatus = KnownTaskStatus | (string & {}) - -export interface ClaimTaskInfo { - taskId: number - taskNo: string - status: ClaimTaskStatus - executorKey: string - requiresSupportReview: boolean - expiresAt: string | null - claimedAt: string | null - roleConfirmedAt: string | null - redeemedAt: string | null - loginType: string - lastError: string - runtimeSessionId: string -} - -export interface ClaimOrderInfo { - orderId: number - platform: string - platformOrderId: string - payStatus: string - orderStatus: string - totalAmount: string - totalAmountFen: number - currency: string -} - -export interface ClaimOrderItemInfo { - orderItemId: number - skuCode: string - skuName: string - quantity: number -} - -export interface ClaimProductInfo { - title: string - skuCode: string - quantity: number - isBundle: boolean - items: Array<{ - cloudSkuId: number - name: string - quantity: number - }> -} - -export interface ClaimResultInfo { - resultCode: string - resultMessage: string - screenshotReady: boolean - screenshotUrl: string -} - -export interface ClaimKuaishouCloudFlowInfo { - flowType: 'kuaishou_cloud' - shopId: string - shopName: string - guideImages: string[] - ticket: { - code: string - status: string - capturedAt: string | null - verifiedAt: string | null - goodsTitle: string - leftCount: number - } - binding: { - prepareStatus: string - cloudSourceKeys: string[] - resolvedSourceKey: string - skuId: number - skuName: string - vnKey: string - vnId: number - bindUrl: string - bindPreparedAt: string | null - bindExpiresAt: string | null - bindProbeAt: string | null - bindProbeStatus: string - bindProbeMessage: string - vnPhone: string - roleName: string - roleId: string - } - role: { - status: string - name: string - rid: string - refreshedAt: string | null - errorMessage: string - defaultName: string - defaultRid: string - defaultCapturedAt: string | null - defaultCaptureStatus: string - defaultErrorMessage: string - isDefaultRole: boolean - } - purchase: { - autoBuyEnabled: boolean - minAssetReserve: number - usedKnapsack: boolean - purchaseTriggered: boolean - assetBefore: number - assetAfter: number - purchaseAt: string | null - } - dispatch: { - status: string - dispatchAt: string | null - failedAt: string | null - failedStage: string - errorCode: string - errorMessage: string - note: string - } - returnNumber: { - status: string - returnedAt: string | null - } - consume: { - status: string - shopId: string - shopName: string - consumedAt: string | null - errorMessage: string - } - rebind?: { - currentAttempt: number - history: Array> - } -} - -export interface ClaimKuaishouFeifeiFlowInfo { - flowType: 'kuaishou_feifei' - productCode: string - productName: string - platformOrderNo: string - orderNo: string - rechargeStatus: number - rechargeStatusLabel: string - rechargeResultMessage: string - claimUrl: string - consumeStatus: string - h5: { - entryUrl: string - rechargeUrl: string - } - lastSyncedAt: string | null -} - -export interface ClaimDetailData { - tokenStatus: ClaimTokenStatus - claimUrl: string - flowType: 'kuaishou_cloud' | 'kuaishou_ct_assisted' | 'kuaishou_feifei' | (string & {}) - task: ClaimTaskInfo - order: ClaimOrderInfo - orderItem: ClaimOrderItemInfo - product: ClaimProductInfo - session: unknown | null - kuaishouCloudFulfillment: ClaimKuaishouCloudFlowInfo | null - kuaishouFeifei: ClaimKuaishouFeifeiFlowInfo | null - result: ClaimResultInfo | null -} diff --git a/apps/frontend-vue/src/utils/admin-auth.ts b/apps/frontend-vue/src/utils/admin-auth.ts deleted file mode 100644 index cbb374e6..00000000 --- a/apps/frontend-vue/src/utils/admin-auth.ts +++ /dev/null @@ -1,99 +0,0 @@ -const ADMIN_TOKEN_KEY = 'order-site-admin-token' -const ADMIN_EXPIRES_AT_KEY = 'order-site-admin-token-expires-at' -const ADMIN_USER_ID_KEY = 'order-site-admin-user-id' -const ADMIN_USERNAME_KEY = 'order-site-admin-username' -const ADMIN_ROLE_KEY = 'order-site-admin-role' - -const ADMIN_ROLE_LEVEL: Record<'support' | 'operator' | 'admin', number> = { - support: 1, - operator: 2, - admin: 3, -} - -export function getAdminToken() { - return localStorage.getItem(ADMIN_TOKEN_KEY) || '' -} - -export function getAdminTokenExpiresAt() { - return localStorage.getItem(ADMIN_EXPIRES_AT_KEY) || '' -} - -export function getAdminUserId() { - const value = Number(localStorage.getItem(ADMIN_USER_ID_KEY) || 0) - return Number.isFinite(value) && value > 0 ? value : 0 -} - -export function getAdminUsername() { - return localStorage.getItem(ADMIN_USERNAME_KEY) || '' -} - -export function getAdminRole() { - const role = localStorage.getItem(ADMIN_ROLE_KEY) - if (role === 'admin' || role === 'operator' || role === 'support') { - return role - } - - return 'support' -} - -export function hasAdminRole(role: 'admin' | 'operator' | 'support') { - if (!hasAdminSession()) { - return false - } - - return ADMIN_ROLE_LEVEL[getAdminRole()] >= ADMIN_ROLE_LEVEL[role] -} - -export function setAdminSession( - token: string, - expiresAt: string, - user?: { userId: number; username: string; role: 'admin' | 'operator' | 'support' }, -) { - localStorage.setItem(ADMIN_TOKEN_KEY, token) - localStorage.setItem(ADMIN_EXPIRES_AT_KEY, expiresAt) - - if (user?.userId) { - localStorage.setItem(ADMIN_USER_ID_KEY, String(user.userId)) - } - - if (user?.username) { - localStorage.setItem(ADMIN_USERNAME_KEY, user.username) - } - - if (user?.role) { - localStorage.setItem(ADMIN_ROLE_KEY, user.role) - } -} - -export function clearAdminSession() { - localStorage.removeItem(ADMIN_TOKEN_KEY) - localStorage.removeItem(ADMIN_EXPIRES_AT_KEY) - localStorage.removeItem(ADMIN_USER_ID_KEY) - localStorage.removeItem(ADMIN_USERNAME_KEY) - localStorage.removeItem(ADMIN_ROLE_KEY) -} - -export function hasAdminSession() { - const token = getAdminToken() - const expiresAt = getAdminTokenExpiresAt() - - if (!token) { - return false - } - - if (isExpired(expiresAt)) { - clearAdminSession() - return false - } - - return true -} - -function isExpired(expiresAt: string) { - if (!expiresAt) { - return false - } - - const expiresAtMs = Date.parse(expiresAt) - return Number.isFinite(expiresAtMs) && expiresAtMs <= Date.now() -} diff --git a/apps/frontend-vue/src/utils/admin-display.ts b/apps/frontend-vue/src/utils/admin-display.ts deleted file mode 100644 index c579d923..00000000 --- a/apps/frontend-vue/src/utils/admin-display.ts +++ /dev/null @@ -1,135 +0,0 @@ -export function formatStatusWithRaw(status: string, labelMap: Record = {}) { - const normalized = String(status || '').trim() - - if (!normalized) { - return '-' - } - - const key = normalized.toLowerCase() - const label = labelMap[key] - - if (!label || label === normalized) { - return normalized - } - - return `${label} (${normalized})` -} - -export function formatAuditAction(action: string) { - const labelMap: Record = { - admin_user_created: '创建后台用户', - admin_user_role_updated: '修改用户角色', - admin_user_status_updated: '修改用户状态', - admin_user_password_reset: '重置用户密码', - task_regenerate_claim_link: '重发领取链接', - task_kuaishou_cloud_rebind_role: '换绑角色', - task_closed: '关闭任务', - task_mark_manual_review: '转人工处理', - task_complete_manual_dispatch: '完成人工履约', - platform_shop_config_updated: '更新店铺配置', - platform_fulfillment_config_updated: '更新履约配置', - } - - return formatStatusWithRaw(action, labelMap) -} - -export function formatAuditTargetType(targetType: string) { - const labelMap: Record = { - admin_user: '后台用户', - task: '交付任务', - platform_config: '平台配置', - } - - return formatStatusWithRaw(targetType, labelMap) -} - -export function formatTaskEventType(eventType: string) { - const labelMap: Record = { - manual_dispatch_completed: '人工履约已回写', - claim_redeem_code_used: '兑换码已使用', - claim_redeem_code_invalid: '兑换码错误', - claim_redeem_completed: '兑换链路完成', - kuaishou_cloud_rebind_requested: '发起角色换绑', - kuaishou_cloud_rebind_old_number_returned: '换绑旧号已退还', - kuaishou_cloud_rebind_prepared: '换绑资源已准备', - kuaishou_cloud_rebind_failed: '换绑失败', - } - - return formatStatusWithRaw(eventType, labelMap) -} - -export function formatRedeemOutcomeLabel(value: string) { - const normalized = String(value || '').trim() - - switch (normalized) { - case 'success': - return '兑换成功' - case 'code_used': - return '兑换码已使用' - case 'code_invalid': - return '兑换码错误' - case 'captcha_rejected': - return '验证码错误' - case 'failed': - return '兑换失败' - default: - return normalized || '-' - } -} - -export function formatRedeemResolutionStatus(value: string) { - return value === 'success' ? '已完成' : value === 'failed' ? '失败收口' : value || '-' -} - -export function formatKuaishouRoleInfoLabel(value: string) { - const normalized = String(value || '').trim() - - switch (normalized) { - case 'name': - return '角色名称' - case 'rid': - return '角色 ID' - default: - return normalized || '-' - } -} - -export function formatTaskEventPayload(payload: Record) { - const parts = [ - payload.outcome ? `结果 ${payload.outcome}` : '', - payload.resultCode ? `代码 ${payload.resultCode}` : '', - payload.resultMessage ? `说明 ${payload.resultMessage}` : '', - payload.codeMasked ? `凭据 ${payload.codeMasked}` : '', - payload.previousCodeMasked ? `旧码 ${payload.previousCodeMasked}` : '', - payload.nextCodeMasked ? `新码 ${payload.nextCodeMasked}` : '', - payload.ticketCodeMasked ? `卡券号 ${payload.ticketCodeMasked}` : '', - payload.vnId ? `虚拟号 #${payload.vnId}` : '', - payload.oldVnId ? `旧虚拟号 #${payload.oldVnId}` : '', - payload.vnPhoneMasked ? `号码 ${payload.vnPhoneMasked}` : '', - payload.oldVnPhoneMasked ? `旧号码 ${payload.oldVnPhoneMasked}` : '', - payload.oldRoleName ? `旧角色 ${payload.oldRoleName}` : '', - payload.oldRoleId ? `旧角色ID ${payload.oldRoleId}` : '', - payload.attempt ? `第 ${payload.attempt} 次` : '', - payload.bindUrl ? `绑定链接 ${payload.bindUrl}` : '', - payload.sendType ? `发送类型 ${payload.sendType}` : '', - payload.note ? `备注 ${payload.note}` : '', - payload.previousOutcome - ? `切换原因 ${formatRedeemOutcomeLabel(String(payload.previousOutcome || ''))}` - : '', - payload.deliveryReference ? `单号 ${payload.deliveryReference}` : '', - payload.platformOrderId ? `平台单 ${payload.platformOrderId}` : '', - payload.trigger ? `触发 ${payload.trigger}` : '', - payload.reason ? `原因 ${payload.reason}` : '', - payload.purchaseTriggered === true ? '已触发购买' : '', - payload.usedKnapsack === true ? '使用背包库存' : '', - payload.responseStatus ? `HTTP ${payload.responseStatus}` : '', - payload.requestId ? `请求 ${payload.requestId}` : '', - payload.errorMessage ? `错误 ${payload.errorMessage}` : '', - ].filter(Boolean) - - if (parts.length > 0) { - return parts.join(' · ') - } - - return JSON.stringify(payload || {}) -} diff --git a/apps/frontend-vue/src/utils/admin-options.ts b/apps/frontend-vue/src/utils/admin-options.ts deleted file mode 100644 index 5abb1c10..00000000 --- a/apps/frontend-vue/src/utils/admin-options.ts +++ /dev/null @@ -1,52 +0,0 @@ -export const adminPayStatusOptions = [ - { label: '全部', value: '' }, - { label: '未支付', value: 'unpaid' }, - { label: '已支付', value: 'paid' }, - { label: '失败', value: 'failed' }, - { label: '已退款', value: 'refunded' }, -] - -export const adminTaskStatusOptions = [ - { label: '全部', value: '' }, - { label: '待支付', value: 'pending_payment' }, - { label: '已支付', value: 'paid' }, - { label: '已生成链接', value: 'link_generated' }, - { label: '已创建会话', value: 'claimed' }, - { label: '已确认角色', value: 'role_confirmed' }, - { label: '兑换中', value: 'redeeming' }, - { label: '已兑换', value: 'redeemed' }, - { label: '待重试', value: 'retry_pending' }, - { label: '人工处理', value: 'manual_review' }, - { label: '已过期', value: 'expired' }, - { label: '已关闭', value: 'closed' }, -] - -export const adminUserRoleOptions = [ - { label: '全部', value: '' }, - { label: '管理员', value: 'admin' }, - { label: '普通运营', value: 'operator' }, - { label: '客服', value: 'support' }, -] - -export const adminUserStatusOptions = [ - { label: '全部', value: '' }, - { label: '生效中', value: 'active' }, - { label: '已停用', value: 'disabled' }, -] - -export const adminAuditActionOptions = [ - { label: '全部', value: '' }, - { label: '创建后台用户', value: 'admin_user_created' }, - { label: '修改用户角色', value: 'admin_user_role_updated' }, - { label: '修改用户状态', value: 'admin_user_status_updated' }, - { label: '重置用户密码', value: 'admin_user_password_reset' }, - { label: '换绑角色', value: 'task_kuaishou_cloud_rebind_role' }, - { label: '关闭任务', value: 'task_closed' }, - { label: '转人工处理', value: 'task_mark_manual_review' }, -] - -export const adminAuditTargetTypeOptions = [ - { label: '全部', value: '' }, - { label: '后台用户', value: 'admin_user' }, - { label: '交付任务', value: 'task' }, -] diff --git a/apps/frontend-vue/src/utils/admin-time.ts b/apps/frontend-vue/src/utils/admin-time.ts deleted file mode 100644 index b3696153..00000000 --- a/apps/frontend-vue/src/utils/admin-time.ts +++ /dev/null @@ -1 +0,0 @@ -export { formatDateTime as formatAdminDateTime } from '@/utils/date-time' diff --git a/apps/frontend-vue/src/utils/date-time.ts b/apps/frontend-vue/src/utils/date-time.ts deleted file mode 100644 index 1567b29f..00000000 --- a/apps/frontend-vue/src/utils/date-time.ts +++ /dev/null @@ -1,54 +0,0 @@ -const ISO_DATE_TIME_PATTERN = - /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?$/ - -export function isIsoDateTimeString(value: unknown): value is string { - return typeof value === 'string' && ISO_DATE_TIME_PATTERN.test(value.trim()) -} - -export function formatDateTime(value: string | null | undefined, fallback = '-') { - const normalized = String(value || '').trim() - - if (!normalized) { - return fallback - } - - const date = new Date(normalized) - - if (Number.isNaN(date.getTime())) { - return normalized.replace('T', ' ').replace('Z', '') - } - - const year = date.getFullYear() - const month = String(date.getMonth() + 1).padStart(2, '0') - const day = String(date.getDate()).padStart(2, '0') - const hours = String(date.getHours()).padStart(2, '0') - const minutes = String(date.getMinutes()).padStart(2, '0') - const seconds = String(date.getSeconds()).padStart(2, '0') - - return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}` -} - -export function normalizeDateTimeValue(value: unknown): unknown { - if (Array.isArray(value)) { - return value.map((item) => normalizeDateTimeValue(item)) - } - - if (value && typeof value === 'object') { - return Object.fromEntries( - Object.entries(value).map(([key, currentValue]) => [ - key, - normalizeDateTimeValue(currentValue), - ]), - ) - } - - if (isIsoDateTimeString(value)) { - return formatDateTime(value, '') - } - - return value -} - -export function stringifyDisplayJson(value: unknown, space = 2) { - return JSON.stringify(normalizeDateTimeValue(value), null, space) -} diff --git a/apps/frontend-vue/src/views/NotFoundView.vue b/apps/frontend-vue/src/views/NotFoundView.vue deleted file mode 100644 index 50882789..00000000 --- a/apps/frontend-vue/src/views/NotFoundView.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - diff --git a/apps/frontend-vue/src/views/admin/audit-logs/AdminAuditLogsView.vue b/apps/frontend-vue/src/views/admin/audit-logs/AdminAuditLogsView.vue deleted file mode 100644 index 8c70c47c..00000000 --- a/apps/frontend-vue/src/views/admin/audit-logs/AdminAuditLogsView.vue +++ /dev/null @@ -1,214 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/auth/AdminLoginView.vue b/apps/frontend-vue/src/views/admin/auth/AdminLoginView.vue deleted file mode 100644 index 1c7c66f9..00000000 --- a/apps/frontend-vue/src/views/admin/auth/AdminLoginView.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/cloudtentacles-records/AdminCloudtentaclesRecordsView.vue b/apps/frontend-vue/src/views/admin/cloudtentacles-records/AdminCloudtentaclesRecordsView.vue deleted file mode 100644 index 25a5f6f3..00000000 --- a/apps/frontend-vue/src/views/admin/cloudtentacles-records/AdminCloudtentaclesRecordsView.vue +++ /dev/null @@ -1,649 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/dashboard/AdminDashboardView.vue b/apps/frontend-vue/src/views/admin/dashboard/AdminDashboardView.vue deleted file mode 100644 index 4d73b0ec..00000000 --- a/apps/frontend-vue/src/views/admin/dashboard/AdminDashboardView.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/fulfillment/AdminFulfillmentConfigHubView.vue b/apps/frontend-vue/src/views/admin/fulfillment/AdminFulfillmentConfigHubView.vue deleted file mode 100644 index b51c35c8..00000000 --- a/apps/frontend-vue/src/views/admin/fulfillment/AdminFulfillmentConfigHubView.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillment.css b/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillment.css deleted file mode 100644 index 31127b27..00000000 --- a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillment.css +++ /dev/null @@ -1,271 +0,0 @@ -.admin-panel { - display: grid; - gap: var(--space-4); -} - -.fulfillment-simple-page { - min-width: 0; -} - -.fulfillment-overview { - display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)) minmax(120px, auto); - gap: var(--space-3); - align-items: stretch; -} - -.metric-card { - display: grid; - gap: var(--space-2); - min-width: 0; - padding: var(--space-4); - border: 1px solid var(--border-default); - border-radius: var(--radius-md); - background: var(--bg-surface); -} - -.metric-card span { - color: var(--text-secondary); - font-size: var(--text-sm); -} - -.metric-card strong { - color: var(--text-primary); - font-size: var(--text-2xl); - line-height: 1.1; -} - -.overview-actions { - display: flex; - justify-content: flex-end; - align-items: center; -} - -.fulfillment-layout { - display: grid; - grid-template-columns: minmax(240px, 300px) minmax(0, 1fr); - gap: var(--space-4); - align-items: start; -} - -.source-panel, -.catalog-panel { - min-width: 0; - border: 1px solid var(--border-default); - border-radius: var(--radius-md); - background: var(--bg-surface); -} - -.source-panel { - display: grid; - gap: var(--space-3); - padding: var(--space-4); -} - -.catalog-panel { - display: grid; - gap: var(--space-4); - padding: var(--space-4); -} - -.section-head { - display: grid; - gap: var(--space-1); -} - -.section-head h3 { - margin: 0; - color: var(--text-primary); - font-size: var(--text-lg); - font-weight: 700; -} - -.section-head p { - margin: 0; - color: var(--text-secondary); - font-size: var(--text-sm); -} - -.source-list { - display: grid; - gap: var(--space-2); -} - -.source-item { - display: flex; - width: 100%; - min-width: 0; - justify-content: space-between; - gap: var(--space-3); - align-items: center; - padding: var(--space-3); - border: 1px solid var(--border-default); - border-radius: var(--radius-sm); - background: var(--bg-surface); - color: inherit; - text-align: left; - cursor: pointer; -} - -.source-item:hover, -.source-item--active { - border-color: var(--color-primary); - background: var(--bg-subtle); -} - -.source-item span { - display: grid; - gap: 4px; - min-width: 0; -} - -.source-item strong, -.source-item small { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.source-item strong { - color: var(--text-primary); -} - -.source-item small { - color: var(--text-secondary); -} - -.catalog-toolbar { - display: flex; - justify-content: space-between; - gap: var(--space-3); - align-items: flex-start; -} - -.catalog-toolbar-actions { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - justify-content: flex-end; -} - -.match-checker { - display: grid; - grid-template-columns: minmax(260px, 1fr) auto; - gap: var(--space-3); - align-items: center; - padding: var(--space-3); - border: 1px solid var(--border-default); - border-radius: var(--radius-md); - background: var(--bg-subtle); -} - -.sku-table { - width: 100%; -} - -.sku-list-panel { - display: grid; - gap: var(--space-3); - min-width: 0; - padding-top: var(--space-2); - border-top: 1px solid var(--border-default); -} - -.sku-name-cell { - display: grid; - gap: 4px; - min-width: 0; -} - -.sku-name-cell strong { - color: var(--text-primary); -} - -.sku-name-cell small { - color: var(--text-secondary); - line-height: 1.5; -} - -.match-name { - display: inline-block; - max-width: 100%; - padding: 2px 6px; - border-radius: var(--radius-sm); - background: var(--bg-subtle); - color: var(--text-primary); - white-space: normal; - word-break: break-all; -} - -.override-panel { - display: grid; - gap: var(--space-4); - min-width: 0; - padding: var(--space-4); - border: 1px solid var(--border-default); - border-radius: var(--radius-md); - background: var(--bg-subtle); -} - -.override-actions { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - justify-content: flex-end; - align-items: center; -} - -.override-rule-list { - display: grid; - gap: var(--space-3); -} - -.override-rule-item { - display: grid; - gap: var(--space-3); - min-width: 0; - padding: var(--space-3); - border: 1px solid var(--border-default); - border-radius: var(--radius-md); - background: var(--bg-surface); -} - -.override-rule-head { - display: grid; - grid-template-columns: auto minmax(220px, 1fr) minmax(160px, 220px) auto; - gap: var(--space-2); - align-items: center; -} - -.delivery-item-list { - display: grid; - gap: var(--space-2); -} - -.delivery-item-row { - display: grid; - grid-template-columns: minmax(220px, 1.1fr) minmax(180px, 1fr) 120px auto; - gap: var(--space-2); - align-items: center; -} - -@media (max-width: 960px) { - .fulfillment-overview, - .fulfillment-layout, - .match-checker, - .override-rule-head, - .delivery-item-row { - grid-template-columns: 1fr; - } - - .overview-actions, - .catalog-toolbar, - .catalog-toolbar-actions, - .override-actions { - justify-content: stretch; - } - - .catalog-toolbar { - flex-direction: column; - } -} diff --git a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillmentView.vue b/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillmentView.vue deleted file mode 100644 index f9653ff3..00000000 --- a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-cloud/AdminKuaishouCloudFulfillmentView.vue +++ /dev/null @@ -1,545 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-feifei/AdminKuaishouFeifeiFulfillmentView.vue b/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-feifei/AdminKuaishouFeifeiFulfillmentView.vue deleted file mode 100644 index 7df3ae92..00000000 --- a/apps/frontend-vue/src/views/admin/fulfillment/kuaishou-feifei/AdminKuaishouFeifeiFulfillmentView.vue +++ /dev/null @@ -1,349 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/layout/AdminLayout.vue b/apps/frontend-vue/src/views/admin/layout/AdminLayout.vue deleted file mode 100644 index d39a67a9..00000000 --- a/apps/frontend-vue/src/views/admin/layout/AdminLayout.vue +++ /dev/null @@ -1,450 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/orders/AdminOrderDetailView.vue b/apps/frontend-vue/src/views/admin/orders/AdminOrderDetailView.vue deleted file mode 100644 index 6e1c3192..00000000 --- a/apps/frontend-vue/src/views/admin/orders/AdminOrderDetailView.vue +++ /dev/null @@ -1,487 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/orders/AdminOrdersView.vue b/apps/frontend-vue/src/views/admin/orders/AdminOrdersView.vue deleted file mode 100644 index 6d78eb19..00000000 --- a/apps/frontend-vue/src/views/admin/orders/AdminOrdersView.vue +++ /dev/null @@ -1,471 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/AdminPlatformShopsView.vue b/apps/frontend-vue/src/views/admin/platform-shops/AdminPlatformShopsView.vue deleted file mode 100644 index 50bbb55b..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/AdminPlatformShopsView.vue +++ /dev/null @@ -1,539 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/AdminPlatformNinetyoneSection.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/AdminPlatformNinetyoneSection.vue deleted file mode 100644 index 3e4b4214..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/AdminPlatformNinetyoneSection.vue +++ /dev/null @@ -1,160 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesConfigCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesConfigCard.vue deleted file mode 100644 index e7630d18..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesConfigCard.vue +++ /dev/null @@ -1,623 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesDebugCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesDebugCard.vue deleted file mode 100644 index 58bec998..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesDebugCard.vue +++ /dev/null @@ -1,267 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesInfoCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesInfoCard.vue deleted file mode 100644 index 89fcd93b..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesInfoCard.vue +++ /dev/null @@ -1,237 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesResultCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesResultCard.vue deleted file mode 100644 index 4b00a782..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminCloudtentaclesResultCard.vue +++ /dev/null @@ -1,72 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminPlatformCloudtentaclesSection.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminPlatformCloudtentaclesSection.vue deleted file mode 100644 index eb385475..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/cloudtentacles/AdminPlatformCloudtentaclesSection.vue +++ /dev/null @@ -1,152 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketDebug.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketDebug.vue deleted file mode 100644 index f74a19ed..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketDebug.vue +++ /dev/null @@ -1,276 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketInfoCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketInfoCard.vue deleted file mode 100644 index db756f30..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketInfoCard.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketResults.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketResults.vue deleted file mode 100644 index 17ea0075..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketResults.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketShopConfig.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketShopConfig.vue deleted file mode 100644 index 04958c50..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminKuaishouEticketShopConfig.vue +++ /dev/null @@ -1,470 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminPlatformKuaishouEticketSection.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminPlatformKuaishouEticketSection.vue deleted file mode 100644 index b2169054..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-eticket/AdminPlatformKuaishouEticketSection.vue +++ /dev/null @@ -1,103 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-feifei/AdminPlatformKuaishouFeifeiSection.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-feifei/AdminPlatformKuaishouFeifeiSection.vue deleted file mode 100644 index 60b2b30a..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/kuaishou-feifei/AdminPlatformKuaishouFeifeiSection.vue +++ /dev/null @@ -1,814 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationBarkCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationBarkCard.vue deleted file mode 100644 index b19c75ea..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationBarkCard.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationInfoCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationInfoCard.vue deleted file mode 100644 index a6e18474..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationInfoCard.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationScheduledJobsCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationScheduledJobsCard.vue deleted file mode 100644 index 0d66577e..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationScheduledJobsCard.vue +++ /dev/null @@ -1,548 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationTestCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationTestCard.vue deleted file mode 100644 index be099f27..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationTestCard.vue +++ /dev/null @@ -1,157 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationWpushCard.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationWpushCard.vue deleted file mode 100644 index 5c741d8a..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminNotificationWpushCard.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminPlatformNotificationSection.vue b/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminPlatformNotificationSection.vue deleted file mode 100644 index 07b00bcb..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/components/notification/AdminPlatformNotificationSection.vue +++ /dev/null @@ -1,130 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/cloudtentaclesDefaults.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/cloudtentaclesDefaults.ts deleted file mode 100644 index 392fa915..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/composables/cloudtentaclesDefaults.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const DEFAULT_CLOUDTENTACLES_DEVICE_ID = - '08bc9d8c-fd15-48ea-bc00-8d754076cafc' -export const DEFAULT_CLOUDTENTACLES_DEVICE_TYPE = 1 - -export function normalizeCloudtentaclesDeviceId(value: unknown) { - const normalized = String(value || '').trim() - return normalized && normalized !== '-' ? normalized : DEFAULT_CLOUDTENTACLES_DEVICE_ID -} - -export function normalizeCloudtentaclesDeviceType(value: unknown) { - const parsed = Number(value) - return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_CLOUDTENTACLES_DEVICE_TYPE -} diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/types.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/types.ts deleted file mode 100644 index 4e014ace..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/composables/types.ts +++ /dev/null @@ -1,50 +0,0 @@ -export type PlatformTab = - | 'notifications' - | 'ninetyone' - | 'kuaishouEticket' - | 'kuaishouFeifei' - | 'cloudtentacles' - -export type EditableKuaishouEticketShop = { - id: string - shopId: string - kshopName: string - cookie: string - userAvatar: string - enabled: boolean -} - -export type EditableNotificationRecipient = { - id: string - name: string - deviceKey: string - enabled: boolean -} - -export type EditableWpushRecipient = { - id: string - name: string - apiKey: string - enabled: boolean -} - -export type EditableScheduledJob = { - id: string - type: string - enabled: boolean - intervalSeconds: number - intervalSecondsAmount: number - intervalSecondsUnit: number - cooldownSeconds: number - cooldownSecondsAmount: number - cooldownSecondsUnit: number - assetThreshold: number - accounts: EditableScheduledJobAccount[] -} - -export type EditableScheduledJobAccount = { - sourceKey: string - label: string - enabled: boolean - assetThreshold: number -} diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminCloudtentaclesPlatform.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminCloudtentaclesPlatform.ts deleted file mode 100644 index 61213af8..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminCloudtentaclesPlatform.ts +++ /dev/null @@ -1,498 +0,0 @@ -import { computed, ref } from 'vue' - -import { showError, showPrompt, showSuccess, isFeedbackDismissed } from '@/lib/feedback' -import { - deleteAdminCloudtentaclesSource, - saveAdminCloudtentaclesSourceConfig, - sendAdminCloudtentaclesSmsCode, - testAdminCloudtentaclesLogin, - validateAdminCloudtentaclesSession, -} from '@/services/admin' -import type { - AdminCloudtentaclesLoginTestResult, - AdminCloudtentaclesPersistedSession, - AdminCloudtentaclesSendSmsResult, - AdminCloudtentaclesSourceItem, - AdminCloudtentaclesSessionsMap, - AdminCloudtentaclesSourceConfigResponse, - AdminCloudtentaclesSourcesConfig, - AdminCloudtentaclesValidateSessionResult, -} from '@/types/admin' - -import type { CloudtentaclesForm } from './useCloudtentaclesDebugActions' -import { - DEFAULT_CLOUDTENTACLES_DEVICE_ID, - DEFAULT_CLOUDTENTACLES_DEVICE_TYPE, - normalizeCloudtentaclesDeviceId, - normalizeCloudtentaclesDeviceType, -} from './cloudtentaclesDefaults' -import { useCloudtentaclesDebugActions } from './useCloudtentaclesDebugActions' - -export function useAdminCloudtentaclesPlatform() { - const cloudtentaclesFilePath = ref('') - const cloudtentaclesSessionFilePath = ref('') - const selectedSourceKey = ref('') - - const sources = ref([]) - const sessions = ref({}) - - const cloudtentaclesForm = ref({ - baseUrl: 'https://123.207.217.176', - username: '', - password: '', - phone: '', - code: '', - token: '', - vnKey: '1', - vnId: 0, - skuId: 5, - skuCount: 1, - deviceId: DEFAULT_CLOUDTENTACLES_DEVICE_ID, - deviceType: DEFAULT_CLOUDTENTACLES_DEVICE_TYPE, - }) - const cloudtentaclesSaving = ref(false) - const cloudtentaclesSendingSms = ref(false) - const cloudtentaclesTesting = ref(false) - const cloudtentaclesValidating = ref(false) - const cloudtentaclesResultError = ref('') - const cloudtentaclesSmsResult = ref(null) - const cloudtentaclesLoginResult = ref(null) - const cloudtentaclesValidateResult = ref(null) - const cloudtentaclesPersistedSession = ref(null) - - const debugActions = useCloudtentaclesDebugActions( - cloudtentaclesForm, - cloudtentaclesResultError, - selectedSourceKey, - ) - - const sourceOptions = computed(() => sources.value.map((s) => ({ key: s.key, label: s.label }))) - - const currentSource = computed( - () => sources.value.find((s) => s.key === selectedSourceKey.value) || sources.value[0], - ) - - const currentSession = computed(() => sessions.value[selectedSourceKey.value] || null) - const currentSourceEnabled = computed({ - get: () => currentSource.value?.enabled !== false, - set: (value: boolean) => { - const source = sources.value.find((item) => item.key === selectedSourceKey.value) - if (source) { - source.enabled = value - } - }, - }) - - const cloudtentaclesStats = computed(() => ({ - hasCredential: Boolean( - cloudtentaclesForm.value.username.trim() && - cloudtentaclesForm.value.password.trim() && - cloudtentaclesForm.value.phone.trim(), - ), - smsSent: Boolean(cloudtentaclesSmsResult.value), - validated: Boolean(cloudtentaclesValidateResult.value || cloudtentaclesLoginResult.value), - sourceCount: sources.value.length, - })) - - function createSourceLabel(index: number) { - return `履约账号 ${index}` - } - - function generateSourceKey() { - let key = '' - do { - key = `account_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}` - } while (sources.value.some((source) => source.key === key)) - return key - } - - function createEmptySource(label = createSourceLabel(sources.value.length + 1)) { - return { - key: generateSourceKey(), - label, - enabled: true, - baseUrl: 'https://123.207.217.176', - username: '', - password: '', - phone: '', - deviceId: DEFAULT_CLOUDTENTACLES_DEVICE_ID, - deviceType: DEFAULT_CLOUDTENTACLES_DEVICE_TYPE, - } satisfies AdminCloudtentaclesSourceItem - } - - function resetCloudtentaclesTransientState() { - cloudtentaclesSmsResult.value = null - cloudtentaclesLoginResult.value = null - cloudtentaclesValidateResult.value = null - cloudtentaclesResultError.value = '' - } - - function persistCurrentFormToSelectedSource() { - const source = sources.value.find((item) => item.key === selectedSourceKey.value) - if (!source) return - - source.baseUrl = cloudtentaclesForm.value.baseUrl.trim() || 'https://123.207.217.176' - source.username = cloudtentaclesForm.value.username.trim() - source.password = cloudtentaclesForm.value.password.trim() - source.phone = cloudtentaclesForm.value.phone.trim() - source.deviceId = normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId) - source.deviceType = normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType) - } - - function selectFallbackSource(preferredKey = '') { - const preferred = sources.value.find((source) => source.key === preferredKey) - selectedSourceKey.value = preferred?.key || sources.value[0]?.key || '' - } - - function hydrateCloudtentaclesConfig(data: AdminCloudtentaclesSourceConfigResponse) { - cloudtentaclesFilePath.value = data.filePath - cloudtentaclesSessionFilePath.value = data.sessionFilePath - sources.value = data.sources || [] - sessions.value = data.sessions || {} - - if (!sources.value.length) { - sources.value.push(createEmptySource()) - } - - if (!sources.value.find((s) => s.key === selectedSourceKey.value)) { - selectFallbackSource() - } - - hydrateFormFromSource(selectedSourceKey.value) - } - - function hydrateFormFromSource(sourceKey: string) { - const source = sources.value.find((s) => s.key === sourceKey) - const session = sessions.value[sourceKey] - if (source) { - cloudtentaclesForm.value = { - baseUrl: source.baseUrl || 'https://123.207.217.176', - username: source.username || '', - password: source.password || '', - phone: source.phone || '', - code: '', - token: session?.token || '', - vnKey: '1', - vnId: 0, - skuId: 5, - skuCount: 1, - deviceId: normalizeCloudtentaclesDeviceId(source.deviceId), - deviceType: normalizeCloudtentaclesDeviceType(source.deviceType), - } - } - cloudtentaclesPersistedSession.value = session || null - } - - function switchSource(sourceKey: string) { - if (sourceKey === selectedSourceKey.value) return - if (!sources.value.some((source) => source.key === sourceKey)) return - - persistCurrentFormToSelectedSource() - selectedSourceKey.value = sourceKey - resetCloudtentaclesTransientState() - hydrateFormFromSource(sourceKey) - } - - async function addSource() { - try { - const result = await showPrompt( - '请输入账号显示名称(例如:生产履约号、夜班履约号)', - '新增 cloudtentacles 账号', - { - inputPattern: /\S/, - inputErrorMessage: '账号名称不能为空', - }, - ) - const trimmed = (result.value as string).trim() - if (!trimmed) { - showError('账号名称不能为空') - return - } - persistCurrentFormToSelectedSource() - const newSource = createEmptySource(trimmed) - sources.value.push(newSource) - selectedSourceKey.value = newSource.key - resetCloudtentaclesTransientState() - hydrateFormFromSource(newSource.key) - } catch (error) { - if (isFeedbackDismissed(error)) return // user cancelled / closed - showError(error instanceof Error ? error.message : '新增账号失败') - } - } - - async function removeSource(sourceKey: string) { - const sourceIndex = sources.value.findIndex((source) => source.key === sourceKey) - if (sourceIndex < 0) { - showError('账号不存在') - return - } - - try { - cloudtentaclesSaving.value = true - persistCurrentFormToSelectedSource() - - if (sources.value.length === 1) { - const replacement = createEmptySource() - const response = await saveAdminCloudtentaclesSourceConfig({ - enabled: true, - sources: [replacement], - }) - cloudtentaclesFilePath.value = response.data.filePath - cloudtentaclesSessionFilePath.value = response.data.sessionFilePath - sources.value = response.data.sources - sessions.value = response.data.sessions - selectFallbackSource(replacement.key) - } else { - await deleteAdminCloudtentaclesSource(sourceKey) - sources.value = sources.value.filter((s) => s.key !== sourceKey) - delete sessions.value[sourceKey] - - if (selectedSourceKey.value === sourceKey) { - const nextSource = sources.value[sourceIndex] || sources.value[sourceIndex - 1] || sources.value[0] - selectFallbackSource(nextSource?.key) - } - } - resetCloudtentaclesTransientState() - hydrateFormFromSource(selectedSourceKey.value) - showSuccess('账号已删除') - } catch (error) { - showError(error instanceof Error ? error.message : '删除账号失败') - } finally { - cloudtentaclesSaving.value = false - } - } - - function buildCloudtentaclesConfigPayload(): AdminCloudtentaclesSourcesConfig { - persistCurrentFormToSelectedSource() - return { - enabled: true, - sources: sources.value.map((s) => ({ - key: s.key, - label: s.label, - enabled: s.enabled !== false, - baseUrl: s.baseUrl, - username: s.username, - password: s.password, - phone: s.phone, - deviceId: s.deviceId, - deviceType: s.deviceType, - })), - } - } - - function buildCloudtentaclesLoginPayload() { - return { - ...buildCloudtentaclesSourcePayload(), - code: cloudtentaclesForm.value.code.trim(), - sourceKey: selectedSourceKey.value, - } - } - - function buildCloudtentaclesSourcePayload() { - return { - baseUrl: cloudtentaclesForm.value.baseUrl.trim() || 'https://123.207.217.176', - username: cloudtentaclesForm.value.username.trim(), - password: cloudtentaclesForm.value.password.trim(), - phone: cloudtentaclesForm.value.phone.trim(), - deviceId: normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId), - deviceType: normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType), - sourceKey: selectedSourceKey.value, - } - } - - function ensureCloudtentaclesBaseFields() { - if (!cloudtentaclesForm.value.username.trim() || !cloudtentaclesForm.value.phone.trim()) { - cloudtentaclesResultError.value = '请先填写 cloudtentacles 账号和手机号' - return false - } - return true - } - - function ensureCloudtentaclesLoginFields() { - if ( - !cloudtentaclesForm.value.username.trim() || - !cloudtentaclesForm.value.password.trim() || - !cloudtentaclesForm.value.phone.trim() - ) { - cloudtentaclesResultError.value = '请先填写 cloudtentacles 账号、密码和手机号' - return false - } - - if (!cloudtentaclesForm.value.code.trim()) { - cloudtentaclesResultError.value = '请先填写短信验证码' - return false - } - - return true - } - - async function handleCloudtentaclesSaveSource() { - cloudtentaclesSaving.value = true - cloudtentaclesResultError.value = '' - - try { - const response = await saveAdminCloudtentaclesSourceConfig(buildCloudtentaclesConfigPayload()) - cloudtentaclesFilePath.value = response.data.filePath - cloudtentaclesSessionFilePath.value = response.data.sessionFilePath - sources.value = response.data.sources - sessions.value = response.data.sessions - const session = sessions.value[selectedSourceKey.value] - cloudtentaclesPersistedSession.value = session || null - cloudtentaclesForm.value.token = session?.token || '' - showSuccess('cloudtentacles 履约平台配置已保存') - } catch (error) { - cloudtentaclesResultError.value = - error instanceof Error ? error.message : 'cloudtentacles 配置保存失败' - showError(cloudtentaclesResultError.value) - } finally { - cloudtentaclesSaving.value = false - } - } - - async function handleCloudtentaclesSendSmsCode() { - if (!ensureCloudtentaclesBaseFields()) { - return - } - - cloudtentaclesSendingSms.value = true - cloudtentaclesResultError.value = '' - - try { - const response = await sendAdminCloudtentaclesSmsCode(buildCloudtentaclesSourcePayload()) - cloudtentaclesSmsResult.value = response.data - showSuccess('cloudtentacles 短信验证码已发送') - } catch (error) { - cloudtentaclesResultError.value = - error instanceof Error ? error.message : 'cloudtentacles 发送短信验证码失败' - showError(cloudtentaclesResultError.value) - } finally { - cloudtentaclesSendingSms.value = false - } - } - - async function handleCloudtentaclesTestLogin() { - if (!ensureCloudtentaclesLoginFields()) { - return - } - - cloudtentaclesTesting.value = true - cloudtentaclesResultError.value = '' - - try { - const response = await testAdminCloudtentaclesLogin(buildCloudtentaclesLoginPayload()) - cloudtentaclesLoginResult.value = response.data - cloudtentaclesForm.value.token = response.data.token || cloudtentaclesForm.value.token - cloudtentaclesPersistedSession.value = { - token: response.data.token || '', - tokenMasked: response.data.session.tokenMasked, - baseUrl: response.data.baseUrl, - username: response.data.username, - phoneMasked: response.data.phoneMasked, - loggedInAt: response.data.loggedInAt, - deviceId: normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId), - deviceType: normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType), - hasToken: Boolean(response.data.token), - } - // Update sessions map - sessions.value[selectedSourceKey.value] = cloudtentaclesPersistedSession.value - showSuccess('cloudtentacles 登录测试成功') - } catch (error) { - cloudtentaclesResultError.value = - error instanceof Error ? error.message : 'cloudtentacles 登录测试失败' - showError(cloudtentaclesResultError.value) - } finally { - cloudtentaclesTesting.value = false - } - } - - async function handleCloudtentaclesValidateSession() { - const token = cloudtentaclesForm.value.token.trim() - if (!token) { - cloudtentaclesResultError.value = '请先填写 token' - return - } - - cloudtentaclesValidating.value = true - cloudtentaclesResultError.value = '' - - try { - const response = await validateAdminCloudtentaclesSession({ - baseUrl: cloudtentaclesForm.value.baseUrl.trim() || 'https://123.207.217.176', - token, - deviceId: normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId), - deviceType: normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType), - sourceKey: selectedSourceKey.value, - }) - cloudtentaclesValidateResult.value = response.data - cloudtentaclesPersistedSession.value = { - token, - tokenMasked: response.data.session.tokenMasked, - baseUrl: response.data.baseUrl, - username: - cloudtentaclesPersistedSession.value?.username || - cloudtentaclesForm.value.username.trim(), - phoneMasked: cloudtentaclesPersistedSession.value?.phoneMasked || '', - loggedInAt: response.data.loggedInAt, - deviceId: normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId), - deviceType: normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType), - hasToken: Boolean(token), - } - // Update sessions map - sessions.value[selectedSourceKey.value] = cloudtentaclesPersistedSession.value - showSuccess('cloudtentacles 会话校验成功') - } catch (error) { - cloudtentaclesResultError.value = - error instanceof Error ? error.message : 'cloudtentacles 会话校验失败' - showError(cloudtentaclesResultError.value) - } finally { - cloudtentaclesValidating.value = false - } - } - - return { - cloudtentaclesFilePath, - cloudtentaclesSessionFilePath, - cloudtentaclesForm, - cloudtentaclesSaving, - cloudtentaclesSendingSms, - cloudtentaclesTesting, - cloudtentaclesValidating, - cloudtentaclesResultError, - cloudtentaclesSmsResult, - cloudtentaclesLoginResult, - cloudtentaclesValidateResult, - cloudtentaclesDebugLoading: debugActions.cloudtentaclesDebugLoading, - cloudtentaclesDebugResult: debugActions.cloudtentaclesDebugResult, - cloudtentaclesPersistedSession, - cloudtentaclesStats, - sources, - sessions, - selectedSourceKey, - sourceOptions, - currentSource, - currentSession, - currentSourceEnabled, - hydrateCloudtentaclesConfig, - switchSource, - addSource, - removeSource, - handleCloudtentaclesSaveSource, - handleCloudtentaclesSendSmsCode, - handleCloudtentaclesTestLogin, - handleCloudtentaclesValidateSession, - handleCloudtentaclesFetchAsset: debugActions.handleCloudtentaclesFetchAsset, - handleCloudtentaclesFetchCategories: debugActions.handleCloudtentaclesFetchCategories, - handleCloudtentaclesFetchSkuList: debugActions.handleCloudtentaclesFetchSkuList, - handleCloudtentaclesBuySku: debugActions.handleCloudtentaclesBuySku, - handleCloudtentaclesUseSku: debugActions.handleCloudtentaclesUseSku, - handleCloudtentaclesFetchKnapsack: debugActions.handleCloudtentaclesFetchKnapsack, - handleCloudtentaclesFetchVnList: debugActions.handleCloudtentaclesFetchVnList, - handleCloudtentaclesAppointVn: debugActions.handleCloudtentaclesAppointVn, - handleCloudtentaclesGenerateVnLoginCode: debugActions.handleCloudtentaclesGenerateVnLoginCode, - handleCloudtentaclesFetchVnCode: debugActions.handleCloudtentaclesFetchVnCode, - handleCloudtentaclesVerifyVnCode: debugActions.handleCloudtentaclesVerifyVnCode, - handleCloudtentaclesFetchBindUrl: debugActions.handleCloudtentaclesFetchBindUrl, - handleCloudtentaclesBackVn: debugActions.handleCloudtentaclesBackVn, - handleCloudtentaclesRunFullFlow: debugActions.handleCloudtentaclesRunFullFlow, - } -} diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminKuaishouEticketPlatform.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminKuaishouEticketPlatform.ts deleted file mode 100644 index eefa91d4..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminKuaishouEticketPlatform.ts +++ /dev/null @@ -1,328 +0,0 @@ -import { ref, computed } from 'vue' -import { showError, showSuccess } from '@/lib/feedback' -import { - consumeAdminKuaishouEticket, - queryAdminKuaishouEticketDetail, - queryAdminKuaishouEticketShopInfo, - saveAdminKuaishouEticketSourceConfig, -} from '@/services/admin' -import type { - AdminKuaishouEticketConsumeResult, - AdminKuaishouEticketDetailResult, - AdminKuaishouEticketShopInfoResult, - AdminKuaishouEticketSourceConfig, -} from '@/types/admin' -import type { EditableKuaishouEticketShop } from './types' -import { useKuaishouEticketShopManager } from './useKuaishouEticketShopManager' - -type KuaishouEticketForm = { - baseUrl: string - selectedShopId: string - queryTicketCode: string - eTicketId: string - oid: string - formToken: string - num: number - storeId: string -} - -export function useAdminKuaishouEticketPlatform() { - const shopManager = useKuaishouEticketShopManager() - - const kuaishouEticketFilePath = ref('') - const kuaishouEticketForm = ref({ - baseUrl: 'https://s.kwaixiaodian.com', - selectedShopId: '', - queryTicketCode: '', - eTicketId: '', - oid: '', - formToken: '', - num: 1, - storeId: '0', - }) - const kuaishouEticketSaving = ref(false) - const kuaishouEticketResolvingShopId = ref('') - const kuaishouEticketDetailing = ref(false) - const kuaishouEticketConsuming = ref(false) - const kuaishouEticketResultError = ref('') - const kuaishouEticketShopInfoResult = ref(null) - const kuaishouEticketDetailResult = ref(null) - const kuaishouEticketConsumeResult = ref(null) - - const activeKuaishouEticketShop = computed( - () => - shopManager.kuaishouEticketShops.value.find( - (item) => item.id === kuaishouEticketForm.value.selectedShopId, - ) || null, - ) - - const kuaishouEticketStats = computed(() => ({ - configuredShopCount: shopManager.kuaishouEticketShops.value.length, - cookieReadyCount: shopManager.kuaishouEticketShops.value.filter((item) => item.cookie.trim()).length, - selectedShopReady: Boolean(activeKuaishouEticketShop.value?.cookie.trim()), - detailReady: Boolean(kuaishouEticketDetailResult.value?.detail), - consumed: Boolean(kuaishouEticketConsumeResult.value?.consumed), - })) - - function hydrateKuaishouEticketConfig(data: { - filePath: string - source: AdminKuaishouEticketSourceConfig - }) { - kuaishouEticketFilePath.value = data.filePath - shopManager.setShopsFromConfig(data.source.shops) - kuaishouEticketForm.value = { - baseUrl: data.source.baseUrl || 'https://s.kwaixiaodian.com', - selectedShopId: '', - queryTicketCode: '', - eTicketId: '', - oid: '', - formToken: '', - num: 1, - storeId: '0', - } - kuaishouEticketForm.value.selectedShopId = shopManager.kuaishouEticketShops.value[0]?.id || '' - } - - function buildKuaishouEticketConfigPayload(): AdminKuaishouEticketSourceConfig { - return { - enabled: true, - baseUrl: kuaishouEticketForm.value.baseUrl.trim() || 'https://s.kwaixiaodian.com', - shops: shopManager.kuaishouEticketShops.value.map((item) => ({ - shopId: item.shopId.trim(), - kshopName: item.kshopName.trim(), - cookie: item.cookie.trim(), - cookieMasked: '', - hasCookie: Boolean(item.cookie.trim()), - userAvatar: item.userAvatar.trim(), - enabled: item.enabled, - })), - } - } - - function addKuaishouEticketShop() { - const { newSelectedId } = shopManager.addKuaishouEticketShop() - setKuaishouEticketDebugShop(newSelectedId) - } - - function removeKuaishouEticketShop(id: string) { - kuaishouEticketForm.value.selectedShopId = shopManager.removeKuaishouEticketShop( - id, - kuaishouEticketForm.value.selectedShopId, - ) - } - - function setKuaishouEticketDebugShop(id: string) { - kuaishouEticketForm.value.selectedShopId = id - } - - function ensureSelectedKuaishouEticketShop() { - const selected = activeKuaishouEticketShop.value - - if (!selected) { - kuaishouEticketResultError.value = '请先新增并选择一个店铺配置' - return null - } - - if (!selected.cookie.trim()) { - kuaishouEticketResultError.value = '当前店铺缺少 Cookie,请先补全后再操作' - return null - } - - return selected - } - - function ensureKuaishouEticketQueryFields() { - const selected = ensureSelectedKuaishouEticketShop() - if (!selected) return false - - if (!kuaishouEticketForm.value.queryTicketCode.trim()) { - kuaishouEticketResultError.value = '请先填写查询券码' - return false - } - - return true - } - - function ensureKuaishouEticketConsumeFields() { - const selected = ensureSelectedKuaishouEticketShop() - if (!selected) return false - - if (!kuaishouEticketDetailResult.value?.detail) { - kuaishouEticketResultError.value = - '请先查询核销信息,系统会自动带出 eTicketId、oid 和 formToken' - return false - } - - return true - } - - function applyKuaishouEticketDetailToForm(result: AdminKuaishouEticketDetailResult | null) { - if (!result?.detail) { - return - } - - kuaishouEticketForm.value.eTicketId = - result.detail.eTicketId || kuaishouEticketForm.value.eTicketId - kuaishouEticketForm.value.oid = result.detail.oid || kuaishouEticketForm.value.oid - kuaishouEticketForm.value.formToken = - result.detail.formToken || kuaishouEticketForm.value.formToken - - const leftCount = Number(result.detail.leftCount || 0) - if (leftCount > 0) { - kuaishouEticketForm.value.num = leftCount - } - } - - async function handleKuaishouEticketResolveShopInfo(shop: EditableKuaishouEticketShop) { - if (!shop.cookie.trim()) { - kuaishouEticketResultError.value = '请先为该店铺粘贴 Cookie' - showError(kuaishouEticketResultError.value) - return - } - - kuaishouEticketResolvingShopId.value = shop.id - kuaishouEticketResultError.value = '' - - try { - const response = await queryAdminKuaishouEticketShopInfo({ - baseUrl: kuaishouEticketForm.value.baseUrl.trim() || 'https://s.kwaixiaodian.com', - shopId: shop.shopId.trim(), - cookie: shop.cookie.trim(), - }) - kuaishouEticketShopInfoResult.value = response.data - shop.shopId = response.data.shop.shopId || shop.shopId - shop.kshopName = response.data.shop.kshopName || shop.kshopName - shop.userAvatar = response.data.shop.userAvatar || shop.userAvatar - if (!kuaishouEticketForm.value.selectedShopId) { - setKuaishouEticketDebugShop(shop.id) - } - showSuccess( - `已识别店铺:${response.data.shop.kshopName || response.data.shop.shopId || '未知店铺'}`, - ) - } catch (error) { - kuaishouEticketResultError.value = - error instanceof Error ? error.message : '读取快手小店店铺信息失败' - showError(kuaishouEticketResultError.value) - } finally { - kuaishouEticketResolvingShopId.value = '' - } - } - - async function handleKuaishouEticketSaveSource() { - kuaishouEticketSaving.value = true - kuaishouEticketResultError.value = '' - - try { - const response = await saveAdminKuaishouEticketSourceConfig( - buildKuaishouEticketConfigPayload(), - ) - kuaishouEticketFilePath.value = response.data.filePath - kuaishouEticketForm.value.baseUrl = - response.data.source.baseUrl || 'https://s.kwaixiaodian.com' - const previousSelectedShopId = activeKuaishouEticketShop.value?.shopId || '' - shopManager.setShopsFromConfig(response.data.source.shops) - kuaishouEticketForm.value.selectedShopId = - shopManager.findShopByShopId(previousSelectedShopId)?.id || - shopManager.kuaishouEticketShops.value[0]?.id || - '' - showSuccess('快手小店核销配置已保存') - } catch (error) { - kuaishouEticketResultError.value = - error instanceof Error ? error.message : '快手小店核销配置保存失败' - showError(kuaishouEticketResultError.value) - } finally { - kuaishouEticketSaving.value = false - } - } - - async function handleKuaishouEticketQueryDetail() { - if (!ensureKuaishouEticketQueryFields()) { - return - } - - const selected = activeKuaishouEticketShop.value - kuaishouEticketDetailing.value = true - kuaishouEticketResultError.value = '' - kuaishouEticketConsumeResult.value = null - - try { - const response = await queryAdminKuaishouEticketDetail({ - baseUrl: kuaishouEticketForm.value.baseUrl.trim() || 'https://s.kwaixiaodian.com', - shopId: selected?.shopId.trim(), - cookie: selected?.cookie.trim(), - eTicketId: kuaishouEticketForm.value.queryTicketCode.trim(), - }) - kuaishouEticketDetailResult.value = response.data - applyKuaishouEticketDetailToForm(response.data) - showSuccess( - response.data.ok ? '核销信息查询成功' : response.data.errorMessage || '核销信息已返回', - ) - } catch (error) { - kuaishouEticketResultError.value = - error instanceof Error ? error.message : '查询快手小店核销信息失败' - showError(kuaishouEticketResultError.value) - } finally { - kuaishouEticketDetailing.value = false - } - } - - async function handleKuaishouEticketConsume() { - if (!ensureKuaishouEticketConsumeFields()) { - return - } - - const selected = activeKuaishouEticketShop.value - kuaishouEticketConsuming.value = true - kuaishouEticketResultError.value = '' - - try { - const detail = kuaishouEticketDetailResult.value?.detail - const response = await consumeAdminKuaishouEticket({ - baseUrl: kuaishouEticketForm.value.baseUrl.trim() || 'https://s.kwaixiaodian.com', - shopId: selected?.shopId.trim(), - cookie: selected?.cookie.trim(), - eTicketId: String(detail?.eTicketId || kuaishouEticketForm.value.eTicketId || '').trim(), - oid: String(detail?.oid || kuaishouEticketForm.value.oid || '').trim(), - formToken: String(detail?.formToken || kuaishouEticketForm.value.formToken || '').trim(), - num: Number(kuaishouEticketForm.value.num || 1), - storeId: kuaishouEticketForm.value.storeId.trim() || '0', - }) - kuaishouEticketConsumeResult.value = response.data - showSuccess( - response.data.ok ? '快手小店核销成功' : response.data.errorMessage || '核销请求已执行', - ) - } catch (error) { - kuaishouEticketResultError.value = - error instanceof Error ? error.message : '执行快手小店核销失败' - showError(kuaishouEticketResultError.value) - } finally { - kuaishouEticketConsuming.value = false - } - } - - return { - kuaishouEticketFilePath, - kuaishouEticketShops: shopManager.kuaishouEticketShops, - kuaishouEticketForm, - kuaishouEticketSaving, - kuaishouEticketResolvingShopId, - kuaishouEticketDetailing, - kuaishouEticketConsuming, - kuaishouEticketResultError, - kuaishouEticketShopInfoResult, - kuaishouEticketDetailResult, - kuaishouEticketConsumeResult, - activeKuaishouEticketShop, - kuaishouEticketStats, - hydrateKuaishouEticketConfig, - addKuaishouEticketShop, - removeKuaishouEticketShop, - setKuaishouEticketDebugShop, - describeKuaishouEticketShop: shopManager.describeKuaishouEticketShop, - getKuaishouEticketShopInitial: shopManager.getKuaishouEticketShopInitial, - handleKuaishouEticketResolveShopInfo, - handleKuaishouEticketSaveSource, - handleKuaishouEticketQueryDetail, - handleKuaishouEticketConsume, - } -} diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNinetyonePlatform.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNinetyonePlatform.ts deleted file mode 100644 index 9650ac27..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNinetyonePlatform.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { computed, ref } from 'vue' - -import { showConfirm, showError, showSuccess } from '@/lib/feedback' -import { - failAdminNinetyoneOrder, - fetchAdminNinetyoneOrders, - retryAdminNinetyoneOrder, -} from '@/services/admin' -import type { AdminNinetyoneOrderItem, AdminNinetyoneOrderListResult } from '@/types/admin' - -export function useAdminNinetyonePlatform() { - const ninetyoneLoading = ref(false) - const ninetyoneActionLoadingId = ref(null) - const ninetyoneResultError = ref('') - const ninetyoneStatus = ref<'pending_config' | 'all' | 'manual_failed'>('pending_config') - const ninetyoneOrders = ref({ - page: 1, - pageSize: 20, - total: 0, - items: [], - }) - - const ninetyoneStats = computed(() => { - const pendingCount = ninetyoneOrders.value.items.filter( - (item) => item.orderStatus === 'pending_config', - ).length - const failedCount = ninetyoneOrders.value.items.filter( - (item) => item.orderStatus === 'manual_failed', - ).length - const taskReadyCount = ninetyoneOrders.value.items.filter((item) => item.taskCount > 0).length - - return { - total: ninetyoneOrders.value.total, - currentCount: ninetyoneOrders.value.items.length, - pendingCount, - failedCount, - taskReadyCount, - } - }) - - async function loadNinetyoneOrders(page = 1) { - ninetyoneLoading.value = true - ninetyoneResultError.value = '' - - try { - const response = await fetchAdminNinetyoneOrders({ - page, - pageSize: ninetyoneOrders.value.pageSize || 20, - status: ninetyoneStatus.value, - }) - ninetyoneOrders.value = response.data - } catch (error) { - ninetyoneResultError.value = error instanceof Error ? error.message : '91卡券订单读取失败' - showError(ninetyoneResultError.value) - } finally { - ninetyoneLoading.value = false - } - } - - async function handleNinetyoneStatusChange(status: 'pending_config' | 'all' | 'manual_failed') { - ninetyoneStatus.value = status - await loadNinetyoneOrders(1) - } - - async function handleNinetyoneRetryOrder(item: AdminNinetyoneOrderItem) { - ninetyoneActionLoadingId.value = item.orderId - ninetyoneResultError.value = '' - - try { - const response = await retryAdminNinetyoneOrder(item.orderId) - showSuccess(`91卡券订单已重试,生成任务 ${response.data.taskCount} 个`) - await loadNinetyoneOrders(ninetyoneOrders.value.page || 1) - } catch (error) { - ninetyoneResultError.value = error instanceof Error ? error.message : '91卡券订单重试失败' - showError(ninetyoneResultError.value) - } finally { - ninetyoneActionLoadingId.value = null - } - } - - async function handleNinetyoneFailOrder(item: AdminNinetyoneOrderItem) { - try { - await showConfirm( - `确认把 91卡券订单 ${item.orderNo} 标记为无法履约吗?查询接口会返回失败状态。`, - '确认标记失败', - { - type: 'warning', - confirmButtonText: '标记失败', - cancelButtonText: '取消', - }, - ) - } catch { - return - } - - ninetyoneActionLoadingId.value = item.orderId - ninetyoneResultError.value = '' - - try { - await failAdminNinetyoneOrder(item.orderId, { - reason: '商家后台手动标记无法履约', - }) - showSuccess('91卡券订单已标记失败') - await loadNinetyoneOrders(ninetyoneOrders.value.page || 1) - } catch (error) { - ninetyoneResultError.value = error instanceof Error ? error.message : '91卡券订单标记失败失败' - showError(ninetyoneResultError.value) - } finally { - ninetyoneActionLoadingId.value = null - } - } - - return { - ninetyoneLoading, - ninetyoneActionLoadingId, - ninetyoneResultError, - ninetyoneStatus, - ninetyoneOrders, - ninetyoneStats, - loadNinetyoneOrders, - handleNinetyoneStatusChange, - handleNinetyoneRetryOrder, - handleNinetyoneFailOrder, - } -} diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNotificationPlatform.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNotificationPlatform.ts deleted file mode 100644 index 88c61928..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useAdminNotificationPlatform.ts +++ /dev/null @@ -1,384 +0,0 @@ -import { computed, ref } from 'vue' - -import { showError, showSuccess } from '@/lib/feedback' -import { - runAdminScheduledJob, - saveAdminNotificationConfig, - saveAdminScheduledJobsConfig, - testAdminNotification, -} from '@/services/admin' -import type { - AdminCloudtentaclesMonitorAccount, - AdminNotificationConfig, - AdminNotificationTestResult, - AdminScheduledJobRuntimeState, - AdminScheduledJobsConfig, - AdminScheduledJobsResponse, -} from '@/types/admin' - -import type { - EditableNotificationRecipient, - EditableScheduledJob, - EditableWpushRecipient, -} from './types' - -export function useAdminNotificationPlatform() { - const notificationFilePath = ref('') - const notificationForm = ref({ - enabled: true, - barkEnabled: true, - barkServerUrl: 'https://api.day.app', - wpushEnabled: true, - testTitle: '订单系统测试通知', - testBody: '这是一条内部通知测试。', - testUrl: '', - }) - const notificationRecipients = ref([]) - const wpushRecipients = ref([]) - const notificationSaving = ref(false) - const notificationTesting = ref(false) - const notificationResultError = ref('') - const notificationTestResult = ref(null) - const scheduledJobsFilePath = ref('') - const scheduledJobsForm = ref({ - enabled: true, - }) - const scheduledJobs = ref([]) - const scheduledJobRuntime = ref([]) - const cloudtentaclesMonitorAccounts = ref([]) - const scheduledJobsSaving = ref(false) - const scheduledJobRunningId = ref('') - - const notificationStats = computed(() => { - const enabledBarkRecipients = notificationRecipients.value.filter( - (item) => item.enabled && item.deviceKey.trim(), - ) - const enabledWpushRecipients = wpushRecipients.value.filter( - (item) => item.enabled && item.apiKey.trim(), - ) - - return { - barkConfiguredRecipientCount: notificationRecipients.value.length, - barkEnabledRecipientCount: enabledBarkRecipients.length, - wpushConfiguredRecipientCount: wpushRecipients.value.length, - wpushEnabledRecipientCount: enabledWpushRecipients.length, - barkReady: - notificationForm.value.enabled && - notificationForm.value.barkEnabled && - enabledBarkRecipients.length > 0, - wpushReady: - notificationForm.value.enabled && - notificationForm.value.wpushEnabled && - enabledWpushRecipients.length > 0, - ready: - ( - notificationForm.value.enabled && - notificationForm.value.barkEnabled && - enabledBarkRecipients.length > 0 - ) || - ( - notificationForm.value.enabled && - notificationForm.value.wpushEnabled && - enabledWpushRecipients.length > 0 - ), - lastSuccessCount: notificationTestResult.value?.successCount || 0, - lastFailedCount: notificationTestResult.value?.failedCount || 0, - scheduledJobEnabledCount: scheduledJobs.value.filter((item) => item.enabled).length, - } - }) - - function hydrateNotificationConfig(data: { filePath: string; source: AdminNotificationConfig }) { - notificationFilePath.value = data.filePath - notificationForm.value.enabled = data.source.enabled !== false - notificationForm.value.barkEnabled = data.source.channels.bark.enabled !== false - notificationForm.value.barkServerUrl = - data.source.channels.bark.serverUrl || 'https://api.day.app' - notificationForm.value.wpushEnabled = data.source.channels.wpush.enabled !== false - notificationRecipients.value = data.source.channels.bark.recipients.map((item) => ({ - id: item.id || crypto.randomUUID(), - name: item.name, - deviceKey: item.deviceKey, - enabled: item.enabled !== false, - })) - wpushRecipients.value = data.source.channels.wpush.recipients.map((item) => ({ - id: item.id || crypto.randomUUID(), - name: item.name, - apiKey: item.apiKey, - enabled: item.enabled !== false, - })) - } - - function hydrateScheduledJobsConfig(data: AdminScheduledJobsResponse) { - scheduledJobsFilePath.value = data.filePath - scheduledJobsForm.value.enabled = data.source.enabled !== false - cloudtentaclesMonitorAccounts.value = data.cloudtentaclesAccounts || [] - scheduledJobs.value = data.source.jobs.map((item) => ({ - id: item.id, - type: item.type, - enabled: item.enabled === true, - intervalSeconds: Number(item.intervalSeconds || 300), - intervalSecondsAmount: resolveTimeValue(Number(item.intervalSeconds || 300)).amount, - intervalSecondsUnit: resolveTimeValue(Number(item.intervalSeconds || 300)).unit, - cooldownSeconds: Number(item.cooldownSeconds || 1800), - cooldownSecondsAmount: resolveTimeValue(Number(item.cooldownSeconds || 1800)).amount, - cooldownSecondsUnit: resolveTimeValue(Number(item.cooldownSeconds || 1800)).unit, - assetThreshold: normalizeAssetThreshold(item.config?.assetThreshold, 500), - accounts: mergeScheduledJobAccounts( - item.config?.accounts || [], - data.cloudtentaclesAccounts || [], - normalizeAssetThreshold(item.config?.assetThreshold, 500), - ), - })) - scheduledJobRuntime.value = data.runtime || [] - } - - function addNotificationRecipient(channel: 'bark' | 'wpush') { - if (channel === 'wpush') { - wpushRecipients.value.unshift({ - id: crypto.randomUUID(), - name: '', - apiKey: '', - enabled: true, - }) - return - } - - notificationRecipients.value.unshift({ - id: crypto.randomUUID(), - name: '', - deviceKey: '', - enabled: true, - }) - } - - function removeNotificationRecipient(channel: 'bark' | 'wpush', id: string) { - if (channel === 'wpush') { - wpushRecipients.value = wpushRecipients.value.filter((item) => item.id !== id) - return - } - - notificationRecipients.value = notificationRecipients.value.filter((item) => item.id !== id) - } - - function buildNotificationConfigPayload(): AdminNotificationConfig { - return { - enabled: notificationForm.value.enabled, - channels: { - bark: { - enabled: notificationForm.value.barkEnabled, - serverUrl: notificationForm.value.barkServerUrl.trim() || 'https://api.day.app', - recipients: notificationRecipients.value.map((item) => ({ - id: item.id, - name: item.name.trim(), - deviceKey: item.deviceKey.trim(), - deviceKeyMasked: '', - enabled: item.enabled, - })), - }, - wpush: { - enabled: notificationForm.value.wpushEnabled, - recipients: wpushRecipients.value.map((item) => ({ - id: item.id, - name: item.name.trim(), - apiKey: item.apiKey.trim(), - apiKeyMasked: '', - enabled: item.enabled, - })), - }, - }, - } - } - - function buildScheduledJobsConfigPayload(): AdminScheduledJobsConfig { - return { - enabled: scheduledJobsForm.value.enabled, - jobs: scheduledJobs.value.map((item) => ({ - id: item.id, - type: item.type, - enabled: item.enabled, - intervalSeconds: Number(item.intervalSeconds || 300), - cooldownSeconds: Number(item.cooldownSeconds || 1800), - config: { - assetThreshold: normalizeAssetThreshold(item.assetThreshold, 500), - accounts: item.accounts.map((account) => ({ - sourceKey: account.sourceKey, - label: account.label.trim(), - enabled: account.enabled, - assetThreshold: normalizeAssetThreshold(account.assetThreshold, 0), - })), - }, - })), - } - } - - async function handleNotificationSaveConfig() { - notificationSaving.value = true - notificationResultError.value = '' - - try { - const response = await saveAdminNotificationConfig(buildNotificationConfigPayload()) - notificationFilePath.value = response.data.filePath - hydrateNotificationConfig(response.data) - showSuccess('内部通知配置已保存') - } catch (error) { - notificationResultError.value = - error instanceof Error ? error.message : '内部通知配置保存失败' - showError(notificationResultError.value) - } finally { - notificationSaving.value = false - } - } - - async function handleNotificationTest() { - notificationTesting.value = true - notificationResultError.value = '' - notificationTestResult.value = null - - try { - const saved = await saveAdminNotificationConfig(buildNotificationConfigPayload()) - notificationFilePath.value = saved.data.filePath - hydrateNotificationConfig(saved.data) - - const response = await testAdminNotification({ - title: notificationForm.value.testTitle.trim(), - body: notificationForm.value.testBody.trim(), - url: notificationForm.value.testUrl.trim(), - }) - notificationTestResult.value = response.data - if (response.data.successCount > 0) { - showSuccess(`内部通知测试完成,成功 ${response.data.successCount} 个`) - } else { - showError('内部通知测试未成功发送,请检查通知通道配置') - } - } catch (error) { - notificationResultError.value = error instanceof Error ? error.message : '内部通知测试失败' - showError(notificationResultError.value) - } finally { - notificationTesting.value = false - } - } - - async function handleScheduledJobsSaveConfig() { - scheduledJobsSaving.value = true - notificationResultError.value = '' - - try { - const response = await saveAdminScheduledJobsConfig(buildScheduledJobsConfigPayload()) - hydrateScheduledJobsConfig(response.data) - showSuccess('监控任务配置已保存') - } catch (error) { - notificationResultError.value = - error instanceof Error ? error.message : '监控任务配置保存失败' - showError(notificationResultError.value) - } finally { - scheduledJobsSaving.value = false - } - } - - async function handleScheduledJobRunNow(jobId: string) { - scheduledJobRunningId.value = jobId - notificationResultError.value = '' - - try { - const saved = await saveAdminScheduledJobsConfig(buildScheduledJobsConfigPayload()) - hydrateScheduledJobsConfig(saved.data) - const response = await runAdminScheduledJob(jobId) - scheduledJobRuntime.value = response.data.runtime || [] - const message = String(response.data.result?.message || '监控任务已执行') - showSuccess(message) - } catch (error) { - notificationResultError.value = error instanceof Error ? error.message : '监控任务执行失败' - showError(notificationResultError.value) - } finally { - scheduledJobRunningId.value = '' - } - } - - function getScheduledJobRuntime(jobId: string) { - return scheduledJobRuntime.value.find((item) => item.id === jobId) || null - } - - function mergeScheduledJobAccounts( - configuredAccounts: EditableScheduledJob['accounts'], - monitorAccounts: AdminCloudtentaclesMonitorAccount[], - defaultAssetThreshold: number, - ) { - const configuredMap = new Map( - configuredAccounts.map((item) => [String(item.sourceKey || '').trim(), item]), - ) - const merged = monitorAccounts - .filter((item) => String(item.sourceKey || '').trim()) - .map((item) => { - const sourceKey = String(item.sourceKey || '').trim() - const configured = configuredMap.get(sourceKey) - return { - sourceKey, - label: String(configured?.label || item.label || sourceKey).trim(), - enabled: configured ? configured.enabled !== false : item.enabled !== false, - assetThreshold: normalizeAssetThreshold(configured?.assetThreshold, defaultAssetThreshold), - } - }) - const mergedKeys = new Set(merged.map((item) => item.sourceKey)) - - for (const configured of configuredAccounts) { - const sourceKey = String(configured.sourceKey || '').trim() - if (!sourceKey || mergedKeys.has(sourceKey)) { - continue - } - merged.push({ - sourceKey, - label: String(configured.label || sourceKey).trim(), - enabled: configured.enabled !== false, - assetThreshold: normalizeAssetThreshold(configured.assetThreshold, defaultAssetThreshold), - }) - } - - return merged - } - - function normalizeAssetThreshold(value: unknown, fallback: number) { - const parsed = Number(value) - return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback - } - - function resolveTimeValue(seconds: number) { - const normalized = Math.max(0, Number(seconds || 0)) - if (normalized >= 3600 && normalized % 3600 === 0) { - return { amount: normalized / 3600, unit: 3600 } - } - - if (normalized >= 60 && normalized % 60 === 0) { - return { amount: normalized / 60, unit: 60 } - } - - return { amount: normalized || 1, unit: 1 } - } - - return { - notificationFilePath, - notificationForm, - notificationRecipients, - wpushRecipients, - notificationSaving, - notificationTesting, - notificationResultError, - notificationTestResult, - scheduledJobsFilePath, - scheduledJobsForm, - scheduledJobs, - scheduledJobRuntime, - cloudtentaclesMonitorAccounts, - scheduledJobsSaving, - scheduledJobRunningId, - notificationStats, - hydrateNotificationConfig, - hydrateScheduledJobsConfig, - addNotificationRecipient, - removeNotificationRecipient, - handleNotificationSaveConfig, - handleNotificationTest, - handleScheduledJobsSaveConfig, - handleScheduledJobRunNow, - getScheduledJobRuntime, - } -} diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useCloudtentaclesDebugActions.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useCloudtentaclesDebugActions.ts deleted file mode 100644 index fd1ff836..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useCloudtentaclesDebugActions.ts +++ /dev/null @@ -1,261 +0,0 @@ -import { ref } from 'vue' -import { showError, showSuccess } from '@/lib/feedback' -import { - appointAdminCloudtentaclesVn, - backAdminCloudtentaclesVn, - buyAdminCloudtentaclesSku, - fetchAdminCloudtentaclesAsset, - fetchAdminCloudtentaclesBindUrl, - fetchAdminCloudtentaclesCategories, - fetchAdminCloudtentaclesKnapsack, - fetchAdminCloudtentaclesSkuList, - fetchAdminCloudtentaclesVnCode, - fetchAdminCloudtentaclesVnList, - generateAdminCloudtentaclesVnLoginCode, - runAdminCloudtentaclesFullFlow, - useAdminCloudtentaclesSku, - verifyAdminCloudtentaclesVnCode, -} from '@/services/admin' - -import { - normalizeCloudtentaclesDeviceId, - normalizeCloudtentaclesDeviceType, -} from './cloudtentaclesDefaults' - -export type CloudtentaclesForm = { - baseUrl: string - username: string - password: string - phone: string - code: string - token: string - vnKey: string - vnId: number - skuId: number - skuCount: number - deviceId: string - deviceType: number -} - -export function useCloudtentaclesDebugActions( - cloudtentaclesForm: { value: CloudtentaclesForm }, - cloudtentaclesResultError: { value: string }, - selectedSourceKey: { value: string }, -) { - const cloudtentaclesDebugLoading = ref(false) - const cloudtentaclesDebugResult = ref('') - - function buildCloudtentaclesTokenPayload() { - return { - baseUrl: cloudtentaclesForm.value.baseUrl.trim() || 'https://123.207.217.176', - token: cloudtentaclesForm.value.token.trim(), - deviceId: normalizeCloudtentaclesDeviceId(cloudtentaclesForm.value.deviceId), - deviceType: normalizeCloudtentaclesDeviceType(cloudtentaclesForm.value.deviceType), - sourceKey: selectedSourceKey.value, - } - } - - function ensureCloudtentaclesToken() { - if (!cloudtentaclesForm.value.token.trim()) { - cloudtentaclesResultError.value = '请先登录或手动填写 token' - return false - } - return true - } - - function renderCloudtentaclesDebugResult(label: string, data: unknown) { - cloudtentaclesDebugResult.value = `${label}\n${JSON.stringify(data, null, 2)}` - } - - async function runCloudtentaclesDebugAction( - label: string, - runner: () => Promise<{ data: unknown }>, - ) { - cloudtentaclesDebugLoading.value = true - cloudtentaclesResultError.value = '' - - try { - const response = await runner() - renderCloudtentaclesDebugResult(label, response.data) - showSuccess(`${label}成功`) - } catch (error) { - cloudtentaclesResultError.value = error instanceof Error ? error.message : `${label}失败` - showError(cloudtentaclesResultError.value) - } finally { - cloudtentaclesDebugLoading.value = false - } - } - - async function handleCloudtentaclesFetchAsset() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('查询余额', () => - fetchAdminCloudtentaclesAsset(buildCloudtentaclesTokenPayload()), - ) - } - - async function handleCloudtentaclesFetchCategories() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('查询分类', () => - fetchAdminCloudtentaclesCategories(buildCloudtentaclesTokenPayload()), - ) - } - - async function handleCloudtentaclesFetchSkuList() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('查询SKU列表', () => - fetchAdminCloudtentaclesSkuList(buildCloudtentaclesTokenPayload()), - ) - } - - async function handleCloudtentaclesBuySku() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('购买SKU', () => - buyAdminCloudtentaclesSku({ - ...buildCloudtentaclesTokenPayload(), - id: Number(cloudtentaclesForm.value.skuId || 0), - count: Number(cloudtentaclesForm.value.skuCount || 1), - }), - ) - } - - async function handleCloudtentaclesUseSku() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('执行发货', () => - useAdminCloudtentaclesSku({ - ...buildCloudtentaclesTokenPayload(), - id: Number(cloudtentaclesForm.value.skuId || 0), - virtualNumberId: Number(cloudtentaclesForm.value.vnId || 0), - phone: cloudtentaclesForm.value.phone.trim(), - }), - ) - } - - async function handleCloudtentaclesFetchKnapsack() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('查询背包', () => - fetchAdminCloudtentaclesKnapsack(buildCloudtentaclesTokenPayload()), - ) - } - - async function handleCloudtentaclesFetchVnList() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('查询虚拟号列表', () => - fetchAdminCloudtentaclesVnList({ - ...buildCloudtentaclesTokenPayload(), - key: cloudtentaclesForm.value.vnKey.trim(), - }), - ) - } - - async function handleCloudtentaclesAppointVn() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('申请虚拟号', async () => { - const response = await appointAdminCloudtentaclesVn({ - ...buildCloudtentaclesTokenPayload(), - key: cloudtentaclesForm.value.vnKey.trim(), - }) - const item = (response.data as { item?: { id?: number; phone?: string } }).item - if (item?.id) { - cloudtentaclesForm.value.vnId = Number(item.id) - } - if (item?.phone) { - cloudtentaclesForm.value.phone = String(item.phone) - } - return response - }) - } - - async function handleCloudtentaclesGenerateVnLoginCode() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('生成登录码', () => - generateAdminCloudtentaclesVnLoginCode({ - ...buildCloudtentaclesTokenPayload(), - key: cloudtentaclesForm.value.vnKey.trim(), - id: Number(cloudtentaclesForm.value.vnId || 0), - }), - ) - } - - async function handleCloudtentaclesFetchVnCode() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('获取验证码', async () => { - const response = await fetchAdminCloudtentaclesVnCode({ - ...buildCloudtentaclesTokenPayload(), - key: cloudtentaclesForm.value.vnKey.trim(), - phone: cloudtentaclesForm.value.phone.trim(), - }) - const code = (response.data as { code?: string }).code - if (code) { - cloudtentaclesForm.value.code = String(code) - } - return response - }) - } - - async function handleCloudtentaclesVerifyVnCode() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('校验验证码', () => - verifyAdminCloudtentaclesVnCode({ - ...buildCloudtentaclesTokenPayload(), - key: cloudtentaclesForm.value.vnKey.trim(), - id: Number(cloudtentaclesForm.value.vnId || 0), - code: cloudtentaclesForm.value.code.trim(), - }), - ) - } - - async function handleCloudtentaclesFetchBindUrl() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('获取兑换链接', () => - fetchAdminCloudtentaclesBindUrl({ - ...buildCloudtentaclesTokenPayload(), - key: cloudtentaclesForm.value.vnKey.trim(), - id: Number(cloudtentaclesForm.value.vnId || 0), - }), - ) - } - - async function handleCloudtentaclesBackVn() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('退还号码', () => - backAdminCloudtentaclesVn({ - ...buildCloudtentaclesTokenPayload(), - key: cloudtentaclesForm.value.vnKey.trim(), - id: Number(cloudtentaclesForm.value.vnId || 0), - }), - ) - } - - async function handleCloudtentaclesRunFullFlow() { - if (!ensureCloudtentaclesToken()) return - await runCloudtentaclesDebugAction('完整测试流程', () => - runAdminCloudtentaclesFullFlow({ - ...buildCloudtentaclesTokenPayload(), - skuId: Number(cloudtentaclesForm.value.skuId || 0), - skuCount: Number(cloudtentaclesForm.value.skuCount || 1), - vnKey: cloudtentaclesForm.value.vnKey.trim(), - }), - ) - } - - return { - cloudtentaclesDebugLoading, - cloudtentaclesDebugResult, - buildCloudtentaclesTokenPayload, - ensureCloudtentaclesToken, - handleCloudtentaclesFetchAsset, - handleCloudtentaclesFetchCategories, - handleCloudtentaclesFetchSkuList, - handleCloudtentaclesBuySku, - handleCloudtentaclesUseSku, - handleCloudtentaclesFetchKnapsack, - handleCloudtentaclesFetchVnList, - handleCloudtentaclesAppointVn, - handleCloudtentaclesGenerateVnLoginCode, - handleCloudtentaclesFetchVnCode, - handleCloudtentaclesVerifyVnCode, - handleCloudtentaclesFetchBindUrl, - handleCloudtentaclesBackVn, - handleCloudtentaclesRunFullFlow, - } -} diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useKuaishouEticketShopManager.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useKuaishouEticketShopManager.ts deleted file mode 100644 index 30ad86f8..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useKuaishouEticketShopManager.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { ref } from 'vue' -import type { EditableKuaishouEticketShop } from './types' -import type { AdminKuaishouEticketShopConfigItem } from '@/types/admin' - -export function useKuaishouEticketShopManager() { - const kuaishouEticketShops = ref([]) - - function addKuaishouEticketShop() { - const shop = createEmptyKuaishouEticketShop() - kuaishouEticketShops.value.unshift(shop) - return { shop, newSelectedId: shop.id } - } - - function removeKuaishouEticketShop(id: string, currentSelectedId: string) { - kuaishouEticketShops.value = kuaishouEticketShops.value.filter((item) => item.id !== id) - if (currentSelectedId === id) { - return kuaishouEticketShops.value[0]?.id || '' - } - return currentSelectedId - } - - function describeKuaishouEticketShop(shop: EditableKuaishouEticketShop) { - const status = shop.cookie.trim() ? 'Cookie 已就绪' : '待补 Cookie' - const identity = shop.shopId.trim() ? '已识别店铺' : '待读取信息' - return `${status} · ${identity}` - } - - function getKuaishouEticketShopInitial(shop: EditableKuaishouEticketShop) { - const label = shop.kshopName.trim() || shop.shopId.trim() || '店' - return label.slice(0, 1).toUpperCase() - } - - function setShopsFromConfig(shops: AdminKuaishouEticketShopConfigItem[]) { - kuaishouEticketShops.value = shops.map(mapEditableKuaishouEticketShop) - return kuaishouEticketShops.value - } - - function findShopByShopId(shopId: string) { - return kuaishouEticketShops.value.find((item) => item.shopId && item.shopId === shopId) - } - - return { - kuaishouEticketShops, - addKuaishouEticketShop, - removeKuaishouEticketShop, - describeKuaishouEticketShop, - getKuaishouEticketShopInitial, - setShopsFromConfig, - findShopByShopId, - } -} - -function createEmptyKuaishouEticketShop(): EditableKuaishouEticketShop { - return { - id: crypto.randomUUID(), - shopId: '', - kshopName: '', - cookie: '', - userAvatar: '', - enabled: true, - } -} - -function mapEditableKuaishouEticketShop( - item: AdminKuaishouEticketShopConfigItem, -): EditableKuaishouEticketShop { - return { - id: crypto.randomUUID(), - shopId: item.shopId, - kshopName: item.kshopName, - cookie: item.cookie, - userAvatar: item.userAvatar, - enabled: item.enabled !== false, - } -} diff --git a/apps/frontend-vue/src/views/admin/platform-shops/composables/useRememberedCollapse.ts b/apps/frontend-vue/src/views/admin/platform-shops/composables/useRememberedCollapse.ts deleted file mode 100644 index c22d866a..00000000 --- a/apps/frontend-vue/src/views/admin/platform-shops/composables/useRememberedCollapse.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { ref, watch, type Ref } from 'vue' - -export type RememberedCollapseState = { - activeNames: Ref - handleChange: (value: unknown) => void -} - -export function useRememberedCollapse( - storageKey: string, - defaultValue: string[] = [], -): RememberedCollapseState { - const activeNames = ref(readStoredCollapseNames(storageKey, defaultValue)) - - function handleChange(value: unknown) { - const nextNames = normalizeCollapseNames(value) - activeNames.value = nextNames - writeStoredCollapseNames(storageKey, nextNames) - } - - watch( - activeNames, - (names) => { - writeStoredCollapseNames(storageKey, names) - }, - { deep: true }, - ) - - return { - activeNames, - handleChange, - } -} - -function readStoredCollapseNames(storageKey: string, defaultValue: string[]): string[] { - if (!canUseLocalStorage()) { - return [...defaultValue] - } - - try { - const rawValue = window.localStorage.getItem(storageKey) - if (!rawValue) { - return [...defaultValue] - } - - const parsed = JSON.parse(rawValue) - return normalizeCollapseNames(parsed, defaultValue) - } catch { - return [...defaultValue] - } -} - -function writeStoredCollapseNames(storageKey: string, names: unknown): void { - if (!canUseLocalStorage()) { - return - } - - try { - window.localStorage.setItem(storageKey, JSON.stringify(normalizeCollapseNames(names))) - } catch { - // 浏览器禁用存储时忽略,折叠状态退化为本次会话内有效。 - } -} - -function normalizeCollapseNames(value: unknown, fallback: string[] = []): string[] { - if (typeof value === 'string' || typeof value === 'number') { - const normalized = String(value || '').trim() - return normalized ? [normalized] : [] - } - - if (!Array.isArray(value)) { - return [...fallback] - } - - return Array.from(new Set(value.map((item) => String(item || '').trim()).filter(Boolean))) -} - -function canUseLocalStorage(): boolean { - return typeof window !== 'undefined' && Boolean(window.localStorage) -} diff --git a/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetail.css b/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetail.css deleted file mode 100644 index 376df950..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetail.css +++ /dev/null @@ -1,687 +0,0 @@ -.admin-panel { - display: grid; - gap: var(--space-4); -} - -.claim-link { - color: var(--color-primary); - text-decoration: none; - word-break: break-all; -} - -.section-card p { - margin: 10px 0 0; - color: var(--text-primary); -} - -.section-card h3 { - margin: 0 0 var(--space-3); - color: var(--text-primary); -} - -.hero-card { - display: grid; - gap: var(--space-4); - background: - radial-gradient(circle at top right, rgba(14, 165, 233, 0.12), transparent 26%), - linear-gradient(135deg, rgba(255, 255, 255, 0.98), rgba(239, 246, 255, 0.96)); -} - -.hero-head { - display: flex; - justify-content: space-between; - gap: var(--space-4); - align-items: flex-start; -} - -.hero-copy { - display: grid; - gap: 6px; - min-width: 0; -} - -.hero-copy h2 { - margin: 0; - color: var(--text-primary); - font-size: 30px; - line-height: 1.1; -} - -.hero-copy p, -.hero-inline span, -.hero-link-row span { - color: var(--text-secondary); -} - -.hero-copy p { - line-height: 1.6; -} - -.hero-eyebrow { - color: var(--color-primary); - font-size: var(--text-xs); - font-weight: 700; - letter-spacing: 0.08em; - text-transform: uppercase; -} - -.hero-meta-grid { - display: flex; - flex-wrap: wrap; - gap: 1px; - background: var(--border-default); - border: 1px solid var(--border-default); - border-radius: var(--radius-md); - overflow: hidden; -} - -@media (max-width: 640px) { - .hero-meta-grid { - flex-direction: column; - } -} - -.hero-metric { - flex: 1; - min-width: 120px; - padding: 10px var(--space-4); - background: #fff; - display: flex; - align-items: center; - gap: var(--space-3); -} - -.hero-metric span { - display: block; - color: var(--text-secondary); - font-size: var(--text-xs); - white-space: nowrap; - flex-shrink: 0; -} - -.hero-metric strong { - color: var(--text-primary); - font-size: var(--text-sm); - font-weight: 600; - line-height: 1.3; - word-break: break-all; -} - -.hero-inline, -.hero-link-row { - display: flex; - flex-wrap: wrap; - gap: var(--space-3); - align-items: center; -} - -.action-row { - display: flex; - flex-wrap: wrap; - gap: var(--space-3); -} - -.section-headline { - display: flex; - justify-content: space-between; - align-items: center; - gap: var(--space-3); - margin-bottom: var(--space-3); -} - -.section-headline h3 { - margin: 0; -} - -.section-actions { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - justify-content: flex-end; -} - -.voucher-detail-block { - margin-top: var(--space-4); -} - -.voucher-detail-block h4 { - margin: 0 0 var(--space-3); - color: var(--text-primary); -} - -.voucher-missing-alert { - margin-bottom: var(--space-3); -} - -.section-copy { - margin: 0 0 var(--space-3); - color: var(--text-secondary); -} - -.auto-delivery-tag-line { - display: flex; - align-items: center; -} - -.auto-delivery-note { - margin-top: 14px; - padding: 14px var(--space-4); - border-radius: var(--radius-md); - background: rgba(248, 250, 252, 0.92); - border: 1px solid var(--border-default); -} - -.auto-delivery-note p { - margin: 0 0 var(--space-2); - color: var(--text-primary); -} - -.auto-delivery-note p:last-child { - margin-bottom: 0; -} - -.status-stack { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); -} - -.redeem-summary-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); - gap: var(--space-3); - margin-bottom: 14px; -} - -.metric-card, -.redeem-attempt-card { - padding: 14px var(--space-4); - border-radius: var(--radius-md); - border: 1px solid var(--border-default); - background: rgba(248, 250, 252, 0.92); -} - -.metric-card span, -.redeem-attempt-grid span { - display: block; - color: var(--text-secondary); - font-size: var(--text-xs); - margin-bottom: 6px; -} - -.metric-card strong, -.redeem-attempt-grid strong { - color: var(--text-primary); -} - -.redeem-attempts { - display: grid; - gap: var(--space-3); -} - -.redeem-attempt-head { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-3); -} - -.redeem-outcome { - color: var(--color-primary); - font-size: var(--text-sm); - font-weight: 600; -} - -.redeem-attempt-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: var(--space-3); - margin-top: var(--space-3); -} - -.redeem-attempt-copy { - margin: var(--space-3) 0 0; - color: var(--text-primary); - line-height: 1.6; -} - -.table-empty { - text-align: center; - color: var(--text-secondary); -} - -.binding-primary { - margin-top: 4px; - color: var(--color-success); - font-size: var(--text-xs); - font-weight: 600; -} - -.binding-meta { - margin-top: 4px; - color: var(--text-secondary); - font-size: var(--text-xs); -} - -.manual-grid { - display: grid; - gap: 14px; -} - -.admin-panel :deep(.el-form-item) { - margin-bottom: 0; -} - -.admin-panel :deep(.el-form-item__label) { - color: var(--text-secondary); - font-size: var(--text-xs); - font-weight: 700; - line-height: 1.4; - margin-bottom: 6px; -} - -.manual-hint { - margin: 14px 0 0; - color: var(--text-secondary); -} - -.manual-summary { - margin-top: var(--space-4); - padding: 14px; - border-radius: var(--radius-md); - background: rgba(248, 250, 252, 0.9); -} - -.manual-summary p { - margin: 0 0 var(--space-2); - color: var(--text-primary); -} - -.manual-summary p:last-child { - margin-bottom: 0; -} - -.flow-card { - display: grid; - gap: var(--space-4); - background: - radial-gradient(circle at top right, rgba(37, 99, 235, 0.08), transparent 28%), - linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(248, 250, 252, 0.96)); -} - -.flow-card-head { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - gap: 14px; -} - -.flow-head-actions { - display: flex; - flex-wrap: wrap; - gap: 10px; -} - -.kuaishou-focus-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); - gap: 14px; -} - -.flow-block { - padding: var(--space-4); - border-radius: 18px; - border: 1px solid var(--border-default); - background: rgba(248, 250, 252, 0.9); -} - -.flow-block--spotlight { - background: - linear-gradient(160deg, rgba(255, 255, 255, 0.98), rgba(239, 246, 255, 0.95)), - rgba(248, 250, 252, 0.9); -} - -.flow-block h4 { - margin: 0; - color: var(--text-primary); -} - -.flow-block p { - margin: 10px 0 0; - color: var(--text-secondary); - line-height: 1.6; -} - -.flow-meta-list { - display: grid; - gap: 10px; - margin-top: 14px; -} - -.flow-meta-list div { - display: grid; - gap: 4px; -} - -.flow-meta-list span { - color: var(--text-secondary); - font-size: var(--text-xs); -} - -.flow-meta-list strong { - color: var(--text-primary); - word-break: break-all; -} - -.flow-meta-list--dense { - grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); -} - -.flow-meta-list--two-column { - grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); -} - -.spotlight-head { - display: flex; - justify-content: space-between; - gap: var(--space-3); - align-items: flex-start; -} - -.spotlight-actions { - display: flex; - align-items: center; - gap: 10px; -} - -.flow-copy { - margin: var(--space-2) 0 0; - color: var(--text-secondary); - line-height: 1.6; -} - -.flow-collapse { - display: grid; - gap: var(--space-3); -} - -/* ===== Flow Timeline (Checklist) ===== */ -.flow-timeline { - display: grid; - gap: 0; - margin-top: var(--space-4); - padding-left: 2px; -} - -.flow-timeline-item { - display: grid; - grid-template-columns: 20px 1fr; - gap: 0 var(--space-3); - position: relative; -} - -/* Vertical connector line */ -.flow-timeline-item:not(:last-child) .timeline-gutter::after { - content: ''; - display: block; - position: absolute; - left: 9px; - top: 24px; - bottom: 0; - width: 1px; - background: var(--border-default); -} - -.timeline-gutter { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - padding-top: 14px; -} - -.timeline-dot { - width: 8px; - height: 8px; - border-radius: 50%; - flex-shrink: 0; - z-index: 1; - background: var(--border-default); - margin-top: 4px; -} - -.flow-timeline-item--done .timeline-dot { - background: var(--text-muted); -} - -.flow-timeline-item--current .timeline-dot { - background: var(--text-primary); - width: 10px; - height: 10px; - margin-top: 3px; -} - -.flow-timeline-item--error .timeline-dot { - background: var(--color-danger); -} - -.timeline-body { - padding: 8px 0 14px; -} - -.timeline-head { - display: flex; - align-items: center; - gap: var(--space-2); - margin-bottom: 2px; -} - -.timeline-label { - font-size: var(--text-xs); - font-weight: 500; - color: var(--text-secondary); -} - -.flow-timeline-item--current .timeline-label { - color: var(--text-primary); - font-weight: 600; -} - -.timeline-current-badge { - font-size: 10px; - font-weight: 600; - padding: 0 5px; - border-radius: var(--radius-sm); - background: var(--bg-subtle); - color: var(--text-secondary); -} - -.timeline-detail { - color: var(--text-primary); - font-size: var(--text-sm); - line-height: 1.5; -} - -.flow-timeline-item--done .timeline-detail { - color: var(--text-muted); -} - -/* ===== Collapse Badge ===== */ -.collapse-title-wrap { - display: flex; - align-items: center; - gap: var(--space-2); -} - -.collapse-badge { - font-size: 10px; - font-weight: 500; - padding: 0 5px; - border-radius: var(--radius-sm); - background: rgba(100, 116, 139, 0.08); - color: var(--text-muted); -} - -/* ===== Event Timeline ===== */ -.event-timeline { - display: grid; - gap: 0; - padding-left: 2px; -} - -.event-tl-item { - display: grid; - grid-template-columns: 20px 1fr; - gap: 0 var(--space-3); - position: relative; -} - -.event-tl-item:not(:last-child) .event-tl-gutter::after { - content: ''; - display: block; - position: absolute; - left: 9px; - top: 24px; - bottom: 0; - width: 1px; - background: var(--border-default); -} - -.event-tl-gutter { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - padding-top: 14px; -} - -.event-tl-dot { - width: 6px; - height: 6px; - border-radius: 50%; - background: var(--text-muted); - margin-top: 6px; - flex-shrink: 0; - z-index: 1; -} - -.event-tl-body { - padding: 8px 0 14px; -} - -.event-tl-type { - font-size: var(--text-xs); - font-weight: 500; - color: var(--text-secondary); - margin-bottom: 2px; -} - -.event-tl-payload { - color: var(--text-primary); - font-size: var(--text-sm); - line-height: 1.5; -} - -.event-tl-time { - margin-top: 2px; - color: var(--text-muted); - font-size: var(--text-xs); -} - -/* ===== Role Enhancements ===== */ -.role-verified-badge { - display: inline-block; - margin-top: var(--space-2); - font-size: var(--text-xs); - color: var(--text-muted); -} - -.role-pending-hint { - margin-top: var(--space-3); - color: var(--text-secondary); - font-size: var(--text-xs); - line-height: 1.6; -} - -.role-hero { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); - gap: var(--space-3); - margin-top: var(--space-4); -} - -.role-hero div { - padding: 14px var(--space-4); - border-radius: var(--radius-md); - background: rgba(255, 255, 255, 0.88); - border: 1px solid var(--border-default); -} - -.role-hero span { - display: block; - margin-bottom: 6px; - color: var(--text-secondary); - font-size: var(--text-xs); -} - -.role-hero strong { - color: var(--text-primary); - font-size: var(--text-lg); - line-height: 1.35; - word-break: break-word; -} - -.role-warning { - margin: 14px 0 0; - padding: var(--space-3) 14px; - border-radius: 14px; - background: var(--color-warning-light); - color: #b54708; -} - -.event-copy { - color: var(--text-primary); -} - -.event-time { - margin-top: 6px; - color: var(--text-secondary); - font-size: var(--text-xs); -} - -.screenshot-link { - display: inline-block; - margin-bottom: var(--space-3); - color: var(--color-primary); - text-decoration: none; -} - -.screenshot-empty { - margin: 0 0 var(--space-3); - color: var(--text-secondary); -} - -.screenshot-preview { - display: block; - width: min(100%, 720px); - border-radius: 18px; - border: 1px solid var(--border-default); - box-shadow: 0 20px 48px rgba(15, 23, 42, 0.08); -} - -@media (max-width: 900px) { - .hero-head, - .hero-inline, - .hero-link-row, - .flow-card-head, - .flow-head-actions, - .spotlight-head, - .spotlight-actions { - display: grid; - } - - .timeline-head { - flex-wrap: wrap; - } -} diff --git a/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetailView.vue b/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetailView.vue deleted file mode 100644 index 33aff7c4..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/AdminTaskDetailView.vue +++ /dev/null @@ -1,171 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/tasks/AdminTasksView.vue b/apps/frontend-vue/src/views/admin/tasks/AdminTasksView.vue deleted file mode 100644 index 592330bc..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/AdminTasksView.vue +++ /dev/null @@ -1,495 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskActionBar.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskActionBar.vue deleted file mode 100644 index 66bf5e06..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskActionBar.vue +++ /dev/null @@ -1,134 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskEventsSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskEventsSection.vue deleted file mode 100644 index 1b993374..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskEventsSection.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskHeroSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskHeroSection.vue deleted file mode 100644 index 4cf95fb5..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskHeroSection.vue +++ /dev/null @@ -1,135 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskInfoSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskInfoSection.vue deleted file mode 100644 index 51bbb0ca..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskInfoSection.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouCloudPanel.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouCloudPanel.vue deleted file mode 100644 index cc82bab8..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouCloudPanel.vue +++ /dev/null @@ -1,473 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouIndustryVoucherSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouIndustryVoucherSection.vue deleted file mode 100644 index 5eeb7a93..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskKuaishouIndustryVoucherSection.vue +++ /dev/null @@ -1,179 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskManualDispatchSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskManualDispatchSection.vue deleted file mode 100644 index e2dd8619..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskManualDispatchSection.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskRedeemResolutionSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskRedeemResolutionSection.vue deleted file mode 100644 index 26f7fb8e..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskRedeemResolutionSection.vue +++ /dev/null @@ -1,72 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskScreenshotSection.vue b/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskScreenshotSection.vue deleted file mode 100644 index 3050390d..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/components/AdminTaskScreenshotSection.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/tasks/composables/types.ts b/apps/frontend-vue/src/views/admin/tasks/composables/types.ts deleted file mode 100644 index b4f28035..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/composables/types.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { AdminTaskDetail } from '@/types/admin' - -export type KuaishouCloudFlow = NonNullable - -export type SummaryCard = { - label: string - value: string - tone: 'blue' | 'green' | 'amber' | 'slate' -} - -export type RoleInfoEntry = { - key: string - label: string - value: string -} - -export type ChecklistItem = { - key: string - label: string - status: string - detail: string -} - -export type ManualDispatchForm = { - deliveryReference: string - deliveredCredential: string - resultMessage: string -} diff --git a/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskDetail.ts b/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskDetail.ts deleted file mode 100644 index 95e7bcde..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskDetail.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { computed, onBeforeUnmount, ref } from 'vue' -import { useRoute } from 'vue-router' - -import { showConfirm, showError, showSuccess } from '@/lib/feedback' -import { - completeAdminTaskManualDispatch, - fetchAdminTaskScreenshot, - fetchAdminTaskDetail, -} from '@/services/admin' -import type { AdminTaskActionResponse, AdminTaskDetail } from '@/types/admin' -import { hasAdminRole } from '@/utils/admin-auth' - -import type { ManualDispatchForm } from './types' - -export function useAdminTaskDetail() { - const route = useRoute() - const loading = ref(true) - const actionLoading = ref(false) - const errorMessage = ref('') - const detail = ref(null) - const lastClaimUrl = ref('') - const screenshotPreviewUrl = ref('') - const manualDispatchForm = ref({ - deliveryReference: '', - deliveredCredential: '', - resultMessage: '', - }) - - const canManageTaskLifecycle = computed(() => hasAdminRole('operator')) - const canCloseTasks = computed(() => hasAdminRole('support')) - const canViewSensitiveTaskData = computed(() => - Boolean(detail.value?.operations.canViewSensitiveTaskData), - ) - - const claimUrl = computed(() => { - const tokenStatus = String(detail.value?.claimToken?.status || '').trim() - const taskStatus = String(detail.value?.task.status || '').trim() - - if (tokenStatus !== 'active' || ['closed', 'expired'].includes(taskStatus)) { - return '' - } - - return lastClaimUrl.value || detail.value?.claimToken?.claimUrl || '' - }) - - const claimLinkInvalid = computed(() => { - const tokenStatus = String(detail.value?.claimToken?.status || '').trim() - return Boolean( - detail.value?.claimToken?.claimUrl && - tokenStatus && - tokenStatus !== 'active', - ) - }) - - const screenshotSectionTitle = computed(() => { - if (detail.value?.task.status === 'redeemed') { - return '结果截图' - } - - return detail.value?.review.required ? '客服复核截图' : '结果截图' - }) - - async function loadDetail() { - loading.value = true - errorMessage.value = '' - - try { - const response = await fetchAdminTaskDetail(String(route.params.taskId || '')) - detail.value = response.data - syncManualDispatchForm(response.data) - await loadScreenshotPreview(response.data) - } catch (error) { - errorMessage.value = error instanceof Error ? error.message : '读取任务详情失败' - } finally { - loading.value = false - } - } - - async function runAction( - action: () => Promise<{ data: AdminTaskActionResponse }>, - successMessage: string, - confirmText: string, - ) { - try { - await showConfirm(confirmText, '确认操作', { - type: 'warning', - confirmButtonText: '继续执行', - cancelButtonText: '取消', - }) - } catch { - return - } - - actionLoading.value = true - - try { - const response = await action() - if (response.data.claimUrl) { - lastClaimUrl.value = response.data.claimUrl - } - showSuccess(successMessage) - await loadDetail() - } catch (error) { - showError(error instanceof Error ? error.message : '操作失败') - await loadDetail() - } finally { - actionLoading.value = false - } - } - - async function loadScreenshotPreview(taskDetail: AdminTaskDetail) { - clearScreenshotPreview() - - if (!taskDetail.screenshotUrl) { - return - } - - try { - const blob = await fetchAdminTaskScreenshot(taskDetail.task.taskId) - screenshotPreviewUrl.value = URL.createObjectURL(blob) - } catch { - screenshotPreviewUrl.value = '' - } - } - - function clearScreenshotPreview() { - if (screenshotPreviewUrl.value) { - URL.revokeObjectURL(screenshotPreviewUrl.value) - screenshotPreviewUrl.value = '' - } - } - - function syncManualDispatchForm(taskDetail: AdminTaskDetail) { - manualDispatchForm.value = { - deliveryReference: taskDetail.manualDispatch?.deliveryReference || '', - deliveredCredential: taskDetail.manualDispatch?.deliveredCredential || '', - resultMessage: - taskDetail.manualDispatch?.resultMessage || taskDetail.task.resultMessage || '', - } - } - - async function submitManualDispatch(outcome: 'delivered' | 'failed') { - if (!detail.value) { - return - } - - const actionLabel = outcome === 'failed' ? '标记履约失败' : '标记已完成履约' - const confirmText = - outcome === 'failed' - ? `确认把任务 ${detail.value.task.taskNo} 回写为人工履约失败吗?这会把任务直接收口并保留失败原因。` - : `确认把任务 ${detail.value.task.taskNo} 回写为人工履约完成吗?这会把任务直接标记为已发放。` - - await runAction( - () => - completeAdminTaskManualDispatch(detail.value!.task.taskId, { - outcome, - resultMessage: manualDispatchForm.value.resultMessage, - deliveryReference: manualDispatchForm.value.deliveryReference, - deliveredCredential: manualDispatchForm.value.deliveredCredential, - }), - actionLabel, - confirmText, - ) - } - - async function copyText(value: string, successMessage: string) { - const text = String(value || '').trim() - if (!text) { - showError('当前没有可复制的内容') - return - } - - try { - await navigator.clipboard.writeText(text) - showSuccess(successMessage) - } catch { - showError('复制失败,请手动复制') - } - } - - function openExternalLink(value: string) { - const text = String(value || '').trim() - if (!text) { - return - } - - window.open(text, '_blank', 'noopener,noreferrer') - } - - onBeforeUnmount(clearScreenshotPreview) - - return { - loading, - actionLoading, - errorMessage, - detail, - screenshotPreviewUrl, - manualDispatchForm, - canManageTaskLifecycle, - canCloseTasks, - canViewSensitiveTaskData, - claimUrl, - claimLinkInvalid, - screenshotSectionTitle, - loadDetail, - runAction, - submitManualDispatch, - copyText, - openExternalLink, - } -} diff --git a/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskKuaishouCloud.ts b/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskKuaishouCloud.ts deleted file mode 100644 index 0d36cf22..00000000 --- a/apps/frontend-vue/src/views/admin/tasks/composables/useAdminTaskKuaishouCloud.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { computed, type Ref } from 'vue' - -import { - consumeAdminTaskKuaishouIndustryVoucher, - dispatchAdminTaskKuaishouCloudFulfillment, - prepareAdminTaskKuaishouCloudFulfillment, - refreshAdminTaskKuaishouCloudRoleInfo, - resendAdminTaskKuaishouIndustryVoucherCode, - returnNumberAdminTaskKuaishouCloudFulfillment, -} from '@/services/admin' -import type { AdminTaskActionResponse, AdminTaskDetail } from '@/types/admin' -import { formatKuaishouRoleInfoLabel } from '@/utils/admin-display' -import { formatAdminDateTime } from '@/utils/admin-time' - -import type { ChecklistItem, RoleInfoEntry, SummaryCard } from './types' - -export function useAdminTaskKuaishouCloud( - detail: Ref, - runAction: ( - action: () => Promise<{ data: AdminTaskActionResponse }>, - successMessage: string, - confirmText: string, - ) => Promise, -) { - const kuaishouCloudFlow = computed(() => detail.value?.kuaishouCloudFulfillment || null) - const kuaishouCloudRole = computed(() => kuaishouCloudFlow.value?.role || null) - const isKuaishouCloudTask = computed( - () => detail.value?.task.executorKey === 'kuaishou_ct_assisted', - ) - - const summaryCards = computed(() => { - if (!detail.value) { - return [] - } - - return [ - { - label: '任务状态', - value: detail.value.task.status || '-', - tone: 'blue', - }, - { - label: '履约状态', - value: detail.value.task.deliveryStatus || '-', - tone: 'green', - }, - { - label: '当前角色', - value: kuaishouCloudRole.value?.name || detail.value.task.roleName || '-', - tone: 'amber', - }, - { - label: '角色 ID', - value: kuaishouCloudRole.value?.rid || detail.value.task.roleId || '-', - tone: 'slate', - }, - ] - }) - - const kuaishouRoleInfoEntries = computed(() => { - const rawInfo = kuaishouCloudRole.value?.rawInfo - if (!rawInfo) { - return [] - } - - return Object.entries(rawInfo) - .filter(([, value]) => value !== null && value !== undefined && String(value).trim() !== '') - .map(([key, value]) => ({ - key, - label: formatKuaishouRoleInfoLabel(key), - value: typeof value === 'object' ? JSON.stringify(value) : String(value), - })) - }) - - const kuaishouCloudChecklist = computed(() => { - const flow = kuaishouCloudFlow.value - const role = kuaishouCloudRole.value - if (!flow) { - return [] - } - - return [ - { - key: 'ticket', - label: '核销码校验', - status: flow.ticket.status || 'pending', - detail: flow.ticket.verifiedAt - ? `已于 ${formatAdminDateTime(flow.ticket.verifiedAt)} 校验` - : '等待客户提交并校验核销码', - }, - { - key: 'bind', - label: '绑定资源', - status: flow.binding.prepareStatus || 'pending', - detail: flow.binding.bindPreparedAt - ? `绑定资源已准备,VN ${flow.binding.vnId || '-'}` - : '等待准备 Cloud 绑定资源', - }, - { - key: 'role', - label: '角色识别', - status: role?.status || 'pending', - detail: - role?.name || role?.rid - ? `${role?.name || '-'} / ${role?.rid || '-'}` - : '客户绑定后刷新角色信息', - }, - { - key: 'dispatch', - label: '发货执行', - status: flow.dispatch.status || 'pending', - detail: flow.dispatch.dispatchAt - ? `已于 ${formatAdminDateTime(flow.dispatch.dispatchAt)} 发货` - : '等待客服确认绑定并发货', - }, - { - key: 'return', - label: '退还号码', - status: flow.returnNumber.status || 'pending', - detail: flow.returnNumber.returnedAt - ? `已于 ${formatAdminDateTime(flow.returnNumber.returnedAt)} 退号` - : '发货后执行退还号码', - }, - { - key: 'consume', - label: '快手核销', - status: flow.consume.status || 'pending', - detail: flow.consume.consumedAt - ? `已于 ${formatAdminDateTime(flow.consume.consumedAt)} 完成核销` - : flow.consume.errorMessage || '等待退号后核销收口', - }, - ] - }) - - async function submitKuaishouCloudPrepare() { - if (!detail.value) { - return - } - - await runAction( - () => prepareAdminTaskKuaishouCloudFulfillment(detail.value!.task.taskId), - '绑定资源已准备完成', - `确认开始为任务 ${detail.value.task.taskNo} 准备绑定资源吗?系统会自动检查背包、余额并申请虚拟号。`, - ) - } - - async function submitKuaishouCloudDispatch() { - if (!detail.value) { - return - } - - await runAction( - () => dispatchAdminTaskKuaishouCloudFulfillment(detail.value!.task.taskId), - '已完成绑定确认并发货', - `确认客户已经完成绑定,并立即为任务 ${detail.value.task.taskNo} 执行发货吗?这个动作会把"确认绑定完成"和"发货"合并为一步。`, - ) - } - - async function submitKuaishouCloudRefreshRoleInfo() { - if (!detail.value) { - return - } - - await runAction( - () => refreshAdminTaskKuaishouCloudRoleInfo(detail.value!.task.taskId), - '角色信息已刷新', - `确认刷新任务 ${detail.value.task.taskNo} 当前云绑定角色信息吗?系统会重新查询 cloudtentacles 的绑定结果。`, - ) - } - - async function submitKuaishouCloudReturnNumber() { - if (!detail.value) { - return - } - - await runAction( - () => returnNumberAdminTaskKuaishouCloudFulfillment(detail.value!.task.taskId), - '号码已退还', - `确认退还任务 ${detail.value.task.taskNo} 当前使用的虚拟号吗?退号后该流程会正式收口。`, - ) - } - - async function submitKuaishouIndustryResendCode() { - if (!detail.value) { - return - } - - await runAction( - () => resendAdminTaskKuaishouIndustryVoucherCode(detail.value!.task.taskId), - '电子凭证发码回调已重发', - `确认重发任务 ${detail.value.task.taskNo} 的电子凭证发码回调吗?系统会复用当前核销码,不会生成新码。`, - ) - } - - async function submitKuaishouIndustryConsume() { - if (!detail.value) { - return - } - - await runAction( - () => consumeAdminTaskKuaishouIndustryVoucher(detail.value!.task.taskId), - '电子凭证已执行核销', - `确认手动执行任务 ${detail.value.task.taskNo} 的电子凭证核销吗?请先确认快手侧已收到发码回调。`, - ) - } - - return { - kuaishouCloudFlow, - kuaishouCloudRole, - isKuaishouCloudTask, - summaryCards, - kuaishouRoleInfoEntries, - kuaishouCloudChecklist, - submitKuaishouCloudPrepare, - submitKuaishouCloudDispatch, - submitKuaishouCloudRefreshRoleInfo, - submitKuaishouCloudReturnNumber, - submitKuaishouIndustryResendCode, - submitKuaishouIndustryConsume, - } -} diff --git a/apps/frontend-vue/src/views/admin/users/AdminUsersView.vue b/apps/frontend-vue/src/views/admin/users/AdminUsersView.vue deleted file mode 100644 index 9518122a..00000000 --- a/apps/frontend-vue/src/views/admin/users/AdminUsersView.vue +++ /dev/null @@ -1,88 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/users/components/AdminUsersFilterSection.vue b/apps/frontend-vue/src/views/admin/users/components/AdminUsersFilterSection.vue deleted file mode 100644 index 287578e5..00000000 --- a/apps/frontend-vue/src/views/admin/users/components/AdminUsersFilterSection.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/users/components/AdminUsersTable.vue b/apps/frontend-vue/src/views/admin/users/components/AdminUsersTable.vue deleted file mode 100644 index 47862a68..00000000 --- a/apps/frontend-vue/src/views/admin/users/components/AdminUsersTable.vue +++ /dev/null @@ -1,168 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/admin/users/composables/useAdminUsers.ts b/apps/frontend-vue/src/views/admin/users/composables/useAdminUsers.ts deleted file mode 100644 index 82de9cf1..00000000 --- a/apps/frontend-vue/src/views/admin/users/composables/useAdminUsers.ts +++ /dev/null @@ -1,199 +0,0 @@ -import { onMounted, ref } from 'vue' - -import { - isFeedbackDismissed, - showConfirm, - showError, - showPrompt, - showSuccess, -} from '@/lib/feedback' -import { - createAdminUser, - fetchAdminUsers, - resetAdminUserPassword, - updateAdminUserRole, - updateAdminUserStatus, -} from '@/services/admin' -import type { AdminPagination, AdminRole, AdminUserListItem } from '@/types/admin' -import { getAdminUserId, hasAdminRole } from '@/utils/admin-auth' -import { adminUserRoleOptions, adminUserStatusOptions } from '@/utils/admin-options' -import { formatAdminDateTime } from '@/utils/admin-time' - -export function useAdminUsers() { - const loading = ref(true) - const creating = ref(false) - const actionLoadingId = ref(null) - const errorMessage = ref('') - const username = ref('') - const role = ref('') - const status = ref('') - const createUsername = ref('') - const createPassword = ref('') - const createRole = ref('operator') - const items = ref([]) - const pagination = ref({ page: 1, pageSize: 20, total: 0 }) - - function isCurrentUser(userId: number) { - return getAdminUserId() === userId - } - - function formatRoleLabel(role: AdminRole) { - if (role === 'admin') return '管理员' - if (role === 'support') return '客服' - return '普通运营' - } - - async function loadUsers(page = pagination.value.page) { - if (!hasAdminRole('admin')) { - loading.value = false - return - } - loading.value = true - errorMessage.value = '' - try { - const response = await fetchAdminUsers({ - page, - pageSize: pagination.value.pageSize, - username: username.value.trim(), - role: role.value.trim(), - status: status.value.trim(), - }) - items.value = response.data.items - pagination.value = response.data.pagination - } catch (error) { - errorMessage.value = error instanceof Error ? error.message : '读取后台用户失败' - } finally { - loading.value = false - } - } - - async function submitCreate() { - if (!createUsername.value.trim() || !createPassword.value.trim()) { - showError('请填写账号和密码') - return - } - creating.value = true - try { - await createAdminUser({ - username: createUsername.value.trim(), - password: createPassword.value.trim(), - role: createRole.value, - status: 'active', - }) - showSuccess('后台用户已创建') - createUsername.value = '' - createPassword.value = '' - createRole.value = 'operator' - await loadUsers(1) - } catch (error) { - showError(error instanceof Error ? error.message : '创建后台用户失败') - } finally { - creating.value = false - } - } - - async function updateRole(item: AdminUserListItem, nextRole: AdminRole) { - if (item.role === nextRole) return - try { - await showConfirm( - `确认将 ${item.username} 调整为${formatRoleLabel(nextRole)}吗?`, - '确认操作', - { type: 'warning', confirmButtonText: '继续执行', cancelButtonText: '取消' }, - ) - } catch { - return - } - actionLoadingId.value = item.userId - try { - await updateAdminUserRole(item.userId, { role: nextRole }) - showSuccess('用户角色已更新') - await loadUsers() - } catch (error) { - showError(error instanceof Error ? error.message : '更新用户角色失败') - } finally { - actionLoadingId.value = null - } - } - - async function toggleStatus(item: AdminUserListItem) { - const nextStatus = item.status === 'active' ? 'disabled' : 'active' - try { - await showConfirm( - `确认将 ${item.username}${nextStatus === 'active' ? '启用' : '停用'}吗?`, - '确认操作', - { - type: nextStatus === 'active' ? 'info' : 'warning', - confirmButtonText: '继续执行', - cancelButtonText: '取消', - }, - ) - } catch { - return - } - actionLoadingId.value = item.userId - try { - await updateAdminUserStatus(item.userId, { status: nextStatus }) - showSuccess('用户状态已更新') - await loadUsers() - } catch (error) { - showError(error instanceof Error ? error.message : '更新用户状态失败') - } finally { - actionLoadingId.value = null - } - } - - async function promptResetPassword(item: AdminUserListItem) { - try { - const result = await showPrompt(`请输入 ${item.username} 的新密码`, '重置密码', { - inputType: 'password', - inputPlaceholder: '至少 8 位', - confirmButtonText: '提交', - cancelButtonText: '取消', - inputValidator: (value) => value.trim().length >= 8 || '密码至少 8 位', - }) - actionLoadingId.value = item.userId - await resetAdminUserPassword(item.userId, { password: result.value.trim() }) - showSuccess('用户密码已重置') - await loadUsers() - } catch (error) { - if (isFeedbackDismissed(error)) return - showError(error instanceof Error ? error.message : '重置密码失败') - } finally { - actionLoadingId.value = null - } - } - - onMounted(loadUsers) - - return { - // state - loading, - creating, - actionLoadingId, - errorMessage, - items, - pagination, - // filter - username, - role, - status, - // create - createUsername, - createPassword, - createRole, - // actions - loadUsers, - submitCreate, - updateRole, - toggleStatus, - promptResetPassword, - // formatters - isCurrentUser, - formatRoleLabel, - // utils - hasAdminRole, - formatAdminDateTime, - adminUserRoleOptions, - adminUserStatusOptions, - } -} diff --git a/apps/frontend-vue/src/views/claim/ClaimView.vue b/apps/frontend-vue/src/views/claim/ClaimView.vue deleted file mode 100644 index 45f05643..00000000 --- a/apps/frontend-vue/src/views/claim/ClaimView.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/KuaishouCloudClaimView.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/KuaishouCloudClaimView.vue deleted file mode 100644 index 153714f2..00000000 --- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/KuaishouCloudClaimView.vue +++ /dev/null @@ -1,260 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimBindingStep.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimBindingStep.vue deleted file mode 100644 index 359334a2..00000000 --- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimBindingStep.vue +++ /dev/null @@ -1,350 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimConfirmStep.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimConfirmStep.vue deleted file mode 100644 index c553ebd6..00000000 --- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimConfirmStep.vue +++ /dev/null @@ -1,171 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimHeaderCard.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimHeaderCard.vue deleted file mode 100644 index 557c72e4..00000000 --- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimHeaderCard.vue +++ /dev/null @@ -1,208 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimProductItems.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimProductItems.vue deleted file mode 100644 index 5f8534c5..00000000 --- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimProductItems.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimResultStep.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimResultStep.vue deleted file mode 100644 index 50ebe345..00000000 --- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimResultStep.vue +++ /dev/null @@ -1,181 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimSummaryCard.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimSummaryCard.vue deleted file mode 100644 index 71890a2f..00000000 --- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimSummaryCard.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimTicketStep.vue b/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimTicketStep.vue deleted file mode 100644 index e9507005..00000000 --- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/components/ClaimTicketStep.vue +++ /dev/null @@ -1,149 +0,0 @@ - - - - - diff --git a/apps/frontend-vue/src/views/claim/kuaishou-cloud/composables/useKuaishouCloudClaim.ts b/apps/frontend-vue/src/views/claim/kuaishou-cloud/composables/useKuaishouCloudClaim.ts deleted file mode 100644 index 623dc141..00000000 --- a/apps/frontend-vue/src/views/claim/kuaishou-cloud/composables/useKuaishouCloudClaim.ts +++ /dev/null @@ -1,523 +0,0 @@ -import { computed, onBeforeUnmount, onMounted, ref } from 'vue' -import QRCode from 'qrcode' -import { ElMessageBox } from 'element-plus' - -import { showError, showSuccess } from '@/lib/feedback' -import { - TASK_STATUS, - hasKuaishouCloudRedeemResultStatus, - isClaimInactiveTaskStatus, - isKuaishouCloudCompletedStatus, - isKuaishouCloudRoleConfirmedStatus, - normalizeTaskStatus, -} from '@/domain/task-status' -import { formatAdminDateTime } from '@/utils/admin-time' -import { - confirmKuaishouCloudClaimRole, - fetchClaimDetail, - rebindKuaishouCloudClaimRole, - redeemKuaishouCloudClaim, - verifyKuaishouCloudClaimTicket, -} from '@/services/claim' -import type { ClaimDetailData } from '@/types/claim' - -const BINDING_PREPARE_POLL_MS = 5_000 -const ROLE_FAST_POLL_MS = 10_000 -const ROLE_SLOW_POLL_MS = 30_000 -const ROLE_IDLE_POLL_MS = 60_000 -const ROLE_FAST_WINDOW_MS = 3 * 60_000 -const ROLE_IDLE_WINDOW_MS = 10 * 60_000 - -export function useKuaishouCloudClaim(token: () => string) { - const loading = ref(true) - const submitting = ref(false) - const refreshingRole = ref(false) - const confirmingRole = ref(false) - const rebindingRole = ref(false) - const redeeming = ref(false) - const errorMessage = ref('') - const detail = ref(null) - const ticketCode = ref('') - const qrCodeDataUrl = ref('') - let pollTimer = 0 - let rolePollBaselineAt = 0 - let rolePollBaselineKey = '' - - // ── derived data ──────────────────────────────────────── - - const flow = computed(() => detail.value?.kuaishouCloudFulfillment || null) - const feifei = computed(() => detail.value?.kuaishouFeifei || null) - const order = computed(() => detail.value?.order || null) - const orderItem = computed(() => detail.value?.orderItem || null) - const product = computed(() => detail.value?.product || null) - const task = computed(() => detail.value?.task || null) - - // ── computed status flags ─────────────────────────────── - - const roleName = computed(() => flow.value?.role.name || flow.value?.binding.roleName || '') - const roleId = computed(() => flow.value?.role.rid || flow.value?.binding.roleId || '') - const isFeifeiFlow = computed(() => detail.value?.flowType === 'kuaishou_feifei') - const isTicketVerified = computed(() => flow.value?.ticket.status === 'verified') - - const isBindUrlExpired = computed(() => { - const expiresAt = String(flow.value?.binding.bindExpiresAt || '').trim() - if (!expiresAt) { - return false - } - const expiresTime = Date.parse(expiresAt) - return Number.isFinite(expiresTime) && expiresTime <= Date.now() - }) - - const isBindingPrepared = computed( - () => - flow.value?.binding.prepareStatus === 'ready' && - Boolean(String(flow.value?.binding.bindUrl || '').trim()) && - !isBindUrlExpired.value, - ) - - const isBindingPreparing = computed(() => flow.value?.binding.prepareStatus === 'pending') - const canEnterBindingStep = computed(() => isTicketVerified.value) - const isRoleReady = computed(() => Boolean(roleName.value || roleId.value)) - const hasDefaultRoleSnapshot = computed(() => - Boolean(flow.value?.role.defaultName || flow.value?.role.defaultRid), - ) - const isDefaultRole = computed(() => flow.value?.role.isDefaultRole === true) - const isCustomerRoleReady = computed( - () => isRoleReady.value && hasDefaultRoleSnapshot.value && !isDefaultRole.value, - ) - const confirmRoleDisabledReason = computed(() => { - if (!isBindingPrepared.value) { - return '绑定二维码还在准备中,请稍后自动刷新' - } - if (!hasDefaultRoleSnapshot.value) { - return flow.value?.role.defaultErrorMessage || '系统还未获取到虚拟机默认角色信息,请稍后刷新' - } - if (!isRoleReady.value) { - return '请先扫码绑定自己的角色,并刷新角色信息' - } - if (isDefaultRole.value) { - return '当前仍是虚拟机默认角色,请重新绑定自己的角色信息' - } - if (rebindingRole.value) { - return '正在换绑角色,请稍候' - } - return '' - }) - const isRoleConfirmed = computed(() => isKuaishouCloudRoleConfirmedStatus(task.value?.status)) - const isDispatched = computed( - () => String(flow.value?.dispatch.status || '').trim() === 'success', - ) - const isRedeemFailed = computed(() => { - const status = normalizeTaskStatus(task.value?.status) - return ( - status === TASK_STATUS.MANUAL_REVIEW || - status === TASK_STATUS.FAILED || - String(flow.value?.dispatch.status || '').trim() === 'failed' - ) - }) - - const isCompleted = computed(() => isKuaishouCloudCompletedStatus(task.value?.status)) - - const hasRedeemResult = computed(() => { - return isDispatched.value || hasKuaishouCloudRedeemResultStatus(task.value?.status) - }) - - const canSubmitTicket = computed( - () => !isClaimInactiveTaskStatus(task.value?.status) && !submitting.value, - ) - - const currentStep = computed(() => { - if (isFeifeiFlow.value) { - return isCompleted.value ? 4 : 2 - } - if (hasRedeemResult.value) { - return 4 - } - if (isRoleConfirmed.value) { - return 3 - } - if (canEnterBindingStep.value) { - return 2 - } - return 1 - }) - - const progressText = computed(() => { - if (isFeifeiFlow.value) { - return feifei.value?.rechargeStatusLabel || '请打开领取链接' - } - if (hasRedeemResult.value) { - return '兑换结果已生成' - } - if (isRoleConfirmed.value) { - return '角色已确认,等待兑换' - } - if (isTicketVerified.value) { - return isBindingPrepared.value ? '请完成扫码绑定' : '绑定链接刷新中,请稍候' - } - return '等待提交并核销' - }) - - const resultTitle = computed(() => { - if (isRedeemFailed.value) { - return '兑换遇到问题' - } - if (isCompleted.value) { - return '兑换成功' - } - if (isDispatched.value) { - return '兑换请求已提交' - } - return '结果已记录' - }) - - const resultDescription = computed(() => { - if (isRedeemFailed.value) { - const message = String( - task.value?.lastError || - flow.value?.dispatch.errorMessage || - detail.value?.result?.resultMessage || - '', - ).trim() - return message || '当前兑换流程需要客服处理,后续结果请以后台任务界面为准。' - } - if (isCompleted.value) { - return '当前兑换流程已经完成。发货、退号和核销结果会保存在后台任务界面。' - } - return '你的兑换请求已经提交。发货、退号和核销结果会由系统保存在后台任务界面,无需在此页面等待。' - }) - - const resultVariant = computed(() => { - if (isRedeemFailed.value) { - return 'warning' - } - if (isCompleted.value || isDispatched.value) { - return 'success' - } - return 'info' - }) - - // ── actions ───────────────────────────────────────────── - - async function generateQRCode(url: string) { - if (!url) { - qrCodeDataUrl.value = '' - return - } - try { - qrCodeDataUrl.value = await QRCode.toDataURL(url, { - width: 280, - margin: 2, - color: { - dark: '#0f172a', - light: '#ffffff', - }, - }) - } catch (error) { - qrCodeDataUrl.value = '' - console.error('生成二维码失败:', error) - } - } - - async function applyDetail(nextDetail: ClaimDetailData) { - detail.value = nextDetail - if (!ticketCode.value && nextDetail.kuaishouCloudFulfillment?.ticket.code) { - ticketCode.value = nextDetail.kuaishouCloudFulfillment.ticket.code - } - await generateQRCode(String(nextDetail.kuaishouCloudFulfillment?.binding.bindUrl || '').trim()) - } - - async function loadDetail(options: { silent?: boolean } = {}) { - if (!options.silent) { - loading.value = true - } - errorMessage.value = '' - try { - const response = await fetchClaimDetail(token()) - await applyDetail(response.data) - syncPolling() - } catch (error) { - errorMessage.value = error instanceof Error ? error.message : '读取领取信息失败' - stopPolling() - } finally { - if (!options.silent) { - loading.value = false - } - } - } - - async function submitTicket() { - const normalizedTicketCode = ticketCode.value.trim() - if (!normalizedTicketCode) { - showError('请输入核销码') - return - } - - submitting.value = true - try { - const response = await verifyKuaishouCloudClaimTicket(token(), { - ticketCode: normalizedTicketCode, - }) - await applyDetail(response.data) - showSuccess('核销已完成,系统已开始准备绑定资源') - syncPolling() - } catch (error) { - showError(error instanceof Error ? error.message : '核销码验证失败') - } finally { - submitting.value = false - } - } - - async function refreshRole() { - refreshingRole.value = true - try { - await loadDetail({ silent: true }) - if (isCustomerRoleReady.value) { - showSuccess('角色信息已刷新') - } else if (isDefaultRole.value) { - showError('当前仍是虚拟机默认角色,请重新绑定自己的角色信息') - } else { - showError( - flow.value?.role.errorMessage || - flow.value?.role.defaultErrorMessage || - '暂时还没有识别到角色信息,请完成绑定后稍等片刻再试', - ) - } - } finally { - refreshingRole.value = false - } - } - - async function confirmRole() { - confirmingRole.value = true - try { - const response = await confirmKuaishouCloudClaimRole(token()) - await applyDetail(response.data) - showSuccess('角色已确认,进入下一步') - syncPolling() - } catch (error) { - showError(error instanceof Error ? error.message : '确认角色失败') - } finally { - confirmingRole.value = false - } - } - - async function confirmRedeem() { - try { - await ElMessageBox.confirm( - '兑换后不可取消,也不可退货。请确认角色和商品信息完全正确。', - '确认兑换', - { - confirmButtonText: '确认兑换', - cancelButtonText: '取消', - type: 'warning', - center: true, - }, - ) - } catch { - return - } - - redeeming.value = true - try { - const response = await redeemKuaishouCloudClaim(token()) - await applyDetail(response.data) - showSuccess('兑换请求已提交') - syncPolling() - } catch (error) { - showError(error instanceof Error ? error.message : '兑换失败') - } finally { - redeeming.value = false - } - } - - async function rebindRole() { - try { - await ElMessageBox.confirm( - '换绑后当前绑定链接会失效,系统会退还当前虚拟号并生成新的绑定二维码。核销码和领取商品不会改变,但需要重新扫码绑定角色。', - '确认换绑角色', - { - confirmButtonText: '确认换绑', - cancelButtonText: '取消', - type: 'warning', - center: true, - }, - ) - } catch { - return - } - - rebindingRole.value = true - try { - const response = await rebindKuaishouCloudClaimRole(token()) - await applyDetail(response.data) - showSuccess('新的绑定二维码已生成,请重新绑定角色') - syncPolling() - } catch (error) { - showError(error instanceof Error ? error.message : '换绑角色失败') - } finally { - rebindingRole.value = false - } - } - - function openBindUrl(useCurrentPage = false) { - const bindUrl = String(flow.value?.binding.bindUrl || '').trim() - if (!bindUrl) { - showError('绑定链接还没准备好,请稍后刷新') - return - } - if (useCurrentPage) { - window.location.assign(bindUrl) - return - } - window.open(bindUrl, '_blank', 'noopener,noreferrer') - } - - function openFeifeiUrl(useCurrentPage = false) { - const url = String(feifei.value?.h5.rechargeUrl || feifei.value?.h5.entryUrl || '').trim() - if (!url) { - showError('领取链接还没准备好,请稍后刷新') - return - } - if (useCurrentPage) { - window.location.assign(url) - return - } - window.open(url, '_blank', 'noopener,noreferrer') - } - - // ── polling ───────────────────────────────────────────── - - function stopPolling() { - if (pollTimer) { - window.clearTimeout(pollTimer) - pollTimer = 0 - } - } - - function syncPolling() { - const delay = resolveNextPollDelay() - if (!delay) { - stopPolling() - return - } - - stopPolling() - pollTimer = window.setTimeout(() => { - pollTimer = 0 - void loadDetail({ silent: true }) - }, delay) - } - - function resolveNextPollDelay() { - if (!flow.value || hasRedeemResult.value || isClaimInactiveTaskStatus(task.value?.status)) { - return 0 - } - - if (currentStep.value === 2) { - if (!isBindingPrepared.value) { - return BINDING_PREPARE_POLL_MS - } - - return resolveRolePollDelay() - } - - if (currentStep.value === 3) { - return 0 - } - - return 0 - } - - function resolveRolePollDelay() { - const nextRoleKey = [roleName.value, roleId.value].join('::') - const now = Date.now() - - if (nextRoleKey !== rolePollBaselineKey) { - rolePollBaselineKey = nextRoleKey - rolePollBaselineAt = now - } - - if (!rolePollBaselineAt) { - rolePollBaselineAt = now - } - - const elapsedMs = now - rolePollBaselineAt - if (elapsedMs < ROLE_FAST_WINDOW_MS) { - return ROLE_FAST_POLL_MS - } - - if (elapsedMs < ROLE_IDLE_WINDOW_MS) { - return ROLE_SLOW_POLL_MS - } - - return ROLE_IDLE_POLL_MS - } - - // ── lifecycle ─────────────────────────────────────────── - - onMounted(() => { - void loadDetail() - }) - - onBeforeUnmount(() => { - stopPolling() - }) - - return { - // state - loading, - submitting, - refreshingRole, - confirmingRole, - rebindingRole, - redeeming, - errorMessage, - detail, - ticketCode, - qrCodeDataUrl, - // derived data - flow, - feifei, - order, - orderItem, - product, - task, - // computed status - roleName, - roleId, - isFeifeiFlow, - isTicketVerified, - isBindUrlExpired, - isBindingPrepared, - isBindingPreparing, - canEnterBindingStep, - isRoleReady, - hasDefaultRoleSnapshot, - isDefaultRole, - isCustomerRoleReady, - confirmRoleDisabledReason, - isRoleConfirmed, - isDispatched, - isRedeemFailed, - isCompleted, - hasRedeemResult, - canSubmitTicket, - currentStep, - progressText, - resultTitle, - resultDescription, - resultVariant, - // actions - loadDetail, - submitTicket, - refreshRole, - confirmRole, - rebindRole, - confirmRedeem, - openBindUrl, - openFeifeiUrl, - // utility - formatAdminDateTime, - } -} diff --git a/apps/frontend-vue/tsconfig.app.json b/apps/frontend-vue/tsconfig.app.json deleted file mode 100644 index 245d63d0..00000000 --- a/apps/frontend-vue/tsconfig.app.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "@vue/tsconfig/tsconfig.dom.json", - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", - "types": ["vite/client"], - "paths": { - "@/*": ["./src/*"] - }, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "erasableSyntaxOnly": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true - }, - "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] -} diff --git a/apps/frontend-vue/tsconfig.json b/apps/frontend-vue/tsconfig.json deleted file mode 100644 index d32ff682..00000000 --- a/apps/frontend-vue/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "files": [], - "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] -} diff --git a/apps/frontend-vue/tsconfig.node.json b/apps/frontend-vue/tsconfig.node.json deleted file mode 100644 index 8a67f62f..00000000 --- a/apps/frontend-vue/tsconfig.node.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "target": "ES2023", - "lib": ["ES2023"], - "module": "ESNext", - "types": ["node"], - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "moduleDetection": "force", - "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "erasableSyntaxOnly": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/apps/frontend-vue/vite.config.ts b/apps/frontend-vue/vite.config.ts deleted file mode 100644 index 1b7f2e33..00000000 --- a/apps/frontend-vue/vite.config.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { fileURLToPath, URL } from 'node:url' - -import { defineConfig, loadEnv } from 'vite' -import vue from '@vitejs/plugin-vue' -import AutoImport from 'unplugin-auto-import/vite' -import Components from 'unplugin-vue-components/vite' -import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' - -export default defineConfig(({ mode }) => { - const env = loadEnv(mode, process.cwd(), '') - const allowedHosts = parseAllowedHosts(env.VITE_ALLOWED_HOSTS) - - return { - plugins: [ - vue(), - AutoImport({ - imports: ['vue', 'vue-router'], - dts: 'src/auto-imports.d.ts', - resolvers: [ElementPlusResolver({ importStyle: 'css' })], - }), - Components({ - dts: 'src/components.d.ts', - resolvers: [ElementPlusResolver({ importStyle: 'css' })], - }), - ], - resolve: { - alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)), - }, - }, - server: { - host: env.VITE_DEV_HOST === 'true', - allowedHosts: env.VITE_ALLOW_ALL_HOSTS === 'true' ? true : allowedHosts, - proxy: { - '/api': { - target: env.VITE_API_TARGET || 'http://localhost:3000', - changeOrigin: true, - }, - }, - }, - build: { - rollupOptions: { - output: { - manualChunks: splitVendorChunk, - }, - }, - }, - } -}) - -function parseAllowedHosts(value?: string) { - const hosts = value - ?.split(',') - .map((host) => host.trim()) - .filter(Boolean) - - return hosts && hosts.length > 0 ? hosts : ['localhost', '127.0.0.1'] -} - -const elementPlusChunkGroups: Array<[string, string[]]> = [ - [ - 'element-plus-form', - [ - '/components/form', - '/components/input', - '/components/select', - '/components/date-picker', - '/components/checkbox', - '/components/radio', - '/components/switch', - '/components/upload', - ], - ], - [ - 'element-plus-data', - [ - '/components/table', - '/components/pagination', - '/components/tag', - '/components/card', - '/components/descriptions', - '/components/empty', - ], - ], - [ - 'element-plus-feedback', - [ - '/components/message', - '/components/message-box', - '/components/dialog', - '/components/popover', - '/components/tooltip', - '/components/loading', - ], - ], - [ - 'element-plus-navigation', - ['/components/menu', '/components/tabs', '/components/breadcrumb', '/components/dropdown'], - ], - [ - 'element-plus-layout', - [ - '/components/container', - '/components/row', - '/components/col', - '/components/space', - '/components/divider', - ], - ], -] - -function splitVendorChunk(id: string) { - if (!id.includes('/node_modules/')) { - return - } - - if (id.includes('/node_modules/@element-plus/icons-vue/')) { - return 'element-plus-icons' - } - - if (id.includes('/node_modules/element-plus/')) { - return splitElementPlusChunk(id) - } - - if (id.includes('/node_modules/vue/') || id.includes('/node_modules/vue-router/')) { - return 'vue-vendor' - } - - if (id.includes('/node_modules/axios/')) { - return 'axios' - } - - if (id.includes('/node_modules/qrcode/')) { - return 'qrcode' - } - - return 'vendor' -} - -function splitElementPlusChunk(id: string) { - for (const [chunkName, includesList] of elementPlusChunkGroups) { - if (includesList.some((includePath) => id.includes(includePath))) { - return chunkName - } - } - - return 'element-plus-core' -}