@cloudbase/cli 1.12.7-alpha.4 → 2.0.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 (317) 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/run/create.js +6 -1
  15. package/lib/commands/run/delete.js +6 -1
  16. package/lib/commands/run/image/common.js +1 -1
  17. package/lib/commands/run/image/delete.js +5 -0
  18. package/lib/commands/run/image/download.js +5 -0
  19. package/lib/commands/run/image/list.js +5 -0
  20. package/lib/commands/run/image/upload.js +5 -0
  21. package/lib/commands/run/index.js +1 -0
  22. package/lib/commands/run/list.js +7 -1
  23. package/lib/commands/run/service/config.js +112 -0
  24. package/lib/commands/run/service/create.js +140 -0
  25. package/lib/commands/run/service/deploy.js +145 -0
  26. package/lib/commands/run/service/index.js +21 -0
  27. package/lib/commands/run/service/list.js +115 -0
  28. package/lib/commands/run/service/update.js +132 -0
  29. package/lib/commands/run/version/common.js +1 -1
  30. package/lib/commands/run/version/create.js +5 -0
  31. package/lib/commands/run/version/delete.js +5 -0
  32. package/lib/commands/run/version/list.js +5 -0
  33. package/lib/commands/run/version/modify.js +5 -0
  34. package/lib/commands/run/version/update.js +5 -0
  35. package/lib/commands/storage/storage.js +1 -1
  36. package/lib/constant.js +20 -1
  37. package/lib/env/login.js +7 -7
  38. package/lib/help.js +40 -38
  39. package/lib/run/index.js +1 -0
  40. package/lib/run/service/common.js +163 -0
  41. package/lib/run/service/config.js +70 -0
  42. package/lib/run/service/create.js +67 -0
  43. package/lib/run/service/deployPackage.js +87 -0
  44. package/lib/run/service/index.js +23 -0
  45. package/lib/run/service/list.js +31 -0
  46. package/lib/run/service/showLogs.js +116 -0
  47. package/lib/run/service/update.js +83 -0
  48. package/lib/utils/checkTcbrEnv.js +74 -0
  49. package/lib/utils/commonParamsCheck.js +48 -0
  50. package/lib/utils/index.js +3 -0
  51. package/lib/utils/tcbrApi/callTcbrApi.js +38 -0
  52. package/lib/utils/tcbrApi/index.js +17 -0
  53. package/lib/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.js +268 -0
  54. package/lib/utils/tcbrApi/tcbr-cloud-api/error.js +17 -0
  55. package/lib/utils/tcbrApi/tcbr-cloud-api/index.js +17 -0
  56. package/lib/utils/tcbrApi/tcbr-cloud-api/request.js +40 -0
  57. package/lib/utils/tcbrApi/tcbr-cloud-api-request.js +61 -0
  58. package/lib/utils/validator.js +32 -1
  59. package/package.json +88 -88
  60. package/post-install.js +61 -61
  61. package/runtime/nodejs/bootstrap.js +255 -255
  62. package/runtime/nodejs/runtime.js +183 -183
  63. package/src/auth/index.ts +1 -1
  64. package/src/auth/login.ts +91 -91
  65. package/src/auth/logout.ts +7 -7
  66. package/src/commands/account/index.ts +2 -2
  67. package/src/commands/account/login.ts +192 -192
  68. package/src/commands/account/logout.ts +24 -24
  69. package/src/commands/common.ts +246 -246
  70. package/src/commands/env/base.ts +90 -90
  71. package/src/commands/env/create.ts +92 -92
  72. package/src/commands/env/domain.ts +186 -186
  73. package/src/commands/env/index.ts +4 -4
  74. package/src/commands/env/login.ts +235 -235
  75. package/src/commands/framework/index.ts +124 -124
  76. package/src/commands/functions/alias/getRoute.ts +76 -76
  77. package/src/commands/functions/alias/index.ts +2 -2
  78. package/src/commands/functions/alias/setRoute.ts +82 -82
  79. package/src/commands/functions/code-download.ts +100 -100
  80. package/src/commands/functions/code-update.ts +62 -62
  81. package/src/commands/functions/concurrency/delete.ts +45 -45
  82. package/src/commands/functions/concurrency/index.ts +2 -2
  83. package/src/commands/functions/concurrency/list.ts +58 -58
  84. package/src/commands/functions/concurrency/set.ts +47 -47
  85. package/src/commands/functions/config-update.ts +76 -76
  86. package/src/commands/functions/copy.ts +62 -62
  87. package/src/commands/functions/delete.ts +79 -79
  88. package/src/commands/functions/deploy.ts +293 -293
  89. package/src/commands/functions/detail.ts +138 -138
  90. package/src/commands/functions/index.ts +16 -16
  91. package/src/commands/functions/invoke.ts +121 -121
  92. package/src/commands/functions/layer/bind.ts +182 -182
  93. package/src/commands/functions/layer/common.ts +8 -8
  94. package/src/commands/functions/layer/create.ts +49 -49
  95. package/src/commands/functions/layer/delete.ts +73 -73
  96. package/src/commands/functions/layer/download.ts +92 -92
  97. package/src/commands/functions/layer/index.ts +7 -7
  98. package/src/commands/functions/layer/list.ts +94 -94
  99. package/src/commands/functions/layer/sort.ts +76 -76
  100. package/src/commands/functions/list.ts +68 -68
  101. package/src/commands/functions/log.ts +148 -148
  102. package/src/commands/functions/run.ts +249 -249
  103. package/src/commands/functions/trigger-create.ts +79 -79
  104. package/src/commands/functions/trigger-delete.ts +105 -105
  105. package/src/commands/functions/version/index.ts +1 -1
  106. package/src/commands/functions/version/list.ts +73 -73
  107. package/src/commands/functions/version/publish.ts +43 -43
  108. package/src/commands/gateway/create.ts +109 -109
  109. package/src/commands/gateway/delete.ts +81 -81
  110. package/src/commands/gateway/domain.ts +159 -159
  111. package/src/commands/gateway/index.ts +5 -5
  112. package/src/commands/gateway/list.ts +76 -76
  113. package/src/commands/gateway/switch.ts +107 -107
  114. package/src/commands/helpers/index.ts +2 -2
  115. package/src/commands/helpers/init.ts +431 -431
  116. package/src/commands/helpers/new.ts +117 -117
  117. package/src/commands/helpers/open.ts +67 -67
  118. package/src/commands/hosting/hosting.ts +360 -360
  119. package/src/commands/index.ts +13 -13
  120. package/src/commands/lowcode/app.ts +34 -34
  121. package/src/commands/lowcode/comps.ts +322 -322
  122. package/src/commands/lowcode/index.ts +1 -1
  123. package/src/commands/lowcode/utils.ts +24 -24
  124. package/src/commands/run/create.ts +9 -2
  125. package/src/commands/run/delete.ts +8 -2
  126. package/src/commands/run/image/common.ts +1 -1
  127. package/src/commands/run/image/delete.ts +8 -1
  128. package/src/commands/run/image/download.ts +7 -1
  129. package/src/commands/run/image/index.ts +4 -4
  130. package/src/commands/run/image/list.ts +7 -2
  131. package/src/commands/run/image/upload.ts +8 -1
  132. package/src/commands/run/index.ts +2 -1
  133. package/src/commands/run/list.ts +11 -3
  134. package/src/commands/run/service/config.ts +81 -0
  135. package/src/commands/run/service/create.ts +118 -0
  136. package/src/commands/run/service/deploy.ts +121 -0
  137. package/src/commands/run/service/index.ts +5 -0
  138. package/src/commands/run/service/list.ts +94 -0
  139. package/src/commands/run/service/update.ts +104 -0
  140. package/src/commands/run/standalonegateway/common.ts +7 -7
  141. package/src/commands/run/standalonegateway/create.ts +85 -85
  142. package/src/commands/run/standalonegateway/destroy.ts +59 -59
  143. package/src/commands/run/standalonegateway/index.ts +4 -4
  144. package/src/commands/run/standalonegateway/list.ts +53 -53
  145. package/src/commands/run/standalonegateway/package.ts +62 -62
  146. package/src/commands/run/standalonegateway/turn.ts +63 -63
  147. package/src/commands/run/version/common.ts +1 -1
  148. package/src/commands/run/version/create.ts +8 -1
  149. package/src/commands/run/version/delete.ts +8 -2
  150. package/src/commands/run/version/index.ts +4 -4
  151. package/src/commands/run/version/list.ts +7 -1
  152. package/src/commands/run/version/modify.ts +8 -1
  153. package/src/commands/run/version/update.ts +8 -1
  154. package/src/commands/smart.ts +132 -132
  155. package/src/commands/storage/storage.ts +464 -464
  156. package/src/commands/third/thirdAttach.ts +49 -49
  157. package/src/completion/index.ts +13 -13
  158. package/src/constant.ts +35 -1
  159. package/src/decorators/captureError.ts +25 -25
  160. package/src/decorators/constants.ts +12 -12
  161. package/src/decorators/deprecate.ts +25 -25
  162. package/src/decorators/guard.ts +42 -42
  163. package/src/decorators/index.ts +7 -7
  164. package/src/decorators/injectParams.ts +54 -54
  165. package/src/decorators/params/common.ts +28 -28
  166. package/src/decorators/params/index.ts +35 -35
  167. package/src/env/domain.ts +33 -33
  168. package/src/env/index.ts +63 -63
  169. package/src/env/login.ts +80 -80
  170. package/src/error.ts +36 -36
  171. package/src/function/alias.ts +43 -43
  172. package/src/function/base.ts +253 -253
  173. package/src/function/code.ts +55 -55
  174. package/src/function/concurrency.ts +57 -57
  175. package/src/function/create.ts +78 -78
  176. package/src/function/delete.ts +42 -42
  177. package/src/function/index.ts +10 -10
  178. package/src/function/layer/attach.ts +68 -68
  179. package/src/function/layer/create.ts +63 -63
  180. package/src/function/layer/delete.ts +21 -21
  181. package/src/function/layer/download.ts +54 -54
  182. package/src/function/layer/index.ts +7 -7
  183. package/src/function/layer/list.ts +32 -32
  184. package/src/function/layer/sort.ts +24 -24
  185. package/src/function/trigger.ts +97 -97
  186. package/src/function/update.ts +35 -35
  187. package/src/function/version.ts +38 -38
  188. package/src/function/vpc.ts +22 -22
  189. package/src/gateway/index.ts +137 -137
  190. package/src/help.ts +50 -48
  191. package/src/hosting.ts +212 -212
  192. package/src/index.ts +13 -13
  193. package/src/logger.ts +17 -17
  194. package/src/run/create.ts +23 -23
  195. package/src/run/delete.ts +15 -15
  196. package/src/run/image/build.ts +36 -36
  197. package/src/run/image/delete.ts +13 -13
  198. package/src/run/image/index.ts +3 -3
  199. package/src/run/image/info.ts +26 -26
  200. package/src/run/index.ts +2 -1
  201. package/src/run/list.ts +29 -29
  202. package/src/run/repo.ts +24 -24
  203. package/src/run/service/common.ts +206 -0
  204. package/src/run/service/config.ts +77 -0
  205. package/src/run/service/create.ts +52 -0
  206. package/src/run/service/deployPackage.ts +63 -0
  207. package/src/run/service/index.ts +7 -0
  208. package/src/run/service/list.ts +29 -0
  209. package/src/run/service/showLogs.ts +98 -0
  210. package/src/run/service/update.ts +81 -0
  211. package/src/run/standalonegateway/create.ts +24 -24
  212. package/src/run/standalonegateway/destroy.ts +19 -19
  213. package/src/run/standalonegateway/index.ts +4 -4
  214. package/src/run/standalonegateway/list.ts +74 -74
  215. package/src/run/standalonegateway/package/list.ts +24 -24
  216. package/src/run/standalonegateway/turn/index.ts +1 -1
  217. package/src/run/standalonegateway/turn/off.ts +19 -19
  218. package/src/run/standalonegateway/turn/on.ts +19 -19
  219. package/src/run/version/create.ts +68 -68
  220. package/src/run/version/delete.ts +15 -15
  221. package/src/run/version/index.ts +5 -5
  222. package/src/run/version/list.ts +16 -16
  223. package/src/run/version/modify.ts +16 -16
  224. package/src/run/version/repo.ts +27 -27
  225. package/src/run/version/update.ts +58 -58
  226. package/src/storage.ts +114 -114
  227. package/src/third/index.ts +12 -12
  228. package/src/types.ts +128 -2
  229. package/src/utils/auth.ts +15 -15
  230. package/src/utils/checkTcbrEnv.ts +67 -0
  231. package/src/utils/cli-table.ts +23 -23
  232. package/src/utils/commonParamsCheck.ts +65 -0
  233. package/src/utils/config.ts +39 -39
  234. package/src/utils/env.ts +244 -244
  235. package/src/utils/fs/del.ts +5 -5
  236. package/src/utils/fs/index.ts +71 -71
  237. package/src/utils/function-packer.ts +97 -97
  238. package/src/utils/index.ts +5 -1
  239. package/src/utils/log.ts +81 -81
  240. package/src/utils/net/cloud-api-request.ts +62 -62
  241. package/src/utils/net/credential.ts +53 -53
  242. package/src/utils/net/http-request.ts +84 -84
  243. package/src/utils/net/index.ts +4 -4
  244. package/src/utils/net/manager-service.ts +36 -36
  245. package/src/utils/net/proxy.ts +6 -6
  246. package/src/utils/notice.ts +28 -28
  247. package/src/utils/output/highlight.ts +5 -5
  248. package/src/utils/output/index.ts +2 -2
  249. package/src/utils/output/link.ts +10 -10
  250. package/src/utils/output/loading.ts +82 -82
  251. package/src/utils/parallel.ts +82 -82
  252. package/src/utils/platform/index.ts +2 -2
  253. package/src/utils/platform/mac.ts +21 -21
  254. package/src/utils/platform/os.ts +64 -64
  255. package/src/utils/platform/port.ts +10 -10
  256. package/src/utils/progress-bar.ts +38 -38
  257. package/src/utils/prompt/select.ts +59 -59
  258. package/src/utils/reporter/agree.ts +20 -20
  259. package/src/utils/reporter/download.ts +26 -26
  260. package/src/utils/reporter/index.ts +3 -3
  261. package/src/utils/reporter/usage.ts +20 -20
  262. package/src/utils/store/auth.ts +49 -49
  263. package/src/utils/store/common.ts +8 -8
  264. package/src/utils/store/db.ts +68 -68
  265. package/src/utils/store/index.ts +4 -4
  266. package/src/utils/store/usage.ts +12 -12
  267. package/src/utils/tcbrApi/callTcbrApi.ts +28 -0
  268. package/src/utils/tcbrApi/index.ts +1 -0
  269. package/src/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.ts +363 -0
  270. package/src/utils/tcbrApi/tcbr-cloud-api/error.ts +30 -0
  271. package/src/utils/tcbrApi/tcbr-cloud-api/index.ts +1 -0
  272. package/src/utils/tcbrApi/tcbr-cloud-api/request.ts +28 -0
  273. package/src/utils/tcbrApi/tcbr-cloud-api-request.ts +66 -0
  274. package/src/utils/template.ts +170 -170
  275. package/src/utils/tools/encoding.ts +8 -8
  276. package/src/utils/tools/index.ts +4 -4
  277. package/src/utils/tools/object.ts +33 -33
  278. package/src/utils/tools/time.ts +38 -38
  279. package/src/utils/tools/uid.ts +19 -19
  280. package/src/utils/validator.ts +64 -32
  281. package/templates/html/loginFail.html +90 -90
  282. package/templates/html/loginSuccess.html +86 -86
  283. package/templates/server/node/_gitignore +54 -54
  284. package/templates/server/node/cloudbaserc.json +10 -10
  285. package/templates/server/node/index.js +5 -5
  286. package/templates/server/node/package.json +9 -9
  287. package/tsconfig.json +19 -19
  288. package/tsconfig.test.json +13 -13
  289. package/types/commands/run/index.d.ts +1 -0
  290. package/types/commands/run/service/config.d.ts +14 -0
  291. package/types/commands/run/service/create.d.ts +13 -0
  292. package/types/commands/run/service/deploy.d.ts +13 -0
  293. package/types/commands/run/service/index.d.ts +5 -0
  294. package/types/commands/run/service/list.d.ts +13 -0
  295. package/types/commands/run/service/update.d.ts +13 -0
  296. package/types/constant.d.ts +18 -0
  297. package/types/run/index.d.ts +1 -0
  298. package/types/run/service/common.d.ts +32 -0
  299. package/types/run/service/config.d.ts +23 -0
  300. package/types/run/service/create.d.ts +7 -0
  301. package/types/run/service/deployPackage.d.ts +11 -0
  302. package/types/run/service/index.d.ts +7 -0
  303. package/types/run/service/list.d.ts +2 -0
  304. package/types/run/service/showLogs.d.ts +2 -0
  305. package/types/run/service/update.d.ts +2 -0
  306. package/types/types.d.ts +116 -2
  307. package/types/utils/checkTcbrEnv.d.ts +3 -0
  308. package/types/utils/commonParamsCheck.d.ts +3 -0
  309. package/types/utils/index.d.ts +3 -0
  310. package/types/utils/tcbrApi/callTcbrApi.d.ts +1 -0
  311. package/types/utils/tcbrApi/index.d.ts +1 -0
  312. package/types/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.d.ts +51 -0
  313. package/types/utils/tcbrApi/tcbr-cloud-api/error.d.ts +20 -0
  314. package/types/utils/tcbrApi/tcbr-cloud-api/index.d.ts +1 -0
  315. package/types/utils/tcbrApi/tcbr-cloud-api/request.d.ts +4 -0
  316. package/types/utils/tcbrApi/tcbr-cloud-api-request.d.ts +9 -0
  317. package/types/utils/validator.d.ts +4 -0
@@ -1,170 +1,170 @@
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
+ 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 +1,8 @@
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
+ 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 +1,4 @@
1
- export * from './uid'
2
- export * from './time'
3
- export * from './object'
4
- export * from './encoding'
1
+ export * from './uid'
2
+ export * from './time'
3
+ export * from './object'
4
+ export * from './encoding'
@@ -1,33 +1,33 @@
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
+ 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 +1,38 @@
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
+ 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 +1,19 @@
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
+ 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,33 +1,65 @@
1
- import { CloudBaseError } from '../error'
2
-
3
- type SimpleValue = number | string | boolean
4
-
5
- export function assertTruthy(val: SimpleValue | SimpleValue[], errMsg: string) {
6
- let ok
7
- if (Array.isArray(val)) {
8
- ok = val.every(item => Boolean(val))
9
- } else {
10
- ok = Boolean(val)
11
- }
12
-
13
- if (!ok) {
14
- throw new CloudBaseError(errMsg)
15
- }
16
- }
17
-
18
- export function assertHas(obj: any, prop: string, errMsg): void {
19
- if (!obj[prop]) {
20
- throw new CloudBaseError(errMsg)
21
- }
22
- }
23
-
24
-
25
- export const validateIp = (ip: string): boolean => {
26
- if (Object.prototype.toString.call(ip) !== '[object String]') return false
27
- const fields = ip.split('.')
28
- if (
29
- fields.length !== 4 ||
30
- fields.find(item => isNaN(Number(item)) || Number(item) < 0 || Number(item) > 255)
31
- ) return false
32
- return true
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
+ }
33
65
  }