@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.
Files changed (206) hide show
  1. package/.editorconfig +9 -9
  2. package/.eslintignore +7 -7
  3. package/.eslintrc +35 -35
  4. package/.prettierrc.js +29 -29
  5. package/.vscode/launch.json +16 -16
  6. package/LICENSE +5 -5
  7. package/README.md +35 -35
  8. package/bin/cloudbase.js +5 -5
  9. package/bin/tcb.js +6 -4
  10. package/changelog.md +6 -6
  11. package/jest.config.js +17 -17
  12. package/lib/commands/account/login.js +18 -18
  13. package/lib/commands/storage/storage.js +1 -1
  14. package/lib/env/login.js +7 -7
  15. package/lib/run/service/deployPackage.js +6 -4
  16. package/lib/utils/net/http-request.js +4 -4
  17. package/lib/utils/tcbrApi/tcbr-cloud-api/request.js +3 -3
  18. package/package.json +16 -16
  19. package/post-install.js +61 -61
  20. package/runtime/nodejs/bootstrap.js +255 -255
  21. package/runtime/nodejs/runtime.js +183 -183
  22. package/src/auth/index.ts +1 -1
  23. package/src/auth/login.ts +91 -91
  24. package/src/auth/logout.ts +7 -7
  25. package/src/commands/account/index.ts +2 -2
  26. package/src/commands/account/login.ts +192 -192
  27. package/src/commands/account/logout.ts +24 -24
  28. package/src/commands/common.ts +246 -246
  29. package/src/commands/env/base.ts +90 -90
  30. package/src/commands/env/create.ts +92 -92
  31. package/src/commands/env/domain.ts +186 -186
  32. package/src/commands/env/index.ts +4 -4
  33. package/src/commands/env/login.ts +235 -235
  34. package/src/commands/framework/index.ts +124 -124
  35. package/src/commands/functions/alias/getRoute.ts +76 -76
  36. package/src/commands/functions/alias/index.ts +2 -2
  37. package/src/commands/functions/alias/setRoute.ts +82 -82
  38. package/src/commands/functions/code-download.ts +100 -100
  39. package/src/commands/functions/code-update.ts +62 -62
  40. package/src/commands/functions/concurrency/delete.ts +45 -45
  41. package/src/commands/functions/concurrency/index.ts +2 -2
  42. package/src/commands/functions/concurrency/list.ts +58 -58
  43. package/src/commands/functions/concurrency/set.ts +47 -47
  44. package/src/commands/functions/config-update.ts +76 -76
  45. package/src/commands/functions/copy.ts +62 -62
  46. package/src/commands/functions/delete.ts +79 -79
  47. package/src/commands/functions/deploy.ts +293 -293
  48. package/src/commands/functions/detail.ts +138 -138
  49. package/src/commands/functions/index.ts +16 -16
  50. package/src/commands/functions/invoke.ts +121 -121
  51. package/src/commands/functions/layer/bind.ts +182 -182
  52. package/src/commands/functions/layer/common.ts +8 -8
  53. package/src/commands/functions/layer/create.ts +49 -49
  54. package/src/commands/functions/layer/delete.ts +73 -73
  55. package/src/commands/functions/layer/download.ts +92 -92
  56. package/src/commands/functions/layer/index.ts +7 -7
  57. package/src/commands/functions/layer/list.ts +94 -94
  58. package/src/commands/functions/layer/sort.ts +76 -76
  59. package/src/commands/functions/list.ts +68 -68
  60. package/src/commands/functions/log.ts +148 -148
  61. package/src/commands/functions/run.ts +249 -249
  62. package/src/commands/functions/trigger-create.ts +79 -79
  63. package/src/commands/functions/trigger-delete.ts +105 -105
  64. package/src/commands/functions/version/index.ts +1 -1
  65. package/src/commands/functions/version/list.ts +73 -73
  66. package/src/commands/functions/version/publish.ts +43 -43
  67. package/src/commands/gateway/create.ts +109 -109
  68. package/src/commands/gateway/delete.ts +81 -81
  69. package/src/commands/gateway/domain.ts +159 -159
  70. package/src/commands/gateway/index.ts +5 -5
  71. package/src/commands/gateway/list.ts +76 -76
  72. package/src/commands/gateway/switch.ts +107 -107
  73. package/src/commands/helpers/index.ts +2 -2
  74. package/src/commands/helpers/init.ts +431 -431
  75. package/src/commands/helpers/new.ts +117 -117
  76. package/src/commands/helpers/open.ts +67 -67
  77. package/src/commands/hosting/hosting.ts +360 -360
  78. package/src/commands/index.ts +13 -13
  79. package/src/commands/lowcode/app.ts +34 -34
  80. package/src/commands/lowcode/comps.ts +322 -322
  81. package/src/commands/lowcode/index.ts +1 -1
  82. package/src/commands/lowcode/utils.ts +24 -24
  83. package/src/commands/run/image/index.ts +4 -4
  84. package/src/commands/run/standalonegateway/common.ts +7 -7
  85. package/src/commands/run/standalonegateway/create.ts +85 -85
  86. package/src/commands/run/standalonegateway/destroy.ts +59 -59
  87. package/src/commands/run/standalonegateway/index.ts +4 -4
  88. package/src/commands/run/standalonegateway/list.ts +53 -53
  89. package/src/commands/run/standalonegateway/package.ts +62 -62
  90. package/src/commands/run/standalonegateway/turn.ts +63 -63
  91. package/src/commands/run/version/index.ts +4 -4
  92. package/src/commands/smart.ts +132 -132
  93. package/src/commands/storage/storage.ts +464 -464
  94. package/src/commands/third/thirdAttach.ts +49 -49
  95. package/src/completion/index.ts +13 -13
  96. package/src/decorators/captureError.ts +25 -25
  97. package/src/decorators/constants.ts +12 -12
  98. package/src/decorators/deprecate.ts +25 -25
  99. package/src/decorators/guard.ts +42 -42
  100. package/src/decorators/index.ts +7 -7
  101. package/src/decorators/injectParams.ts +54 -54
  102. package/src/decorators/params/common.ts +28 -28
  103. package/src/decorators/params/index.ts +35 -35
  104. package/src/env/domain.ts +33 -33
  105. package/src/env/index.ts +63 -63
  106. package/src/env/login.ts +80 -80
  107. package/src/error.ts +36 -36
  108. package/src/function/alias.ts +43 -43
  109. package/src/function/base.ts +253 -253
  110. package/src/function/code.ts +55 -55
  111. package/src/function/concurrency.ts +57 -57
  112. package/src/function/create.ts +78 -78
  113. package/src/function/delete.ts +42 -42
  114. package/src/function/index.ts +10 -10
  115. package/src/function/layer/attach.ts +68 -68
  116. package/src/function/layer/create.ts +63 -63
  117. package/src/function/layer/delete.ts +21 -21
  118. package/src/function/layer/download.ts +54 -54
  119. package/src/function/layer/index.ts +7 -7
  120. package/src/function/layer/list.ts +32 -32
  121. package/src/function/layer/sort.ts +24 -24
  122. package/src/function/trigger.ts +97 -97
  123. package/src/function/update.ts +35 -35
  124. package/src/function/version.ts +38 -38
  125. package/src/function/vpc.ts +22 -22
  126. package/src/gateway/index.ts +137 -137
  127. package/src/hosting.ts +212 -212
  128. package/src/index.ts +13 -13
  129. package/src/logger.ts +17 -17
  130. package/src/run/create.ts +23 -23
  131. package/src/run/delete.ts +15 -15
  132. package/src/run/image/build.ts +36 -36
  133. package/src/run/image/delete.ts +13 -13
  134. package/src/run/image/index.ts +3 -3
  135. package/src/run/image/info.ts +26 -26
  136. package/src/run/list.ts +29 -29
  137. package/src/run/repo.ts +24 -24
  138. package/src/run/service/deployPackage.ts +6 -4
  139. package/src/run/standalonegateway/create.ts +24 -24
  140. package/src/run/standalonegateway/destroy.ts +19 -19
  141. package/src/run/standalonegateway/index.ts +4 -4
  142. package/src/run/standalonegateway/list.ts +74 -74
  143. package/src/run/standalonegateway/package/list.ts +24 -24
  144. package/src/run/standalonegateway/turn/index.ts +1 -1
  145. package/src/run/standalonegateway/turn/off.ts +19 -19
  146. package/src/run/standalonegateway/turn/on.ts +19 -19
  147. package/src/run/version/create.ts +68 -68
  148. package/src/run/version/delete.ts +15 -15
  149. package/src/run/version/index.ts +5 -5
  150. package/src/run/version/list.ts +16 -16
  151. package/src/run/version/modify.ts +16 -16
  152. package/src/run/version/repo.ts +27 -27
  153. package/src/run/version/update.ts +58 -58
  154. package/src/storage.ts +114 -114
  155. package/src/third/index.ts +12 -12
  156. package/src/utils/auth.ts +15 -15
  157. package/src/utils/cli-table.ts +23 -23
  158. package/src/utils/config.ts +39 -39
  159. package/src/utils/env.ts +244 -244
  160. package/src/utils/fs/del.ts +5 -5
  161. package/src/utils/fs/index.ts +71 -71
  162. package/src/utils/function-packer.ts +97 -97
  163. package/src/utils/log.ts +81 -81
  164. package/src/utils/net/cloud-api-request.ts +62 -62
  165. package/src/utils/net/credential.ts +53 -53
  166. package/src/utils/net/http-request.ts +84 -84
  167. package/src/utils/net/index.ts +4 -4
  168. package/src/utils/net/manager-service.ts +36 -36
  169. package/src/utils/net/proxy.ts +6 -6
  170. package/src/utils/notice.ts +28 -28
  171. package/src/utils/output/highlight.ts +5 -5
  172. package/src/utils/output/index.ts +2 -2
  173. package/src/utils/output/link.ts +10 -10
  174. package/src/utils/output/loading.ts +82 -82
  175. package/src/utils/parallel.ts +82 -82
  176. package/src/utils/platform/index.ts +2 -2
  177. package/src/utils/platform/mac.ts +21 -21
  178. package/src/utils/platform/os.ts +64 -64
  179. package/src/utils/platform/port.ts +10 -10
  180. package/src/utils/progress-bar.ts +38 -38
  181. package/src/utils/prompt/select.ts +59 -59
  182. package/src/utils/reporter/agree.ts +20 -20
  183. package/src/utils/reporter/download.ts +26 -26
  184. package/src/utils/reporter/index.ts +3 -3
  185. package/src/utils/reporter/usage.ts +20 -20
  186. package/src/utils/store/auth.ts +49 -49
  187. package/src/utils/store/common.ts +8 -8
  188. package/src/utils/store/db.ts +68 -68
  189. package/src/utils/store/index.ts +4 -4
  190. package/src/utils/store/usage.ts +12 -12
  191. package/src/utils/tcbrApi/tcbr-cloud-api/request.ts +13 -13
  192. package/src/utils/template.ts +170 -170
  193. package/src/utils/tools/encoding.ts +8 -8
  194. package/src/utils/tools/index.ts +4 -4
  195. package/src/utils/tools/object.ts +33 -33
  196. package/src/utils/tools/time.ts +38 -38
  197. package/src/utils/tools/uid.ts +19 -19
  198. package/templates/html/loginFail.html +90 -90
  199. package/templates/html/loginSuccess.html +86 -86
  200. package/templates/server/node/_gitignore +54 -54
  201. package/templates/server/node/cloudbaserc.json +10 -10
  202. package/templates/server/node/index.js +5 -5
  203. package/templates/server/node/package.json +9 -9
  204. package/tsconfig.json +19 -19
  205. package/tsconfig.test.json +13 -13
  206. package/.vscode/settings.json +0 -3
@@ -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
+ }
@@ -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
+ }