update add update
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@kevisual/cli",
|
"name": "@kevisual/cli",
|
||||||
"version": "0.0.64",
|
"version": "0.0.65",
|
||||||
"description": "envision 命令行工具",
|
"description": "envision 命令行工具",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"basename": "/root/cli",
|
"basename": "/root/cli",
|
||||||
@@ -29,6 +29,7 @@
|
|||||||
"dev": "bun src/run.ts ",
|
"dev": "bun src/run.ts ",
|
||||||
"dev:tsx": "tsx src/run.ts ",
|
"dev:tsx": "tsx src/run.ts ",
|
||||||
"build": "rimraf dist && bun run bun.config.mjs",
|
"build": "rimraf dist && bun run bun.config.mjs",
|
||||||
|
"deploy": "ev pack -u -p -m no",
|
||||||
"pub:me": "npm publish --registry https://npm.xiongxiao.me --tag beta",
|
"pub:me": "npm publish --registry https://npm.xiongxiao.me --tag beta",
|
||||||
"postbuild": "cd assistant && pnpm build ",
|
"postbuild": "cd assistant && pnpm build ",
|
||||||
"dts": "dts-bundle-generator --external-inlines=@types/jsonwebtoken src/index.ts -o dist/index.d.ts "
|
"dts": "dts-bundle-generator --external-inlines=@types/jsonwebtoken src/index.ts -o dist/index.d.ts "
|
||||||
@@ -39,8 +40,10 @@
|
|||||||
],
|
],
|
||||||
"author": "abearxiong",
|
"author": "abearxiong",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@kevisual/context": "^0.0.4",
|
||||||
"micromatch": "^4.0.8",
|
"micromatch": "^4.0.8",
|
||||||
"pm2": "^6.0.14"
|
"pm2": "^6.0.14",
|
||||||
|
"semver": "^7.7.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@kevisual/dts": "^0.0.3",
|
"@kevisual/dts": "^0.0.3",
|
||||||
@@ -53,6 +56,7 @@
|
|||||||
"@types/jsonwebtoken": "^9.0.10",
|
"@types/jsonwebtoken": "^9.0.10",
|
||||||
"@types/micromatch": "^4.0.10",
|
"@types/micromatch": "^4.0.10",
|
||||||
"@types/node": "^24.10.1",
|
"@types/node": "^24.10.1",
|
||||||
|
"@types/semver": "^7.7.1",
|
||||||
"chalk": "^5.6.2",
|
"chalk": "^5.6.2",
|
||||||
"commander": "^14.0.2",
|
"commander": "^14.0.2",
|
||||||
"crypto-js": "^4.2.0",
|
"crypto-js": "^4.2.0",
|
||||||
|
|||||||
55
pnpm-lock.yaml
generated
55
pnpm-lock.yaml
generated
@@ -8,12 +8,18 @@ importers:
|
|||||||
|
|
||||||
.:
|
.:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@kevisual/context':
|
||||||
|
specifier: ^0.0.4
|
||||||
|
version: 0.0.4
|
||||||
micromatch:
|
micromatch:
|
||||||
specifier: ^4.0.8
|
specifier: ^4.0.8
|
||||||
version: 4.0.8
|
version: 4.0.8
|
||||||
pm2:
|
pm2:
|
||||||
specifier: ^6.0.14
|
specifier: ^6.0.14
|
||||||
version: 6.0.14(supports-color@10.2.2)
|
version: 6.0.14(supports-color@10.2.2)
|
||||||
|
semver:
|
||||||
|
specifier: ^7.7.3
|
||||||
|
version: 7.7.3
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@kevisual/dts':
|
'@kevisual/dts':
|
||||||
specifier: ^0.0.3
|
specifier: ^0.0.3
|
||||||
@@ -45,6 +51,9 @@ importers:
|
|||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: ^24.10.1
|
specifier: ^24.10.1
|
||||||
version: 24.10.1
|
version: 24.10.1
|
||||||
|
'@types/semver':
|
||||||
|
specifier: ^7.7.1
|
||||||
|
version: 7.7.1
|
||||||
chalk:
|
chalk:
|
||||||
specifier: ^5.6.2
|
specifier: ^5.6.2
|
||||||
version: 5.6.2
|
version: 5.6.2
|
||||||
@@ -336,8 +345,8 @@ packages:
|
|||||||
'@kevisual/cache@0.0.3':
|
'@kevisual/cache@0.0.3':
|
||||||
resolution: {integrity: sha512-BWEck69KYL96/ywjYVkML974RHjDJTj2ITQND1zFPR+hlBV1H1p55QZgSYRJCObg3EAV1S9Zic/fR2T4pfe8yg==}
|
resolution: {integrity: sha512-BWEck69KYL96/ywjYVkML974RHjDJTj2ITQND1zFPR+hlBV1H1p55QZgSYRJCObg3EAV1S9Zic/fR2T4pfe8yg==}
|
||||||
|
|
||||||
'@kevisual/cache@0.0.3':
|
'@kevisual/context@0.0.4':
|
||||||
resolution: {integrity: sha512-BWEck69KYL96/ywjYVkML974RHjDJTj2ITQND1zFPR+hlBV1H1p55QZgSYRJCObg3EAV1S9Zic/fR2T4pfe8yg==}
|
resolution: {integrity: sha512-HJeLeZQLU+7tCluSfOyvkgKLs0HjCZrdJlZgEgKRSa8XTwZfMAUt6J7qZTbrZAHBlPtX68EPu/PI8JMCeu3WAQ==}
|
||||||
|
|
||||||
'@kevisual/dts@0.0.3':
|
'@kevisual/dts@0.0.3':
|
||||||
resolution: {integrity: sha512-4T/m2LqhtwWEW+lWmg7jLxKFW7VtIAftsWFDDZvh10bZunqFf8iXxChHcVSQWikghJb4cq1IkWzPkvc2l+Asdw==}
|
resolution: {integrity: sha512-4T/m2LqhtwWEW+lWmg7jLxKFW7VtIAftsWFDDZvh10bZunqFf8iXxChHcVSQWikghJb4cq1IkWzPkvc2l+Asdw==}
|
||||||
@@ -357,11 +366,6 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@kevisual/query': ^0
|
'@kevisual/query': ^0
|
||||||
|
|
||||||
'@kevisual/query-login@0.0.7':
|
|
||||||
resolution: {integrity: sha512-oOyPIz337cdTt7WncFj7Wr7nxUHh0pBB6KSAJlas+lQiWBPwQEZhpEd7YciydCRlMc9IJMcZRV1Bw3qgy8FFqQ==}
|
|
||||||
peerDependencies:
|
|
||||||
'@kevisual/query': ^0
|
|
||||||
|
|
||||||
'@kevisual/query@0.0.29':
|
'@kevisual/query@0.0.29':
|
||||||
resolution: {integrity: sha512-rQZk0J073UuC1QGzuyq+pb4Y0hu8/Qx/xYHs9NbsmslM+RuMnd1zpXmvhXNj7Kn1MdYTH90ng2MlFLBkkQFaIg==}
|
resolution: {integrity: sha512-rQZk0J073UuC1QGzuyq+pb4Y0hu8/Qx/xYHs9NbsmslM+RuMnd1zpXmvhXNj7Kn1MdYTH90ng2MlFLBkkQFaIg==}
|
||||||
|
|
||||||
@@ -560,9 +564,6 @@ packages:
|
|||||||
'@types/bun@1.3.3':
|
'@types/bun@1.3.3':
|
||||||
resolution: {integrity: sha512-ogrKbJ2X5N0kWLLFKeytG0eHDleBYtngtlbu9cyBKFtNL3cnpDZkNdQj8flVf6WTZUX5ulI9AY1oa7ljhSrp+g==}
|
resolution: {integrity: sha512-ogrKbJ2X5N0kWLLFKeytG0eHDleBYtngtlbu9cyBKFtNL3cnpDZkNdQj8flVf6WTZUX5ulI9AY1oa7ljhSrp+g==}
|
||||||
|
|
||||||
'@types/bun@1.3.3':
|
|
||||||
resolution: {integrity: sha512-ogrKbJ2X5N0kWLLFKeytG0eHDleBYtngtlbu9cyBKFtNL3cnpDZkNdQj8flVf6WTZUX5ulI9AY1oa7ljhSrp+g==}
|
|
||||||
|
|
||||||
'@types/crypto-js@4.2.2':
|
'@types/crypto-js@4.2.2':
|
||||||
resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==}
|
resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==}
|
||||||
|
|
||||||
@@ -593,6 +594,9 @@ packages:
|
|||||||
'@types/resolve@1.20.2':
|
'@types/resolve@1.20.2':
|
||||||
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
|
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
|
||||||
|
|
||||||
|
'@types/semver@7.7.1':
|
||||||
|
resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==}
|
||||||
|
|
||||||
'@types/send@1.2.1':
|
'@types/send@1.2.1':
|
||||||
resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==}
|
resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==}
|
||||||
|
|
||||||
@@ -673,9 +677,6 @@ packages:
|
|||||||
bun-types@1.3.3:
|
bun-types@1.3.3:
|
||||||
resolution: {integrity: sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ==}
|
resolution: {integrity: sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ==}
|
||||||
|
|
||||||
bun-types@1.3.3:
|
|
||||||
resolution: {integrity: sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ==}
|
|
||||||
|
|
||||||
call-bind-apply-helpers@1.0.2:
|
call-bind-apply-helpers@1.0.2:
|
||||||
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
|
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@@ -1442,13 +1443,13 @@ packages:
|
|||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
semver@7.6.3:
|
semver@7.7.2:
|
||||||
resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
|
resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
semver@7.7.2:
|
semver@7.7.3:
|
||||||
resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
|
resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -1846,9 +1847,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
idb-keyval: 6.2.1
|
idb-keyval: 6.2.1
|
||||||
|
|
||||||
'@kevisual/cache@0.0.3':
|
'@kevisual/context@0.0.4': {}
|
||||||
dependencies:
|
|
||||||
idb-keyval: 6.2.1
|
|
||||||
|
|
||||||
'@kevisual/dts@0.0.3(typescript@5.8.2)':
|
'@kevisual/dts@0.0.3(typescript@5.8.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2085,10 +2084,6 @@ snapshots:
|
|||||||
|
|
||||||
'@types/braces@3.0.5': {}
|
'@types/braces@3.0.5': {}
|
||||||
|
|
||||||
'@types/bun@1.3.3':
|
|
||||||
dependencies:
|
|
||||||
bun-types: 1.3.3
|
|
||||||
|
|
||||||
'@types/bun@1.3.3':
|
'@types/bun@1.3.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
bun-types: 1.3.3
|
bun-types: 1.3.3
|
||||||
@@ -2125,6 +2120,8 @@ snapshots:
|
|||||||
|
|
||||||
'@types/resolve@1.20.2': {}
|
'@types/resolve@1.20.2': {}
|
||||||
|
|
||||||
|
'@types/semver@7.7.1': {}
|
||||||
|
|
||||||
'@types/send@1.2.1':
|
'@types/send@1.2.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 24.10.1
|
'@types/node': 24.10.1
|
||||||
@@ -2186,10 +2183,6 @@ snapshots:
|
|||||||
|
|
||||||
buffer-from@1.1.2: {}
|
buffer-from@1.1.2: {}
|
||||||
|
|
||||||
bun-types@1.3.3:
|
|
||||||
dependencies:
|
|
||||||
'@types/node': 24.10.1
|
|
||||||
|
|
||||||
bun-types@1.3.3:
|
bun-types@1.3.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 24.10.1
|
'@types/node': 24.10.1
|
||||||
@@ -2621,7 +2614,7 @@ snapshots:
|
|||||||
lodash.isstring: 4.0.1
|
lodash.isstring: 4.0.1
|
||||||
lodash.once: 4.1.1
|
lodash.once: 4.1.1
|
||||||
ms: 2.1.3
|
ms: 2.1.3
|
||||||
semver: 7.6.3
|
semver: 7.7.3
|
||||||
|
|
||||||
jwa@1.4.1:
|
jwa@1.4.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3009,10 +3002,10 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lru-cache: 6.0.0
|
lru-cache: 6.0.0
|
||||||
|
|
||||||
semver@7.6.3: {}
|
|
||||||
|
|
||||||
semver@7.7.2: {}
|
semver@7.7.2: {}
|
||||||
|
|
||||||
|
semver@7.7.3: {}
|
||||||
|
|
||||||
send@1.2.0(supports-color@10.2.2):
|
send@1.2.0(supports-color@10.2.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.4.0(supports-color@10.2.2)
|
debug: 4.4.0(supports-color@10.2.2)
|
||||||
|
|||||||
@@ -4,10 +4,8 @@ import path from 'path';
|
|||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import FormData from 'form-data';
|
import FormData from 'form-data';
|
||||||
import { getBaseURL, query, storage } from '@/module/query.ts';
|
import { getBaseURL, query, storage } from '@/module/query.ts';
|
||||||
import { getConfig } from '@/module/index.ts';
|
|
||||||
import inquirer from 'inquirer';
|
import inquirer from 'inquirer';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import { installDeps } from '@/uitls/npm.ts';
|
|
||||||
import { upload } from '@/module/download/upload.ts';
|
import { upload } from '@/module/download/upload.ts';
|
||||||
import { getHash } from '@/uitls/hash.ts';
|
import { getHash } from '@/uitls/hash.ts';
|
||||||
import { queryAppVersion } from '@/query/app-manager/query-app.ts';
|
import { queryAppVersion } from '@/query/app-manager/query-app.ts';
|
||||||
@@ -96,7 +94,7 @@ const command = new Command('deploy')
|
|||||||
dot,
|
dot,
|
||||||
absolute: true,
|
absolute: true,
|
||||||
});
|
});
|
||||||
console.log('files', files);
|
// console.log('files', files);
|
||||||
// 添加一个工具函数来统一处理路径
|
// 添加一个工具函数来统一处理路径
|
||||||
const normalizeFilePath = (filePath: string) => {
|
const normalizeFilePath = (filePath: string) => {
|
||||||
return filePath.split(path.sep).join('/');
|
return filePath.split(path.sep).join('/');
|
||||||
@@ -224,7 +222,6 @@ const uploadFiles = async (files: string[], directory: string, opts: UploadFileO
|
|||||||
console.error('check failed', res);
|
console.error('check failed', res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
console.log('res', res);
|
|
||||||
let needUpload = false;
|
let needUpload = false;
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
const filePath = path.join(directory, file);
|
const filePath = path.join(directory, file);
|
||||||
|
|||||||
@@ -62,6 +62,8 @@ const loginCommand = new Command('login')
|
|||||||
const res = await queryLogin.login({
|
const res = await queryLogin.login({
|
||||||
username,
|
username,
|
||||||
password,
|
password,
|
||||||
|
}).catch((err) => {
|
||||||
|
return { code: 500, message: err.message || '' };
|
||||||
});
|
});
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
console.log('welcome', username);
|
console.log('welcome', username);
|
||||||
|
|||||||
@@ -36,8 +36,9 @@ async function collectFileInfo(filePath: string, baseDir = '.'): Promise<any[]>
|
|||||||
* @param files 文件列表, 或者文件夹列表
|
* @param files 文件列表, 或者文件夹列表
|
||||||
* @param cwd 当前工作目录
|
* @param cwd 当前工作目录
|
||||||
* @param packDist 打包目录 pack-dist
|
* @param packDist 打包目录 pack-dist
|
||||||
|
* @param mergeDist 是否合并 dist 目录到 pack-dist 中
|
||||||
*/
|
*/
|
||||||
export const copyFilesToPackDist = async (files: string[], cwd: string, packDist = 'pack-dist') => {
|
export const copyFilesToPackDist = async (files: string[], cwd: string, packDist = 'pack-dist', mergeDist = true) => {
|
||||||
const packDistPath = path.join(cwd, packDist);
|
const packDistPath = path.join(cwd, packDist);
|
||||||
if (!fileIsExist(packDistPath)) {
|
if (!fileIsExist(packDistPath)) {
|
||||||
fs.mkdirSync(packDistPath, { recursive: true });
|
fs.mkdirSync(packDistPath, { recursive: true });
|
||||||
@@ -47,10 +48,12 @@ export const copyFilesToPackDist = async (files: string[], cwd: string, packDist
|
|||||||
files.forEach((file) => {
|
files.forEach((file) => {
|
||||||
const stat = fs.statSync(path.join(cwd, file));
|
const stat = fs.statSync(path.join(cwd, file));
|
||||||
let outputFile = file;
|
let outputFile = file;
|
||||||
if (file.startsWith('dist/')) {
|
if (mergeDist) {
|
||||||
outputFile = file.replace(/^dist\//, '');
|
if (file.startsWith('dist/')) {
|
||||||
} else if (file === 'dist') {
|
outputFile = file.replace(/^dist\//, '');
|
||||||
outputFile = '';
|
} else if (file === 'dist') {
|
||||||
|
outputFile = '';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (stat.isDirectory()) {
|
if (stat.isDirectory()) {
|
||||||
fs.cpSync(path.join(cwd, file), path.join(packDistPath, outputFile), { recursive: true });
|
fs.cpSync(path.join(cwd, file), path.join(packDistPath, outputFile), { recursive: true });
|
||||||
@@ -93,9 +96,11 @@ ${filesString}
|
|||||||
fs.writeFileSync(indexHtmlPath, indexHtmlContent);
|
fs.writeFileSync(indexHtmlPath, indexHtmlContent);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
export const pack = async (opts: { packDist?: string }) => {
|
|
||||||
|
export const pack = async (opts: { packDist?: string, mergeDist?: boolean }) => {
|
||||||
const cwd = process.cwd();
|
const cwd = process.cwd();
|
||||||
const collection: Record<string, any> = {};
|
const collection: Record<string, any> = {};
|
||||||
|
const mergeDist = opts.mergeDist !== false;
|
||||||
const packageJsonPath = path.join(cwd, 'package.json');
|
const packageJsonPath = path.join(cwd, 'package.json');
|
||||||
if (!fileIsExist(packageJsonPath)) {
|
if (!fileIsExist(packageJsonPath)) {
|
||||||
console.error('package.json not found');
|
console.error('package.json not found');
|
||||||
@@ -150,7 +155,7 @@ export const pack = async (opts: { packDist?: string }) => {
|
|||||||
console.log(`version: ${packageJson.version}`);
|
console.log(`version: ${packageJson.version}`);
|
||||||
console.log(`total files: ${allFiles.length}`);
|
console.log(`total files: ${allFiles.length}`);
|
||||||
try {
|
try {
|
||||||
copyFilesToPackDist(filesToInclude, cwd, opts.packDist);
|
copyFilesToPackDist(filesToInclude, cwd, opts.packDist, mergeDist);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error creating tarball:', error);
|
console.error('Error creating tarball:', error);
|
||||||
}
|
}
|
||||||
@@ -173,17 +178,6 @@ export const getPackageInfo = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* 打包应用
|
|
||||||
* @returns 打包结果
|
|
||||||
*/
|
|
||||||
export const packLib = async ({
|
|
||||||
packDist = 'pack-dist',
|
|
||||||
}: {
|
|
||||||
packDist?: string;
|
|
||||||
}): Promise<{ collection: Record<string, any>; dir: string }> => {
|
|
||||||
return await pack({ packDist });
|
|
||||||
};
|
|
||||||
const publishCommand = new Command('publish')
|
const publishCommand = new Command('publish')
|
||||||
.description('发布应用')
|
.description('发布应用')
|
||||||
.option('-k, --key <key>', '应用 key')
|
.option('-k, --key <key>', '应用 key')
|
||||||
@@ -199,21 +193,6 @@ const deployLoadFn = async (id: string, fileKey: string, force = false, install
|
|||||||
console.error(chalk.red('id is required'));
|
console.error(chalk.red('id is required'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// pkg: {
|
|
||||||
// name: 'mark',
|
|
||||||
// version: '0.0.2',
|
|
||||||
// description: '',
|
|
||||||
// main: 'dist/app.mjs',
|
|
||||||
// app: [Object],
|
|
||||||
// files: [Array],
|
|
||||||
// scripts: [Object],
|
|
||||||
// keywords: [Array],
|
|
||||||
// author: 'abearxiong <xiongxiao@xiongxiao.me>',
|
|
||||||
// license: 'MIT',
|
|
||||||
// type: 'module',
|
|
||||||
// devDependencies: [Object],
|
|
||||||
// dependencies: [Object]
|
|
||||||
// },
|
|
||||||
let appKey = '';
|
let appKey = '';
|
||||||
let version = '';
|
let version = '';
|
||||||
if (id && id.includes('/')) {
|
if (id && id.includes('/')) {
|
||||||
@@ -253,10 +232,13 @@ const packCommand = new Command('pack')
|
|||||||
.option('-p, --publish', '打包并发布')
|
.option('-p, --publish', '打包并发布')
|
||||||
.option('-u, --update', '发布后显示更新命令, show command for deploy to server')
|
.option('-u, --update', '发布后显示更新命令, show command for deploy to server')
|
||||||
.option('-d, --packDist <dist>', '打包到的目录')
|
.option('-d, --packDist <dist>', '打包到的目录')
|
||||||
.option('-y, --yes', '确定,直接打包', true)
|
.option('-m, --mergeDist <mergeDist>', '合并 dist 目录到 pack-dist 中', "true")
|
||||||
|
.option('-y, --yes <yes>', '确定,直接打包', "true")
|
||||||
.option('-c, --clean', '清理 package.json中的 devDependencies')
|
.option('-c, --clean', '清理 package.json中的 devDependencies')
|
||||||
.action(async (opts) => {
|
.action(async (opts) => {
|
||||||
const packDist = opts.packDist || 'pack-dist';
|
const packDist = opts.packDist || 'pack-dist';
|
||||||
|
const mergeDist = opts.mergeDist === "true";
|
||||||
|
const yes = opts.yes === "true";
|
||||||
const packageInfo = await getPackageInfo();
|
const packageInfo = await getPackageInfo();
|
||||||
if (!packageInfo) {
|
if (!packageInfo) {
|
||||||
console.error('Invalid package.json:');
|
console.error('Invalid package.json:');
|
||||||
@@ -297,8 +279,9 @@ const packCommand = new Command('pack')
|
|||||||
]);
|
]);
|
||||||
appKey = answers.appKey || appKey;
|
appKey = answers.appKey || appKey;
|
||||||
}
|
}
|
||||||
let value = await packLib({
|
let value = await pack({
|
||||||
packDist,
|
packDist,
|
||||||
|
mergeDist
|
||||||
});
|
});
|
||||||
if (opts?.clean) {
|
if (opts?.clean) {
|
||||||
const newPackageJson = { ...packageInfo };
|
const newPackageJson = { ...packageInfo };
|
||||||
@@ -317,7 +300,7 @@ const packCommand = new Command('pack')
|
|||||||
if (opts.update) {
|
if (opts.update) {
|
||||||
deployCommand.push('-s');
|
deployCommand.push('-s');
|
||||||
}
|
}
|
||||||
if (opts.yes) {
|
if (yes) {
|
||||||
deployCommand.push('-y', 'yes');
|
deployCommand.push('-y', 'yes');
|
||||||
}
|
}
|
||||||
console.log(chalk.blue('deploy doing: '), deployCommand.slice(2).join(' '), '\n');
|
console.log(chalk.blue('deploy doing: '), deployCommand.slice(2).join(' '), '\n');
|
||||||
|
|||||||
@@ -1,13 +1,100 @@
|
|||||||
import { program, Command } from '@/program.ts';
|
import { program, Command } from '@/program.ts';
|
||||||
import { execSync } from 'node:child_process';
|
import { execSync } from 'node:child_process';
|
||||||
|
import path from 'node:path';
|
||||||
|
import fs from 'node:fs';
|
||||||
|
import { getConfig } from '@/module/get-config.ts';
|
||||||
|
import { fetchLink } from '@/module/download/install.ts';
|
||||||
|
import { fileIsExist } from '@/uitls/file.ts';
|
||||||
|
import { getHash, getBufferHash } from '@/uitls/hash.ts';
|
||||||
|
import { useContextKey } from '@kevisual/context'
|
||||||
|
import semver from 'semver'
|
||||||
|
const getRunFilePath = () => {
|
||||||
|
const c = process.argv[1]; // 例子: /home/ubuntu/kevisual/cli/bin/envision.js
|
||||||
|
const runFilePath = path.resolve(c);
|
||||||
|
const isJs = runFilePath.endsWith('.js');
|
||||||
|
let distDir = '';
|
||||||
|
if (isJs) {
|
||||||
|
const dir = path.dirname(runFilePath); // /home/ubuntu/kevisual/cli/bin
|
||||||
|
distDir = path.relative(dir, '../dist'); // /home/ubuntu/kevisual/cli
|
||||||
|
}
|
||||||
|
distDir = path.resolve(process.cwd(), 'dist');
|
||||||
|
|
||||||
|
return distDir;
|
||||||
|
}
|
||||||
|
const distFiles = ["assistant-server.js", "assistant.js", "envision.js"];
|
||||||
|
|
||||||
|
const downloadNewDistFiles = async (distDir: string) => {
|
||||||
|
const baseURL = getConfig().baseURL || 'https://kevisual.cn';
|
||||||
|
const newData = distFiles.map(file => {
|
||||||
|
const url = `${baseURL}/root/cli/dist/${file}`;
|
||||||
|
const filePath = path.join(distDir, file);
|
||||||
|
const exist = fileIsExist(filePath);
|
||||||
|
let hash = '';
|
||||||
|
hash = getHash(filePath);
|
||||||
|
return { url, filePath, exist, hash };
|
||||||
|
});
|
||||||
|
const promises = newData.map(async ({ url, filePath }) => {
|
||||||
|
return await fetchLink(url, { returnContent: true });
|
||||||
|
});
|
||||||
|
let isUpdate = false;
|
||||||
|
await Promise.all(promises).then(results => {
|
||||||
|
results.forEach((res, index) => {
|
||||||
|
const data = newData[index];
|
||||||
|
const filePath = data.filePath;
|
||||||
|
const newHash = getBufferHash(res.content);
|
||||||
|
if (data.hash === newHash) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log('更新文件:', filePath);
|
||||||
|
isUpdate = true;
|
||||||
|
if (data.exist) {
|
||||||
|
fs.writeFileSync(filePath, res.content, 'utf-8');
|
||||||
|
} else {
|
||||||
|
const dir = path.dirname(filePath);
|
||||||
|
if (!fs.existsSync(dir)) {
|
||||||
|
fs.mkdirSync(dir, { recursive: true });
|
||||||
|
}
|
||||||
|
fs.writeFileSync(filePath, res.content, 'utf-8');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (isUpdate) {
|
||||||
|
console.log('更新完成,请重新运行命令');
|
||||||
|
} else {
|
||||||
|
console.log('检测完成');
|
||||||
|
}
|
||||||
|
}).catch(error => {
|
||||||
|
console.error('Error downloading files:', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const getVersion = async () => {
|
||||||
|
const baseURL = getConfig().baseURL || 'https://kevisual.cn';
|
||||||
|
const file = 'package.json';
|
||||||
|
const url = `${baseURL}/root/cli/${file}`;
|
||||||
|
const res = await fetchLink(url, { returnContent: true });
|
||||||
|
const text = res.content.toString('utf-8');
|
||||||
|
const json = JSON.parse(text);
|
||||||
|
const latestVersion = json.version;
|
||||||
|
const version = useContextKey('version');
|
||||||
|
if (semver.lt(version, latestVersion)) {
|
||||||
|
console.log('当前版本:', version);
|
||||||
|
console.log('最新版本:', latestVersion);
|
||||||
|
downloadNewDistFiles(getRunFilePath());
|
||||||
|
} else {
|
||||||
|
console.log('已经是最新版本', version);
|
||||||
|
}
|
||||||
|
}
|
||||||
const update = new Command('update')
|
const update = new Command('update')
|
||||||
.option('-g --global', 'update global')
|
.option('-g --global', 'update global')
|
||||||
|
.option('-n --npm', 'use npm to update', false)
|
||||||
.description('update cli')
|
.description('update cli')
|
||||||
.action((opts) => {
|
.action((opts) => {
|
||||||
try {
|
try {
|
||||||
const cmd = opts.global ? 'npm install -g @kevisual/envision-cli' : 'npm install -D @kevisual/envision-cli';
|
if (opts.npm) {
|
||||||
execSync(cmd, { stdio: 'inherit', encoding: 'utf-8' });
|
const cmd = opts.global ? 'npm install -g @kevisual/envision-cli' : 'npm install -D @kevisual/envision-cli';
|
||||||
|
execSync(cmd, { stdio: 'inherit', encoding: 'utf-8' });
|
||||||
|
} else {
|
||||||
|
getVersion()
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error updating CLI:', error);
|
console.error('Error updating CLI:', error);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,8 +26,14 @@ export type Package = {
|
|||||||
};
|
};
|
||||||
type Options = {
|
type Options = {
|
||||||
check?: boolean;
|
check?: boolean;
|
||||||
|
/**
|
||||||
|
* 是否返回文本内容
|
||||||
|
*/
|
||||||
returnContent?: boolean;
|
returnContent?: boolean;
|
||||||
setToken?: boolean;
|
setToken?: boolean;
|
||||||
|
/**
|
||||||
|
* 本地文件hash
|
||||||
|
*/
|
||||||
hash?: string;
|
hash?: string;
|
||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ type UploadOptions = {
|
|||||||
* @param opts.meta meta
|
* @param opts.meta meta
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export const upload = (opts: UploadOptions): Promise<{ code?: number; message?: string; [key: string]: any }> => {
|
export const upload = (opts: UploadOptions): Promise<{ code?: number; message?: string;[key: string]: any }> => {
|
||||||
const form = opts?.form || new FormData();
|
const form = opts?.form || new FormData();
|
||||||
if (!opts.form) {
|
if (!opts.form) {
|
||||||
let hash = '';
|
let hash = '';
|
||||||
|
|||||||
@@ -1,11 +1,16 @@
|
|||||||
import { program, Command } from 'commander';
|
import { program, Command } from 'commander';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
|
import { useContextKey } from '@kevisual/context'
|
||||||
// 将多个子命令加入主程序中
|
// 将多个子命令加入主程序中
|
||||||
let version = '0.0.1';
|
const version = useContextKey('version', () => {
|
||||||
try {
|
let version = '0.0.64';
|
||||||
// @ts-ignore
|
try {
|
||||||
if (ENVISION_VERSION) version = ENVISION_VERSION;
|
// @ts-ignore
|
||||||
} catch (e) {}
|
if (ENVISION_VERSION) version = ENVISION_VERSION;
|
||||||
|
} catch (e) { }
|
||||||
|
return version;
|
||||||
|
})
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
program.name('app').description('A CLI tool with envison').version(version, '-V, --version');
|
program.name('app').description('A CLI tool with envison').version(version, '-V, --version');
|
||||||
|
|
||||||
|
|||||||
@@ -10,3 +10,7 @@ export const getHash = (file: string) => {
|
|||||||
export const getBufferHash = (buffer: Buffer) => {
|
export const getBufferHash = (buffer: Buffer) => {
|
||||||
return MD5(buffer.toString()).toString();
|
return MD5(buffer.toString()).toString();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getStringHash = (str: string) => {
|
||||||
|
return MD5(str).toString();
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user