@cloudbase/cli 2.0.0 → 2.0.3-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +9 -9
- package/.eslintignore +7 -7
- package/.eslintrc +35 -35
- package/.prettierrc.js +29 -29
- package/.vscode/launch.json +16 -16
- package/LICENSE +5 -5
- package/README.md +35 -35
- package/bin/cloudbase.js +5 -5
- package/bin/tcb.js +6 -4
- package/changelog.md +6 -6
- package/jest.config.js +17 -17
- package/lib/commands/account/login.js +18 -18
- package/lib/commands/storage/storage.js +1 -1
- package/lib/env/login.js +7 -7
- package/lib/run/service/deployPackage.js +6 -4
- package/lib/utils/net/http-request.js +4 -4
- package/lib/utils/tcbrApi/tcbr-cloud-api/request.js +3 -3
- package/package.json +17 -17
- package/post-install.js +61 -61
- package/runtime/nodejs/bootstrap.js +255 -255
- package/runtime/nodejs/runtime.js +183 -183
- package/src/auth/index.ts +1 -1
- package/src/auth/login.ts +91 -91
- package/src/auth/logout.ts +7 -7
- package/src/commands/account/index.ts +2 -2
- package/src/commands/account/login.ts +192 -192
- package/src/commands/account/logout.ts +24 -24
- package/src/commands/common.ts +246 -246
- package/src/commands/env/base.ts +90 -90
- package/src/commands/env/create.ts +92 -92
- package/src/commands/env/domain.ts +186 -186
- package/src/commands/env/index.ts +4 -4
- package/src/commands/env/login.ts +235 -235
- package/src/commands/framework/index.ts +124 -124
- package/src/commands/functions/alias/getRoute.ts +76 -76
- package/src/commands/functions/alias/index.ts +2 -2
- package/src/commands/functions/alias/setRoute.ts +82 -82
- package/src/commands/functions/code-download.ts +100 -100
- package/src/commands/functions/code-update.ts +62 -62
- package/src/commands/functions/concurrency/delete.ts +45 -45
- package/src/commands/functions/concurrency/index.ts +2 -2
- package/src/commands/functions/concurrency/list.ts +58 -58
- package/src/commands/functions/concurrency/set.ts +47 -47
- package/src/commands/functions/config-update.ts +76 -76
- package/src/commands/functions/copy.ts +62 -62
- package/src/commands/functions/delete.ts +79 -79
- package/src/commands/functions/deploy.ts +293 -293
- package/src/commands/functions/detail.ts +138 -138
- package/src/commands/functions/index.ts +16 -16
- package/src/commands/functions/invoke.ts +121 -121
- package/src/commands/functions/layer/bind.ts +182 -182
- package/src/commands/functions/layer/common.ts +8 -8
- package/src/commands/functions/layer/create.ts +49 -49
- package/src/commands/functions/layer/delete.ts +73 -73
- package/src/commands/functions/layer/download.ts +92 -92
- package/src/commands/functions/layer/index.ts +7 -7
- package/src/commands/functions/layer/list.ts +94 -94
- package/src/commands/functions/layer/sort.ts +76 -76
- package/src/commands/functions/list.ts +68 -68
- package/src/commands/functions/log.ts +148 -148
- package/src/commands/functions/run.ts +249 -249
- package/src/commands/functions/trigger-create.ts +79 -79
- package/src/commands/functions/trigger-delete.ts +105 -105
- package/src/commands/functions/version/index.ts +1 -1
- package/src/commands/functions/version/list.ts +73 -73
- package/src/commands/functions/version/publish.ts +43 -43
- package/src/commands/gateway/create.ts +109 -109
- package/src/commands/gateway/delete.ts +81 -81
- package/src/commands/gateway/domain.ts +159 -159
- package/src/commands/gateway/index.ts +5 -5
- package/src/commands/gateway/list.ts +76 -76
- package/src/commands/gateway/switch.ts +107 -107
- package/src/commands/helpers/index.ts +2 -2
- package/src/commands/helpers/init.ts +431 -431
- package/src/commands/helpers/new.ts +117 -117
- package/src/commands/helpers/open.ts +67 -67
- package/src/commands/hosting/hosting.ts +360 -360
- package/src/commands/index.ts +13 -13
- package/src/commands/lowcode/app.ts +34 -34
- package/src/commands/lowcode/comps.ts +322 -322
- package/src/commands/lowcode/index.ts +1 -1
- package/src/commands/lowcode/utils.ts +24 -24
- package/src/commands/run/image/index.ts +4 -4
- package/src/commands/run/standalonegateway/common.ts +7 -7
- package/src/commands/run/standalonegateway/create.ts +85 -85
- package/src/commands/run/standalonegateway/destroy.ts +59 -59
- package/src/commands/run/standalonegateway/index.ts +4 -4
- package/src/commands/run/standalonegateway/list.ts +53 -53
- package/src/commands/run/standalonegateway/package.ts +62 -62
- package/src/commands/run/standalonegateway/turn.ts +63 -63
- package/src/commands/run/version/index.ts +4 -4
- package/src/commands/smart.ts +132 -132
- package/src/commands/storage/storage.ts +464 -464
- package/src/commands/third/thirdAttach.ts +49 -49
- package/src/completion/index.ts +13 -13
- package/src/decorators/captureError.ts +25 -25
- package/src/decorators/constants.ts +12 -12
- package/src/decorators/deprecate.ts +25 -25
- package/src/decorators/guard.ts +42 -42
- package/src/decorators/index.ts +7 -7
- package/src/decorators/injectParams.ts +54 -54
- package/src/decorators/params/common.ts +28 -28
- package/src/decorators/params/index.ts +35 -35
- package/src/env/domain.ts +33 -33
- package/src/env/index.ts +63 -63
- package/src/env/login.ts +80 -80
- package/src/error.ts +36 -36
- package/src/function/alias.ts +43 -43
- package/src/function/base.ts +253 -253
- package/src/function/code.ts +55 -55
- package/src/function/concurrency.ts +57 -57
- package/src/function/create.ts +78 -78
- package/src/function/delete.ts +42 -42
- package/src/function/index.ts +10 -10
- package/src/function/layer/attach.ts +68 -68
- package/src/function/layer/create.ts +63 -63
- package/src/function/layer/delete.ts +21 -21
- package/src/function/layer/download.ts +54 -54
- package/src/function/layer/index.ts +7 -7
- package/src/function/layer/list.ts +32 -32
- package/src/function/layer/sort.ts +24 -24
- package/src/function/trigger.ts +97 -97
- package/src/function/update.ts +35 -35
- package/src/function/version.ts +38 -38
- package/src/function/vpc.ts +22 -22
- package/src/gateway/index.ts +137 -137
- package/src/hosting.ts +212 -212
- package/src/index.ts +13 -13
- package/src/logger.ts +17 -17
- package/src/run/create.ts +23 -23
- package/src/run/delete.ts +15 -15
- package/src/run/image/build.ts +36 -36
- package/src/run/image/delete.ts +13 -13
- package/src/run/image/index.ts +3 -3
- package/src/run/image/info.ts +26 -26
- package/src/run/list.ts +29 -29
- package/src/run/repo.ts +24 -24
- package/src/run/service/deployPackage.ts +6 -4
- package/src/run/standalonegateway/create.ts +24 -24
- package/src/run/standalonegateway/destroy.ts +19 -19
- package/src/run/standalonegateway/index.ts +4 -4
- package/src/run/standalonegateway/list.ts +74 -74
- package/src/run/standalonegateway/package/list.ts +24 -24
- package/src/run/standalonegateway/turn/index.ts +1 -1
- package/src/run/standalonegateway/turn/off.ts +19 -19
- package/src/run/standalonegateway/turn/on.ts +19 -19
- package/src/run/version/create.ts +68 -68
- package/src/run/version/delete.ts +15 -15
- package/src/run/version/index.ts +5 -5
- package/src/run/version/list.ts +16 -16
- package/src/run/version/modify.ts +16 -16
- package/src/run/version/repo.ts +27 -27
- package/src/run/version/update.ts +58 -58
- package/src/storage.ts +114 -114
- package/src/third/index.ts +12 -12
- package/src/utils/auth.ts +15 -15
- package/src/utils/cli-table.ts +23 -23
- package/src/utils/config.ts +39 -39
- package/src/utils/env.ts +244 -244
- package/src/utils/fs/del.ts +5 -5
- package/src/utils/fs/index.ts +71 -71
- package/src/utils/function-packer.ts +97 -97
- package/src/utils/log.ts +81 -81
- package/src/utils/net/cloud-api-request.ts +62 -62
- package/src/utils/net/credential.ts +53 -53
- package/src/utils/net/http-request.ts +84 -84
- package/src/utils/net/index.ts +4 -4
- package/src/utils/net/manager-service.ts +36 -36
- package/src/utils/net/proxy.ts +6 -6
- package/src/utils/notice.ts +28 -28
- package/src/utils/output/highlight.ts +5 -5
- package/src/utils/output/index.ts +2 -2
- package/src/utils/output/link.ts +10 -10
- package/src/utils/output/loading.ts +82 -82
- package/src/utils/parallel.ts +82 -82
- package/src/utils/platform/index.ts +2 -2
- package/src/utils/platform/mac.ts +21 -21
- package/src/utils/platform/os.ts +64 -64
- package/src/utils/platform/port.ts +10 -10
- package/src/utils/progress-bar.ts +38 -38
- package/src/utils/prompt/select.ts +59 -59
- package/src/utils/reporter/agree.ts +20 -20
- package/src/utils/reporter/download.ts +26 -26
- package/src/utils/reporter/index.ts +3 -3
- package/src/utils/reporter/usage.ts +20 -20
- package/src/utils/store/auth.ts +49 -49
- package/src/utils/store/common.ts +8 -8
- package/src/utils/store/db.ts +68 -68
- package/src/utils/store/index.ts +4 -4
- package/src/utils/store/usage.ts +12 -12
- package/src/utils/tcbrApi/tcbr-cloud-api/request.ts +13 -13
- package/src/utils/template.ts +170 -170
- package/src/utils/tools/encoding.ts +8 -8
- package/src/utils/tools/index.ts +4 -4
- package/src/utils/tools/object.ts +33 -33
- package/src/utils/tools/time.ts +38 -38
- package/src/utils/tools/uid.ts +19 -19
- package/templates/html/loginFail.html +90 -90
- package/templates/html/loginSuccess.html +86 -86
- package/templates/server/node/_gitignore +54 -54
- package/templates/server/node/cloudbaserc.json +10 -10
- package/templates/server/node/index.js +5 -5
- package/templates/server/node/package.json +9 -9
- package/tsconfig.json +19 -19
- package/tsconfig.test.json +13 -13
- package/.vscode/settings.json +0 -3
package/src/utils/parallel.ts
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
export type AsyncTask = () => Promise<any>
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 异步任务并发控制器,以一定的并发数执行所有任务
|
|
5
|
-
* 不具备队列性质,异步任务随机执行
|
|
6
|
-
* 单个任务异常,错误会返回,单不会退出执行
|
|
7
|
-
* 所有任务执行
|
|
8
|
-
*/
|
|
9
|
-
export class AsyncTaskParallelController {
|
|
10
|
-
// 任务最大并发数
|
|
11
|
-
maxParallel: number
|
|
12
|
-
// 异步任务队列
|
|
13
|
-
tasks: AsyncTask[]
|
|
14
|
-
// 检查间隔时间,单位 ms
|
|
15
|
-
checkInterval: number
|
|
16
|
-
// 所有任务数量
|
|
17
|
-
totalTasks: number
|
|
18
|
-
|
|
19
|
-
constructor(maxParallel: number, checkInterval = 20) {
|
|
20
|
-
this.tasks = []
|
|
21
|
-
this.maxParallel = Number(maxParallel) || 20
|
|
22
|
-
this.checkInterval = checkInterval
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
loadTasks(tasks: AsyncTask[]) {
|
|
26
|
-
this.tasks.push(...tasks)
|
|
27
|
-
this.totalTasks = this.tasks.length
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
push(task: AsyncTask) {
|
|
31
|
-
this.tasks.push(task)
|
|
32
|
-
this.totalTasks = this.tasks.length
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// 开始执行任务
|
|
36
|
-
async run(): Promise<any[]> {
|
|
37
|
-
// 存储任务执行结果
|
|
38
|
-
const results = []
|
|
39
|
-
// 记录已经运行的任务
|
|
40
|
-
const taskHasRun = []
|
|
41
|
-
// 记录任务是否执行完成
|
|
42
|
-
const taskDone = []
|
|
43
|
-
// 当前正在运行的任务数量
|
|
44
|
-
let runningTask = 0
|
|
45
|
-
|
|
46
|
-
return new Promise((resolve) => {
|
|
47
|
-
// 使用定时器,不阻塞线程
|
|
48
|
-
const timer = setInterval(() => {
|
|
49
|
-
// 全部任务运行完成
|
|
50
|
-
const taskDoneLength = taskDone.filter((item) => item).length
|
|
51
|
-
if (runningTask === 0 && taskDoneLength === this.totalTasks) {
|
|
52
|
-
clearInterval(timer)
|
|
53
|
-
resolve(results)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// 当前运行任务数超过最大并发,不再执行新的任务
|
|
57
|
-
if (runningTask >= this.maxParallel) {
|
|
58
|
-
return
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// 遍历任务列表,开始执行还没有执行的任务
|
|
62
|
-
this.tasks.forEach((task, index) => {
|
|
63
|
-
if (!taskHasRun[index] && runningTask < this.maxParallel) {
|
|
64
|
-
runningTask++
|
|
65
|
-
taskHasRun[index] = 1
|
|
66
|
-
task()
|
|
67
|
-
.then((res) => {
|
|
68
|
-
results[index] = res
|
|
69
|
-
})
|
|
70
|
-
.catch((err) => {
|
|
71
|
-
results[index] = err
|
|
72
|
-
})
|
|
73
|
-
.then(() => {
|
|
74
|
-
runningTask--
|
|
75
|
-
taskDone[index] = 1
|
|
76
|
-
})
|
|
77
|
-
}
|
|
78
|
-
})
|
|
79
|
-
}, this.checkInterval)
|
|
80
|
-
})
|
|
81
|
-
}
|
|
82
|
-
}
|
|
1
|
+
export type AsyncTask = () => Promise<any>
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 异步任务并发控制器,以一定的并发数执行所有任务
|
|
5
|
+
* 不具备队列性质,异步任务随机执行
|
|
6
|
+
* 单个任务异常,错误会返回,单不会退出执行
|
|
7
|
+
* 所有任务执行
|
|
8
|
+
*/
|
|
9
|
+
export class AsyncTaskParallelController {
|
|
10
|
+
// 任务最大并发数
|
|
11
|
+
maxParallel: number
|
|
12
|
+
// 异步任务队列
|
|
13
|
+
tasks: AsyncTask[]
|
|
14
|
+
// 检查间隔时间,单位 ms
|
|
15
|
+
checkInterval: number
|
|
16
|
+
// 所有任务数量
|
|
17
|
+
totalTasks: number
|
|
18
|
+
|
|
19
|
+
constructor(maxParallel: number, checkInterval = 20) {
|
|
20
|
+
this.tasks = []
|
|
21
|
+
this.maxParallel = Number(maxParallel) || 20
|
|
22
|
+
this.checkInterval = checkInterval
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
loadTasks(tasks: AsyncTask[]) {
|
|
26
|
+
this.tasks.push(...tasks)
|
|
27
|
+
this.totalTasks = this.tasks.length
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
push(task: AsyncTask) {
|
|
31
|
+
this.tasks.push(task)
|
|
32
|
+
this.totalTasks = this.tasks.length
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 开始执行任务
|
|
36
|
+
async run(): Promise<any[]> {
|
|
37
|
+
// 存储任务执行结果
|
|
38
|
+
const results = []
|
|
39
|
+
// 记录已经运行的任务
|
|
40
|
+
const taskHasRun = []
|
|
41
|
+
// 记录任务是否执行完成
|
|
42
|
+
const taskDone = []
|
|
43
|
+
// 当前正在运行的任务数量
|
|
44
|
+
let runningTask = 0
|
|
45
|
+
|
|
46
|
+
return new Promise((resolve) => {
|
|
47
|
+
// 使用定时器,不阻塞线程
|
|
48
|
+
const timer = setInterval(() => {
|
|
49
|
+
// 全部任务运行完成
|
|
50
|
+
const taskDoneLength = taskDone.filter((item) => item).length
|
|
51
|
+
if (runningTask === 0 && taskDoneLength === this.totalTasks) {
|
|
52
|
+
clearInterval(timer)
|
|
53
|
+
resolve(results)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// 当前运行任务数超过最大并发,不再执行新的任务
|
|
57
|
+
if (runningTask >= this.maxParallel) {
|
|
58
|
+
return
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// 遍历任务列表,开始执行还没有执行的任务
|
|
62
|
+
this.tasks.forEach((task, index) => {
|
|
63
|
+
if (!taskHasRun[index] && runningTask < this.maxParallel) {
|
|
64
|
+
runningTask++
|
|
65
|
+
taskHasRun[index] = 1
|
|
66
|
+
task()
|
|
67
|
+
.then((res) => {
|
|
68
|
+
results[index] = res
|
|
69
|
+
})
|
|
70
|
+
.catch((err) => {
|
|
71
|
+
results[index] = err
|
|
72
|
+
})
|
|
73
|
+
.then(() => {
|
|
74
|
+
runningTask--
|
|
75
|
+
taskDone[index] = 1
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
}, this.checkInterval)
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from './os'
|
|
2
|
-
export * from './mac'
|
|
1
|
+
export * from './os'
|
|
2
|
+
export * from './mac'
|
|
3
3
|
export * from './port'
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import address from 'address'
|
|
2
|
-
import { md5 } from '../tools'
|
|
3
|
-
|
|
4
|
-
// 获取本机 Mac 地址
|
|
5
|
-
export function getMacAddress(): Promise<string> {
|
|
6
|
-
return new Promise(resolve => {
|
|
7
|
-
address.mac((err, mac) => {
|
|
8
|
-
if (err) {
|
|
9
|
-
resolve('')
|
|
10
|
-
return
|
|
11
|
-
}
|
|
12
|
-
resolve(mac)
|
|
13
|
-
})
|
|
14
|
-
})
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export async function getMacAddressMd5(): Promise<string> {
|
|
18
|
-
const mac = await getMacAddress()
|
|
19
|
-
const macMD5 = md5(mac)
|
|
20
|
-
return macMD5
|
|
21
|
-
}
|
|
1
|
+
import address from 'address'
|
|
2
|
+
import { md5 } from '../tools'
|
|
3
|
+
|
|
4
|
+
// 获取本机 Mac 地址
|
|
5
|
+
export function getMacAddress(): Promise<string> {
|
|
6
|
+
return new Promise(resolve => {
|
|
7
|
+
address.mac((err, mac) => {
|
|
8
|
+
if (err) {
|
|
9
|
+
resolve('')
|
|
10
|
+
return
|
|
11
|
+
}
|
|
12
|
+
resolve(mac)
|
|
13
|
+
})
|
|
14
|
+
})
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export async function getMacAddressMd5(): Promise<string> {
|
|
18
|
+
const mac = await getMacAddress()
|
|
19
|
+
const macMD5 = md5(mac)
|
|
20
|
+
return macMD5
|
|
21
|
+
}
|
package/src/utils/platform/os.ts
CHANGED
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
import os from 'os'
|
|
2
|
-
|
|
3
|
-
const macOSMap = new Map([
|
|
4
|
-
[19, 'Catalina'],
|
|
5
|
-
[18, 'Mojave'],
|
|
6
|
-
[17, 'High Sierra'],
|
|
7
|
-
[16, 'Sierra'],
|
|
8
|
-
[15, 'El Capitan'],
|
|
9
|
-
[14, 'Yosemite'],
|
|
10
|
-
[13, 'Mavericks'],
|
|
11
|
-
[12, 'Mountain Lion'],
|
|
12
|
-
[11, 'Lion'],
|
|
13
|
-
[10, 'Snow Leopard'],
|
|
14
|
-
[9, 'Leopard'],
|
|
15
|
-
[8, 'Tiger'],
|
|
16
|
-
[7, 'Panther'],
|
|
17
|
-
[6, 'Jaguar'],
|
|
18
|
-
[5, 'Puma']
|
|
19
|
-
])
|
|
20
|
-
|
|
21
|
-
const winMap = new Map([
|
|
22
|
-
['10.0', '10'],
|
|
23
|
-
['6.3', '8.1'],
|
|
24
|
-
['6.2', '8'],
|
|
25
|
-
['6.1', '7'],
|
|
26
|
-
['6.0', 'Vista'],
|
|
27
|
-
['5.2', 'Server 2003'],
|
|
28
|
-
['5.1', 'XP'],
|
|
29
|
-
['5.0', '2000'],
|
|
30
|
-
['4.9', 'ME'],
|
|
31
|
-
['4.1', '98'],
|
|
32
|
-
['4.0', '95']
|
|
33
|
-
])
|
|
34
|
-
|
|
35
|
-
export function getPlatformRelease(platform: string, release: string) {
|
|
36
|
-
// macOS
|
|
37
|
-
if (platform === 'darwin') {
|
|
38
|
-
const releaseNum = Number(release.split('.')[0])
|
|
39
|
-
const name = macOSMap.get(releaseNum)
|
|
40
|
-
const version = '10.' + (releaseNum - 4)
|
|
41
|
-
return `${name} ${version}`
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// windows
|
|
45
|
-
if (platform === 'win32') {
|
|
46
|
-
const version = (/\d+\.\d/.exec(release) || [])[0]
|
|
47
|
-
|
|
48
|
-
return `Windows ${winMap.get(version)}`
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// 其他 Linux
|
|
52
|
-
return 'Linux'
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// 获取 hostname 和平台信息
|
|
56
|
-
export function getOSInfo() {
|
|
57
|
-
const hostname = os.hostname()
|
|
58
|
-
const platform = os.platform()
|
|
59
|
-
const release = os.release()
|
|
60
|
-
|
|
61
|
-
const platformRelease = getPlatformRelease(platform, release)
|
|
62
|
-
|
|
63
|
-
return [hostname, platformRelease].join('/')
|
|
64
|
-
}
|
|
1
|
+
import os from 'os'
|
|
2
|
+
|
|
3
|
+
const macOSMap = new Map([
|
|
4
|
+
[19, 'Catalina'],
|
|
5
|
+
[18, 'Mojave'],
|
|
6
|
+
[17, 'High Sierra'],
|
|
7
|
+
[16, 'Sierra'],
|
|
8
|
+
[15, 'El Capitan'],
|
|
9
|
+
[14, 'Yosemite'],
|
|
10
|
+
[13, 'Mavericks'],
|
|
11
|
+
[12, 'Mountain Lion'],
|
|
12
|
+
[11, 'Lion'],
|
|
13
|
+
[10, 'Snow Leopard'],
|
|
14
|
+
[9, 'Leopard'],
|
|
15
|
+
[8, 'Tiger'],
|
|
16
|
+
[7, 'Panther'],
|
|
17
|
+
[6, 'Jaguar'],
|
|
18
|
+
[5, 'Puma']
|
|
19
|
+
])
|
|
20
|
+
|
|
21
|
+
const winMap = new Map([
|
|
22
|
+
['10.0', '10'],
|
|
23
|
+
['6.3', '8.1'],
|
|
24
|
+
['6.2', '8'],
|
|
25
|
+
['6.1', '7'],
|
|
26
|
+
['6.0', 'Vista'],
|
|
27
|
+
['5.2', 'Server 2003'],
|
|
28
|
+
['5.1', 'XP'],
|
|
29
|
+
['5.0', '2000'],
|
|
30
|
+
['4.9', 'ME'],
|
|
31
|
+
['4.1', '98'],
|
|
32
|
+
['4.0', '95']
|
|
33
|
+
])
|
|
34
|
+
|
|
35
|
+
export function getPlatformRelease(platform: string, release: string) {
|
|
36
|
+
// macOS
|
|
37
|
+
if (platform === 'darwin') {
|
|
38
|
+
const releaseNum = Number(release.split('.')[0])
|
|
39
|
+
const name = macOSMap.get(releaseNum)
|
|
40
|
+
const version = '10.' + (releaseNum - 4)
|
|
41
|
+
return `${name} ${version}`
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// windows
|
|
45
|
+
if (platform === 'win32') {
|
|
46
|
+
const version = (/\d+\.\d/.exec(release) || [])[0]
|
|
47
|
+
|
|
48
|
+
return `Windows ${winMap.get(version)}`
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 其他 Linux
|
|
52
|
+
return 'Linux'
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 获取 hostname 和平台信息
|
|
56
|
+
export function getOSInfo() {
|
|
57
|
+
const hostname = os.hostname()
|
|
58
|
+
const platform = os.platform()
|
|
59
|
+
const release = os.release()
|
|
60
|
+
|
|
61
|
+
const platformRelease = getPlatformRelease(platform, release)
|
|
62
|
+
|
|
63
|
+
return [hostname, platformRelease].join('/')
|
|
64
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import portfinder from 'portfinder'
|
|
2
|
-
const PORT = 9012
|
|
3
|
-
|
|
4
|
-
// 获取本地可用端口
|
|
5
|
-
export async function getPort(): Promise<number> {
|
|
6
|
-
const port: number = await portfinder.getPortPromise({
|
|
7
|
-
port: PORT
|
|
8
|
-
})
|
|
9
|
-
return port
|
|
10
|
-
}
|
|
1
|
+
import portfinder from 'portfinder'
|
|
2
|
+
const PORT = 9012
|
|
3
|
+
|
|
4
|
+
// 获取本地可用端口
|
|
5
|
+
export async function getPort(): Promise<number> {
|
|
6
|
+
const port: number = await portfinder.getPortPromise({
|
|
7
|
+
port: PORT
|
|
8
|
+
})
|
|
9
|
+
return port
|
|
10
|
+
}
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import ProgressBar from 'progress'
|
|
2
|
-
|
|
3
|
-
// 打印文件传输进度条
|
|
4
|
-
export function createUploadProgressBar(onFinished: Function, onStart?: Function) {
|
|
5
|
-
let bar
|
|
6
|
-
let lastLoaded = 0
|
|
7
|
-
let finished = false
|
|
8
|
-
|
|
9
|
-
return function (data) {
|
|
10
|
-
const { total, loaded, percent } = data
|
|
11
|
-
if (lastLoaded === 0 && onStart) {
|
|
12
|
-
onStart()
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
if (+percent === 1) {
|
|
16
|
-
if (finished) return
|
|
17
|
-
finished = true
|
|
18
|
-
setTimeout(() => {
|
|
19
|
-
onFinished()
|
|
20
|
-
}, 500)
|
|
21
|
-
bar.tick(total - lastLoaded)
|
|
22
|
-
return
|
|
23
|
-
}
|
|
24
|
-
const tick = loaded - lastLoaded
|
|
25
|
-
lastLoaded = loaded
|
|
26
|
-
if (bar) {
|
|
27
|
-
bar.tick(tick)
|
|
28
|
-
} else {
|
|
29
|
-
bar = new ProgressBar('文件传输中 [:bar] :percent :etas', {
|
|
30
|
-
total,
|
|
31
|
-
complete: '=',
|
|
32
|
-
incomplete: ' ',
|
|
33
|
-
width: 50
|
|
34
|
-
})
|
|
35
|
-
bar.tick(tick)
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
1
|
+
import ProgressBar from 'progress'
|
|
2
|
+
|
|
3
|
+
// 打印文件传输进度条
|
|
4
|
+
export function createUploadProgressBar(onFinished: Function, onStart?: Function) {
|
|
5
|
+
let bar
|
|
6
|
+
let lastLoaded = 0
|
|
7
|
+
let finished = false
|
|
8
|
+
|
|
9
|
+
return function (data) {
|
|
10
|
+
const { total, loaded, percent } = data
|
|
11
|
+
if (lastLoaded === 0 && onStart) {
|
|
12
|
+
onStart()
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (+percent === 1) {
|
|
16
|
+
if (finished) return
|
|
17
|
+
finished = true
|
|
18
|
+
setTimeout(() => {
|
|
19
|
+
onFinished()
|
|
20
|
+
}, 500)
|
|
21
|
+
bar.tick(total - lastLoaded)
|
|
22
|
+
return
|
|
23
|
+
}
|
|
24
|
+
const tick = loaded - lastLoaded
|
|
25
|
+
lastLoaded = loaded
|
|
26
|
+
if (bar) {
|
|
27
|
+
bar.tick(tick)
|
|
28
|
+
} else {
|
|
29
|
+
bar = new ProgressBar('文件传输中 [:bar] :percent :etas', {
|
|
30
|
+
total,
|
|
31
|
+
complete: '=',
|
|
32
|
+
incomplete: ' ',
|
|
33
|
+
width: 50
|
|
34
|
+
})
|
|
35
|
+
bar.tick(tick)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
import { prompt } from 'enquirer'
|
|
2
|
-
import { CloudBaseError } from '../../error'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @描述 分页的选择型 prompt
|
|
6
|
-
* @泛型参数 O: listFetcher 的参数类型
|
|
7
|
-
* @参数 listFetcher: 执行列表拉取逻辑的函数,一般认为参数 options 至少拥有 limit 和 offset 两个 number 属性
|
|
8
|
-
* @参数 options: listFetcher 的参数
|
|
9
|
-
* @参数 message: 展示的信息
|
|
10
|
-
* @参数 filter 筛选返回列表的数据
|
|
11
|
-
* @参数 mapper 对返回列表中元素的处理函数,用于处理列表数据到实际展示列表的映射
|
|
12
|
-
* @返回值 select 类型返回 string,multiselect 返回 string[]
|
|
13
|
-
*/
|
|
14
|
-
export const pagingSelectPromp =
|
|
15
|
-
async <T, O extends { limit?: number, offset?: number }>(
|
|
16
|
-
type: 'select' | 'multiselect',
|
|
17
|
-
listFetcher: (options: O) => Promise<any[]>,
|
|
18
|
-
options: O,
|
|
19
|
-
message: string,
|
|
20
|
-
filter: (item: any) => boolean = _ => true,
|
|
21
|
-
mapper: (item: any) => string = item => item) => {
|
|
22
|
-
|
|
23
|
-
let res: string[] | string = []
|
|
24
|
-
|
|
25
|
-
let offset = 0
|
|
26
|
-
let nextRoundList: string[]
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
while (true) {
|
|
30
|
-
const thisRoundList = nextRoundList || (await listFetcher({ ...options, limit: 10, offset: offset })).filter(filter).map(mapper)
|
|
31
|
-
offset += 10
|
|
32
|
-
nextRoundList = (await listFetcher({ ...options, limit: 10, offset: offset })).filter(filter).map(mapper)
|
|
33
|
-
|
|
34
|
-
if (!thisRoundList || !thisRoundList.length)
|
|
35
|
-
throw new CloudBaseError('列表没有数据')
|
|
36
|
-
|
|
37
|
-
if (type === 'select') {
|
|
38
|
-
let receiver: string = (await prompt<any>({
|
|
39
|
-
type: type,
|
|
40
|
-
name: 'receiver',
|
|
41
|
-
message: message,
|
|
42
|
-
choices: nextRoundList?.length ? [...thisRoundList, '下一页'] : [...thisRoundList]
|
|
43
|
-
})).receiver
|
|
44
|
-
res = receiver
|
|
45
|
-
if (receiver !== '下一页') break
|
|
46
|
-
} else {
|
|
47
|
-
let { receiver }: { receiver: string[] } = await prompt<any>({
|
|
48
|
-
type: type,
|
|
49
|
-
name: 'receiver',
|
|
50
|
-
message: message,
|
|
51
|
-
choices: nextRoundList?.length ? [...thisRoundList, '下一页'] : [...thisRoundList]
|
|
52
|
-
})
|
|
53
|
-
if (!receiver) receiver = []
|
|
54
|
-
res = [...res, ...receiver.filter(item => item !== '下一页')]
|
|
55
|
-
if (receiver.indexOf('下一页') === -1) break
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return res
|
|
1
|
+
import { prompt } from 'enquirer'
|
|
2
|
+
import { CloudBaseError } from '../../error'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @描述 分页的选择型 prompt
|
|
6
|
+
* @泛型参数 O: listFetcher 的参数类型
|
|
7
|
+
* @参数 listFetcher: 执行列表拉取逻辑的函数,一般认为参数 options 至少拥有 limit 和 offset 两个 number 属性
|
|
8
|
+
* @参数 options: listFetcher 的参数
|
|
9
|
+
* @参数 message: 展示的信息
|
|
10
|
+
* @参数 filter 筛选返回列表的数据
|
|
11
|
+
* @参数 mapper 对返回列表中元素的处理函数,用于处理列表数据到实际展示列表的映射
|
|
12
|
+
* @返回值 select 类型返回 string,multiselect 返回 string[]
|
|
13
|
+
*/
|
|
14
|
+
export const pagingSelectPromp =
|
|
15
|
+
async <T, O extends { limit?: number, offset?: number }>(
|
|
16
|
+
type: 'select' | 'multiselect',
|
|
17
|
+
listFetcher: (options: O) => Promise<any[]>,
|
|
18
|
+
options: O,
|
|
19
|
+
message: string,
|
|
20
|
+
filter: (item: any) => boolean = _ => true,
|
|
21
|
+
mapper: (item: any) => string = item => item) => {
|
|
22
|
+
|
|
23
|
+
let res: string[] | string = []
|
|
24
|
+
|
|
25
|
+
let offset = 0
|
|
26
|
+
let nextRoundList: string[]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
while (true) {
|
|
30
|
+
const thisRoundList = nextRoundList || (await listFetcher({ ...options, limit: 10, offset: offset })).filter(filter).map(mapper)
|
|
31
|
+
offset += 10
|
|
32
|
+
nextRoundList = (await listFetcher({ ...options, limit: 10, offset: offset })).filter(filter).map(mapper)
|
|
33
|
+
|
|
34
|
+
if (!thisRoundList || !thisRoundList.length)
|
|
35
|
+
throw new CloudBaseError('列表没有数据')
|
|
36
|
+
|
|
37
|
+
if (type === 'select') {
|
|
38
|
+
let receiver: string = (await prompt<any>({
|
|
39
|
+
type: type,
|
|
40
|
+
name: 'receiver',
|
|
41
|
+
message: message,
|
|
42
|
+
choices: nextRoundList?.length ? [...thisRoundList, '下一页'] : [...thisRoundList]
|
|
43
|
+
})).receiver
|
|
44
|
+
res = receiver
|
|
45
|
+
if (receiver !== '下一页') break
|
|
46
|
+
} else {
|
|
47
|
+
let { receiver }: { receiver: string[] } = await prompt<any>({
|
|
48
|
+
type: type,
|
|
49
|
+
name: 'receiver',
|
|
50
|
+
message: message,
|
|
51
|
+
choices: nextRoundList?.length ? [...thisRoundList, '下一页'] : [...thisRoundList]
|
|
52
|
+
})
|
|
53
|
+
if (!receiver) receiver = []
|
|
54
|
+
res = [...res, ...receiver.filter(item => item !== '下一页')]
|
|
55
|
+
if (receiver.indexOf('下一页') === -1) break
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return res
|
|
60
60
|
}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { postFetch } from '../net'
|
|
2
|
-
import { getMacAddressMd5, getOSInfo } from '../platform'
|
|
3
|
-
import { getUin } from '../store'
|
|
4
|
-
|
|
5
|
-
const url = 'https://tcli.service.tcloudbase.com/agree-collect'
|
|
6
|
-
|
|
7
|
-
export async function collectAgree(agree) {
|
|
8
|
-
const uin = await getUin()
|
|
9
|
-
const macMd5 = await getMacAddressMd5()
|
|
10
|
-
const os = await getOSInfo()
|
|
11
|
-
const data = {
|
|
12
|
-
macMd5,
|
|
13
|
-
agree,
|
|
14
|
-
uin,
|
|
15
|
-
os
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return postFetch(url, data)
|
|
19
|
-
}
|
|
20
|
-
|
|
1
|
+
import { postFetch } from '../net'
|
|
2
|
+
import { getMacAddressMd5, getOSInfo } from '../platform'
|
|
3
|
+
import { getUin } from '../store'
|
|
4
|
+
|
|
5
|
+
const url = 'https://tcli.service.tcloudbase.com/agree-collect'
|
|
6
|
+
|
|
7
|
+
export async function collectAgree(agree) {
|
|
8
|
+
const uin = await getUin()
|
|
9
|
+
const macMd5 = await getMacAddressMd5()
|
|
10
|
+
const os = await getOSInfo()
|
|
11
|
+
const data = {
|
|
12
|
+
macMd5,
|
|
13
|
+
agree,
|
|
14
|
+
uin,
|
|
15
|
+
os
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return postFetch(url, data)
|
|
19
|
+
}
|
|
20
|
+
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { postFetch } from '../net'
|
|
2
|
-
import { getMacAddressMd5, getOSInfo } from '../platform'
|
|
3
|
-
import { getUin } from '../store'
|
|
4
|
-
|
|
5
|
-
const url = 'https://tcli.service.tcloudbase.com/download'
|
|
6
|
-
|
|
7
|
-
export async function templateDownloadReport(templateId: string, templateName: string) {
|
|
8
|
-
const uin = await getUin()
|
|
9
|
-
const os = await getOSInfo()
|
|
10
|
-
const macMd5 = await getMacAddressMd5()
|
|
11
|
-
|
|
12
|
-
const data = {
|
|
13
|
-
os,
|
|
14
|
-
uin,
|
|
15
|
-
macMd5,
|
|
16
|
-
templateId,
|
|
17
|
-
templateName,
|
|
18
|
-
version: process.CLI_VERSION
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
try {
|
|
22
|
-
await postFetch(url, data)
|
|
23
|
-
} catch (e) {
|
|
24
|
-
// ignore error
|
|
25
|
-
}
|
|
26
|
-
}
|
|
1
|
+
import { postFetch } from '../net'
|
|
2
|
+
import { getMacAddressMd5, getOSInfo } from '../platform'
|
|
3
|
+
import { getUin } from '../store'
|
|
4
|
+
|
|
5
|
+
const url = 'https://tcli.service.tcloudbase.com/download'
|
|
6
|
+
|
|
7
|
+
export async function templateDownloadReport(templateId: string, templateName: string) {
|
|
8
|
+
const uin = await getUin()
|
|
9
|
+
const os = await getOSInfo()
|
|
10
|
+
const macMd5 = await getMacAddressMd5()
|
|
11
|
+
|
|
12
|
+
const data = {
|
|
13
|
+
os,
|
|
14
|
+
uin,
|
|
15
|
+
macMd5,
|
|
16
|
+
templateId,
|
|
17
|
+
templateName,
|
|
18
|
+
version: process.CLI_VERSION
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
await postFetch(url, data)
|
|
23
|
+
} catch (e) {
|
|
24
|
+
// ignore error
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from './agree'
|
|
2
|
-
export * from './usage'
|
|
3
|
-
export * from './download'
|
|
1
|
+
export * from './agree'
|
|
2
|
+
export * from './usage'
|
|
3
|
+
export * from './download'
|