diff --git a/webui/.vscode/settings.json b/webui/.vscode/settings.json index 1fb0955e..f1e54e09 100644 --- a/webui/.vscode/settings.json +++ b/webui/.vscode/settings.json @@ -2,5 +2,6 @@ "i18n-ally.localesPaths": ["src/i18n"], "commentTranslate.targetLanguage": "zh-CN", "i18n-ally.sourceLanguage": "en", - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", + "i18n-ally.keystyle": "nested" } diff --git a/webui/package.json b/webui/package.json index 6b1b588f..c341a596 100644 --- a/webui/package.json +++ b/webui/package.json @@ -55,8 +55,6 @@ "eslint-plugin-storybook": "^0.6.12", "husky": "^8.0.3", "prettier": "^2.8.8", - "react": "^18.2.0", - "react-dom": "^18.2.0", "sass": "^1.62.1", "storybook": "^7.0.12", "typescript": "^4.9.5", diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 06bffb23..5d93545b 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -112,12 +112,6 @@ devDependencies: prettier: specifier: ^2.8.8 version: 2.8.8 - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) sass: specifier: ^1.62.1 version: 1.62.1 @@ -418,6 +412,20 @@ packages: semver: 6.3.0 dev: true + /@babel/helper-compilation-targets@7.21.5(@babel/core@7.24.0): + resolution: {integrity: sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.9 + '@babel/core': 7.24.0 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.5 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} @@ -449,6 +457,26 @@ packages: - supports-color dev: true + /@babel/helper-create-class-features-plugin@7.21.8(@babel/core@7.24.0): + resolution: {integrity: sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.21.5 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.21.5 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.21.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-split-export-declaration': 7.18.6 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-create-class-features-plugin@7.24.0(@babel/core@7.24.0): resolution: {integrity: sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==} engines: {node: '>=6.9.0'} @@ -479,6 +507,18 @@ packages: semver: 6.3.0 dev: true + /@babel/helper-create-regexp-features-plugin@7.21.8(@babel/core@7.24.0): + resolution: {integrity: sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.3.2 + semver: 6.3.0 + dev: true + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.8): resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: @@ -495,6 +535,22 @@ packages: - supports-color dev: true + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.24.0): + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.21.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.2 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-environment-visitor@7.21.5: resolution: {integrity: sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==} engines: {node: '>=6.9.0'} @@ -632,6 +688,21 @@ packages: - supports-color dev: true + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.24.0): + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.21.5 + '@babel/helper-wrap-function': 7.20.5 + '@babel/types': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-replace-supers@7.21.5: resolution: {integrity: sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==} engines: {node: '>=6.9.0'} @@ -805,6 +876,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.8): resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} @@ -817,6 +898,18 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.8) dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.24.0): + resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.0) + dev: true + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.8): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} @@ -832,6 +925,21 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.24.0): + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-environment-visitor': 7.21.5 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.24.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -845,6 +953,19 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-class-features-plugin': 7.21.8(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.8): resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} engines: {node: '>=6.9.0'} @@ -859,6 +980,20 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.24.0): + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-class-features-plugin': 7.21.8(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.0) + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} @@ -870,6 +1005,17 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.8) dev: true + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.0) + dev: true + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.8): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -881,6 +1027,17 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.8) dev: true + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.24.0): + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.0) + dev: true + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} @@ -892,6 +1049,17 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.8) dev: true + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) + dev: true + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.8): resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} @@ -903,6 +1071,17 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.8) dev: true + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.24.0): + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) + dev: true + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -914,6 +1093,17 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.8) dev: true + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) + dev: true + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -925,6 +1115,17 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.8) dev: true + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) + dev: true + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.8): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} @@ -939,6 +1140,20 @@ packages: '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.8) dev: true + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.0): + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.9 + '@babel/core': 7.24.0 + '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.24.0) + dev: true + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -950,6 +1165,17 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.8) dev: true + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) + dev: true + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.8): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} @@ -962,6 +1188,18 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.8) dev: true + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.0): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) + dev: true + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -975,6 +1213,19 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-class-features-plugin': 7.21.8(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.8): resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} engines: {node: '>=6.9.0'} @@ -990,6 +1241,21 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.24.0): + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.21.8(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.0) + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} @@ -1001,6 +1267,17 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-regexp-features-plugin': 7.21.8(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.8): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -1010,6 +1287,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.8): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -1019,6 +1305,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.8): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -1029,6 +1324,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.0): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.8): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -1038,6 +1343,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.8): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -1047,6 +1361,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-flow@7.21.4(@babel/core@7.21.8): resolution: {integrity: sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==} engines: {node: '>=6.9.0'} @@ -1067,6 +1390,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.24.0): + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.8): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -1076,6 +1409,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.8): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -1085,6 +1427,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.21.8): resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} engines: {node: '>=6.9.0'} @@ -1114,6 +1465,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.8): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -1123,6 +1483,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.8): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -1132,6 +1501,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.8): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -1141,6 +1519,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.8): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -1150,6 +1537,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.8): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -1159,6 +1555,15 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.8): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -1169,6 +1574,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.0): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.8): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -1179,6 +1594,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.21.8): resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} engines: {node: '>=6.9.0'} @@ -1209,6 +1634,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-arrow-functions@7.21.5(@babel/core@7.24.0): + resolution: {integrity: sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.8): resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} @@ -1223,6 +1658,20 @@ packages: - supports-color dev: true + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.24.0): + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-module-imports': 7.21.4 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.24.0) + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} @@ -1233,6 +1682,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.8): resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} @@ -1243,6 +1702,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.24.0): + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.8): resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} engines: {node: '>=6.9.0'} @@ -1263,6 +1732,26 @@ packages: - supports-color dev: true + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.24.0): + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.24.0) + '@babel/helper-environment-visitor': 7.21.5 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-replace-supers': 7.21.5 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-computed-properties@7.21.5(@babel/core@7.21.8): resolution: {integrity: sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==} engines: {node: '>=6.9.0'} @@ -1274,6 +1763,17 @@ packages: '@babel/template': 7.21.9 dev: true + /@babel/plugin-transform-computed-properties@7.21.5(@babel/core@7.24.0): + resolution: {integrity: sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/template': 7.21.9 + dev: true + /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.8): resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} engines: {node: '>=6.9.0'} @@ -1284,6 +1784,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.24.0): + resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} @@ -1295,6 +1805,17 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-regexp-features-plugin': 7.21.8(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.8): resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} @@ -1305,6 +1826,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.24.0): + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} @@ -1316,6 +1847,17 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.21.5 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-flow-strip-types@7.21.0(@babel/core@7.21.8): resolution: {integrity: sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==} engines: {node: '>=6.9.0'} @@ -1337,6 +1879,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-for-of@7.21.5(@babel/core@7.24.0): + resolution: {integrity: sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.8): resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} @@ -1349,6 +1901,18 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.24.0): + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.24.0) + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.8): resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} @@ -1359,6 +1923,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.24.0): + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} @@ -1369,6 +1943,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.8): resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} @@ -1382,6 +1966,19 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.24.0): + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-module-transforms': 7.21.5 + '@babel/helper-plugin-utils': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.21.8): resolution: {integrity: sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==} engines: {node: '>=6.9.0'} @@ -1396,6 +1993,20 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.24.0): + resolution: {integrity: sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-module-transforms': 7.21.5 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-simple-access': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.8): resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} @@ -1411,6 +2022,21 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.24.0): + resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.21.5 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} @@ -1424,6 +2050,19 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-module-transforms': 7.21.5 + '@babel/helper-plugin-utils': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.8): resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} @@ -1435,6 +2074,17 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.24.0): + resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-regexp-features-plugin': 7.21.8(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} @@ -1445,6 +2095,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} @@ -1458,6 +2118,19 @@ packages: - supports-color dev: true + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-replace-supers': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.8): resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} engines: {node: '>=6.9.0'} @@ -1468,6 +2141,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.24.0): + resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} @@ -1478,6 +2161,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-react-jsx@7.21.5(@babel/core@7.21.8): resolution: {integrity: sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==} engines: {node: '>=6.9.0'} @@ -1503,6 +2196,17 @@ packages: regenerator-transform: 0.15.1 dev: true + /@babel/plugin-transform-regenerator@7.21.5(@babel/core@7.24.0): + resolution: {integrity: sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + regenerator-transform: 0.15.1 + dev: true + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} @@ -1513,6 +2217,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} @@ -1523,6 +2237,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.8): resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} @@ -1534,6 +2258,17 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.24.0): + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + dev: true + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} @@ -1544,6 +2279,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.8): resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} @@ -1554,6 +2299,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.24.0): + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.8): resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} @@ -1564,6 +2319,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.24.0): + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.21.8): resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} engines: {node: '>=6.9.0'} @@ -1602,6 +2367,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-unicode-escapes@7.21.5(@babel/core@7.24.0): + resolution: {integrity: sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} @@ -1613,6 +2388,17 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-regexp-features-plugin': 7.21.8(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/preset-env@7.21.5(@babel/core@7.21.8): resolution: {integrity: sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==} engines: {node: '>=6.9.0'} @@ -1700,6 +2486,93 @@ packages: - supports-color dev: true + /@babel/preset-env@7.21.5(@babel/core@7.24.0): + resolution: {integrity: sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.9 + '@babel/core': 7.24.0 + '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.24.0) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.24.0) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.24.0) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.24.0) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.24.0) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.0) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.0) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.24.0) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.24.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) + '@babel/plugin-transform-arrow-functions': 7.21.5(@babel/core@7.24.0) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.24.0) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.24.0) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.24.0) + '@babel/plugin-transform-computed-properties': 7.21.5(@babel/core@7.24.0) + '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.24.0) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.24.0) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-for-of': 7.21.5(@babel/core@7.24.0) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.24.0) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.24.0) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.24.0) + '@babel/plugin-transform-modules-commonjs': 7.21.5(@babel/core@7.24.0) + '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.24.0) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.24.0) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.24.0) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-regenerator': 7.21.5(@babel/core@7.24.0) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.24.0) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.24.0) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.24.0) + '@babel/plugin-transform-unicode-escapes': 7.21.5(@babel/core@7.24.0) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.24.0) + '@babel/preset-modules': 0.1.5(@babel/core@7.24.0) + '@babel/types': 7.21.5 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.24.0) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.24.0) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.24.0) + core-js-compat: 3.30.2 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/preset-flow@7.21.4(@babel/core@7.21.8): resolution: {integrity: sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA==} engines: {node: '>=6.9.0'} @@ -1725,6 +2598,19 @@ packages: esutils: 2.0.3 dev: true + /@babel/preset-modules@0.1.5(@babel/core@7.24.0): + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.21.5 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.24.0) + '@babel/types': 7.21.5 + esutils: 2.0.3 + dev: true + /@babel/preset-typescript@7.21.5(@babel/core@7.21.8): resolution: {integrity: sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==} engines: {node: '>=6.9.0'} @@ -2429,7 +3315,7 @@ packages: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: true - /@rollup/plugin-babel@5.3.1(@babel/core@7.21.8)(rollup@2.79.1): + /@rollup/plugin-babel@5.3.1(@babel/core@7.24.0)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -2440,7 +3326,7 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.21.8 + '@babel/core': 7.24.0 '@babel/helper-module-imports': 7.22.15 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 @@ -4704,6 +5590,19 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.24.0): + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.9 + '@babel/core': 7.24.0 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.24.0) + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.8): resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: @@ -4716,6 +5615,18 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.24.0): + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.24.0) + core-js-compat: 3.30.2 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.8): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: @@ -4727,6 +5638,17 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.24.0): + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.24.0) + transitivePeerDependencies: + - supports-color + dev: true + /babel-walk@3.0.0-canary-5: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} @@ -10510,10 +11432,10 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) - '@babel/core': 7.21.8 - '@babel/preset-env': 7.21.5(@babel/core@7.21.8) + '@babel/core': 7.24.0 + '@babel/preset-env': 7.21.5(@babel/core@7.24.0) '@babel/runtime': 7.21.5 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.21.8)(rollup@2.79.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.0)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 diff --git a/webui/src/App.vue b/webui/src/App.vue index d56f8893..bdd2062c 100644 --- a/webui/src/App.vue +++ b/webui/src/App.vue @@ -1,9 +1,5 @@ - - - + diff --git a/webui/src/api/auth.ts b/webui/src/api/auth.ts index dade168b..d5be7e8a 100644 --- a/webui/src/api/auth.ts +++ b/webui/src/api/auth.ts @@ -1,4 +1,5 @@ -import type { LoginSuccess, Logout, Update } from '#/auth'; +import type { LoginSuccess, Update } from '#/auth'; +import type { ApiSuccess } from '#/api'; export const apiAuth = { async login(username: string, password: string) { @@ -26,8 +27,8 @@ export const apiAuth = { }, async logout() { - const { data } = await axios.get('api/v1/auth/logout'); - return data.message === 'logout success'; + const { data } = await axios.get('api/v1/auth/logout'); + return data; }, async update(username: string, password: string) { diff --git a/webui/src/api/bangumi.ts b/webui/src/api/bangumi.ts index d04fa2cb..ce7c8df3 100644 --- a/webui/src/api/bangumi.ts +++ b/webui/src/api/bangumi.ts @@ -1,3 +1,4 @@ +import { omit } from 'lodash'; import type { BangumiAPI, BangumiRule } from '#/bangumi'; import type { ApiSuccess } from '#/api'; diff --git a/webui/src/components/ab-add-rss.vue b/webui/src/components/ab-add-rss.vue index ee3b0d37..04bf1a98 100644 --- a/webui/src/components/ab-add-rss.vue +++ b/webui/src/components/ab-add-rss.vue @@ -1,22 +1,21 @@ - - + + + + + - {{ - $t('topbar.add.button') - }} + + {{ $t('topbar.add.button') }} + - + - - Collect - Subscribe + + + {{ $t('topbar.add.collect') }} + + + + {{ $t('topbar.add.subscribe') }} + diff --git a/webui/src/components/ab-bangumi-card.vue b/webui/src/components/ab-bangumi-card.vue index ec73e6d9..c1b732ac 100644 --- a/webui/src/components/ab-bangumi-card.vue +++ b/webui/src/components/ab-bangumi-card.vue @@ -16,9 +16,9 @@ defineEmits(['click']); - $emit('click')"> - - + $emit('click')"> + + @@ -36,54 +36,47 @@ defineEmits(['click']); z-1 inset-0 opacity-0 - transition-all - duration-300 - hover:backdrop-blur-2px - hover:bg-white - hover:bg-opacity-30 - hover:opacity-100 - active:duration-0 - active:bg-opacity-60 + transition="all duration-300" + hover="backdrop-blur-2 bg-white bg-opacity-30 opacity-100" + active="duration-0 bg-opacity-60" class="group" > - + {{ bangumi.official_title }} - - - + + + @@ -93,23 +86,21 @@ defineEmits(['click']); - - + + {{ bangumi.official_title }} - - - - - + + + + @@ -117,13 +108,3 @@ defineEmits(['click']); - - diff --git a/webui/src/components/ab-change-account.vue b/webui/src/components/ab-change-account.vue index a2285fcb..67c710e1 100644 --- a/webui/src/components/ab-change-account.vue +++ b/webui/src/components/ab-change-account.vue @@ -10,9 +10,9 @@ const { user, update } = useAuth(); - + - + @@ -26,7 +26,7 @@ withDefaults( - + diff --git a/webui/src/components/ab-edit-rule.vue b/webui/src/components/ab-edit-rule.vue index aa752b51..1e50847f 100644 --- a/webui/src/components/ab-edit-rule.vue +++ b/webui/src/components/ab-edit-rule.vue @@ -1,19 +1,19 @@ @@ -79,55 +79,47 @@ const boxSize = computed(() => { {{ $t('homepage.rule.enable_hit') }} - + - - emitEnable()">{{ - $t('homepage.rule.yes_btn') - }} + + emitEnable()"> + {{ $t('homepage.rule.yes_btn') }} - close()">{{ - $t('homepage.rule.no_btn') - }} + close()"> + {{ $t('homepage.rule.no_btn') }} - + - + - {{ - $t('homepage.rule.apply') - }} + + {{ $t('homepage.rule.apply') }} {{ $t('homepage.rule.delete_hit') }} - + - - emitdeleteFile(true)" - >{{ $t('homepage.rule.yes_btn') }} - - emitdeleteFile(false)">{{ - $t('homepage.rule.no_btn') - }} + + emitdeleteFile(true)"> + {{ $t('homepage.rule.yes_btn') }} + + emitdeleteFile(false)"> + {{ $t('homepage.rule.no_btn') }} diff --git a/webui/src/components/ab-fold-panel.vue b/webui/src/components/ab-fold-panel.vue index 678941f4..9990dc36 100644 --- a/webui/src/components/ab-fold-panel.vue +++ b/webui/src/components/ab-fold-panel.vue @@ -14,14 +14,14 @@ withDefaults( - + {{ title }} @@ -29,8 +29,8 @@ withDefaults( - - + + diff --git a/webui/src/components/ab-label.vue b/webui/src/components/ab-label.vue index 1eaa20af..22aaf766 100644 --- a/webui/src/components/ab-label.vue +++ b/webui/src/components/ab-label.vue @@ -8,19 +8,16 @@ const props = withDefaults( } ); -function abLabel() { - if (typeof props.label === 'function') { - return props.label(); - } else { - return props.label; - } -} +const abLabel = computed(() => { + if (typeof props.label === 'function') return props.label(); + else return props.label; +}); - - {{ abLabel() }} + + {{ abLabel }} - + diff --git a/webui/src/components/ab-popup.vue b/webui/src/components/ab-popup.vue index b7c036ed..8f05dc90 100644 --- a/webui/src/components/ab-popup.vue +++ b/webui/src/components/ab-popup.vue @@ -40,13 +40,11 @@ function close() { leave-from="opacity-100" leave-to="opacity-0" > - + - - + + (); const checked = ref(false); - - + + + $emit('on-select', checked, id)" /> - {{ name }} - {{ url }} + {{ name }} + {{ url }} - + + + @@ -39,13 +44,3 @@ const checked = ref(false); - - diff --git a/webui/src/components/ab-rule.vue b/webui/src/components/ab-rule.vue index 0e1233f2..a0f39f75 100644 --- a/webui/src/components/ab-rule.vue +++ b/webui/src/components/ab-rule.vue @@ -21,7 +21,7 @@ const items: SettingItem[] = [ configKey: 'year', label: () => t('homepage.rule.year'), type: 'input', - css: 'w-72px', + css: 'w-72', prop: { type: 'text', }, @@ -30,7 +30,7 @@ const items: SettingItem[] = [ configKey: 'season', label: () => t('homepage.rule.season'), type: 'input', - css: 'w-72px', + css: 'w-72', prop: { type: 'number', }, @@ -40,7 +40,7 @@ const items: SettingItem[] = [ configKey: 'offset', label: () => t('homepage.rule.offset'), type: 'input', - css: 'w-72px', + css: 'w-72', prop: { type: 'number', }, @@ -55,7 +55,7 @@ const items: SettingItem[] = [ - + -import { ref } from 'vue'; import { vOnClickOutside } from '@vueuse/components'; +import type { BangumiRule } from '#/bangumi'; + +defineEmits<{ + (e: 'add-bangumi', bangumiRule: BangumiRule): void; +}>(); -defineEmits(['add-bangumi']); const showProvider = ref(false); -const { - providers, - getProviders, - provider, - loading, - onSearch, - clearSearch, - inputValue, - bangumiList, -} = useSearchStore(); +const { providers, provider, loading, inputValue, bangumiList } = storeToRefs( + useSearchStore() +); +const { getProviders, onSearch, clearSearch } = useSearchStore(); onMounted(() => { getProviders(); @@ -38,10 +35,10 @@ function onSelect(site: string) { v-show="showProvider" v-on-click-outside="() => (showProvider = false)" abs - top-84px - left-540px - w-100px - rounded-12px + top-84 + left-540 + w-100 + rounded-12 shadow bg-white z-99 @@ -54,14 +51,14 @@ function onSelect(site: string) { is-btn @click="() => onSelect(site)" > - + {{ site }} - - + + ('data'); v-bind="prop" /> - + - + diff --git a/webui/src/components/ab-status-bar.vue b/webui/src/components/ab-status-bar.vue index e0932388..b6d65bdf 100644 --- a/webui/src/components/ab-status-bar.vue +++ b/webui/src/components/ab-status-bar.vue @@ -34,7 +34,7 @@ function abLabel(label: string | (() => string)) { - + string)) { string)) { i.handle && i.handle()" > diff --git a/webui/src/components/basic/ab-add.vue b/webui/src/components/basic/ab-add.vue index 777313f5..fd0bd545 100644 --- a/webui/src/components/basic/ab-add.vue +++ b/webui/src/components/basic/ab-add.vue @@ -15,29 +15,29 @@ defineEmits(['click']); const buttonSize = computed(() => { switch (props.type) { case 'large': - return 'wh-36px'; + return 'wh-36'; case 'medium': - return 'wh-24px'; + return 'wh-24'; case 'small': - return 'wh-12px'; + return 'wh-12'; } }); const lineSize = computed(() => { switch (props.type) { case 'large': - return 'w-18px h-4px'; + return 'w-18 h-4'; case 'medium': - return 'w-3px h-12px'; + return 'w-3 h-12'; case 'small': - return 'w-2px h-6px'; + return 'w-2 h-6'; } }); - -import {NSpin} from 'naive-ui'; -import {Down} from "@icon-park/vue-next"; -import {computed} from "vue"; + - + {{ selected }} showSelections = !showSelections" + is-btn + px-12 + h-full + f-cer + :class="[`selector-${type}`]" + @click="() => (showSelections = !showSelections)" > - + {{ selection }} @@ -147,4 +137,4 @@ function onSelect(selection: string) { .select-box { transform: TranslateY(80%) TranslateX(-111%); } - \ No newline at end of file + diff --git a/webui/src/components/basic/ab-button.vue b/webui/src/components/basic/ab-button.vue index e11a5279..4f9910ca 100644 --- a/webui/src/components/basic/ab-button.vue +++ b/webui/src/components/basic/ab-button.vue @@ -21,11 +21,11 @@ defineEmits(['click']); const buttonSize = computed(() => { switch (props.size) { case 'big': - return 'rounded-10px text-h1 w-276px h-55px text-h1'; + return 'rounded-10 text-h1 w-276 h-55 text-h1'; case 'normal': - return 'rounded-6px w-170px h-36px'; + return 'rounded-6 w-170 h-36'; case 'small': - return 'rounded-6px w-86px h-28px text-main'; + return 'rounded-6 w-86 h-28 text-main'; } }); diff --git a/webui/src/components/basic/ab-checkbox.vue b/webui/src/components/basic/ab-checkbox.vue index 5733c87f..ceb21da7 100644 --- a/webui/src/components/basic/ab-checkbox.vue +++ b/webui/src/components/basic/ab-checkbox.vue @@ -15,23 +15,24 @@ const checked = defineModel({ default: false }); - + - + {{ title }} - + diff --git a/webui/src/components/basic/ab-search.vue b/webui/src/components/basic/ab-search.vue index 89fde8c9..f07f03c8 100644 --- a/webui/src/components/basic/ab-search.vue +++ b/webui/src/components/basic/ab-search.vue @@ -28,11 +28,11 @@ watch(inputValue, (val) => { bg="#7752B4" text-white fx-cer - rounded-12px - h-36px - pl-12px - space-x-12px - w-400px + rounded-12 + h-36 + pl-12 + gap-x-12 + w-400 overflow-hidden shadow-inner > @@ -58,8 +58,8 @@ watch(inputValue, (val) => { h-full f-cer justify-between - px-12px - w-100px + px-12 + w-100 class="provider" is-btn @click="$emit('select')" diff --git a/webui/src/components/basic/ab-select.vue b/webui/src/components/basic/ab-select.vue index a65166a8..e7c48ecd 100644 --- a/webui/src/components/basic/ab-select.vue +++ b/webui/src/components/basic/ab-select.vue @@ -67,13 +67,12 @@ watchEffect(() => { - + {{ label }} @@ -82,9 +81,9 @@ watchEffect(() => { - - - + + + - - + + diff --git a/webui/src/components/basic/ab-switch.vue b/webui/src/components/basic/ab-switch.vue index d17c5c14..63d41e01 100644 --- a/webui/src/components/basic/ab-switch.vue +++ b/webui/src/components/basic/ab-switch.vue @@ -10,25 +10,25 @@ const checked = defineModel('checked', { diff --git a/webui/src/components/basic/ab-tag.vue b/webui/src/components/basic/ab-tag.vue index 3ae4a80b..5b11de9a 100644 --- a/webui/src/components/basic/ab-tag.vue +++ b/webui/src/components/basic/ab-tag.vue @@ -16,85 +16,60 @@ const InnerStyle = computed(() => { - - + + {{ title }} diff --git a/webui/src/components/layout/ab-sidebar.vue b/webui/src/components/layout/ab-sidebar.vue index e0fa8b4e..73d15b2a 100644 --- a/webui/src/components/layout/ab-sidebar.vue +++ b/webui/src/components/layout/ab-sidebar.vue @@ -21,15 +21,15 @@ const props = withDefaults( ); const { t } = useMyI18n(); +const { logout } = useAuth(); +const route = useRoute(); const show = ref(props.open); const toggle = () => (show.value = !show.value); -const route = useRoute(); -const { logout } = useAuth(); const RSS = h( 'span', - { class: ['rel', 'left-2px'] }, + { class: ['rel', 'left-2'] }, h(InlineSvg, { src: './images/RSS.svg' }) ); @@ -83,20 +83,20 @@ const items = [ @@ -123,13 +123,12 @@ const items = [ replace :title="i.label()" fx-cer - px-24px - space-x-42px - h-48px + px-24 + gap-x-42 + h-48 is-btn transition-colors - hover:bg="#F1F5FA" - hover:text="#2A1C52" + hover="bg-[#F1F5FA] text-[#2A1C52]" :class="[ route.path === i.path && 'bg-[#F1F5FA] text-[#2A1C52]', i.hidden && 'hidden', @@ -137,20 +136,19 @@ const items = [ > - {{ i.label() }} + {{ i.label() }} diff --git a/webui/src/components/layout/ab-topbar.vue b/webui/src/components/layout/ab-topbar.vue index e59b97ff..d1fa2dce 100644 --- a/webui/src/components/layout/ab-topbar.vue +++ b/webui/src/components/layout/ab-topbar.vue @@ -94,17 +94,17 @@ onUnmounted(() => { - - - - + + + + @@ -116,7 +116,7 @@ onUnmounted(() => { :items="items" :running="running" @click-add="() => (showAddRSS = true)" - @change-lang="() => changeLocale()" + @change-lang="changeLocale" /> diff --git a/webui/src/components/setting/config-download.vue b/webui/src/components/setting/config-download.vue index aee897fb..927d4968 100644 --- a/webui/src/components/setting/config-download.vue +++ b/webui/src/components/setting/config-download.vue @@ -13,7 +13,7 @@ const items: SettingItem[] = [ configKey: 'type', label: () => t('config.downloader_set.type'), type: 'select', - css: 'w-115px', + css: 'w-115', prop: { items: downloaderType, }, @@ -65,7 +65,7 @@ const items: SettingItem[] = [ - + [] = [ - + [] = [ configKey: 'rss_time', label: () => t('config.normal_set.rss_interval'), type: 'input', - css: 'w-72px', + css: 'w-72', prop: { type: 'number', placeholder: 'port', @@ -23,7 +23,7 @@ const programItems: SettingItem[] = [ configKey: 'rename_time', label: () => t('config.normal_set.rename_interval'), type: 'input', - css: 'w-72px', + css: 'w-72', prop: { type: 'number', placeholder: 'port', @@ -33,7 +33,7 @@ const programItems: SettingItem[] = [ configKey: 'webui_port', label: () => t('config.normal_set.web_port'), type: 'input', - css: 'w-72px', + css: 'w-72', prop: { type: 'number', placeholder: 'port', @@ -51,7 +51,7 @@ const logItems: SettingItem = { - + [] = [ configKey: 'type', label: () => t('config.notification_set.type'), type: 'select', - css: 'w-140px', + css: 'w-140', prop: { items: notificationType, }, @@ -52,7 +52,7 @@ const items: SettingItem[] = [ - + [] = [ - + {{ $t('config.experimental_openai_set.warning') }} - + [] = [ - + - + [] = [ - + = (...args: any[]) => Promise; +interface Options { + showMessage?: boolean; + onBeforeExecute?: () => void; + onSuccess?: (data: T) => void; + onError?: (error: any) => void; + onFinally?: () => void; +} + export function useApi< - TError = any, TApi extends AnyAsyncFuntion = AnyAsyncFuntion, TData = Awaited> >( api: TApi, - options?: { - failRule?: (data: TData) => boolean; - message?: { - success?: string; - fail?: string; - error?: string; - }; - } + { + showMessage = true, + onBeforeExecute, + onSuccess, + onError, + onFinally, + }: Options = {} ) { const data = ref(); const isLoading = ref(false); - const fetchResult = createEventHook(); - const fetchError = createEventHook(); - const fetchFinally = createEventHook(); const message = useMessage(); + const { returnUserLangMsg } = useMyI18n(); - function execute(...params: Parameters) { - isLoading.value = true; + async function execute(...params: Parameters) { + onBeforeExecute?.(); - api(...params) - .then((res: TData) => { - data.value = res; - fetchResult.trigger(res); + try { + isLoading.value = true; + const res = await api(...params); + data.value = res; - if (options?.failRule && options.failRule(res)) { - options.message?.fail && message.error(options.message.fail); - } else { - options?.message?.success && message.success(options.message.success); - } - }) - .catch((err: TError) => { - fetchError.trigger(err); + onSuccess?.(res); - options?.message?.error && message.error(options.message.error); - }) - .finally(() => { - isLoading.value = false; - fetchFinally.trigger(''); - }); + if (showMessage && 'msg_en' in res) { + message.success(returnUserLangMsg(res)); + } + } catch (err) { + onError?.(err); + } finally { + isLoading.value = false; + onFinally?.(); + } } return { @@ -53,8 +53,5 @@ export function useApi< isLoading, execute, - onResult: fetchResult.on, - onError: fetchError.on, - onFinally: fetchFinally.on, }; } diff --git a/webui/src/hooks/useAppInfo.ts b/webui/src/hooks/useAppInfo.ts index c0eba279..0ffae341 100644 --- a/webui/src/hooks/useAppInfo.ts +++ b/webui/src/hooks/useAppInfo.ts @@ -1,18 +1,14 @@ export const useAppInfo = createSharedComposable(() => { - const { isLoggedin } = useAuth(); + const { isLoggedIn } = useAuth(); const running = ref(false); const version = ref(''); function getStatus() { - const { execute, onResult } = useApi(apiProgram.status); - - onResult((res) => { - running.value = res.status; - version.value = res.version; - }); - - if (isLoggedin.value) { - execute(); + if (isLoggedIn.value) { + apiProgram.status().then((res) => { + running.value = res.status; + version.value = res.version; + }); } } diff --git a/webui/src/hooks/useAuth.ts b/webui/src/hooks/useAuth.ts index dfbdd701..f3dd4062 100644 --- a/webui/src/hooks/useAuth.ts +++ b/webui/src/hooks/useAuth.ts @@ -1,29 +1,40 @@ import type { User } from '#/auth'; import type { ApiError } from '#/api'; +import { router } from '@/router'; export const useAuth = createSharedComposable(() => { - const isLoggedin = useLocalStorage('isLoggedin', false); const message = useMessage(); + const { t } = useMyI18n(); + + const isLoggedIn = useLocalStorage('isLoggedIn', false); + + watch(isLoggedIn, (v) => { + if (v) { + router.replace({ name: 'Index' }); + } else { + router.replace({ name: 'Login' }); + } + }); const user = reactive({ username: '', password: '', }); - function clearUser() { user.username = ''; user.password = ''; } - function check() { + function formVerify() { if (user.username === '') { - message.warning('Please Enter Username!'); + message.warning(t('notify.please_enter', [t('topbar.profile.username')])); return false; - } - - if (user.password === '') { - message.warning('Please Enter Password!'); + } else if (user.password === '') { + message.warning(t('notify.please_enter', [t('topbar.profile.password')])); + return false; + } else if (user.password.length < 8) { + message.error(t('notify.password_length_error')); return false; } @@ -31,81 +42,53 @@ export const useAuth = createSharedComposable(() => { } function login() { - const { execute, onResult, onError } = useApi(apiAuth.login, { - message: { - success: 'Login Success!', - }, - }); + if (!formVerify()) return; - onResult((res) => { - isLoggedin.value = true; - clearUser(); - }); - - onError((err) => { - const error = err as ApiError; - - if (error.status === 404) { - message.error('请更新AutoBangumi!'); - } else if (error.status === 401) { - message.error(err.msg_zh); - } - }); - - if (check()) { - execute(user.username, user.password); - } + apiAuth + .login(user.username, user.password) + .then(() => { + isLoggedIn.value = true; + clearUser(); + message.success(t('notify.login_success')); + }) + .catch((err: ApiError) => { + if (err.status === 404) { + message.error(t('notify.please_update')); + } + }); } - const { execute: logout, onResult: onLogoutResult } = useApi(apiAuth.logout, { - failRule: (res) => !res, - message: { - success: 'Logout Success!', - fail: 'Logout Failed!', + const { execute: logout } = useApi(apiAuth.logout, { + showMessage: true, + onSuccess() { + clearUser(); + isLoggedIn.value = false; }, }); - onLogoutResult(() => { - clearUser(); - isLoggedin.value = false; - }); - - const { execute: refresh, onResult: onRefreshResult } = useApi( - apiAuth.refresh - ); - - onRefreshResult((res) => { - isLoggedin.value = true; + const { execute: refresh } = useApi(apiAuth.refresh, { + showMessage: false, + onSuccess() { + isLoggedIn.value = true; + }, }); function update() { - const { execute, onResult } = useApi(apiAuth.update, { - failRule: (res) => res.message !== 'update success', - message: { - success: 'Update Success!', - fail: 'Update Failed!', - }, - }); + if (!formVerify()) return; - onResult((res) => { - if (res.message === 'update success') { + apiAuth.update(user.username, user.password).then((res) => { + if (res.message.toLocaleLowerCase() === 'update success') { clearUser(); + message.success(t('notify.update_success')); } else { user.password = ''; + message.error(t('notify.update_failed')); } }); - - if (check()) { - if (user.password.length < 8) { - message.error('Password must be at least 8 characters long!'); - } else { - execute(user.username, user.password); - } - } } return { - isLoggedin, + isLoggedIn, user, login, diff --git a/webui/src/hooks/useMyI18n.ts b/webui/src/hooks/useMyI18n.ts index abf46890..34669364 100644 --- a/webui/src/hooks/useMyI18n.ts +++ b/webui/src/hooks/useMyI18n.ts @@ -1,6 +1,7 @@ import { createI18n } from 'vue-i18n'; import enUS from '@/i18n/en.json'; import zhCN from '@/i18n/zh-CN.json'; +import type { ApiSuccess } from '#/api'; const messages = { en: enUS, @@ -37,7 +38,15 @@ export const useMyI18n = createSharedComposable(() => { function returnUserLangText(texts: { [k in Languages]: string; }) { - return computed(() => texts[lang.value]); + return texts[lang.value]; + } + + function returnUserLangMsg(res: ApiSuccess) { + const msg = returnUserLangText({ + en: res.msg_en, + 'zh-CN': res.msg_zh, + }); + return msg; } return { @@ -46,7 +55,7 @@ export const useMyI18n = createSharedComposable(() => { t: i18n.global.t, locale: i18n.global.locale, changeLocale, - getText: returnUserLangText, returnUserLangText, + returnUserLangMsg, }; }); diff --git a/webui/src/i18n/en.json b/webui/src/i18n/en.json index b66c8092..03537a69 100644 --- a/webui/src/i18n/en.json +++ b/webui/src/i18n/en.json @@ -1,162 +1,175 @@ { - "login": { - "title": "Login", - "username": "Username", - "password": "Password", - "login_btn": "Login", - "default": "Default" - }, - "sidebar": { - "title": "Menu", - "homepage": "HomePage", - "player": "Player", - "log": "Log", - "config": "Config", - "logout": "Logout", - "downloader": "Downloader", - "calendar": "Calendar", - "rss": "RSS Manager" - }, - "topbar": { - "start": "Start", - "pause": "Pause", - "restart": "Restart", - "shutdown": "Shutdown", - "reset_rule": "Reset Rule", - "refresh_poster": "Refresh Poster", - "search": { - "placeholder": "Type to search" - }, - "profile": { - "title": "Profile", - "pop_title": "Change Account", - "username": "Username", - "password": "Password", - "update_btn": "Update" - }, - "add": { - "title": "Add RSS", - "rss_link": "RSS Link", - "name": "Name", - "aggregate": "Aggregate RSS", - "parser": "Parser", - "placeholder_link": "Please enter the RSS link", - "placeholder_name": "Optional", - "button": "Add" - } - }, - "homepage": { - "rule": { - "official_title": "Official Title", - "year": "Year", - "season": "Season", - "offset": "Offset", - "exclude": "Exclude", - "enable": "Enable", - "disable": "Disable", - "delete": "Delete", - "apply": "Apply", - "yes_btn": "Yes", - "no_btn": "No", - "enable_hit": "Do you want to enable this rule?", - "delete_hit": "Delete Local File?", - "enable_rule": "Enable Rule", - "edit_rule": "Edit Rule" - } - }, - "rss": { - "title": "RSS Item", - "selectbox": "Select", - "name": "Name", - "url": "Url", - "status": "Status", - "delete": "Delete", - "disable": "Disable", - "enable": "Enable" - }, - "player": { - "hit": "Please set up the media player" - }, - "downloader": { - "hit": "Please set up the downloader" - }, - "log": { - "title": "Log", - "reset": "Reset", - "copy": "Copy", - "contact_info": "Contact Infomation", - "go": "Go", - "join": "Join", - "bug_repo": "Bug Report" - }, "config": { - "normal_set": { - "title": "Normal Setting", - "rss_interval": "Interval Time of Rss", - "rename_interval": "Interval Time of Rename", - "web_port": "WebUI Port", - "debug": "Debug" - }, - "parser_set": { - "title": "Parser Setting", - "enable": "Enable", - "source": "Source", - "token": "Token", - "url": "Custom Url", - "language": "Language", - "type": "Parser Type", - "exclude": "Exclude" - }, + "apply": "Apply", + "cancel": "Cancel", "downloader_set": { - "title": "Downloader Setting", - "type": "Downloader Type", "host": "Host", - "username": "Username", "password": "Password", "path": "Download Path", - "ssl": "SSL" - }, - "manage_set": { - "title": "Manage Setting", - "enable": "Enable", - "method": "Rename Method", - "eps": "EPS complete", - "group_tag": "Add Group Tag", - "delete_bad_torrent": "Delete Bad Torrent" - }, - "notification_set": { - "title": "Notification Setting", - "enable": "Enable", - "type": "Type", - "token": "Token", - "chat_id": "Chat ID" - }, - "proxy_set": { - "title": "Proxy Setting", - "enable": "Enable", - "type": "Proxy Type", - "host": "Host", - "port": "Port", - "username": "Username", - "password": "Password" + "ssl": "SSL", + "title": "Downloader Setting", + "type": "Downloader Type", + "username": "Username" }, "experimental_openai_set": { - "title": "Experimental Setting", - "warning": "Warning: Experimental feature is not yet stable. Please use with caution.", - "enable": "Enable OpenAI", - "api_key": "OpenAI API Key", "api_base": "OpenAI API Base URL (Azure entrypoint)", - "model": "OpenAI Model", + "api_key": "OpenAI API Key", "api_type": "OpenAI API Type", "api_version": "Azure OpenAI Version", - "deployment_id": "Azure OpenAI Deployment ID" + "deployment_id": "Azure OpenAI Deployment ID", + "enable": "Enable OpenAI", + "model": "OpenAI Model", + "title": "Experimental Setting", + "warning": "Warning: Experimental feature is not yet stable. Please use with caution." + }, + "manage_set": { + "delete_bad_torrent": "Delete Bad Torrent", + "enable": "Enable", + "eps": "EPS complete", + "group_tag": "Add Group Tag", + "method": "Rename Method", + "title": "Manage Setting" }, "media_player_set": { "title": "Media Player Setting", "type": "type", "url": "url" }, - "cancel": "Cancel", - "apply": "Apply" + "normal_set": { + "debug": "Debug", + "rename_interval": "Interval Time of Rename", + "rss_interval": "Interval Time of Rss", + "title": "Normal Setting", + "web_port": "WebUI Port" + }, + "notification_set": { + "chat_id": "Chat ID", + "enable": "Enable", + "title": "Notification Setting", + "token": "Token", + "type": "Type" + }, + "parser_set": { + "enable": "Enable", + "exclude": "Exclude", + "language": "Language", + "source": "Source", + "title": "Parser Setting", + "token": "Token", + "type": "Parser Type", + "url": "Custom Url" + }, + "proxy_set": { + "enable": "Enable", + "host": "Host", + "password": "Password", + "port": "Port", + "title": "Proxy Setting", + "type": "Proxy Type", + "username": "Username" + } + }, + "downloader": { + "hit": "Please set up the downloader" + }, + "homepage": { + "rule": { + "apply": "Apply", + "delete": "Delete", + "delete_hit": "Delete Local File?", + "disable": "Disable", + "edit_rule": "Edit Rule", + "enable": "Enable", + "enable_hit": "Do you want to enable this rule?", + "enable_rule": "Enable Rule", + "exclude": "Exclude", + "no_btn": "No", + "official_title": "Official Title", + "offset": "Offset", + "season": "Season", + "year": "Year", + "yes_btn": "Yes" + } + }, + "log": { + "bug_repo": "Bug Report", + "contact_info": "Contact Infomation", + "copy": "Copy", + "go": "Go", + "join": "Join", + "reset": "Reset", + "title": "Log" + }, + "login": { + "login_btn": "Login", + "password": "Password", + "title": "Login", + "username": "Username" + }, + "notify": { + "copy_failed": "Your browser does not support Clipboard API!", + "copy_success": "Copy Success!", + "login_failed": "Login Failed!", + "login_success": "Login Success!", + "password_length_error": "Password must be at least 8 characters long!", + "please_enter": "Please Enter {0}!", + "please_update": "Please Update AutoBangumi!", + "rss_link": "RSS Link", + "update_failed": "Update Failed!", + "update_success": "Update Success!" + }, + "player": { + "hit": "Please set up the media player" + }, + "rss": { + "delete": "Delete", + "disable": "Disable", + "enable": "Enable", + "name": "Name", + "selectbox": "Select", + "status": "Status", + "title": "RSS Item", + "url": "Url" + }, + "sidebar": { + "calendar": "Calendar", + "config": "Config", + "downloader": "Downloader", + "homepage": "HomePage", + "log": "Log", + "logout": "Logout", + "player": "Player", + "rss": "RSS Manager", + "title": "Menu" + }, + "topbar": { + "add": { + "aggregate": "Aggregate RSS", + "button": "Add", + "collect": "Collect", + "name": "Name", + "parser": "Parser", + "placeholder_link": "Please enter the RSS link", + "placeholder_name": "Optional", + "rss_link": "RSS Link", + "subscribe": "Subscribe", + "title": "Add RSS" + }, + "pause": "Pause", + "profile": { + "password": "Password", + "pop_title": "Change Account", + "title": "Profile", + "update_btn": "Update", + "username": "Username" + }, + "refresh_poster": "Refresh Poster", + "reset_rule": "Reset Rule", + "restart": "Restart", + "search": { + "placeholder": "Type to search" + }, + "shutdown": "Shutdown", + "start": "Start" } } diff --git a/webui/src/i18n/zh-CN.json b/webui/src/i18n/zh-CN.json index 4eae72bd..bde31b3d 100644 --- a/webui/src/i18n/zh-CN.json +++ b/webui/src/i18n/zh-CN.json @@ -1,162 +1,175 @@ { - "login": { - "title": "登录", - "username": "用户名", - "password": "密码", - "login_btn": "登录", - "default": "默认账号密码" - }, - "sidebar": { - "title": "菜单", - "homepage": "主页", - "player": "播放器", - "log": "日志", - "config": "设置", - "logout": "退出", - "calendar": "番剧日历", - "downloader": "下载器", - "rss": "RSS 管理" - }, - "topbar": { - "start": "启动", - "pause": "暂停", - "restart": "重启", - "shutdown": "关闭", - "reset_rule": "重置规则", - "refresh_poster": "刷新海报", - "search": { - "placeholder": "输入关键字搜索" - }, - "profile": { - "title": "账户设置", - "pop_title": "修改账户", - "username": "用户名", - "password": "密码", - "update_btn": "更新" - }, - "add": { - "title": "添加 RSS", - "rss_link": "RSS 链接", - "name": "名称", - "aggregate": "聚合 RSS", - "parser": "解析器", - "placeholder_link": "请输入 RSS 链接", - "placeholder_name": "可选", - "button": "添加" - } - }, - "homepage": { - "rule": { - "official_title": "官方名称", - "year": "年份", - "season": "季度", - "offset": "剧集偏移", - "exclude": "排除", - "enable": "启用", - "disable": "禁用", - "delete": "删除", - "apply": "应用", - "yes_btn": "是", - "no_btn": "否", - "enable_hit": "确定启用该规则?", - "delete_hit": "是否删除本地文件?", - "enable_rule": "启用规则", - "edit_rule": "编辑规则" - } - }, - "rss": { - "title": "RSS 条目", - "selectbox": "选择", - "name": "名称", - "url": "Url", - "status": "状态", - "delete": "删除", - "disable": "禁用", - "enable": "启用" - }, - "player": { - "hit": "请设置媒体播放器地址" - }, - "downloader": { - "hit": "请设置下载器" - }, - "log": { - "title": "日志", - "reset": "重置", - "copy": "复制", - "contact_info": "联系方式", - "go": "访问", - "join": "加入", - "bug_repo": "Bug 反馈" - }, "config": { - "normal_set": { - "title": "常规设置", - "rss_interval": "RSS 间隔", - "rename_interval": "重命名间隔", - "web_port": "网页端口", - "debug": "调试" - }, - "parser_set": { - "title": "解析设置", - "enable": "启用", - "source": "数据源", - "token": "Token", - "url": "自定义网址", - "language": "语言", - "type": "解析类型", - "exclude": "排除" - }, + "apply": "应用", + "cancel": "取消", "downloader_set": { - "title": "下载设置", - "type": "下载器类型", "host": "下载器地址", - "username": "用户名", "password": "密码", "path": "下载地址", - "ssl": "SSL" - }, - "manage_set": { - "title": "番剧管理设置", - "enable": "启用", - "method": "重命名方式", - "eps": "番剧补全", - "group_tag": "添加组标签", - "delete_bad_torrent": "删除坏种" - }, - "notification_set": { - "title": "通知设置", - "enable": "启用", - "type": "类型", - "token": "Token", - "chat_id": "Chat ID" - }, - "proxy_set": { - "title": "代理设置", - "enable": "启用", - "type": "类型", - "host": "地址", - "port": "端口", - "username": "用户名", - "password": "密码" + "ssl": "SSL", + "title": "下载设置", + "type": "下载器类型", + "username": "用户名" }, "experimental_openai_set": { - "title": "实验功能设置", - "warning": "警告:实验功能尚未稳定,请谨慎使用", - "enable": "启用 OpenAI", - "api_key": "OpenAI API Key", "api_base": "OpenAI API Base URL (Azure entrypoint)", - "model": "OpenAI 模型", + "api_key": "OpenAI API Key", "api_type": "OpenAI API 类型", "api_version": "Azure OpenAI 版本", - "deployment_id": "Azure OpenAI Deployment ID" + "deployment_id": "Azure OpenAI Deployment ID", + "enable": "启用 OpenAI", + "model": "OpenAI 模型", + "title": "实验功能设置", + "warning": "警告:实验功能尚未稳定,请谨慎使用" + }, + "manage_set": { + "delete_bad_torrent": "删除坏种", + "enable": "启用", + "eps": "番剧补全", + "group_tag": "添加组标签", + "method": "重命名方式", + "title": "番剧管理设置" }, "media_player_set": { "title": "播放器设置", "type": "类型", "url": "播放器地址" }, - "cancel": "取消", - "apply": "应用" + "normal_set": { + "debug": "调试", + "rename_interval": "重命名间隔", + "rss_interval": "RSS 间隔", + "title": "常规设置", + "web_port": "网页端口" + }, + "notification_set": { + "chat_id": "Chat ID", + "enable": "启用", + "title": "通知设置", + "token": "Token", + "type": "类型" + }, + "parser_set": { + "enable": "启用", + "exclude": "排除", + "language": "语言", + "source": "数据源", + "title": "解析设置", + "token": "Token", + "type": "解析类型", + "url": "自定义网址" + }, + "proxy_set": { + "enable": "启用", + "host": "地址", + "password": "密码", + "port": "端口", + "title": "代理设置", + "type": "类型", + "username": "用户名" + } + }, + "downloader": { + "hit": "请设置下载器" + }, + "homepage": { + "rule": { + "apply": "应用", + "delete": "删除", + "delete_hit": "是否删除本地文件?", + "disable": "禁用", + "edit_rule": "编辑规则", + "enable": "启用", + "enable_hit": "确定启用该规则?", + "enable_rule": "启用规则", + "exclude": "排除", + "no_btn": "否", + "official_title": "官方名称", + "offset": "剧集偏移", + "season": "季度", + "year": "年份", + "yes_btn": "是" + } + }, + "log": { + "bug_repo": "Bug 反馈", + "contact_info": "联系方式", + "copy": "复制", + "go": "访问", + "join": "加入", + "reset": "重置", + "title": "日志" + }, + "login": { + "login_btn": "登录", + "password": "密码", + "title": "登录", + "username": "用户名" + }, + "notify": { + "copy_failed": "您的浏览器不支持剪贴板操作!", + "copy_success": "复制成功!", + "login_failed": "登录失败!", + "login_success": "登录成功!", + "password_length_error": "密码长度必须至少为8个字符!", + "please_enter": "请输入{0}!", + "please_update": "请更新AutoBangumi!", + "rss_link": "RSS链接", + "update_failed": "更新失败!", + "update_success": "更新成功!" + }, + "player": { + "hit": "请设置媒体播放器地址" + }, + "rss": { + "delete": "删除", + "disable": "禁用", + "enable": "启用", + "name": "名称", + "selectbox": "选择", + "status": "状态", + "title": "RSS 条目", + "url": "Url" + }, + "sidebar": { + "calendar": "番剧日历", + "config": "设置", + "downloader": "下载器", + "homepage": "主页", + "log": "日志", + "logout": "退出", + "player": "播放器", + "rss": "RSS 管理", + "title": "菜单" + }, + "topbar": { + "add": { + "aggregate": "聚合 RSS", + "button": "添加", + "collect": "收集", + "name": "名称", + "parser": "解析器", + "placeholder_link": "请输入 RSS 链接", + "placeholder_name": "可选", + "rss_link": "RSS 链接", + "subscribe": "订阅", + "title": "添加 RSS" + }, + "pause": "暂停", + "profile": { + "password": "密码", + "pop_title": "修改账户", + "title": "账户设置", + "update_btn": "更新", + "username": "用户名" + }, + "refresh_poster": "刷新海报", + "reset_rule": "重置规则", + "restart": "重启", + "search": { + "placeholder": "输入关键字搜索" + }, + "shutdown": "关闭", + "start": "启动" } } diff --git a/webui/src/pages/index.vue b/webui/src/pages/index.vue index 7ef43097..baadeda4 100644 --- a/webui/src/pages/index.vue +++ b/webui/src/pages/index.vue @@ -6,13 +6,13 @@ definePage({ - + - + - + @@ -24,3 +24,35 @@ definePage({ + + diff --git a/webui/src/pages/index/bangumi.vue b/webui/src/pages/index/bangumi.vue index dcc84055..554066f9 100644 --- a/webui/src/pages/index/bangumi.vue +++ b/webui/src/pages/index/bangumi.vue @@ -1,4 +1,8 @@ - + - + -const { getConfig, setConfig } = useConfigStore(); - -getConfig(); - definePage({ name: 'Config', }); + +const { getConfig, setConfig } = useConfigStore(); + +onActivated(() => { + getConfig(); +}); - + - - + + @@ -22,7 +24,7 @@ definePage({ - + @@ -33,7 +35,7 @@ definePage({ - + {{ $t('config.cancel') }} diff --git a/webui/src/pages/index/downloader.vue b/webui/src/pages/index/downloader.vue index 28ea863f..f6211eea 100644 --- a/webui/src/pages/index/downloader.vue +++ b/webui/src/pages/index/downloader.vue @@ -6,8 +6,6 @@ definePage({ const { config } = storeToRefs(useConfigStore()); const { getConfig } = useConfigStore(); -getConfig(); - const isNull = computed(() => { return config.value.downloader.host === ''; }); @@ -19,10 +17,14 @@ const url = computed(() => { return `${protocol}://${host}`; }); + +onActivated(() => { + getConfig(); +}); - + {{ @@ -35,10 +37,9 @@ const url = computed(() => { :src="url" frameborder="0" allowfullscreen="true" - w-full - h-full + wh-full flex-1 - rounded-12px + rounded-12 > diff --git a/webui/src/pages/index/log.vue b/webui/src/pages/index/log.vue index e833dab1..e6fb5792 100644 --- a/webui/src/pages/index/log.vue +++ b/webui/src/pages/index/log.vue @@ -1,4 +1,8 @@ - - - - + + + + {{ log }} - - {{ - $t('log.reset') - }} - {{ $t('log.copy') }} + + + {{ $t('log.reset') }} + + + + {{ $t('log.copy') }} + - + - + - + Github Issue + Github Issues + - + Version: {{ version }} diff --git a/webui/src/pages/index/player.vue b/webui/src/pages/index/player.vue index 57951233..27338c51 100644 --- a/webui/src/pages/index/player.vue +++ b/webui/src/pages/index/player.vue @@ -7,7 +7,7 @@ const { url } = storeToRefs(usePlayerStore()); - + {{ @@ -20,10 +20,9 @@ const { url } = storeToRefs(usePlayerStore()); :src="url" frameborder="0" allowfullscreen="true" - w-full - h-full + wh-full flex-1 - rounded-12px + rounded-12 > diff --git a/webui/src/pages/index/rss.vue b/webui/src/pages/index/rss.vue index 17a2d91c..bbb93a7c 100644 --- a/webui/src/pages/index/rss.vue +++ b/webui/src/pages/index/rss.vue @@ -1,4 +1,8 @@ - + - - + + {{ $t('rss.selectbox') }} {{ $t('rss.name') }} @@ -34,8 +35,8 @@ function addSelected(checked: boolean, id: number) { {{ $t('rss.status') }} - - + + - - + + {{ $t('rss.enable') }} {{ $t('rss.disable') diff --git a/webui/src/pages/login.vue b/webui/src/pages/login.vue index 5268e287..68765987 100644 --- a/webui/src/pages/login.vue +++ b/webui/src/pages/login.vue @@ -1,15 +1,15 @@ - - - + + + - {{ - $t('login.login_btn') - }} + + {{ $t('login.login_btn') }} + diff --git a/webui/src/router/index.ts b/webui/src/router/index.ts index 4e620998..6e21876a 100644 --- a/webui/src/router/index.ts +++ b/webui/src/router/index.ts @@ -5,14 +5,12 @@ const router = createRouter({ }); router.beforeEach((to) => { - const { isLoggedin } = useAuth(); + const { isLoggedIn } = useAuth(); const { type, url } = storeToRefs(usePlayerStore()); - if (!isLoggedin.value && to.path !== '/login') { + if (!isLoggedIn.value && to.path !== '/login') { return { name: 'Login' }; - } - - if (isLoggedin.value && to.path === '/login') { + } else if (isLoggedIn.value && to.path === '/login') { return { name: 'Index' }; } @@ -20,15 +18,6 @@ router.beforeEach((to) => { open(url.value); return false; } - - watch(isLoggedin, (val) => { - if (to.path === '/login' && val) { - router.replace({ name: 'Index' }); - } - if (to.path !== '/login' && !val) { - router.replace({ name: 'Login' }); - } - }); }); export { router }; diff --git a/webui/src/store/bangumi.ts b/webui/src/store/bangumi.ts index 04dcb8c7..d28fe672 100644 --- a/webui/src/store/bangumi.ts +++ b/webui/src/store/bangumi.ts @@ -1,10 +1,7 @@ import type { BangumiRule } from '#/bangumi'; import { ruleTemplate } from '#/bangumi'; -import type { ApiSuccess } from '#/api'; export const useBangumiStore = defineStore('bangumi', () => { - const message = useMessage(); - const bangumi = ref(); const editRule = reactive<{ show: boolean; @@ -14,51 +11,33 @@ export const useBangumiStore = defineStore('bangumi', () => { item: ruleTemplate, }); - const { execute: getAll, onResult: onBangumiResult } = useApi( - apiBangumi.getAll - ); - const { execute: updateRule, onResult: onUpdateRuleResult } = useApi( - apiBangumi.updateRule - ); - const { execute: enableRule, onResult: onEnableRuleResult } = useApi( - apiBangumi.enableRule - ); - const { execute: disableRule, onResult: onDisableRuleResult } = useApi( - apiBangumi.disableRule - ); - const { execute: deleteRule, onResult: onDeleteRuleResult } = useApi( - apiBangumi.deleteRule - ); - const { execute: refreshPoster, onResult: onRefreshPosterResult } = useApi( - apiBangumi.refreshPoster - ); - - onBangumiResult((res) => { - function sort(arr: BangumiRule[]) { - return arr.sort((a, b) => b.id - a.id); - } + async function getAll() { + const res = await apiBangumi.getAll(); + const sort = (arr: BangumiRule[]) => arr.sort((a, b) => b.id - a.id); const enabled = sort(res.filter((e) => !e.deleted)); const disabled = sort(res.filter((e) => e.deleted)); bangumi.value = [...enabled, ...disabled]; - }); + } - function refresh() { + function refreshData() { editRule.show = false; getAll(); } - function actionSuccess(apiRes: ApiSuccess) { - message.success(apiRes.msg_en); - refresh(); - } + const opts = { + showMessage: true, + onSuccess() { + refreshData(); + }, + }; - onUpdateRuleResult(actionSuccess); - onDisableRuleResult(actionSuccess); - onEnableRuleResult(actionSuccess); - onDeleteRuleResult(actionSuccess); - onRefreshPosterResult(actionSuccess); + const { execute: updateRule } = useApi(apiBangumi.updateRule, opts); + const { execute: enableRule } = useApi(apiBangumi.enableRule, opts); + const { execute: disableRule } = useApi(apiBangumi.disableRule, opts); + const { execute: deleteRule } = useApi(apiBangumi.deleteRule, opts); + const { execute: refreshPoster } = useApi(apiBangumi.refreshPoster, opts); function openEditPopup(data: BangumiRule) { editRule.show = true; @@ -70,11 +49,14 @@ export const useBangumiStore = defineStore('bangumi', () => { id: number, deleteFile: boolean ) { - if (type === 'disable') { - disableRule(id, deleteFile); - } - if (type === 'delete') { - deleteRule(id, deleteFile); + switch (type) { + case 'disable': + disableRule(id, deleteFile); + break; + + case 'delete': + deleteRule(id, deleteFile); + break; } } diff --git a/webui/src/store/config.ts b/webui/src/store/config.ts index b3cdbc52..2a0ca730 100644 --- a/webui/src/store/config.ts +++ b/webui/src/store/config.ts @@ -3,37 +3,20 @@ import { type Config, initConfig } from '#/config'; export const useConfigStore = defineStore('config', () => { const config = ref(initConfig); - const { execute: getConfig, onResult: onGetConfigRusult } = useApi( - apiConfig.getConfig - ); - - onGetConfigRusult((res) => { + async function getConfig() { + const res = await apiConfig.getConfig(); config.value = res; + } + + const { execute: setConfig } = useApi(apiConfig.updateConfig, { + showMessage: true, + onSuccess() { + // 保存 config 后重启,以应用最新配置 + const { restart } = useProgramStore(); + restart(); + }, }); - const { execute: set, onResult: onSetRusult } = useApi( - apiConfig.updateConfig, - { - failRule: (res) => !res, - message: { - success: 'Apply Success!', - fail: 'Apply Failed!', - }, - } - ); - - /** - * 保持 config 后重启,以应用最新配置 - */ - onSetRusult(() => { - const { restart } = useProgramStore(); - restart(); - }); - - const setConfig = () => { - set(config.value); - }; - function getSettingGroup(key: Tkey) { return computed({ get() { diff --git a/webui/src/store/log.ts b/webui/src/store/log.ts index cba83721..80de37dc 100644 --- a/webui/src/store/log.ts +++ b/webui/src/store/log.ts @@ -1,28 +1,23 @@ export const useLogStore = defineStore('log', () => { - const log = ref(''); - const { isLoggedin } = useAuth(); const message = useMessage(); + const { isLoggedIn } = useAuth(); + const { t } = useMyI18n(); + + const log = ref(''); function get() { - const { execute, onResult } = useApi(apiLog.getLog); - - onResult((value) => { - log.value = value; - }); - - if (isLoggedin.value) { - execute(); + if (isLoggedIn.value) { + apiLog.getLog().then((res) => { + log.value = res; + }); } } - const { execute: reset, onResult: onClearLogResult } = useApi( - apiLog.clearLog - ); - - onClearLogResult((res) => { - if (res) { + const { execute: reset } = useApi(apiLog.clearLog, { + showMessage: true, + onSuccess() { log.value = ''; - } + }, }); const { pause: offUpdate, resume: onUpdate } = useIntervalFn(get, 3000, { @@ -34,9 +29,9 @@ export const useLogStore = defineStore('log', () => { const { copy: copyLog, isSupported } = useClipboard({ source: log }); if (isSupported) { copyLog(); - message.success('Copy Success!'); + message.success(t('notify.copy_success')); } else { - message.error('Your browser does not support Clipboard API!'); + message.error(t('notify.copy_failed')); } } diff --git a/webui/src/store/program.ts b/webui/src/store/program.ts index 23da96bb..44f09d51 100644 --- a/webui/src/store/program.ts +++ b/webui/src/store/program.ts @@ -1,22 +1,9 @@ export const useProgramStore = defineStore('program', () => { - function opts(handle: string) { - return { - failRule: (res: boolean) => !res, - message: { - success: `${handle} Success!`, - fail: `${handle} Failed!`, - }, - }; - } - - const { execute: start } = useApi(apiProgram.start, opts('Start')); - const { execute: pause } = useApi(apiProgram.stop, opts('Pause')); - const { execute: shutdown } = useApi(apiProgram.shutdown, opts('Shutdown')); - const { execute: restart } = useApi(apiProgram.restart, opts('Restart')); - const { execute: resetRule } = useApi( - apiBangumi.resetAll, - opts('Reset Rule') - ); + const { execute: start } = useApi(apiProgram.start); + const { execute: pause } = useApi(apiProgram.stop); + const { execute: shutdown } = useApi(apiProgram.shutdown); + const { execute: restart } = useApi(apiProgram.restart); + const { execute: resetRule } = useApi(apiBangumi.resetAll); return { start, diff --git a/webui/src/store/rss.ts b/webui/src/store/rss.ts index 511d42b6..cfba9874 100644 --- a/webui/src/store/rss.ts +++ b/webui/src/store/rss.ts @@ -1,27 +1,12 @@ import type { RSS } from '#/rss'; -import type { ApiSuccess } from '#/api'; export const useRSSStore = defineStore('rss', () => { - const message = useMessage(); const rss = ref(); const selectedRSS = ref([]); - const { execute: getAll, onResult: onRSSResult } = useApi(apiRSS.get); - const { execute: updateRSS, onResult: onUpdateRSSResult } = useApi( - apiRSS.update - ); - const { execute: disableRSS, onResult: onDisableRSSResult } = useApi( - apiRSS.disableMany - ); - const { execute: deleteRSS, onResult: onDeleteRSSResult } = useApi( - apiRSS.deleteMany - ); + async function getAll() { + const res = await apiRSS.get(); - const { execute: enableRSS, onResult: onEnableRSSResult } = useApi( - apiRSS.enableMany - ); - - onRSSResult((res) => { function sort(arr: RSS[]) { return arr.sort((a, b) => b.id - a.id); } @@ -30,40 +15,33 @@ export const useRSSStore = defineStore('rss', () => { const disabled = sort(res.filter((e) => !e.enabled)); rss.value = [...enabled, ...disabled]; - }); - - function refresh() { - getAll(); } - function disableSelected() { - disableRSS(selectedRSS.value); - } + const opts = { + showMessage: true, + onSuccess() { + getAll(); + }, + }; - function deleteSelected() { - deleteRSS(selectedRSS.value); - } + const { execute: updateRSS } = useApi(apiRSS.update, opts); + const { execute: disableRSS } = useApi(apiRSS.disableMany, opts); + const { execute: deleteRSS } = useApi(apiRSS.deleteMany, opts); + const { execute: enableRSS } = useApi(apiRSS.enableMany, opts); - function enableSelected() { - enableRSS(selectedRSS.value); - } - - function actionSuccess(apiRes: ApiSuccess) { - message.success(apiRes.msg_en); - refresh(); - } - - onUpdateRSSResult(actionSuccess); - onDeleteRSSResult(actionSuccess); - onDisableRSSResult(actionSuccess); - onEnableRSSResult(actionSuccess); + const disableSelected = () => disableRSS(selectedRSS.value); + const deleteSelected = () => deleteRSS(selectedRSS.value); + const enableSelected = () => enableRSS(selectedRSS.value); return { rss, - getAll, - refresh, selectedRSS, + + getAll, updateRSS, + disableRSS, + deleteRSS, + enableRSS, disableSelected, deleteSelected, enableSelected, diff --git a/webui/src/store/search.ts b/webui/src/store/search.ts index ffd9ec70..a86114f1 100644 --- a/webui/src/store/search.ts +++ b/webui/src/store/search.ts @@ -2,7 +2,7 @@ import { ref } from 'vue'; import { EMPTY, Subject, debounceTime, switchMap, tap } from 'rxjs'; import type { BangumiRule, SearchResult } from '#/bangumi'; -export function useSearchStore() { +export const useSearchStore = defineStore('search', () => { const bangumiList = ref([]); const inputValue = ref(''); @@ -18,13 +18,11 @@ export function useSearchStore() { loading.value = !!input; }); - const { execute: getProviders, onResult: onGetProvidersResult } = useApi( - apiSearch.getProvider - ); - - onGetProvidersResult((res) => { - providers.value = res; - }); + function getProviders() { + apiSearch.getProvider().then((res) => { + providers.value = res; + }); + } /** * - 输入中 debounce 600ms 后触发搜索 @@ -64,12 +62,13 @@ export function useSearchStore() { input$, bangumiInfo$, inputValue, - onSearch, - clearSearch, loading, provider, - getProviders, providers, bangumiList, + + onSearch, + clearSearch, + getProviders, }; -} +}); diff --git a/webui/src/utils/axios.ts b/webui/src/utils/axios.ts index 01de5600..a3331ba8 100644 --- a/webui/src/utils/axios.ts +++ b/webui/src/utils/axios.ts @@ -1,7 +1,10 @@ import Axios from 'axios'; -import type { ApiError } from '#/api'; +import type { AxiosError, AxiosResponse } from 'axios'; +import type { ApiSuccess, StatusCode } from '#/api'; -export const axios = Axios.create(); +export const axios = Axios.create({ + withCredentials: true, +}); // axios.interceptors.request.use((config) => { // const { auth } = useAuth(); @@ -14,16 +17,44 @@ export const axios = Axios.create(); // }); // axios.defaults.baseURL = '/api/v1'; -axios.defaults.withCredentials = true; +// axios.defaults.withCredentials = true; axios.interceptors.response.use( - (res) => { - return res; - }, - (err) => { - const status = err.response.status as ApiError['status']; - const msg_en = (err.response.data.msg_en ?? '') as ApiError['msg_en']; - const msg_zh = (err.response.data.msg_zh ?? '') as ApiError['msg_zh']; + (res: AxiosResponse) => res, + (err: AxiosError) => { + const status = err.response?.status as StatusCode; + const msg_en = err.response?.data.msg_en ?? ''; + const msg_zh = err.response?.data.msg_zh ?? ''; + + const message = useMessage(); + const { returnUserLangText } = useMyI18n(); + + const errorMsg = returnUserLangText({ + en: msg_en, + 'zh-CN': msg_zh, + }); + + const { isLoggedIn } = useAuth(); + + switch (status) { + /** token 过期 */ + case 401: + isLoggedIn.value = false; + if (errorMsg) message.error(errorMsg); + break; + /** 执行失败 */ + case 406: + if (errorMsg) message.error(errorMsg); + break; + case 500: + message.error( + returnUserLangText({ + en: 'Server error!', + 'zh-CN': '服务器错误!', + }) + ); + break; + } const error = { status, @@ -31,24 +62,6 @@ axios.interceptors.response.use( msg_zh, }; - const message = useMessage(); - - /** token 过期 */ - if (error.status === 401) { - const { isLoggedin } = useAuth(); - isLoggedin.value = false; - } - - /** 执行失败 */ - if (error.status === 406) { - message.error(error.msg_zh); - } - - if (error.status === 500) { - const msg = (err.response.data.msg_en ?? '') as ApiError['msg_en']; - message.error(msg); - } - return Promise.reject(error); } ); diff --git a/webui/src/utils/omit.test.ts b/webui/src/utils/omit.test.ts deleted file mode 100644 index 7748deaf..00000000 --- a/webui/src/utils/omit.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { expect, it } from 'vitest'; -import { omit } from './omit'; - -it('test omit', () => { - const obj = { - a: 1, - b: 2, - c: 3, - d: 4, - }; - - expect(omit(obj, ['a'])).toStrictEqual({ - b: 2, - c: 3, - d: 4, - }); - - expect(omit(obj, ['b', 'c'])).toStrictEqual({ - a: 1, - d: 4, - }); -}); diff --git a/webui/src/utils/omit.ts b/webui/src/utils/omit.ts deleted file mode 100644 index 63d0b180..00000000 --- a/webui/src/utils/omit.ts +++ /dev/null @@ -1,12 +0,0 @@ -export function omit( - obj: T, - omitKeys: Array -) { - return Object.keys(obj).reduce((acc, key) => { - if (omitKeys.includes(key)) { - return acc; - } else { - return { ...acc, [key]: obj[key] }; - } - }, {}); -} diff --git a/webui/types/auth.ts b/webui/types/auth.ts index 71bb3ba6..3fb1b098 100644 --- a/webui/types/auth.ts +++ b/webui/types/auth.ts @@ -4,10 +4,6 @@ export interface LoginSuccess { expire: number; } -export interface Logout { - message: 'logout success'; -} - export interface Update extends LoginSuccess { message: 'update success'; } diff --git a/webui/types/dts/auto-imports.d.ts b/webui/types/dts/auto-imports.d.ts index f68e10ba..c13ef3bf 100644 --- a/webui/types/dts/auto-imports.d.ts +++ b/webui/types/dts/auto-imports.d.ts @@ -72,7 +72,6 @@ declare global { const mapWritableState: typeof import('pinia')['mapWritableState'] const markRaw: typeof import('vue')['markRaw'] const nextTick: typeof import('vue')['nextTick'] - const omit: typeof import('../../src/utils/omit')['omit'] const onActivated: typeof import('vue')['onActivated'] const onBeforeMount: typeof import('vue')['onBeforeMount'] const onBeforeRouteLeave: typeof import('vue-router/auto')['onBeforeRouteLeave'] diff --git a/webui/unocss.config.ts b/webui/unocss.config.ts index 31c4fe22..2288715c 100644 --- a/webui/unocss.config.ts +++ b/webui/unocss.config.ts @@ -9,10 +9,21 @@ import presetRemToPx from '@unocss/preset-rem-to-px'; export default defineConfig({ presets: [ presetUno(), - presetRemToPx(), + presetRemToPx({ + baseFontSize: 4, + }), presetAttributify(), presetIcons({ cdn: 'https://esm.sh/' }), ], + preflights: [ + { + getCSS: () => ` + :root { + font-size: 4px; + } + `, + }, + ], theme: { colors: { primary: '#493475', @@ -51,33 +62,48 @@ export default defineConfig({ shortcuts: [ [/^wh-(.*)$/, ([, t]) => `w-${t} h-${t}`], - [ - 'layout-container', - 'wh-screen min-w-1024px min-h-768px p-16px space-y-12px flex flex-col bg-page', - ], - [ - 'layout-main', - 'flex space-x-20px overflow-hidden h-[calc(100vh_-_2_*_16px_-_60px_-_12px)]', - ], - ['layout-content', 'overflow-hidden h-full flex flex-col flex-1'], + // position + { + rel: 'relative', + abs: 'absolute', + }, - ['rel', 'relative'], - ['abs', 'absolute'], - ['fx-cer', 'flex items-center'], - ['f-cer', 'fx-cer justify-center'], - ['text-h1', 'text-24px'], - ['text-h2', 'text-20px'], - ['text-h3', 'text-16px'], - ['text-main', 'text-12px'], - [ - 'ab-input', - 'outline-none min-w-0 w-200px h-28px px-12px text-main text-right rounded-6px border-1 border-black shadow-inset hover:border-color-[#7A46AE]', - ], - ['input-error', 'border-color-[#CA0E0E]'], - ['is-btn', 'cursor-pointer select-none'], - ['is-disabled', 'cursor-not-allowed select-none'], - ['input-reset', 'bg-transparent min-w-0 flex-1 outline-none'], - ['btn-click', 'hover:scale-110 active:scale-100'], - ['line', 'w-full h-1px bg-[#DFE1EF]'], + // flex + { + 'fx-cer': 'flex items-center', + 'f-cer': 'flex items-center justify-center', + }, + + // font size + { + 'text-h1': 'text-24', + 'text-h2': 'text-20', + 'text-h3': 'text-16', + 'text-main': 'text-12', + }, + + // input + { + 'ab-input': `outline-none min-w-0 w-200 h-28 + px-12 text-main text-right + rounded-6 shadow-inset + border-1 border-black hover:border-color-[#7A46AE] + `, + + 'input-error': 'border-color-[#CA0E0E]', + 'input-reset': 'bg-transparent min-w-0 flex-1 outline-none', + }, + + // status + { + 'is-btn': 'cursor-pointer select-none', + 'btn-click': 'hover:scale-110 active:scale-100', + 'is-disabled': 'cursor-not-allowed select-none', + }, + + // other + { + line: 'w-full h-1 bg-[#DFE1EF]', + }, ], }); diff --git a/webui/vite.config.ts b/webui/vite.config.ts index 52b8e533..3f81d975 100644 --- a/webui/vite.config.ts +++ b/webui/vite.config.ts @@ -11,7 +11,7 @@ import { VitePWA } from 'vite-plugin-pwa'; import VueJsx from '@vitejs/plugin-vue-jsx'; // https://vitejs.dev/config/ -export default defineConfig({ +export default defineConfig(({ mode }) => ({ base: './', plugins: [ VueJsx(), @@ -92,6 +92,9 @@ export default defineConfig({ }, }, }, + esbuild: { + drop: mode === 'production' ? ['console', 'debugger'] : [], + }, build: { cssCodeSplit: false, }, @@ -108,4 +111,4 @@ export default defineConfig({ '^/posters/.*': 'http://127.0.0.1:7892', }, }, -}); +}));
{{ log }}