@cloudbase/cli 2.0.12-alpha.3 → 2.0.14
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/commands/run/service/create.js +4 -0
- package/lib/commands/run/service/deploy.js +4 -0
- package/lib/commands/run/service/update.js +4 -0
- package/lib/run/service/common.js +9 -3
- 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/run/service/common.d.ts +4 -1
- package/types/types.d.ts +4 -0
- 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/package_20220712212537.json +0 -88
- package/.history/package_20220722205058.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 +0,0 @@
|
|
|
1
|
-
export * from './select'
|
|
@@ -1,60 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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,20 +0,0 @@
|
|
|
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/usage'
|
|
6
|
-
|
|
7
|
-
export async function collectUsage(command: string) {
|
|
8
|
-
const uin = await getUin()
|
|
9
|
-
const macMd5 = await getMacAddressMd5()
|
|
10
|
-
const os = await getOSInfo()
|
|
11
|
-
const data = {
|
|
12
|
-
os,
|
|
13
|
-
uin,
|
|
14
|
-
macMd5,
|
|
15
|
-
command,
|
|
16
|
-
version: process.CLI_VERSION
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return postFetch(url, data)
|
|
20
|
-
}
|
package/src/utils/store/auth.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import os from 'os'
|
|
2
|
-
import fs from 'fs'
|
|
3
|
-
import path from 'path'
|
|
4
|
-
import { checkFullAccess } from '../fs'
|
|
5
|
-
import { LocalStore } from './db'
|
|
6
|
-
import { ConfigItems } from '../../constant'
|
|
7
|
-
|
|
8
|
-
class AuthStore extends LocalStore {
|
|
9
|
-
constructor(defaults) {
|
|
10
|
-
super(defaults, 'auth')
|
|
11
|
-
this.defaults = defaults
|
|
12
|
-
this.moveOldConfig()
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// TODO: 迁移并删除旧的配置文件中的数据(在后续迭代中删除)
|
|
16
|
-
async moveOldConfig() {
|
|
17
|
-
const db = await this.getDB()
|
|
18
|
-
const oldConfigPath = path.resolve(
|
|
19
|
-
os.homedir(),
|
|
20
|
-
'.config',
|
|
21
|
-
'configstore',
|
|
22
|
-
'@cloudbase',
|
|
23
|
-
'cli.json'
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
if (checkFullAccess(oldConfigPath)) {
|
|
27
|
-
try {
|
|
28
|
-
const content = JSON.parse(fs.readFileSync(oldConfigPath, 'utf8'))
|
|
29
|
-
const { credential, ssh } = content
|
|
30
|
-
await db.set(ConfigItems.credential, credential).write()
|
|
31
|
-
await db.set(ConfigItems.ssh, ssh).write()
|
|
32
|
-
fs.unlinkSync(oldConfigPath)
|
|
33
|
-
} catch (e) {
|
|
34
|
-
fs.unlinkSync(oldConfigPath)
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export const authStore = new AuthStore({
|
|
41
|
-
_: '这是您的 CloudBase 身份凭据文件,请不要分享给他人!',
|
|
42
|
-
[ConfigItems.credential]: {},
|
|
43
|
-
[ConfigItems.ssh]: {}
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
export async function getUin() {
|
|
47
|
-
const credential = await authStore.get(ConfigItems.credential)
|
|
48
|
-
return credential?.uin || '无'
|
|
49
|
-
}
|
package/src/utils/store/db.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import os from 'os'
|
|
2
|
-
import fse from 'fs-extra'
|
|
3
|
-
import low from 'lowdb'
|
|
4
|
-
import path from 'path'
|
|
5
|
-
import FileAsync from 'lowdb/adapters/FileAsync'
|
|
6
|
-
import FileSync from 'lowdb/adapters/FileSync'
|
|
7
|
-
import xdgBasedir from 'xdg-basedir'
|
|
8
|
-
|
|
9
|
-
// 系统配置目录
|
|
10
|
-
const configDir = xdgBasedir.config || path.join(os.tmpdir(), '.config')
|
|
11
|
-
// cloudbase 配置目录
|
|
12
|
-
export const cloudbaseConfigDir = path.join(configDir, '.cloudbase')
|
|
13
|
-
|
|
14
|
-
// 确保目录存在
|
|
15
|
-
|
|
16
|
-
fse.ensureDirSync(cloudbaseConfigDir)
|
|
17
|
-
|
|
18
|
-
export function getAsyncDB(file: string) {
|
|
19
|
-
const dbPath = path.join(cloudbaseConfigDir, `${file}.json`)
|
|
20
|
-
const adapter = new FileAsync(dbPath)
|
|
21
|
-
const db = low(adapter)
|
|
22
|
-
return db
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function getSyncDB(file: string) {
|
|
26
|
-
const dbPath = path.join(cloudbaseConfigDir, `${file}.json`)
|
|
27
|
-
const adapter = new FileSync(dbPath)
|
|
28
|
-
const db = low(adapter)
|
|
29
|
-
return db
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export class LocalStore {
|
|
33
|
-
db: any
|
|
34
|
-
dbKey: string
|
|
35
|
-
defaults: any
|
|
36
|
-
|
|
37
|
-
constructor(defaults: any, dbKey = 'common') {
|
|
38
|
-
this.defaults = defaults
|
|
39
|
-
this.dbKey = dbKey
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async getDB() {
|
|
43
|
-
const db = this.db || (await getAsyncDB(this.dbKey))
|
|
44
|
-
this.db = db
|
|
45
|
-
return db
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async get(key: string): Promise<any> {
|
|
49
|
-
const defaultValue = this.defaults[key]
|
|
50
|
-
const db = await this.getDB()
|
|
51
|
-
return db.get(key).value() || defaultValue
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
async set(key: string, value: any) {
|
|
55
|
-
const db = await this.getDB()
|
|
56
|
-
await db.set(key, value).write()
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
async push(key: string, value: any) {
|
|
60
|
-
const db = await this.getDB()
|
|
61
|
-
await db.get(key).push(value).write()
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async delete(key) {
|
|
65
|
-
const db = await this.getDB()
|
|
66
|
-
await db.unset(key).write()
|
|
67
|
-
}
|
|
68
|
-
}
|
package/src/utils/store/index.ts
DELETED
package/src/utils/store/usage.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { CloudBaseError } from '@cloudbase/toolbox'
|
|
2
|
-
import { CloudApiService } from '../net'
|
|
3
|
-
|
|
4
|
-
const tcbrService = CloudApiService.getInstance('tcbr')
|
|
5
|
-
|
|
6
|
-
export async function callTcbrApi(action: string, data: Record<string, any>) {
|
|
7
|
-
try {
|
|
8
|
-
const res = await tcbrService.request(action, data)
|
|
9
|
-
// 返回统一格式的 JSON 结果
|
|
10
|
-
return {
|
|
11
|
-
code: 0,
|
|
12
|
-
errmsg: 'success',
|
|
13
|
-
data: {
|
|
14
|
-
...res
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
} catch (e) {
|
|
18
|
-
// 不直接 throw 因为调用 DescribeCloudRunServerDetail 如果传入了当前不存在的服务名会返回报错
|
|
19
|
-
// 对特殊错误特殊处理
|
|
20
|
-
if (e.code === 'AuthFailure.UnauthorizedOperation') {
|
|
21
|
-
console.log('\n', `requestId: ${e.requestId}`)
|
|
22
|
-
throw new CloudBaseError('您没有权限执行此操作,请检查 CAM 策略\n')
|
|
23
|
-
} else if (e.code === 'LimitExceeded') {
|
|
24
|
-
throw new CloudBaseError(`${e.original.Message}\n`)
|
|
25
|
-
}
|
|
26
|
-
return e
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './callTcbrApi'
|
package/src/utils/template.ts
DELETED
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import fs from 'fs'
|
|
2
|
-
import _ from 'lodash'
|
|
3
|
-
import path from 'path'
|
|
4
|
-
import fse from 'fs-extra'
|
|
5
|
-
import { prompt } from 'enquirer'
|
|
6
|
-
import { searchConfig, unzipStream, ConfigParser } from '@cloudbase/toolbox'
|
|
7
|
-
import { CloudBaseError } from '../error'
|
|
8
|
-
import { fetch, fetchStream } from './net'
|
|
9
|
-
|
|
10
|
-
import { logger } from './log'
|
|
11
|
-
import { checkFullAccess } from './fs'
|
|
12
|
-
import { execWithLoading } from './output'
|
|
13
|
-
import { templateDownloadReport } from './reporter'
|
|
14
|
-
|
|
15
|
-
const listUrl = 'https://tcli.service.tcloudbase.com/templates'
|
|
16
|
-
|
|
17
|
-
const getTemplateAddress = (templatePath: string) =>
|
|
18
|
-
`https://7463-tcli-1258016615.tcb.qcloud.la/cloudbase-templates/${templatePath}.zip`
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* 将初始化项目的过程拆成多步,以在 new 命令和 tcb 命令中复用
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
// 获取并下载模板,返回项目地址
|
|
25
|
-
export async function downloadTemplate(
|
|
26
|
-
options: {
|
|
27
|
-
appName?: string
|
|
28
|
-
newProject?: boolean
|
|
29
|
-
templateUri?: string
|
|
30
|
-
projectPath?: string
|
|
31
|
-
} = {}
|
|
32
|
-
) {
|
|
33
|
-
let { templateUri, appName, newProject, projectPath = process.cwd() } = options
|
|
34
|
-
// 拉取模板
|
|
35
|
-
const templates = await execWithLoading(() => fetch(listUrl), {
|
|
36
|
-
startTip: '获取应用模板列表中'
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
let templateName
|
|
40
|
-
let tempateId
|
|
41
|
-
|
|
42
|
-
if (templateUri) {
|
|
43
|
-
tempateId = templateUri
|
|
44
|
-
} else {
|
|
45
|
-
// 确定模板名称
|
|
46
|
-
const { selectTemplateName } = await prompt<any>({
|
|
47
|
-
type: 'select',
|
|
48
|
-
name: 'selectTemplateName',
|
|
49
|
-
message: '请选择应用模板',
|
|
50
|
-
choices: templates.map((item) => item.name)
|
|
51
|
-
})
|
|
52
|
-
templateName = selectTemplateName
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const selectedTemplate = templateName
|
|
56
|
-
? templates.find((item) => item.name === templateName)
|
|
57
|
-
: templates.find((item) => item.path === tempateId)
|
|
58
|
-
|
|
59
|
-
if (!selectedTemplate) {
|
|
60
|
-
logger.info(`模板 \`${templateName || tempateId}\` 不存在`)
|
|
61
|
-
return
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* 新建项目
|
|
66
|
-
*/
|
|
67
|
-
if (newProject) {
|
|
68
|
-
// appName 不存在时,输入应用
|
|
69
|
-
if (!appName) {
|
|
70
|
-
const { projectName } = await prompt<any>({
|
|
71
|
-
type: 'input',
|
|
72
|
-
name: 'projectName',
|
|
73
|
-
message: '请输入项目名称',
|
|
74
|
-
initial: selectedTemplate.path
|
|
75
|
-
})
|
|
76
|
-
appName = projectName
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// 确定项目权限
|
|
80
|
-
projectPath = path.join(process.cwd(), appName)
|
|
81
|
-
|
|
82
|
-
if (checkFullAccess(projectPath)) {
|
|
83
|
-
const { cover } = await prompt<any>({
|
|
84
|
-
type: 'confirm',
|
|
85
|
-
name: 'cover',
|
|
86
|
-
message: `已存在同名文件夹:${appName},是否覆盖?`,
|
|
87
|
-
initial: false
|
|
88
|
-
})
|
|
89
|
-
// 不覆盖,操作终止
|
|
90
|
-
if (!cover) {
|
|
91
|
-
throw new CloudBaseError('操作终止!')
|
|
92
|
-
} else {
|
|
93
|
-
// 覆盖操作不会删除不冲突的文件夹或文件
|
|
94
|
-
// 删除原有文件夹,防止生成的项目包含用户原有文件
|
|
95
|
-
fse.removeSync(projectPath)
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// 下载并解压文件
|
|
101
|
-
await execWithLoading(
|
|
102
|
-
async () => {
|
|
103
|
-
await templateDownloadReport(selectedTemplate.path, selectedTemplate.name)
|
|
104
|
-
await extractTemplate(projectPath, selectedTemplate.path, selectedTemplate.url)
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
startTip: '下载文件中'
|
|
108
|
-
}
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
return projectPath
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// 下载并解压
|
|
115
|
-
export async function extractTemplate(
|
|
116
|
-
projectPath: string,
|
|
117
|
-
templatePath: string,
|
|
118
|
-
remoteUrl?: string
|
|
119
|
-
) {
|
|
120
|
-
// 文件下载链接
|
|
121
|
-
const url = remoteUrl || getTemplateAddress(templatePath)
|
|
122
|
-
|
|
123
|
-
return fetchStream(url).then(async (res) => {
|
|
124
|
-
if (!res) {
|
|
125
|
-
throw new CloudBaseError('请求异常')
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (res.status !== 200) {
|
|
129
|
-
throw new CloudBaseError('未找到文件')
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// 解压缩文件
|
|
133
|
-
await unzipStream(res.body, projectPath)
|
|
134
|
-
})
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// 初始化项目配置
|
|
138
|
-
export async function initProjectConfig(
|
|
139
|
-
envId: string,
|
|
140
|
-
region: string,
|
|
141
|
-
projectPath: string = process.cwd()
|
|
142
|
-
) {
|
|
143
|
-
// 配置文件初始化,写入环境id
|
|
144
|
-
let filepath = (await searchConfig(projectPath))?.filepath
|
|
145
|
-
|
|
146
|
-
// 配置文件不存在
|
|
147
|
-
if (!filepath) {
|
|
148
|
-
fs.writeFileSync(
|
|
149
|
-
path.join(projectPath, 'cloudbaserc.json'),
|
|
150
|
-
JSON.stringify({
|
|
151
|
-
envId,
|
|
152
|
-
region,
|
|
153
|
-
version: '2.0',
|
|
154
|
-
$schema: 'https://framework-1258016615.tcloudbaseapp.com/schema/latest.json'
|
|
155
|
-
})
|
|
156
|
-
)
|
|
157
|
-
} else {
|
|
158
|
-
// 设置环境 Id
|
|
159
|
-
const configContent = fs.readFileSync(filepath).toString()
|
|
160
|
-
fs.writeFileSync(filepath, configContent.replace('{{envId}}', envId))
|
|
161
|
-
|
|
162
|
-
// 设置 region
|
|
163
|
-
const configPath = filepath || path.join(projectPath, 'cloudbaserc.json')
|
|
164
|
-
const parser = new ConfigParser({
|
|
165
|
-
configPath
|
|
166
|
-
})
|
|
167
|
-
// 把 region 写入到配置文件中
|
|
168
|
-
parser.update('region', region)
|
|
169
|
-
}
|
|
170
|
-
}
|
package/src/utils/tools/index.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import _ from 'lodash'
|
|
2
|
-
|
|
3
|
-
// declare module 'lodash' {
|
|
4
|
-
// interface LoDashStatic {
|
|
5
|
-
// deep(v: any, m: any): any;
|
|
6
|
-
// }
|
|
7
|
-
// }
|
|
8
|
-
|
|
9
|
-
_.mixin({
|
|
10
|
-
deep: function(obj, mapper) {
|
|
11
|
-
return mapper(
|
|
12
|
-
_.mapValues(obj, function(v) {
|
|
13
|
-
if (_.isPlainObject(v)) {
|
|
14
|
-
return _.deep(v, mapper)
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (_.isArray(v)) {
|
|
18
|
-
return _.map(v, val => _.deep(val, mapper))
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return v
|
|
22
|
-
})
|
|
23
|
-
)
|
|
24
|
-
}
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
export function firstLetterToLowerCase(data: Record<string, any>) {
|
|
28
|
-
return _.deep(data, function(x) {
|
|
29
|
-
return _.mapKeys(x, function(val, key) {
|
|
30
|
-
return key.charAt(0).toLowerCase() + key.slice(1)
|
|
31
|
-
})
|
|
32
|
-
})
|
|
33
|
-
}
|
package/src/utils/tools/time.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
export function formatDate(dateParam: string | number | Date, fmtParam: string) {
|
|
2
|
-
let date: Date
|
|
3
|
-
let fmt = fmtParam
|
|
4
|
-
if (date instanceof Date === false) {
|
|
5
|
-
date = new Date(dateParam)
|
|
6
|
-
}
|
|
7
|
-
if (/(y+)/.test(fmt)) {
|
|
8
|
-
fmt = fmt.replace(RegExp.$1, String(date.getFullYear()).substr(4 - RegExp.$1.length))
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
let expMap = {
|
|
12
|
-
'M+': date.getMonth() + 1,
|
|
13
|
-
'd+': date.getDate(),
|
|
14
|
-
'h+': date.getHours(),
|
|
15
|
-
'm+': date.getMinutes(),
|
|
16
|
-
's+': date.getSeconds(),
|
|
17
|
-
S: date.getMilliseconds()
|
|
18
|
-
}
|
|
19
|
-
for (let exp in expMap) {
|
|
20
|
-
if (new RegExp('(' + exp + ')').test(fmt)) {
|
|
21
|
-
fmt = fmt.replace(
|
|
22
|
-
RegExp.$1,
|
|
23
|
-
RegExp.$1.length === 1
|
|
24
|
-
? expMap[exp]
|
|
25
|
-
: ('00' + expMap[exp]).substr(String(expMap[exp]).length)
|
|
26
|
-
)
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return fmt
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export async function sleep(time: number) {
|
|
33
|
-
return new Promise<void>(resolve => {
|
|
34
|
-
setTimeout(() => {
|
|
35
|
-
resolve()
|
|
36
|
-
}, time)
|
|
37
|
-
})
|
|
38
|
-
}
|
package/src/utils/tools/uid.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import crypto from 'crypto'
|
|
2
|
-
|
|
3
|
-
export function random(len = 8) {
|
|
4
|
-
if (!Number.isInteger(len)) {
|
|
5
|
-
throw new Error('len must be an integer')
|
|
6
|
-
}
|
|
7
|
-
return crypto
|
|
8
|
-
.randomBytes(len)
|
|
9
|
-
.toString('hex')
|
|
10
|
-
.substring(0, len)
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function uuidv4() {
|
|
14
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
|
15
|
-
const r = (Math.random() * 16) | 0
|
|
16
|
-
const v = c === 'x' ? r : (r & 0x3) | 0x8
|
|
17
|
-
return v.toString(16)
|
|
18
|
-
})
|
|
19
|
-
}
|
package/src/utils/validator.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { CloudBaseError } from '../error'
|
|
2
|
-
import { CPU_MEM_OPTS } from '../constant'
|
|
3
|
-
import { convertNumber } from '../run'
|
|
4
|
-
|
|
5
|
-
type SimpleValue = number | string | boolean
|
|
6
|
-
|
|
7
|
-
export function assertTruthy(val: SimpleValue | SimpleValue[], errMsg: string) {
|
|
8
|
-
let ok
|
|
9
|
-
if (Array.isArray(val)) {
|
|
10
|
-
ok = val.every(item => Boolean(val))
|
|
11
|
-
} else {
|
|
12
|
-
ok = Boolean(val)
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
if (!ok) {
|
|
16
|
-
throw new CloudBaseError(errMsg)
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function assertHas(obj: any, prop: string, errMsg): void {
|
|
21
|
-
if (!obj[prop]) {
|
|
22
|
-
throw new CloudBaseError(errMsg)
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
export const validateIp = (ip: string): boolean => {
|
|
28
|
-
if (Object.prototype.toString.call(ip) !== '[object String]') return false
|
|
29
|
-
const fields = ip.split('.')
|
|
30
|
-
if (
|
|
31
|
-
fields.length !== 4 ||
|
|
32
|
-
fields.find(item => isNaN(Number(item)) || Number(item) < 0 || Number(item) > 255)
|
|
33
|
-
) return false
|
|
34
|
-
return true
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// 检查 cpu 和 mem 是否符合约束条件
|
|
38
|
-
export const validateCpuMem = (cpuInput: number | string | undefined, memInput: number | string | undefined): { cpuOutput: number, memOutput: number } => {
|
|
39
|
-
if (cpuInput !== undefined && memInput !== undefined) {
|
|
40
|
-
let cpuSet = convertNumber(cpuInput)
|
|
41
|
-
let memSet = convertNumber(memInput)
|
|
42
|
-
let validMemSet = CPU_MEM_OPTS.find(({ cpu }) => cpu === cpuSet)
|
|
43
|
-
if (!validMemSet || !validMemSet.mems.length || !validMemSet.mems.includes(memSet)) {
|
|
44
|
-
throw new CloudBaseError(`cpu 与 mem 规格不匹配,当前规格:cpu: ${cpuInput}, mem: ${memInput}
|
|
45
|
-
请使用下列规格组合之一:${CPU_MEM_OPTS.map(({ cpu, mems }) => `${cpu}-${mems.join('/')}`).join(',')}`)
|
|
46
|
-
}
|
|
47
|
-
return { cpuOutput: cpuSet, memOutput: memSet }
|
|
48
|
-
}
|
|
49
|
-
if (cpuInput) {
|
|
50
|
-
let cpuSet = convertNumber(cpuInput)
|
|
51
|
-
let validSet = CPU_MEM_OPTS.find(({ cpu }) => cpu === cpuSet)
|
|
52
|
-
if (!validSet) {
|
|
53
|
-
throw new CloudBaseError(`不支持当前 cpu 规格,请使用下列 cpu 规格之一:${CPU_MEM_OPTS.map(({ cpu }) => cpu).join(',')}`)
|
|
54
|
-
}
|
|
55
|
-
return { cpuOutput: cpuSet, memOutput: CPU_MEM_OPTS.find(({ cpu }) => cpu === cpuSet).mems[0] }
|
|
56
|
-
}
|
|
57
|
-
if (memInput) {
|
|
58
|
-
let memSet = convertNumber(memInput)
|
|
59
|
-
let validSet = CPU_MEM_OPTS.find(({ mems }) => mems.includes(memSet))
|
|
60
|
-
if (!validSet) {
|
|
61
|
-
throw new CloudBaseError(`不支持当前 mem 规格,请使用下列 mem 规格之一:${CPU_MEM_OPTS.map(({ mems }) => mems.join('/')).join(',')}`)
|
|
62
|
-
}
|
|
63
|
-
return { cpuOutput: validSet.cpu, memOutput: memSet }
|
|
64
|
-
}
|
|
65
|
-
}
|