@cloudbase/cli 2.0.0 → 2.0.1
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 +16 -16
- 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/fs/del.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import del from 'del'
|
|
2
|
-
|
|
3
|
-
export function delSync(patterns: string | readonly string[]) {
|
|
4
|
-
del.sync(patterns, { force: true })
|
|
5
|
-
}
|
|
1
|
+
import del from 'del'
|
|
2
|
+
|
|
3
|
+
export function delSync(patterns: string | readonly string[]) {
|
|
4
|
+
del.sync(patterns, { force: true })
|
|
5
|
+
}
|
package/src/utils/fs/index.ts
CHANGED
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
import fs from 'fs'
|
|
2
|
-
import { CloudBaseError } from '../../error'
|
|
3
|
-
|
|
4
|
-
export * from './del'
|
|
5
|
-
|
|
6
|
-
export type SizeUnit = 'KB' | 'MB' | 'GB'
|
|
7
|
-
|
|
8
|
-
// 检查路径是否可以访问(读、写)
|
|
9
|
-
export function checkFullAccess(dest: string, throwError = false): boolean {
|
|
10
|
-
try {
|
|
11
|
-
// 可见、可写
|
|
12
|
-
fs.accessSync(dest, fs.constants.F_OK)
|
|
13
|
-
fs.accessSync(dest, fs.constants.W_OK)
|
|
14
|
-
fs.accessSync(dest, fs.constants.R_OK)
|
|
15
|
-
return true
|
|
16
|
-
} catch (e) {
|
|
17
|
-
if (throwError) {
|
|
18
|
-
throw new CloudBaseError(`路径不存在或没有权限访问:${dest}`)
|
|
19
|
-
} else {
|
|
20
|
-
return false
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// 检查路径是否可以读
|
|
26
|
-
export function checkWritable(dest: string, throwError = false): boolean {
|
|
27
|
-
try {
|
|
28
|
-
// 可见、可写
|
|
29
|
-
fs.accessSync(dest, fs.constants.F_OK)
|
|
30
|
-
fs.accessSync(dest, fs.constants.W_OK)
|
|
31
|
-
return true
|
|
32
|
-
} catch (e) {
|
|
33
|
-
if (throwError) {
|
|
34
|
-
throw new CloudBaseError(`路径不存在或没有权限访问:${dest}`)
|
|
35
|
-
} else {
|
|
36
|
-
return false
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// 检查路径是否可以写
|
|
42
|
-
export function checkReadable(dest: string, throwError = false): boolean {
|
|
43
|
-
try {
|
|
44
|
-
// 可见、可读
|
|
45
|
-
fs.accessSync(dest, fs.constants.F_OK)
|
|
46
|
-
fs.accessSync(dest, fs.constants.R_OK)
|
|
47
|
-
return true
|
|
48
|
-
} catch (e) {
|
|
49
|
-
if (throwError) {
|
|
50
|
-
throw new CloudBaseError(`路径不存在或没有权限访问:${dest}`)
|
|
51
|
-
} else {
|
|
52
|
-
return false
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function isDirectory(dest: string) {
|
|
58
|
-
checkFullAccess(dest, true)
|
|
59
|
-
return fs.statSync(dest).isDirectory()
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export function formateFileSize(size: number | string, unit: SizeUnit) {
|
|
63
|
-
const numSize = Number(size)
|
|
64
|
-
const unitMap = {
|
|
65
|
-
KB: 1024,
|
|
66
|
-
MB: Math.pow(1024, 2),
|
|
67
|
-
GB: Math.pow(1024, 3)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return Number(numSize / unitMap[unit]).toFixed(2)
|
|
71
|
-
}
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import { CloudBaseError } from '../../error'
|
|
3
|
+
|
|
4
|
+
export * from './del'
|
|
5
|
+
|
|
6
|
+
export type SizeUnit = 'KB' | 'MB' | 'GB'
|
|
7
|
+
|
|
8
|
+
// 检查路径是否可以访问(读、写)
|
|
9
|
+
export function checkFullAccess(dest: string, throwError = false): boolean {
|
|
10
|
+
try {
|
|
11
|
+
// 可见、可写
|
|
12
|
+
fs.accessSync(dest, fs.constants.F_OK)
|
|
13
|
+
fs.accessSync(dest, fs.constants.W_OK)
|
|
14
|
+
fs.accessSync(dest, fs.constants.R_OK)
|
|
15
|
+
return true
|
|
16
|
+
} catch (e) {
|
|
17
|
+
if (throwError) {
|
|
18
|
+
throw new CloudBaseError(`路径不存在或没有权限访问:${dest}`)
|
|
19
|
+
} else {
|
|
20
|
+
return false
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// 检查路径是否可以读
|
|
26
|
+
export function checkWritable(dest: string, throwError = false): boolean {
|
|
27
|
+
try {
|
|
28
|
+
// 可见、可写
|
|
29
|
+
fs.accessSync(dest, fs.constants.F_OK)
|
|
30
|
+
fs.accessSync(dest, fs.constants.W_OK)
|
|
31
|
+
return true
|
|
32
|
+
} catch (e) {
|
|
33
|
+
if (throwError) {
|
|
34
|
+
throw new CloudBaseError(`路径不存在或没有权限访问:${dest}`)
|
|
35
|
+
} else {
|
|
36
|
+
return false
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// 检查路径是否可以写
|
|
42
|
+
export function checkReadable(dest: string, throwError = false): boolean {
|
|
43
|
+
try {
|
|
44
|
+
// 可见、可读
|
|
45
|
+
fs.accessSync(dest, fs.constants.F_OK)
|
|
46
|
+
fs.accessSync(dest, fs.constants.R_OK)
|
|
47
|
+
return true
|
|
48
|
+
} catch (e) {
|
|
49
|
+
if (throwError) {
|
|
50
|
+
throw new CloudBaseError(`路径不存在或没有权限访问:${dest}`)
|
|
51
|
+
} else {
|
|
52
|
+
return false
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function isDirectory(dest: string) {
|
|
58
|
+
checkFullAccess(dest, true)
|
|
59
|
+
return fs.statSync(dest).isDirectory()
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function formateFileSize(size: number | string, unit: SizeUnit) {
|
|
63
|
+
const numSize = Number(size)
|
|
64
|
+
const unitMap = {
|
|
65
|
+
KB: 1024,
|
|
66
|
+
MB: Math.pow(1024, 2),
|
|
67
|
+
GB: Math.pow(1024, 3)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return Number(numSize / unitMap[unit]).toFixed(2)
|
|
71
|
+
}
|
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
import fs from 'fs'
|
|
2
|
-
import del from 'del'
|
|
3
|
-
import path from 'path'
|
|
4
|
-
import makeDir from 'make-dir'
|
|
5
|
-
import { random } from './tools'
|
|
6
|
-
import { CloudBaseError, zipDir, checkFullAccess } from '@cloudbase/toolbox'
|
|
7
|
-
|
|
8
|
-
export enum CodeType {
|
|
9
|
-
File,
|
|
10
|
-
JavaFile
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* 将函数代码转换成 Base64 编码
|
|
15
|
-
* 普通文件:Node,PHP
|
|
16
|
-
* Java 文件:Jar,ZIP
|
|
17
|
-
*/
|
|
18
|
-
export class FunctionPacker {
|
|
19
|
-
// 项目根目录
|
|
20
|
-
root: string
|
|
21
|
-
// 函数名
|
|
22
|
-
name: string
|
|
23
|
-
// 代码文件类型
|
|
24
|
-
type: CodeType
|
|
25
|
-
funcPath: string
|
|
26
|
-
funcDistPath: string
|
|
27
|
-
// 临时目录
|
|
28
|
-
tmpPath: string
|
|
29
|
-
// 忽略文件模式
|
|
30
|
-
ignore: string | string[]
|
|
31
|
-
|
|
32
|
-
constructor(root: string, name: string, ignore: string | string[]) {
|
|
33
|
-
this.name = name
|
|
34
|
-
this.root = root
|
|
35
|
-
this.ignore = ignore
|
|
36
|
-
this.funcPath = path.join(root, name)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async getFileCode() {
|
|
40
|
-
checkFullAccess(this.funcPath, true)
|
|
41
|
-
// 构建临时文件夹存放函数打包结果
|
|
42
|
-
this.tmpPath = path.join(this.root, `.cloudbase_tmp_${random()}`)
|
|
43
|
-
this.funcDistPath = path.join(this.tmpPath, this.name)
|
|
44
|
-
// 生成存放 zip 文件的文件夹
|
|
45
|
-
await makeDir(this.funcDistPath)
|
|
46
|
-
const zipPath = path.resolve(this.funcDistPath, 'dist.zip')
|
|
47
|
-
// 生成 zip 文件
|
|
48
|
-
|
|
49
|
-
await zipDir(this.funcPath, zipPath, this.ignore)
|
|
50
|
-
// 将 zip 文件转换成 base64
|
|
51
|
-
const base64 = fs.readFileSync(zipPath).toString('base64')
|
|
52
|
-
// 清除打包文件
|
|
53
|
-
this.clean()
|
|
54
|
-
return base64
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// 获取 Java 代码
|
|
58
|
-
getJavaFileCode() {
|
|
59
|
-
const { funcPath } = this
|
|
60
|
-
// Java 代码为 jar 或 zip 包
|
|
61
|
-
const jarExist = checkFullAccess(`${funcPath}.jar`)
|
|
62
|
-
const zipExist = checkFullAccess(`${funcPath}.zip`)
|
|
63
|
-
if (!jarExist && !zipExist) {
|
|
64
|
-
return null
|
|
65
|
-
}
|
|
66
|
-
const packagePath = jarExist ? `${funcPath}.jar` : `${funcPath}.zip`
|
|
67
|
-
return fs.readFileSync(packagePath).toString('base64')
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
async build(type: CodeType) {
|
|
71
|
-
if (type === CodeType.JavaFile) {
|
|
72
|
-
try {
|
|
73
|
-
const code = await this.getJavaFileCode()
|
|
74
|
-
return code
|
|
75
|
-
} catch (error) {
|
|
76
|
-
this.clean()
|
|
77
|
-
throw new CloudBaseError(`函数代码打包失败:\n ${error.message}`)
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (type === CodeType.File) {
|
|
82
|
-
try {
|
|
83
|
-
const code = await this.getFileCode()
|
|
84
|
-
return code
|
|
85
|
-
} catch (error) {
|
|
86
|
-
this.clean()
|
|
87
|
-
throw new CloudBaseError(`函数代码打包失败:\n ${error.message}`)
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
clean() {
|
|
93
|
-
// allow deleting the current working directory and outside
|
|
94
|
-
this.funcDistPath && del.sync([this.funcDistPath], { force: true })
|
|
95
|
-
this.tmpPath && del.sync([this.tmpPath], { force: true })
|
|
96
|
-
}
|
|
97
|
-
}
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import del from 'del'
|
|
3
|
+
import path from 'path'
|
|
4
|
+
import makeDir from 'make-dir'
|
|
5
|
+
import { random } from './tools'
|
|
6
|
+
import { CloudBaseError, zipDir, checkFullAccess } from '@cloudbase/toolbox'
|
|
7
|
+
|
|
8
|
+
export enum CodeType {
|
|
9
|
+
File,
|
|
10
|
+
JavaFile
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 将函数代码转换成 Base64 编码
|
|
15
|
+
* 普通文件:Node,PHP
|
|
16
|
+
* Java 文件:Jar,ZIP
|
|
17
|
+
*/
|
|
18
|
+
export class FunctionPacker {
|
|
19
|
+
// 项目根目录
|
|
20
|
+
root: string
|
|
21
|
+
// 函数名
|
|
22
|
+
name: string
|
|
23
|
+
// 代码文件类型
|
|
24
|
+
type: CodeType
|
|
25
|
+
funcPath: string
|
|
26
|
+
funcDistPath: string
|
|
27
|
+
// 临时目录
|
|
28
|
+
tmpPath: string
|
|
29
|
+
// 忽略文件模式
|
|
30
|
+
ignore: string | string[]
|
|
31
|
+
|
|
32
|
+
constructor(root: string, name: string, ignore: string | string[]) {
|
|
33
|
+
this.name = name
|
|
34
|
+
this.root = root
|
|
35
|
+
this.ignore = ignore
|
|
36
|
+
this.funcPath = path.join(root, name)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async getFileCode() {
|
|
40
|
+
checkFullAccess(this.funcPath, true)
|
|
41
|
+
// 构建临时文件夹存放函数打包结果
|
|
42
|
+
this.tmpPath = path.join(this.root, `.cloudbase_tmp_${random()}`)
|
|
43
|
+
this.funcDistPath = path.join(this.tmpPath, this.name)
|
|
44
|
+
// 生成存放 zip 文件的文件夹
|
|
45
|
+
await makeDir(this.funcDistPath)
|
|
46
|
+
const zipPath = path.resolve(this.funcDistPath, 'dist.zip')
|
|
47
|
+
// 生成 zip 文件
|
|
48
|
+
|
|
49
|
+
await zipDir(this.funcPath, zipPath, this.ignore)
|
|
50
|
+
// 将 zip 文件转换成 base64
|
|
51
|
+
const base64 = fs.readFileSync(zipPath).toString('base64')
|
|
52
|
+
// 清除打包文件
|
|
53
|
+
this.clean()
|
|
54
|
+
return base64
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// 获取 Java 代码
|
|
58
|
+
getJavaFileCode() {
|
|
59
|
+
const { funcPath } = this
|
|
60
|
+
// Java 代码为 jar 或 zip 包
|
|
61
|
+
const jarExist = checkFullAccess(`${funcPath}.jar`)
|
|
62
|
+
const zipExist = checkFullAccess(`${funcPath}.zip`)
|
|
63
|
+
if (!jarExist && !zipExist) {
|
|
64
|
+
return null
|
|
65
|
+
}
|
|
66
|
+
const packagePath = jarExist ? `${funcPath}.jar` : `${funcPath}.zip`
|
|
67
|
+
return fs.readFileSync(packagePath).toString('base64')
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async build(type: CodeType) {
|
|
71
|
+
if (type === CodeType.JavaFile) {
|
|
72
|
+
try {
|
|
73
|
+
const code = await this.getJavaFileCode()
|
|
74
|
+
return code
|
|
75
|
+
} catch (error) {
|
|
76
|
+
this.clean()
|
|
77
|
+
throw new CloudBaseError(`函数代码打包失败:\n ${error.message}`)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (type === CodeType.File) {
|
|
82
|
+
try {
|
|
83
|
+
const code = await this.getFileCode()
|
|
84
|
+
return code
|
|
85
|
+
} catch (error) {
|
|
86
|
+
this.clean()
|
|
87
|
+
throw new CloudBaseError(`函数代码打包失败:\n ${error.message}`)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
clean() {
|
|
93
|
+
// allow deleting the current working directory and outside
|
|
94
|
+
this.funcDistPath && del.sync([this.funcDistPath], { force: true })
|
|
95
|
+
this.tmpPath && del.sync([this.tmpPath], { force: true })
|
|
96
|
+
}
|
|
97
|
+
}
|
package/src/utils/log.ts
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
import chalk from 'chalk'
|
|
2
|
-
import logSymbols from 'log-symbols'
|
|
3
|
-
import { format } from 'util'
|
|
4
|
-
import { Console } from 'console'
|
|
5
|
-
import terminalLink from 'terminal-link'
|
|
6
|
-
|
|
7
|
-
export class Logger {
|
|
8
|
-
c = {
|
|
9
|
-
_times: new Map(),
|
|
10
|
-
log(a: string, ...args: string[]) {
|
|
11
|
-
this.debug(format(a, ...args))
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
verboseEnabled: boolean
|
|
16
|
-
|
|
17
|
-
constructor(options: { verbose?: boolean } = {}) {
|
|
18
|
-
const { verbose } = options
|
|
19
|
-
this.verboseEnabled = verbose
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
breakLine() {
|
|
23
|
-
console.log()
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
log(...args) {
|
|
27
|
-
console.log(...args)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
info(msg: string) {
|
|
31
|
-
console.log(`${logSymbols.info} ${msg}`)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
success(msg: string) {
|
|
35
|
-
console.log(`${logSymbols.success} ${msg}`)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
warn(msg: string) {
|
|
39
|
-
console.log(`${logSymbols.warning} ${msg}`)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
error(msg: string) {
|
|
43
|
-
console.log(`${logSymbols.error} ${msg}`)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
verbose(...args: any) {
|
|
47
|
-
if (this.verboseEnabled) {
|
|
48
|
-
const msg = args.join(' ▶️ ')
|
|
49
|
-
console.log(
|
|
50
|
-
`${chalk.bold('[debug]')} ${chalk.gray(`[${new Date().toISOString()}]`)} ${msg}`
|
|
51
|
-
)
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
genClickableLink(link: string) {
|
|
56
|
-
if (terminalLink.isSupported) {
|
|
57
|
-
const clickablelink = terminalLink(link, link)
|
|
58
|
-
return chalk.bold.cyan(clickablelink)
|
|
59
|
-
}
|
|
60
|
-
return chalk.bold.underline.cyan(link)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
printClickableLink(link: string) {
|
|
64
|
-
const clickLink = this.genClickableLink(link)
|
|
65
|
-
this.info(clickLink)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async time(label: string, fn: Promise<any> | (() => Promise<any>)) {
|
|
69
|
-
const promise = typeof fn === 'function' ? fn() : fn
|
|
70
|
-
if (this.verboseEnabled) {
|
|
71
|
-
this.c.log(label)
|
|
72
|
-
Console.prototype.time.call(this.c, label)
|
|
73
|
-
const r = await promise
|
|
74
|
-
Console.prototype.timeEnd.call(this.c, label)
|
|
75
|
-
return r
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return promise
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
1
|
+
import chalk from 'chalk'
|
|
2
|
+
import logSymbols from 'log-symbols'
|
|
3
|
+
import { format } from 'util'
|
|
4
|
+
import { Console } from 'console'
|
|
5
|
+
import terminalLink from 'terminal-link'
|
|
6
|
+
|
|
7
|
+
export class Logger {
|
|
8
|
+
c = {
|
|
9
|
+
_times: new Map(),
|
|
10
|
+
log(a: string, ...args: string[]) {
|
|
11
|
+
this.debug(format(a, ...args))
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
verboseEnabled: boolean
|
|
16
|
+
|
|
17
|
+
constructor(options: { verbose?: boolean } = {}) {
|
|
18
|
+
const { verbose } = options
|
|
19
|
+
this.verboseEnabled = verbose
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
breakLine() {
|
|
23
|
+
console.log()
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
log(...args) {
|
|
27
|
+
console.log(...args)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
info(msg: string) {
|
|
31
|
+
console.log(`${logSymbols.info} ${msg}`)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
success(msg: string) {
|
|
35
|
+
console.log(`${logSymbols.success} ${msg}`)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
warn(msg: string) {
|
|
39
|
+
console.log(`${logSymbols.warning} ${msg}`)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
error(msg: string) {
|
|
43
|
+
console.log(`${logSymbols.error} ${msg}`)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
verbose(...args: any) {
|
|
47
|
+
if (this.verboseEnabled) {
|
|
48
|
+
const msg = args.join(' ▶️ ')
|
|
49
|
+
console.log(
|
|
50
|
+
`${chalk.bold('[debug]')} ${chalk.gray(`[${new Date().toISOString()}]`)} ${msg}`
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
genClickableLink(link: string) {
|
|
56
|
+
if (terminalLink.isSupported) {
|
|
57
|
+
const clickablelink = terminalLink(link, link)
|
|
58
|
+
return chalk.bold.cyan(clickablelink)
|
|
59
|
+
}
|
|
60
|
+
return chalk.bold.underline.cyan(link)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
printClickableLink(link: string) {
|
|
64
|
+
const clickLink = this.genClickableLink(link)
|
|
65
|
+
this.info(clickLink)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async time(label: string, fn: Promise<any> | (() => Promise<any>)) {
|
|
69
|
+
const promise = typeof fn === 'function' ? fn() : fn
|
|
70
|
+
if (this.verboseEnabled) {
|
|
71
|
+
this.c.log(label)
|
|
72
|
+
Console.prototype.time.call(this.c, label)
|
|
73
|
+
const r = await promise
|
|
74
|
+
Console.prototype.timeEnd.call(this.c, label)
|
|
75
|
+
return r
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return promise
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
82
|
export const logger = new Logger()
|
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
import { getCredentialWithoutCheck, getRegion, Credential, getProxy } from '@cloudbase/toolbox'
|
|
2
|
-
import { CloudApiService as _CloudApiService } from '@cloudbase/cloud-api'
|
|
3
|
-
import { CloudBaseError } from '../../error'
|
|
4
|
-
import { REQUEST_TIMEOUT } from '../../constant'
|
|
5
|
-
|
|
6
|
-
let commonCredential: Credential
|
|
7
|
-
|
|
8
|
-
// token 将在 n 分钟内过期
|
|
9
|
-
const isTokenExpired = (credential: Credential, gap = 120) =>
|
|
10
|
-
credential.accessTokenExpired && Number(credential.accessTokenExpired) < Date.now() + gap * 1000
|
|
11
|
-
|
|
12
|
-
export class CloudApiService {
|
|
13
|
-
// 缓存请求实例
|
|
14
|
-
static serviceCacheMap: Record<string, CloudApiService> = {}
|
|
15
|
-
|
|
16
|
-
// 单例模式
|
|
17
|
-
static getInstance(service: string) {
|
|
18
|
-
if (CloudApiService.serviceCacheMap?.[service]) {
|
|
19
|
-
return CloudApiService.serviceCacheMap[service]
|
|
20
|
-
}
|
|
21
|
-
const apiService = new CloudApiService(service)
|
|
22
|
-
CloudApiService.serviceCacheMap[service] = apiService
|
|
23
|
-
return apiService
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
region: string
|
|
27
|
-
apiService: _CloudApiService
|
|
28
|
-
|
|
29
|
-
constructor(service: string, baseParams?: Record<string, any>, version = '') {
|
|
30
|
-
// 初始化 API 实例
|
|
31
|
-
this.apiService = new _CloudApiService({
|
|
32
|
-
service,
|
|
33
|
-
version: service === 'tcr' ? version : '2019-09-24',
|
|
34
|
-
baseParams,
|
|
35
|
-
proxy: getProxy(),
|
|
36
|
-
timeout: REQUEST_TIMEOUT,
|
|
37
|
-
getCredential: async () => {
|
|
38
|
-
// 存在未过期的 token
|
|
39
|
-
if (commonCredential?.secretId && !isTokenExpired(commonCredential)) {
|
|
40
|
-
return commonCredential
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const credential = await getCredentialWithoutCheck()
|
|
44
|
-
if (!credential) {
|
|
45
|
-
throw new CloudBaseError('无有效身份信息,请使用 cloudbase login 登录')
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
commonCredential = credential
|
|
49
|
-
|
|
50
|
-
return {
|
|
51
|
-
...credential,
|
|
52
|
-
tokenExpired: Number(credential.accessTokenExpired)
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
})
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async request(action: string, data: Record<string, any> = {}, method: 'POST' | 'GET' = 'POST') {
|
|
59
|
-
const region = this.region || (await getRegion())
|
|
60
|
-
return this.apiService.request({ action, data, method, region })
|
|
61
|
-
}
|
|
62
|
-
}
|
|
1
|
+
import { getCredentialWithoutCheck, getRegion, Credential, getProxy } from '@cloudbase/toolbox'
|
|
2
|
+
import { CloudApiService as _CloudApiService } from '@cloudbase/cloud-api'
|
|
3
|
+
import { CloudBaseError } from '../../error'
|
|
4
|
+
import { REQUEST_TIMEOUT } from '../../constant'
|
|
5
|
+
|
|
6
|
+
let commonCredential: Credential
|
|
7
|
+
|
|
8
|
+
// token 将在 n 分钟内过期
|
|
9
|
+
const isTokenExpired = (credential: Credential, gap = 120) =>
|
|
10
|
+
credential.accessTokenExpired && Number(credential.accessTokenExpired) < Date.now() + gap * 1000
|
|
11
|
+
|
|
12
|
+
export class CloudApiService {
|
|
13
|
+
// 缓存请求实例
|
|
14
|
+
static serviceCacheMap: Record<string, CloudApiService> = {}
|
|
15
|
+
|
|
16
|
+
// 单例模式
|
|
17
|
+
static getInstance(service: string) {
|
|
18
|
+
if (CloudApiService.serviceCacheMap?.[service]) {
|
|
19
|
+
return CloudApiService.serviceCacheMap[service]
|
|
20
|
+
}
|
|
21
|
+
const apiService = new CloudApiService(service)
|
|
22
|
+
CloudApiService.serviceCacheMap[service] = apiService
|
|
23
|
+
return apiService
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
region: string
|
|
27
|
+
apiService: _CloudApiService
|
|
28
|
+
|
|
29
|
+
constructor(service: string, baseParams?: Record<string, any>, version = '') {
|
|
30
|
+
// 初始化 API 实例
|
|
31
|
+
this.apiService = new _CloudApiService({
|
|
32
|
+
service,
|
|
33
|
+
version: service === 'tcr' ? version : '2019-09-24',
|
|
34
|
+
baseParams,
|
|
35
|
+
proxy: getProxy(),
|
|
36
|
+
timeout: REQUEST_TIMEOUT,
|
|
37
|
+
getCredential: async () => {
|
|
38
|
+
// 存在未过期的 token
|
|
39
|
+
if (commonCredential?.secretId && !isTokenExpired(commonCredential)) {
|
|
40
|
+
return commonCredential
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const credential = await getCredentialWithoutCheck()
|
|
44
|
+
if (!credential) {
|
|
45
|
+
throw new CloudBaseError('无有效身份信息,请使用 cloudbase login 登录')
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
commonCredential = credential
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
...credential,
|
|
52
|
+
tokenExpired: Number(credential.accessTokenExpired)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async request(action: string, data: Record<string, any> = {}, method: 'POST' | 'GET' = 'POST') {
|
|
59
|
+
const region = this.region || (await getRegion())
|
|
60
|
+
return this.apiService.request({ action, data, method, region })
|
|
61
|
+
}
|
|
62
|
+
}
|