feat: refactor deploy command to enhance file upload process and user handling

- Updated the deploy command to include a new username retrieval mechanism, falling back to the organization if not specified.
- Introduced uploadFilesV2 function to streamline file upload logic, including hash checking to prevent redundant uploads.
- Modified queryAppVersion to accept a create parameter for better version management.
- Added a new test file to validate the uploadFilesV2 functionality.
This commit is contained in:
2026-02-02 17:57:50 +08:00
parent 310d727321
commit 5774391bbe
6 changed files with 373 additions and 166 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "@kevisual/cli", "name": "@kevisual/cli",
"version": "0.0.99", "version": "0.1.0",
"description": "envision 命令行工具", "description": "envision 命令行工具",
"type": "module", "type": "module",
"basename": "/root/cli", "basename": "/root/cli",
@@ -48,8 +48,8 @@
"@kevisual/app": "^0.0.2", "@kevisual/app": "^0.0.2",
"@kevisual/auth": "^2.0.3", "@kevisual/auth": "^2.0.3",
"@kevisual/context": "^0.0.4", "@kevisual/context": "^0.0.4",
"@kevisual/use-config": "^1.0.28", "@kevisual/use-config": "^1.0.30",
"@opencode-ai/sdk": "^1.1.44", "@opencode-ai/sdk": "^1.1.48",
"@types/busboy": "^1.5.4", "@types/busboy": "^1.5.4",
"busboy": "^1.6.0", "busboy": "^1.6.0",
"eventemitter3": "^5.0.4", "eventemitter3": "^5.0.4",
@@ -62,19 +62,20 @@
"unstorage": "^1.17.4" "unstorage": "^1.17.4"
}, },
"devDependencies": { "devDependencies": {
"@kevisual/api": "^0.0.42",
"@kevisual/dts": "^0.0.3", "@kevisual/dts": "^0.0.3",
"@kevisual/load": "^0.0.6", "@kevisual/load": "^0.0.6",
"@kevisual/logger": "^0.0.4", "@kevisual/logger": "^0.0.4",
"@kevisual/query": "0.0.38", "@kevisual/query": "0.0.39",
"@kevisual/query-login": "0.0.7", "@kevisual/query-login": "0.0.7",
"@types/bun": "^1.3.8", "@types/bun": "^1.3.8",
"@types/crypto-js": "^4.2.2", "@types/crypto-js": "^4.2.2",
"@types/jsonwebtoken": "^9.0.10", "@types/jsonwebtoken": "^9.0.10",
"@types/micromatch": "^4.0.10", "@types/micromatch": "^4.0.10",
"@types/node": "^25.1.0", "@types/node": "^25.2.0",
"@types/semver": "^7.7.1", "@types/semver": "^7.7.1",
"chalk": "^5.6.2", "chalk": "^5.6.2",
"commander": "^14.0.2", "commander": "^14.0.3",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
"fast-glob": "^3.3.3", "fast-glob": "^3.3.3",
"filesize": "^11.0.13", "filesize": "^11.0.13",
@@ -83,7 +84,7 @@
"jsonwebtoken": "^9.0.3", "jsonwebtoken": "^9.0.3",
"pm2": "^6.0.14", "pm2": "^6.0.14",
"tar": "^7.5.7", "tar": "^7.5.7",
"zustand": "^5.0.10" "zustand": "^5.0.11"
}, },
"engines": { "engines": {
"node": ">=22.0.0" "node": ">=22.0.0"

348
pnpm-lock.yaml generated
View File

@@ -10,7 +10,7 @@ importers:
dependencies: dependencies:
'@inquirer/prompts': '@inquirer/prompts':
specifier: ^8.2.0 specifier: ^8.2.0
version: 8.2.0(@types/node@25.1.0) version: 8.2.0(@types/node@25.2.0)
'@kevisual/app': '@kevisual/app':
specifier: ^0.0.2 specifier: ^0.0.2
version: 0.0.2(dotenv@17.2.3) version: 0.0.2(dotenv@17.2.3)
@@ -21,11 +21,11 @@ importers:
specifier: ^0.0.4 specifier: ^0.0.4
version: 0.0.4 version: 0.0.4
'@kevisual/use-config': '@kevisual/use-config':
specifier: ^1.0.28 specifier: ^1.0.30
version: 1.0.28(dotenv@17.2.3) version: 1.0.30(dotenv@17.2.3)
'@opencode-ai/sdk': '@opencode-ai/sdk':
specifier: ^1.1.44 specifier: ^1.1.48
version: 1.1.44 version: 1.1.48
'@types/busboy': '@types/busboy':
specifier: ^1.5.4 specifier: ^1.5.4
version: 1.5.4 version: 1.5.4
@@ -57,6 +57,9 @@ importers:
specifier: ^1.17.4 specifier: ^1.17.4
version: 1.17.4(idb-keyval@6.2.2) version: 1.17.4(idb-keyval@6.2.2)
devDependencies: devDependencies:
'@kevisual/api':
specifier: ^0.0.42
version: 0.0.42
'@kevisual/dts': '@kevisual/dts':
specifier: ^0.0.3 specifier: ^0.0.3
version: 0.0.3(typescript@5.8.2) version: 0.0.3(typescript@5.8.2)
@@ -67,11 +70,11 @@ importers:
specifier: ^0.0.4 specifier: ^0.0.4
version: 0.0.4 version: 0.0.4
'@kevisual/query': '@kevisual/query':
specifier: 0.0.38 specifier: 0.0.39
version: 0.0.38 version: 0.0.39
'@kevisual/query-login': '@kevisual/query-login':
specifier: 0.0.7 specifier: 0.0.7
version: 0.0.7(@kevisual/query@0.0.38) version: 0.0.7(@kevisual/query@0.0.39)
'@types/bun': '@types/bun':
specifier: ^1.3.8 specifier: ^1.3.8
version: 1.3.8 version: 1.3.8
@@ -85,8 +88,8 @@ importers:
specifier: ^4.0.10 specifier: ^4.0.10
version: 4.0.10 version: 4.0.10
'@types/node': '@types/node':
specifier: ^25.1.0 specifier: ^25.2.0
version: 25.1.0 version: 25.2.0
'@types/semver': '@types/semver':
specifier: ^7.7.1 specifier: ^7.7.1
version: 7.7.1 version: 7.7.1
@@ -94,8 +97,8 @@ importers:
specifier: ^5.6.2 specifier: ^5.6.2
version: 5.6.2 version: 5.6.2
commander: commander:
specifier: ^14.0.2 specifier: ^14.0.3
version: 14.0.2 version: 14.0.3
crypto-js: crypto-js:
specifier: ^4.2.0 specifier: ^4.2.0
version: 4.2.0 version: 4.2.0
@@ -118,8 +121,8 @@ importers:
specifier: ^7.5.7 specifier: ^7.5.7
version: 7.5.7 version: 7.5.7
zustand: zustand:
specifier: ^5.0.10 specifier: ^5.0.11
version: 5.0.10(@types/react@19.2.10)(react@19.2.4) version: 5.0.11(@types/react@19.2.10)(react@19.2.4)
assistant: assistant:
dependencies: dependencies:
@@ -252,16 +255,16 @@ importers:
dependencies: dependencies:
'@astrojs/mdx': '@astrojs/mdx':
specifier: ^4.3.13 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': '@astrojs/react':
specifier: ^4.4.2 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': '@astrojs/sitemap':
specifier: ^3.7.0 specifier: ^3.7.0
version: 3.7.0 version: 3.7.0
'@astrojs/vue': '@astrojs/vue':
specifier: ^5.1.4 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': '@kevisual/api':
specifier: ^0.0.28 specifier: ^0.0.28
version: 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) version: 1.2.4(@types/react@19.2.10)(react@19.2.4)
'@tailwindcss/vite': '@tailwindcss/vite':
specifier: ^4.1.18 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': '@uiw/react-md-editor':
specifier: ^4.0.11 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) 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) version: 6.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
astro: astro:
specifier: ^5.16.15 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: class-variance-authority:
specifier: ^0.7.1 specifier: ^0.7.1
version: 0.7.1 version: 0.7.1
@@ -1306,6 +1309,9 @@ packages:
'@kevisual/api@0.0.35': '@kevisual/api@0.0.35':
resolution: {integrity: sha512-NbaOasecbG+O9Ju2/LWC2eWeqcPc5yZYXXyT4vHpU2W5SoPzBf7H3W7+i3py/JcEXF6adcHZVofftCYpecmGMQ==} 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': '@kevisual/app@0.0.1':
resolution: {integrity: sha512-PEx8P3l0iNSqrz9Ib9kVCYfqNMX6/LfNu+cEafmY6ECP1cV5Vmv+TH2fuasMosKjtbH2fAdDi97sbd29tdEK+g==} resolution: {integrity: sha512-PEx8P3l0iNSqrz9Ib9kVCYfqNMX6/LfNu+cEafmY6ECP1cV5Vmv+TH2fuasMosKjtbH2fAdDi97sbd29tdEK+g==}
@@ -1369,6 +1375,9 @@ packages:
'@kevisual/query@0.0.38': '@kevisual/query@0.0.38':
resolution: {integrity: sha512-bfvbSodsZyMfwY+1T2SvDeOCKsT/AaIxlVe0+B1R/fNhlg2MDq2CP0L9HKiFkEm+OXrvXcYDMKPUituVUM5J6Q==} 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': '@kevisual/registry@0.0.1':
resolution: {integrity: sha512-//OHu9m4JDrMjgP8o8dcjZd3D3IAUkRVlkTSviouZEH7r5m7mccA3Hvzw0XJ/lelx6exC6LWsyv6c4uV0Dp+gw==} resolution: {integrity: sha512-//OHu9m4JDrMjgP8o8dcjZd3D3IAUkRVlkTSviouZEH7r5m7mccA3Hvzw0XJ/lelx6exC6LWsyv6c4uV0Dp+gw==}
@@ -1392,6 +1401,11 @@ packages:
peerDependencies: peerDependencies:
dotenv: ^17 dotenv: ^17
'@kevisual/use-config@1.0.30':
resolution: {integrity: sha512-kPdna0FW/X7D600aMdiZ5UTjbCo6d8d4jjauSc8RMmBwUU6WliFDSPUNKVpzm2BsDX5Nth1IXFPYMqH+wxqAmw==}
peerDependencies:
dotenv: ^17
'@kevisual/video-tools@0.0.13': '@kevisual/video-tools@0.0.13':
resolution: {integrity: sha512-bbAMTQznmlm70csVX5nQTeV+TsZw4BohYoYxcUsCi/slKZry2pWQaJgN3uKT0ovkZzLp1bogBEcBHmeP3wxXiw==} resolution: {integrity: sha512-bbAMTQznmlm70csVX5nQTeV+TsZw4BohYoYxcUsCi/slKZry2pWQaJgN3uKT0ovkZzLp1bogBEcBHmeP3wxXiw==}
@@ -1455,12 +1469,12 @@ packages:
'@opencode-ai/plugin@1.1.47': '@opencode-ai/plugin@1.1.47':
resolution: {integrity: sha512-gNMPz72altieDfLhUw3VAT1xbduKi3w3wZ57GLeS7qU9W474HdvdIiLBnt2Xq3U7Ko0/0tvK3nzCker6IIDqmQ==} resolution: {integrity: sha512-gNMPz72altieDfLhUw3VAT1xbduKi3w3wZ57GLeS7qU9W474HdvdIiLBnt2Xq3U7Ko0/0tvK3nzCker6IIDqmQ==}
'@opencode-ai/sdk@1.1.44':
resolution: {integrity: sha512-coQgtSSCbY46/GY+M5zG0rChiLSJWSjPERRt5L1hbjvDWvErelVV0ILPbd1+3CwJLFTedBYgotby2TcO8U0IfQ==}
'@opencode-ai/sdk@1.1.47': '@opencode-ai/sdk@1.1.47':
resolution: {integrity: sha512-s3PBHwk1sP6Zt/lJxIWSBWZ1TnrI1nFxSP97LCODUytouAQgbygZ1oDH7O2sGMBEuGdA8B1nNSPla0aRSN3IpA==} resolution: {integrity: sha512-s3PBHwk1sP6Zt/lJxIWSBWZ1TnrI1nFxSP97LCODUytouAQgbygZ1oDH7O2sGMBEuGdA8B1nNSPla0aRSN3IpA==}
'@opencode-ai/sdk@1.1.48':
resolution: {integrity: sha512-j5/79X45fUPWVD2Ffm/qvwLclDCdPeV+TYMDrm9to0p4pmzhmeKevCsyiRdLg0o0HE3AFRUnOo2rdO9NetN79A==}
'@oslojs/encoding@1.1.0': '@oslojs/encoding@1.1.0':
resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
@@ -2391,6 +2405,9 @@ packages:
'@types/node@25.1.0': '@types/node@25.1.0':
resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==} resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==}
'@types/node@25.2.0':
resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==}
'@types/prismjs@1.26.5': '@types/prismjs@1.26.5':
resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==}
@@ -2414,6 +2431,9 @@ packages:
'@types/send@1.2.1': '@types/send@1.2.1':
resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==}
'@types/spark-md5@3.0.5':
resolution: {integrity: sha512-lWf05dnD42DLVKQJZrDHtWFidcLrHuip01CtnC2/S6AMhX4t9ZlEUj4iuRlAnts0PQk7KESOqKxeGE/b6sIPGg==}
'@types/trusted-types@2.0.7': '@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
@@ -2793,10 +2813,6 @@ packages:
resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
engines: {node: '>=16'} engines: {node: '>=16'}
commander@14.0.2:
resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==}
engines: {node: '>=20'}
commander@14.0.3: commander@14.0.3:
resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
engines: {node: '>=20'} engines: {node: '>=20'}
@@ -4593,6 +4609,9 @@ packages:
space-separated-tokens@2.0.2: space-separated-tokens@2.0.2:
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
spark-md5@3.0.2:
resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==}
speakingurl@14.0.1: speakingurl@14.0.1:
resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@@ -5120,6 +5139,24 @@ packages:
use-sync-external-store: use-sync-external-store:
optional: true 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: zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
@@ -5203,12 +5240,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - 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: dependencies:
'@astrojs/markdown-remark': 6.3.10 '@astrojs/markdown-remark': 6.3.10
'@mdx-js/mdx': 3.1.1 '@mdx-js/mdx': 3.1.1
acorn: 8.15.0 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 es-module-lexer: 1.7.0
estree-util-visit: 2.0.0 estree-util-visit: 2.0.0
hast-util-to-html: 9.0.5 hast-util-to-html: 9.0.5
@@ -5226,15 +5263,15 @@ snapshots:
dependencies: dependencies:
prismjs: 1.30.0 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: dependencies:
'@types/react': 19.2.10 '@types/react': 19.2.10
'@types/react-dom': 19.2.3(@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: 19.2.4
react-dom: 19.2.4(react@19.2.4) react-dom: 19.2.4(react@19.2.4)
ultrahtml: 1.6.0 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: transitivePeerDependencies:
- '@types/node' - '@types/node'
- jiti - jiti
@@ -5267,14 +5304,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - 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: 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': 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.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))
'@vue/compiler-sfc': 3.5.27 '@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) 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.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-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))
vue: 3.5.27(typescript@5.8.2) vue: 3.5.27(typescript@5.8.2)
transitivePeerDependencies: transitivePeerDependencies:
- '@nuxt/kit' - '@nuxt/kit'
@@ -6286,6 +6323,15 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/confirm@6.0.4(@types/node@25.1.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0) '@inquirer/core': 11.1.1(@types/node@25.1.0)
@@ -6293,6 +6339,13 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/core@11.1.1(@types/node@25.1.0)':
dependencies: dependencies:
'@inquirer/ansi': 2.0.3 '@inquirer/ansi': 2.0.3
@@ -6305,6 +6358,18 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/editor@5.0.4(@types/node@25.1.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0) '@inquirer/core': 11.1.1(@types/node@25.1.0)
@@ -6313,6 +6378,14 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/expand@5.0.4(@types/node@25.1.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0) '@inquirer/core': 11.1.1(@types/node@25.1.0)
@@ -6320,6 +6393,13 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/external-editor@2.0.3(@types/node@25.1.0)':
dependencies: dependencies:
chardet: 2.1.1 chardet: 2.1.1
@@ -6327,6 +6407,13 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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/figures@2.0.3': {}
'@inquirer/input@5.0.4(@types/node@25.1.0)': '@inquirer/input@5.0.4(@types/node@25.1.0)':
@@ -6336,6 +6423,13 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/number@4.0.4(@types/node@25.1.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0) '@inquirer/core': 11.1.1(@types/node@25.1.0)
@@ -6343,6 +6437,13 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/password@5.0.4(@types/node@25.1.0)':
dependencies: dependencies:
'@inquirer/ansi': 2.0.3 '@inquirer/ansi': 2.0.3
@@ -6351,6 +6452,14 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/prompts@8.2.0(@types/node@25.1.0)':
dependencies: dependencies:
'@inquirer/checkbox': 5.0.4(@types/node@25.1.0) '@inquirer/checkbox': 5.0.4(@types/node@25.1.0)
@@ -6366,6 +6475,21 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/rawlist@5.2.0(@types/node@25.1.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0) '@inquirer/core': 11.1.1(@types/node@25.1.0)
@@ -6373,6 +6497,13 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/search@4.1.0(@types/node@25.1.0)':
dependencies: dependencies:
'@inquirer/core': 11.1.1(@types/node@25.1.0) '@inquirer/core': 11.1.1(@types/node@25.1.0)
@@ -6381,6 +6512,14 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/select@5.0.4(@types/node@25.1.0)':
dependencies: dependencies:
'@inquirer/ansi': 2.0.3 '@inquirer/ansi': 2.0.3
@@ -6390,10 +6529,23 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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)': '@inquirer/type@4.0.3(@types/node@25.1.0)':
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@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': '@isaacs/fs-minipass@4.0.1':
dependencies: dependencies:
minipass: 7.1.2 minipass: 7.1.2
@@ -6450,13 +6602,25 @@ snapshots:
nanoid: 5.1.6 nanoid: 5.1.6
path-browserify-esm: 1.0.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)': '@kevisual/app@0.0.1(dotenv@17.2.3)':
dependencies: dependencies:
'@kevisual/ai': 0.0.19 '@kevisual/ai': 0.0.19
'@kevisual/context': 0.0.4 '@kevisual/context': 0.0.4
'@kevisual/query': 0.0.31 '@kevisual/query': 0.0.31
'@kevisual/router': 0.0.36 '@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 mitt: 3.0.1
transitivePeerDependencies: transitivePeerDependencies:
- dotenv - dotenv
@@ -6468,7 +6632,7 @@ snapshots:
'@kevisual/context': 0.0.4 '@kevisual/context': 0.0.4
'@kevisual/query': 0.0.32 '@kevisual/query': 0.0.32
'@kevisual/router': 0.0.39 '@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 mitt: 3.0.1
nanoid: 5.1.6 nanoid: 5.1.6
transitivePeerDependencies: transitivePeerDependencies:
@@ -6491,7 +6655,7 @@ snapshots:
dependencies: dependencies:
'@kevisual/query': 0.0.38 '@kevisual/query': 0.0.38
'@kevisual/router': 0.0.64(typescript@5.8.2) '@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 es-toolkit: 1.44.0
nanoid: 5.1.6 nanoid: 5.1.6
unstorage: 1.17.4(idb-keyval@6.2.2) unstorage: 1.17.4(idb-keyval@6.2.2)
@@ -6594,6 +6758,12 @@ snapshots:
'@kevisual/query': 0.0.38 '@kevisual/query': 0.0.38
dotenv: 17.2.3 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.31': {}
'@kevisual/query@0.0.32': {} '@kevisual/query@0.0.32': {}
@@ -6602,6 +6772,10 @@ snapshots:
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
'@kevisual/query@0.0.39':
dependencies:
tslib: 2.8.1
'@kevisual/registry@0.0.1(typescript@5.8.2)': '@kevisual/registry@0.0.1(typescript@5.8.2)':
dependencies: dependencies:
class-variance-authority: 0.7.1 class-variance-authority: 0.7.1
@@ -6658,12 +6832,17 @@ snapshots:
'@kevisual/load': 0.0.6 '@kevisual/load': 0.0.6
dotenv: 17.2.3 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)': '@kevisual/video-tools@0.0.13(dotenv@17.2.3)(supports-color@10.2.2)':
dependencies: dependencies:
'@gradio/client': 2.0.1 '@gradio/client': 2.0.1
'@kevisual/ai': 0.0.19 '@kevisual/ai': 0.0.19
'@kevisual/router': 0.0.51(supports-color@10.2.2) '@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 '@kevisual/video': 0.0.2
crypto-js: 4.2.0 crypto-js: 4.2.0
dayjs: 1.11.19 dayjs: 1.11.19
@@ -6769,10 +6948,10 @@ snapshots:
'@opencode-ai/sdk': 1.1.47 '@opencode-ai/sdk': 1.1.47
zod: 4.1.8 zod: 4.1.8
'@opencode-ai/sdk@1.1.44': {}
'@opencode-ai/sdk@1.1.47': {} '@opencode-ai/sdk@1.1.47': {}
'@opencode-ai/sdk@1.1.48': {}
'@oslojs/encoding@1.1.0': {} '@oslojs/encoding@1.1.0': {}
'@peculiar/asn1-cms@2.6.0': '@peculiar/asn1-cms@2.6.0':
@@ -7825,12 +8004,12 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18
'@tailwindcss/oxide-win32-x64-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: dependencies:
'@tailwindcss/node': 4.1.18 '@tailwindcss/node': 4.1.18
'@tailwindcss/oxide': 4.1.18 '@tailwindcss/oxide': 4.1.18
tailwindcss: 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': {} '@tootallnate/quickjs-emscripten@0.23.0': {}
@@ -7863,7 +8042,7 @@ snapshots:
'@types/busboy@1.5.4': '@types/busboy@1.5.4':
dependencies: dependencies:
'@types/node': 25.1.0 '@types/node': 25.2.0
'@types/crypto-js@4.2.2': {} '@types/crypto-js@4.2.2': {}
@@ -7888,7 +8067,7 @@ snapshots:
'@types/jsonwebtoken@9.0.10': '@types/jsonwebtoken@9.0.10':
dependencies: dependencies:
'@types/ms': 0.7.34 '@types/ms': 0.7.34
'@types/node': 25.1.0 '@types/node': 25.2.0
'@types/mdast@4.0.4': '@types/mdast@4.0.4':
dependencies: dependencies:
@@ -7912,6 +8091,10 @@ snapshots:
dependencies: dependencies:
undici-types: 7.16.0 undici-types: 7.16.0
'@types/node@25.2.0':
dependencies:
undici-types: 7.16.0
'@types/prismjs@1.26.5': {} '@types/prismjs@1.26.5': {}
'@types/react-dom@19.2.3(@types/react@19.2.10)': '@types/react-dom@19.2.3(@types/react@19.2.10)':
@@ -7926,13 +8109,15 @@ snapshots:
'@types/sax@1.2.7': '@types/sax@1.2.7':
dependencies: dependencies:
'@types/node': 25.1.0 '@types/node': 25.2.0
'@types/semver@7.7.1': {} '@types/semver@7.7.1': {}
'@types/send@1.2.1': '@types/send@1.2.1':
dependencies: dependencies:
'@types/node': 25.1.0 '@types/node': 25.2.0
'@types/spark-md5@3.0.5': {}
'@types/trusted-types@2.0.7': {} '@types/trusted-types@2.0.7': {}
@@ -7942,7 +8127,7 @@ snapshots:
'@types/ws@8.18.1': '@types/ws@8.18.1':
dependencies: dependencies:
'@types/node': 25.1.0 '@types/node': 25.2.0
'@uiw/copy-to-clipboard@1.0.19': {} '@uiw/copy-to-clipboard@1.0.19': {}
@@ -7981,7 +8166,7 @@ snapshots:
'@ungap/structured-clone@1.3.0': {} '@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: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@babel/plugin-transform-react-jsx-self': 7.27.1(@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 '@rolldown/pluginutils': 1.0.0-beta.27
'@types/babel__core': 7.20.5 '@types/babel__core': 7.20.5
react-refresh: 0.17.0 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: transitivePeerDependencies:
- supports-color - 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: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5)
'@rolldown/pluginutils': 1.0.0-beta.55 '@rolldown/pluginutils': 1.0.0-beta.55
'@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) '@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) vue: 3.5.27(typescript@5.8.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - 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: 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: 3.5.27(typescript@5.8.2)
'@vue/babel-helper-vue-transform-on@1.5.0': {} '@vue/babel-helper-vue-transform-on@1.5.0': {}
@@ -8068,14 +8253,14 @@ snapshots:
'@vue/compiler-dom': 3.5.27 '@vue/compiler-dom': 3.5.27
'@vue/shared': 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: dependencies:
'@vue/devtools-kit': 7.7.9 '@vue/devtools-kit': 7.7.9
'@vue/devtools-shared': 7.7.9 '@vue/devtools-shared': 7.7.9
mitt: 3.0.1 mitt: 3.0.1
nanoid: 5.1.6 nanoid: 5.1.6
pathe: 2.0.3 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) vue: 3.5.27(typescript@5.8.2)
transitivePeerDependencies: transitivePeerDependencies:
- vite - vite
@@ -8241,7 +8426,7 @@ snapshots:
astring@1.9.0: {} 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: dependencies:
'@astrojs/compiler': 2.13.0 '@astrojs/compiler': 2.13.0
'@astrojs/internal-helpers': 0.7.5 '@astrojs/internal-helpers': 0.7.5
@@ -8298,8 +8483,8 @@ snapshots:
unist-util-visit: 5.0.0 unist-util-visit: 5.0.0
unstorage: 1.17.4(idb-keyval@6.2.2) unstorage: 1.17.4(idb-keyval@6.2.2)
vfile: 6.0.3 vfile: 6.0.3
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.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))
xxhash-wasm: 1.1.0 xxhash-wasm: 1.1.0
yargs-parser: 21.1.1 yargs-parser: 21.1.1
yocto-spinner: 0.2.3 yocto-spinner: 0.2.3
@@ -8402,7 +8587,7 @@ snapshots:
bun-types@1.3.8: bun-types@1.3.8:
dependencies: dependencies:
'@types/node': 25.1.0 '@types/node': 25.2.0
bundle-name@4.1.0: bundle-name@4.1.0:
dependencies: dependencies:
@@ -8504,8 +8689,6 @@ snapshots:
commander@11.1.0: {} commander@11.1.0: {}
commander@14.0.2: {}
commander@14.0.3: {} commander@14.0.3: {}
commander@2.15.1: {} commander@2.15.1: {}
@@ -10793,6 +10976,8 @@ snapshots:
space-separated-tokens@2.0.2: {} space-separated-tokens@2.0.2: {}
spark-md5@3.0.2: {}
speakingurl@14.0.1: {} speakingurl@14.0.1: {}
sprintf-js@1.1.2: {} sprintf-js@1.1.2: {}
@@ -11063,11 +11248,11 @@ snapshots:
'@types/unist': 3.0.3 '@types/unist': 3.0.3
vfile-message: 4.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: 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: dependencies:
'@antfu/utils': 0.7.10 '@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.3.0(rollup@4.43.0) '@rollup/pluginutils': 5.3.0(rollup@4.43.0)
@@ -11078,28 +11263,28 @@ snapshots:
perfect-debounce: 1.0.0 perfect-debounce: 1.0.0
picocolors: 1.1.1 picocolors: 1.1.1
sirv: 3.0.2 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: transitivePeerDependencies:
- rollup - rollup
- supports-color - 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: 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-kit': 7.7.9
'@vue/devtools-shared': 7.7.9 '@vue/devtools-shared': 7.7.9
execa: 9.6.1 execa: 9.6.1
sirv: 3.0.2 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)
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))
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))
transitivePeerDependencies: transitivePeerDependencies:
- '@nuxt/kit' - '@nuxt/kit'
- rollup - rollup
- supports-color - supports-color
- vue - 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: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@babel/plugin-proposal-decorators': 7.28.0(@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 '@vue/compiler-dom': 3.5.27
kolorist: 1.8.0 kolorist: 1.8.0
magic-string: 0.30.21 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: transitivePeerDependencies:
- supports-color - 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: dependencies:
esbuild: 0.25.12 esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
@@ -11123,14 +11308,14 @@ snapshots:
rollup: 4.43.0 rollup: 4.43.0
tinyglobby: 0.2.15 tinyglobby: 0.2.15
optionalDependencies: optionalDependencies:
'@types/node': 25.1.0 '@types/node': 25.2.0
fsevents: 2.3.3 fsevents: 2.3.3
jiti: 2.6.1 jiti: 2.6.1
lightningcss: 1.30.2 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: 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: vizion@2.2.1:
dependencies: dependencies:
@@ -11222,4 +11407,9 @@ snapshots:
'@types/react': 19.2.10 '@types/react': 19.2.10
react: 19.2.4 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: {} zwitch@2.0.4: {}

View File

@@ -7,9 +7,10 @@ import { getBaseURL, query, storage } from '@/module/query.ts';
import { input, confirm } from '@inquirer/prompts'; import { input, confirm } from '@inquirer/prompts';
import chalk from 'chalk'; import chalk from 'chalk';
import { upload } from '@/module/download/upload.ts'; 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 { queryAppVersion } from '@/query/app-manager/query-app.ts';
import { logger } from '@/module/logger.ts'; import { logger } from '@/module/logger.ts';
import { getUsername } from './login.ts';
/** /**
* 获取package.json 中的 basename, version, user, appKey * 获取package.json 中的 basename, version, user, appKey
* @returns * @returns
@@ -44,13 +45,11 @@ const command = new Command('deploy')
.option('-o, --org <org>', 'org') .option('-o, --org <org>', 'org')
.option('-u, --update', 'load current app. set current version in product。 redis 缓存更新') .option('-u, --update', 'load current app. set current version in product。 redis 缓存更新')
.option('-s, --showBackend', 'show backend url, 部署的后端应用显示执行的cli命令') .option('-s, --showBackend', 'show backend url, 部署的后端应用显示执行的cli命令')
.option('-c, --noCheck', '是否受app manager控制的模块。默认检测')
.option('-d, --dot', '是否上传隐藏文件') .option('-d, --dot', '是否上传隐藏文件')
.option('--dir, --directory <directory>', '上传的默认路径') .option('--dir, --directory <directory>', '上传的默认路径')
.action(async (filePath, options) => { .action(async (filePath, options) => {
try { try {
let { version, key, yes, update, org, showBackend } = options; let { version, key, yes, update, org, showBackend } = options;
const noCheck = !options.noCheck;
const dot = !!options.dot; const dot = !!options.dot;
const pkgInfo = getPackageJson({ version, appKey: key }); const pkgInfo = getPackageJson({ version, appKey: key });
if (!version && pkgInfo?.version) { if (!version && pkgInfo?.version) {
@@ -109,18 +108,30 @@ const command = new Command('deploy')
return; 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 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); logger.debug('upload res', res);
if (res?.code === 200) { if (res?.code === 200) {
res.data?.upload?.map?.((d) => {
console.log(chalk.green('uploaded file', d?.name, d?.path));
});
const res2 = await queryAppVersion({ const res2 = await queryAppVersion({
key: key, key: key,
version: version, version: version,
create: true
}); });
logger.debug('queryAppVersion res', res2); logger.debug('queryAppVersion res', res2, key, version);
if (res2.code !== 200) { if (res2.code !== 200) {
console.error(chalk.red('查询应用版本失败'), res2.message, key); console.error(chalk.red('查询应用版本失败'), res2.message, key);
return; return;
@@ -145,7 +156,6 @@ const command = new Command('deploy')
} else { } else {
console.error('File upload failed', res?.message); console.error('File upload failed', res?.message);
} }
return res;
} catch (error) { } catch (error) {
console.error('error', error); console.error('error', error);
} }
@@ -154,88 +164,65 @@ const command = new Command('deploy')
type UploadFileOptions = { type UploadFileOptions = {
key: string; key: string;
version: string; version: string;
username?: string; username: string;
noCheckAppFiles?: boolean;
directory?: string; directory?: string;
}; };
const uploadFiles = async (files: string[], directory: string, opts: UploadFileOptions): Promise<any> => {
export const uploadFilesV2 = async (files: string[], directory: string, opts: UploadFileOptions): Promise<any> => {
const { key, version, username } = opts || {}; const { key, version, username } = opts || {};
const form = new FormData();
const data: Record<string, any> = { files: [] }; for (let i = 0; i < files.length; i++) {
let description = ''; const file = files[i];
for (const file of files) {
const filePath = path.join(directory, file); const filePath = path.join(directory, file);
const hash = getHash(filePath); logger.info('[上传进度]', `${i + 1}/${files.length}`, file);
if (!hash) { const form = new FormData();
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;
}
const filename = path.basename(filePath); const filename = path.basename(filePath);
logger.debug('upload file', file, filename);
// 解决 busbox 文件名乱码: 将 UTF-8 编码的文件名转换为 binary 字符串 // 解决 busbox 文件名乱码: 将 UTF-8 编码的文件名转换为 binary 字符串
const encodedFilename = Buffer.from(filename, 'utf-8').toString('binary'); const encodedFilename = Buffer.from(filename, 'utf-8').toString('binary');
form.append('file', fs.createReadStream(filePath), { form.append('file', fs.createReadStream(filePath), {
filename: encodedFilename, filename: encodedFilename,
filepath: file, 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) { return { code: 200 }
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 });
};
app.addCommand(command); app.addCommand(command);
const deployLoadFn = async (id: string, org?: string) => { const deployLoadFn = async (id: string, org?: string) => {

View File

@@ -82,6 +82,22 @@ const loginCommand = new Command('login')
program.addCommand(loginCommand); 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 showMe = async (show = true) => {
const token = getEnvToken(); const token = getEnvToken();
const localToken = storage.getItem('token'); const localToken = storage.getItem('token');

View File

@@ -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); logger.debug('queryAppVersion params', params, query.url);
return await query.post( return await query.post(
{ {

13
test/upload.ts Normal file
View File

@@ -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);