@cloudbase/cli 2.0.3 → 2.0.4-alpha.0

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