@cloudbase/cli 2.0.12-alpha.1 → 2.0.13
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/.vscode/launch.json +0 -10
- package/.vscode/settings.json +3 -0
- package/bin/cloudbase.js +0 -0
- package/bin/tcb.js +0 -0
- package/lib/commands/lowcode/app.js +2 -30
- package/lib/run/service/deployPackage.js +2 -9
- package/lib/utils/checkTcbrEnv.js +5 -4
- package/lib/utils/debug-logger.js +30 -0
- package/lib/utils/net/cloud-api-request.js +7 -1
- package/lib/utils/net/http-request.js +16 -5
- package/package.json +5 -4
- package/types/commands/lowcode/app.d.ts +0 -10
- package/types/utils/debug-logger.d.ts +1 -0
- package/types/utils/net/http-request.d.ts +6 -2
- package/.history/.gitignore_20220624162613 +0 -84
- package/.history/.gitignore_20220627114054 +0 -86
- package/.history/package_20220711204706.json +0 -88
- package/.history/package_20220711204818.json +0 -88
- package/.history/package_20220712151717.json +0 -88
- package/.history/src/commands/lowcode/app_20220624162613.ts +0 -34
- package/.history/src/commands/lowcode/app_20220627114205.ts +0 -52
- package/.history/src/index_20220624162613.ts +0 -13
- package/.history/src/index_20220627113609.ts +0 -15
- package/.history/src/index_20220627114102.ts +0 -13
- package/src/auth/index.ts +0 -2
- package/src/auth/login.ts +0 -91
- package/src/auth/logout.ts +0 -7
- package/src/commands/account/index.ts +0 -2
- package/src/commands/account/login.ts +0 -192
- package/src/commands/account/logout.ts +0 -24
- package/src/commands/common.ts +0 -246
- package/src/commands/env/base.ts +0 -90
- package/src/commands/env/create.ts +0 -92
- package/src/commands/env/domain.ts +0 -186
- package/src/commands/env/index.ts +0 -4
- package/src/commands/env/login.ts +0 -235
- package/src/commands/framework/index.ts +0 -124
- package/src/commands/functions/alias/getRoute.ts +0 -76
- package/src/commands/functions/alias/index.ts +0 -2
- package/src/commands/functions/alias/setRoute.ts +0 -82
- package/src/commands/functions/code-download.ts +0 -100
- package/src/commands/functions/code-update.ts +0 -62
- package/src/commands/functions/concurrency/delete.ts +0 -45
- package/src/commands/functions/concurrency/index.ts +0 -3
- package/src/commands/functions/concurrency/list.ts +0 -58
- package/src/commands/functions/concurrency/set.ts +0 -47
- package/src/commands/functions/config-update.ts +0 -76
- package/src/commands/functions/copy.ts +0 -62
- package/src/commands/functions/delete.ts +0 -79
- package/src/commands/functions/deploy.ts +0 -293
- package/src/commands/functions/detail.ts +0 -138
- package/src/commands/functions/index.ts +0 -16
- package/src/commands/functions/invoke.ts +0 -121
- package/src/commands/functions/layer/bind.ts +0 -182
- package/src/commands/functions/layer/common.ts +0 -8
- package/src/commands/functions/layer/create.ts +0 -49
- package/src/commands/functions/layer/delete.ts +0 -73
- package/src/commands/functions/layer/download.ts +0 -92
- package/src/commands/functions/layer/index.ts +0 -7
- package/src/commands/functions/layer/list.ts +0 -94
- package/src/commands/functions/layer/sort.ts +0 -76
- package/src/commands/functions/list.ts +0 -68
- package/src/commands/functions/log.ts +0 -148
- package/src/commands/functions/run.ts +0 -249
- package/src/commands/functions/trigger-create.ts +0 -79
- package/src/commands/functions/trigger-delete.ts +0 -105
- package/src/commands/functions/version/index.ts +0 -2
- package/src/commands/functions/version/list.ts +0 -73
- package/src/commands/functions/version/publish.ts +0 -43
- package/src/commands/gateway/create.ts +0 -109
- package/src/commands/gateway/delete.ts +0 -81
- package/src/commands/gateway/domain.ts +0 -159
- package/src/commands/gateway/index.ts +0 -5
- package/src/commands/gateway/list.ts +0 -76
- package/src/commands/gateway/switch.ts +0 -107
- package/src/commands/helpers/index.ts +0 -3
- package/src/commands/helpers/init.ts +0 -431
- package/src/commands/helpers/new.ts +0 -117
- package/src/commands/helpers/open.ts +0 -67
- package/src/commands/hosting/hosting.ts +0 -360
- package/src/commands/hosting/index.ts +0 -1
- package/src/commands/index.ts +0 -13
- package/src/commands/lowcode/app.ts +0 -52
- package/src/commands/lowcode/comps.ts +0 -325
- package/src/commands/lowcode/index.ts +0 -2
- package/src/commands/lowcode/utils.ts +0 -25
- package/src/commands/run/create.ts +0 -153
- package/src/commands/run/delete.ts +0 -77
- package/src/commands/run/image/common.ts +0 -8
- package/src/commands/run/image/delete.ts +0 -68
- package/src/commands/run/image/download.ts +0 -68
- package/src/commands/run/image/index.ts +0 -5
- package/src/commands/run/image/list.ts +0 -84
- package/src/commands/run/image/upload.ts +0 -76
- package/src/commands/run/index.ts +0 -7
- package/src/commands/run/list.ts +0 -83
- package/src/commands/run/service/config.ts +0 -81
- package/src/commands/run/service/create.ts +0 -122
- package/src/commands/run/service/deploy.ts +0 -125
- package/src/commands/run/service/index.ts +0 -5
- package/src/commands/run/service/list.ts +0 -94
- package/src/commands/run/service/update.ts +0 -108
- package/src/commands/run/standalonegateway/common.ts +0 -8
- package/src/commands/run/standalonegateway/create.ts +0 -85
- package/src/commands/run/standalonegateway/destroy.ts +0 -59
- package/src/commands/run/standalonegateway/index.ts +0 -5
- package/src/commands/run/standalonegateway/list.ts +0 -53
- package/src/commands/run/standalonegateway/package.ts +0 -62
- package/src/commands/run/standalonegateway/turn.ts +0 -63
- package/src/commands/run/version/common.ts +0 -8
- package/src/commands/run/version/create.ts +0 -369
- package/src/commands/run/version/delete.ts +0 -64
- package/src/commands/run/version/index.ts +0 -5
- package/src/commands/run/version/list.ts +0 -91
- package/src/commands/run/version/modify.ts +0 -137
- package/src/commands/run/version/update.ts +0 -398
- package/src/commands/smart.ts +0 -132
- package/src/commands/storage/index.ts +0 -1
- package/src/commands/storage/storage.ts +0 -464
- package/src/commands/third/index.ts +0 -1
- package/src/commands/third/thirdAttach.ts +0 -49
- package/src/completion/index.ts +0 -13
- package/src/constant.ts +0 -154
- package/src/decorators/captureError.ts +0 -25
- package/src/decorators/constants.ts +0 -12
- package/src/decorators/deprecate.ts +0 -25
- package/src/decorators/guard.ts +0 -42
- package/src/decorators/index.ts +0 -7
- package/src/decorators/injectParams.ts +0 -54
- package/src/decorators/params/common.ts +0 -28
- package/src/decorators/params/index.ts +0 -35
- package/src/env/domain.ts +0 -33
- package/src/env/index.ts +0 -63
- package/src/env/login.ts +0 -80
- package/src/error.ts +0 -36
- package/src/function/alias.ts +0 -43
- package/src/function/base.ts +0 -253
- package/src/function/code.ts +0 -55
- package/src/function/concurrency.ts +0 -57
- package/src/function/create.ts +0 -78
- package/src/function/delete.ts +0 -42
- package/src/function/index.ts +0 -11
- package/src/function/layer/attach.ts +0 -68
- package/src/function/layer/create.ts +0 -63
- package/src/function/layer/delete.ts +0 -21
- package/src/function/layer/download.ts +0 -54
- package/src/function/layer/index.ts +0 -7
- package/src/function/layer/list.ts +0 -32
- package/src/function/layer/sort.ts +0 -24
- package/src/function/trigger.ts +0 -97
- package/src/function/update.ts +0 -35
- package/src/function/version.ts +0 -39
- package/src/function/vpc.ts +0 -22
- package/src/gateway/index.ts +0 -137
- package/src/help.ts +0 -50
- package/src/hosting.ts +0 -212
- package/src/index.ts +0 -13
- package/src/logger.ts +0 -17
- package/src/run/create.ts +0 -23
- package/src/run/delete.ts +0 -15
- package/src/run/image/build.ts +0 -36
- package/src/run/image/delete.ts +0 -14
- package/src/run/image/index.ts +0 -4
- package/src/run/image/info.ts +0 -27
- package/src/run/image/list.ts +0 -23
- package/src/run/index.ts +0 -8
- package/src/run/list.ts +0 -30
- package/src/run/repo.ts +0 -25
- package/src/run/service/common.ts +0 -311
- package/src/run/service/config.ts +0 -77
- package/src/run/service/create.ts +0 -52
- package/src/run/service/deployPackage.ts +0 -65
- package/src/run/service/index.ts +0 -7
- package/src/run/service/list.ts +0 -29
- package/src/run/service/showLogs.ts +0 -98
- package/src/run/service/update.ts +0 -82
- package/src/run/standalonegateway/create.ts +0 -24
- package/src/run/standalonegateway/destroy.ts +0 -19
- package/src/run/standalonegateway/index.ts +0 -5
- package/src/run/standalonegateway/list.ts +0 -74
- package/src/run/standalonegateway/package/index.ts +0 -1
- package/src/run/standalonegateway/package/list.ts +0 -24
- package/src/run/standalonegateway/turn/index.ts +0 -2
- package/src/run/standalonegateway/turn/off.ts +0 -19
- package/src/run/standalonegateway/turn/on.ts +0 -19
- package/src/run/version/create.ts +0 -68
- package/src/run/version/delete.ts +0 -16
- package/src/run/version/index.ts +0 -6
- package/src/run/version/list.ts +0 -17
- package/src/run/version/modify.ts +0 -17
- package/src/run/version/repo.ts +0 -28
- package/src/run/version/update.ts +0 -59
- package/src/storage.ts +0 -114
- package/src/third/index.ts +0 -13
- package/src/types.ts +0 -672
- package/src/utils/auth.ts +0 -15
- package/src/utils/checkTcbrEnv.ts +0 -67
- package/src/utils/cli-table.ts +0 -23
- package/src/utils/commonParamsCheck.ts +0 -65
- package/src/utils/config.ts +0 -39
- package/src/utils/env.ts +0 -244
- package/src/utils/fs/del.ts +0 -5
- package/src/utils/fs/index.ts +0 -71
- package/src/utils/function-packer.ts +0 -97
- package/src/utils/index.ts +0 -25
- package/src/utils/log.ts +0 -82
- package/src/utils/net/cloud-api-request.ts +0 -62
- package/src/utils/net/credential.ts +0 -53
- package/src/utils/net/http-request.ts +0 -84
- package/src/utils/net/index.ts +0 -5
- package/src/utils/net/manager-service.ts +0 -36
- package/src/utils/net/proxy.ts +0 -6
- package/src/utils/notice.ts +0 -28
- package/src/utils/output/highlight.ts +0 -5
- package/src/utils/output/index.ts +0 -3
- package/src/utils/output/link.ts +0 -10
- package/src/utils/output/loading.ts +0 -82
- package/src/utils/parallel.ts +0 -82
- package/src/utils/platform/index.ts +0 -3
- package/src/utils/platform/mac.ts +0 -21
- package/src/utils/platform/os.ts +0 -64
- package/src/utils/platform/port.ts +0 -10
- package/src/utils/progress-bar.ts +0 -38
- package/src/utils/prompt/index.ts +0 -1
- package/src/utils/prompt/select.ts +0 -60
- package/src/utils/reporter/agree.ts +0 -20
- package/src/utils/reporter/download.ts +0 -26
- package/src/utils/reporter/index.ts +0 -3
- package/src/utils/reporter/usage.ts +0 -20
- package/src/utils/store/auth.ts +0 -49
- package/src/utils/store/common.ts +0 -8
- package/src/utils/store/db.ts +0 -68
- package/src/utils/store/index.ts +0 -5
- package/src/utils/store/usage.ts +0 -12
- package/src/utils/tcbrApi/callTcbrApi.ts +0 -28
- package/src/utils/tcbrApi/index.ts +0 -1
- package/src/utils/template.ts +0 -170
- package/src/utils/tools/encoding.ts +0 -8
- package/src/utils/tools/index.ts +0 -4
- package/src/utils/tools/object.ts +0 -33
- package/src/utils/tools/time.ts +0 -38
- package/src/utils/tools/uid.ts +0 -19
- package/src/utils/validator.ts +0 -65
- package/yarn-error.log +0 -12841
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { Command, ICommand } from '../../common'
|
|
2
|
-
import { loadingFactory, printHorizontalTable } from '../../../utils'
|
|
3
|
-
import { InjectParams, EnvId, ArgsOptions, Log, Logger } from '../../../decorators'
|
|
4
|
-
import { listLayers, getFunctionDetail, listLayerVersions } from '../../../function'
|
|
5
|
-
import { layerCommonOptions } from './common'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* 展示文件层列表
|
|
9
|
-
* 1. 当不传入函数名时,展示所有文件层
|
|
10
|
-
* 2. 当传入函数名时,展示函数绑定的文件层
|
|
11
|
-
* 3. 当传入文件层别名时,展示文件层的版本信息
|
|
12
|
-
*/
|
|
13
|
-
@ICommand()
|
|
14
|
-
export class ListFileLayer extends Command {
|
|
15
|
-
get options() {
|
|
16
|
-
return {
|
|
17
|
-
...layerCommonOptions('list'),
|
|
18
|
-
deprecateCmd: 'functions:layer:list',
|
|
19
|
-
options: [
|
|
20
|
-
{
|
|
21
|
-
flags: '-e, --envId <envId>',
|
|
22
|
-
desc: '环境 Id'
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
flags: '--name, <name>',
|
|
26
|
-
desc: '函数名称'
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
flags: '--layer, <layer>',
|
|
30
|
-
desc: '文件层别名'
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
flags: '--code-secret, <codeSecret>',
|
|
34
|
-
desc: '代码加密的函数的 CodeSecret'
|
|
35
|
-
}
|
|
36
|
-
],
|
|
37
|
-
desc: '展示文件层列表'
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
@InjectParams()
|
|
42
|
-
async execute(@EnvId() envId, @ArgsOptions() options, @Log() log: Logger) {
|
|
43
|
-
const { name, layer, codeSecret } = options
|
|
44
|
-
|
|
45
|
-
const loading = loadingFactory()
|
|
46
|
-
loading.start('数据加载中...')
|
|
47
|
-
|
|
48
|
-
let data
|
|
49
|
-
|
|
50
|
-
// 展示文件层的版本信息
|
|
51
|
-
if (layer && typeof layer === 'string') {
|
|
52
|
-
const layerName = `${layer}_${envId}`
|
|
53
|
-
data = await listLayerVersions({
|
|
54
|
-
name: layerName
|
|
55
|
-
})
|
|
56
|
-
} else if (name && typeof name === 'string') {
|
|
57
|
-
// 展示函数绑定的文件层
|
|
58
|
-
const res = await getFunctionDetail({
|
|
59
|
-
envId,
|
|
60
|
-
functionName: name,
|
|
61
|
-
codeSecret
|
|
62
|
-
})
|
|
63
|
-
data = res?.Layers || []
|
|
64
|
-
} else if (envId) {
|
|
65
|
-
// 展示所有文件层
|
|
66
|
-
data = await listLayers({
|
|
67
|
-
offset: 0,
|
|
68
|
-
limit: 200
|
|
69
|
-
})
|
|
70
|
-
data = data.filter((item) => item.LayerName.includes(`_${envId}`))
|
|
71
|
-
} else {
|
|
72
|
-
// 展示所有文件层
|
|
73
|
-
data = await listLayers({
|
|
74
|
-
offset: 0,
|
|
75
|
-
limit: 200
|
|
76
|
-
})
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
loading.stop()
|
|
80
|
-
|
|
81
|
-
const head = ['优先级', '名称', '状态', '版本', '证书', '支持运行时', '创建时间']
|
|
82
|
-
const tableData = data.map((item, index) => [
|
|
83
|
-
index + 1,
|
|
84
|
-
item.LayerName,
|
|
85
|
-
item.Status,
|
|
86
|
-
item.LayerVersion,
|
|
87
|
-
item.LicenseInfo || '空',
|
|
88
|
-
item.CompatibleRuntimes.join(' | '),
|
|
89
|
-
item.AddTime
|
|
90
|
-
])
|
|
91
|
-
printHorizontalTable(head, tableData)
|
|
92
|
-
log.info('Tips:函数绑定多个版本时,同名文件将按优先级从小到大的顺序进行覆盖执行。')
|
|
93
|
-
}
|
|
94
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import _ from 'lodash'
|
|
2
|
-
import { prompt } from 'enquirer'
|
|
3
|
-
|
|
4
|
-
import { Command, ICommand } from '../../common'
|
|
5
|
-
import { loadingFactory } from '../../../utils'
|
|
6
|
-
import { CloudBaseError } from '../../../error'
|
|
7
|
-
import { getFunctionDetail, sortLayer } from '../../../function'
|
|
8
|
-
import { InjectParams, CmdContext } from '../../../decorators'
|
|
9
|
-
import { layerCommonOptions } from './common'
|
|
10
|
-
|
|
11
|
-
@ICommand()
|
|
12
|
-
export class SortFileLayer extends Command {
|
|
13
|
-
get options() {
|
|
14
|
-
return {
|
|
15
|
-
...layerCommonOptions('sort <name>'),
|
|
16
|
-
deprecateCmd: 'functions:layer:sort <name>',
|
|
17
|
-
options: [
|
|
18
|
-
{
|
|
19
|
-
flags: '-e, --envId <envId>',
|
|
20
|
-
desc: '环境 Id'
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
flags: '--code-secret, <codeSecret>',
|
|
24
|
-
desc: '代码加密的函数的 CodeSecret'
|
|
25
|
-
}
|
|
26
|
-
],
|
|
27
|
-
desc: '重新排列云函数绑定的文件层的顺序'
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
@InjectParams()
|
|
32
|
-
async execute(@CmdContext() ctx) {
|
|
33
|
-
const { envId, options, params } = ctx
|
|
34
|
-
const { codeSecret } = options
|
|
35
|
-
const fnName = params?.[0]
|
|
36
|
-
|
|
37
|
-
const loading = loadingFactory()
|
|
38
|
-
loading.start('数据加载中...')
|
|
39
|
-
const detail = await getFunctionDetail({
|
|
40
|
-
envId,
|
|
41
|
-
codeSecret,
|
|
42
|
-
functionName: fnName
|
|
43
|
-
})
|
|
44
|
-
loading.stop()
|
|
45
|
-
|
|
46
|
-
const layers = detail.Layers.map((item) => ({
|
|
47
|
-
name: `${item.LayerName} - ${item.LayerVersion}`,
|
|
48
|
-
value: item
|
|
49
|
-
}))
|
|
50
|
-
|
|
51
|
-
if (!layers.length) {
|
|
52
|
-
throw new CloudBaseError('没有可用的文件层,请先创建文件层!')
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
let { sortLayers } = await prompt<any>({
|
|
56
|
-
type: 'sort',
|
|
57
|
-
name: 'sortLayers',
|
|
58
|
-
message: '选择文件层',
|
|
59
|
-
numbered: true,
|
|
60
|
-
choices: layers,
|
|
61
|
-
result(choices) {
|
|
62
|
-
return Object.values(this.map(choices)) as any
|
|
63
|
-
}
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
sortLayers = sortLayers.map((item) => _.pick(item, ['LayerName', 'LayerVersion']))
|
|
67
|
-
|
|
68
|
-
loading.start('文件层排序中...')
|
|
69
|
-
await sortLayer({
|
|
70
|
-
envId,
|
|
71
|
-
functionName: fnName,
|
|
72
|
-
layers: sortLayers
|
|
73
|
-
})
|
|
74
|
-
loading.succeed('文件层排序成功!')
|
|
75
|
-
}
|
|
76
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { Command, ICommand } from '../common'
|
|
2
|
-
import { CloudBaseError } from '../../error'
|
|
3
|
-
import { listFunction } from '../../function'
|
|
4
|
-
import { printHorizontalTable, loadingFactory } from '../../utils'
|
|
5
|
-
import { InjectParams, EnvId, ArgsOptions } from '../../decorators'
|
|
6
|
-
import { StatusMap } from '../../constant'
|
|
7
|
-
|
|
8
|
-
@ICommand()
|
|
9
|
-
export class ListFunction extends Command {
|
|
10
|
-
get options() {
|
|
11
|
-
return {
|
|
12
|
-
cmd: 'fn',
|
|
13
|
-
childCmd: 'list',
|
|
14
|
-
deprecateCmd: 'functions:list',
|
|
15
|
-
options: [
|
|
16
|
-
{
|
|
17
|
-
flags: '-e, --envId <envId>',
|
|
18
|
-
desc: '环境 Id'
|
|
19
|
-
},
|
|
20
|
-
{ flags: '-l, --limit <limit>', desc: '返回数据长度,默认值为 20' },
|
|
21
|
-
{
|
|
22
|
-
flags: '-o, --offset <offset>',
|
|
23
|
-
desc: '数据偏移量,默认值为 0'
|
|
24
|
-
}
|
|
25
|
-
],
|
|
26
|
-
desc: '展示云函数列表'
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
@InjectParams()
|
|
31
|
-
async execute(@EnvId() envId, @ArgsOptions() options) {
|
|
32
|
-
let { limit = 20, offset = 0 } = options
|
|
33
|
-
limit = Number(limit)
|
|
34
|
-
offset = Number(offset)
|
|
35
|
-
if (!Number.isInteger(limit) || !Number.isInteger(offset)) {
|
|
36
|
-
throw new CloudBaseError('limit 和 offset 必须为整数')
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (limit < 0 || offset < 0) {
|
|
40
|
-
throw new CloudBaseError('limit 和 offset 必须为大于 0 的整数')
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const loading = loadingFactory()
|
|
44
|
-
|
|
45
|
-
loading.start('数据加载中...')
|
|
46
|
-
|
|
47
|
-
const data = await listFunction({
|
|
48
|
-
envId,
|
|
49
|
-
limit: Number(limit),
|
|
50
|
-
offset: Number(offset)
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
loading.stop()
|
|
54
|
-
|
|
55
|
-
const head: string[] = ['函数 Id', '函数名称', '运行时', '创建时间', '修改时间', '状态']
|
|
56
|
-
|
|
57
|
-
const tableData = data.map((item) => [
|
|
58
|
-
item.FunctionId,
|
|
59
|
-
item.FunctionName,
|
|
60
|
-
item.Runtime,
|
|
61
|
-
item.AddTime,
|
|
62
|
-
item.ModTime,
|
|
63
|
-
StatusMap[item.Status]
|
|
64
|
-
])
|
|
65
|
-
|
|
66
|
-
printHorizontalTable(head, tableData)
|
|
67
|
-
}
|
|
68
|
-
}
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk'
|
|
2
|
-
import { Command, ICommand } from '../common'
|
|
3
|
-
import { CloudBaseError } from '../../error'
|
|
4
|
-
import { getFunctionLog } from '../../function'
|
|
5
|
-
import { InjectParams, CmdContext, ArgsParams, Log, Logger } from '../../decorators'
|
|
6
|
-
|
|
7
|
-
@ICommand()
|
|
8
|
-
export class FunctionLog extends Command {
|
|
9
|
-
get options() {
|
|
10
|
-
return {
|
|
11
|
-
cmd: 'fn',
|
|
12
|
-
childCmd: 'log <name>',
|
|
13
|
-
deprecateCmd: 'functions:log <name>',
|
|
14
|
-
options: [
|
|
15
|
-
{
|
|
16
|
-
flags: '-e, --envId <envId>',
|
|
17
|
-
desc: '环境 Id'
|
|
18
|
-
},
|
|
19
|
-
{ flags: '-i, --reqId <reqId>', desc: '函数请求 Id' },
|
|
20
|
-
{
|
|
21
|
-
flags: '-o, --offset <offset>',
|
|
22
|
-
desc: '数据的偏移量,Offset + Limit不能大于10000'
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
flags: '-l, --limit <limit>',
|
|
26
|
-
desc: '返回数据的长度,Offset + Limit不能大于10000'
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
flags: '--order <order>',
|
|
30
|
-
desc: '以升序还是降序的方式对日志进行排序,可选值 desc 和 asc'
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
flags: '--orderBy <orderBy>',
|
|
34
|
-
desc:
|
|
35
|
-
'根据某个字段排序日志,支持以下字段:function_name, duration, mem_usage, start_time'
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
flags: '--startTime <startTime>',
|
|
39
|
-
desc: '查询的具体日期,例如:2019-05-16 20:00:00,只能与 endtime 相差一天之内'
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
flags: '--endTime <endTime>',
|
|
43
|
-
desc: '查询的具体日期,例如:2019-05-16 20:59:59,只能与 startTime 相差一天之内'
|
|
44
|
-
},
|
|
45
|
-
{ flags: '-e, --error', desc: '只返回错误类型的日志' },
|
|
46
|
-
{ flags: '-s, --success', desc: '只返回正确类型的日志' }
|
|
47
|
-
],
|
|
48
|
-
desc: '打印云函数日志'
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
@InjectParams()
|
|
53
|
-
async execute(@CmdContext() ctx, @ArgsParams() argsParams, @Log() log: Logger) {
|
|
54
|
-
const { envId, options } = ctx
|
|
55
|
-
const name = argsParams?.[0]
|
|
56
|
-
|
|
57
|
-
let {
|
|
58
|
-
offset,
|
|
59
|
-
limit,
|
|
60
|
-
order,
|
|
61
|
-
orderBy,
|
|
62
|
-
error,
|
|
63
|
-
success,
|
|
64
|
-
startTime,
|
|
65
|
-
endTime,
|
|
66
|
-
reqId: functionRequestId
|
|
67
|
-
} = options
|
|
68
|
-
|
|
69
|
-
if (!name) {
|
|
70
|
-
throw new CloudBaseError('云函数名称不能为空')
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// 2019-05-16 20:59:59 时间类型的长度
|
|
74
|
-
const TimeLength = 19
|
|
75
|
-
|
|
76
|
-
if (
|
|
77
|
-
typeof startTime !== 'undefined' &&
|
|
78
|
-
typeof endTime !== 'undefined' &&
|
|
79
|
-
(startTime.length !== TimeLength || endTime.length !== TimeLength)
|
|
80
|
-
) {
|
|
81
|
-
throw new CloudBaseError('时间格式错误,必须为 2019-05-16 20:59:59 类型')
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (new Date(endTime).getTime() < new Date(startTime).getTime()) {
|
|
85
|
-
throw new CloudBaseError('开始时间不能晚于结束时间')
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const OneDay = 86400000
|
|
89
|
-
if (new Date(endTime).getTime() - new Date(startTime).getTime() > OneDay) {
|
|
90
|
-
throw new CloudBaseError('endTime 与 startTime 只能相差一天之内')
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
let params: any = {
|
|
94
|
-
order,
|
|
95
|
-
orderBy,
|
|
96
|
-
startTime,
|
|
97
|
-
endTime,
|
|
98
|
-
functionRequestId,
|
|
99
|
-
offset: Number(offset),
|
|
100
|
-
limit: Number(limit)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
error && (params.filter = { RetCode: 'not0' })
|
|
104
|
-
success && (params.filter = { RetCode: 'is0' })
|
|
105
|
-
// 删除值为 undefined 的字段
|
|
106
|
-
params = JSON.parse(JSON.stringify(params))
|
|
107
|
-
|
|
108
|
-
const logs = await getFunctionLog({
|
|
109
|
-
envId,
|
|
110
|
-
functionName: name,
|
|
111
|
-
...params
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
const ResMap = {
|
|
115
|
-
StartTime: '请求时间',
|
|
116
|
-
FunctionName: '函数名称',
|
|
117
|
-
BillDuration: '计费时间(ms)',
|
|
118
|
-
Duration: '运行时间(ms)',
|
|
119
|
-
InvokeFinished: '调用次数',
|
|
120
|
-
MemUsage: '占用内存',
|
|
121
|
-
RequestId: '请求 Id',
|
|
122
|
-
RetCode: '调用状态',
|
|
123
|
-
RetMsg: '返回结果'
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
log.success(chalk.green(`函数:${name} 调用日志:\n`))
|
|
127
|
-
|
|
128
|
-
if (logs.length === 0) {
|
|
129
|
-
return log.info('无调用日志')
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
logs.forEach((log) => {
|
|
133
|
-
const info = Object.keys(ResMap)
|
|
134
|
-
.map((key) => {
|
|
135
|
-
if (key === 'RetCode') {
|
|
136
|
-
return `${ResMap[key]}:${Number(log[key]) === 0 ? '成功' : '失败'}\n`
|
|
137
|
-
}
|
|
138
|
-
if (key === 'MemUsage') {
|
|
139
|
-
const str = Number(Number(log[key]) / 1024 / 1024).toFixed(3)
|
|
140
|
-
return `${ResMap[key]}:${str} MB\n`
|
|
141
|
-
}
|
|
142
|
-
return `${ResMap[key]}:${log[key]} \n`
|
|
143
|
-
})
|
|
144
|
-
.reduce((prev, next) => prev + next)
|
|
145
|
-
console.log(info + `日志:\n ${log.Log} \n`)
|
|
146
|
-
})
|
|
147
|
-
}
|
|
148
|
-
}
|
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import _ from 'lodash'
|
|
2
|
-
import path from 'path'
|
|
3
|
-
import { spawn, SpawnOptionsWithoutStdio } from 'child_process'
|
|
4
|
-
import { Command, ICommand } from '../common'
|
|
5
|
-
import { CloudBaseError } from '../../error'
|
|
6
|
-
import { ICommandContext } from '../../types'
|
|
7
|
-
import { InjectParams, CmdContext } from '../../decorators'
|
|
8
|
-
import { checkFullAccess, isDirectory, checkAndGetCredential } from '../../utils'
|
|
9
|
-
|
|
10
|
-
// 启动文件
|
|
11
|
-
const bootstrapFilePath = path.join(__dirname, '../../../runtime/nodejs/bootstrap.js')
|
|
12
|
-
|
|
13
|
-
function checkJSON(data) {
|
|
14
|
-
try {
|
|
15
|
-
JSON.parse(data)
|
|
16
|
-
} catch (e) {
|
|
17
|
-
throw new CloudBaseError('非法的 JSON 字符串')
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function errorLog(msg: string, debug?: boolean) {
|
|
22
|
-
throw new CloudBaseError(msg, {
|
|
23
|
-
meta: { debug }
|
|
24
|
-
})
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function getDebugArgs(port = 9229) {
|
|
28
|
-
return [
|
|
29
|
-
`--inspect-brk=0.0.0.0:${port}`,
|
|
30
|
-
'--nolazy',
|
|
31
|
-
'--expose-gc',
|
|
32
|
-
'--max-semi-space-size=150',
|
|
33
|
-
'--max-old-space-size=2707'
|
|
34
|
-
]
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// 启动 Node 子进程执行
|
|
38
|
-
function spawnNodeProcess(args: string[], options: SpawnOptionsWithoutStdio) {
|
|
39
|
-
const commonOptions = {
|
|
40
|
-
cwd: path.dirname(bootstrapFilePath),
|
|
41
|
-
windowsHide: true
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const exec = spawn('node', args, {
|
|
45
|
-
...commonOptions,
|
|
46
|
-
...options
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
exec.on('error', (e) => {
|
|
50
|
-
console.log(`进程执行异常:${e.message}`)
|
|
51
|
-
setTimeout(() => {}, 100)
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
exec.stdout.on('data', (data) => {
|
|
55
|
-
console.log(`${data}`)
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
exec.stderr.on('data', (data) => {
|
|
59
|
-
console.log(`${data}`)
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
exec.on('close', (code) => {
|
|
63
|
-
if (code !== 0) {
|
|
64
|
-
console.log(`\n云函数执行异常退出,错误码:${code}`)
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async function getSecret() {
|
|
70
|
-
const credential = await checkAndGetCredential()
|
|
71
|
-
if (_.isEmpty(credential)) {
|
|
72
|
-
console.log('未登录,无法直接调用 Node SDK')
|
|
73
|
-
return {}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const { secretId, secretKey, token } = credential
|
|
77
|
-
|
|
78
|
-
return {
|
|
79
|
-
TENCENTCLOUD_SECRETID: secretId,
|
|
80
|
-
TENCENTCLOUD_SECRETKEY: secretKey,
|
|
81
|
-
TENCENTCLOUD_SESSIONTOKEN: token
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export async function debugFunctionByPath(functionPath: string, options: Record<string, any>) {
|
|
86
|
-
const { params, debug, port } = options
|
|
87
|
-
params && checkJSON(params)
|
|
88
|
-
|
|
89
|
-
// 检查路径是否存在
|
|
90
|
-
const filePath = path.resolve(functionPath)
|
|
91
|
-
checkFullAccess(filePath)
|
|
92
|
-
|
|
93
|
-
let debugDirname
|
|
94
|
-
const isDir = isDirectory(filePath)
|
|
95
|
-
|
|
96
|
-
if (isDir) {
|
|
97
|
-
const exists = checkFullAccess(path.join(filePath, 'index.js'))
|
|
98
|
-
if (!exists) {
|
|
99
|
-
errorLog('index.js 文件不存在!', debug)
|
|
100
|
-
}
|
|
101
|
-
debugDirname = filePath
|
|
102
|
-
} else {
|
|
103
|
-
const { base, dir } = path.parse(filePath)
|
|
104
|
-
if (base !== 'index.js') {
|
|
105
|
-
errorLog('index.js 文件不存在!', debug)
|
|
106
|
-
}
|
|
107
|
-
debugDirname = dir
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
try {
|
|
111
|
-
// eslint-disable-next-line
|
|
112
|
-
const fileExports = require(path.join(debugDirname, 'index.js'))
|
|
113
|
-
if (!fileExports.main) {
|
|
114
|
-
errorLog('main 方法不存在!', debug)
|
|
115
|
-
}
|
|
116
|
-
} catch (e) {
|
|
117
|
-
errorLog(`导入云函数异常:${e.message}`, debug)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// 读取本地 secret 变量
|
|
121
|
-
const secret = await getSecret()
|
|
122
|
-
const debugArgs = getDebugArgs(port)
|
|
123
|
-
const args = debug ? [...debugArgs, bootstrapFilePath] : [bootstrapFilePath]
|
|
124
|
-
console.log('> 以默认配置启动 Node 云函数调试')
|
|
125
|
-
|
|
126
|
-
spawnNodeProcess(args, {
|
|
127
|
-
env: {
|
|
128
|
-
...process.env,
|
|
129
|
-
SCF_FUNCTION_HANDLER: 'index.main',
|
|
130
|
-
SCF_FUNCTION_NAME: 'main',
|
|
131
|
-
GLOBAL_USER_FILE_PATH: path.join(debugDirname, path.sep),
|
|
132
|
-
SCF_EVENT_BODY: params || '{}',
|
|
133
|
-
...secret
|
|
134
|
-
}
|
|
135
|
-
})
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export async function debugByConfig(ctx: ICommandContext, name: string) {
|
|
139
|
-
const { config, options, envId } = ctx
|
|
140
|
-
const { params, debug, port } = options
|
|
141
|
-
params && checkJSON(params)
|
|
142
|
-
|
|
143
|
-
// 检查路径是否存在
|
|
144
|
-
let functionPath = path.resolve(config.functionRoot, name)
|
|
145
|
-
const filePath = path.resolve(functionPath)
|
|
146
|
-
checkFullAccess(filePath, !debug)
|
|
147
|
-
|
|
148
|
-
let debugDirname
|
|
149
|
-
const funcConfig = config.functions.find((item) => item.name === name)
|
|
150
|
-
|
|
151
|
-
const handlers = (funcConfig?.handler || 'index.main').split('.')
|
|
152
|
-
const indexFileName = handlers[0]
|
|
153
|
-
const indexFile = `${indexFileName}.js`
|
|
154
|
-
const mainFunction = handlers[1]
|
|
155
|
-
|
|
156
|
-
const isDir = isDirectory(filePath)
|
|
157
|
-
|
|
158
|
-
if (isDir) {
|
|
159
|
-
const exists = checkFullAccess(path.join(filePath, indexFile))
|
|
160
|
-
if (!exists) {
|
|
161
|
-
errorLog(`${indexFile} 文件不存在!`, debug)
|
|
162
|
-
}
|
|
163
|
-
debugDirname = filePath
|
|
164
|
-
} else {
|
|
165
|
-
const { base, dir } = path.parse(filePath)
|
|
166
|
-
if (base !== indexFile) {
|
|
167
|
-
errorLog(`${indexFile} 文件不存在!`, debug)
|
|
168
|
-
}
|
|
169
|
-
debugDirname = dir
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
try {
|
|
173
|
-
// eslint-disable-next-line
|
|
174
|
-
const fileExports = require(path.join(debugDirname, indexFile))
|
|
175
|
-
if (!fileExports[mainFunction]) {
|
|
176
|
-
errorLog(`handler 中的 ${mainFunction} 方法不存在,请检查你的配置!`, debug)
|
|
177
|
-
}
|
|
178
|
-
} catch (e) {
|
|
179
|
-
errorLog(`导入云函数异常:${e.message}`, debug)
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// 读取本地 secret
|
|
183
|
-
const secret = await getSecret()
|
|
184
|
-
const debugArgs = getDebugArgs(port)
|
|
185
|
-
const args = debug ? [...debugArgs, bootstrapFilePath] : [bootstrapFilePath]
|
|
186
|
-
|
|
187
|
-
spawnNodeProcess(args, {
|
|
188
|
-
env: {
|
|
189
|
-
...process.env,
|
|
190
|
-
SCF_NAMESPACE: envId,
|
|
191
|
-
SCF_FUNCTION_HANDLER: funcConfig?.handler || 'index.main',
|
|
192
|
-
SCF_FUNCTION_NAME: funcConfig?.name || 'main',
|
|
193
|
-
GLOBAL_USER_FILE_PATH: path.join(debugDirname, path.sep),
|
|
194
|
-
SCF_EVENT_BODY: params || JSON.stringify(funcConfig?.params || {}),
|
|
195
|
-
...funcConfig?.envVariables,
|
|
196
|
-
...secret
|
|
197
|
-
}
|
|
198
|
-
})
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
@ICommand()
|
|
202
|
-
export class FunctionDebug extends Command {
|
|
203
|
-
get options() {
|
|
204
|
-
return {
|
|
205
|
-
cmd: 'fn',
|
|
206
|
-
childCmd: 'run',
|
|
207
|
-
deprecateCmd: 'functions:run',
|
|
208
|
-
options: [
|
|
209
|
-
{
|
|
210
|
-
flags: '--path <path>',
|
|
211
|
-
desc: '云函数路径,使用默认配置直接调用云函数,无需配置文件'
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
flags: '--name <name>',
|
|
215
|
-
desc: '指定云函数的名称进行调用,需要配置文件'
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
flags: '--params <params>',
|
|
219
|
-
desc: '调用函数传入的参数,JSON 字符串格式'
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
flags: '--port <port>',
|
|
223
|
-
desc: '启动调试时监听的端口号,默认为 9229'
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
flags: '--debug',
|
|
227
|
-
desc: '启动调试模式'
|
|
228
|
-
}
|
|
229
|
-
],
|
|
230
|
-
desc: '本地运行云函数(当前仅支持 Node)'
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
@InjectParams()
|
|
235
|
-
async execute(@CmdContext() ctx) {
|
|
236
|
-
const { options } = ctx
|
|
237
|
-
const { path, name } = options
|
|
238
|
-
// 指定函数路径,以默认配置运行函数
|
|
239
|
-
if (path) {
|
|
240
|
-
await debugFunctionByPath(path, options)
|
|
241
|
-
} else if (typeof name === 'string') {
|
|
242
|
-
await debugByConfig(ctx, name)
|
|
243
|
-
} else {
|
|
244
|
-
throw new CloudBaseError(
|
|
245
|
-
'请指定运行函数的名称或函数的路径\n\n例如 cloudbase functions:run --name app'
|
|
246
|
-
)
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|