@cloudbase/cli 2.0.2 → 2.0.3

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