diff --git a/app-views/components.d.ts b/app-views/components.d.ts
new file mode 100644
index 0000000..0dccebc
--- /dev/null
+++ b/app-views/components.d.ts
@@ -0,0 +1,15 @@
+/* eslint-disable */
+// @ts-nocheck
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+export {}
+
+/* prettier-ignore */
+declare module 'vue' {
+ export interface GlobalComponents {
+ AButton: typeof import('ant-design-vue/es')['Button']
+ AProgress: typeof import('ant-design-vue/es')['Progress']
+ Download: typeof import('./src/components/download.vue')['default']
+ HelloWorld: typeof import('./src/components/HelloWorld.vue')['default']
+ }
+}
diff --git a/app-views/package.json b/app-views/package.json
index 59205e5..687ab71 100644
--- a/app-views/package.json
+++ b/app-views/package.json
@@ -1,6 +1,7 @@
{
"type": "module",
"dependencies": {
+ "ant-design-vue": "^4.2.3",
"lit": "^3.2.0",
"lodash": "^4.17.21",
"vue": "^3.4.38"
diff --git a/app-views/pnpm-lock.yaml b/app-views/pnpm-lock.yaml
index c1a9815..a6723de 100644
--- a/app-views/pnpm-lock.yaml
+++ b/app-views/pnpm-lock.yaml
@@ -8,6 +8,9 @@ importers:
.:
dependencies:
+ ant-design-vue:
+ specifier: ^4.2.3
+ version: 4.2.3(vue@3.4.38)
lit:
specifier: ^3.2.0
version: 3.2.0
@@ -20,6 +23,17 @@ importers:
packages:
+ '@ant-design/colors@6.0.0':
+ resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==}
+
+ '@ant-design/icons-svg@4.4.2':
+ resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==}
+
+ '@ant-design/icons-vue@7.0.1':
+ resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==}
+ peerDependencies:
+ vue: '>=3.0.3'
+
'@babel/helper-string-parser@7.24.8':
resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
engines: {node: '>=6.9.0'}
@@ -33,10 +47,24 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
+ '@babel/runtime@7.25.4':
+ resolution: {integrity: sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==}
+ engines: {node: '>=6.9.0'}
+
'@babel/types@7.25.2':
resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==}
engines: {node: '>=6.9.0'}
+ '@ctrl/tinycolor@3.6.1':
+ resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+ engines: {node: '>=10'}
+
+ '@emotion/hash@0.9.2':
+ resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==}
+
+ '@emotion/unitless@0.8.1':
+ resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
+
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
@@ -46,6 +74,9 @@ packages:
'@lit/reactive-element@2.0.4':
resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==}
+ '@simonwep/pickr@1.8.2':
+ resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==}
+
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
@@ -78,9 +109,36 @@ packages:
'@vue/shared@3.4.38':
resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==}
+ ant-design-vue@4.2.3:
+ resolution: {integrity: sha512-kqGyWvZtFlSInFP93Ow6wS8LzEsxxUgpI+ZY5jQQkuX8WAcqdwXCA7IcHMpECW6JB89DZMo2Bw85jUg2SjlgQA==}
+ engines: {node: '>=12.22.0'}
+ peerDependencies:
+ vue: '>=3.2.0'
+
+ array-tree-filter@2.1.0:
+ resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==}
+
+ async-validator@4.2.5:
+ resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+ compute-scroll-into-view@1.0.20:
+ resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==}
+
+ core-js@3.38.1:
+ resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==}
+
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+ dayjs@1.11.13:
+ resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
+ dom-align@1.12.4:
+ resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==}
+
+ dom-scroll-into-view@2.0.1:
+ resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==}
+
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
@@ -88,6 +146,13 @@ packages:
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+ is-plain-object@3.0.1:
+ resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==}
+ engines: {node: '>=0.10.0'}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
lit-element@4.1.0:
resolution: {integrity: sha512-gSejRUQJuMQjV2Z59KAS/D4iElUhwKpIyJvZ9w+DIagIQjfJnhR20h2Q5ddpzXGS+fF0tMZ/xEYGMnKmaI/iww==}
@@ -97,9 +162,16 @@ packages:
lit@3.2.0:
resolution: {integrity: sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw==}
+ lodash-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
magic-string@0.30.11:
resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
@@ -108,6 +180,9 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ nanopop@2.4.2:
+ resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==}
+
picocolors@1.0.1:
resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
@@ -115,14 +190,39 @@ packages:
resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
engines: {node: ^10 || ^12 || >=14}
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ resize-observer-polyfill@1.5.1:
+ resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+
+ scroll-into-view-if-needed@2.2.31:
+ resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==}
+
+ shallow-equal@1.2.1:
+ resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==}
+
source-map-js@1.2.0:
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
engines: {node: '>=0.10.0'}
+ stylis@4.3.4:
+ resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==}
+
+ throttle-debounce@5.0.2:
+ resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
+ engines: {node: '>=12.22'}
+
to-fast-properties@2.0.0:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
+ vue-types@3.0.2:
+ resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==}
+ engines: {node: '>=10.15.0'}
+ peerDependencies:
+ vue: ^3.0.0
+
vue@3.4.38:
resolution: {integrity: sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==}
peerDependencies:
@@ -131,8 +231,23 @@ packages:
typescript:
optional: true
+ warning@4.0.3:
+ resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
+
snapshots:
+ '@ant-design/colors@6.0.0':
+ dependencies:
+ '@ctrl/tinycolor': 3.6.1
+
+ '@ant-design/icons-svg@4.4.2': {}
+
+ '@ant-design/icons-vue@7.0.1(vue@3.4.38)':
+ dependencies:
+ '@ant-design/colors': 6.0.0
+ '@ant-design/icons-svg': 4.4.2
+ vue: 3.4.38
+
'@babel/helper-string-parser@7.24.8': {}
'@babel/helper-validator-identifier@7.24.7': {}
@@ -141,12 +256,22 @@ snapshots:
dependencies:
'@babel/types': 7.25.2
+ '@babel/runtime@7.25.4':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
'@babel/types@7.25.2':
dependencies:
'@babel/helper-string-parser': 7.24.8
'@babel/helper-validator-identifier': 7.24.7
to-fast-properties: 2.0.0
+ '@ctrl/tinycolor@3.6.1': {}
+
+ '@emotion/hash@0.9.2': {}
+
+ '@emotion/unitless@0.8.1': {}
+
'@jridgewell/sourcemap-codec@1.5.0': {}
'@lit-labs/ssr-dom-shim@1.2.1': {}
@@ -155,6 +280,11 @@ snapshots:
dependencies:
'@lit-labs/ssr-dom-shim': 1.2.1
+ '@simonwep/pickr@1.8.2':
+ dependencies:
+ core-js: 3.38.1
+ nanopop: 2.4.2
+
'@types/trusted-types@2.0.7': {}
'@vue/compiler-core@3.4.38':
@@ -211,12 +341,56 @@ snapshots:
'@vue/shared@3.4.38': {}
+ ant-design-vue@4.2.3(vue@3.4.38):
+ dependencies:
+ '@ant-design/colors': 6.0.0
+ '@ant-design/icons-vue': 7.0.1(vue@3.4.38)
+ '@babel/runtime': 7.25.4
+ '@ctrl/tinycolor': 3.6.1
+ '@emotion/hash': 0.9.2
+ '@emotion/unitless': 0.8.1
+ '@simonwep/pickr': 1.8.2
+ array-tree-filter: 2.1.0
+ async-validator: 4.2.5
+ csstype: 3.1.3
+ dayjs: 1.11.13
+ dom-align: 1.12.4
+ dom-scroll-into-view: 2.0.1
+ lodash: 4.17.21
+ lodash-es: 4.17.21
+ resize-observer-polyfill: 1.5.1
+ scroll-into-view-if-needed: 2.2.31
+ shallow-equal: 1.2.1
+ stylis: 4.3.4
+ throttle-debounce: 5.0.2
+ vue: 3.4.38
+ vue-types: 3.0.2(vue@3.4.38)
+ warning: 4.0.3
+
+ array-tree-filter@2.1.0: {}
+
+ async-validator@4.2.5: {}
+
+ compute-scroll-into-view@1.0.20: {}
+
+ core-js@3.38.1: {}
+
csstype@3.1.3: {}
+ dayjs@1.11.13: {}
+
+ dom-align@1.12.4: {}
+
+ dom-scroll-into-view@2.0.1: {}
+
entities@4.5.0: {}
estree-walker@2.0.2: {}
+ is-plain-object@3.0.1: {}
+
+ js-tokens@4.0.0: {}
+
lit-element@4.1.0:
dependencies:
'@lit-labs/ssr-dom-shim': 1.2.1
@@ -233,14 +407,22 @@ snapshots:
lit-element: 4.1.0
lit-html: 3.2.0
+ lodash-es@4.17.21: {}
+
lodash@4.17.21: {}
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
magic-string@0.30.11:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
nanoid@3.3.7: {}
+ nanopop@2.4.2: {}
+
picocolors@1.0.1: {}
postcss@8.4.41:
@@ -249,10 +431,29 @@ snapshots:
picocolors: 1.0.1
source-map-js: 1.2.0
+ regenerator-runtime@0.14.1: {}
+
+ resize-observer-polyfill@1.5.1: {}
+
+ scroll-into-view-if-needed@2.2.31:
+ dependencies:
+ compute-scroll-into-view: 1.0.20
+
+ shallow-equal@1.2.1: {}
+
source-map-js@1.2.0: {}
+ stylis@4.3.4: {}
+
+ throttle-debounce@5.0.2: {}
+
to-fast-properties@2.0.0: {}
+ vue-types@3.0.2(vue@3.4.38):
+ dependencies:
+ is-plain-object: 3.0.1
+ vue: 3.4.38
+
vue@3.4.38:
dependencies:
'@vue/compiler-dom': 3.4.38
@@ -260,3 +461,7 @@ snapshots:
'@vue/runtime-dom': 3.4.38
'@vue/server-renderer': 3.4.38(vue@3.4.38)
'@vue/shared': 3.4.38
+
+ warning@4.0.3:
+ dependencies:
+ loose-envify: 1.4.0
diff --git a/app-views/src/App.vue b/app-views/src/App.vue
index 2082192..85ef309 100644
--- a/app-views/src/App.vue
+++ b/app-views/src/App.vue
@@ -1,6 +1,7 @@
+
+
\ No newline at end of file
diff --git a/app-views/tsconfig.json b/app-views/tsconfig.json
index da0b768..ecc094f 100644
--- a/app-views/tsconfig.json
+++ b/app-views/tsconfig.json
@@ -20,5 +20,5 @@
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
- "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
+ "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "../global.d.ts"]
}
diff --git a/app/package.json b/app/package.json
index 8158123..a18586f 100644
--- a/app/package.json
+++ b/app/package.json
@@ -7,6 +7,7 @@
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
+ "axios": "^1.7.4",
"fs-extra": "^11.2.0"
}
}
diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml
index f417391..3b2c1f1 100644
--- a/app/pnpm-lock.yaml
+++ b/app/pnpm-lock.yaml
@@ -8,12 +8,46 @@ importers:
.:
dependencies:
+ axios:
+ specifier: ^1.7.4
+ version: 1.7.5
fs-extra:
specifier: ^11.2.0
version: 11.2.0
+ ..: {}
+
+ ../app-views: {}
+
packages:
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ axios@1.7.5:
+ resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ follow-redirects@1.15.6:
+ resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ form-data@4.0.0:
+ resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+ engines: {node: '>= 6'}
+
fs-extra@11.2.0:
resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
engines: {node: '>=14.14'}
@@ -24,12 +58,47 @@ packages:
jsonfile@6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
snapshots:
+ asynckit@0.4.0: {}
+
+ axios@1.7.5:
+ dependencies:
+ follow-redirects: 1.15.6
+ form-data: 4.0.0
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ delayed-stream@1.0.0: {}
+
+ follow-redirects@1.15.6: {}
+
+ form-data@4.0.0:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+
fs-extra@11.2.0:
dependencies:
graceful-fs: 4.2.11
@@ -44,4 +113,12 @@ snapshots:
optionalDependencies:
graceful-fs: 4.2.11
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ proxy-from-env@1.1.0: {}
+
universalify@2.0.1: {}
diff --git a/app/src/download.ts b/app/src/download.ts
deleted file mode 100644
index d15bfa4..0000000
--- a/app/src/download.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import type { Session } from 'electron';
-
-export class DownloadManger {
- constructor(session: Session) {
- session.addListener('will-download', (e, item) => {
- console.log(item);
- });
- }
-}
diff --git a/app/src/download/download-item.ts b/app/src/download/download-item.ts
new file mode 100644
index 0000000..21de409
--- /dev/null
+++ b/app/src/download/download-item.ts
@@ -0,0 +1,70 @@
+import { EventEmitter } from 'node:events';
+import type { IDownloadItem } from './type.js';
+
+type EventArgsMap = {
+ 'download:start': (item: IDownloadItem) => void;
+ 'download:progress': (item: IDownloadItem) => void;
+ 'download:end': (item: IDownloadItem, success: boolean, error?: Error) => void;
+};
+
+type IAllowEvents = keyof EventArgsMap;
+
+class DownloadItemEmitter {
+ private _emit: EventEmitter;
+
+ constructor() {
+ this._emit = new EventEmitter();
+ }
+
+ emit(event: IAllowEvents, ...args: Parameters) {
+ return this._emit.emit(event, ...args);
+ }
+
+ on(event: IAllowEvents, fn: EventArgsMap[IAllowEvents]) {
+ return this._emit.on(event, fn);
+ }
+
+ once(event: IAllowEvents, fn: EventArgsMap[IAllowEvents]) {
+ return this._emit.once(event, fn);
+ }
+
+ off(event: IAllowEvents, fn: EventArgsMap[IAllowEvents]) {
+ return this._emit.off(event, fn);
+ }
+}
+
+export class DownloadItem extends DownloadItemEmitter implements IDownloadItem {
+ url: string;
+ file: string;
+ contentLength: number;
+ percent: number;
+ isPause?: boolean;
+ isWait?: boolean;
+ isLoading?: boolean;
+
+ constructor(item: IDownloadItem) {
+ super();
+ this.url = item.url;
+ this.file = item.file;
+ this.contentLength = item.contentLength;
+ this.percent = item.percent;
+ this.isPause = item.isPause;
+ this.isWait = item.isWait;
+ this.isLoading = item.isLoading;
+ }
+
+ cancel?: (() => void) | undefined;
+
+ // 用于传递数据的 item,需要剥离一些不可序列化的数据
+ pickItem(): Omit {
+ const { url, file, contentLength, percent, isPause, isWait } = this;
+ return {
+ url,
+ file,
+ contentLength,
+ percent,
+ isPause,
+ isWait,
+ };
+ }
+}
diff --git a/app/src/download/download.ts b/app/src/download/download.ts
new file mode 100644
index 0000000..18190fa
--- /dev/null
+++ b/app/src/download/download.ts
@@ -0,0 +1,242 @@
+// 验证资源是否支持分片
+// curl -r 0-1048575 https://download.cocos.com/CocosCreator/v3.8.3/CocosCreator-v3.8.3-mac-051115.zip --output 1.zip
+
+import { join, basename, dirname } from 'node:path';
+import { tmpdir } from 'node:os';
+import { existsSync, createWriteStream } from 'node:fs';
+import { stat } from 'node:fs/promises';
+import { pipeline } from 'node:stream/promises';
+import { createHash } from 'node:crypto';
+import { ensureDir, remove } from 'fs-extra';
+import axios from 'axios';
+import { DownloadItem } from './download-item.js';
+
+export class DownloadManger {
+ constructor(downloadPath?: string) {
+ this.downloadPath = downloadPath || tmpdir();
+ }
+
+ chunkSize = 1 * 1024 * 1024; // 1kb = 1024 bytes
+
+ downloadItemMap: { [key: string]: DownloadItem } = {};
+
+ downloadPath: string;
+
+ maxTaskLength = 2;
+
+ // 正在下载
+ get downloadingTasks() {
+ return Object.values(this.downloadItemMap).filter((v) => v.isLoading);
+ }
+
+ // 等待下载
+ get downloadWaitTasks() {
+ return Object.values(this.downloadItemMap).filter((v) => v.isWait);
+ }
+
+ // 是否超出下载上限
+ get isOverLimit() {
+ return this.downloadingTasks.length >= this.maxTaskLength;
+ }
+
+ // 创建下载任务
+ async createTask(url: string): Promise {
+ ensureDir(this.downloadPath); // 每次下载都确保一下路径是存在的,避免创建文件的错误
+
+ // 每次下载都请求一次 contentLength 方便和本地数据做对比
+ const contentLength = await this.getContentLength(url);
+ if (!contentLength) {
+ throw new Error(`${url} content-length is invilod: ${contentLength}`);
+ }
+
+ const file = this.getSavePath(url);
+
+ if (existsSync(file)) {
+ let item: DownloadItem = this.downloadItemMap[url];
+ let size = (await stat(file)).size;
+
+ // 本地文件大小 超出 远程文件大小
+ const isLocalGTRemote = size > contentLength;
+ // 本地记录的大小 不等于 远程大小
+ const isRecodeNotEQRemote = item && item.contentLength !== contentLength;
+
+ // 以上两种情况都直接放弃本地缓存,直接重新下载
+ if (isLocalGTRemote || isRecodeNotEQRemote) {
+ await remove(file);
+ size = 0;
+ }
+
+ if (!item) {
+ // 根据本地文件重建 item 数据
+ item = new DownloadItem({
+ url,
+ file,
+ contentLength: contentLength,
+ percent: size / contentLength,
+ });
+
+ this.downloadItemMap[url] = item;
+ }
+
+ // reset
+ item.contentLength = contentLength;
+ item.isPause = false;
+
+ process.nextTick(() => {
+ // 要先返回 item 否则外面无法监听事件 所以在 nextTick 执行
+ if (size === item.contentLength) {
+ this.downloadEnd(item, true);
+ } else {
+ this.downloadStart(item, size); // 基于已有的缓存继续下载
+ }
+ });
+ return item;
+ } else {
+ let item = this.downloadItemMap[url];
+ if (!item) {
+ item = new DownloadItem({
+ url,
+ file,
+ percent: 0,
+ contentLength: contentLength,
+ });
+
+ this.downloadItemMap[url] = item;
+ }
+ // reset
+ item.contentLength = contentLength;
+ item.isPause = false;
+
+ process.nextTick(() => {
+ this.downloadStart(item, 0);
+ });
+ return item;
+ }
+ }
+
+ // 删除下载任务
+ async deleteTask(url: string) {
+ const item = this.downloadItemMap[url];
+ if (item) {
+ this.cancel(url);
+ delete this.downloadItemMap[url];
+ await remove(item.file);
+ }
+ }
+
+ // 暂停下载任务
+ pauseTask(url: string) {
+ this.cancel(url);
+ }
+
+ private cancel(url: string) {
+ const item = this.downloadItemMap[url];
+ if (item?.isLoading) {
+ item.isPause = true;
+ item.cancel?.();
+ }
+ }
+
+ // 开始下载
+ private async downloadStart(item: DownloadItem, downloadedSize = 0) {
+ if (item.isLoading) return; // 避免重复下载
+
+ item.isWait = this.isOverLimit;
+ if (item.isWait) {
+ console.log('排队等待');
+ } else {
+ item.isPause = false;
+ item.isWait = false;
+ item.isLoading = true;
+ this.download(item, downloadedSize);
+ item.emit('download:start', item.pickItem());
+ }
+ }
+
+ // 正在下载
+ private async download(item: DownloadItem, downloadedSize = 0) {
+ if (item.isPause) {
+ return this.downloadEnd(item, downloadedSize === item.contentLength - 1);
+ }
+
+ // range 是从 0 开始,所以对比要 - 1
+ if (downloadedSize < item.contentLength - 1) {
+ const currentChunkEnd = Math.min(downloadedSize + this.chunkSize, item.contentLength - 1);
+
+ const controller = new AbortController();
+
+ item.cancel = () => {
+ // 必须包装一层 fn,不能直接赋值
+ controller.abort();
+ };
+
+ await axios({
+ url: item.url,
+ method: 'GET',
+ responseType: 'stream',
+ headers: {
+ Range: `bytes=${downloadedSize}-${currentChunkEnd}`,
+ },
+ timeout: 5 * 1000,
+ maxBodyLength: Infinity,
+ maxContentLength: Infinity,
+ signal: controller.signal,
+ })
+ .then((res) => {
+ // https://nodejs.org/api/fs.html#fscreatewritestreampath-options
+ // https://nodejs.org/api/fs.html#file-system-flags
+ return pipeline(res.data, createWriteStream(item.file, { flags: 'a' }));
+ })
+ .then(() => {
+ item.percent = currentChunkEnd / (item.contentLength - 1);
+ item.emit('download:progress', item.pickItem());
+ this.download(item, currentChunkEnd + 1); // 因为 header:Range 那边是两边闭合,所以下一个起点需要 +1
+ })
+ .catch((e) => {
+ this.downloadEnd(item, false, e);
+ })
+ .finally(() => {
+ // 做些清理工作,避免内存泄露
+ delete item.cancel;
+ });
+ } else {
+ this.downloadEnd(item, true);
+ }
+ }
+
+ // 结束下载
+ private async downloadEnd(item: DownloadItem, success: boolean, error?: Error) {
+ item.isWait = false;
+ item.isLoading = false;
+ item.isPause = true;
+ item.emit('download:end', item.pickItem(), success, error);
+
+ // 如果有排队等待的则进行新的下载
+ if (this.downloadWaitTasks.length > 0) {
+ const nextItem = this.downloadWaitTasks[0];
+ this.createTask(nextItem.url);
+ }
+ }
+
+ private getSavePath(url: string) {
+ const uuid = createHash('md5').update(url).digest('hex'); // 通过 url 生成唯一的文件名
+ return join(this.downloadPath, uuid + '_' + basename(url));
+ }
+
+ private getContentLength(url: string): Promise {
+ return new Promise((resolve) => {
+ axios
+ .head(url)
+ .then((res) => {
+ const contentLength = res.headers['content-length'];
+ if (contentLength) {
+ resolve(Number(contentLength));
+ }
+ resolve(0);
+ })
+ .catch(() => {
+ resolve(0);
+ });
+ });
+ }
+}
diff --git a/app/src/download/index.ts b/app/src/download/index.ts
new file mode 100644
index 0000000..209f268
--- /dev/null
+++ b/app/src/download/index.ts
@@ -0,0 +1,42 @@
+import { DownloadManger } from './download.js';
+import { ipcMain, app } from 'electron';
+import { broadcast } from '../ipc.js';
+import { join } from 'node:path';
+import type { IDownloadItem } from './type.js';
+
+const downloadManger = new DownloadManger(join(app.getPath('downloads'), 'CocosDashboard'));
+
+const list: IDownloadItem[] = [];
+
+ipcMain.on('download-create', async (_, url) => {
+ const downloadItem = await downloadManger.createTask(url);
+
+ const _item = downloadItem.pickItem();
+ if (list.every((v) => v.url !== _item.url)) {
+ list.push(_item);
+
+ downloadItem.on('download:start', (item: IDownloadItem) => {
+ console.log('开始下载:', item);
+ Object.assign(_item, item);
+ broadcast('download-update', list);
+ });
+
+ downloadItem.on('download:progress', (item: IDownloadItem) => {
+ // console.log('正在下载:', item.percent);
+ Object.assign(_item, item);
+ broadcast('download-progress', item);
+ });
+
+ downloadItem.on('download:end', (item: IDownloadItem, success: boolean, error?: Error) => {
+ console.log('结束下载:', item, success, error);
+ Object.assign(_item, item);
+ broadcast('download-update', list);
+ });
+ }
+
+ broadcast('download-update', list);
+});
+
+ipcMain.on('download-pause', (_, url) => {
+ downloadManger.pauseTask(url);
+});
diff --git a/app/src/download/type.d.ts b/app/src/download/type.d.ts
new file mode 100644
index 0000000..9d65e8c
--- /dev/null
+++ b/app/src/download/type.d.ts
@@ -0,0 +1,10 @@
+export interface IDownloadItem {
+ url: string;
+ file: string;
+ contentLength: number;
+ percent: number;
+ isPause?: boolean; // 暂停下载是用户交互控制的 比如手动暂停 或者 退出程序
+ isWait?: boolean; // 等待是内部机制,不能同时下载超过一定数量
+ isLoading?: boolean; // 是否正在下载(不能根据 !isPause && !isWait 推断,任务刚创建的时候,2 个都是 falsely)
+ cancel?: () => void;
+}
diff --git a/app/src/index.ts b/app/src/index.ts
index 09875ba..d796301 100644
--- a/app/src/index.ts
+++ b/app/src/index.ts
@@ -1,13 +1,12 @@
-import { app, BrowserWindow, ipcMain, Menu, BrowserView, BaseWindow, WebContentsView } from 'electron';
+import { app, BrowserWindow, ipcMain } from 'electron';
import { join, dirname } from 'node:path';
import { pathToFileURL, fileURLToPath } from 'node:url';
+import './download/index.js';
import './menu/index.js';
import './window-center.js';
const __dirname = dirname(fileURLToPath(import.meta.url));
-console.log(123);
-
let main: BrowserWindow | null = null;
const createWindow = () => {
const mainWindow = new BrowserWindow({
diff --git a/app/src/ipc.ts b/app/src/ipc.ts
new file mode 100644
index 0000000..15d4ea8
--- /dev/null
+++ b/app/src/ipc.ts
@@ -0,0 +1,11 @@
+import { BrowserWindow } from 'electron';
+import type { WebContents } from 'electron';
+
+type broadcastParams = Parameters;
+
+export function broadcast(...args: broadcastParams) {
+ const allWins = BrowserWindow.getAllWindows();
+ allWins.forEach((win) => {
+ win.webContents.send(...args);
+ });
+}
diff --git a/app/src/utils.ts b/app/src/utils.ts
new file mode 100644
index 0000000..e358ea7
--- /dev/null
+++ b/app/src/utils.ts
@@ -0,0 +1,20 @@
+import { createHash } from 'node:crypto';
+import { createReadStream, existsSync, createWriteStream } from 'node:fs';
+
+export function getFileMD5(file: string): Promise {
+ return new Promise((resolve, reject) => {
+ const hash = createHash('md5');
+
+ const stream = createReadStream(file);
+ stream.on('error', reject);
+ stream.on('data', hash.update);
+
+ stream.on('end', () => {
+ resolve(hash.digest('hex'));
+ });
+ });
+}
+
+export function sleep(time: number = 0): Promise {
+ return new Promise((resolve) => setTimeout(resolve, time));
+}
diff --git a/app/tsconfig.json b/app/tsconfig.json
index 2773f08..7df1ad8 100644
--- a/app/tsconfig.json
+++ b/app/tsconfig.json
@@ -19,5 +19,5 @@
"noUnusedParameters": false, // 函数参数
"noFallthroughCasesInSwitch": true
},
- "include": ["./src"]
+ "include": ["./src", "../global.d.ts"]
}
diff --git a/global.d.ts b/global.d.ts
new file mode 100644
index 0000000..bd70090
--- /dev/null
+++ b/global.d.ts
@@ -0,0 +1,9 @@
+declare type IDownloadItem = {
+ url: string;
+ file: string;
+ contentLength: number;
+ percent: number;
+ isLoading: boolean;
+ isPause?: boolean; // 暂停下载是用户交互控制的 比如手动暂停 或者 退出程序
+ isWait?: boolean; // 等待是内部机制,不能同时下载超过一定数量
+};
diff --git a/package.json b/package.json
index bf425a7..9d94973 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
"packageManager": "pnpm@9.0.0",
"devDependencies": {
"@electron/asar": "^3.2.8",
+ "@types/fs-extra": "^11.0.4",
"@vitejs/plugin-vue": "^5.1.2",
"axios": "^1.7.4",
"electron": "32.0.1",
@@ -20,6 +21,7 @@
"fs-extra": "^11.2.0",
"progress": "^2.0.3",
"typescript": "^5.5.4",
+ "unplugin-vue-components": "^0.27.4",
"vite": "^5.4.2",
"vue-tsc": "^2.0.29"
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 51060f8..8226dd9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,6 +11,9 @@ importers:
'@electron/asar':
specifier: ^3.2.8
version: 3.2.10
+ '@types/fs-extra':
+ specifier: ^11.0.4
+ version: 11.0.4
'@vitejs/plugin-vue':
specifier: ^5.1.2
version: 5.1.2(vite@5.4.2(@types/node@22.5.0))(vue@3.4.38(typescript@5.5.4))
@@ -32,6 +35,9 @@ importers:
typescript:
specifier: ^5.5.4
version: 5.5.4
+ unplugin-vue-components:
+ specifier: ^0.27.4
+ version: 0.27.4(@babel/parser@7.25.3)(rollup@4.21.0)(vue@3.4.38(typescript@5.5.4))
vite:
specifier: ^5.4.2
version: 5.4.2(@types/node@22.5.0)
@@ -41,6 +47,9 @@ importers:
packages:
+ '@antfu/utils@0.7.10':
+ resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
+
'@babel/helper-string-parser@7.24.8':
resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
engines: {node: '>=6.9.0'}
@@ -208,6 +217,27 @@ packages:
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@rollup/pluginutils@5.1.0':
+ resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
'@rollup/rollup-android-arm-eabi@4.21.0':
resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==}
cpu: [arm]
@@ -311,9 +341,15 @@ packages:
'@types/estree@1.0.5':
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+ '@types/fs-extra@11.0.4':
+ resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
+
'@types/http-cache-semantics@4.0.4':
resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
+ '@types/jsonfile@6.1.4':
+ resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==}
+
'@types/keyv@3.1.4':
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
@@ -385,6 +421,15 @@ packages:
'@vue/shared@3.4.38':
resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==}
+ acorn@8.12.1:
+ resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
@@ -394,6 +439,10 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
boolean@3.2.0:
resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==}
@@ -403,6 +452,10 @@ packages:
brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
@@ -414,6 +467,10 @@ packages:
resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==}
engines: {node: '>=8'}
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
clone-response@1.0.3:
resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
@@ -431,6 +488,9 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ confbox@0.1.7:
+ resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==}
+
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
@@ -513,9 +573,20 @@ packages:
engines: {node: '>= 10.17.0'}
hasBin: true
+ fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+
+ fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+
fd-slicer@1.1.0:
resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
follow-redirects@1.15.6:
resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
engines: {node: '>=4.0'}
@@ -556,6 +627,10 @@ packages:
resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
engines: {node: '>=8'}
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Glob versions prior to v9 are no longer supported
@@ -611,6 +686,22 @@ packages:
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
@@ -626,6 +717,10 @@ packages:
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ local-pkg@0.5.0:
+ resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
+ engines: {node: '>=14'}
+
lowercase-keys@2.0.0:
resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
engines: {node: '>=8'}
@@ -637,6 +732,14 @@ packages:
resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==}
engines: {node: '>=10'}
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
@@ -660,6 +763,9 @@ packages:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'}
+ mlly@1.7.1:
+ resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==}
+
ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
@@ -671,6 +777,10 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
normalize-url@6.1.0:
resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
engines: {node: '>=10'}
@@ -693,12 +803,22 @@ packages:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
+ pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
picocolors@1.0.1:
resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ pkg-types@1.2.0:
+ resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==}
+
postcss@8.4.41:
resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
engines: {node: ^10 || ^12 || >=14}
@@ -713,16 +833,27 @@ packages:
pump@3.0.0:
resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
quick-lru@5.1.1:
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
engines: {node: '>=10'}
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
resolve-alpn@1.2.1:
resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
responselike@2.0.1:
resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
+ reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
roarr@2.15.4:
resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==}
engines: {node: '>=8.0'}
@@ -732,6 +863,9 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
semver-compare@1.0.0:
resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
@@ -763,6 +897,10 @@ packages:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
type-fest@0.13.1:
resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
engines: {node: '>=10'}
@@ -772,6 +910,9 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
+ ufo@1.5.4:
+ resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+
undici-types@6.19.8:
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
@@ -783,6 +924,23 @@ packages:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
+ unplugin-vue-components@0.27.4:
+ resolution: {integrity: sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/parser': ^7.15.8
+ '@nuxt/kit': ^3.2.2
+ vue: 2 || 3
+ peerDependenciesMeta:
+ '@babel/parser':
+ optional: true
+ '@nuxt/kit':
+ optional: true
+
+ unplugin@1.12.2:
+ resolution: {integrity: sha512-bEqQxeC7rxtxPZ3M5V4Djcc4lQqKPgGe3mAWZvxcSmX5jhGxll19NliaRzQSQPrk4xJZSGniK3puLWpRuZN7VQ==}
+ engines: {node: '>=14.0.0'}
+
vite@5.4.2:
resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -831,6 +989,13 @@ packages:
typescript:
optional: true
+ webpack-sources@3.2.3:
+ resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+ engines: {node: '>=10.13.0'}
+
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
@@ -839,6 +1004,8 @@ packages:
snapshots:
+ '@antfu/utils@0.7.10': {}
+
'@babel/helper-string-parser@7.24.8': {}
'@babel/helper-validator-identifier@7.24.7': {}
@@ -944,6 +1111,26 @@ snapshots:
'@jridgewell/sourcemap-codec@1.5.0': {}
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
+
+ '@rollup/pluginutils@5.1.0(rollup@4.21.0)':
+ dependencies:
+ '@types/estree': 1.0.5
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+ optionalDependencies:
+ rollup: 4.21.0
+
'@rollup/rollup-android-arm-eabi@4.21.0':
optional: true
@@ -1002,16 +1189,25 @@ snapshots:
dependencies:
'@types/http-cache-semantics': 4.0.4
'@types/keyv': 3.1.4
- '@types/node': 20.16.1
+ '@types/node': 22.5.0
'@types/responselike': 1.0.3
'@types/estree@1.0.5': {}
+ '@types/fs-extra@11.0.4':
+ dependencies:
+ '@types/jsonfile': 6.1.4
+ '@types/node': 22.5.0
+
'@types/http-cache-semantics@4.0.4': {}
+ '@types/jsonfile@6.1.4':
+ dependencies:
+ '@types/node': 22.5.0
+
'@types/keyv@3.1.4':
dependencies:
- '@types/node': 20.16.1
+ '@types/node': 22.5.0
'@types/node@20.16.1':
dependencies:
@@ -1020,11 +1216,10 @@ snapshots:
'@types/node@22.5.0':
dependencies:
undici-types: 6.19.8
- optional: true
'@types/responselike@1.0.3':
dependencies:
- '@types/node': 20.16.1
+ '@types/node': 22.5.0
'@types/yauzl@2.10.3':
dependencies:
@@ -1120,6 +1315,13 @@ snapshots:
'@vue/shared@3.4.38': {}
+ acorn@8.12.1: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
asynckit@0.4.0: {}
axios@1.7.4:
@@ -1132,6 +1334,8 @@ snapshots:
balanced-match@1.0.2: {}
+ binary-extensions@2.3.0: {}
+
boolean@3.2.0:
optional: true
@@ -1144,6 +1348,10 @@ snapshots:
dependencies:
balanced-match: 1.0.2
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
buffer-crc32@0.2.13: {}
cacheable-lookup@5.0.4: {}
@@ -1158,6 +1366,18 @@ snapshots:
normalize-url: 6.1.0
responselike: 2.0.1
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
clone-response@1.0.3:
dependencies:
mimic-response: 1.0.1
@@ -1172,6 +1392,8 @@ snapshots:
concat-map@0.0.1: {}
+ confbox@0.1.7: {}
+
csstype@3.1.3: {}
de-indent@1.0.2: {}
@@ -1273,10 +1495,26 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ fast-glob@3.3.2:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fastq@1.17.1:
+ dependencies:
+ reusify: 1.0.4
+
fd-slicer@1.1.0:
dependencies:
pend: 1.2.0
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
follow-redirects@1.15.6: {}
form-data@4.0.0:
@@ -1318,6 +1556,10 @@ snapshots:
dependencies:
pump: 3.0.0
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
glob@7.2.3:
dependencies:
fs.realpath: 1.0.0
@@ -1396,6 +1638,18 @@ snapshots:
inherits@2.0.4: {}
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-extglob@2.1.1: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-number@7.0.0: {}
+
json-buffer@3.0.1: {}
json-stringify-safe@5.0.1:
@@ -1415,6 +1669,11 @@ snapshots:
dependencies:
json-buffer: 3.0.1
+ local-pkg@0.5.0:
+ dependencies:
+ mlly: 1.7.1
+ pkg-types: 1.2.0
+
lowercase-keys@2.0.0: {}
magic-string@0.30.11:
@@ -1426,6 +1685,13 @@ snapshots:
escape-string-regexp: 4.0.0
optional: true
+ merge2@1.4.1: {}
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
mime-db@1.52.0: {}
mime-types@2.1.35:
@@ -1444,12 +1710,21 @@ snapshots:
dependencies:
brace-expansion: 2.0.1
+ mlly@1.7.1:
+ dependencies:
+ acorn: 8.12.1
+ pathe: 1.1.2
+ pkg-types: 1.2.0
+ ufo: 1.5.4
+
ms@2.1.2: {}
muggle-string@0.4.1: {}
nanoid@3.3.7: {}
+ normalize-path@3.0.0: {}
+
normalize-url@6.1.0: {}
object-keys@1.1.1:
@@ -1465,10 +1740,20 @@ snapshots:
path-is-absolute@1.0.1: {}
+ pathe@1.1.2: {}
+
pend@1.2.0: {}
picocolors@1.0.1: {}
+ picomatch@2.3.1: {}
+
+ pkg-types@1.2.0:
+ dependencies:
+ confbox: 0.1.7
+ mlly: 1.7.1
+ pathe: 1.1.2
+
postcss@8.4.41:
dependencies:
nanoid: 3.3.7
@@ -1484,14 +1769,22 @@ snapshots:
end-of-stream: 1.4.4
once: 1.4.0
+ queue-microtask@1.2.3: {}
+
quick-lru@5.1.1: {}
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
resolve-alpn@1.2.1: {}
responselike@2.0.1:
dependencies:
lowercase-keys: 2.0.0
+ reusify@1.0.4: {}
+
roarr@2.15.4:
dependencies:
boolean: 3.2.0
@@ -1524,6 +1817,10 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.21.0
fsevents: 2.3.3
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
semver-compare@1.0.0:
optional: true
@@ -1549,17 +1846,49 @@ snapshots:
to-fast-properties@2.0.0: {}
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
type-fest@0.13.1:
optional: true
typescript@5.5.4: {}
+ ufo@1.5.4: {}
+
undici-types@6.19.8: {}
universalify@0.1.2: {}
universalify@2.0.1: {}
+ unplugin-vue-components@0.27.4(@babel/parser@7.25.3)(rollup@4.21.0)(vue@3.4.38(typescript@5.5.4)):
+ dependencies:
+ '@antfu/utils': 0.7.10
+ '@rollup/pluginutils': 5.1.0(rollup@4.21.0)
+ chokidar: 3.6.0
+ debug: 4.3.6
+ fast-glob: 3.3.2
+ local-pkg: 0.5.0
+ magic-string: 0.30.11
+ minimatch: 9.0.5
+ mlly: 1.7.1
+ unplugin: 1.12.2
+ vue: 3.4.38(typescript@5.5.4)
+ optionalDependencies:
+ '@babel/parser': 7.25.3
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+
+ unplugin@1.12.2:
+ dependencies:
+ acorn: 8.12.1
+ chokidar: 3.6.0
+ webpack-sources: 3.2.3
+ webpack-virtual-modules: 0.6.2
+
vite@5.4.2(@types/node@22.5.0):
dependencies:
esbuild: 0.21.5
@@ -1588,6 +1917,10 @@ snapshots:
optionalDependencies:
typescript: 5.5.4
+ webpack-sources@3.2.3: {}
+
+ webpack-virtual-modules@0.6.2: {}
+
wrappy@1.0.2: {}
yauzl@2.10.0:
diff --git a/vite.config.ts b/vite.config.ts
index 23a56e0..562b4fb 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,5 +1,7 @@
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
+import Components from 'unplugin-vue-components/vite';
+import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers';
// https://vitejs.dev/config/
export default defineConfig({
@@ -11,6 +13,15 @@ export default defineConfig({
external: ['electron'],
},
},
- plugins: [vue()],
+ plugins: [
+ vue(),
+ Components({
+ resolvers: [
+ AntDesignVueResolver({
+ importStyle: false, // css in js
+ }),
+ ],
+ }),
+ ],
base: './',
});