diff --git a/package.json b/package.json index 292475d..51da605 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/cli", - "version": "0.0.99", + "version": "0.1.0", "description": "envision 命令行工具", "type": "module", "basename": "/root/cli", @@ -48,8 +48,8 @@ "@kevisual/app": "^0.0.2", "@kevisual/auth": "^2.0.3", "@kevisual/context": "^0.0.4", - "@kevisual/use-config": "^1.0.28", - "@opencode-ai/sdk": "^1.1.44", + "@kevisual/use-config": "^1.0.30", + "@opencode-ai/sdk": "^1.1.48", "@types/busboy": "^1.5.4", "busboy": "^1.6.0", "eventemitter3": "^5.0.4", @@ -62,19 +62,20 @@ "unstorage": "^1.17.4" }, "devDependencies": { + "@kevisual/api": "^0.0.42", "@kevisual/dts": "^0.0.3", "@kevisual/load": "^0.0.6", "@kevisual/logger": "^0.0.4", - "@kevisual/query": "0.0.38", + "@kevisual/query": "0.0.39", "@kevisual/query-login": "0.0.7", "@types/bun": "^1.3.8", "@types/crypto-js": "^4.2.2", "@types/jsonwebtoken": "^9.0.10", "@types/micromatch": "^4.0.10", - "@types/node": "^25.1.0", + "@types/node": "^25.2.0", "@types/semver": "^7.7.1", "chalk": "^5.6.2", - "commander": "^14.0.2", + "commander": "^14.0.3", "crypto-js": "^4.2.0", "fast-glob": "^3.3.3", "filesize": "^11.0.13", @@ -83,7 +84,7 @@ "jsonwebtoken": "^9.0.3", "pm2": "^6.0.14", "tar": "^7.5.7", - "zustand": "^5.0.10" + "zustand": "^5.0.11" }, "engines": { "node": ">=22.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d9c8f2..c12dda3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@inquirer/prompts': specifier: ^8.2.0 - version: 8.2.0(@types/node@25.1.0) + version: 8.2.0(@types/node@25.2.0) '@kevisual/app': specifier: ^0.0.2 version: 0.0.2(dotenv@17.2.3) @@ -21,11 +21,11 @@ importers: specifier: ^0.0.4 version: 0.0.4 '@kevisual/use-config': - specifier: ^1.0.28 - version: 1.0.28(dotenv@17.2.3) + specifier: ^1.0.30 + version: 1.0.30(dotenv@17.2.3) '@opencode-ai/sdk': - specifier: ^1.1.44 - version: 1.1.44 + specifier: ^1.1.48 + version: 1.1.48 '@types/busboy': specifier: ^1.5.4 version: 1.5.4 @@ -57,6 +57,9 @@ importers: specifier: ^1.17.4 version: 1.17.4(idb-keyval@6.2.2) devDependencies: + '@kevisual/api': + specifier: ^0.0.42 + version: 0.0.42 '@kevisual/dts': specifier: ^0.0.3 version: 0.0.3(typescript@5.8.2) @@ -67,11 +70,11 @@ importers: specifier: ^0.0.4 version: 0.0.4 '@kevisual/query': - specifier: 0.0.38 - version: 0.0.38 + specifier: 0.0.39 + version: 0.0.39 '@kevisual/query-login': specifier: 0.0.7 - version: 0.0.7(@kevisual/query@0.0.38) + version: 0.0.7(@kevisual/query@0.0.39) '@types/bun': specifier: ^1.3.8 version: 1.3.8 @@ -85,8 +88,8 @@ importers: specifier: ^4.0.10 version: 4.0.10 '@types/node': - specifier: ^25.1.0 - version: 25.1.0 + specifier: ^25.2.0 + version: 25.2.0 '@types/semver': specifier: ^7.7.1 version: 7.7.1 @@ -94,8 +97,8 @@ importers: specifier: ^5.6.2 version: 5.6.2 commander: - specifier: ^14.0.2 - version: 14.0.2 + specifier: ^14.0.3 + version: 14.0.3 crypto-js: specifier: ^4.2.0 version: 4.2.0 @@ -118,8 +121,8 @@ importers: specifier: ^7.5.7 version: 7.5.7 zustand: - specifier: ^5.0.10 - version: 5.0.10(@types/react@19.2.10)(react@19.2.4) + specifier: ^5.0.11 + version: 5.0.11(@types/react@19.2.10)(react@19.2.4) assistant: dependencies: @@ -252,16 +255,16 @@ importers: dependencies: '@astrojs/mdx': specifier: ^4.3.13 - version: 4.3.13(astro@5.16.15(@types/node@25.1.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2)) + version: 4.3.13(astro@5.16.15(@types/node@25.2.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2)) '@astrojs/react': specifier: ^4.4.2 - version: 4.4.2(@types/node@25.1.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 4.4.2(@types/node@25.2.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@astrojs/sitemap': specifier: ^3.7.0 version: 3.7.0 '@astrojs/vue': specifier: ^5.1.4 - version: 5.1.4(@types/node@25.1.0)(astro@5.16.15(@types/node@25.1.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(vue@3.5.27(typescript@5.8.2)) + version: 5.1.4(@types/node@25.2.0)(astro@5.16.15(@types/node@25.2.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(vue@3.5.27(typescript@5.8.2)) '@kevisual/api': specifier: ^0.0.28 version: 0.0.28 @@ -285,7 +288,7 @@ importers: version: 1.2.4(@types/react@19.2.10)(react@19.2.4) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)) + version: 4.1.18(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)) '@uiw/react-md-editor': specifier: ^4.0.11 version: 4.0.11(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -294,7 +297,7 @@ importers: version: 6.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) astro: specifier: ^5.16.15 - version: 5.16.15(@types/node@25.1.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) + version: 5.16.15(@types/node@25.2.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -1306,6 +1309,9 @@ packages: '@kevisual/api@0.0.35': resolution: {integrity: sha512-NbaOasecbG+O9Ju2/LWC2eWeqcPc5yZYXXyT4vHpU2W5SoPzBf7H3W7+i3py/JcEXF6adcHZVofftCYpecmGMQ==} + '@kevisual/api@0.0.42': + resolution: {integrity: sha512-Bn5G+ZzGEPoJdvd5U3xWHGY0oidQj23gt1YAWvTqjm0frDJfJ4Q2WT9Xjb1ZdJ/YBcfaNe9yEoMCpFNdUls/mw==} + '@kevisual/app@0.0.1': resolution: {integrity: sha512-PEx8P3l0iNSqrz9Ib9kVCYfqNMX6/LfNu+cEafmY6ECP1cV5Vmv+TH2fuasMosKjtbH2fAdDi97sbd29tdEK+g==} @@ -1369,6 +1375,9 @@ packages: '@kevisual/query@0.0.38': resolution: {integrity: sha512-bfvbSodsZyMfwY+1T2SvDeOCKsT/AaIxlVe0+B1R/fNhlg2MDq2CP0L9HKiFkEm+OXrvXcYDMKPUituVUM5J6Q==} + '@kevisual/query@0.0.39': + resolution: {integrity: sha512-3UEPBIvtdykNkrby3hvrgrHdgd17Uq+Pnr4zs+JBzATkU2eKaOqtTUJqdyIEwuySCwzGTxrnlUzWP4tziDQDLQ==} + '@kevisual/registry@0.0.1': resolution: {integrity: sha512-//OHu9m4JDrMjgP8o8dcjZd3D3IAUkRVlkTSviouZEH7r5m7mccA3Hvzw0XJ/lelx6exC6LWsyv6c4uV0Dp+gw==} @@ -1392,6 +1401,11 @@ packages: peerDependencies: dotenv: ^17 + '@kevisual/use-config@1.0.30': + resolution: {integrity: sha512-kPdna0FW/X7D600aMdiZ5UTjbCo6d8d4jjauSc8RMmBwUU6WliFDSPUNKVpzm2BsDX5Nth1IXFPYMqH+wxqAmw==} + peerDependencies: + dotenv: ^17 + '@kevisual/video-tools@0.0.13': resolution: {integrity: sha512-bbAMTQznmlm70csVX5nQTeV+TsZw4BohYoYxcUsCi/slKZry2pWQaJgN3uKT0ovkZzLp1bogBEcBHmeP3wxXiw==} @@ -1455,12 +1469,12 @@ packages: '@opencode-ai/plugin@1.1.47': resolution: {integrity: sha512-gNMPz72altieDfLhUw3VAT1xbduKi3w3wZ57GLeS7qU9W474HdvdIiLBnt2Xq3U7Ko0/0tvK3nzCker6IIDqmQ==} - '@opencode-ai/sdk@1.1.44': - resolution: {integrity: sha512-coQgtSSCbY46/GY+M5zG0rChiLSJWSjPERRt5L1hbjvDWvErelVV0ILPbd1+3CwJLFTedBYgotby2TcO8U0IfQ==} - '@opencode-ai/sdk@1.1.47': resolution: {integrity: sha512-s3PBHwk1sP6Zt/lJxIWSBWZ1TnrI1nFxSP97LCODUytouAQgbygZ1oDH7O2sGMBEuGdA8B1nNSPla0aRSN3IpA==} + '@opencode-ai/sdk@1.1.48': + resolution: {integrity: sha512-j5/79X45fUPWVD2Ffm/qvwLclDCdPeV+TYMDrm9to0p4pmzhmeKevCsyiRdLg0o0HE3AFRUnOo2rdO9NetN79A==} + '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} @@ -2391,6 +2405,9 @@ packages: '@types/node@25.1.0': resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==} + '@types/node@25.2.0': + resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==} + '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} @@ -2414,6 +2431,9 @@ packages: '@types/send@1.2.1': resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + '@types/spark-md5@3.0.5': + resolution: {integrity: sha512-lWf05dnD42DLVKQJZrDHtWFidcLrHuip01CtnC2/S6AMhX4t9ZlEUj4iuRlAnts0PQk7KESOqKxeGE/b6sIPGg==} + '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -2793,10 +2813,6 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} - engines: {node: '>=20'} - commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -4593,6 +4609,9 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spark-md5@3.0.2: + resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} + speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} @@ -5120,6 +5139,24 @@ packages: use-sync-external-store: optional: true + zustand@5.0.11: + resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -5203,12 +5240,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.13(astro@5.16.15(@types/node@25.1.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))': + '@astrojs/mdx@4.3.13(astro@5.16.15(@types/node@25.2.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))': dependencies: '@astrojs/markdown-remark': 6.3.10 '@mdx-js/mdx': 3.1.1 acorn: 8.15.0 - astro: 5.16.15(@types/node@25.1.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) + astro: 5.16.15(@types/node@25.2.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -5226,15 +5263,15 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/react@4.4.2(@types/node@25.1.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@astrojs/react@4.4.2(@types/node@25.2.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)) + '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) ultrahtml: 1.6.0 - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) transitivePeerDependencies: - '@types/node' - jiti @@ -5267,14 +5304,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/vue@5.1.4(@types/node@25.1.0)(astro@5.16.15(@types/node@25.1.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(vue@3.5.27(typescript@5.8.2))': + '@astrojs/vue@5.1.4(@types/node@25.2.0)(astro@5.16.15(@types/node@25.2.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(vue@3.5.27(typescript@5.8.2))': dependencies: - '@vitejs/plugin-vue': 5.2.4(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) - '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) + '@vitejs/plugin-vue': 5.2.4(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) + '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) '@vue/compiler-sfc': 3.5.27 - astro: 5.16.15(@types/node@25.1.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) - vite-plugin-vue-devtools: 7.7.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) + astro: 5.16.15(@types/node@25.2.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite-plugin-vue-devtools: 7.7.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) vue: 3.5.27(typescript@5.8.2) transitivePeerDependencies: - '@nuxt/kit' @@ -6286,6 +6323,15 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/checkbox@5.0.4(@types/node@25.2.0)': + dependencies: + '@inquirer/ansi': 2.0.3 + '@inquirer/core': 11.1.1(@types/node@25.2.0) + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@25.2.0) + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/confirm@6.0.4(@types/node@25.1.0)': dependencies: '@inquirer/core': 11.1.1(@types/node@25.1.0) @@ -6293,6 +6339,13 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/confirm@6.0.4(@types/node@25.2.0)': + dependencies: + '@inquirer/core': 11.1.1(@types/node@25.2.0) + '@inquirer/type': 4.0.3(@types/node@25.2.0) + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/core@11.1.1(@types/node@25.1.0)': dependencies: '@inquirer/ansi': 2.0.3 @@ -6305,6 +6358,18 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/core@11.1.1(@types/node@25.2.0)': + dependencies: + '@inquirer/ansi': 2.0.3 + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@25.2.0) + cli-width: 4.1.0 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + wrap-ansi: 9.0.2 + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/editor@5.0.4(@types/node@25.1.0)': dependencies: '@inquirer/core': 11.1.1(@types/node@25.1.0) @@ -6313,6 +6378,14 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/editor@5.0.4(@types/node@25.2.0)': + dependencies: + '@inquirer/core': 11.1.1(@types/node@25.2.0) + '@inquirer/external-editor': 2.0.3(@types/node@25.2.0) + '@inquirer/type': 4.0.3(@types/node@25.2.0) + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/expand@5.0.4(@types/node@25.1.0)': dependencies: '@inquirer/core': 11.1.1(@types/node@25.1.0) @@ -6320,6 +6393,13 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/expand@5.0.4(@types/node@25.2.0)': + dependencies: + '@inquirer/core': 11.1.1(@types/node@25.2.0) + '@inquirer/type': 4.0.3(@types/node@25.2.0) + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/external-editor@2.0.3(@types/node@25.1.0)': dependencies: chardet: 2.1.1 @@ -6327,6 +6407,13 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/external-editor@2.0.3(@types/node@25.2.0)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/figures@2.0.3': {} '@inquirer/input@5.0.4(@types/node@25.1.0)': @@ -6336,6 +6423,13 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/input@5.0.4(@types/node@25.2.0)': + dependencies: + '@inquirer/core': 11.1.1(@types/node@25.2.0) + '@inquirer/type': 4.0.3(@types/node@25.2.0) + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/number@4.0.4(@types/node@25.1.0)': dependencies: '@inquirer/core': 11.1.1(@types/node@25.1.0) @@ -6343,6 +6437,13 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/number@4.0.4(@types/node@25.2.0)': + dependencies: + '@inquirer/core': 11.1.1(@types/node@25.2.0) + '@inquirer/type': 4.0.3(@types/node@25.2.0) + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/password@5.0.4(@types/node@25.1.0)': dependencies: '@inquirer/ansi': 2.0.3 @@ -6351,6 +6452,14 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/password@5.0.4(@types/node@25.2.0)': + dependencies: + '@inquirer/ansi': 2.0.3 + '@inquirer/core': 11.1.1(@types/node@25.2.0) + '@inquirer/type': 4.0.3(@types/node@25.2.0) + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/prompts@8.2.0(@types/node@25.1.0)': dependencies: '@inquirer/checkbox': 5.0.4(@types/node@25.1.0) @@ -6366,6 +6475,21 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/prompts@8.2.0(@types/node@25.2.0)': + dependencies: + '@inquirer/checkbox': 5.0.4(@types/node@25.2.0) + '@inquirer/confirm': 6.0.4(@types/node@25.2.0) + '@inquirer/editor': 5.0.4(@types/node@25.2.0) + '@inquirer/expand': 5.0.4(@types/node@25.2.0) + '@inquirer/input': 5.0.4(@types/node@25.2.0) + '@inquirer/number': 4.0.4(@types/node@25.2.0) + '@inquirer/password': 5.0.4(@types/node@25.2.0) + '@inquirer/rawlist': 5.2.0(@types/node@25.2.0) + '@inquirer/search': 4.1.0(@types/node@25.2.0) + '@inquirer/select': 5.0.4(@types/node@25.2.0) + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/rawlist@5.2.0(@types/node@25.1.0)': dependencies: '@inquirer/core': 11.1.1(@types/node@25.1.0) @@ -6373,6 +6497,13 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/rawlist@5.2.0(@types/node@25.2.0)': + dependencies: + '@inquirer/core': 11.1.1(@types/node@25.2.0) + '@inquirer/type': 4.0.3(@types/node@25.2.0) + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/search@4.1.0(@types/node@25.1.0)': dependencies: '@inquirer/core': 11.1.1(@types/node@25.1.0) @@ -6381,6 +6512,14 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/search@4.1.0(@types/node@25.2.0)': + dependencies: + '@inquirer/core': 11.1.1(@types/node@25.2.0) + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@25.2.0) + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/select@5.0.4(@types/node@25.1.0)': dependencies: '@inquirer/ansi': 2.0.3 @@ -6390,10 +6529,23 @@ snapshots: optionalDependencies: '@types/node': 25.1.0 + '@inquirer/select@5.0.4(@types/node@25.2.0)': + dependencies: + '@inquirer/ansi': 2.0.3 + '@inquirer/core': 11.1.1(@types/node@25.2.0) + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@25.2.0) + optionalDependencies: + '@types/node': 25.2.0 + '@inquirer/type@4.0.3(@types/node@25.1.0)': optionalDependencies: '@types/node': 25.1.0 + '@inquirer/type@4.0.3(@types/node@25.2.0)': + optionalDependencies: + '@types/node': 25.2.0 + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.2 @@ -6450,13 +6602,25 @@ snapshots: nanoid: 5.1.6 path-browserify-esm: 1.0.6 + '@kevisual/api@0.0.42': + dependencies: + '@kevisual/js-filter': 0.0.5 + '@kevisual/load': 0.0.6 + '@types/spark-md5': 3.0.5 + es-toolkit: 1.44.0 + eventemitter3: 5.0.4 + fuse.js: 7.1.0 + nanoid: 5.1.6 + path-browserify-esm: 1.0.6 + spark-md5: 3.0.2 + '@kevisual/app@0.0.1(dotenv@17.2.3)': dependencies: '@kevisual/ai': 0.0.19 '@kevisual/context': 0.0.4 '@kevisual/query': 0.0.31 '@kevisual/router': 0.0.36 - '@kevisual/use-config': 1.0.28(dotenv@17.2.3) + '@kevisual/use-config': 1.0.30(dotenv@17.2.3) mitt: 3.0.1 transitivePeerDependencies: - dotenv @@ -6468,7 +6632,7 @@ snapshots: '@kevisual/context': 0.0.4 '@kevisual/query': 0.0.32 '@kevisual/router': 0.0.39 - '@kevisual/use-config': 1.0.28(dotenv@17.2.3) + '@kevisual/use-config': 1.0.30(dotenv@17.2.3) mitt: 3.0.1 nanoid: 5.1.6 transitivePeerDependencies: @@ -6491,7 +6655,7 @@ snapshots: dependencies: '@kevisual/query': 0.0.38 '@kevisual/router': 0.0.64(typescript@5.8.2) - '@kevisual/use-config': 1.0.28(dotenv@17.2.3) + '@kevisual/use-config': 1.0.30(dotenv@17.2.3) es-toolkit: 1.44.0 nanoid: 5.1.6 unstorage: 1.17.4(idb-keyval@6.2.2) @@ -6594,6 +6758,12 @@ snapshots: '@kevisual/query': 0.0.38 dotenv: 17.2.3 + '@kevisual/query-login@0.0.7(@kevisual/query@0.0.39)': + dependencies: + '@kevisual/cache': 0.0.3 + '@kevisual/query': 0.0.39 + dotenv: 17.2.3 + '@kevisual/query@0.0.31': {} '@kevisual/query@0.0.32': {} @@ -6602,6 +6772,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@kevisual/query@0.0.39': + dependencies: + tslib: 2.8.1 + '@kevisual/registry@0.0.1(typescript@5.8.2)': dependencies: class-variance-authority: 0.7.1 @@ -6658,12 +6832,17 @@ snapshots: '@kevisual/load': 0.0.6 dotenv: 17.2.3 + '@kevisual/use-config@1.0.30(dotenv@17.2.3)': + dependencies: + '@kevisual/load': 0.0.6 + dotenv: 17.2.3 + '@kevisual/video-tools@0.0.13(dotenv@17.2.3)(supports-color@10.2.2)': dependencies: '@gradio/client': 2.0.1 '@kevisual/ai': 0.0.19 '@kevisual/router': 0.0.51(supports-color@10.2.2) - '@kevisual/use-config': 1.0.28(dotenv@17.2.3) + '@kevisual/use-config': 1.0.30(dotenv@17.2.3) '@kevisual/video': 0.0.2 crypto-js: 4.2.0 dayjs: 1.11.19 @@ -6769,10 +6948,10 @@ snapshots: '@opencode-ai/sdk': 1.1.47 zod: 4.1.8 - '@opencode-ai/sdk@1.1.44': {} - '@opencode-ai/sdk@1.1.47': {} + '@opencode-ai/sdk@1.1.48': {} + '@oslojs/encoding@1.1.0': {} '@peculiar/asn1-cms@2.6.0': @@ -7825,12 +8004,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2))': + '@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -7863,7 +8042,7 @@ snapshots: '@types/busboy@1.5.4': dependencies: - '@types/node': 25.1.0 + '@types/node': 25.2.0 '@types/crypto-js@4.2.2': {} @@ -7888,7 +8067,7 @@ snapshots: '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 0.7.34 - '@types/node': 25.1.0 + '@types/node': 25.2.0 '@types/mdast@4.0.4': dependencies: @@ -7912,6 +8091,10 @@ snapshots: dependencies: undici-types: 7.16.0 + '@types/node@25.2.0': + dependencies: + undici-types: 7.16.0 + '@types/prismjs@1.26.5': {} '@types/react-dom@19.2.3(@types/react@19.2.10)': @@ -7926,13 +8109,15 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 25.1.0 + '@types/node': 25.2.0 '@types/semver@7.7.1': {} '@types/send@1.2.1': dependencies: - '@types/node': 25.1.0 + '@types/node': 25.2.0 + + '@types/spark-md5@3.0.5': {} '@types/trusted-types@2.0.7': {} @@ -7942,7 +8127,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.1.0 + '@types/node': 25.2.0 '@uiw/copy-to-clipboard@1.0.19': {} @@ -7981,7 +8166,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -7989,24 +8174,24 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.2.0(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': + '@vitejs/plugin-vue-jsx@4.2.0(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@rolldown/pluginutils': 1.0.0-beta.55 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) vue: 3.5.27(typescript@5.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': + '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': dependencies: - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) vue: 3.5.27(typescript@5.8.2) '@vue/babel-helper-vue-transform-on@1.5.0': {} @@ -8068,14 +8253,14 @@ snapshots: '@vue/compiler-dom': 3.5.27 '@vue/shared': 3.5.27 - '@vue/devtools-core@7.7.9(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': + '@vue/devtools-core@7.7.9(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2))': dependencies: '@vue/devtools-kit': 7.7.9 '@vue/devtools-shared': 7.7.9 mitt: 3.0.1 nanoid: 5.1.6 pathe: 2.0.3 - vite-hot-client: 2.1.0(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)) + vite-hot-client: 2.1.0(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)) vue: 3.5.27(typescript@5.8.2) transitivePeerDependencies: - vite @@ -8241,7 +8426,7 @@ snapshots: astring@1.9.0: {} - astro@5.16.15(@types/node@25.1.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2): + astro@5.16.15(@types/node@25.2.0)(idb-keyval@6.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.43.0)(typescript@5.8.2): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -8298,8 +8483,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.17.4(idb-keyval@6.2.2) vfile: 6.0.3 - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -8402,7 +8587,7 @@ snapshots: bun-types@1.3.8: dependencies: - '@types/node': 25.1.0 + '@types/node': 25.2.0 bundle-name@4.1.0: dependencies: @@ -8504,8 +8689,6 @@ snapshots: commander@11.1.0: {} - commander@14.0.2: {} - commander@14.0.3: {} commander@2.15.1: {} @@ -10793,6 +10976,8 @@ snapshots: space-separated-tokens@2.0.2: {} + spark-md5@3.0.2: {} + speakingurl@14.0.1: {} sprintf-js@1.1.2: {} @@ -11063,11 +11248,11 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-hot-client@2.1.0(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)): + vite-hot-client@2.1.0(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)): dependencies: - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) - vite-plugin-inspect@0.8.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)): + vite-plugin-inspect@0.8.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.3.0(rollup@4.43.0) @@ -11078,28 +11263,28 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.2 - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) transitivePeerDependencies: - rollup - supports-color - vite-plugin-vue-devtools@7.7.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)): + vite-plugin-vue-devtools@7.7.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)): dependencies: - '@vue/devtools-core': 7.7.9(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) + '@vue/devtools-core': 7.7.9(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27(typescript@5.8.2)) '@vue/devtools-kit': 7.7.9 '@vue/devtools-shared': 7.7.9 execa: 9.6.1 sirv: 3.0.2 - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) - vite-plugin-inspect: 0.8.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)) - vite-plugin-vue-inspector: 5.3.2(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite-plugin-inspect: 0.8.9(rollup@4.43.0)(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)) + vite-plugin-vue-inspector: 5.3.2(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.3.2(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)): + vite-plugin-vue-inspector@5.3.2(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)): dependencies: '@babel/core': 7.28.5 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) @@ -11110,11 +11295,11 @@ snapshots: '@vue/compiler-dom': 3.5.27 kolorist: 1.8.0 magic-string: 0.30.21 - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) transitivePeerDependencies: - supports-color - vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2): + vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -11123,14 +11308,14 @@ snapshots: rollup: 4.43.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.1.0 + '@types/node': 25.2.0 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 - vitefu@1.1.1(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)): + vitefu@1.1.1(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)): optionalDependencies: - vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2) vizion@2.2.1: dependencies: @@ -11222,4 +11407,9 @@ snapshots: '@types/react': 19.2.10 react: 19.2.4 + zustand@5.0.11(@types/react@19.2.10)(react@19.2.4): + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + zwitch@2.0.4: {} diff --git a/src/command/deploy.ts b/src/command/deploy.ts index 3320055..fbf9ef7 100644 --- a/src/command/deploy.ts +++ b/src/command/deploy.ts @@ -7,9 +7,10 @@ import { getBaseURL, query, storage } from '@/module/query.ts'; import { input, confirm } from '@inquirer/prompts'; import chalk from 'chalk'; import { upload } from '@/module/download/upload.ts'; -import { getHash } from '@/uitls/hash.ts'; +import { getBufferHash, getHash } from '@/uitls/hash.ts'; import { queryAppVersion } from '@/query/app-manager/query-app.ts'; import { logger } from '@/module/logger.ts'; +import { getUsername } from './login.ts'; /** * 获取package.json 中的 basename, version, user, appKey * @returns @@ -44,13 +45,11 @@ const command = new Command('deploy') .option('-o, --org ', 'org') .option('-u, --update', 'load current app. set current version in product。 redis 缓存更新') .option('-s, --showBackend', 'show backend url, 部署的后端应用,显示执行的cli命令') - .option('-c, --noCheck', '是否受app manager控制的模块。默认检测') .option('-d, --dot', '是否上传隐藏文件') .option('--dir, --directory ', '上传的默认路径') .action(async (filePath, options) => { try { let { version, key, yes, update, org, showBackend } = options; - const noCheck = !options.noCheck; const dot = !!options.dot; const pkgInfo = getPackageJson({ version, appKey: key }); if (!version && pkgInfo?.version) { @@ -109,18 +108,30 @@ const command = new Command('deploy') return; } } + let username = ''; + if (pkgInfo?.user) { + username = pkgInfo.user; + } else if (org) { + username = org; + } else { + const me = await getUsername(); + if (me) { + username = me; + } else { + logger.error('无法获取用户名,请使用先登录'); + return; + } + } const uploadDirectory = isDirectory ? directory : path.dirname(directory); - const res = await uploadFiles(_relativeFiles, uploadDirectory, { key, version, username: org, noCheckAppFiles: !noCheck, directory: options.directory }); + const res = await uploadFilesV2(_relativeFiles, uploadDirectory, { key, version, username: username, directory: options.directory }); logger.debug('upload res', res); if (res?.code === 200) { - res.data?.upload?.map?.((d) => { - console.log(chalk.green('uploaded file', d?.name, d?.path)); - }); const res2 = await queryAppVersion({ key: key, version: version, + create: true }); - logger.debug('queryAppVersion res', res2); + logger.debug('queryAppVersion res', res2, key, version); if (res2.code !== 200) { console.error(chalk.red('查询应用版本失败'), res2.message, key); return; @@ -145,7 +156,6 @@ const command = new Command('deploy') } else { console.error('File upload failed', res?.message); } - return res; } catch (error) { console.error('error', error); } @@ -154,88 +164,65 @@ const command = new Command('deploy') type UploadFileOptions = { key: string; version: string; - username?: string; - noCheckAppFiles?: boolean; + username: string; directory?: string; }; -const uploadFiles = async (files: string[], directory: string, opts: UploadFileOptions): Promise => { + +export const uploadFilesV2 = async (files: string[], directory: string, opts: UploadFileOptions): Promise => { const { key, version, username } = opts || {}; - const form = new FormData(); - const data: Record = { files: [] }; - let description = ''; - for (const file of files) { + + for (let i = 0; i < files.length; i++) { + const file = files[i]; const filePath = path.join(directory, file); - const hash = getHash(filePath); - if (!hash) { - logger.error('文件', filePath, '不存在'); - logger.error('请检查文件是否存在'); - } - data.files.push({ path: file, hash: hash }); - if (filePath.includes('readme.md')) { - description = fs.readFileSync(filePath, 'utf-8'); - } - } - data.appKey = key; - data.version = version; - form.append('appKey', key); - form.append('version', version); - if (username) { - form.append('username', username); - data.username = username; - } - if (opts?.directory) { - form.append('directory', opts.directory); - data.directory = opts.directory; - } - const token = await storage.getItem('token'); - const checkUrl = new URL('/api/s1/resources/upload/check', getBaseURL()); - const res = await query.adapter({ url: checkUrl.toString(), method: 'POST', body: data, headers: { Authorization: 'Bearer ' + token } }).then((res) => { - try { - if (typeof res === 'string') { - return JSON.parse(res); - } else { - return res; - } - } catch (error) { - return typeof res === 'string' ? {} : res; - } - }); - const checkData: { path: string; isUpload: boolean }[] = res.data; - if (res.code !== 200) { - console.error('check failed', res); - return res; - } - let needUpload = false; - for (const file of files) { - const filePath = path.join(directory, file); - const check = checkData.find((d) => d.path === file); - if (check?.isUpload) { - logger.debug('文件已经上传过了', file); - continue; - } + logger.info('[上传进度]', `${i + 1}/${files.length}`, file); + const form = new FormData(); const filename = path.basename(filePath); - logger.debug('upload file', file, filename); // 解决 busbox 文件名乱码: 将 UTF-8 编码的文件名转换为 binary 字符串 const encodedFilename = Buffer.from(filename, 'utf-8').toString('binary'); form.append('file', fs.createReadStream(filePath), { filename: encodedFilename, filepath: file, }); - needUpload = true; + const _baseURL = getBaseURL(); + const url = new URL(`/${username}/resources/${key}/${version}/${file}`, _baseURL); + // console.log('upload file', file, filePath); + const token = await storage.getItem('token'); + const check = () => { + const checkUrl = new URL(url.toString()); + checkUrl.searchParams.set('stat', '1'); + const res = query + .adapter({ url: checkUrl.toString(), method: 'GET', headers: { Authorization: 'Bearer ' + token } }) + return res; + } + const checkRes = await check(); + let needUpload = false; + let hash = ''; + if (checkRes?.code === 404) { + needUpload = true; + hash = getHash(filePath); + } else if (checkRes?.code === 200) { + const etag = checkRes?.data?.etag; + hash = getHash(filePath); + if (etag !== hash) { + needUpload = true; + } + } + if (needUpload) { + url.searchParams.append('hash', hash); + const res = await upload({ url: url, form: form, token: token }); + logger.debug('upload file', file, res); + if (res.code !== 200) { + logger.error('文件上传失败', file, res); + return { code: 500, message: '文件上传失败', file, fileRes: res }; + } + } else { + console.log(chalk.green('\t 文件已经上传过了', url.toString())); + } + continue; } - if (!needUpload) { - logger.debug('所有文件都上传过了,不需要上传文件'); - return { - code: 200, - }; - } - const _baseURL = getBaseURL(); - const url = new URL('/api/s1/resources/upload', _baseURL); - if (opts.noCheckAppFiles) { - url.searchParams.append('noCheckAppFiles', 'true'); - } - return upload({ url: url, form: form, token: token }); -}; + return { code: 200 } + +} app.addCommand(command); const deployLoadFn = async (id: string, org?: string) => { diff --git a/src/command/login.ts b/src/command/login.ts index 0576223..90eb0fa 100644 --- a/src/command/login.ts +++ b/src/command/login.ts @@ -82,6 +82,22 @@ const loginCommand = new Command('login') program.addCommand(loginCommand); +export const getUsername = async () => { + const token = getEnvToken(); + const localToken = storage.getItem('token'); + if (!token && !localToken) { + console.log('请先登录'); + return null; + } + let me = await queryLogin.getMe(localToken || token); + if (me?.code === 401) { + me = await queryLogin.getMe(); + } + if (me?.code === 200) { + return me.data?.username; + } + return null; +} const showMe = async (show = true) => { const token = getEnvToken(); const localToken = storage.getItem('token'); diff --git a/src/query/app-manager/query-app.ts b/src/query/app-manager/query-app.ts index afce61a..b011203 100644 --- a/src/query/app-manager/query-app.ts +++ b/src/query/app-manager/query-app.ts @@ -26,7 +26,7 @@ export const queryApp = async (params: QueryAppParams, opts?: any) => { ); }; -export const queryAppVersion = async (params: { key?: string; version?: string; id?: string }, opts?: DataOpts) => { +export const queryAppVersion = async (params: { key?: string; version?: string; id?: string, create?: boolean }, opts?: DataOpts) => { logger.debug('queryAppVersion params', params, query.url); return await query.post( { diff --git a/test/upload.ts b/test/upload.ts new file mode 100644 index 0000000..11a1cdf --- /dev/null +++ b/test/upload.ts @@ -0,0 +1,13 @@ +import { uploadFilesV2 } from '../src/command/deploy.ts'; +import path from 'path'; +import fs from 'fs'; + +const files = ['test-cli.html']; + +const res = await uploadFilesV2(files, path.resolve('./test'), { + key: 'test', + version: '1.0.4', + username: 'root', +}) + +console.log(res); \ No newline at end of file