From 44ee92375d23c5b68b8284ed9662586dd3cd8a6e Mon Sep 17 00:00:00 2001 From: terwer Date: Wed, 20 Mar 2024 09:58:54 +0800 Subject: [PATCH 01/67] chore: update deps --- packages/picgo-plugin-app/package.json | 10 +- pnpm-lock.yaml | 335 +++++++++++++++---------- 2 files changed, 203 insertions(+), 142 deletions(-) diff --git a/packages/picgo-plugin-app/package.json b/packages/picgo-plugin-app/package.json index becd38b..fd64c19 100644 --- a/packages/picgo-plugin-app/package.json +++ b/packages/picgo-plugin-app/package.json @@ -12,9 +12,9 @@ "@terwer/eslint-config-custom": "^1.3.6", "@vitejs/plugin-vue": "^5.0.4", "fast-glob": "^3.3.2", - "minimist": "^1.2.5", + "minimist": "^1.2.8", "rollup-plugin-livereload": "^2.0.5", - "typescript": "^5.2.2", + "typescript": "^5.4.2", "unplugin-auto-import": "^0.17.5", "unplugin-vue-components": "^0.26.0", "vite": "^5.1.6", @@ -27,11 +27,11 @@ "@vueuse/core": "^10.9.0", "element-plus": "^2.6.1", "lodash-es": "^4.17.21", + "universal-picgo": "workspace:*", "vue": "^3.4.21", - "vue-i18n": "^9.10.1", + "vue-i18n": "^9.10.2", "vue-router": "^4.3.0", "zhi-common": "^1.31.0", - "zhi-lib-base": "^0.8.0", - "universal-picgo": "workspace:*" + "zhi-lib-base": "^0.8.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f61224..2d6b8e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -101,8 +101,8 @@ importers: specifier: ^3.4.21 version: 3.4.21(typescript@5.4.2) vue-i18n: - specifier: ^9.10.1 - version: 9.10.1(vue@3.4.21) + specifier: ^9.10.2 + version: 9.10.2(vue@3.4.21) vue-router: specifier: ^4.3.0 version: 4.3.0(vue@3.4.21) @@ -123,13 +123,13 @@ importers: specifier: ^3.3.2 version: 3.3.2 minimist: - specifier: ^1.2.5 + specifier: ^1.2.8 version: 1.2.8 rollup-plugin-livereload: specifier: ^2.0.5 version: 2.0.5 typescript: - specifier: ^5.2.2 + specifier: ^5.4.2 version: 5.4.2 unplugin-auto-import: specifier: ^0.17.5 @@ -139,13 +139,13 @@ importers: version: 0.26.0(vue@3.4.21) vite: specifier: ^5.1.6 - version: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + version: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) vite-plugin-html: specifier: ^3.2.2 version: 3.2.2(vite@5.1.6) vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.5.1)(jsdom@24.0.0)(stylus@0.63.0) + version: 1.4.0(@types/node@20.11.30)(jsdom@24.0.0)(stylus@0.63.0) vue-tsc: specifier: ^2.0.6 version: 2.0.6(typescript@5.4.2) @@ -197,10 +197,10 @@ importers: version: 5.4.2 vite: specifier: ^5.1.6 - version: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + version: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) vite-plugin-dts: specifier: ^3.7.3 - version: 3.7.3(@types/node@20.5.1)(typescript@5.4.2)(vite@5.1.6) + version: 3.7.3(@types/node@20.11.30)(typescript@5.4.2)(vite@5.1.6) vite-plugin-node-polyfills: specifier: ^0.21.0 version: 0.21.0(vite@5.1.6) @@ -212,7 +212,7 @@ importers: version: 4.3.2(typescript@5.4.2)(vite@5.1.6) vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.5.1)(jsdom@24.0.0)(stylus@0.63.0) + version: 1.4.0(@types/node@20.11.30)(jsdom@24.0.0)(stylus@0.63.0) packages: @@ -241,12 +241,12 @@ packages: resolution: {integrity: sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw==} dev: true - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 dev: true /@babel/helper-string-parser@7.23.4: @@ -257,13 +257,14 @@ packages: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.0 dev: true /@babel/parser@7.24.0: @@ -273,6 +274,13 @@ packages: dependencies: '@babel/types': 7.24.0 + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + /@babel/types@7.24.0: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} @@ -342,7 +350,7 @@ packages: '@commitlint/load': 17.8.1 '@commitlint/types': 17.8.1 chalk: 4.1.2 - commitizen: 4.3.0(@types/node@20.5.1)(typescript@5.4.2) + commitizen: 4.3.0(@types/node@20.11.30)(typescript@5.4.2) inquirer: 8.2.6 lodash.isplainobject: 4.0.6 word-wrap: 1.2.5 @@ -417,15 +425,15 @@ packages: lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.4.2) + ts-node: 10.9.2(@types/node@20.11.30)(typescript@5.4.2) typescript: 5.4.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /@commitlint/load@19.1.0(@types/node@20.5.1)(typescript@5.4.2): - resolution: {integrity: sha512-rWqnvNDpeshX8JfUC/qjpDkQB78qF+4uHcJmIRJMwvlj6zWce08SP/TPKN3GlNKgXhAawwcAPxXL9qOTTdiOBA==} + /@commitlint/load@19.2.0(@types/node@20.11.30)(typescript@5.4.2): + resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} engines: {node: '>=v18'} requiresBuild: true dependencies: @@ -434,8 +442,8 @@ packages: '@commitlint/resolve-extends': 19.1.0 '@commitlint/types': 19.0.3 chalk: 5.3.0 - cosmiconfig: 8.3.6(typescript@5.4.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(typescript@5.4.2) + cosmiconfig: 9.0.0(typescript@5.4.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.30)(cosmiconfig@9.0.0)(typescript@5.4.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -1074,24 +1082,24 @@ packages: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} dev: true - /@intlify/core-base@9.10.1: - resolution: {integrity: sha512-0+Wtjj04GIyglh5KKiNjRwgjpHrhqqGZhaKY/QVjjogWKZq5WHROrTi84pNVsRN18QynyPmjtsVUWqFKPQ45xQ==} + /@intlify/core-base@9.10.2: + resolution: {integrity: sha512-HGStVnKobsJL0DoYIyRCGXBH63DMQqEZxDUGrkNI05FuTcruYUtOAxyL3zoAZu/uDGO6mcUvm3VXBaHG2GdZCg==} engines: {node: '>= 16'} dependencies: - '@intlify/message-compiler': 9.10.1 - '@intlify/shared': 9.10.1 + '@intlify/message-compiler': 9.10.2 + '@intlify/shared': 9.10.2 dev: false - /@intlify/message-compiler@9.10.1: - resolution: {integrity: sha512-b68UTmRhgZfswJZI7VAgW6BXZK5JOpoi5swMLGr4j6ss2XbFY13kiw+Hu+xYAfulMPSapcHzdWHnq21VGnMCnA==} + /@intlify/message-compiler@9.10.2: + resolution: {integrity: sha512-ntY/kfBwQRtX5Zh6wL8cSATujPzWW2ZQd1QwKyWwAy5fMqJyyixHMeovN4fmEyCqSu+hFfYOE63nU94evsy4YA==} engines: {node: '>= 16'} dependencies: - '@intlify/shared': 9.10.1 - source-map-js: 1.0.2 + '@intlify/shared': 9.10.2 + source-map-js: 1.2.0 dev: false - /@intlify/shared@9.10.1: - resolution: {integrity: sha512-liyH3UMoglHBUn70iCYcy9CQlInx/lp50W2aeSxqqrvmG+LDj/Jj7tBJhBoQL4fECkldGhbmW0g2ommHfL6Wmw==} + /@intlify/shared@9.10.2: + resolution: {integrity: sha512-ttHCAJkRy7R5W2S9RVnN9KYQYPIpV2+GiS79T4EE37nrPyH6/1SrOh3bmdCRC1T3ocL8qCDx7x2lBJ0xaITU7Q==} engines: {node: '>= 16'} dev: false @@ -1145,34 +1153,34 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@microsoft/api-extractor-model@7.28.13(@types/node@20.5.1): + /@microsoft/api-extractor-model@7.28.13(@types/node@20.11.30): resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.5.1) + '@rushstack/node-core-library': 4.0.2(@types/node@20.11.30) transitivePeerDependencies: - '@types/node' dev: true - /@microsoft/api-extractor-model@7.28.3(@types/node@20.5.1): + /@microsoft/api-extractor-model@7.28.3(@types/node@20.11.30): resolution: {integrity: sha512-wT/kB2oDbdZXITyDh2SQLzaWwTOFbV326fP0pUwNW00WeliARs0qjmXBWmGWardEzp2U3/axkO3Lboqun6vrig==} dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.62.0(@types/node@20.5.1) + '@rushstack/node-core-library': 3.62.0(@types/node@20.11.30) transitivePeerDependencies: - '@types/node' dev: true - /@microsoft/api-extractor@7.39.0(@types/node@20.5.1): + /@microsoft/api-extractor@7.39.0(@types/node@20.11.30): resolution: {integrity: sha512-PuXxzadgnvp+wdeZFPonssRAj/EW4Gm4s75TXzPk09h3wJ8RS3x7typf95B4vwZRrPTQBGopdUl+/vHvlPdAcg==} hasBin: true dependencies: - '@microsoft/api-extractor-model': 7.28.3(@types/node@20.5.1) + '@microsoft/api-extractor-model': 7.28.3(@types/node@20.11.30) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.62.0(@types/node@20.5.1) + '@rushstack/node-core-library': 3.62.0(@types/node@20.11.30) '@rushstack/rig-package': 0.5.1 '@rushstack/ts-command-line': 4.17.1 colors: 1.2.5 @@ -1185,23 +1193,23 @@ packages: - '@types/node' dev: true - /@microsoft/api-extractor@7.42.3(@types/node@20.5.1): - resolution: {integrity: sha512-JNLJFpGHz6ekjS6bvYXxUBeRGnSHeCMFNvRbCQ+7XXB/ZFrgLSMPwWtEq40AiWAy+oyG5a4RSNwdJTp0B2USvQ==} + /@microsoft/api-extractor@7.43.0(@types/node@20.11.30): + resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} hasBin: true dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@20.5.1) + '@microsoft/api-extractor-model': 7.28.13(@types/node@20.11.30) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.5.1) + '@rushstack/node-core-library': 4.0.2(@types/node@20.11.30) '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@20.5.1) - '@rushstack/ts-command-line': 4.19.1(@types/node@20.5.1) + '@rushstack/terminal': 0.10.0(@types/node@20.11.30) + '@rushstack/ts-command-line': 4.19.1(@types/node@20.11.30) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 semver: 7.5.4 source-map: 0.6.1 - typescript: 5.3.3 + typescript: 5.4.2 transitivePeerDependencies: - '@types/node' dev: true @@ -1411,7 +1419,7 @@ packages: resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} dev: true - /@rushstack/node-core-library@3.62.0(@types/node@20.5.1): + /@rushstack/node-core-library@3.62.0(@types/node@20.11.30): resolution: {integrity: sha512-88aJn2h8UpSvdwuDXBv1/v1heM6GnBf3RjEy6ZPP7UnzHNCqOHA2Ut+ScYUbXcqIdfew9JlTAe3g+cnX9xQ/Aw==} peerDependencies: '@types/node': '*' @@ -1419,7 +1427,7 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 20.5.1 + '@types/node': 20.11.30 colors: 1.2.5 fs-extra: 7.0.1 import-lazy: 4.0.0 @@ -1429,7 +1437,7 @@ packages: z-schema: 5.0.5 dev: true - /@rushstack/node-core-library@3.66.1(@types/node@20.5.1): + /@rushstack/node-core-library@3.66.1(@types/node@20.11.30): resolution: {integrity: sha512-ker69cVKAoar7MMtDFZC4CzcDxjwqIhFzqEnYI5NRN/8M3om6saWCVx/A7vL2t/jFCJsnzQplRDqA7c78pytng==} peerDependencies: '@types/node': '*' @@ -1437,7 +1445,7 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 20.5.1 + '@types/node': 20.11.30 colors: 1.2.5 fs-extra: 7.0.1 import-lazy: 4.0.0 @@ -1447,7 +1455,7 @@ packages: z-schema: 5.0.5 dev: true - /@rushstack/node-core-library@4.0.2(@types/node@20.5.1): + /@rushstack/node-core-library@4.0.2(@types/node@20.11.30): resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} peerDependencies: '@types/node': '*' @@ -1455,7 +1463,7 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 20.5.1 + '@types/node': 20.11.30 fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 @@ -1478,7 +1486,7 @@ packages: strip-json-comments: 3.1.1 dev: true - /@rushstack/terminal@0.10.0(@types/node@20.5.1): + /@rushstack/terminal@0.10.0(@types/node@20.11.30): resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} peerDependencies: '@types/node': '*' @@ -1486,8 +1494,8 @@ packages: '@types/node': optional: true dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@20.5.1) - '@types/node': 20.5.1 + '@rushstack/node-core-library': 4.0.2(@types/node@20.11.30) + '@types/node': 20.11.30 supports-color: 8.1.1 dev: true @@ -1500,10 +1508,10 @@ packages: string-argv: 0.3.2 dev: true - /@rushstack/ts-command-line@4.19.1(@types/node@20.5.1): + /@rushstack/ts-command-line@4.19.1(@types/node@20.11.30): resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} dependencies: - '@rushstack/terminal': 0.10.0(@types/node@20.5.1) + '@rushstack/terminal': 0.10.0(@types/node@20.11.30) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -1526,7 +1534,7 @@ packages: '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.1.6) debug: 4.3.4 svelte: 4.2.12 - vite: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) transitivePeerDependencies: - supports-color dev: true @@ -1545,7 +1553,7 @@ packages: magic-string: 0.30.8 svelte: 4.2.12 svelte-hmr: 0.15.3(svelte@4.2.12) - vite: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) vitefu: 0.2.5(vite@5.1.6) transitivePeerDependencies: - supports-color @@ -1571,7 +1579,7 @@ packages: '@commitlint/config-angular': 17.8.1 '@commitlint/cz-commitlint': 17.8.1(commitizen@4.3.0)(inquirer@8.2.6) '@commitlint/prompt-cli': 17.8.1 - commitizen: 4.3.0(@types/node@20.5.1)(typescript@5.4.2) + commitizen: 4.3.0(@types/node@20.11.30)(typescript@5.4.2) husky: 8.0.3 inquirer: 8.2.6 is-ci: 3.0.1 @@ -1627,8 +1635,8 @@ packages: minimist: 1.2.8 rollup-plugin-livereload: 2.0.5 typescript: 5.4.2 - vite: 4.5.2(@types/node@20.5.1) - vite-plugin-dts: 2.3.0(@types/node@20.5.1)(vite@4.5.2) + vite: 4.5.2(@types/node@20.11.30) + vite-plugin-dts: 2.3.0(@types/node@20.11.30)(vite@4.5.2) vite-plugin-node-polyfills: 0.21.0(vite@4.5.2) vite-plugin-static-copy: 0.15.0(vite@4.5.2) vite-tsconfig-paths: 4.3.2(typescript@5.4.2)(vite@4.5.2) @@ -1655,8 +1663,8 @@ packages: minimist: 1.2.8 rollup-plugin-livereload: 2.0.5 typescript: 5.4.2 - vite: 4.5.2(@types/node@20.5.1) - vite-plugin-dts: 2.3.0(@types/node@20.5.1)(vite@4.5.2) + vite: 4.5.2(@types/node@20.11.30) + vite-plugin-dts: 2.3.0(@types/node@20.11.30)(vite@4.5.2) vite-plugin-node-polyfills: 0.8.2(vite@4.5.2) vite-plugin-static-copy: 0.15.0(vite@4.5.2) vite-tsconfig-paths: 4.3.2(typescript@5.4.2)(vite@4.5.2) @@ -1704,18 +1712,18 @@ packages: /@types/chai-subset@1.3.5: resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} dependencies: - '@types/chai': 4.3.12 + '@types/chai': 4.3.13 dev: true - /@types/chai@4.3.12: - resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==} + /@types/chai@4.3.13: + resolution: {integrity: sha512-+LxQEbg4BDUf88utmhpUpTyYn1zHao443aGnXIAQak9ZMt9Rtsic0Oig0OS1xyIqdDXc5uMekoC6NaiUlkT/qA==} dev: true /@types/conventional-commits-parser@5.0.0: resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} requiresBuild: true dependencies: - '@types/node': 20.5.1 + '@types/node': 20.11.30 dev: true optional: true @@ -1743,6 +1751,12 @@ packages: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true + /@types/node@20.11.30: + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + dependencies: + undici-types: 5.26.5 + dev: true + /@types/node@20.5.1: resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} dev: true @@ -2012,7 +2026,7 @@ packages: vite: ^5.0.0 vue: ^3.2.25 dependencies: - vite: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) vue: 3.4.21(typescript@5.4.2) dev: true @@ -2150,15 +2164,15 @@ packages: /@vue/compiler-sfc@3.4.21: resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.1 '@vue/compiler-core': 3.4.21 '@vue/compiler-dom': 3.4.21 '@vue/compiler-ssr': 3.4.21 '@vue/shared': 3.4.21 estree-walker: 2.0.2 magic-string: 0.30.8 - postcss: 8.4.35 - source-map-js: 1.0.2 + postcss: 8.4.37 + source-map-js: 1.2.0 /@vue/compiler-ssr@3.4.21: resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} @@ -2915,13 +2929,13 @@ packages: repeat-string: 1.6.1 dev: false - /commitizen@4.3.0(@types/node@20.5.1)(typescript@5.4.2): + /commitizen@4.3.0(@types/node@20.11.30)(typescript@5.4.2): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@types/node@20.5.1)(typescript@5.4.2) + cz-conventional-changelog: 3.3.0(@types/node@20.11.30)(typescript@5.4.2) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -3021,11 +3035,11 @@ packages: dependencies: '@types/node': 20.5.1 cosmiconfig: 8.3.6(typescript@5.4.2) - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.4.2) + ts-node: 10.9.2(@types/node@20.11.30)(typescript@5.4.2) typescript: 5.4.2 dev: true - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(typescript@5.4.2): + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.30)(cosmiconfig@9.0.0)(typescript@5.4.2): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} requiresBuild: true @@ -3034,8 +3048,8 @@ packages: cosmiconfig: '>=8.2' typescript: '>=4' dependencies: - '@types/node': 20.5.1 - cosmiconfig: 8.3.6(typescript@5.4.2) + '@types/node': 20.11.30 + cosmiconfig: 9.0.0(typescript@5.4.2) jiti: 1.21.0 typescript: 5.4.2 dev: true @@ -3057,6 +3071,24 @@ packages: typescript: 5.4.2 dev: true + /cosmiconfig@9.0.0(typescript@5.4.2): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + requiresBuild: true + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.4.2 + dev: true + optional: true + /create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} dependencies: @@ -3160,18 +3192,18 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - /cz-conventional-changelog@3.3.0(@types/node@20.5.1)(typescript@5.4.2): + /cz-conventional-changelog@3.3.0(@types/node@20.11.30)(typescript@5.4.2): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0(@types/node@20.5.1)(typescript@5.4.2) + commitizen: 4.3.0(@types/node@20.11.30)(typescript@5.4.2) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 19.1.0(@types/node@20.5.1)(typescript@5.4.2) + '@commitlint/load': 19.2.0(@types/node@20.11.30)(typescript@5.4.2) transitivePeerDependencies: - '@types/node' - typescript @@ -3409,6 +3441,11 @@ packages: engines: {node: '>=12'} dev: true + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dev: true + /ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} engines: {node: '>=0.10.0'} @@ -3465,6 +3502,13 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + requiresBuild: true + dev: true + optional: true + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -3628,9 +3672,9 @@ packages: eslint-compat-utils: 0.1.2(eslint@8.57.0) esutils: 2.0.3 known-css-properties: 0.29.0 - postcss: 8.4.35 - postcss-load-config: 3.1.4(postcss@8.4.35)(ts-node@10.9.2) - postcss-safe-parser: 6.0.0(postcss@8.4.35) + postcss: 8.4.37 + postcss-load-config: 3.1.4(postcss@8.4.37)(ts-node@10.9.2) + postcss-safe-parser: 6.0.0(postcss@8.4.37) postcss-selector-parser: 6.0.16 semver: 7.6.0 svelte: 4.2.12 @@ -4308,7 +4352,7 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.29.1 + terser: 5.29.2 dev: true /http-proxy-agent@5.0.0: @@ -5525,7 +5569,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -5641,7 +5685,7 @@ packages: engines: {node: '>= 0.4'} dev: true - /postcss-load-config@3.1.4(postcss@8.4.35)(ts-node@10.9.2): + /postcss-load-config@3.1.4(postcss@8.4.37)(ts-node@10.9.2): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -5654,27 +5698,27 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.35 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.4.2) + postcss: 8.4.37 + ts-node: 10.9.2(@types/node@20.11.30)(typescript@5.4.2) yaml: 1.10.2 dev: true - /postcss-safe-parser@6.0.0(postcss@8.4.35): + /postcss-safe-parser@6.0.0(postcss@8.4.37): resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.3.3 dependencies: - postcss: 8.4.35 + postcss: 8.4.37 dev: true - /postcss-scss@4.0.9(postcss@8.4.35): + /postcss-scss@4.0.9(postcss@8.4.37): resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.4.29 dependencies: - postcss: 8.4.35 + postcss: 8.4.37 dev: true /postcss-selector-parser@6.0.16: @@ -5692,6 +5736,15 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: true + + /postcss@8.4.37: + resolution: {integrity: sha512-7iB/v/r7Woof0glKLH8b1SPHrsX7uhdO+Geb41QpF/+mWZHU3uxxSlN+UXGVit1PawOYDToO+AbZzhBzWRDwbQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -6173,6 +6226,10 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: @@ -6388,8 +6445,8 @@ packages: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.35 - postcss-scss: 4.0.9(postcss@8.4.35) + postcss: 8.4.37 + postcss-scss: 4.0.9(postcss@8.4.37) svelte: 4.2.12 dev: true @@ -6434,8 +6491,8 @@ packages: tslib: 2.6.2 dev: true - /terser@5.29.1: - resolution: {integrity: sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==} + /terser@5.29.2: + resolution: {integrity: sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==} engines: {node: '>=10'} hasBin: true dependencies: @@ -6562,7 +6619,7 @@ packages: code-block-writer: 12.0.0 dev: true - /ts-node@10.9.2(@types/node@20.5.1)(typescript@5.4.2): + /ts-node@10.9.2(@types/node@20.11.30)(typescript@5.4.2): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -6581,7 +6638,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.5.1 + '@types/node': 20.11.30 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 @@ -6755,6 +6812,10 @@ packages: resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + /unimport@3.7.1: resolution: {integrity: sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==} dependencies: @@ -6904,7 +6965,7 @@ packages: engines: {node: '>= 0.10'} dev: true - /vite-node@0.31.4(@types/node@20.5.1): + /vite-node@0.31.4(@types/node@20.11.30): resolution: {integrity: sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ==} engines: {node: '>=v14.18.0'} hasBin: true @@ -6914,7 +6975,7 @@ packages: mlly: 1.6.1 pathe: 1.1.2 picocolors: 1.0.0 - vite: 4.5.2(@types/node@20.5.1) + vite: 4.5.2(@types/node@20.11.30) transitivePeerDependencies: - '@types/node' - less @@ -6926,7 +6987,7 @@ packages: - terser dev: true - /vite-node@1.4.0(@types/node@20.5.1)(stylus@0.63.0): + /vite-node@1.4.0(@types/node@20.11.30)(stylus@0.63.0): resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -6935,7 +6996,7 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) transitivePeerDependencies: - '@types/node' - less @@ -6947,30 +7008,30 @@ packages: - terser dev: true - /vite-plugin-dts@2.3.0(@types/node@20.5.1)(vite@4.5.2): + /vite-plugin-dts@2.3.0(@types/node@20.11.30)(vite@4.5.2): resolution: {integrity: sha512-WbJgGtsStgQhdm3EosYmIdTGbag5YQpZ3HXWUAPCDyoXI5qN6EY0V7NXq0lAmnv9hVQsvh0htbYcg0Or5Db9JQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: '>=2.9.0' dependencies: - '@babel/parser': 7.24.0 - '@microsoft/api-extractor': 7.42.3(@types/node@20.5.1) + '@babel/parser': 7.24.1 + '@microsoft/api-extractor': 7.43.0(@types/node@20.11.30) '@rollup/pluginutils': 5.1.0 - '@rushstack/node-core-library': 3.66.1(@types/node@20.5.1) + '@rushstack/node-core-library': 3.66.1(@types/node@20.11.30) debug: 4.3.4 fast-glob: 3.3.2 fs-extra: 10.1.0 kolorist: 1.8.0 magic-string: 0.29.0 ts-morph: 18.0.0 - vite: 4.5.2(@types/node@20.5.1) + vite: 4.5.2(@types/node@20.11.30) transitivePeerDependencies: - '@types/node' - rollup - supports-color dev: true - /vite-plugin-dts@3.7.3(@types/node@20.5.1)(typescript@5.4.2)(vite@5.1.6): + /vite-plugin-dts@3.7.3(@types/node@20.11.30)(typescript@5.4.2)(vite@5.1.6): resolution: {integrity: sha512-26eTlBYdpjRLWCsTJebM8vkCieE+p9gP3raf+ecDnzzK5E3FG6VE1wcy55OkRpfWWVlVvKkYFe6uvRHYWx7Nog==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -6980,13 +7041,13 @@ packages: vite: optional: true dependencies: - '@microsoft/api-extractor': 7.39.0(@types/node@20.5.1) + '@microsoft/api-extractor': 7.39.0(@types/node@20.11.30) '@rollup/pluginutils': 5.1.0 '@vue/language-core': 1.8.27(typescript@5.4.2) debug: 4.3.4 kolorist: 1.8.0 typescript: 5.4.2 - vite: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) vue-tsc: 1.8.27(typescript@5.4.2) transitivePeerDependencies: - '@types/node' @@ -7003,7 +7064,7 @@ packages: colorette: 2.0.20 connect-history-api-fallback: 1.6.0 consola: 2.15.3 - dotenv: 16.0.3 + dotenv: 16.4.5 dotenv-expand: 8.0.3 ejs: 3.1.9 fast-glob: 3.3.2 @@ -7011,7 +7072,7 @@ packages: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) dev: true /vite-plugin-node-polyfills@0.21.0(vite@4.5.2): @@ -7021,7 +7082,7 @@ packages: dependencies: '@rollup/plugin-inject': 5.0.5 node-stdlib-browser: 1.2.0 - vite: 4.5.2(@types/node@20.5.1) + vite: 4.5.2(@types/node@20.11.30) transitivePeerDependencies: - rollup dev: true @@ -7033,7 +7094,7 @@ packages: dependencies: '@rollup/plugin-inject': 5.0.5 node-stdlib-browser: 1.2.0 - vite: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) transitivePeerDependencies: - rollup dev: true @@ -7045,7 +7106,7 @@ packages: dependencies: '@rollup/plugin-inject': 5.0.5 node-stdlib-browser: 1.2.0 - vite: 4.5.2(@types/node@20.5.1) + vite: 4.5.2(@types/node@20.11.30) transitivePeerDependencies: - rollup dev: true @@ -7060,7 +7121,7 @@ packages: fast-glob: 3.3.2 fs-extra: 11.2.0 picocolors: 1.0.0 - vite: 4.5.2(@types/node@20.5.1) + vite: 4.5.2(@types/node@20.11.30) dev: true /vite-plugin-static-copy@1.0.1(vite@5.1.6): @@ -7073,7 +7134,7 @@ packages: fast-glob: 3.3.2 fs-extra: 11.2.0 picocolors: 1.0.0 - vite: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) dev: true /vite-tsconfig-paths@4.3.2(typescript@5.4.2)(vite@4.5.2): @@ -7087,7 +7148,7 @@ packages: debug: 4.3.4 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.2) - vite: 4.5.2(@types/node@20.5.1) + vite: 4.5.2(@types/node@20.11.30) transitivePeerDependencies: - supports-color - typescript @@ -7104,13 +7165,13 @@ packages: debug: 4.3.4 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.2) - vite: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@4.5.2(@types/node@20.5.1): + /vite@4.5.2(@types/node@20.11.30): resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -7138,15 +7199,15 @@ packages: terser: optional: true dependencies: - '@types/node': 20.5.1 + '@types/node': 20.11.30 esbuild: 0.18.20 - postcss: 8.4.35 + postcss: 8.4.37 rollup: 3.29.4 optionalDependencies: fsevents: 2.3.3 dev: true - /vite@5.1.6(@types/node@20.5.1)(stylus@0.63.0): + /vite@5.1.6(@types/node@20.11.30)(stylus@0.63.0): resolution: {integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7174,7 +7235,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.5.1 + '@types/node': 20.11.30 esbuild: 0.19.12 postcss: 8.4.35 rollup: 4.13.0 @@ -7191,7 +7252,7 @@ packages: vite: optional: true dependencies: - vite: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) + vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) dev: true /vitest@0.31.4(jsdom@22.1.0): @@ -7225,9 +7286,9 @@ packages: webdriverio: optional: true dependencies: - '@types/chai': 4.3.12 + '@types/chai': 4.3.13 '@types/chai-subset': 1.3.5 - '@types/node': 20.5.1 + '@types/node': 20.11.30 '@vitest/expect': 0.31.4 '@vitest/runner': 0.31.4 '@vitest/snapshot': 0.31.4 @@ -7248,8 +7309,8 @@ packages: strip-literal: 1.3.0 tinybench: 2.6.0 tinypool: 0.5.0 - vite: 4.5.2(@types/node@20.5.1) - vite-node: 0.31.4(@types/node@20.5.1) + vite: 4.5.2(@types/node@20.11.30) + vite-node: 0.31.4(@types/node@20.11.30) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -7261,7 +7322,7 @@ packages: - terser dev: true - /vitest@1.4.0(@types/node@20.5.1)(jsdom@24.0.0)(stylus@0.63.0): + /vitest@1.4.0(@types/node@20.11.30)(jsdom@24.0.0)(stylus@0.63.0): resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7286,7 +7347,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.5.1 + '@types/node': 20.11.30 '@vitest/expect': 1.4.0 '@vitest/runner': 1.4.0 '@vitest/snapshot': 1.4.0 @@ -7305,8 +7366,8 @@ packages: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.1.6(@types/node@20.5.1)(stylus@0.63.0) - vite-node: 1.4.0(@types/node@20.5.1)(stylus@0.63.0) + vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) + vite-node: 1.4.0(@types/node@20.11.30)(stylus@0.63.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -7354,14 +7415,14 @@ packages: - supports-color dev: true - /vue-i18n@9.10.1(vue@3.4.21): - resolution: {integrity: sha512-37HVJQZ/pZaRXGzFmmMomM1u1k7kndv3xCBPYHKEVfv5W3UVK67U/TpBug71ILYLNmjHLHdvTUPRF81pFT5fFg==} + /vue-i18n@9.10.2(vue@3.4.21): + resolution: {integrity: sha512-ECJ8RIFd+3c1d3m1pctQ6ywG5Yj8Efy1oYoAKQ9neRdkLbuKLVeW4gaY5HPkD/9ssf1pOnUrmIFjx2/gkGxmEw==} engines: {node: '>= 16'} peerDependencies: vue: ^3.0.0 dependencies: - '@intlify/core-base': 9.10.1 - '@intlify/shared': 9.10.1 + '@intlify/core-base': 9.10.2 + '@intlify/shared': 9.10.2 '@vue/devtools-api': 6.6.1 vue: 3.4.21(typescript@5.4.2) dev: false From 54a136ca28105393700277ad07ecfc364b7c3693 Mon Sep 17 00:00:00 2001 From: terwer Date: Wed, 20 Mar 2024 10:22:15 +0800 Subject: [PATCH 02/67] chore: support remote picture url --- libs/Universal-PicGo-Core/src/utils/common.ts | 4 +-- .../src/components/home/ElectronIndex.vue | 35 +++++++++++++++++-- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/libs/Universal-PicGo-Core/src/utils/common.ts b/libs/Universal-PicGo-Core/src/utils/common.ts index 2722b48..1dc6c2a 100644 --- a/libs/Universal-PicGo-Core/src/utils/common.ts +++ b/libs/Universal-PicGo-Core/src/utils/common.ts @@ -70,7 +70,7 @@ export const getURLFile = async (url: string, ctx: IPicGo): Promise { ElMessage.error(e.toString()) } } + +const handleTest2 = async () => { + try { + const picgo = new UniversalPicGo("", isDev) + logger.debug("picgo =>", picgo) + + const result = await picgo.upload(["https://s2.loli.net/2024/03/20/VDRXZnkBaKWFhpt.png"]) + logger.info("upload success =>", result) + ElMessage.success("upload success") + } catch (e: any) { + logger.error(e) + ElMessage.error(e.toString()) + } +} - + From 3539519e04661023dd335bd4282bb0819ca55215 Mon Sep 17 00:00:00 2001 From: terwer Date: Wed, 20 Mar 2024 11:07:27 +0800 Subject: [PATCH 03/67] chore: support base64 --- .../src/core/Lifecycle.ts | 3 +- .../src/plugins/transformer/path.ts | 9 +++- .../src/plugins/uploader/smms.ts | 6 ++- libs/Universal-PicGo-Core/src/utils/common.ts | 52 +++++++++++++++++++ .../src/utils/hashUtil.ts | 26 ++++++++++ .../src/components/home/ElectronIndex.vue | 32 +++++++++++- 6 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 libs/Universal-PicGo-Core/src/utils/hashUtil.ts diff --git a/libs/Universal-PicGo-Core/src/core/Lifecycle.ts b/libs/Universal-PicGo-Core/src/core/Lifecycle.ts index 47cccdf..615e7e6 100644 --- a/libs/Universal-PicGo-Core/src/core/Lifecycle.ts +++ b/libs/Universal-PicGo-Core/src/core/Lifecycle.ts @@ -12,7 +12,7 @@ import { ILifecyclePlugins, IPicGo, IPlugin, Undefinable } from "../types" import { ILogger } from "zhi-lib-base" import { createContext } from "../utils/createContext" import { IBuildInEvent } from "../utils/enums" -import { handleUrlEncode } from "../utils/common" +import { autoDetectImageType, handleUrlEncode } from "../utils/common" export class Lifecycle extends EventEmitter { private readonly ctx: IPicGo @@ -129,6 +129,7 @@ export class Lifecycle extends EventEmitter { ctx.emit(IBuildInEvent.FINISHED, ctx) if (msg === "") { ctx.log.warn("[after-upload] image upload occured an error, please read log for details") + throw new Error("image upload occured an error, please read log for details") } else { ctx.log.info(`[after-upload] upload finishied => \n${msg}`) } diff --git a/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts b/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts index 6fbe2d0..0c3e474 100644 --- a/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts +++ b/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts @@ -10,7 +10,7 @@ import dayjs from "dayjs" import { IImgInfo, IImgSize, IPathTransformedImgInfo, IPicGo } from "../../types" import { win } from "universal-picgo-store" -import { getFSFile, getImageSize, getURLFile, isUrl } from "../../utils/common" +import { getBase64File, getFSFile, getImageSize, getURLFile, isBase64, isUrl } from "../../utils/common" const handle = async (ctx: IPicGo): Promise => { const results: IImgInfo[] = ctx.output @@ -18,6 +18,7 @@ const handle = async (ctx: IPicGo): Promise => { ctx.input.map(async (item: string | typeof win.Buffer, index: number) => { let info: IPathTransformedImgInfo if (win.Buffer.isBuffer(item)) { + ctx.log.debug("using buffer in path transform") info = { success: true, buffer: item, @@ -25,8 +26,13 @@ const handle = async (ctx: IPicGo): Promise => { extname: "", // will use getImageSize result } } else if (isUrl(item)) { + ctx.log.debug("using image url in path transform") info = await getURLFile(item, ctx) + } else if (isBase64(item)) { + ctx.log.debug("using image base64 in path transform") + info = await getBase64File(item) } else { + ctx.log.debug("using fs in path transform") info = await getFSFile(item) } if (info.success && info.buffer) { @@ -41,6 +47,7 @@ const handle = async (ctx: IPicGo): Promise => { } } else { ctx.log.error(info.reason) + throw new Error(info.reason) } }) ) diff --git a/libs/Universal-PicGo-Core/src/plugins/uploader/smms.ts b/libs/Universal-PicGo-Core/src/plugins/uploader/smms.ts index 96651f2..40985a0 100644 --- a/libs/Universal-PicGo-Core/src/plugins/uploader/smms.ts +++ b/libs/Universal-PicGo-Core/src/plugins/uploader/smms.ts @@ -40,11 +40,15 @@ const handle = async (ctx: IPicGo): Promise => { } const imgList = ctx.output for (const img of imgList) { - if (img.fileName && img.buffer) { + if (img.fileName) { let image = img.buffer if (!image && img.base64Image) { image = Buffer.from(img.base64Image, "base64") } + if(!image){ + ctx.log.error("Can not find image buffer") + throw new Error("Can not find image buffer") + } const postConfig = postOptions(img.fileName, image, smmsConfig?.token, smmsConfig?.backupDomain) try { const res: string = await ctx.request(postConfig) diff --git a/libs/Universal-PicGo-Core/src/utils/common.ts b/libs/Universal-PicGo-Core/src/utils/common.ts index 1dc6c2a..8f3b4a4 100644 --- a/libs/Universal-PicGo-Core/src/utils/common.ts +++ b/libs/Universal-PicGo-Core/src/utils/common.ts @@ -10,6 +10,7 @@ import { IImgSize, IPathTransformedImgInfo, IPicGo, IPluginNameType } from "../types" import { hasNodeEnv, win } from "universal-picgo-store" import imageSize from "./image-size" +import { calculateHash } from "./hashUtil" export const isUrl = (url: string): boolean => url.startsWith("http://") || url.startsWith("https://") @@ -30,6 +31,57 @@ export const handleUrlEncode = (url: string): string => { return url } +/** + * 检测输入是否为 base64 编码的字符串 + * + * @param input - 输入字符串或 Buffer + * @returns- 如果是 base64 编码则返回 true,否则返回 false + */ +export const isBase64 = (input: any) => { + if (typeof input === "string") { + // 检查字符串是否为 base64 编码 + return /^data:image\/[a-zA-Z]*;base64,/.test(input) + } + + // 如果输入不是字符串,则直接返回 false + return false +} + +function extractImageInfoFromBase64(base64ImageData: string): any { + const mimeAndBase64Regex = new RegExp("data:([^;]+);base64,(.+)") + const match = base64ImageData.match(mimeAndBase64Regex) + + if (match) { + const mimeType = match[1] + const base64Data = match[2] + + // 提取 mime 类型的基础文件扩展名 + const ext = mimeType.split("/")[1] + + // 使用 HashUtil.calculateHash 函数生成默认图片名称 + const imageName = `${calculateHash(base64Data)}.${ext}` + + return { + mimeType, + imageBase64: base64Data, + imageName, + } + } else { + throw new Error("Mime type and base64 data extraction failed") + } +} + +export const getBase64File = async (base64: string): Promise => { + const imgInfo = extractImageInfoFromBase64(base64) + const imageBuffer = win.Buffer.from(imgInfo.imageBase64, "base64") + return { + success: true, + buffer: imageBuffer, + fileName: "", // will use getImageSize result + extname: "", // will use getImageSize result + } +} + export const getFSFile = async (filePath: string): Promise => { try { const fs = win.fs diff --git a/libs/Universal-PicGo-Core/src/utils/hashUtil.ts b/libs/Universal-PicGo-Core/src/utils/hashUtil.ts new file mode 100644 index 0000000..dc98b02 --- /dev/null +++ b/libs/Universal-PicGo-Core/src/utils/hashUtil.ts @@ -0,0 +1,26 @@ +/* + * GNU GENERAL PUBLIC LICENSE + * Version 3, 29 June 2007 + * + * Copyright (C) 2024 Terwer, Inc. + * Everyone is permitted to copy and distribute verbatim copies + * of this license document, but changing it is not allowed. + */ + +const calculateHash = (input: string) => { + let hash = 0 + + if (input.length === 0) { + return hash + } + + for (let i = 0; i < input.length; i++) { + const char = input.charCodeAt(i) + hash = (hash << 5) - hash + char + hash = hash & hash // Convert to 32bit integer + } + + return Math.abs(hash).toString(16) +} + +export { calculateHash } diff --git a/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue b/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue index abe18bc..eeb9dd8 100644 --- a/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue +++ b/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue @@ -12,6 +12,7 @@ import { createAppLogger } from "@/utils/appLogger.ts" import { isDev } from "@/utils/Constants.ts" import { ElMessage } from "element-plus" import { UniversalPicGo } from "universal-picgo" +import { Buffer } from "universal-picgo/src/utils/nodePolyfill.ts" const logger = createAppLogger("picgo-electron-index") @@ -42,6 +43,35 @@ const handleTest2 = async () => { ElMessage.error(e.toString()) } } + +const handleTest3 = async () => { + try { + const picgo = new UniversalPicGo("", isDev) + logger.debug("picgo =>", picgo) + + const result = await picgo.upload(["/Users/terwer/Documents/pictures/photo.jpg"]) + logger.info("upload success =>", result) + ElMessage.success("upload success") + } catch (e: any) { + logger.error(e) + ElMessage.error(e.toString()) + } +} + +const handleTest5 = async () => { + try { + const picgo = new UniversalPicGo("", isDev) + logger.debug("picgo =>", picgo) + + const imgBase64 = `data:image/jpeg;base64,/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APf6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooNFABRRmigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKDQAUGmF1BwTz6UjMCuRz34oAzNf8R6b4c097zUbgRooyqAgvIfRV6k153c/GaSUH+ztBcr2kuZwuf+AgH+dcX4r1ebxB4v1Ce4bMdnM9tboOiKrH9T1/H6VmVzzqtOyMKtbkdkj0CD4yaokmbrQreSPv5NwVP6g5rsvCvxB0vxU7QQ77a9TBa2nwGPupzz/nivDaaUbzopo5HhmiYNHLE21lI5Bz9cVEa76kQxKbtI+olbIp1fM66xriS+aviDVRJ1ybpjn69q6LRvih4i0y4RdUCala5G4hQkoHsRgH8RzWyrRZvGpCWzPdqKydC1/T/EGmJqNhNvgfg7uGU/3SOxFam4euMVomWOopgkT+8KdnJpgLRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRRRQAUUUUAFFFJQAtMkkCKWboBk80+uX+Il3JZeAtWmhZlkMIjBU8jcyr/7NQ3YDzrxh8SNQ1O9uNO0KX7LZI5ja8jPzy44O0/wjOenPHbpXEmW+8zzBqt8JM53+cc1HboI7eNB0AqWuKVV3OKpXkpaEUUciySyTTvNJK5d3fqSetS0UVncwlNyd2FFFFIiwUHkYzRRQBo+GPEz+DNae8WMyWlwhWaEHGT1BHoc/zPrVjVfG3ibXpvNbUZtOgPKW9o5TA92ByawpIY5seYu7ByPrUlae1lax1/WGo2Rq6b4u8T6LOJoNXnu1HLQXjmRG9uTx+GK9Q0P4o6FeaL9r1S4jsLuI7Zrc5J3dtuBkg/pXjdQtawtL5pjUv/eNVCs1uOGJ/mPeLL4meE76ZIY9VWORzgCeNox+bDH611P2hPLMpIEeM7iRjHrnpXzBJCkqFWUH39Kml17WZ7GDQrnUZjYRg+Wmcbl4wpI5IHoTWvtj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` + const result = await picgo.upload([imgBase64]) + logger.info("upload success =>", result) + ElMessage.success("upload success") + } catch (e: any) { + logger.error(e) + ElMessage.error(e.toString()) + } +} From 8668352fb89bb84d67e946e46add24c673ecfe55 Mon Sep 17 00:00:00 2001 From: terwer Date: Wed, 20 Mar 2024 11:07:51 +0800 Subject: [PATCH 04/67] chore: support base64 --- libs/Universal-PicGo-Core/src/core/Lifecycle.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/Universal-PicGo-Core/src/core/Lifecycle.ts b/libs/Universal-PicGo-Core/src/core/Lifecycle.ts index 615e7e6..ee9c5b5 100644 --- a/libs/Universal-PicGo-Core/src/core/Lifecycle.ts +++ b/libs/Universal-PicGo-Core/src/core/Lifecycle.ts @@ -12,7 +12,7 @@ import { ILifecyclePlugins, IPicGo, IPlugin, Undefinable } from "../types" import { ILogger } from "zhi-lib-base" import { createContext } from "../utils/createContext" import { IBuildInEvent } from "../utils/enums" -import { autoDetectImageType, handleUrlEncode } from "../utils/common" +import { handleUrlEncode } from "../utils/common" export class Lifecycle extends EventEmitter { private readonly ctx: IPicGo From 1b36f70413b00ce3829b8cafdeb1388943f59778 Mon Sep 17 00:00:00 2001 From: terwer Date: Wed, 20 Mar 2024 11:37:57 +0800 Subject: [PATCH 05/67] chore: add file or blob support --- libs/Universal-PicGo-Core/src/index.ts | 4 +-- .../src/plugins/transformer/path.ts | 8 +++-- libs/Universal-PicGo-Core/src/utils/common.ts | 33 +++++++++++++++++++ libs/Universal-PicGo-Store/src/index.ts | 4 +-- libs/Universal-PicGo-Store/src/lib/utils.ts | 4 +-- .../src/components/home/ElectronIndex.vue | 26 ++++++++++++++- 6 files changed, 69 insertions(+), 10 deletions(-) diff --git a/libs/Universal-PicGo-Core/src/index.ts b/libs/Universal-PicGo-Core/src/index.ts index 79d9188..ebb137d 100644 --- a/libs/Universal-PicGo-Core/src/index.ts +++ b/libs/Universal-PicGo-Core/src/index.ts @@ -1,5 +1,5 @@ import { UniversalPicGo } from "./core/UniversalPicGo" -import { win, hasNodeEnv } from "universal-picgo-store" +import { win, currentWin, parentWin, hasNodeEnv } from "universal-picgo-store" export { UniversalPicGo } -export { win, hasNodeEnv } +export { win, currentWin, parentWin, hasNodeEnv } diff --git a/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts b/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts index 0c3e474..40b4429 100644 --- a/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts +++ b/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts @@ -9,15 +9,17 @@ import dayjs from "dayjs" import { IImgInfo, IImgSize, IPathTransformedImgInfo, IPicGo } from "../../types" -import { win } from "universal-picgo-store" -import { getBase64File, getFSFile, getImageSize, getURLFile, isBase64, isUrl } from "../../utils/common" +import { currentWin, parentWin, win } from "universal-picgo-store" +import { getBase64File, getFSFile, getImageSize, getURLFile, isBase64, isFileOrBlob, isUrl } from "../../utils/common" const handle = async (ctx: IPicGo): Promise => { const results: IImgInfo[] = ctx.output await Promise.all( ctx.input.map(async (item: string | typeof win.Buffer, index: number) => { let info: IPathTransformedImgInfo - if (win.Buffer.isBuffer(item)) { + if (isFileOrBlob(item)) { + throw new Error("Blob is not supported") + } else if (win.Buffer.isBuffer(item)) { ctx.log.debug("using buffer in path transform") info = { success: true, diff --git a/libs/Universal-PicGo-Core/src/utils/common.ts b/libs/Universal-PicGo-Core/src/utils/common.ts index 8f3b4a4..6082681 100644 --- a/libs/Universal-PicGo-Core/src/utils/common.ts +++ b/libs/Universal-PicGo-Core/src/utils/common.ts @@ -100,6 +100,39 @@ export const getFSFile = async (filePath: string): Promise { + return isBlob(val) || isFile(val) +} + +/** + * 将 file 对象转换为 Buffer + * + * @param file - file + * @author terwer + * @version 0.9.0 + * @since 0.9.0 + */ +export const fileToBuffer = async (file: any): Promise => { + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onload = (e: any) => { + // 将 ArrayBuffer 转换成 Buffer 对象 + const buffer = win.Buffer.from(e.target.result) + resolve(buffer) + } + reader.onerror = reject + reader.readAsArrayBuffer(file) + }) +} + export const getURLFile = async (url: string, ctx: IPicGo): Promise => { url = handleUrlEncode(url) let isImage = false diff --git a/libs/Universal-PicGo-Store/src/index.ts b/libs/Universal-PicGo-Store/src/index.ts index f8c14ce..1bc4aff 100644 --- a/libs/Universal-PicGo-Store/src/index.ts +++ b/libs/Universal-PicGo-Store/src/index.ts @@ -1,7 +1,7 @@ import { JSONStore } from "./lib/JSONStore" -import { win, hasNodeEnv } from "./lib/utils" +import { win, currentWin, parentWin, hasNodeEnv } from "./lib/utils" import { IJSON } from "./types" export { type IJSON } export { JSONStore } -export { win, hasNodeEnv } +export { win, currentWin, parentWin, hasNodeEnv } diff --git a/libs/Universal-PicGo-Store/src/lib/utils.ts b/libs/Universal-PicGo-Store/src/lib/utils.ts index 736e20a..a285095 100644 --- a/libs/Universal-PicGo-Store/src/lib/utils.ts +++ b/libs/Universal-PicGo-Store/src/lib/utils.ts @@ -7,7 +7,7 @@ * of this license document, but changing it is not allowed. */ -const currentWin = (window || globalThis || undefined) as any -const parentWin = (window?.parent || window?.top || window?.self || undefined) as any +export const currentWin = (window || globalThis || undefined) as any +export const parentWin = (window?.parent || window?.top || window?.self || undefined) as any export const win = currentWin?.fs ? currentWin : parentWin?.fs ? parentWin : currentWin export const hasNodeEnv = typeof win?.fs !== "undefined" diff --git a/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue b/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue index eeb9dd8..cdb1118 100644 --- a/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue +++ b/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue @@ -12,10 +12,12 @@ import { createAppLogger } from "@/utils/appLogger.ts" import { isDev } from "@/utils/Constants.ts" import { ElMessage } from "element-plus" import { UniversalPicGo } from "universal-picgo" -import { Buffer } from "universal-picgo/src/utils/nodePolyfill.ts" +import { ref } from "vue" const logger = createAppLogger("picgo-electron-index") +const paramFile = ref(null as any) + const handleTest = async () => { try { const picgo = new UniversalPicGo("", isDev) @@ -58,6 +60,27 @@ const handleTest3 = async () => { } } +const onImageSelect = async (event: Event) => { + const input = event.target as HTMLInputElement + if (input.files && input.files[0]) { + paramFile.value = input.files[0] + } +} + +const handleTest4 = async () => { + try { + const picgo = new UniversalPicGo("", isDev) + logger.debug("picgo =>", picgo) + + const result = await picgo.upload([paramFile.value]) + logger.info("upload success =>", result) + ElMessage.success("upload success") + } catch (e: any) { + logger.error(e) + ElMessage.error(e.toString()) + } +} + const handleTest5 = async () => { try { const picgo = new UniversalPicGo("", isDev) @@ -87,6 +110,7 @@ const handleTest5 = async () => { 测试electron本地图片路径
+ 测试electron本地图片File
From e4867c341ad5361a0ef13c486ac3ef7a5b913ec0 Mon Sep 17 00:00:00 2001 From: terwer Date: Wed, 20 Mar 2024 11:40:52 +0800 Subject: [PATCH 06/67] chore: add file or blob support --- .../src/plugins/transformer/path.ts | 16 +++++++++++++--- libs/Universal-PicGo-Core/src/utils/common.ts | 12 +++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts b/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts index 40b4429..c214dc6 100644 --- a/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts +++ b/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts @@ -9,8 +9,17 @@ import dayjs from "dayjs" import { IImgInfo, IImgSize, IPathTransformedImgInfo, IPicGo } from "../../types" -import { currentWin, parentWin, win } from "universal-picgo-store" -import { getBase64File, getFSFile, getImageSize, getURLFile, isBase64, isFileOrBlob, isUrl } from "../../utils/common" +import { win } from "universal-picgo-store" +import { + getBase64File, + getBlobFile, + getFSFile, + getImageSize, + getURLFile, + isBase64, + isFileOrBlob, + isUrl, +} from "../../utils/common" const handle = async (ctx: IPicGo): Promise => { const results: IImgInfo[] = ctx.output @@ -18,7 +27,8 @@ const handle = async (ctx: IPicGo): Promise => { ctx.input.map(async (item: string | typeof win.Buffer, index: number) => { let info: IPathTransformedImgInfo if (isFileOrBlob(item)) { - throw new Error("Blob is not supported") + ctx.log.debug("using File or Blob in path transform") + info = await getBlobFile(item) } else if (win.Buffer.isBuffer(item)) { ctx.log.debug("using buffer in path transform") info = { diff --git a/libs/Universal-PicGo-Core/src/utils/common.ts b/libs/Universal-PicGo-Core/src/utils/common.ts index 6082681..e28b9c3 100644 --- a/libs/Universal-PicGo-Core/src/utils/common.ts +++ b/libs/Universal-PicGo-Core/src/utils/common.ts @@ -122,7 +122,7 @@ export const isFileOrBlob = (val: any): boolean => { */ export const fileToBuffer = async (file: any): Promise => { return new Promise((resolve, reject) => { - const reader = new FileReader() + const reader = new win.FileReader() reader.onload = (e: any) => { // 将 ArrayBuffer 转换成 Buffer 对象 const buffer = win.Buffer.from(e.target.result) @@ -133,6 +133,16 @@ export const fileToBuffer = async (file: any): Promise => { }) } +export const getBlobFile = async (blob: any): Promise => { + const buffer = await fileToBuffer(blob) + return { + success: true, + buffer, + fileName: "", // will use getImageSize result + extname: "", // will use getImageSize result + } +} + export const getURLFile = async (url: string, ctx: IPicGo): Promise => { url = handleUrlEncode(url) let isImage = false From 26413dcfe924b4ad17f51e0ebb6259b7919bb5a8 Mon Sep 17 00:00:00 2001 From: terwer Date: Wed, 20 Mar 2024 15:38:51 +0800 Subject: [PATCH 07/67] chore: browser support url upload --- .../src/lib/PluginLoader.ts | 8 + .../src/plugins/transformer/path.ts | 12 +- libs/Universal-PicGo-Core/src/utils/common.ts | 104 ++++++++---- .../src/utils/image-size/index.ts | 3 +- libs/Universal-PicGo-Store/src/lib/utils.ts | 4 +- packages/picgo-plugin-app/package.json | 2 + .../src/components/home/BrowserIndex.vue | 153 +++++++++++++++++- packages/picgo-plugin-app/src/i18n/en_US.ts | 5 + packages/picgo-plugin-app/src/i18n/zh_CN.ts | 5 + .../src/utils/browserClipboard.ts | 49 ++++++ packages/picgo-plugin-app/tsconfig.json | 4 +- packages/picgo-plugin-app/vite.config.ts | 8 +- pnpm-lock.yaml | 136 +++++++++------- 13 files changed, 384 insertions(+), 109 deletions(-) create mode 100644 packages/picgo-plugin-app/src/utils/browserClipboard.ts diff --git a/libs/Universal-PicGo-Core/src/lib/PluginLoader.ts b/libs/Universal-PicGo-Core/src/lib/PluginLoader.ts index 7e44243..914f9aa 100644 --- a/libs/Universal-PicGo-Core/src/lib/PluginLoader.ts +++ b/libs/Universal-PicGo-Core/src/lib/PluginLoader.ts @@ -57,6 +57,14 @@ export class PluginLoader implements IPluginLoader { } return true } else { + const json = this.db.read(true) + const deps = Object.keys(json.dependencies || {}) + const devDeps = Object.keys(json.devDependencies || {}) + const modules = deps.concat(devDeps).filter((name: string) => { + if (!/^picgo-plugin-|^@[^/]+\/picgo-plugin-/.test(name)) return false + const path = this.resolvePlugin(this.ctx, name) + return false + }) this.logger.warn("load is not supported in browser") return false } diff --git a/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts b/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts index c214dc6..3438f6b 100644 --- a/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts +++ b/libs/Universal-PicGo-Core/src/plugins/transformer/path.ts @@ -10,6 +10,7 @@ import dayjs from "dayjs" import { IImgInfo, IImgSize, IPathTransformedImgInfo, IPicGo } from "../../types" import { win } from "universal-picgo-store" +import { Buffer } from "../../utils/nodePolyfill" import { getBase64File, getBlobFile, @@ -17,6 +18,7 @@ import { getImageSize, getURLFile, isBase64, + isBuffer, isFileOrBlob, isUrl, } from "../../utils/common" @@ -24,12 +26,12 @@ import { const handle = async (ctx: IPicGo): Promise => { const results: IImgInfo[] = ctx.output await Promise.all( - ctx.input.map(async (item: string | typeof win.Buffer, index: number) => { + ctx.input.map(async (item: string | Buffer | typeof win.Buffer, index: number) => { let info: IPathTransformedImgInfo if (isFileOrBlob(item)) { ctx.log.debug("using File or Blob in path transform") info = await getBlobFile(item) - } else if (win.Buffer.isBuffer(item)) { + } else if (isBuffer(item)) { ctx.log.debug("using buffer in path transform") info = { success: true, @@ -68,7 +70,11 @@ const handle = async (ctx: IPicGo): Promise => { return ctx } -const getImgSize = (ctx: IPicGo, file: typeof win.Buffer, path: string | typeof win.Buffer): IImgSize => { +const getImgSize = ( + ctx: IPicGo, + file: Buffer | typeof win.Buffer, + path: string | Buffer | typeof win.Buffer +): IImgSize => { const imageSize = getImageSize(file) if (!imageSize.real) { if (typeof path === "string") { diff --git a/libs/Universal-PicGo-Core/src/utils/common.ts b/libs/Universal-PicGo-Core/src/utils/common.ts index e28b9c3..3d39e46 100644 --- a/libs/Universal-PicGo-Core/src/utils/common.ts +++ b/libs/Universal-PicGo-Core/src/utils/common.ts @@ -11,6 +11,7 @@ import { IImgSize, IPathTransformedImgInfo, IPicGo, IPluginNameType } from "../t import { hasNodeEnv, win } from "universal-picgo-store" import imageSize from "./image-size" import { calculateHash } from "./hashUtil" +import { Buffer } from "./nodePolyfill" export const isUrl = (url: string): boolean => url.startsWith("http://") || url.startsWith("https://") @@ -73,7 +74,12 @@ function extractImageInfoFromBase64(base64ImageData: string): any { export const getBase64File = async (base64: string): Promise => { const imgInfo = extractImageInfoFromBase64(base64) - const imageBuffer = win.Buffer.from(imgInfo.imageBase64, "base64") + let imageBuffer + if (hasNodeEnv) { + imageBuffer = win.Buffer.from(imgInfo.imageBase64, "base64") + } else { + imageBuffer = Buffer.from(imgInfo.imageBase64, "base64") + } return { success: true, buffer: imageBuffer, @@ -112,6 +118,10 @@ export const isFileOrBlob = (val: any): boolean => { return isBlob(val) || isFile(val) } +export const isBuffer = (val: any): boolean => { + return toString.call(val) === "[object Buffer]" +} + /** * 将 file 对象转换为 Buffer * @@ -121,16 +131,29 @@ export const isFileOrBlob = (val: any): boolean => { * @since 0.9.0 */ export const fileToBuffer = async (file: any): Promise => { - return new Promise((resolve, reject) => { - const reader = new win.FileReader() - reader.onload = (e: any) => { - // 将 ArrayBuffer 转换成 Buffer 对象 - const buffer = win.Buffer.from(e.target.result) - resolve(buffer) - } - reader.onerror = reject - reader.readAsArrayBuffer(file) - }) + if (hasNodeEnv) { + return new Promise((resolve, reject) => { + const reader = new win.FileReader() + reader.onload = (e: any) => { + // 将 ArrayBuffer 转换成 Buffer 对象 + const buffer = win.Buffer.from(e.target.result) + resolve(buffer) + } + reader.onerror = reject + reader.readAsArrayBuffer(file) + }) + } else { + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onload = (e: any) => { + // 将 ArrayBuffer 转换成 Buffer 对象 + const buffer = Buffer.from(e.target.result) + resolve(buffer) + } + reader.onerror = reject + reader.readAsArrayBuffer(file) + }) + } } export const getBlobFile = async (blob: any): Promise => { @@ -152,31 +175,46 @@ export const getURLFile = async (url: string, ctx: IPicGo): Promise((resolve, reject) => { ;(async () => { try { - const res = await ctx - .request({ - method: "get", - url, - resolveWithFullResponse: true, - responseType: "arraybuffer", - }) - .then((resp: any) => { - const contentType = resp.headers["content-type"] - if (contentType?.includes("image")) { - isImage = true - extname = `.${contentType.split("image/")[1]}` - } - return resp.data as typeof win.ArrayBuffer - }) + let res: any + if (hasNodeEnv) { + res = await ctx + .request({ + method: "get", + url, + resolveWithFullResponse: true, + responseType: "arraybuffer", + }) + .then((resp: any) => { + const contentType = resp.headers["content-type"] + if (contentType?.includes("image")) { + isImage = true + extname = `.${contentType.split("image/")[1]}` + } + return resp.data as any + }) + } else { + // 浏览器环境单独出处理,直接跳出 promise + const response = await window.fetch(url) + const blob = await response.blob() + const imgInfo = await getBlobFile(blob) + clearTimeout(timeoutId) + resolve(imgInfo) + } clearTimeout(timeoutId) if (isImage) { const urlPath = new URL(url).pathname - const fileName = urlPath.split("/").pop() - // if (hasNodeEnv) { - // const path = win.require("path") - // fileName = path.basename(urlPath) - // } + let fileName: string + let imgBuffer: Buffer | typeof win.Buffer + if (hasNodeEnv) { + const path = win.require("path") + fileName = path.basename(urlPath) + imgBuffer = win.Buffer.from(res) + } else { + fileName = urlPath.split("/").pop() ?? "" + imgBuffer = Buffer.from(res) + } resolve({ - buffer: win.Buffer.from(res), + buffer: imgBuffer, fileName: fileName, extname, success: true, @@ -378,7 +416,7 @@ export const forceNumber = (num: string | number = 0): number => { // return process.env.NODE_ENV === 'production' // } -export const getImageSize = (file: typeof win.Buffer): IImgSize => { +export const getImageSize = (file: Buffer | typeof win.Buffer): IImgSize => { try { const { width = 0, height = 0, type } = imageSize(file) const extname = type ? `.${type}` : ".png" diff --git a/libs/Universal-PicGo-Core/src/utils/image-size/index.ts b/libs/Universal-PicGo-Core/src/utils/image-size/index.ts index d37ffe1..c07bbbe 100644 --- a/libs/Universal-PicGo-Core/src/utils/image-size/index.ts +++ b/libs/Universal-PicGo-Core/src/utils/image-size/index.ts @@ -120,8 +120,6 @@ export function imageSize(input: string, callback: CallbackFn): void * @param {Function=} [callback] - optional function for async detection */ export function imageSize(input: typeof win.Uint8Array | string, callback?: CallbackFn): ISizeCalculationResult | void { - const path = win.require("path") - // Handle Uint8Array input if (input instanceof win.Uint8Array) { return lookup(input) @@ -133,6 +131,7 @@ export function imageSize(input: typeof win.Uint8Array | string, callback?: Call } // resolve the file path + const path = win.require("path") const filepath = path.resolve(input) if (typeof callback === "function") { queue.push(() => diff --git a/libs/Universal-PicGo-Store/src/lib/utils.ts b/libs/Universal-PicGo-Store/src/lib/utils.ts index a285095..e2adb15 100644 --- a/libs/Universal-PicGo-Store/src/lib/utils.ts +++ b/libs/Universal-PicGo-Store/src/lib/utils.ts @@ -9,5 +9,5 @@ export const currentWin = (window || globalThis || undefined) as any export const parentWin = (window?.parent || window?.top || window?.self || undefined) as any -export const win = currentWin?.fs ? currentWin : parentWin?.fs ? parentWin : currentWin -export const hasNodeEnv = typeof win?.fs !== "undefined" +export const win = currentWin?.fs?.rm ? currentWin : parentWin?.fs?.rm ? parentWin : currentWin +export const hasNodeEnv = typeof parentWin?.fs?.rm !== "undefined" diff --git a/packages/picgo-plugin-app/package.json b/packages/picgo-plugin-app/package.json index fd64c19..b23d361 100644 --- a/packages/picgo-plugin-app/package.json +++ b/packages/picgo-plugin-app/package.json @@ -24,10 +24,12 @@ }, "dependencies": { "@element-plus/icons-vue": "^2.3.1", + "@iconify/json": "^2.2.193", "@vueuse/core": "^10.9.0", "element-plus": "^2.6.1", "lodash-es": "^4.17.21", "universal-picgo": "workspace:*", + "unplugin-icons": "^0.18.5", "vue": "^3.4.21", "vue-i18n": "^9.10.2", "vue-router": "^4.3.0", diff --git a/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue b/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue index 7558d38..d2fd129 100644 --- a/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue +++ b/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue @@ -10,17 +10,115 @@ diff --git a/packages/picgo-plugin-app/src/components/ExternalPicgoSetting.vue b/packages/picgo-plugin-app/src/components/setting/ExternalPicgoSetting.vue similarity index 100% rename from packages/picgo-plugin-app/src/components/ExternalPicgoSetting.vue rename to packages/picgo-plugin-app/src/components/setting/ExternalPicgoSetting.vue diff --git a/packages/picgo-plugin-app/src/components/PicgoSetting.vue b/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue similarity index 100% rename from packages/picgo-plugin-app/src/components/PicgoSetting.vue rename to packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue diff --git a/packages/picgo-plugin-app/src/components/SiyuanSetting.vue b/packages/picgo-plugin-app/src/components/setting/SiyuanSetting.vue similarity index 100% rename from packages/picgo-plugin-app/src/components/SiyuanSetting.vue rename to packages/picgo-plugin-app/src/components/setting/SiyuanSetting.vue diff --git a/packages/picgo-plugin-app/src/components/test/BrowserTest.vue b/packages/picgo-plugin-app/src/components/test/BrowserTest.vue new file mode 100644 index 0000000..1ba21d7 --- /dev/null +++ b/packages/picgo-plugin-app/src/components/test/BrowserTest.vue @@ -0,0 +1,62 @@ + + + + + + + diff --git a/packages/picgo-plugin-app/src/components/test/ElectronTest.vue b/packages/picgo-plugin-app/src/components/test/ElectronTest.vue new file mode 100644 index 0000000..50002a2 --- /dev/null +++ b/packages/picgo-plugin-app/src/components/test/ElectronTest.vue @@ -0,0 +1,126 @@ + + + + + + + diff --git a/packages/picgo-plugin-app/src/i18n/en_US.ts b/packages/picgo-plugin-app/src/i18n/en_US.ts index 52957d8..5a69891 100644 --- a/packages/picgo-plugin-app/src/i18n/en_US.ts +++ b/packages/picgo-plugin-app/src/i18n/en_US.ts @@ -128,5 +128,6 @@ export default { "upload.select.tip2": "click to upload", "upload.select.limit": "jp(e)g/png/gif/svg/webp files with a size less than 500kb, max upload size is", "upload.tab.upload": "Picture upload", - "upload.tab.setting": "Picture setting", + "upload.tab.setting": "Plugin setting", + "component.test": "Component test", } diff --git a/packages/picgo-plugin-app/src/i18n/zh_CN.ts b/packages/picgo-plugin-app/src/i18n/zh_CN.ts index 94dda0a..93ddcc4 100644 --- a/packages/picgo-plugin-app/src/i18n/zh_CN.ts +++ b/packages/picgo-plugin-app/src/i18n/zh_CN.ts @@ -123,5 +123,6 @@ export default { "upload.select.tip2": "选择图片", "upload.select.limit": "支持jp(e)g/png/gif/svg/webp 格式,大小不超过 500kb, 单次最大上传图片数量限制为", "upload.tab.upload": "图片上传", - "upload.tab.setting": "图床设置", + "upload.tab.setting": "插件设置", + "component.test": "组件测试", } diff --git a/packages/picgo-plugin-app/src/layouts/default/DefaultFooter.vue b/packages/picgo-plugin-app/src/layouts/default/DefaultFooter.vue index 91546a8..f19d091 100644 --- a/packages/picgo-plugin-app/src/layouts/default/DefaultFooter.vue +++ b/packages/picgo-plugin-app/src/layouts/default/DefaultFooter.vue @@ -14,11 +14,10 @@ import { version } from "../../../package.json" import { useVueI18n } from "~/src/composables/useVueI18n.ts" import { DateUtil } from "zhi-common" import { useRouter } from "vue-router" -import { useSiyuanDevice } from "~/src/composables/useSiyuanDevice.ts" +import { isDev } from "@/utils/Constants.ts" const { t } = useVueI18n() const router = useRouter() -const { isInSiyuanOrSiyuanNewWin } = useSiyuanDevice() const isDark = useDark() const toggleDark = useToggle(isDark) @@ -26,8 +25,6 @@ const toggleDark = useToggle(isDark) const v = ref(version) const nowYear = DateUtil.nowYear() -const isSiyuanOrSiyuanNewWin = isInSiyuanOrSiyuanNewWin() - const goHome = async () => { await router.push({ path: "/", @@ -49,12 +46,26 @@ const handleTransportSetting = async () => { }) } +const handlePicgoSetting = async () => { + await router.push({ + path: "/setting/picgo", + query: { showBack: "true" }, + }) +} + const handleSiyuanSetting = async () => { await router.push({ path: "/setting/siyuan", query: { showBack: "true" }, }) } + +const handleComponentTest = async () => { + await router.push({ + path: "/test", + query: { showBack: "true" }, + }) +} - {{ t("upload.tab.setting") }} +
diff --git a/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue b/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue index bc45dc7..1f6046e 100644 --- a/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue +++ b/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue @@ -7,10 +7,60 @@ - of this license document, but changing it is not allowed. --> - + diff --git a/packages/picgo-plugin-app/src/components/setting/SiyuanSetting.vue b/packages/picgo-plugin-app/src/components/setting/SiyuanSetting.vue index cdc6de8..92cec2c 100644 --- a/packages/picgo-plugin-app/src/components/setting/SiyuanSetting.vue +++ b/packages/picgo-plugin-app/src/components/setting/SiyuanSetting.vue @@ -7,10 +7,40 @@ - of this license document, but changing it is not allowed. --> - + - + diff --git a/packages/picgo-plugin-app/src/components/test/BrowserTest.vue b/packages/picgo-plugin-app/src/components/test/BrowserTest.vue index 1ba21d7..1a90977 100644 --- a/packages/picgo-plugin-app/src/components/test/BrowserTest.vue +++ b/packages/picgo-plugin-app/src/components/test/BrowserTest.vue @@ -46,14 +46,14 @@ const handleTest5 = async () => { diff --git a/packages/picgo-plugin-app/src/pages/TestIndex.vue b/packages/picgo-plugin-app/src/pages/TestIndex.vue index 94e789a..f489794 100644 --- a/packages/picgo-plugin-app/src/pages/TestIndex.vue +++ b/packages/picgo-plugin-app/src/pages/TestIndex.vue @@ -28,14 +28,14 @@ const handleTestElectron = async () => { + diff --git a/packages/picgo-plugin-app/src/components/test/BrowserTest.vue b/packages/picgo-plugin-app/src/components/test/BrowserTest.vue index 1a90977..a9aa23b 100644 --- a/packages/picgo-plugin-app/src/components/test/BrowserTest.vue +++ b/packages/picgo-plugin-app/src/components/test/BrowserTest.vue @@ -11,13 +11,13 @@ import { isDev } from "@/utils/Constants.ts" import { ElMessage } from "element-plus" import { createAppLogger } from "@/utils/appLogger.ts" -import { UniversalPicGo } from "universal-picgo" +import { SiyuanPicGoUploadApi } from "universal-picgo" const logger = createAppLogger("browser-test") const handleTest2 = async () => { try { - const picgo = new UniversalPicGo("", isDev) + const picgo = new SiyuanPicGoUploadApi(isDev) logger.debug("picgo =>", picgo) const result = await picgo.upload(["https://s2.loli.net/2024/03/20/VDRXZnkBaKWFhpt.png"]) @@ -31,7 +31,7 @@ const handleTest2 = async () => { const handleTest5 = async () => { try { - const picgo = new UniversalPicGo("", isDev) + const picgo = new SiyuanPicGoUploadApi(isDev) logger.debug("picgo =>", picgo) const imgBase64 = `data:image/jpeg;base64,/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APf6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooNFABRRmigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKDQAUGmF1BwTz6UjMCuRz34oAzNf8R6b4c097zUbgRooyqAgvIfRV6k153c/GaSUH+ztBcr2kuZwuf+AgH+dcX4r1ebxB4v1Ce4bMdnM9tboOiKrH9T1/H6VmVzzqtOyMKtbkdkj0CD4yaokmbrQreSPv5NwVP6g5rsvCvxB0vxU7QQ77a9TBa2nwGPupzz/nivDaaUbzopo5HhmiYNHLE21lI5Bz9cVEa76kQxKbtI+olbIp1fM66xriS+aviDVRJ1ybpjn69q6LRvih4i0y4RdUCala5G4hQkoHsRgH8RzWyrRZvGpCWzPdqKydC1/T/EGmJqNhNvgfg7uGU/3SOxFam4euMVomWOopgkT+8KdnJpgLRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRRRQAUUUUAFFFJQAtMkkCKWboBk80+uX+Il3JZeAtWmhZlkMIjBU8jcyr/7NQ3YDzrxh8SNQ1O9uNO0KX7LZI5ja8jPzy44O0/wjOenPHbpXEmW+8zzBqt8JM53+cc1HboI7eNB0AqWuKVV3OKpXkpaEUUciySyTTvNJK5d3fqSetS0UVncwlNyd2FFFFIiwUHkYzRRQBo+GPEz+DNae8WMyWlwhWaEHGT1BHoc/zPrVjVfG3ibXpvNbUZtOgPKW9o5TA92ByawpIY5seYu7ByPrUlae1lax1/WGo2Rq6b4u8T6LOJoNXnu1HLQXjmRG9uTx+GK9Q0P4o6FeaL9r1S4jsLuI7Zrc5J3dtuBkg/pXjdQtawtL5pjUv/eNVCs1uOGJ/mPeLL4meE76ZIY9VWORzgCeNox+bDH611P2hPLMpIEeM7iRjHrnpXzBJCkqFWUH39Kml17WZ7GDQrnUZjYRg+Wmcbl4wpI5IHoTWvtj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` diff --git a/packages/picgo-plugin-app/src/components/test/ElectronTest.vue b/packages/picgo-plugin-app/src/components/test/ElectronTest.vue index a2753a2..bb74f56 100644 --- a/packages/picgo-plugin-app/src/components/test/ElectronTest.vue +++ b/packages/picgo-plugin-app/src/components/test/ElectronTest.vue @@ -11,7 +11,7 @@ import { createAppLogger } from "@/utils/appLogger.ts" import { isDev } from "@/utils/Constants.ts" import { ElMessage } from "element-plus" -import { hasNodeEnv, UniversalPicGo } from "universal-picgo" +import { hasNodeEnv, SiyuanPicGoUploadApi } from "universal-picgo" import { ref } from "vue" const logger = createAppLogger("picgo-electron-index") @@ -20,7 +20,7 @@ const paramFile = ref(null as any) const handleTest = async () => { try { - const picgo = new UniversalPicGo("", isDev) + const picgo = new SiyuanPicGoUploadApi(isDev) logger.debug("picgo =>", picgo) const result = await picgo.upload() @@ -34,7 +34,7 @@ const handleTest = async () => { const handleTest2 = async () => { try { - const picgo = new UniversalPicGo("", isDev) + const picgo = new SiyuanPicGoUploadApi(isDev) logger.debug("picgo =>", picgo) const result = await picgo.upload(["https://s2.loli.net/2024/03/20/VDRXZnkBaKWFhpt.png"]) @@ -48,7 +48,7 @@ const handleTest2 = async () => { const handleTest3 = async () => { try { - const picgo = new UniversalPicGo("", isDev) + const picgo = new SiyuanPicGoUploadApi(isDev) logger.debug("picgo =>", picgo) const result = await picgo.upload(["/Users/terwer/Documents/pictures/photo.jpg"]) @@ -69,7 +69,7 @@ const onImageSelect = async (event: Event) => { const handleTest4 = async () => { try { - const picgo = new UniversalPicGo("", isDev) + const picgo = new SiyuanPicGoUploadApi(isDev) logger.debug("picgo =>", picgo) const result = await picgo.upload([paramFile.value]) @@ -83,7 +83,7 @@ const handleTest4 = async () => { const handleTest5 = async () => { try { - const picgo = new UniversalPicGo("", isDev) + const picgo = new SiyuanPicGoUploadApi(isDev) logger.debug("picgo =>", picgo) const imgBase64 = `data:image/jpeg;base64,/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAcwBzAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APf6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooNFABRRmigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKDQAUGmF1BwTz6UjMCuRz34oAzNf8R6b4c097zUbgRooyqAgvIfRV6k153c/GaSUH+ztBcr2kuZwuf+AgH+dcX4r1ebxB4v1Ce4bMdnM9tboOiKrH9T1/H6VmVzzqtOyMKtbkdkj0CD4yaokmbrQreSPv5NwVP6g5rsvCvxB0vxU7QQ77a9TBa2nwGPupzz/nivDaaUbzopo5HhmiYNHLE21lI5Bz9cVEa76kQxKbtI+olbIp1fM66xriS+aviDVRJ1ybpjn69q6LRvih4i0y4RdUCala5G4hQkoHsRgH8RzWyrRZvGpCWzPdqKydC1/T/EGmJqNhNvgfg7uGU/3SOxFam4euMVomWOopgkT+8KdnJpgLRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRSUUALRRRQAUUUUAFFFJQAtMkkCKWboBk80+uX+Il3JZeAtWmhZlkMIjBU8jcyr/7NQ3YDzrxh8SNQ1O9uNO0KX7LZI5ja8jPzy44O0/wjOenPHbpXEmW+8zzBqt8JM53+cc1HboI7eNB0AqWuKVV3OKpXkpaEUUciySyTTvNJK5d3fqSetS0UVncwlNyd2FFFFIiwUHkYzRRQBo+GPEz+DNae8WMyWlwhWaEHGT1BHoc/zPrVjVfG3ibXpvNbUZtOgPKW9o5TA92ByawpIY5seYu7ByPrUlae1lax1/WGo2Rq6b4u8T6LOJoNXnu1HLQXjmRG9uTx+GK9Q0P4o6FeaL9r1S4jsLuI7Zrc5J3dtuBkg/pXjdQtawtL5pjUv/eNVCs1uOGJ/mPeLL4meE76ZIY9VWORzgCeNox+bDH611P2hPLMpIEeM7iRjHrnpXzBJCkqFWUH39Kml17WZ7GDQrnUZjYRg+Wmcbl4wpI5IHoTWvtj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` From af4a2f1116fc88a5d49c2fd9f080edef2b5290a6 Mon Sep 17 00:00:00 2001 From: terwer Date: Thu, 21 Mar 2024 12:05:33 +0800 Subject: [PATCH 17/67] feat: config update --- .../src/api/SiyuanPicGoUploadApi.ts | 95 ++++++++++++------- .../src/core/UniversalPicGo.ts | 16 +++- packages/picgo-plugin-app/README.md | 34 +++++++ .../src/components/home/BrowserIndex.vue | 5 +- .../src/components/test/BrowserTest.vue | 7 +- .../src/components/test/ElectronTest.vue | 20 ++-- packages/picgo-plugin-app/src/routes/index.ts | 8 +- .../picgo-plugin-app/src/utils/siyuanPicgo.ts | 39 ++++++++ packages/picgo-plugin-app/tsconfig.json | 4 +- 9 files changed, 166 insertions(+), 62 deletions(-) create mode 100644 packages/picgo-plugin-app/src/utils/siyuanPicgo.ts diff --git a/libs/Universal-PicGo-Core/src/api/SiyuanPicGoUploadApi.ts b/libs/Universal-PicGo-Core/src/api/SiyuanPicGoUploadApi.ts index 231879d..f897b13 100644 --- a/libs/Universal-PicGo-Core/src/api/SiyuanPicGoUploadApi.ts +++ b/libs/Universal-PicGo-Core/src/api/SiyuanPicGoUploadApi.ts @@ -45,35 +45,26 @@ export const SIYUAN_PICGO_FILE_MAP_KEY = "custom-picgo-file-map-key" class SiyuanPicGoUploadApi { private readonly picgo: IPicGo private readonly logger: ILogger + public cfgUpdating: boolean constructor(isDev?: boolean) { - let cfgfolder = "" - let picgo_cfg_160 = "" + // 初始化 PicGO + this.picgo = new UniversalPicGo("", "", isDev) + this.logger = this.picgo.getLogger("siyuan-picgo-upload-api") + this.cfgUpdating = false + + // ================================================================================================================= + + // 迁移旧插件配置 + let legacyCfgfolder = "" // 初始化思源 PicGO 配置 const workspaceDir = win?.siyuan?.config?.system?.workspaceDir ?? "" if (hasNodeEnv && workspaceDir !== "") { const path = win.require("path") - cfgfolder = path.join(workspaceDir, "data", "storage", "syp", "picgo") - picgo_cfg_160 = path.join(cfgfolder, "picgo.cfg.json") - } - - // 初始化 PicGO - this.picgo = new UniversalPicGo(picgo_cfg_160, "", isDev) - this.logger = this.picgo.getLogger("siyuan-picgo-upload-api") - - // 迁移旧插件 - if (hasNodeEnv && cfgfolder !== "") { + legacyCfgfolder = path.join(workspaceDir, "data", "storage", "syp", "picgo") // 如果新插件采用了不同的目录,需要迁移旧插件 node_modules 文件夹 - if (cfgfolder !== this.picgo.pluginBaseDir) { - const path = win.require("path") - - const plugin_dir_070 = path.join(cfgfolder, "node_modules") - const pkg_070 = path.join(cfgfolder, "package.json") - const plugin_dir_160 = path.join(this.picgo.pluginBaseDir, "node_modules") - const pkg_160 = path.join(this.picgo.pluginBaseDir, "package.json") - - this.moveFile(plugin_dir_070, plugin_dir_160) - this.moveFile(pkg_070, pkg_160) + if (legacyCfgfolder !== this.picgo.baseDir) { + void this.moveFile(legacyCfgfolder, this.picgo.baseDir) } } @@ -101,27 +92,67 @@ class SiyuanPicGoUploadApi { // =================================================================================================================== - private moveFile(from: string, to: string) { + private async moveFile(from: string, to: string) { const fs = win.fs const path = win.require("path") - const exist = pathExistsSync(fs, path, from) + const existFrom = pathExistsSync(fs, path, from) const existTo = pathExistsSync(fs, path, to) + if (!existFrom) { + return + } + // 存在旧文件采取迁移 - if (exist) { - this.logger.info(`will move ${from} to ${to}`) - // 目的地存在复制 - if (existTo) { - fs.promises.cp(from, to).catch((e: any) => { + this.cfgUpdating = true + this.logger.info(`will move ${from} to ${to}`) + // 目的地存在复制 + if (existTo) { + this.copyFolder(from, to) + .then(() => { + this.cfgUpdating = false + }) + .catch((e: any) => { + this.cfgUpdating = false this.logger.error(`copy ${from} to ${to} failed: ${e}`) }) - } else { - // 不存在移动过去 - fs.promises.rename(from, to).catch((e: any) => { + } else { + // 不存在移动过去 + fs.promises + .rename(from, to) + .then(() => { + this.cfgUpdating = false + }) + .catch((e: any) => { + this.cfgUpdating = false this.logger.error(`move ${from} to ${to} failed: ${e}`) }) + } + } + + private async copyFolder(from: string, to: string) { + const fs = win.fs + const path = win.require("path") + + const files = await fs.promises.readdir(from) + for (const file of files) { + if (file.startsWith(".")) { + continue + } + const sourcePath = path.join(from, file) + const destPath = path.join(to, file) + + const stats = await fs.promises.lstat(sourcePath) + if (stats.isDirectory()) { + await fs.promises.mkdir(destPath, { recursive: true }) + // 递归复制子文件夹 + await this.copyFolder(sourcePath, destPath) + } else { + await fs.promises.copyFile(sourcePath, destPath) } } + + // 删除源文件夹 + await fs.promises.rmdir(from, { recursive: true }) } } diff --git a/libs/Universal-PicGo-Core/src/core/UniversalPicGo.ts b/libs/Universal-PicGo-Core/src/core/UniversalPicGo.ts index cc715bc..9475538 100644 --- a/libs/Universal-PicGo-Core/src/core/UniversalPicGo.ts +++ b/libs/Universal-PicGo-Core/src/core/UniversalPicGo.ts @@ -17,9 +17,8 @@ import { IPicGo, IPicGoPlugin, IPicGoPluginInterface, - IPicGoRequest, IPluginLoader, - IStringKeyMap, + IStringKeyMap } from "../types" import { Lifecycle } from "./Lifecycle" import uploaders from "../plugins/uploader" @@ -91,7 +90,7 @@ class UniversalPicGo extends EventEmitter implements IPicGo { uploader: new LifecyclePlugins("uploader"), beforeTransformPlugins: new LifecyclePlugins("beforeTransformPlugins"), beforeUploadPlugins: new LifecyclePlugins("beforeUploadPlugins"), - afterUploadPlugins: new LifecyclePlugins("afterUploadPlugins"), + afterUploadPlugins: new LifecyclePlugins("afterUploadPlugins") } this.initConfigPath() // this.cmd = new Commander(this) @@ -166,7 +165,7 @@ class UniversalPicGo extends EventEmitter implements IPicGo { _.set(this._config, name, config[name]) eventBus.emit(IBusEvent.CONFIG_CHANGE, { configName: name, - value: config[name], + value: config[name] }) }) } @@ -233,8 +232,9 @@ class UniversalPicGo extends EventEmitter implements IPicGo { if (hasNodeEnv) { const os = win.require("os") const fs = win.fs + const path = win.require("path") const { homedir } = os - const dir = homedir() + "/.universal-picgo" + const dir = path.join(homedir(), ".universal-picgo") ensureFolderSync(fs, dir) return dir } else { @@ -245,6 +245,12 @@ class UniversalPicGo extends EventEmitter implements IPicGo { private initConfigPath(): void { if (this.configPath === "") { this.baseDir = this.getDefautBaseDir() + if (hasNodeEnv) { + const path = win.require("path") + this.configPath = path.join(this.baseDir, "picgo.cfg.json") + } else { + this.configPath = browserPathJoin(this.baseDir, "picgo.cfg.json") + } } else { if (hasNodeEnv) { const fs = win.fs diff --git a/packages/picgo-plugin-app/README.md b/packages/picgo-plugin-app/README.md index 655e3d7..839d095 100644 --- a/packages/picgo-plugin-app/README.md +++ b/packages/picgo-plugin-app/README.md @@ -6,4 +6,38 @@ picgo plugin app for siyuan-note ``` ├── universal-picgo +``` + +## Docs + +New store path from 1.6.0 + +``` +1.5.6 之前的配置位置 + +[工作空间]/data/storage/syp/picgo/picgo.cfg.json + [工作空间]/data/storage/syp/picgo/mac.applescript + [工作空间]/data/storage/syp/picgo/i18n-cli + [工作空间]/data/storage/syp/picgo/picgo-clipboard-images + [工作空间]/data/storage/syp/picgo/external-picgo-cfg.json + [工作空间]/data/storage/syp/picgo/picgo.log + [工作空间]/data/storage/syp/picgo/picgo.log + [工作空间]/data/storage/syp/picgo/package.json + [工作空间]/data/storage/syp/picgo/package-lock.json + [工作空间]/data/storage/syp/picgo/node_modules + + +1.6.0+ 默认插件位置 + +~/.universal-picgo/picgo.cfg.json +~/.universal-picgo/mac.applescript +~/.universal-picgo/i18n-cli +~/.universal-picgo/picgo-clipboard-images +~/.universal-picgo/external-picgo-cfg.json +~/.universal-picgo/picgo.log +~/.universal-picgo/package.json +~/.universal-picgo/package-lock.json +~/.universal-picgo/node_modules + ~/.universal-picgo/node_modules/plugin-1 + ~/.universal-picgo/node_modules/plugin-2 ``` \ No newline at end of file diff --git a/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue b/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue index 7632688..2a4d672 100644 --- a/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue +++ b/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue @@ -9,9 +9,7 @@ + + diff --git a/libs/zhi-siyuan-picgo/package.json b/libs/zhi-siyuan-picgo/package.json new file mode 100644 index 0000000..d56ab93 --- /dev/null +++ b/libs/zhi-siyuan-picgo/package.json @@ -0,0 +1,38 @@ +{ + "name": "zhi-siyuan-picgo", + "version": "0.0.1", + "type": "module", + "description": "picgo lib for siyuan-note", + "main": "./dist/index.js", + "typings": "./dist/index.d.ts", + "repository": "terwer/zhi", + "homepage": "https://github.com/terwer/zhi/tree/main/libs/zhi-siyuan-picgo", + "author": "terwer", + "license": "MIT", + "files": [ + "dist", + "README.md" + ], + "keywords": [ + "zhi", + "lib" + ], + "scripts": { + "serve": "vite", + "dev": "vite build --watch", + "build": "vite build", + "start": "vite preview", + "test": "npx vitest --watch" + }, + "devDependencies": { + "@terwer/eslint-config-custom": "^1.3.6", + "@terwer/vite-config-custom": "^0.7.6" + }, + "dependencies": { + "zhi-lib-base": "^0.8.0", + "universal-picgo": "workspace:*" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/libs/zhi-siyuan-picgo/src/index.spec.ts b/libs/zhi-siyuan-picgo/src/index.spec.ts new file mode 100644 index 0000000..1bbf6ed --- /dev/null +++ b/libs/zhi-siyuan-picgo/src/index.spec.ts @@ -0,0 +1,7 @@ +import { describe, it } from "vitest" + +describe("index", () => { + it("test index", () => { + console.log("hello") + }) +}) \ No newline at end of file diff --git a/libs/zhi-siyuan-picgo/src/index.ts b/libs/zhi-siyuan-picgo/src/index.ts new file mode 100644 index 0000000..13666b6 --- /dev/null +++ b/libs/zhi-siyuan-picgo/src/index.ts @@ -0,0 +1,3 @@ +import { SiyuanPicgoPostApi } from "./lib/siyuanPicgoPostApi" + +export { SiyuanPicgoPostApi } diff --git a/libs/zhi-siyuan-picgo/src/lib/constants.ts b/libs/zhi-siyuan-picgo/src/lib/constants.ts new file mode 100644 index 0000000..86ad9b9 --- /dev/null +++ b/libs/zhi-siyuan-picgo/src/lib/constants.ts @@ -0,0 +1,13 @@ +/* + * GNU GENERAL PUBLIC LICENSE + * Version 3, 29 June 2007 + * + * Copyright (C) 2024 Terwer, Inc. + * Everyone is permitted to copy and distribute verbatim copies + * of this license document, but changing it is not allowed. + */ + +/** + * 文章PicGO图片信息Key + */ +export const SIYUAN_PICGO_FILE_MAP_KEY = "custom-picgo-file-map-key" diff --git a/libs/zhi-siyuan-picgo/src/lib/siyuanPicGoUploadApi.ts b/libs/zhi-siyuan-picgo/src/lib/siyuanPicGoUploadApi.ts new file mode 100644 index 0000000..26a6130 --- /dev/null +++ b/libs/zhi-siyuan-picgo/src/lib/siyuanPicGoUploadApi.ts @@ -0,0 +1,47 @@ +/* + * GNU GENERAL PUBLIC LICENSE + * Version 3, 29 June 2007 + * + * Copyright (C) 2024 Terwer, Inc. + * Everyone is permitted to copy and distribute verbatim copies + * of this license document, but changing it is not allowed. + */ + +import { ExternalPicgo, IImgInfo, IPicGo, UniversalPicGo } from "universal-picgo" +import { ILogger } from "zhi-lib-base" + +/** + * 思源笔记专属的图片上传 API + * + * @version 1.6.0 + * @since 0.6.0 + * @author terwer + */ +class SiyuanPicGoUploadApi { + public readonly picgo: IPicGo + private readonly externalPicGo: ExternalPicgo + private readonly logger: ILogger + + constructor(isDev?: boolean) { + // 初始化 PicGO + this.picgo = new UniversalPicGo("", "", isDev) + this.externalPicGo = new ExternalPicgo(this.picgo, isDev) + this.logger = this.picgo.getLogger("siyuan-picgo-upload-api") + this.logger.debug("picgo upload api inited") + } + + /** + * 上传图片到PicGO + * + * @param input 路径数组,可为空,为空上传剪贴板 + */ + public async upload(input?: any[]): Promise { + const useBundledPicgo = this.externalPicGo.db.get("useBundledPicgo") + if (useBundledPicgo) { + return this.picgo.upload(input) + } + return this.externalPicGo.upload(input) + } +} + +export { SiyuanPicGoUploadApi } diff --git a/libs/Universal-PicGo-Core/src/api/SiyuanPicGoUploadApi.ts b/libs/zhi-siyuan-picgo/src/lib/siyuanPicgoPostApi.ts similarity index 59% rename from libs/Universal-PicGo-Core/src/api/SiyuanPicGoUploadApi.ts rename to libs/zhi-siyuan-picgo/src/lib/siyuanPicgoPostApi.ts index 2acd36c..7acecce 100644 --- a/libs/Universal-PicGo-Core/src/api/SiyuanPicGoUploadApi.ts +++ b/libs/zhi-siyuan-picgo/src/lib/siyuanPicgoPostApi.ts @@ -7,57 +7,42 @@ * of this license document, but changing it is not allowed. */ -import { IImgInfo, IPicGo } from "../types" -import { UniversalPicGo } from "../core/UniversalPicGo" -import { ILogger } from "zhi-lib-base" -import { hasNodeEnv, win } from "universal-picgo-store" -import { pathExistsSync } from "../utils/nodeUtils" -import { ExternalPicgo } from "../core/ExternalPicgo" +import { ILogger, simpleLogger } from "zhi-lib-base" +import { SiyuanPicGoUploadApi } from "./siyuanPicGoUploadApi" +import { hasNodeEnv, IImgInfo, win } from "universal-picgo" /** - * 文章PicGO图片信息Key + * Picgo与文章交互的通用方法 */ -export const SIYUAN_PICGO_FILE_MAP_KEY = "custom-picgo-file-map-key" - -/** - * 思源笔记专属的图片上传 API - * - * ``` - * 默认配置位置 - * - * [工作空间]/data/storage/syp/picgo/picgo.cfg.json - * [工作空间]/data/storage/syp/picgo/package.json - * [工作空间]/data/storage/syp/picgo/mac.applescript - * [工作空间]/data/storage/syp/picgo/i18n-cli - * [工作空间]/data/storage/syp/picgo/picgo-clipboard-images - * - * - * 默认插件位置 - * - * ~/.universal-picgo/node_modules - * ~/.universal-picgo/node_modules/plugin-1 - * ~/.universal-picgo/node_modules/plugin-2 - * ``` - * - * @version 1.6.0 - * @since 0.6.0 - * @author terwer - */ -class SiyuanPicGoUploadApi { - private readonly picgo: IPicGo - private readonly externalPicGo: ExternalPicgo +class SiyuanPicgoPostApi { private readonly logger: ILogger + // private readonly imageParser: ImageParser + // private readonly siyuanApi: SiyuanKernelApi + // private readonly siyuanConfig: SiyuanConfig + private readonly picgoApi: SiyuanPicGoUploadApi public cfgUpdating: boolean constructor(isDev?: boolean) { + this.logger = simpleLogger("picgo-post-api", "zhi-siyuan-picgo", isDev) // 初始化 PicGO - this.picgo = new UniversalPicGo("", "", isDev) - this.externalPicGo = new ExternalPicgo(this.picgo, isDev) - this.logger = this.picgo.getLogger("siyuan-picgo-upload-api") + this.picgoApi = new SiyuanPicGoUploadApi(isDev) this.cfgUpdating = false - // ================================================================================================================= + this.updateConfig() + } + + /** + * 上传图片到PicGO + * + * @param input 路径数组,可为空,为空上传剪贴板 + */ + public async upload(input?: any[]): Promise { + return this.picgoApi.upload(input) + } + + // =================================================================================================================== + private updateConfig() { // 迁移旧插件配置 let legacyCfgfolder = "" // 初始化思源 PicGO 配置 @@ -66,44 +51,26 @@ class SiyuanPicGoUploadApi { const path = win.require("path") legacyCfgfolder = path.join(workspaceDir, "data", "storage", "syp", "picgo") // 如果新插件采用了不同的目录,需要迁移旧插件 node_modules 文件夹 - if (legacyCfgfolder !== this.picgo.baseDir) { - void this.moveFile(legacyCfgfolder, this.picgo.baseDir) + if (legacyCfgfolder !== this.picgoApi.picgo.baseDir) { + void this.moveFile(legacyCfgfolder, this.picgoApi.picgo.baseDir) } } - // 默认配置位置 + // 旧的配置位置 // [工作空间]/data/storage/syp/picgo/picgo.cfg.json // [工作空间]/data/storage/syp/picgo/package.json // [工作空间]/data/storage/syp/picgo/mac.applescript // [工作空间]/data/storage/syp/picgo/i18n-cli // [工作空间]/data/storage/syp/picgo/picgo-clipboard-images // - // 默认插件位置 - // ~/.universal-picgo/node_modules - // ~/.universal-picgo/node_modules/plugin-1 - // ~/.universal-picgo/node_modules/plugin-2 - } - - /** - * 上传图片到PicGO - * - * @param input 路径数组,可为空,为空上传剪贴板 - */ - public async upload(input?: any[]): Promise { - const useBundledPicgo = this.externalPicGo.db.get("useBundledPicgo") - if (useBundledPicgo) { - return this.picgo.upload(input) - } - return this.externalPicGo.upload(input) + // 新配置位置 + // ~/.universal-picgo } - // =================================================================================================================== - private async moveFile(from: string, to: string) { const fs = win.fs - const path = win.require("path") - const existFrom = pathExistsSync(fs, path, from) - const existTo = pathExistsSync(fs, path, to) + const existFrom = fs.existsSync(from) + const existTo = fs.existsSync(to) if (!existFrom) { return @@ -163,4 +130,4 @@ class SiyuanPicGoUploadApi { } } -export { SiyuanPicGoUploadApi } +export { SiyuanPicgoPostApi } diff --git a/libs/zhi-siyuan-picgo/tsconfig.json b/libs/zhi-siyuan-picgo/tsconfig.json new file mode 100644 index 0000000..08cfe0c --- /dev/null +++ b/libs/zhi-siyuan-picgo/tsconfig.json @@ -0,0 +1,42 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "Node", + // "allowImportingTsExtensions": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "types": [ + "node", + "vite/client" + ] + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.tsx", + "src/**/*.vue" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ], + "root": "." +} diff --git a/libs/zhi-siyuan-picgo/tsconfig.node.json b/libs/zhi-siyuan-picgo/tsconfig.node.json new file mode 100644 index 0000000..7065ca9 --- /dev/null +++ b/libs/zhi-siyuan-picgo/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/libs/zhi-siyuan-picgo/vite.config.ts b/libs/zhi-siyuan-picgo/vite.config.ts new file mode 100644 index 0000000..70923e8 --- /dev/null +++ b/libs/zhi-siyuan-picgo/vite.config.ts @@ -0,0 +1,68 @@ +/// + +import { resolve } from "path" +import { defineConfig } from "vite" +import { viteStaticCopy } from "vite-plugin-static-copy" +import dts from "vite-plugin-dts" +import minimist from "minimist" +import livereload from "rollup-plugin-livereload" + +const args = minimist(process.argv.slice(2)) +const isWatch = args.watch || args.w || false +const devDistDir = "./dist" +const distDir = isWatch ? devDistDir : "./dist" +// const distDir = devDistDir + +console.log("isWatch=>", isWatch) +console.log("distDir=>", distDir) + +export default defineConfig({ + plugins: [ + dts(), + + viteStaticCopy({ + targets: [ + { + src: "README.md", + dest: "./", + }, + { + src: "package.json", + dest: "./", + }, + ], + }), + ], + + build: { + // 输出路径 + outDir: distDir, + emptyOutDir: false, + + // 构建后是否生成 source map 文件 + sourcemap: false, + + lib: { + // Could also be a dictionary or array of multiple entry points + entry: resolve(__dirname, "src/index.ts"), + // the proper extensions will be added + fileName: "index", + formats: ["cjs"], + }, + rollupOptions: { + plugins: [...(isWatch ? [livereload(devDistDir)] : [])], + // make sure to externalize deps that shouldn't be bundled + // into your library + external: [], + output: { + entryFileNames: "[name].js", + }, + }, + }, + + test: { + globals: true, + environment: "jsdom", + include: ["src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"], + }, +}) diff --git a/packages/picgo-plugin-app/package.json b/packages/picgo-plugin-app/package.json index b23d361..7bed4c9 100644 --- a/packages/picgo-plugin-app/package.json +++ b/packages/picgo-plugin-app/package.json @@ -28,12 +28,12 @@ "@vueuse/core": "^10.9.0", "element-plus": "^2.6.1", "lodash-es": "^4.17.21", - "universal-picgo": "workspace:*", "unplugin-icons": "^0.18.5", "vue": "^3.4.21", "vue-i18n": "^9.10.2", "vue-router": "^4.3.0", "zhi-common": "^1.31.0", - "zhi-lib-base": "^0.8.0" + "zhi-lib-base": "^0.8.0", + "zhi-siyuan-picgo": "workspace:*" } } diff --git a/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue b/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue index 44948b9..9878bcd 100644 --- a/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue +++ b/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue @@ -38,8 +38,8 @@ const handlePicgoTypeChange = (_val: any) => {} - + diff --git a/packages/picgo-plugin-app/src/components/test/ElectronTest.vue b/packages/picgo-plugin-app/src/components/test/ElectronTest.vue index 2d13207..2a93f27 100644 --- a/packages/picgo-plugin-app/src/components/test/ElectronTest.vue +++ b/packages/picgo-plugin-app/src/components/test/ElectronTest.vue @@ -10,11 +10,12 @@ - - - - diff --git a/packages/picgo-plugin-app/src/routes/index.ts b/packages/picgo-plugin-app/src/routes/index.ts index 6929298..c6c7f93 100644 --- a/packages/picgo-plugin-app/src/routes/index.ts +++ b/packages/picgo-plugin-app/src/routes/index.ts @@ -10,7 +10,6 @@ import PicGoIndex from "$pages/PicGoIndex.vue" import ExternalPicgoSetting from "$components/setting/ExternalPicgoSetting.vue" import SiyuanSetting from "$components/setting/SiyuanSetting.vue" -import TransportSelect from "$pages/TransportSelect.vue" import { RouteRecordRaw } from "vue-router" import SettingIndex from "$pages/SettingIndex.vue" import PicgoSetting from "$components/setting/PicgoSetting.vue" @@ -27,7 +26,6 @@ export const routes: RouteRecordRaw[] = [ { path: "/setting/picgo", component: PicgoSetting }, { path: "/setting/siyuan", component: SiyuanSetting }, { path: "/setting/external", component: ExternalPicgoSetting }, - { path: "/setting/transport", component: TransportSelect }, { path: "/test", component: TestIndex }, { path: "/test/browser", component: BrowserTest }, { path: "/test/electron", component: ElectronTest }, diff --git a/packages/picgo-plugin-app/src/utils/siyuanPicgo.ts b/packages/picgo-plugin-app/src/utils/siyuanPicgo.ts index 6bbe2d1..4ed4fd2 100644 --- a/packages/picgo-plugin-app/src/utils/siyuanPicgo.ts +++ b/packages/picgo-plugin-app/src/utils/siyuanPicgo.ts @@ -7,7 +7,7 @@ * of this license document, but changing it is not allowed. */ -import { SiyuanPicGoUploadApi } from "universal-picgo" +import { SiyuanPicgoPostApi } from "zhi-siyuan-picgo" import { isDev } from "@/utils/Constants.ts" import { ElMessage } from "element-plus" import { createAppLogger } from "@/utils/appLogger.ts" @@ -18,9 +18,9 @@ import { createAppLogger } from "@/utils/appLogger.ts" class SiyuanPicGo { private static logger = createAppLogger("siyuan-pigo") - public static async getInstance(): Promise { + public static async getInstance(): Promise { return new Promise((resolve, reject) => { - const picgo = new SiyuanPicGoUploadApi(isDev) + const picgo = new SiyuanPicgoPostApi(isDev) let needUpdate = false const checkConfig = () => { if (picgo.cfgUpdating) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 15dc468..eb7a10e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,6 +80,22 @@ importers: specifier: ^4.17.12 version: 4.17.12 + libs/zhi-siyuan-picgo: + dependencies: + universal-picgo: + specifier: workspace:* + version: link:../Universal-PicGo-Core + zhi-lib-base: + specifier: ^0.8.0 + version: 0.8.0 + devDependencies: + '@terwer/eslint-config-custom': + specifier: ^1.3.6 + version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.12.5)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.23.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.2) + '@terwer/vite-config-custom': + specifier: ^0.7.6 + version: 0.7.6(@types/minimist@1.2.2)(jsdom@22.1.0)(minimist@1.2.8)(rollup-plugin-livereload@2.0.5)(typescript@5.4.2)(vite-plugin-dts@2.3.0)(vite-plugin-node-polyfills@0.8.2)(vite-plugin-static-copy@0.15.0)(vite-tsconfig-paths@4.3.2)(vite@4.5.2)(vitest@0.31.4) + packages/picgo-plugin-app: dependencies: '@element-plus/icons-vue': @@ -97,9 +113,6 @@ importers: lodash-es: specifier: ^4.17.21 version: 4.17.21 - universal-picgo: - specifier: workspace:* - version: link:../../libs/Universal-PicGo-Core unplugin-icons: specifier: ^0.18.5 version: 0.18.5 @@ -118,6 +131,9 @@ importers: zhi-lib-base: specifier: ^0.8.0 version: 0.8.0 + zhi-siyuan-picgo: + specifier: workspace:* + version: link:../../libs/zhi-siyuan-picgo devDependencies: '@terwer/eslint-config-custom': specifier: ^1.3.6 From 0f3299471197378bff39c906aab29136bee19637 Mon Sep 17 00:00:00 2001 From: terwer Date: Thu, 21 Mar 2024 16:12:15 +0800 Subject: [PATCH 21/67] feat: add post api --- libs/zhi-siyuan-picgo/.eslintrc.cjs | 4 -- libs/zhi-siyuan-picgo/.prettierignore | 11 ----- libs/zhi-siyuan-picgo/README.md | 41 ------------------- libs/zhi-siyuan-picgo/src/index.ts | 2 + .../src/lib/siyuanPicGoUploadApi.ts | 6 ++- libs/zhi-siyuan-picgo/vite.config.ts | 13 +++++- .../src/components/setting/PicgoSetting.vue | 7 ++-- .../picgo-plugin-app/src/pages/PicGoIndex.vue | 6 ++- .../picgo-plugin-app/src/pages/TestIndex.vue | 6 ++- 9 files changed, 30 insertions(+), 66 deletions(-) diff --git a/libs/zhi-siyuan-picgo/.eslintrc.cjs b/libs/zhi-siyuan-picgo/.eslintrc.cjs index a1993b7..e69de29 100644 --- a/libs/zhi-siyuan-picgo/.eslintrc.cjs +++ b/libs/zhi-siyuan-picgo/.eslintrc.cjs @@ -1,4 +0,0 @@ -module.exports = { - root: true, - extends: ["./node_modules/@terwer/eslint-config-custom/typescript/index.cjs"], -} diff --git a/libs/zhi-siyuan-picgo/.prettierignore b/libs/zhi-siyuan-picgo/.prettierignore index 8f9d2df..e69de29 100644 --- a/libs/zhi-siyuan-picgo/.prettierignore +++ b/libs/zhi-siyuan-picgo/.prettierignore @@ -1,11 +0,0 @@ -# platform - -# Ignore artifacts: -dist -node_modules - -# Ignore all dts files: -*.d.ts - -# lib -/pnpm-lock.yaml diff --git a/libs/zhi-siyuan-picgo/README.md b/libs/zhi-siyuan-picgo/README.md index 61474f6..e69de29 100644 --- a/libs/zhi-siyuan-picgo/README.md +++ b/libs/zhi-siyuan-picgo/README.md @@ -1,41 +0,0 @@ -# zhi-siyuan-picgo - -picgo lib for siyuan-note - -## Usage - -```js -// usage -``` - -## Deps - -``` -## Congregations! zhi-siyuan-picgo need no deps, it is just pure js code 🎉 -``` - -## Dev - -```bash -pnpm dev -F zhi-siyuan-picgo -``` - -## Build - -```bash -pnpm build -F zhi-siyuan-picgo -``` - -## Test - -Execute the unit tests via [vitest](https://vitest.dev) - -```bash -pnpm test -F zhi-siyuan-picgo -``` - -## Publish - -```bash -pnpm publish -F zhi-siyuan-picgo --tag latest -``` \ No newline at end of file diff --git a/libs/zhi-siyuan-picgo/src/index.ts b/libs/zhi-siyuan-picgo/src/index.ts index 13666b6..a7dcff7 100644 --- a/libs/zhi-siyuan-picgo/src/index.ts +++ b/libs/zhi-siyuan-picgo/src/index.ts @@ -1,3 +1,5 @@ import { SiyuanPicgoPostApi } from "./lib/siyuanPicgoPostApi" +import { PicgoTypeEnum } from "universal-picgo" export { SiyuanPicgoPostApi } +export { PicgoTypeEnum } diff --git a/libs/zhi-siyuan-picgo/src/lib/siyuanPicGoUploadApi.ts b/libs/zhi-siyuan-picgo/src/lib/siyuanPicGoUploadApi.ts index 26a6130..107869f 100644 --- a/libs/zhi-siyuan-picgo/src/lib/siyuanPicGoUploadApi.ts +++ b/libs/zhi-siyuan-picgo/src/lib/siyuanPicGoUploadApi.ts @@ -7,7 +7,7 @@ * of this license document, but changing it is not allowed. */ -import { ExternalPicgo, IImgInfo, IPicGo, UniversalPicGo } from "universal-picgo" +import { ExternalPicgo, IImgInfo, IPicGo, PicgoTypeEnum, UniversalPicGo } from "universal-picgo" import { ILogger } from "zhi-lib-base" /** @@ -38,6 +38,10 @@ class SiyuanPicGoUploadApi { public async upload(input?: any[]): Promise { const useBundledPicgo = this.externalPicGo.db.get("useBundledPicgo") if (useBundledPicgo) { + const picgoTyype = this.externalPicGo.db.get("picgoTyype") + if (picgoTyype !== PicgoTypeEnum.Bundled) { + throw new Error("当前配置使用内置PicGo,请先在配置页面选择使用内置PicGo") + } return this.picgo.upload(input) } return this.externalPicGo.upload(input) diff --git a/libs/zhi-siyuan-picgo/vite.config.ts b/libs/zhi-siyuan-picgo/vite.config.ts index 70923e8..aa49bba 100644 --- a/libs/zhi-siyuan-picgo/vite.config.ts +++ b/libs/zhi-siyuan-picgo/vite.config.ts @@ -1,3 +1,12 @@ +/* + * GNU GENERAL PUBLIC LICENSE + * Version 3, 29 June 2007 + * + * Copyright (C) 2024 Terwer, Inc. + * Everyone is permitted to copy and distribute verbatim copies + * of this license document, but changing it is not allowed. + */ + /// import { resolve } from "path" @@ -46,8 +55,8 @@ export default defineConfig({ // Could also be a dictionary or array of multiple entry points entry: resolve(__dirname, "src/index.ts"), // the proper extensions will be added - fileName: "index", - formats: ["cjs"], + // fileName: "index", + formats: ["es"], }, rollupOptions: { plugins: [...(isWatch ? [livereload(devDistDir)] : [])], diff --git a/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue b/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue index 9878bcd..3cc44d7 100644 --- a/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue +++ b/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue @@ -10,10 +10,11 @@ diff --git a/packages/picgo-plugin-app/src/pages/TestIndex.vue b/packages/picgo-plugin-app/src/pages/TestIndex.vue index f489794..9619797 100644 --- a/packages/picgo-plugin-app/src/pages/TestIndex.vue +++ b/packages/picgo-plugin-app/src/pages/TestIndex.vue @@ -9,8 +9,10 @@ + + + + \ No newline at end of file diff --git a/packages/picgo-plugin-app/src/components/setting/ExternalPicgoSetting.vue b/packages/picgo-plugin-app/src/components/setting/ExternalPicgoSetting.vue index 5b3e433..f86603b 100644 --- a/packages/picgo-plugin-app/src/components/setting/ExternalPicgoSetting.vue +++ b/packages/picgo-plugin-app/src/components/setting/ExternalPicgoSetting.vue @@ -7,10 +7,30 @@ - of this license document, but changing it is not allowed. --> - + diff --git a/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue b/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue index 3cc44d7..c283922 100644 --- a/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue +++ b/packages/picgo-plugin-app/src/components/setting/PicgoSetting.vue @@ -11,13 +11,17 @@ import { useVueI18n } from "$composables/useVueI18n.ts" import { reactive } from "vue" import { PicgoTypeEnum } from "zhi-siyuan-picgo" -import { useSiyuanDevice } from "$composables/useSiyuanDevice.ts" +import { useExternalPicGoSetting } from "@/stores/useExternalPicGoSetting.ts" +import { SiyuanPicGo } from "@/utils/siyuanPicgo.ts" +const { getExternalPicGoSetting } = useExternalPicGoSetting() const { t } = useVueI18n() -const { isInSiyuanOrSiyuanNewWin } = useSiyuanDevice() + +const siyuanPicgo = await SiyuanPicGo.getInstance() +const ctx = siyuanPicgo.ctx() +const externalPicGoSettingForm = getExternalPicGoSetting(ctx) const formData = reactive({ - picgoType: PicgoTypeEnum.Bundled, picgoTypeList: [ { value: PicgoTypeEnum.Bundled, @@ -35,19 +39,26 @@ const formData = reactive({ proxy: "", }) -const handlePicgoTypeChange = (_val: any) => {} +const handlePicgoTypeChange = (val: any) => { + const isBundled = val === PicgoTypeEnum.Bundled + externalPicGoSettingForm.value.useBundledPicgo = isBundled +} - + diff --git a/packages/picgo-plugin-app/src/composables/usePicgoUpload.ts b/packages/picgo-plugin-app/src/composables/usePicgoUpload.ts index 0eb7721..87d7771 100644 --- a/packages/picgo-plugin-app/src/composables/usePicgoUpload.ts +++ b/packages/picgo-plugin-app/src/composables/usePicgoUpload.ts @@ -90,20 +90,11 @@ export const usePicgoUpload = (props: any, deps: any, refs: any) => { return } - if (!picgoCommonData.isSiyuanOrSiyuanNewWin) { - const errMsg = "由于浏览器的安全限制,无法获取本地文件的完整路径,因此非electron环境只能通过剪贴板上传" - ElMessage.error(errMsg) - picgoCommonData.loggerMsg = t("main.opt.failure") + "=>" + errMsg - picgoCommonData.isUploadLoading = false - return - } - // 获取选择的文件的路径数组 const filePaths = [] for (let i = 0; i < fileList.length; i++) { if (fileList.item(i).path) { filePaths.push(fileList.item(i).path) - logger.debug("路径不为空") } else { logger.debug("路径为空,忽略") } @@ -164,14 +155,6 @@ export const usePicgoUpload = (props: any, deps: any, refs: any) => { doUploaddAllImagesToBed: async () => { picgoCommonData.isUploadLoading = true - if (!picgoCommonData.isSiyuanOrSiyuanNewWin) { - const errMsg = "由于浏览器的安全限制,无法获取本地文件的完整路径,因此非electron环境只能通过剪贴板上传" - ElMessage.error(errMsg) - picgoCommonData.loggerMsg = t("main.opt.failure") + "=>" + errMsg - picgoCommonData.isUploadLoading = false - return - } - try { let hasLocalImages = false const imageItemArray = picgoCommonData.fileList.files @@ -213,8 +196,13 @@ export const usePicgoUpload = (props: any, deps: any, refs: any) => { picgoCommonData.isUploadLoading = true try { + const ret = await siyuanApi.netAssets2LocalAssets(props.pageId) + logger.debug("ret=>", ret) + ElMessage.success("网络图片下载成功") + } catch (e: any) { + throw new Error("网络图片下载失败" + e.toString()) } finally { - // picgoCommonData.isUploadLoading = false + picgoCommonData.isUploadLoading = false } }, } diff --git a/packages/picgo-plugin-bootstrap/package.json b/packages/picgo-plugin-bootstrap/package.json index af56811..985502b 100644 --- a/packages/picgo-plugin-bootstrap/package.json +++ b/packages/picgo-plugin-bootstrap/package.json @@ -16,7 +16,7 @@ "devDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.2", "@terwer/eslint-config-custom": "^1.3.6", - "@tsconfig/svelte": "^5.0.2", + "@tsconfig/svelte": "^5.0.3", "@types/minimist": "1.2.5", "fast-glob": "^3.3.2", "jsdom": "^24.0.0", @@ -25,8 +25,8 @@ "siyuan": "^0.9.6", "stylus": "^0.63.0", "svelte": "^4.2.12", - "typescript": "^5.4.2", - "vite": "^5.1.6", + "typescript": "^5.4.3", + "vite": "^5.2.6", "vite-plugin-dts": "^3.7.3", "vite-plugin-node-polyfills": "^0.21.0", "vite-plugin-static-copy": "^1.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f48ded..5df7cff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 1.0.9(@commitlint/cli@17.8.1)(@commitlint/config-angular@17.8.1)(@commitlint/cz-commitlint@17.8.1)(@commitlint/prompt-cli@17.8.1)(commitizen@4.3.0)(husky@8.0.3)(inquirer@8.2.6)(is-ci@3.0.1) '@terwer/eslint-config-custom': specifier: ^1.3.6 - version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.23.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3) + version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.24.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3) turbo: specifier: ^1.13.0 version: 1.13.0 @@ -47,16 +47,16 @@ importers: devDependencies: '@terwer/eslint-config-custom': specifier: ^1.3.6 - version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.23.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3) + version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.24.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3) '@terwer/vite-config-custom': specifier: ^0.7.6 - version: 0.7.6(@types/minimist@1.2.2)(jsdom@22.1.0)(minimist@1.2.8)(rollup-plugin-livereload@2.0.5)(typescript@5.4.3)(vite-plugin-dts@2.3.0)(vite-plugin-node-polyfills@0.21.0)(vite-plugin-static-copy@0.15.0)(vite-tsconfig-paths@4.3.2)(vite@4.5.2)(vitest@0.31.4) + version: 0.7.6(@types/minimist@1.2.2)(jsdom@22.1.0)(minimist@1.2.8)(rollup-plugin-livereload@2.0.5)(typescript@5.4.3)(vite-plugin-dts@2.3.0)(vite-plugin-node-polyfills@0.21.0)(vite-plugin-static-copy@0.15.0)(vite-tsconfig-paths@4.3.2)(vite@4.5.3)(vitest@0.31.4) '@types/mime-types': specifier: ^2.1.4 version: 2.1.4 vite-plugin-node-polyfills: specifier: ^0.21.0 - version: 0.21.0(vite@4.5.2) + version: 0.21.0(vite@4.5.3) libs/Universal-PicGo-Store: dependencies: @@ -78,10 +78,10 @@ importers: devDependencies: '@terwer/eslint-config-custom': specifier: ^1.3.6 - version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.23.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3) + version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.24.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3) '@terwer/vite-config-custom': specifier: ^0.7.6 - version: 0.7.6(@types/minimist@1.2.2)(jsdom@22.1.0)(minimist@1.2.8)(rollup-plugin-livereload@2.0.5)(typescript@5.4.3)(vite-plugin-dts@2.3.0)(vite-plugin-node-polyfills@0.8.2)(vite-plugin-static-copy@0.15.0)(vite-tsconfig-paths@4.3.2)(vite@4.5.2)(vitest@0.31.4) + version: 0.7.6(@types/minimist@1.2.2)(jsdom@22.1.0)(minimist@1.2.8)(rollup-plugin-livereload@2.0.5)(typescript@5.4.3)(vite-plugin-dts@2.3.0)(vite-plugin-node-polyfills@0.8.2)(vite-plugin-static-copy@0.15.0)(vite-tsconfig-paths@4.3.2)(vite@4.5.3)(vitest@0.31.4) '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 @@ -98,8 +98,8 @@ importers: specifier: ^9.0.1 version: 9.0.1 zhi-common: - specifier: ^1.31.0 - version: 1.31.0(typescript@5.4.3) + specifier: ^1.33.0 + version: 1.33.0(typescript@5.4.3) zhi-device: specifier: ^2.11.0 version: 2.11.0 @@ -107,15 +107,15 @@ importers: specifier: ^0.8.0 version: 0.8.0 zhi-siyuan-api: - specifier: ^2.18.6 - version: 2.18.6(typescript@5.4.3) + specifier: ^2.19.1 + version: 2.19.1(typescript@5.4.3) devDependencies: '@terwer/eslint-config-custom': specifier: ^1.3.6 - version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.23.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3) + version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.24.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3) '@terwer/vite-config-custom': specifier: ^0.7.6 - version: 0.7.6(@types/minimist@1.2.2)(jsdom@22.1.0)(minimist@1.2.8)(rollup-plugin-livereload@2.0.5)(typescript@5.4.3)(vite-plugin-dts@2.3.0)(vite-plugin-node-polyfills@0.8.2)(vite-plugin-static-copy@0.15.0)(vite-tsconfig-paths@4.3.2)(vite@4.5.2)(vitest@0.31.4) + version: 0.7.6(@types/minimist@1.2.2)(jsdom@22.1.0)(minimist@1.2.8)(rollup-plugin-livereload@2.0.5)(typescript@5.4.3)(vite-plugin-dts@2.3.0)(vite-plugin-node-polyfills@0.8.2)(vite-plugin-static-copy@0.15.0)(vite-tsconfig-paths@4.3.2)(vite@4.5.3)(vitest@0.31.4) '@types/uuid': specifier: ^9.0.8 version: 9.0.8 @@ -126,14 +126,14 @@ importers: specifier: ^2.3.1 version: 2.3.1(vue@3.4.21) '@iconify/json': - specifier: ^2.2.193 - version: 2.2.193 + specifier: ^2.2.196 + version: 2.2.196 '@vueuse/core': specifier: ^10.9.0 version: 10.9.0(vue@3.4.21) element-plus: - specifier: ^2.6.1 - version: 2.6.1(vue@3.4.21) + specifier: ^2.6.2 + version: 2.6.2(vue@3.4.21) lodash-es: specifier: ^4.17.21 version: 4.17.21 @@ -142,7 +142,7 @@ importers: version: 0.18.5 vue: specifier: ^3.4.21 - version: 3.4.21(typescript@5.4.2) + version: 3.4.21(typescript@5.4.3) vue-i18n: specifier: ^9.10.2 version: 9.10.2(vue@3.4.21) @@ -150,8 +150,8 @@ importers: specifier: ^4.3.0 version: 4.3.0(vue@3.4.21) zhi-common: - specifier: ^1.31.0 - version: 1.31.0(typescript@5.4.2) + specifier: ^1.33.0 + version: 1.33.0(typescript@5.4.3) zhi-device: specifier: ^2.11.0 version: 2.11.0 @@ -159,18 +159,18 @@ importers: specifier: ^0.8.0 version: 0.8.0 zhi-siyuan-api: - specifier: ^2.18.6 - version: 2.18.6(typescript@5.4.2) + specifier: ^2.19.1 + version: 2.19.1(typescript@5.4.3) zhi-siyuan-picgo: specifier: workspace:* version: link:../../libs/zhi-siyuan-picgo devDependencies: '@terwer/eslint-config-custom': specifier: ^1.3.6 - version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.23.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.2) + version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.24.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3) '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.0.4(vite@5.1.6)(vue@3.4.21) + version: 5.0.4(vite@5.2.6)(vue@3.4.21) fast-glob: specifier: ^3.3.2 version: 3.3.2 @@ -181,8 +181,8 @@ importers: specifier: ^2.0.5 version: 2.0.5 typescript: - specifier: ^5.4.2 - version: 5.4.2 + specifier: ^5.4.3 + version: 5.4.3 unplugin-auto-import: specifier: ^0.17.5 version: 0.17.5(@vueuse/core@10.9.0) @@ -190,17 +190,17 @@ importers: specifier: ^0.26.0 version: 0.26.0(vue@3.4.21) vite: - specifier: ^5.1.6 - version: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) + specifier: ^5.2.6 + version: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) vite-plugin-html: specifier: ^3.2.2 - version: 3.2.2(vite@5.1.6) + version: 3.2.2(vite@5.2.6) vitest: specifier: ^1.4.0 version: 1.4.0(@types/node@20.11.30)(jsdom@24.0.0)(stylus@0.63.0) vue-tsc: - specifier: ^2.0.6 - version: 2.0.6(typescript@5.4.2) + specifier: ^2.0.7 + version: 2.0.7(typescript@5.4.3) packages/picgo-plugin-bootstrap: dependencies: @@ -213,13 +213,13 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^3.0.2 - version: 3.0.2(svelte@4.2.12)(vite@5.1.6) + version: 3.0.2(svelte@4.2.12)(vite@5.2.6) '@terwer/eslint-config-custom': specifier: ^1.3.6 - version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.23.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.2) + version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.24.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3) '@tsconfig/svelte': - specifier: ^5.0.2 - version: 5.0.2 + specifier: ^5.0.3 + version: 5.0.3 '@types/minimist': specifier: 1.2.5 version: 1.2.5 @@ -245,23 +245,23 @@ importers: specifier: ^4.2.12 version: 4.2.12 typescript: - specifier: ^5.4.2 - version: 5.4.2 + specifier: ^5.4.3 + version: 5.4.3 vite: - specifier: ^5.1.6 - version: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) + specifier: ^5.2.6 + version: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) vite-plugin-dts: specifier: ^3.7.3 - version: 3.7.3(@types/node@20.11.30)(typescript@5.4.2)(vite@5.1.6) + version: 3.7.3(@types/node@20.11.30)(typescript@5.4.3)(vite@5.2.6) vite-plugin-node-polyfills: specifier: ^0.21.0 - version: 0.21.0(vite@5.1.6) + version: 0.21.0(vite@5.2.6) vite-plugin-static-copy: specifier: ^1.0.1 - version: 1.0.1(vite@5.1.6) + version: 1.0.1(vite@5.2.6) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.2)(vite@5.1.6) + version: 4.3.2(typescript@5.4.3)(vite@5.2.6) vitest: specifier: ^1.4.0 version: 1.4.0(@types/node@20.11.30)(jsdom@24.0.0)(stylus@0.63.0) @@ -666,11 +666,11 @@ packages: peerDependencies: vue: ^3.2.0 dependencies: - vue: 3.4.21(typescript@5.4.2) + vue: 3.4.21(typescript@5.4.3) dev: false - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -687,8 +687,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -705,8 +705,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -723,8 +723,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -741,8 +741,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -759,8 +759,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -777,8 +777,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -795,8 +795,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -813,8 +813,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -831,8 +831,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -849,8 +849,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -867,8 +867,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -885,8 +885,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -903,8 +903,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -921,8 +921,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -939,8 +939,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -957,8 +957,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -975,8 +975,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -993,8 +993,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1011,8 +1011,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1029,8 +1029,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1047,8 +1047,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1065,8 +1065,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -1148,8 +1148,8 @@ packages: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} dev: true - /@iconify/json@2.2.193: - resolution: {integrity: sha512-1UuaDsCcm4LYzjul2QwHWe939RLYoaxJ1zDmnn+JWOaXW6tSMCdTWICaU5rCYjp//BQrhYY5ZorKKXPo7x5rUg==} + /@iconify/json@2.2.196: + resolution: {integrity: sha512-hRZ0pq77N+mkAbZvFi/pfsKcspA8PyGSASc6zQoq6n/RSLxb8xAgORatVHyDl0ow7shcS+dvyiZI8xmr6yI2WA==} dependencies: '@iconify/types': 2.0.0 pathe: 1.1.2 @@ -1348,7 +1348,7 @@ packages: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.5) '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) eslint: 8.57.0 - eslint-plugin-vue: 9.23.0(eslint@8.57.0) + eslint-plugin-vue: 9.24.0(eslint@8.57.0) typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -1614,7 +1614,7 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.1.6): + /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6): resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} engines: {node: ^18.0.0 || >=20} peerDependencies: @@ -1622,30 +1622,30 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.1.6) + '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.6) debug: 4.3.4 svelte: 4.2.12 - vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) + vite: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) transitivePeerDependencies: - supports-color dev: true - /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.1.6): + /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.6): resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.1.6) + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.8 svelte: 4.2.12 svelte-hmr: 0.15.3(svelte@4.2.12) - vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) - vitefu: 0.2.5(vite@5.1.6) + vite: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) + vitefu: 0.2.5(vite@5.2.6) transitivePeerDependencies: - supports-color dev: true @@ -1676,37 +1676,7 @@ packages: is-ci: 3.0.1 dev: true - /@terwer/eslint-config-custom@1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.23.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.2): - resolution: {integrity: sha512-W0dFSTYfkzpp71LW8cDZUgLrNa004KDctojbiQrJrF4FIDmlwND/LyPUqfe1Eg8sulB5qkNX9qMgFWZ4SAVXBQ==} - peerDependencies: - '@nuxt/eslint-config': ^0.1.1 - '@typescript-eslint/eslint-plugin': ^5.57.1 - astro-eslint-parser: ^0.13.3 - eslint: ^8.38.0 - eslint-config-prettier: ^8.3.0 - eslint-config-turbo: ^1.8.8 - eslint-plugin-prettier: ^4.2.1 - eslint-plugin-svelte: ^2.28.0 - eslint-plugin-vue: ^9.11.0 - prettier: ^2.8.7 - prettier-plugin-svelte: ^2.10.0 - typescript: ^5.0.4 - dependencies: - '@nuxt/eslint-config': 0.1.1(eslint@8.57.0) - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2) - astro-eslint-parser: 0.13.3 - eslint: 8.57.0 - eslint-config-prettier: 8.10.0(eslint@8.57.0) - eslint-config-turbo: 1.13.0(eslint@8.57.0) - eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@2.8.8) - eslint-plugin-svelte: 2.35.1(eslint@8.57.0)(svelte@4.2.12)(ts-node@10.9.2) - eslint-plugin-vue: 9.23.0(eslint@8.57.0) - prettier: 2.8.8 - prettier-plugin-svelte: 2.10.1(prettier@2.8.8)(svelte@4.2.12) - typescript: 5.4.2 - dev: true - - /@terwer/eslint-config-custom@1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.23.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3): + /@terwer/eslint-config-custom@1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.13.0)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.24.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.3): resolution: {integrity: sha512-W0dFSTYfkzpp71LW8cDZUgLrNa004KDctojbiQrJrF4FIDmlwND/LyPUqfe1Eg8sulB5qkNX9qMgFWZ4SAVXBQ==} peerDependencies: '@nuxt/eslint-config': ^0.1.1 @@ -1730,13 +1700,13 @@ packages: eslint-config-turbo: 1.13.0(eslint@8.57.0) eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@2.8.8) eslint-plugin-svelte: 2.35.1(eslint@8.57.0)(svelte@4.2.12)(ts-node@10.9.2) - eslint-plugin-vue: 9.23.0(eslint@8.57.0) + eslint-plugin-vue: 9.24.0(eslint@8.57.0) prettier: 2.8.8 prettier-plugin-svelte: 2.10.1(prettier@2.8.8)(svelte@4.2.12) typescript: 5.4.3 dev: true - /@terwer/vite-config-custom@0.7.6(@types/minimist@1.2.2)(jsdom@22.1.0)(minimist@1.2.8)(rollup-plugin-livereload@2.0.5)(typescript@5.4.3)(vite-plugin-dts@2.3.0)(vite-plugin-node-polyfills@0.21.0)(vite-plugin-static-copy@0.15.0)(vite-tsconfig-paths@4.3.2)(vite@4.5.2)(vitest@0.31.4): + /@terwer/vite-config-custom@0.7.6(@types/minimist@1.2.2)(jsdom@22.1.0)(minimist@1.2.8)(rollup-plugin-livereload@2.0.5)(typescript@5.4.3)(vite-plugin-dts@2.3.0)(vite-plugin-node-polyfills@0.21.0)(vite-plugin-static-copy@0.15.0)(vite-tsconfig-paths@4.3.2)(vite@4.5.3)(vitest@0.31.4): resolution: {integrity: sha512-4IXVxedwwOiVYR8phrZ9tL1Qn3aVs0mdgqNEVOr6m6lw8jFPUyX+EpiJjPom7NOa9VuKbtOvvN0lOPycX0lr3g==} peerDependencies: '@types/minimist': 1.2.2 @@ -1756,15 +1726,15 @@ packages: minimist: 1.2.8 rollup-plugin-livereload: 2.0.5 typescript: 5.4.3 - vite: 4.5.2(@types/node@20.11.30) - vite-plugin-dts: 2.3.0(@types/node@20.11.30)(vite@4.5.2) - vite-plugin-node-polyfills: 0.21.0(vite@4.5.2) - vite-plugin-static-copy: 0.15.0(vite@4.5.2) - vite-tsconfig-paths: 4.3.2(typescript@5.4.3)(vite@4.5.2) + vite: 4.5.3(@types/node@20.11.30) + vite-plugin-dts: 2.3.0(@types/node@20.11.30)(vite@4.5.3) + vite-plugin-node-polyfills: 0.21.0(vite@4.5.3) + vite-plugin-static-copy: 0.15.0(vite@4.5.3) + vite-tsconfig-paths: 4.3.2(typescript@5.4.3)(vite@4.5.3) vitest: 0.31.4(jsdom@22.1.0) dev: true - /@terwer/vite-config-custom@0.7.6(@types/minimist@1.2.2)(jsdom@22.1.0)(minimist@1.2.8)(rollup-plugin-livereload@2.0.5)(typescript@5.4.3)(vite-plugin-dts@2.3.0)(vite-plugin-node-polyfills@0.8.2)(vite-plugin-static-copy@0.15.0)(vite-tsconfig-paths@4.3.2)(vite@4.5.2)(vitest@0.31.4): + /@terwer/vite-config-custom@0.7.6(@types/minimist@1.2.2)(jsdom@22.1.0)(minimist@1.2.8)(rollup-plugin-livereload@2.0.5)(typescript@5.4.3)(vite-plugin-dts@2.3.0)(vite-plugin-node-polyfills@0.8.2)(vite-plugin-static-copy@0.15.0)(vite-tsconfig-paths@4.3.2)(vite@4.5.3)(vitest@0.31.4): resolution: {integrity: sha512-4IXVxedwwOiVYR8phrZ9tL1Qn3aVs0mdgqNEVOr6m6lw8jFPUyX+EpiJjPom7NOa9VuKbtOvvN0lOPycX0lr3g==} peerDependencies: '@types/minimist': 1.2.2 @@ -1784,11 +1754,11 @@ packages: minimist: 1.2.8 rollup-plugin-livereload: 2.0.5 typescript: 5.4.3 - vite: 4.5.2(@types/node@20.11.30) - vite-plugin-dts: 2.3.0(@types/node@20.11.30)(vite@4.5.2) - vite-plugin-node-polyfills: 0.8.2(vite@4.5.2) - vite-plugin-static-copy: 0.15.0(vite@4.5.2) - vite-tsconfig-paths: 4.3.2(typescript@5.4.3)(vite@4.5.2) + vite: 4.5.3(@types/node@20.11.30) + vite-plugin-dts: 2.3.0(@types/node@20.11.30)(vite@4.5.3) + vite-plugin-node-polyfills: 0.8.2(vite@4.5.3) + vite-plugin-static-copy: 0.15.0(vite@4.5.3) + vite-tsconfig-paths: 4.3.2(typescript@5.4.3)(vite@4.5.3) vitest: 0.31.4(jsdom@22.1.0) dev: true @@ -1806,8 +1776,8 @@ packages: path-browserify: 1.0.1 dev: true - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + /@tsconfig/node10@1.0.10: + resolution: {integrity: sha512-PiaIWIoPvO6qm6t114ropMCagj6YAF24j9OkCA2mJDXFnlionEwhsBCJ8yek4aib575BI3OkART/90WsgHgLWw==} dev: true /@tsconfig/node12@1.0.11: @@ -1822,8 +1792,8 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@tsconfig/svelte@5.0.2: - resolution: {integrity: sha512-BRbo1fOtyVbhfLyuCWw6wAWp+U8UQle+ZXu84MYYWzYSEB28dyfnRBIE99eoG+qdAC0po6L2ScIEivcT07UaMA==} + /@tsconfig/svelte@5.0.3: + resolution: {integrity: sha512-Ms0t9K0oxioSb0lrZ5NRysx0nE/KsojYOG+db9v6wSaU/+P37vc0WRmh1QE1c8IAtTniD4yEhffGQuTKF8uaPw==} dev: true /@types/argparse@1.0.38: @@ -1933,34 +1903,6 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - debug: 4.3.4 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.0 - tsutils: 3.21.0(typescript@5.4.2) - typescript: 5.4.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2009,26 +1951,6 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) - debug: 4.3.4 - eslint: 8.57.0 - typescript: 5.4.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2077,26 +1999,6 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - debug: 4.3.4 - eslint: 8.57.0 - tsutils: 3.21.0(typescript@5.4.2) - typescript: 5.4.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2143,27 +2045,6 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.2): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.0 - tsutils: 3.21.0(typescript@5.4.2) - typescript: 5.4.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.3): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2205,26 +2086,6 @@ packages: - typescript dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) - eslint: 8.57.0 - eslint-scope: 5.1.1 - semver: 7.6.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2257,15 +2118,15 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitejs/plugin-vue@5.0.4(vite@5.1.6)(vue@3.4.21): + /@vitejs/plugin-vue@5.0.4(vite@5.2.6)(vue@3.4.21): resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 vue: ^3.2.25 dependencies: - vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) - vue: 3.4.21(typescript@5.4.2) + vite: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) + vue: 3.4.21(typescript@5.4.3) dev: true /@vitest/expect@0.31.4: @@ -2352,10 +2213,10 @@ packages: '@volar/source-map': 1.11.1 dev: true - /@volar/language-core@2.1.2: - resolution: {integrity: sha512-5qsDp0Gf6fE09UWCeK7bkVn6NxMwC9OqFWQkMMkeej8h8XjyABPdRygC2RCrqDrfVdGijqlMQeXs6yRS+vfZYA==} + /@volar/language-core@2.1.5: + resolution: {integrity: sha512-u1OHmVkCFsJqNdaM2GKuMhE67TxcEnOqJNF+VtYv2Ji8DnrUaF4FAFSNxY+MRGICl+873CsSJVKas9TQtW14LA==} dependencies: - '@volar/source-map': 2.1.2 + '@volar/source-map': 2.1.5 dev: true /@volar/source-map@1.11.1: @@ -2364,8 +2225,8 @@ packages: muggle-string: 0.3.1 dev: true - /@volar/source-map@2.1.2: - resolution: {integrity: sha512-yFJqsuLm1OaWrsz9E3yd3bJcYIlHqdZ8MbmIoZLrAzMYQDcoF26/INIhgziEXSdyHc8xd7rd/tJdSnUyh0gH4Q==} + /@volar/source-map@2.1.5: + resolution: {integrity: sha512-GIkAM6fHgDcTXcdH4i10fAiAZzO0HLIer8/pt3oZ9A0n7n4R5d1b2F8Xxzh/pgmgNoL+SrHX3MFxs35CKgfmtA==} dependencies: muggle-string: 0.4.1 dev: true @@ -2377,10 +2238,10 @@ packages: path-browserify: 1.0.1 dev: true - /@volar/typescript@2.1.2: - resolution: {integrity: sha512-lhTancZqamvaLvoz0u/uth8dpudENNt2LFZOWCw9JZiX14xRFhdhfzmphiCRb7am9E6qAJSbdS/gMt1utXAoHQ==} + /@volar/typescript@2.1.5: + resolution: {integrity: sha512-zo9a3NrNMSkufIvHuExDGTfYv+zO7C5p2wg8fyP7vcqF/Qo0ztjb0ZfOgq/A85EO/MBc1Kj2Iu7PaOBtP++NMw==} dependencies: - '@volar/language-core': 2.1.2 + '@volar/language-core': 2.1.5 path-browserify: 1.0.1 dev: true @@ -2422,7 +2283,7 @@ packages: resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==} dev: false - /@vue/language-core@1.8.27(typescript@5.4.2): + /@vue/language-core@1.8.27(typescript@5.4.3): resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} peerDependencies: typescript: '*' @@ -2438,25 +2299,25 @@ packages: minimatch: 9.0.3 muggle-string: 0.3.1 path-browserify: 1.0.1 - typescript: 5.4.2 + typescript: 5.4.3 vue-template-compiler: 2.7.16 dev: true - /@vue/language-core@2.0.6(typescript@5.4.2): - resolution: {integrity: sha512-UzqU12tzf9XLqRO3TiWPwRNpP4fyUzE6MAfOQWQNZ4jy6a30ARRUpmODDKq6O8C4goMc2AlPqTmjOHPjHkilSg==} + /@vue/language-core@2.0.7(typescript@5.4.3): + resolution: {integrity: sha512-Vh1yZX3XmYjn9yYLkjU8DN6L0ceBtEcapqiyclHne8guG84IaTzqtvizZB1Yfxm3h6m7EIvjerLO5fvOZO6IIQ==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@volar/language-core': 2.1.2 + '@volar/language-core': 2.1.5 '@vue/compiler-dom': 3.4.21 '@vue/shared': 3.4.21 computeds: 0.0.1 minimatch: 9.0.3 path-browserify: 1.0.1 - typescript: 5.4.2 + typescript: 5.4.3 vue-template-compiler: 2.7.16 dev: true @@ -2485,7 +2346,7 @@ packages: dependencies: '@vue/compiler-ssr': 3.4.21 '@vue/shared': 3.4.21 - vue: 3.4.21(typescript@5.4.2) + vue: 3.4.21(typescript@5.4.3) /@vue/shared@3.4.21: resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} @@ -3393,7 +3254,7 @@ packages: engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} dependencies: mdn-data: 2.0.30 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true /css-what@6.1.0: @@ -3685,8 +3546,8 @@ packages: jake: 10.8.7 dev: true - /element-plus@2.6.1(vue@3.4.21): - resolution: {integrity: sha512-6VRpLjwtIVdtUuITJPPKtpOH1NM6nuAkRE3q5O4Lrx0N1bYMhTkiqb2Jy7zfQuDPbOIkkF2OABTzegpNnzgsnQ==} + /element-plus@2.6.2(vue@3.4.21): + resolution: {integrity: sha512-WFMv1v83l437Xu+GeeM+ytxd9VUQpR4418BowvTVIPYItsoj6yK0ITIuSv19iCesF405FbAOaCIHXhJch0ilFA==} peerDependencies: vue: ^3.2.0 dependencies: @@ -3705,7 +3566,7 @@ packages: lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) memoize-one: 6.0.0 normalize-wheel-es: 1.2.0 - vue: 3.4.21(typescript@5.4.2) + vue: 3.4.21(typescript@5.4.3) transitivePeerDependencies: - '@vue/composition-api' dev: false @@ -3789,35 +3650,35 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: true - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 dev: true /escalade@3.1.2: @@ -3925,14 +3786,15 @@ packages: eslint: 8.57.0 dev: true - /eslint-plugin-vue@9.23.0(eslint@8.57.0): - resolution: {integrity: sha512-Bqd/b7hGYGrlV+wP/g77tjyFmp81lh5TMw0be9093X02SyelxRRfCI6/IsGq/J7Um0YwB9s0Ry0wlFyjPdmtUw==} + /eslint-plugin-vue@9.24.0(eslint@8.57.0): + resolution: {integrity: sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) eslint: 8.57.0 + globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.16 @@ -5929,15 +5791,6 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - /postcss@8.4.37: resolution: {integrity: sha512-7iB/v/r7Woof0glKLH8b1SPHrsX7uhdO+Geb41QpF/+mWZHU3uxxSlN+UXGVit1PawOYDToO+AbZzhBzWRDwbQ==} engines: {node: ^10 || ^12 || >=14} @@ -6836,7 +6689,7 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.10 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 @@ -6852,19 +6705,6 @@ packages: yn: 3.1.1 dev: true - /tsconfck@3.0.3(typescript@5.4.2): - resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} - engines: {node: ^18 || >=20} - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 5.4.2 - dev: true - /tsconfck@3.0.3(typescript@5.4.3): resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} engines: {node: ^18 || >=20} @@ -6895,16 +6735,6 @@ packages: typescript: 4.9.5 dev: true - /tsutils@3.21.0(typescript@5.4.2): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.4.2 - dev: true - /tsutils@3.21.0(typescript@5.4.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -7032,6 +6862,7 @@ packages: resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} hasBin: true + dev: true /typescript@5.4.3: resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} @@ -7159,7 +6990,7 @@ packages: minimatch: 9.0.3 resolve: 1.22.8 unplugin: 1.10.0 - vue: 3.4.21(typescript@5.4.2) + vue: 3.4.21(typescript@5.4.3) transitivePeerDependencies: - rollup - supports-color @@ -7239,7 +7070,7 @@ packages: mlly: 1.6.1 pathe: 1.1.2 picocolors: 1.0.0 - vite: 4.5.2(@types/node@20.11.30) + vite: 4.5.3(@types/node@20.11.30) transitivePeerDependencies: - '@types/node' - less @@ -7260,7 +7091,7 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) + vite: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) transitivePeerDependencies: - '@types/node' - less @@ -7272,7 +7103,7 @@ packages: - terser dev: true - /vite-plugin-dts@2.3.0(@types/node@20.11.30)(vite@4.5.2): + /vite-plugin-dts@2.3.0(@types/node@20.11.30)(vite@4.5.3): resolution: {integrity: sha512-WbJgGtsStgQhdm3EosYmIdTGbag5YQpZ3HXWUAPCDyoXI5qN6EY0V7NXq0lAmnv9hVQsvh0htbYcg0Or5Db9JQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -7288,14 +7119,14 @@ packages: kolorist: 1.8.0 magic-string: 0.29.0 ts-morph: 18.0.0 - vite: 4.5.2(@types/node@20.11.30) + vite: 4.5.3(@types/node@20.11.30) transitivePeerDependencies: - '@types/node' - rollup - supports-color dev: true - /vite-plugin-dts@3.7.3(@types/node@20.11.30)(typescript@5.4.2)(vite@5.1.6): + /vite-plugin-dts@3.7.3(@types/node@20.11.30)(typescript@5.4.3)(vite@5.2.6): resolution: {integrity: sha512-26eTlBYdpjRLWCsTJebM8vkCieE+p9gP3raf+ecDnzzK5E3FG6VE1wcy55OkRpfWWVlVvKkYFe6uvRHYWx7Nog==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -7307,19 +7138,19 @@ packages: dependencies: '@microsoft/api-extractor': 7.39.0(@types/node@20.11.30) '@rollup/pluginutils': 5.1.0 - '@vue/language-core': 1.8.27(typescript@5.4.2) + '@vue/language-core': 1.8.27(typescript@5.4.3) debug: 4.3.4 kolorist: 1.8.0 - typescript: 5.4.2 - vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) - vue-tsc: 1.8.27(typescript@5.4.2) + typescript: 5.4.3 + vite: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) + vue-tsc: 1.8.27(typescript@5.4.3) transitivePeerDependencies: - '@types/node' - rollup - supports-color dev: true - /vite-plugin-html@3.2.2(vite@5.1.6): + /vite-plugin-html@3.2.2(vite@5.2.6): resolution: {integrity: sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==} peerDependencies: vite: '>=2.0.0' @@ -7336,46 +7167,46 @@ packages: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) + vite: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) dev: true - /vite-plugin-node-polyfills@0.21.0(vite@4.5.2): + /vite-plugin-node-polyfills@0.21.0(vite@4.5.3): resolution: {integrity: sha512-Sk4DiKnmxN8E0vhgEhzLudfJQfaT8k4/gJ25xvUPG54KjLJ6HAmDKbr4rzDD/QWEY+Lwg80KE85fGYBQihEPQA==} peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 dependencies: '@rollup/plugin-inject': 5.0.5 node-stdlib-browser: 1.2.0 - vite: 4.5.2(@types/node@20.11.30) + vite: 4.5.3(@types/node@20.11.30) transitivePeerDependencies: - rollup dev: true - /vite-plugin-node-polyfills@0.21.0(vite@5.1.6): + /vite-plugin-node-polyfills@0.21.0(vite@5.2.6): resolution: {integrity: sha512-Sk4DiKnmxN8E0vhgEhzLudfJQfaT8k4/gJ25xvUPG54KjLJ6HAmDKbr4rzDD/QWEY+Lwg80KE85fGYBQihEPQA==} peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 dependencies: '@rollup/plugin-inject': 5.0.5 node-stdlib-browser: 1.2.0 - vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) + vite: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) transitivePeerDependencies: - rollup dev: true - /vite-plugin-node-polyfills@0.8.2(vite@4.5.2): + /vite-plugin-node-polyfills@0.8.2(vite@4.5.3): resolution: {integrity: sha512-amOUVWwNvcuKxfWM9vpS8sAqvew28KXyR597OHO7BXWJFxr+QX4qB3XTDhWoRivj89TIZe4JTJTZwBHtIJ3ygQ==} peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 dependencies: '@rollup/plugin-inject': 5.0.5 node-stdlib-browser: 1.2.0 - vite: 4.5.2(@types/node@20.11.30) + vite: 4.5.3(@types/node@20.11.30) transitivePeerDependencies: - rollup dev: true - /vite-plugin-static-copy@0.15.0(vite@4.5.2): + /vite-plugin-static-copy@0.15.0(vite@4.5.3): resolution: {integrity: sha512-Ww+/Ug9guV45oIfIi/lA2z8v3K+lLHV9zCJqTVO4FTdqrJoZBj68VgGBSH1fi0N4q/EHW32RsL3ympi4Wlsq5w==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -7385,10 +7216,10 @@ packages: fast-glob: 3.3.2 fs-extra: 11.2.0 picocolors: 1.0.0 - vite: 4.5.2(@types/node@20.11.30) + vite: 4.5.3(@types/node@20.11.30) dev: true - /vite-plugin-static-copy@1.0.1(vite@5.1.6): + /vite-plugin-static-copy@1.0.1(vite@5.2.6): resolution: {integrity: sha512-3eGL4mdZoPJMDBT68pv/XKIHR4MgVolStIxxv1gIBP4R8TpHn9C9EnaU0hesqlseJ4ycLGUxckFTu/jpuJXQlA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: @@ -7398,10 +7229,10 @@ packages: fast-glob: 3.3.2 fs-extra: 11.2.0 picocolors: 1.0.0 - vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) + vite: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) dev: true - /vite-tsconfig-paths@4.3.2(typescript@5.4.2)(vite@5.1.6): + /vite-tsconfig-paths@4.3.2(typescript@5.4.3)(vite@4.5.3): resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} peerDependencies: vite: '*' @@ -7411,14 +7242,14 @@ packages: dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 3.0.3(typescript@5.4.2) - vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) + tsconfck: 3.0.3(typescript@5.4.3) + vite: 4.5.3(@types/node@20.11.30) transitivePeerDependencies: - supports-color - typescript dev: true - /vite-tsconfig-paths@4.3.2(typescript@5.4.3)(vite@4.5.2): + /vite-tsconfig-paths@4.3.2(typescript@5.4.3)(vite@5.2.6): resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} peerDependencies: vite: '*' @@ -7429,14 +7260,14 @@ packages: debug: 4.3.4 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.3) - vite: 4.5.2(@types/node@20.11.30) + vite: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@4.5.2(@types/node@20.11.30): - resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} + /vite@4.5.3(@types/node@20.11.30): + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -7471,8 +7302,8 @@ packages: fsevents: 2.3.3 dev: true - /vite@5.1.6(@types/node@20.11.30)(stylus@0.63.0): - resolution: {integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==} + /vite@5.2.6(@types/node@20.11.30)(stylus@0.63.0): + resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -7500,15 +7331,15 @@ packages: optional: true dependencies: '@types/node': 20.11.30 - esbuild: 0.19.12 - postcss: 8.4.35 + esbuild: 0.20.2 + postcss: 8.4.38 rollup: 4.13.0 stylus: 0.63.0 optionalDependencies: fsevents: 2.3.3 dev: true - /vitefu@0.2.5(vite@5.1.6): + /vitefu@0.2.5(vite@5.2.6): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -7516,7 +7347,7 @@ packages: vite: optional: true dependencies: - vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) + vite: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) dev: true /vitest@0.31.4(jsdom@22.1.0): @@ -7573,7 +7404,7 @@ packages: strip-literal: 1.3.0 tinybench: 2.6.0 tinypool: 0.5.0 - vite: 4.5.2(@types/node@20.11.30) + vite: 4.5.3(@types/node@20.11.30) vite-node: 0.31.4(@types/node@20.11.30) why-is-node-running: 2.2.2 transitivePeerDependencies: @@ -7630,7 +7461,7 @@ packages: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.1.6(@types/node@20.11.30)(stylus@0.63.0) + vite: 5.2.6(@types/node@20.11.30)(stylus@0.63.0) vite-node: 1.4.0(@types/node@20.11.30)(stylus@0.63.0) why-is-node-running: 2.2.2 transitivePeerDependencies: @@ -7659,7 +7490,7 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.4.21(typescript@5.4.2) + vue: 3.4.21(typescript@5.4.3) /vue-eslint-parser@9.4.2(eslint@8.57.0): resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==} @@ -7688,7 +7519,7 @@ packages: '@intlify/core-base': 9.10.2 '@intlify/shared': 9.10.2 '@vue/devtools-api': 6.6.1 - vue: 3.4.21(typescript@5.4.2) + vue: 3.4.21(typescript@5.4.3) dev: false /vue-router@4.3.0(vue@3.4.21): @@ -7697,7 +7528,7 @@ packages: vue: ^3.2.0 dependencies: '@vue/devtools-api': 6.6.1 - vue: 3.4.21(typescript@5.4.2) + vue: 3.4.21(typescript@5.4.3) dev: false /vue-template-compiler@2.7.16: @@ -7707,45 +7538,30 @@ packages: he: 1.2.0 dev: true - /vue-tsc@1.8.27(typescript@5.4.2): + /vue-tsc@1.8.27(typescript@5.4.3): resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} hasBin: true peerDependencies: typescript: '*' dependencies: '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.4.2) + '@vue/language-core': 1.8.27(typescript@5.4.3) semver: 7.6.0 - typescript: 5.4.2 + typescript: 5.4.3 dev: true - /vue-tsc@2.0.6(typescript@5.4.2): - resolution: {integrity: sha512-kK50W4XqQL34vHRkxlRWLicrT6+F9xfgCgJ4KSmCHcytKzc1u3c94XXgI+CjmhOSxyw0krpExF7Obo7y4+0dVQ==} + /vue-tsc@2.0.7(typescript@5.4.3): + resolution: {integrity: sha512-LYa0nInkfcDBB7y8jQ9FQ4riJTRNTdh98zK/hzt4gEpBZQmf30dPhP+odzCa+cedGz6B/guvJEd0BavZaRptjg==} hasBin: true peerDependencies: typescript: '*' dependencies: - '@volar/typescript': 2.1.2 - '@vue/language-core': 2.0.6(typescript@5.4.2) + '@volar/typescript': 2.1.5 + '@vue/language-core': 2.0.7(typescript@5.4.3) semver: 7.6.0 - typescript: 5.4.2 + typescript: 5.4.3 dev: true - /vue@3.4.21(typescript@5.4.2): - resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@vue/compiler-dom': 3.4.21 - '@vue/compiler-sfc': 3.4.21 - '@vue/runtime-dom': 3.4.21 - '@vue/server-renderer': 3.4.21(vue@3.4.21) - '@vue/shared': 3.4.21 - typescript: 5.4.2 - /vue@3.4.21(typescript@5.4.3): resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} peerDependencies: @@ -7760,7 +7576,6 @@ packages: '@vue/server-renderer': 3.4.21(vue@3.4.21) '@vue/shared': 3.4.21 typescript: 5.4.3 - dev: false /w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} @@ -8004,38 +7819,17 @@ packages: commander: 9.5.0 dev: true - /zhi-blog-api@1.56.2(typescript@5.4.2): - resolution: {integrity: sha512-Nkly57hLPXvsmW6NWC0ZY70b1HTEOmblTu1eQVZAUw0lo3VcT+efhNp7e2GWaWsI2fw47LAYxDunKo116ndcYA==} - dependencies: - zhi-common: 1.31.0(typescript@5.4.2) - zhi-lib-base: 0.8.0 - transitivePeerDependencies: - - typescript - dev: false - - /zhi-blog-api@1.56.2(typescript@5.4.3): - resolution: {integrity: sha512-Nkly57hLPXvsmW6NWC0ZY70b1HTEOmblTu1eQVZAUw0lo3VcT+efhNp7e2GWaWsI2fw47LAYxDunKo116ndcYA==} - dependencies: - zhi-common: 1.31.0(typescript@5.4.3) - zhi-lib-base: 0.8.0 - transitivePeerDependencies: - - typescript - dev: false - - /zhi-common@1.31.0(typescript@5.4.2): - resolution: {integrity: sha512-s9x5e3dLhFmh514yvT1JtP7xriWMVxQ11AyIjOgx5Xo2cKcDv5b6nKDaLj2Jkvms9iwZRSinDY8y/FK3jrfbrg==} + /zhi-blog-api@1.56.4(typescript@5.4.3): + resolution: {integrity: sha512-Vn+JXNF6B7Svai+AWcp1r4aFBPPA/+ntWlwoOIKMNWlMfUfKSkrm7x4q+q3i8A2jGvkk6Cy3BWWVtqJTn9inpg==} dependencies: - js-yaml: 4.1.0 - shorthash2: 1.0.3 - transliteration: 2.3.5 - vue: 3.4.21(typescript@5.4.2) + zhi-common: 1.33.0(typescript@5.4.3) zhi-lib-base: 0.8.0 transitivePeerDependencies: - typescript dev: false - /zhi-common@1.31.0(typescript@5.4.3): - resolution: {integrity: sha512-s9x5e3dLhFmh514yvT1JtP7xriWMVxQ11AyIjOgx5Xo2cKcDv5b6nKDaLj2Jkvms9iwZRSinDY8y/FK3jrfbrg==} + /zhi-common@1.33.0(typescript@5.4.3): + resolution: {integrity: sha512-ggHVmZ/zkVIOLfAWv4vqJBZY9BZnlnBUhlOmtYoVHV35UdxI5zcvvakBRgDZxjyknikHOLot7MtYfccCCOdyKw==} dependencies: js-yaml: 4.1.0 shorthash2: 1.0.3 @@ -8054,21 +7848,11 @@ packages: resolution: {integrity: sha512-3Ky5p6KvLWpXy2tlb/JIfSEKLSe5w43PBLM6g+hNcWwpL9S62emgcpUAHzGWBbC0vlLBLungt2LOsmwAfhrZ0w==} dev: false - /zhi-siyuan-api@2.18.6(typescript@5.4.2): - resolution: {integrity: sha512-iNekK4hZwW/gpD8Jxau107oGyPcVMgjApCMtW2WiCYBWsdasM2ITgUOLXSP7Jf2YsSuNT2kA5CBcFpPrAZ05vQ==} - dependencies: - zhi-blog-api: 1.56.2(typescript@5.4.2) - zhi-common: 1.31.0(typescript@5.4.2) - zhi-lib-base: 0.8.0 - transitivePeerDependencies: - - typescript - dev: false - - /zhi-siyuan-api@2.18.6(typescript@5.4.3): - resolution: {integrity: sha512-iNekK4hZwW/gpD8Jxau107oGyPcVMgjApCMtW2WiCYBWsdasM2ITgUOLXSP7Jf2YsSuNT2kA5CBcFpPrAZ05vQ==} + /zhi-siyuan-api@2.19.1(typescript@5.4.3): + resolution: {integrity: sha512-0SjX3hyu8lVQHJ6/q95EYeu0qSr5xdLPDmhh/G8i5dqZhpnvskSPb6k9KcBvZO0N9/vZrHXPHaoVyVrx+jArYg==} dependencies: - zhi-blog-api: 1.56.2(typescript@5.4.3) - zhi-common: 1.31.0(typescript@5.4.3) + zhi-blog-api: 1.56.4(typescript@5.4.3) + zhi-common: 1.33.0(typescript@5.4.3) zhi-lib-base: 0.8.0 transitivePeerDependencies: - typescript From 86fc40038f866bbf54b972713652f5ec4f1906c5 Mon Sep 17 00:00:00 2001 From: terwer Date: Mon, 25 Mar 2024 23:47:52 +0800 Subject: [PATCH 49/67] feat: support drag upload --- libs/Universal-PicGo-Core/src/index.ts | 2 + .../src/lib/siyuanPicgoPostApi.ts | 36 +++++--- .../src/components/home/BrowserIndex.vue | 12 ++- .../src/components/home/ElectronIndex.vue | 12 ++- .../home/{ => controls}/DragUpload.vue | 90 ++++++++++--------- .../home/{ => controls}/PictureList.vue | 0 .../home/{ => controls}/UploadButton.vue | 0 .../src/composables/usePicgoUpload.ts | 24 ++--- 8 files changed, 105 insertions(+), 71 deletions(-) rename packages/picgo-plugin-app/src/components/home/{ => controls}/DragUpload.vue (62%) rename packages/picgo-plugin-app/src/components/home/{ => controls}/PictureList.vue (100%) rename packages/picgo-plugin-app/src/components/home/{ => controls}/UploadButton.vue (100%) diff --git a/libs/Universal-PicGo-Core/src/index.ts b/libs/Universal-PicGo-Core/src/index.ts index 9309e56..2d9de13 100644 --- a/libs/Universal-PicGo-Core/src/index.ts +++ b/libs/Universal-PicGo-Core/src/index.ts @@ -17,10 +17,12 @@ import { IUploaderConfigListItem, IPluginConfig, } from "./types" +import { isFileOrBlob } from "./utils/common" export { UniversalPicGo, ExternalPicgo, eventBus } export { ConfigDb, PluginLoaderDb, ExternalPicgoConfigDb } export { PicgoTypeEnum, IBusEvent } +export { isFileOrBlob } export { win, currentWin, parentWin, hasNodeEnv } export { type IPicGo, diff --git a/libs/zhi-siyuan-picgo/src/lib/siyuanPicgoPostApi.ts b/libs/zhi-siyuan-picgo/src/lib/siyuanPicgoPostApi.ts index 548431e..6657169 100644 --- a/libs/zhi-siyuan-picgo/src/lib/siyuanPicgoPostApi.ts +++ b/libs/zhi-siyuan-picgo/src/lib/siyuanPicgoPostApi.ts @@ -18,6 +18,7 @@ import { SiyuanConfig, SiyuanKernelApi } from "zhi-siyuan-api" import { ImageParser } from "./parser/ImageParser" import { PicgoPostResult } from "./models/PicgoPostResult" import { DeviceDetection, DeviceTypeEnum, SiyuanDevice } from "zhi-device" +import { isFileOrBlob } from "universal-picgo" /** * Picgo与文章交互的通用方法 @@ -247,25 +248,34 @@ class SiyuanPicgoPostApi { } let imageFullPath: string - if (this.isSiyuanOrSiyuanNewWin) { - const win = SiyuanDevice.siyuanWindow() - const dataDir: string = win.siyuan.config.system.dataDir - imageFullPath = `${dataDir}/assets/${imageItem.name}` - this.logger.info(`Will upload picture from ${imageFullPath}, imageItem =>`, imageItem) - - const fs = win.require("fs") - if (!fs.existsSync(imageFullPath)) { + // blob 或者 file 直接上传 + if (isFileOrBlob(imageItem.url)) { + imageFullPath = imageItem.url + } else { + if (this.isSiyuanOrSiyuanNewWin) { + // 如果是路径解析路径 + const win = SiyuanDevice.siyuanWindow() + const dataDir: string = win.siyuan.config.system.dataDir + imageFullPath = `${dataDir}/assets/${imageItem.name}` + this.logger.info(`Will upload picture from ${imageFullPath}, imageItem =>`, imageItem) + + const fs = win.require("fs") + if (!fs.existsSync(imageFullPath)) { + // 路径不存在直接上传 + imageFullPath = imageItem.url + } + } else { + // 浏览器环境直接上传 imageFullPath = imageItem.url } - } else { - imageFullPath = imageItem.url } + this.logger.warn("isSiyuanOrSiyuanNewWin=>" + this.isSiyuanOrSiyuanNewWin + ", imageFullPath=>", imageFullPath) filePaths.push(imageFullPath) // 批量上传 const imageJson: any = await this.picgoApi.upload(filePaths) - this.logger.warn("图片上传完成,imageJson=>", imageJson) + this.logger.debug("图片上传完成,imageJson=>", imageJson) const imageJsonObj = JsonUtil.safeParse(imageJson, []) as any // 处理后续 if (imageJsonObj && imageJsonObj.length > 0) { @@ -281,12 +291,14 @@ class SiyuanPicgoPostApi { throw new Error("图片上传失败,可能原因:PicGO配置错误,请检查配置。请打开picgo.log查看更多信息") } - this.logger.warn("newFileMap=>", fileMap) + this.logger.debug("newFileMap=>", fileMap) const newFileMapStr = JSON.stringify(fileMap) await this.siyuanApi.setBlockAttrs(pageId, { [SIYUAN_PICGO_FILE_MAP_KEY]: newFileMapStr, }) + + return imageJsonObj } // =================================================================================================================== diff --git a/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue b/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue index ffb80d4..daa6845 100644 --- a/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue +++ b/packages/picgo-plugin-app/src/components/home/BrowserIndex.vue @@ -12,12 +12,12 @@ import { ref } from "vue" import { useVueI18n } from "$composables/useVueI18n.ts" import MaterialSymbolsImageSearchRounded from "~icons/material-symbols/image-search-rounded" import MaterialSymbolsSettingsAccountBoxOutlineSharp from "~icons/material-symbols/settings-account-box-outline-sharp" -import DragUpload from "$components/home/DragUpload.vue" +import DragUpload from "$components/home/controls/DragUpload.vue" import { useRouter } from "vue-router" -import PictureList from "$components/home/PictureList.vue" +import PictureList from "$components/home/controls/PictureList.vue" import { usePicgoCommon } from "$composables/usePicgoCommon.ts" import { BrowserUtil } from "zhi-device" -import UploadButton from "$components/home/UploadButton.vue" +import UploadButton from "$components/home/controls/UploadButton.vue" const { t } = useVueI18n() const { picgoCommonData, picgoCommonMethods } = usePicgoCommon() @@ -49,7 +49,11 @@ const handleTabClick = async (pane: any, ev: Event) => {
- +
diff --git a/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue b/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue index 4ef9555..18e839d 100644 --- a/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue +++ b/packages/picgo-plugin-app/src/components/home/ElectronIndex.vue @@ -8,15 +8,15 @@ -->