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: './', });