@cloudbase/cli 2.0.12-alpha.3 → 2.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/.vscode/launch.json +0 -10
  2. package/.vscode/settings.json +3 -0
  3. package/bin/cloudbase.js +0 -0
  4. package/bin/tcb.js +0 -0
  5. package/lib/commands/lowcode/app.js +2 -30
  6. package/lib/commands/run/service/create.js +4 -0
  7. package/lib/commands/run/service/deploy.js +4 -0
  8. package/lib/commands/run/service/update.js +4 -0
  9. package/lib/run/service/common.js +9 -3
  10. package/lib/run/service/deployPackage.js +2 -9
  11. package/lib/utils/checkTcbrEnv.js +5 -4
  12. package/lib/utils/debug-logger.js +30 -0
  13. package/lib/utils/net/cloud-api-request.js +7 -1
  14. package/lib/utils/net/http-request.js +16 -5
  15. package/package.json +5 -4
  16. package/types/commands/lowcode/app.d.ts +0 -10
  17. package/types/run/service/common.d.ts +4 -1
  18. package/types/types.d.ts +4 -0
  19. package/types/utils/debug-logger.d.ts +1 -0
  20. package/types/utils/net/http-request.d.ts +6 -2
  21. package/.history/.gitignore_20220624162613 +0 -84
  22. package/.history/.gitignore_20220627114054 +0 -86
  23. package/.history/package_20220711204706.json +0 -88
  24. package/.history/package_20220711204818.json +0 -88
  25. package/.history/package_20220712151717.json +0 -88
  26. package/.history/package_20220712212537.json +0 -88
  27. package/.history/package_20220722205058.json +0 -88
  28. package/.history/src/commands/lowcode/app_20220624162613.ts +0 -34
  29. package/.history/src/commands/lowcode/app_20220627114205.ts +0 -52
  30. package/.history/src/index_20220624162613.ts +0 -13
  31. package/.history/src/index_20220627113609.ts +0 -15
  32. package/.history/src/index_20220627114102.ts +0 -13
  33. package/src/auth/index.ts +0 -2
  34. package/src/auth/login.ts +0 -91
  35. package/src/auth/logout.ts +0 -7
  36. package/src/commands/account/index.ts +0 -2
  37. package/src/commands/account/login.ts +0 -192
  38. package/src/commands/account/logout.ts +0 -24
  39. package/src/commands/common.ts +0 -246
  40. package/src/commands/env/base.ts +0 -90
  41. package/src/commands/env/create.ts +0 -92
  42. package/src/commands/env/domain.ts +0 -186
  43. package/src/commands/env/index.ts +0 -4
  44. package/src/commands/env/login.ts +0 -235
  45. package/src/commands/framework/index.ts +0 -124
  46. package/src/commands/functions/alias/getRoute.ts +0 -76
  47. package/src/commands/functions/alias/index.ts +0 -2
  48. package/src/commands/functions/alias/setRoute.ts +0 -82
  49. package/src/commands/functions/code-download.ts +0 -100
  50. package/src/commands/functions/code-update.ts +0 -62
  51. package/src/commands/functions/concurrency/delete.ts +0 -45
  52. package/src/commands/functions/concurrency/index.ts +0 -3
  53. package/src/commands/functions/concurrency/list.ts +0 -58
  54. package/src/commands/functions/concurrency/set.ts +0 -47
  55. package/src/commands/functions/config-update.ts +0 -76
  56. package/src/commands/functions/copy.ts +0 -62
  57. package/src/commands/functions/delete.ts +0 -79
  58. package/src/commands/functions/deploy.ts +0 -293
  59. package/src/commands/functions/detail.ts +0 -138
  60. package/src/commands/functions/index.ts +0 -16
  61. package/src/commands/functions/invoke.ts +0 -121
  62. package/src/commands/functions/layer/bind.ts +0 -182
  63. package/src/commands/functions/layer/common.ts +0 -8
  64. package/src/commands/functions/layer/create.ts +0 -49
  65. package/src/commands/functions/layer/delete.ts +0 -73
  66. package/src/commands/functions/layer/download.ts +0 -92
  67. package/src/commands/functions/layer/index.ts +0 -7
  68. package/src/commands/functions/layer/list.ts +0 -94
  69. package/src/commands/functions/layer/sort.ts +0 -76
  70. package/src/commands/functions/list.ts +0 -68
  71. package/src/commands/functions/log.ts +0 -148
  72. package/src/commands/functions/run.ts +0 -249
  73. package/src/commands/functions/trigger-create.ts +0 -79
  74. package/src/commands/functions/trigger-delete.ts +0 -105
  75. package/src/commands/functions/version/index.ts +0 -2
  76. package/src/commands/functions/version/list.ts +0 -73
  77. package/src/commands/functions/version/publish.ts +0 -43
  78. package/src/commands/gateway/create.ts +0 -109
  79. package/src/commands/gateway/delete.ts +0 -81
  80. package/src/commands/gateway/domain.ts +0 -159
  81. package/src/commands/gateway/index.ts +0 -5
  82. package/src/commands/gateway/list.ts +0 -76
  83. package/src/commands/gateway/switch.ts +0 -107
  84. package/src/commands/helpers/index.ts +0 -3
  85. package/src/commands/helpers/init.ts +0 -431
  86. package/src/commands/helpers/new.ts +0 -117
  87. package/src/commands/helpers/open.ts +0 -67
  88. package/src/commands/hosting/hosting.ts +0 -360
  89. package/src/commands/hosting/index.ts +0 -1
  90. package/src/commands/index.ts +0 -13
  91. package/src/commands/lowcode/app.ts +0 -52
  92. package/src/commands/lowcode/comps.ts +0 -325
  93. package/src/commands/lowcode/index.ts +0 -2
  94. package/src/commands/lowcode/utils.ts +0 -25
  95. package/src/commands/run/create.ts +0 -153
  96. package/src/commands/run/delete.ts +0 -77
  97. package/src/commands/run/image/common.ts +0 -8
  98. package/src/commands/run/image/delete.ts +0 -68
  99. package/src/commands/run/image/download.ts +0 -68
  100. package/src/commands/run/image/index.ts +0 -5
  101. package/src/commands/run/image/list.ts +0 -84
  102. package/src/commands/run/image/upload.ts +0 -76
  103. package/src/commands/run/index.ts +0 -7
  104. package/src/commands/run/list.ts +0 -83
  105. package/src/commands/run/service/config.ts +0 -81
  106. package/src/commands/run/service/create.ts +0 -122
  107. package/src/commands/run/service/deploy.ts +0 -125
  108. package/src/commands/run/service/index.ts +0 -5
  109. package/src/commands/run/service/list.ts +0 -94
  110. package/src/commands/run/service/update.ts +0 -108
  111. package/src/commands/run/standalonegateway/common.ts +0 -8
  112. package/src/commands/run/standalonegateway/create.ts +0 -85
  113. package/src/commands/run/standalonegateway/destroy.ts +0 -59
  114. package/src/commands/run/standalonegateway/index.ts +0 -5
  115. package/src/commands/run/standalonegateway/list.ts +0 -53
  116. package/src/commands/run/standalonegateway/package.ts +0 -62
  117. package/src/commands/run/standalonegateway/turn.ts +0 -63
  118. package/src/commands/run/version/common.ts +0 -8
  119. package/src/commands/run/version/create.ts +0 -369
  120. package/src/commands/run/version/delete.ts +0 -64
  121. package/src/commands/run/version/index.ts +0 -5
  122. package/src/commands/run/version/list.ts +0 -91
  123. package/src/commands/run/version/modify.ts +0 -137
  124. package/src/commands/run/version/update.ts +0 -398
  125. package/src/commands/smart.ts +0 -132
  126. package/src/commands/storage/index.ts +0 -1
  127. package/src/commands/storage/storage.ts +0 -464
  128. package/src/commands/third/index.ts +0 -1
  129. package/src/commands/third/thirdAttach.ts +0 -49
  130. package/src/completion/index.ts +0 -13
  131. package/src/constant.ts +0 -154
  132. package/src/decorators/captureError.ts +0 -25
  133. package/src/decorators/constants.ts +0 -12
  134. package/src/decorators/deprecate.ts +0 -25
  135. package/src/decorators/guard.ts +0 -42
  136. package/src/decorators/index.ts +0 -7
  137. package/src/decorators/injectParams.ts +0 -54
  138. package/src/decorators/params/common.ts +0 -28
  139. package/src/decorators/params/index.ts +0 -35
  140. package/src/env/domain.ts +0 -33
  141. package/src/env/index.ts +0 -63
  142. package/src/env/login.ts +0 -80
  143. package/src/error.ts +0 -36
  144. package/src/function/alias.ts +0 -43
  145. package/src/function/base.ts +0 -253
  146. package/src/function/code.ts +0 -55
  147. package/src/function/concurrency.ts +0 -57
  148. package/src/function/create.ts +0 -78
  149. package/src/function/delete.ts +0 -42
  150. package/src/function/index.ts +0 -11
  151. package/src/function/layer/attach.ts +0 -68
  152. package/src/function/layer/create.ts +0 -63
  153. package/src/function/layer/delete.ts +0 -21
  154. package/src/function/layer/download.ts +0 -54
  155. package/src/function/layer/index.ts +0 -7
  156. package/src/function/layer/list.ts +0 -32
  157. package/src/function/layer/sort.ts +0 -24
  158. package/src/function/trigger.ts +0 -97
  159. package/src/function/update.ts +0 -35
  160. package/src/function/version.ts +0 -39
  161. package/src/function/vpc.ts +0 -22
  162. package/src/gateway/index.ts +0 -137
  163. package/src/help.ts +0 -50
  164. package/src/hosting.ts +0 -212
  165. package/src/index.ts +0 -13
  166. package/src/logger.ts +0 -17
  167. package/src/run/create.ts +0 -23
  168. package/src/run/delete.ts +0 -15
  169. package/src/run/image/build.ts +0 -36
  170. package/src/run/image/delete.ts +0 -14
  171. package/src/run/image/index.ts +0 -4
  172. package/src/run/image/info.ts +0 -27
  173. package/src/run/image/list.ts +0 -23
  174. package/src/run/index.ts +0 -8
  175. package/src/run/list.ts +0 -30
  176. package/src/run/repo.ts +0 -25
  177. package/src/run/service/common.ts +0 -311
  178. package/src/run/service/config.ts +0 -77
  179. package/src/run/service/create.ts +0 -52
  180. package/src/run/service/deployPackage.ts +0 -65
  181. package/src/run/service/index.ts +0 -7
  182. package/src/run/service/list.ts +0 -29
  183. package/src/run/service/showLogs.ts +0 -98
  184. package/src/run/service/update.ts +0 -82
  185. package/src/run/standalonegateway/create.ts +0 -24
  186. package/src/run/standalonegateway/destroy.ts +0 -19
  187. package/src/run/standalonegateway/index.ts +0 -5
  188. package/src/run/standalonegateway/list.ts +0 -74
  189. package/src/run/standalonegateway/package/index.ts +0 -1
  190. package/src/run/standalonegateway/package/list.ts +0 -24
  191. package/src/run/standalonegateway/turn/index.ts +0 -2
  192. package/src/run/standalonegateway/turn/off.ts +0 -19
  193. package/src/run/standalonegateway/turn/on.ts +0 -19
  194. package/src/run/version/create.ts +0 -68
  195. package/src/run/version/delete.ts +0 -16
  196. package/src/run/version/index.ts +0 -6
  197. package/src/run/version/list.ts +0 -17
  198. package/src/run/version/modify.ts +0 -17
  199. package/src/run/version/repo.ts +0 -28
  200. package/src/run/version/update.ts +0 -59
  201. package/src/storage.ts +0 -114
  202. package/src/third/index.ts +0 -13
  203. package/src/types.ts +0 -672
  204. package/src/utils/auth.ts +0 -15
  205. package/src/utils/checkTcbrEnv.ts +0 -67
  206. package/src/utils/cli-table.ts +0 -23
  207. package/src/utils/commonParamsCheck.ts +0 -65
  208. package/src/utils/config.ts +0 -39
  209. package/src/utils/env.ts +0 -244
  210. package/src/utils/fs/del.ts +0 -5
  211. package/src/utils/fs/index.ts +0 -71
  212. package/src/utils/function-packer.ts +0 -97
  213. package/src/utils/index.ts +0 -25
  214. package/src/utils/log.ts +0 -82
  215. package/src/utils/net/cloud-api-request.ts +0 -62
  216. package/src/utils/net/credential.ts +0 -53
  217. package/src/utils/net/http-request.ts +0 -84
  218. package/src/utils/net/index.ts +0 -5
  219. package/src/utils/net/manager-service.ts +0 -36
  220. package/src/utils/net/proxy.ts +0 -6
  221. package/src/utils/notice.ts +0 -28
  222. package/src/utils/output/highlight.ts +0 -5
  223. package/src/utils/output/index.ts +0 -3
  224. package/src/utils/output/link.ts +0 -10
  225. package/src/utils/output/loading.ts +0 -82
  226. package/src/utils/parallel.ts +0 -82
  227. package/src/utils/platform/index.ts +0 -3
  228. package/src/utils/platform/mac.ts +0 -21
  229. package/src/utils/platform/os.ts +0 -64
  230. package/src/utils/platform/port.ts +0 -10
  231. package/src/utils/progress-bar.ts +0 -38
  232. package/src/utils/prompt/index.ts +0 -1
  233. package/src/utils/prompt/select.ts +0 -60
  234. package/src/utils/reporter/agree.ts +0 -20
  235. package/src/utils/reporter/download.ts +0 -26
  236. package/src/utils/reporter/index.ts +0 -3
  237. package/src/utils/reporter/usage.ts +0 -20
  238. package/src/utils/store/auth.ts +0 -49
  239. package/src/utils/store/common.ts +0 -8
  240. package/src/utils/store/db.ts +0 -68
  241. package/src/utils/store/index.ts +0 -5
  242. package/src/utils/store/usage.ts +0 -12
  243. package/src/utils/tcbrApi/callTcbrApi.ts +0 -28
  244. package/src/utils/tcbrApi/index.ts +0 -1
  245. package/src/utils/template.ts +0 -170
  246. package/src/utils/tools/encoding.ts +0 -8
  247. package/src/utils/tools/index.ts +0 -4
  248. package/src/utils/tools/object.ts +0 -33
  249. package/src/utils/tools/time.ts +0 -38
  250. package/src/utils/tools/uid.ts +0 -19
  251. package/src/utils/validator.ts +0 -65
  252. package/yarn-error.log +0 -12841
@@ -1 +0,0 @@
1
- export * from './select'
@@ -1,60 +0,0 @@
1
- import { prompt } from 'enquirer'
2
- import { CloudBaseError } from '../../error'
3
-
4
- /**
5
- * @描述 分页的选择型 prompt
6
- * @泛型参数 O: listFetcher 的参数类型
7
- * @参数 listFetcher: 执行列表拉取逻辑的函数,一般认为参数 options 至少拥有 limit 和 offset 两个 number 属性
8
- * @参数 options: listFetcher 的参数
9
- * @参数 message: 展示的信息
10
- * @参数 filter 筛选返回列表的数据
11
- * @参数 mapper 对返回列表中元素的处理函数,用于处理列表数据到实际展示列表的映射
12
- * @返回值 select 类型返回 string,multiselect 返回 string[]
13
- */
14
- export const pagingSelectPromp =
15
- async <T, O extends { limit?: number, offset?: number }>(
16
- type: 'select' | 'multiselect',
17
- listFetcher: (options: O) => Promise<any[]>,
18
- options: O,
19
- message: string,
20
- filter: (item: any) => boolean = _ => true,
21
- mapper: (item: any) => string = item => item) => {
22
-
23
- let res: string[] | string = []
24
-
25
- let offset = 0
26
- let nextRoundList: string[]
27
-
28
-
29
- while (true) {
30
- const thisRoundList = nextRoundList || (await listFetcher({ ...options, limit: 10, offset: offset })).filter(filter).map(mapper)
31
- offset += 10
32
- nextRoundList = (await listFetcher({ ...options, limit: 10, offset: offset })).filter(filter).map(mapper)
33
-
34
- if (!thisRoundList || !thisRoundList.length)
35
- throw new CloudBaseError('列表没有数据')
36
-
37
- if (type === 'select') {
38
- let receiver: string = (await prompt<any>({
39
- type: type,
40
- name: 'receiver',
41
- message: message,
42
- choices: nextRoundList?.length ? [...thisRoundList, '下一页'] : [...thisRoundList]
43
- })).receiver
44
- res = receiver
45
- if (receiver !== '下一页') break
46
- } else {
47
- let { receiver }: { receiver: string[] } = await prompt<any>({
48
- type: type,
49
- name: 'receiver',
50
- message: message,
51
- choices: nextRoundList?.length ? [...thisRoundList, '下一页'] : [...thisRoundList]
52
- })
53
- if (!receiver) receiver = []
54
- res = [...res, ...receiver.filter(item => item !== '下一页')]
55
- if (receiver.indexOf('下一页') === -1) break
56
- }
57
- }
58
-
59
- return res
60
- }
@@ -1,20 +0,0 @@
1
- import { postFetch } from '../net'
2
- import { getMacAddressMd5, getOSInfo } from '../platform'
3
- import { getUin } from '../store'
4
-
5
- const url = 'https://tcli.service.tcloudbase.com/agree-collect'
6
-
7
- export async function collectAgree(agree) {
8
- const uin = await getUin()
9
- const macMd5 = await getMacAddressMd5()
10
- const os = await getOSInfo()
11
- const data = {
12
- macMd5,
13
- agree,
14
- uin,
15
- os
16
- }
17
-
18
- return postFetch(url, data)
19
- }
20
-
@@ -1,26 +0,0 @@
1
- import { postFetch } from '../net'
2
- import { getMacAddressMd5, getOSInfo } from '../platform'
3
- import { getUin } from '../store'
4
-
5
- const url = 'https://tcli.service.tcloudbase.com/download'
6
-
7
- export async function templateDownloadReport(templateId: string, templateName: string) {
8
- const uin = await getUin()
9
- const os = await getOSInfo()
10
- const macMd5 = await getMacAddressMd5()
11
-
12
- const data = {
13
- os,
14
- uin,
15
- macMd5,
16
- templateId,
17
- templateName,
18
- version: process.CLI_VERSION
19
- }
20
-
21
- try {
22
- await postFetch(url, data)
23
- } catch (e) {
24
- // ignore error
25
- }
26
- }
@@ -1,3 +0,0 @@
1
- export * from './agree'
2
- export * from './usage'
3
- export * from './download'
@@ -1,20 +0,0 @@
1
- import { postFetch } from '../net'
2
- import { getMacAddressMd5, getOSInfo } from '../platform'
3
- import { getUin } from '../store'
4
-
5
- const url = 'https://tcli.service.tcloudbase.com/usage'
6
-
7
- export async function collectUsage(command: string) {
8
- const uin = await getUin()
9
- const macMd5 = await getMacAddressMd5()
10
- const os = await getOSInfo()
11
- const data = {
12
- os,
13
- uin,
14
- macMd5,
15
- command,
16
- version: process.CLI_VERSION
17
- }
18
-
19
- return postFetch(url, data)
20
- }
@@ -1,49 +0,0 @@
1
- import os from 'os'
2
- import fs from 'fs'
3
- import path from 'path'
4
- import { checkFullAccess } from '../fs'
5
- import { LocalStore } from './db'
6
- import { ConfigItems } from '../../constant'
7
-
8
- class AuthStore extends LocalStore {
9
- constructor(defaults) {
10
- super(defaults, 'auth')
11
- this.defaults = defaults
12
- this.moveOldConfig()
13
- }
14
-
15
- // TODO: 迁移并删除旧的配置文件中的数据(在后续迭代中删除)
16
- async moveOldConfig() {
17
- const db = await this.getDB()
18
- const oldConfigPath = path.resolve(
19
- os.homedir(),
20
- '.config',
21
- 'configstore',
22
- '@cloudbase',
23
- 'cli.json'
24
- )
25
-
26
- if (checkFullAccess(oldConfigPath)) {
27
- try {
28
- const content = JSON.parse(fs.readFileSync(oldConfigPath, 'utf8'))
29
- const { credential, ssh } = content
30
- await db.set(ConfigItems.credential, credential).write()
31
- await db.set(ConfigItems.ssh, ssh).write()
32
- fs.unlinkSync(oldConfigPath)
33
- } catch (e) {
34
- fs.unlinkSync(oldConfigPath)
35
- }
36
- }
37
- }
38
- }
39
-
40
- export const authStore = new AuthStore({
41
- _: '这是您的 CloudBase 身份凭据文件,请不要分享给他人!',
42
- [ConfigItems.credential]: {},
43
- [ConfigItems.ssh]: {}
44
- })
45
-
46
- export async function getUin() {
47
- const credential = await authStore.get(ConfigItems.credential)
48
- return credential?.uin || '无'
49
- }
@@ -1,8 +0,0 @@
1
- import { LocalStore } from './db'
2
-
3
- export const commonStore = new LocalStore({
4
- // 已读最新消息的 uid
5
- lastNotificationUid: 1,
6
- // 上次通知时间
7
- lastNotifyTime: 0
8
- })
@@ -1,68 +0,0 @@
1
- import os from 'os'
2
- import fse from 'fs-extra'
3
- import low from 'lowdb'
4
- import path from 'path'
5
- import FileAsync from 'lowdb/adapters/FileAsync'
6
- import FileSync from 'lowdb/adapters/FileSync'
7
- import xdgBasedir from 'xdg-basedir'
8
-
9
- // 系统配置目录
10
- const configDir = xdgBasedir.config || path.join(os.tmpdir(), '.config')
11
- // cloudbase 配置目录
12
- export const cloudbaseConfigDir = path.join(configDir, '.cloudbase')
13
-
14
- // 确保目录存在
15
-
16
- fse.ensureDirSync(cloudbaseConfigDir)
17
-
18
- export function getAsyncDB(file: string) {
19
- const dbPath = path.join(cloudbaseConfigDir, `${file}.json`)
20
- const adapter = new FileAsync(dbPath)
21
- const db = low(adapter)
22
- return db
23
- }
24
-
25
- export function getSyncDB(file: string) {
26
- const dbPath = path.join(cloudbaseConfigDir, `${file}.json`)
27
- const adapter = new FileSync(dbPath)
28
- const db = low(adapter)
29
- return db
30
- }
31
-
32
- export class LocalStore {
33
- db: any
34
- dbKey: string
35
- defaults: any
36
-
37
- constructor(defaults: any, dbKey = 'common') {
38
- this.defaults = defaults
39
- this.dbKey = dbKey
40
- }
41
-
42
- async getDB() {
43
- const db = this.db || (await getAsyncDB(this.dbKey))
44
- this.db = db
45
- return db
46
- }
47
-
48
- async get(key: string): Promise<any> {
49
- const defaultValue = this.defaults[key]
50
- const db = await this.getDB()
51
- return db.get(key).value() || defaultValue
52
- }
53
-
54
- async set(key: string, value: any) {
55
- const db = await this.getDB()
56
- await db.set(key, value).write()
57
- }
58
-
59
- async push(key: string, value: any) {
60
- const db = await this.getDB()
61
- await db.get(key).push(value).write()
62
- }
63
-
64
- async delete(key) {
65
- const db = await this.getDB()
66
- await db.unset(key).write()
67
- }
68
- }
@@ -1,5 +0,0 @@
1
- export * from './auth'
2
- export * from './db'
3
- export * from './auth'
4
- export * from './usage'
5
- export * from './common'
@@ -1,12 +0,0 @@
1
- import { LocalStore } from './db'
2
-
3
- const DB_KEY = 'usage'
4
-
5
- export const usageStore = new LocalStore(
6
- {
7
- // 是否同意收集使用数据
8
- agreeCollect: false,
9
- commands: []
10
- },
11
- DB_KEY
12
- )
@@ -1,28 +0,0 @@
1
- import { CloudBaseError } from '@cloudbase/toolbox'
2
- import { CloudApiService } from '../net'
3
-
4
- const tcbrService = CloudApiService.getInstance('tcbr')
5
-
6
- export async function callTcbrApi(action: string, data: Record<string, any>) {
7
- try {
8
- const res = await tcbrService.request(action, data)
9
- // 返回统一格式的 JSON 结果
10
- return {
11
- code: 0,
12
- errmsg: 'success',
13
- data: {
14
- ...res
15
- }
16
- }
17
- } catch (e) {
18
- // 不直接 throw 因为调用 DescribeCloudRunServerDetail 如果传入了当前不存在的服务名会返回报错
19
- // 对特殊错误特殊处理
20
- if (e.code === 'AuthFailure.UnauthorizedOperation') {
21
- console.log('\n', `requestId: ${e.requestId}`)
22
- throw new CloudBaseError('您没有权限执行此操作,请检查 CAM 策略\n')
23
- } else if (e.code === 'LimitExceeded') {
24
- throw new CloudBaseError(`${e.original.Message}\n`)
25
- }
26
- return e
27
- }
28
- }
@@ -1 +0,0 @@
1
- export * from './callTcbrApi'
@@ -1,170 +0,0 @@
1
- import fs from 'fs'
2
- import _ from 'lodash'
3
- import path from 'path'
4
- import fse from 'fs-extra'
5
- import { prompt } from 'enquirer'
6
- import { searchConfig, unzipStream, ConfigParser } from '@cloudbase/toolbox'
7
- import { CloudBaseError } from '../error'
8
- import { fetch, fetchStream } from './net'
9
-
10
- import { logger } from './log'
11
- import { checkFullAccess } from './fs'
12
- import { execWithLoading } from './output'
13
- import { templateDownloadReport } from './reporter'
14
-
15
- const listUrl = 'https://tcli.service.tcloudbase.com/templates'
16
-
17
- const getTemplateAddress = (templatePath: string) =>
18
- `https://7463-tcli-1258016615.tcb.qcloud.la/cloudbase-templates/${templatePath}.zip`
19
-
20
- /**
21
- * 将初始化项目的过程拆成多步,以在 new 命令和 tcb 命令中复用
22
- */
23
-
24
- // 获取并下载模板,返回项目地址
25
- export async function downloadTemplate(
26
- options: {
27
- appName?: string
28
- newProject?: boolean
29
- templateUri?: string
30
- projectPath?: string
31
- } = {}
32
- ) {
33
- let { templateUri, appName, newProject, projectPath = process.cwd() } = options
34
- // 拉取模板
35
- const templates = await execWithLoading(() => fetch(listUrl), {
36
- startTip: '获取应用模板列表中'
37
- })
38
-
39
- let templateName
40
- let tempateId
41
-
42
- if (templateUri) {
43
- tempateId = templateUri
44
- } else {
45
- // 确定模板名称
46
- const { selectTemplateName } = await prompt<any>({
47
- type: 'select',
48
- name: 'selectTemplateName',
49
- message: '请选择应用模板',
50
- choices: templates.map((item) => item.name)
51
- })
52
- templateName = selectTemplateName
53
- }
54
-
55
- const selectedTemplate = templateName
56
- ? templates.find((item) => item.name === templateName)
57
- : templates.find((item) => item.path === tempateId)
58
-
59
- if (!selectedTemplate) {
60
- logger.info(`模板 \`${templateName || tempateId}\` 不存在`)
61
- return
62
- }
63
-
64
- /**
65
- * 新建项目
66
- */
67
- if (newProject) {
68
- // appName 不存在时,输入应用
69
- if (!appName) {
70
- const { projectName } = await prompt<any>({
71
- type: 'input',
72
- name: 'projectName',
73
- message: '请输入项目名称',
74
- initial: selectedTemplate.path
75
- })
76
- appName = projectName
77
- }
78
-
79
- // 确定项目权限
80
- projectPath = path.join(process.cwd(), appName)
81
-
82
- if (checkFullAccess(projectPath)) {
83
- const { cover } = await prompt<any>({
84
- type: 'confirm',
85
- name: 'cover',
86
- message: `已存在同名文件夹:${appName},是否覆盖?`,
87
- initial: false
88
- })
89
- // 不覆盖,操作终止
90
- if (!cover) {
91
- throw new CloudBaseError('操作终止!')
92
- } else {
93
- // 覆盖操作不会删除不冲突的文件夹或文件
94
- // 删除原有文件夹,防止生成的项目包含用户原有文件
95
- fse.removeSync(projectPath)
96
- }
97
- }
98
- }
99
-
100
- // 下载并解压文件
101
- await execWithLoading(
102
- async () => {
103
- await templateDownloadReport(selectedTemplate.path, selectedTemplate.name)
104
- await extractTemplate(projectPath, selectedTemplate.path, selectedTemplate.url)
105
- },
106
- {
107
- startTip: '下载文件中'
108
- }
109
- )
110
-
111
- return projectPath
112
- }
113
-
114
- // 下载并解压
115
- export async function extractTemplate(
116
- projectPath: string,
117
- templatePath: string,
118
- remoteUrl?: string
119
- ) {
120
- // 文件下载链接
121
- const url = remoteUrl || getTemplateAddress(templatePath)
122
-
123
- return fetchStream(url).then(async (res) => {
124
- if (!res) {
125
- throw new CloudBaseError('请求异常')
126
- }
127
-
128
- if (res.status !== 200) {
129
- throw new CloudBaseError('未找到文件')
130
- }
131
-
132
- // 解压缩文件
133
- await unzipStream(res.body, projectPath)
134
- })
135
- }
136
-
137
- // 初始化项目配置
138
- export async function initProjectConfig(
139
- envId: string,
140
- region: string,
141
- projectPath: string = process.cwd()
142
- ) {
143
- // 配置文件初始化,写入环境id
144
- let filepath = (await searchConfig(projectPath))?.filepath
145
-
146
- // 配置文件不存在
147
- if (!filepath) {
148
- fs.writeFileSync(
149
- path.join(projectPath, 'cloudbaserc.json'),
150
- JSON.stringify({
151
- envId,
152
- region,
153
- version: '2.0',
154
- $schema: 'https://framework-1258016615.tcloudbaseapp.com/schema/latest.json'
155
- })
156
- )
157
- } else {
158
- // 设置环境 Id
159
- const configContent = fs.readFileSync(filepath).toString()
160
- fs.writeFileSync(filepath, configContent.replace('{{envId}}', envId))
161
-
162
- // 设置 region
163
- const configPath = filepath || path.join(projectPath, 'cloudbaserc.json')
164
- const parser = new ConfigParser({
165
- configPath
166
- })
167
- // 把 region 写入到配置文件中
168
- parser.update('region', region)
169
- }
170
- }
@@ -1,8 +0,0 @@
1
- import crypto from 'crypto'
2
-
3
- // MD5
4
- export function md5(str = ''): string {
5
- const hash = crypto.createHash('md5')
6
- hash.update(str)
7
- return hash.digest('hex')
8
- }
@@ -1,4 +0,0 @@
1
- export * from './uid'
2
- export * from './time'
3
- export * from './object'
4
- export * from './encoding'
@@ -1,33 +0,0 @@
1
- import _ from 'lodash'
2
-
3
- // declare module 'lodash' {
4
- // interface LoDashStatic {
5
- // deep(v: any, m: any): any;
6
- // }
7
- // }
8
-
9
- _.mixin({
10
- deep: function(obj, mapper) {
11
- return mapper(
12
- _.mapValues(obj, function(v) {
13
- if (_.isPlainObject(v)) {
14
- return _.deep(v, mapper)
15
- }
16
-
17
- if (_.isArray(v)) {
18
- return _.map(v, val => _.deep(val, mapper))
19
- }
20
-
21
- return v
22
- })
23
- )
24
- }
25
- })
26
-
27
- export function firstLetterToLowerCase(data: Record<string, any>) {
28
- return _.deep(data, function(x) {
29
- return _.mapKeys(x, function(val, key) {
30
- return key.charAt(0).toLowerCase() + key.slice(1)
31
- })
32
- })
33
- }
@@ -1,38 +0,0 @@
1
- export function formatDate(dateParam: string | number | Date, fmtParam: string) {
2
- let date: Date
3
- let fmt = fmtParam
4
- if (date instanceof Date === false) {
5
- date = new Date(dateParam)
6
- }
7
- if (/(y+)/.test(fmt)) {
8
- fmt = fmt.replace(RegExp.$1, String(date.getFullYear()).substr(4 - RegExp.$1.length))
9
- }
10
-
11
- let expMap = {
12
- 'M+': date.getMonth() + 1,
13
- 'd+': date.getDate(),
14
- 'h+': date.getHours(),
15
- 'm+': date.getMinutes(),
16
- 's+': date.getSeconds(),
17
- S: date.getMilliseconds()
18
- }
19
- for (let exp in expMap) {
20
- if (new RegExp('(' + exp + ')').test(fmt)) {
21
- fmt = fmt.replace(
22
- RegExp.$1,
23
- RegExp.$1.length === 1
24
- ? expMap[exp]
25
- : ('00' + expMap[exp]).substr(String(expMap[exp]).length)
26
- )
27
- }
28
- }
29
- return fmt
30
- }
31
-
32
- export async function sleep(time: number) {
33
- return new Promise<void>(resolve => {
34
- setTimeout(() => {
35
- resolve()
36
- }, time)
37
- })
38
- }
@@ -1,19 +0,0 @@
1
- import crypto from 'crypto'
2
-
3
- export function random(len = 8) {
4
- if (!Number.isInteger(len)) {
5
- throw new Error('len must be an integer')
6
- }
7
- return crypto
8
- .randomBytes(len)
9
- .toString('hex')
10
- .substring(0, len)
11
- }
12
-
13
- export function uuidv4() {
14
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
15
- const r = (Math.random() * 16) | 0
16
- const v = c === 'x' ? r : (r & 0x3) | 0x8
17
- return v.toString(16)
18
- })
19
- }
@@ -1,65 +0,0 @@
1
- import { CloudBaseError } from '../error'
2
- import { CPU_MEM_OPTS } from '../constant'
3
- import { convertNumber } from '../run'
4
-
5
- type SimpleValue = number | string | boolean
6
-
7
- export function assertTruthy(val: SimpleValue | SimpleValue[], errMsg: string) {
8
- let ok
9
- if (Array.isArray(val)) {
10
- ok = val.every(item => Boolean(val))
11
- } else {
12
- ok = Boolean(val)
13
- }
14
-
15
- if (!ok) {
16
- throw new CloudBaseError(errMsg)
17
- }
18
- }
19
-
20
- export function assertHas(obj: any, prop: string, errMsg): void {
21
- if (!obj[prop]) {
22
- throw new CloudBaseError(errMsg)
23
- }
24
- }
25
-
26
-
27
- export const validateIp = (ip: string): boolean => {
28
- if (Object.prototype.toString.call(ip) !== '[object String]') return false
29
- const fields = ip.split('.')
30
- if (
31
- fields.length !== 4 ||
32
- fields.find(item => isNaN(Number(item)) || Number(item) < 0 || Number(item) > 255)
33
- ) return false
34
- return true
35
- }
36
-
37
- // 检查 cpu 和 mem 是否符合约束条件
38
- export const validateCpuMem = (cpuInput: number | string | undefined, memInput: number | string | undefined): { cpuOutput: number, memOutput: number } => {
39
- if (cpuInput !== undefined && memInput !== undefined) {
40
- let cpuSet = convertNumber(cpuInput)
41
- let memSet = convertNumber(memInput)
42
- let validMemSet = CPU_MEM_OPTS.find(({ cpu }) => cpu === cpuSet)
43
- if (!validMemSet || !validMemSet.mems.length || !validMemSet.mems.includes(memSet)) {
44
- throw new CloudBaseError(`cpu 与 mem 规格不匹配,当前规格:cpu: ${cpuInput}, mem: ${memInput}
45
- 请使用下列规格组合之一:${CPU_MEM_OPTS.map(({ cpu, mems }) => `${cpu}-${mems.join('/')}`).join(',')}`)
46
- }
47
- return { cpuOutput: cpuSet, memOutput: memSet }
48
- }
49
- if (cpuInput) {
50
- let cpuSet = convertNumber(cpuInput)
51
- let validSet = CPU_MEM_OPTS.find(({ cpu }) => cpu === cpuSet)
52
- if (!validSet) {
53
- throw new CloudBaseError(`不支持当前 cpu 规格,请使用下列 cpu 规格之一:${CPU_MEM_OPTS.map(({ cpu }) => cpu).join(',')}`)
54
- }
55
- return { cpuOutput: cpuSet, memOutput: CPU_MEM_OPTS.find(({ cpu }) => cpu === cpuSet).mems[0] }
56
- }
57
- if (memInput) {
58
- let memSet = convertNumber(memInput)
59
- let validSet = CPU_MEM_OPTS.find(({ mems }) => mems.includes(memSet))
60
- if (!validSet) {
61
- throw new CloudBaseError(`不支持当前 mem 规格,请使用下列 mem 规格之一:${CPU_MEM_OPTS.map(({ mems }) => mems.join('/')).join(',')}`)
62
- }
63
- return { cpuOutput: validSet.cpu, memOutput: memSet }
64
- }
65
- }