@cloudbase/cli 2.0.3 → 2.0.5

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 (217) 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/changelog.md +6 -6
  10. package/jest.config.js +17 -17
  11. package/lib/commands/account/login.js +18 -18
  12. package/lib/commands/run/list.js +2 -3
  13. package/lib/commands/storage/storage.js +1 -1
  14. package/lib/env/login.js +7 -7
  15. package/lib/utils/tcbrApi/callTcbrApi.js +2 -2
  16. package/package.json +3 -3
  17. package/post-install.js +61 -61
  18. package/runtime/nodejs/bootstrap.js +255 -255
  19. package/runtime/nodejs/runtime.js +183 -183
  20. package/src/auth/index.ts +1 -1
  21. package/src/auth/login.ts +91 -91
  22. package/src/auth/logout.ts +7 -7
  23. package/src/commands/account/index.ts +2 -2
  24. package/src/commands/account/login.ts +192 -192
  25. package/src/commands/account/logout.ts +24 -24
  26. package/src/commands/env/base.ts +90 -90
  27. package/src/commands/env/create.ts +92 -92
  28. package/src/commands/env/domain.ts +186 -186
  29. package/src/commands/env/index.ts +4 -4
  30. package/src/commands/env/login.ts +235 -235
  31. package/src/commands/framework/index.ts +124 -124
  32. package/src/commands/functions/alias/getRoute.ts +76 -76
  33. package/src/commands/functions/alias/index.ts +2 -2
  34. package/src/commands/functions/alias/setRoute.ts +82 -82
  35. package/src/commands/functions/code-download.ts +100 -100
  36. package/src/commands/functions/code-update.ts +62 -62
  37. package/src/commands/functions/concurrency/delete.ts +45 -45
  38. package/src/commands/functions/concurrency/index.ts +2 -2
  39. package/src/commands/functions/concurrency/list.ts +58 -58
  40. package/src/commands/functions/concurrency/set.ts +47 -47
  41. package/src/commands/functions/config-update.ts +76 -76
  42. package/src/commands/functions/copy.ts +62 -62
  43. package/src/commands/functions/delete.ts +79 -79
  44. package/src/commands/functions/deploy.ts +293 -293
  45. package/src/commands/functions/detail.ts +138 -138
  46. package/src/commands/functions/index.ts +16 -16
  47. package/src/commands/functions/invoke.ts +121 -121
  48. package/src/commands/functions/layer/bind.ts +182 -182
  49. package/src/commands/functions/layer/common.ts +8 -8
  50. package/src/commands/functions/layer/create.ts +49 -49
  51. package/src/commands/functions/layer/delete.ts +73 -73
  52. package/src/commands/functions/layer/download.ts +92 -92
  53. package/src/commands/functions/layer/index.ts +7 -7
  54. package/src/commands/functions/layer/list.ts +94 -94
  55. package/src/commands/functions/layer/sort.ts +76 -76
  56. package/src/commands/functions/list.ts +68 -68
  57. package/src/commands/functions/log.ts +148 -148
  58. package/src/commands/functions/run.ts +249 -249
  59. package/src/commands/functions/trigger-create.ts +79 -79
  60. package/src/commands/functions/trigger-delete.ts +105 -105
  61. package/src/commands/functions/version/index.ts +1 -1
  62. package/src/commands/functions/version/list.ts +73 -73
  63. package/src/commands/functions/version/publish.ts +43 -43
  64. package/src/commands/gateway/create.ts +109 -109
  65. package/src/commands/gateway/delete.ts +81 -81
  66. package/src/commands/gateway/domain.ts +159 -159
  67. package/src/commands/gateway/index.ts +5 -5
  68. package/src/commands/gateway/list.ts +76 -76
  69. package/src/commands/gateway/switch.ts +107 -107
  70. package/src/commands/helpers/index.ts +2 -2
  71. package/src/commands/helpers/init.ts +431 -431
  72. package/src/commands/helpers/new.ts +117 -117
  73. package/src/commands/helpers/open.ts +67 -67
  74. package/src/commands/hosting/hosting.ts +360 -360
  75. package/src/commands/index.ts +13 -13
  76. package/src/commands/lowcode/app.ts +34 -34
  77. package/src/commands/lowcode/comps.ts +322 -322
  78. package/src/commands/lowcode/index.ts +1 -1
  79. package/src/commands/lowcode/utils.ts +24 -24
  80. package/src/commands/run/image/index.ts +4 -4
  81. package/src/commands/run/list.ts +2 -3
  82. package/src/commands/run/standalonegateway/common.ts +7 -7
  83. package/src/commands/run/standalonegateway/create.ts +85 -85
  84. package/src/commands/run/standalonegateway/destroy.ts +59 -59
  85. package/src/commands/run/standalonegateway/index.ts +4 -4
  86. package/src/commands/run/standalonegateway/list.ts +53 -53
  87. package/src/commands/run/standalonegateway/package.ts +62 -62
  88. package/src/commands/run/standalonegateway/turn.ts +63 -63
  89. package/src/commands/run/version/index.ts +4 -4
  90. package/src/commands/smart.ts +132 -132
  91. package/src/commands/storage/storage.ts +464 -464
  92. package/src/commands/third/thirdAttach.ts +49 -49
  93. package/src/completion/index.ts +13 -13
  94. package/src/decorators/captureError.ts +25 -25
  95. package/src/decorators/constants.ts +12 -12
  96. package/src/decorators/deprecate.ts +25 -25
  97. package/src/decorators/guard.ts +42 -42
  98. package/src/decorators/index.ts +7 -7
  99. package/src/decorators/injectParams.ts +54 -54
  100. package/src/decorators/params/common.ts +28 -28
  101. package/src/decorators/params/index.ts +35 -35
  102. package/src/env/domain.ts +33 -33
  103. package/src/env/index.ts +63 -63
  104. package/src/env/login.ts +80 -80
  105. package/src/error.ts +36 -36
  106. package/src/function/alias.ts +43 -43
  107. package/src/function/base.ts +253 -253
  108. package/src/function/code.ts +55 -55
  109. package/src/function/concurrency.ts +57 -57
  110. package/src/function/create.ts +78 -78
  111. package/src/function/delete.ts +42 -42
  112. package/src/function/index.ts +10 -10
  113. package/src/function/layer/attach.ts +68 -68
  114. package/src/function/layer/create.ts +63 -63
  115. package/src/function/layer/delete.ts +21 -21
  116. package/src/function/layer/download.ts +54 -54
  117. package/src/function/layer/index.ts +7 -7
  118. package/src/function/layer/list.ts +32 -32
  119. package/src/function/layer/sort.ts +24 -24
  120. package/src/function/trigger.ts +97 -97
  121. package/src/function/update.ts +35 -35
  122. package/src/function/version.ts +38 -38
  123. package/src/function/vpc.ts +22 -22
  124. package/src/gateway/index.ts +137 -137
  125. package/src/hosting.ts +212 -212
  126. package/src/index.ts +13 -13
  127. package/src/logger.ts +17 -17
  128. package/src/run/create.ts +23 -23
  129. package/src/run/delete.ts +15 -15
  130. package/src/run/image/build.ts +36 -36
  131. package/src/run/image/delete.ts +13 -13
  132. package/src/run/image/index.ts +3 -3
  133. package/src/run/image/info.ts +26 -26
  134. package/src/run/list.ts +29 -29
  135. package/src/run/repo.ts +24 -24
  136. package/src/run/standalonegateway/create.ts +24 -24
  137. package/src/run/standalonegateway/destroy.ts +19 -19
  138. package/src/run/standalonegateway/index.ts +4 -4
  139. package/src/run/standalonegateway/list.ts +74 -74
  140. package/src/run/standalonegateway/package/list.ts +24 -24
  141. package/src/run/standalonegateway/turn/index.ts +1 -1
  142. package/src/run/standalonegateway/turn/off.ts +19 -19
  143. package/src/run/standalonegateway/turn/on.ts +19 -19
  144. package/src/run/version/create.ts +68 -68
  145. package/src/run/version/delete.ts +15 -15
  146. package/src/run/version/index.ts +5 -5
  147. package/src/run/version/list.ts +16 -16
  148. package/src/run/version/modify.ts +16 -16
  149. package/src/run/version/repo.ts +27 -27
  150. package/src/run/version/update.ts +58 -58
  151. package/src/storage.ts +114 -114
  152. package/src/third/index.ts +12 -12
  153. package/src/utils/auth.ts +15 -15
  154. package/src/utils/cli-table.ts +23 -23
  155. package/src/utils/config.ts +39 -39
  156. package/src/utils/env.ts +244 -244
  157. package/src/utils/fs/del.ts +5 -5
  158. package/src/utils/fs/index.ts +71 -71
  159. package/src/utils/function-packer.ts +97 -97
  160. package/src/utils/log.ts +81 -81
  161. package/src/utils/net/cloud-api-request.ts +62 -62
  162. package/src/utils/net/credential.ts +53 -53
  163. package/src/utils/net/index.ts +4 -4
  164. package/src/utils/net/manager-service.ts +36 -36
  165. package/src/utils/net/proxy.ts +6 -6
  166. package/src/utils/notice.ts +28 -28
  167. package/src/utils/output/highlight.ts +5 -5
  168. package/src/utils/output/index.ts +2 -2
  169. package/src/utils/output/link.ts +10 -10
  170. package/src/utils/output/loading.ts +82 -82
  171. package/src/utils/parallel.ts +82 -82
  172. package/src/utils/platform/index.ts +2 -2
  173. package/src/utils/platform/mac.ts +21 -21
  174. package/src/utils/platform/os.ts +64 -64
  175. package/src/utils/platform/port.ts +10 -10
  176. package/src/utils/progress-bar.ts +38 -38
  177. package/src/utils/prompt/select.ts +59 -59
  178. package/src/utils/reporter/agree.ts +20 -20
  179. package/src/utils/reporter/download.ts +26 -26
  180. package/src/utils/reporter/index.ts +3 -3
  181. package/src/utils/reporter/usage.ts +20 -20
  182. package/src/utils/store/auth.ts +49 -49
  183. package/src/utils/store/common.ts +8 -8
  184. package/src/utils/store/db.ts +68 -68
  185. package/src/utils/store/index.ts +4 -4
  186. package/src/utils/store/usage.ts +12 -12
  187. package/src/utils/tcbrApi/callTcbrApi.ts +1 -1
  188. package/src/utils/template.ts +170 -170
  189. package/src/utils/tools/encoding.ts +8 -8
  190. package/src/utils/tools/index.ts +4 -4
  191. package/src/utils/tools/object.ts +33 -33
  192. package/src/utils/tools/time.ts +38 -38
  193. package/src/utils/tools/uid.ts +19 -19
  194. package/templates/html/loginFail.html +90 -90
  195. package/templates/html/loginSuccess.html +86 -86
  196. package/templates/server/node/_gitignore +54 -54
  197. package/templates/server/node/cloudbaserc.json +10 -10
  198. package/templates/server/node/index.js +5 -5
  199. package/templates/server/node/package.json +9 -9
  200. package/tsconfig.json +19 -19
  201. package/tsconfig.test.json +13 -13
  202. package/.vscode/settings.json +0 -3
  203. package/lib/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.js +0 -268
  204. package/lib/utils/tcbrApi/tcbr-cloud-api/error.js +0 -17
  205. package/lib/utils/tcbrApi/tcbr-cloud-api/index.js +0 -17
  206. package/lib/utils/tcbrApi/tcbr-cloud-api/request.js +0 -40
  207. package/lib/utils/tcbrApi/tcbr-cloud-api-request.js +0 -61
  208. package/src/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.ts +0 -363
  209. package/src/utils/tcbrApi/tcbr-cloud-api/error.ts +0 -30
  210. package/src/utils/tcbrApi/tcbr-cloud-api/index.ts +0 -1
  211. package/src/utils/tcbrApi/tcbr-cloud-api/request.ts +0 -28
  212. package/src/utils/tcbrApi/tcbr-cloud-api-request.ts +0 -66
  213. package/types/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.d.ts +0 -51
  214. package/types/utils/tcbrApi/tcbr-cloud-api/error.d.ts +0 -20
  215. package/types/utils/tcbrApi/tcbr-cloud-api/index.d.ts +0 -1
  216. package/types/utils/tcbrApi/tcbr-cloud-api/request.d.ts +0 -4
  217. package/types/utils/tcbrApi/tcbr-cloud-api-request.d.ts +0 -9
@@ -1,253 +1,253 @@
1
- import CloudBase from '@cloudbase/manager-node'
2
- import { CloudApiService, checkAndGetCredential, getProxy } from '../utils'
3
- import { successLog } from '../logger'
4
- import {
5
- IListFunctionOptions,
6
- IFunctionLogOptions,
7
- IUpdateFunctionConfigOptions,
8
- IFunctionBatchOptions,
9
- InvokeFunctionOptions
10
- } from '../types'
11
- import { CloudBaseError } from '../error'
12
- import { getVpcs, getSubnets } from './vpc'
13
- import { getRegion } from '@cloudbase/toolbox'
14
-
15
- export interface IBaseOptions {
16
- envId: string
17
- functionName: string
18
- }
19
-
20
- export interface ICopyFunctionOptions {
21
- envId: string
22
- functionName: string
23
- newFunctionName: string
24
- targetEnvId: string
25
- force?: boolean
26
- copyConfig?: boolean
27
- codeSecret?: string
28
- }
29
-
30
- const scfService = CloudApiService.getInstance('scf')
31
- export interface IDetailOptions extends IBaseOptions {
32
- codeSecret?: string
33
- }
34
-
35
- export async function getFunctionService(envId: string) {
36
- const region = await getRegion()
37
- const { secretId, secretKey, token } = await checkAndGetCredential(true)
38
-
39
- const app = new CloudBase({
40
- region,
41
- token,
42
- envId,
43
- secretId,
44
- secretKey,
45
- proxy: getProxy()
46
- })
47
- return app.functions
48
- }
49
-
50
- // 列出函数
51
- export async function listFunction(
52
- options: IListFunctionOptions
53
- ): Promise<Record<string, string>[]> {
54
- const { limit = 20, offset = 0, envId } = options
55
- const res: any = await scfService.request('ListFunctions', {
56
- Namespace: envId,
57
- Limit: limit,
58
- Offset: offset
59
- })
60
- const { Functions = [] } = res
61
- const data: Record<string, string>[] = []
62
- Functions.forEach(func => {
63
- const { FunctionId, FunctionName, Runtime, AddTime, ModTime, Status } = func
64
- data.push({
65
- FunctionId,
66
- FunctionName,
67
- Runtime,
68
- AddTime,
69
- ModTime,
70
- Status
71
- })
72
- })
73
-
74
- return data
75
- }
76
-
77
- // 获取云函数详细信息
78
- export async function getFunctionDetail(options: IDetailOptions): Promise<Record<string, any>> {
79
- const { functionName, envId, codeSecret } = options
80
-
81
- const res = await scfService.request('GetFunction', {
82
- FunctionName: functionName,
83
- Namespace: envId,
84
- ShowCode: 'TRUE',
85
- CodeSecret: codeSecret
86
- })
87
-
88
- const data: Record<string, any> = res
89
-
90
- // 获取 VPC 信息
91
- const { VpcId = '', SubnetId = '' } = data.VpcConfig || {}
92
- if (VpcId && SubnetId) {
93
- try {
94
- const vpcs = await getVpcs()
95
- const subnets = await getSubnets(VpcId)
96
- const vpc = vpcs.find(item => item.VpcId === VpcId)
97
- const subnet = subnets.find(item => item.SubnetId === SubnetId)
98
- data.VpcConfig = {
99
- vpc,
100
- subnet
101
- }
102
- } catch (e) {
103
- // 无法获取到 VPC 配置,只展示 id 信息
104
- data.VpcConfig = {
105
- vpc: VpcId,
106
- subnet: SubnetId
107
- }
108
- }
109
- }
110
- return data
111
- }
112
-
113
- // 批量获取函数信息
114
- export async function batchGetFunctionsDetail({
115
- names,
116
- envId,
117
- codeSecret
118
- }): Promise<Record<string, string>[]> {
119
- const data: Record<string, string>[] = []
120
- const promises = names.map(name =>
121
- (async () => {
122
- try {
123
- const info = await getFunctionDetail({
124
- envId,
125
- codeSecret,
126
- functionName: name
127
- })
128
- data.push(info)
129
- } catch (e) {
130
- throw new CloudBaseError(`${name} 获取信息失败:${e.message}`)
131
- }
132
- })()
133
- )
134
-
135
- await Promise.all(promises)
136
-
137
- return data
138
- }
139
-
140
- // 获取函数日志
141
- export async function getFunctionLog(
142
- options: IFunctionLogOptions
143
- ): Promise<Record<string, string>[]> {
144
- const { envId } = options
145
-
146
- const params = {
147
- Namespace: envId
148
- }
149
-
150
- Object.keys(options).forEach(key => {
151
- if (key === 'envId') return
152
- const keyFirstCharUpperCase = key.charAt(0).toUpperCase() + key.slice(1)
153
- params[keyFirstCharUpperCase] = options[key]
154
- })
155
-
156
- const { Data = [] }: any = await scfService.request('GetFunctionLogs', params)
157
- return Data
158
- }
159
-
160
- // 更新函数配置
161
- export async function updateFunctionConfig(options: IUpdateFunctionConfigOptions): Promise<void> {
162
- const { functionName, config, envId } = options
163
-
164
- const functionService = await getFunctionService(envId)
165
- await functionService.updateFunctionConfig({
166
- name: functionName,
167
- ...config
168
- })
169
- }
170
-
171
- // 批量更新函数配置
172
- export async function batchUpdateFunctionConfig(options: IFunctionBatchOptions): Promise<void> {
173
- const { functions, envId, log } = options
174
- const promises = functions.map(func =>
175
- (async () => {
176
- try {
177
- await updateFunctionConfig({
178
- functionName: func.name,
179
- config: func,
180
- envId
181
- })
182
- log && successLog(`[${func.name}] 更新云函数配置成功!`)
183
- } catch (e) {
184
- throw new CloudBaseError(`${func.name} 更新配置失败:${e.message}`)
185
- }
186
- })()
187
- )
188
-
189
- await Promise.all(promises)
190
- }
191
-
192
- // 调用函数
193
- export async function invokeFunction(options: InvokeFunctionOptions) {
194
- const { functionName, envId, params = {} } = options
195
-
196
- const _params = {
197
- FunctionName: functionName,
198
- Namespace: envId,
199
- ClientContext: JSON.stringify(params),
200
- LogType: 'Tail'
201
- }
202
-
203
- try {
204
- const { Result } = await scfService.request('Invoke', _params)
205
- return Result
206
- } catch (e) {
207
- throw new CloudBaseError(`[${functionName}] 调用失败:\n${e.message}`)
208
- }
209
- }
210
-
211
- // 批量触发云函数
212
- export async function batchInvokeFunctions(options: IFunctionBatchOptions) {
213
- const { functions, envId, log = false } = options
214
-
215
- const promises = functions.map(func =>
216
- (async () => {
217
- try {
218
- const result = await invokeFunction({
219
- functionName: func.name,
220
- params: func.params,
221
- envId
222
- })
223
- if (log) {
224
- successLog(`[${func.name}] 调用成功\n响应结果:\n`)
225
- console.log(result)
226
- }
227
- return result
228
- } catch (e) {
229
- throw new CloudBaseError(`${func.name} 函数调用失败:${e.message}`)
230
- }
231
- })()
232
- )
233
-
234
- return Promise.all(promises)
235
- }
236
-
237
- // 复制云函数
238
- export async function copyFunction(options: ICopyFunctionOptions) {
239
- const { envId, functionName, newFunctionName, targetEnvId, force, codeSecret } = options
240
-
241
- if (!envId || !functionName || !newFunctionName) {
242
- throw new CloudBaseError('参数缺失')
243
- }
244
-
245
- await scfService.request('CopyFunction', {
246
- FunctionName: functionName,
247
- NewFunctionName: newFunctionName,
248
- Namespace: envId,
249
- TargetNamespace: targetEnvId || envId,
250
- Override: force ? true : false,
251
- CodeSecret: codeSecret
252
- })
253
- }
1
+ import CloudBase from '@cloudbase/manager-node'
2
+ import { CloudApiService, checkAndGetCredential, getProxy } from '../utils'
3
+ import { successLog } from '../logger'
4
+ import {
5
+ IListFunctionOptions,
6
+ IFunctionLogOptions,
7
+ IUpdateFunctionConfigOptions,
8
+ IFunctionBatchOptions,
9
+ InvokeFunctionOptions
10
+ } from '../types'
11
+ import { CloudBaseError } from '../error'
12
+ import { getVpcs, getSubnets } from './vpc'
13
+ import { getRegion } from '@cloudbase/toolbox'
14
+
15
+ export interface IBaseOptions {
16
+ envId: string
17
+ functionName: string
18
+ }
19
+
20
+ export interface ICopyFunctionOptions {
21
+ envId: string
22
+ functionName: string
23
+ newFunctionName: string
24
+ targetEnvId: string
25
+ force?: boolean
26
+ copyConfig?: boolean
27
+ codeSecret?: string
28
+ }
29
+
30
+ const scfService = CloudApiService.getInstance('scf')
31
+ export interface IDetailOptions extends IBaseOptions {
32
+ codeSecret?: string
33
+ }
34
+
35
+ export async function getFunctionService(envId: string) {
36
+ const region = await getRegion()
37
+ const { secretId, secretKey, token } = await checkAndGetCredential(true)
38
+
39
+ const app = new CloudBase({
40
+ region,
41
+ token,
42
+ envId,
43
+ secretId,
44
+ secretKey,
45
+ proxy: getProxy()
46
+ })
47
+ return app.functions
48
+ }
49
+
50
+ // 列出函数
51
+ export async function listFunction(
52
+ options: IListFunctionOptions
53
+ ): Promise<Record<string, string>[]> {
54
+ const { limit = 20, offset = 0, envId } = options
55
+ const res: any = await scfService.request('ListFunctions', {
56
+ Namespace: envId,
57
+ Limit: limit,
58
+ Offset: offset
59
+ })
60
+ const { Functions = [] } = res
61
+ const data: Record<string, string>[] = []
62
+ Functions.forEach(func => {
63
+ const { FunctionId, FunctionName, Runtime, AddTime, ModTime, Status } = func
64
+ data.push({
65
+ FunctionId,
66
+ FunctionName,
67
+ Runtime,
68
+ AddTime,
69
+ ModTime,
70
+ Status
71
+ })
72
+ })
73
+
74
+ return data
75
+ }
76
+
77
+ // 获取云函数详细信息
78
+ export async function getFunctionDetail(options: IDetailOptions): Promise<Record<string, any>> {
79
+ const { functionName, envId, codeSecret } = options
80
+
81
+ const res = await scfService.request('GetFunction', {
82
+ FunctionName: functionName,
83
+ Namespace: envId,
84
+ ShowCode: 'TRUE',
85
+ CodeSecret: codeSecret
86
+ })
87
+
88
+ const data: Record<string, any> = res
89
+
90
+ // 获取 VPC 信息
91
+ const { VpcId = '', SubnetId = '' } = data.VpcConfig || {}
92
+ if (VpcId && SubnetId) {
93
+ try {
94
+ const vpcs = await getVpcs()
95
+ const subnets = await getSubnets(VpcId)
96
+ const vpc = vpcs.find(item => item.VpcId === VpcId)
97
+ const subnet = subnets.find(item => item.SubnetId === SubnetId)
98
+ data.VpcConfig = {
99
+ vpc,
100
+ subnet
101
+ }
102
+ } catch (e) {
103
+ // 无法获取到 VPC 配置,只展示 id 信息
104
+ data.VpcConfig = {
105
+ vpc: VpcId,
106
+ subnet: SubnetId
107
+ }
108
+ }
109
+ }
110
+ return data
111
+ }
112
+
113
+ // 批量获取函数信息
114
+ export async function batchGetFunctionsDetail({
115
+ names,
116
+ envId,
117
+ codeSecret
118
+ }): Promise<Record<string, string>[]> {
119
+ const data: Record<string, string>[] = []
120
+ const promises = names.map(name =>
121
+ (async () => {
122
+ try {
123
+ const info = await getFunctionDetail({
124
+ envId,
125
+ codeSecret,
126
+ functionName: name
127
+ })
128
+ data.push(info)
129
+ } catch (e) {
130
+ throw new CloudBaseError(`${name} 获取信息失败:${e.message}`)
131
+ }
132
+ })()
133
+ )
134
+
135
+ await Promise.all(promises)
136
+
137
+ return data
138
+ }
139
+
140
+ // 获取函数日志
141
+ export async function getFunctionLog(
142
+ options: IFunctionLogOptions
143
+ ): Promise<Record<string, string>[]> {
144
+ const { envId } = options
145
+
146
+ const params = {
147
+ Namespace: envId
148
+ }
149
+
150
+ Object.keys(options).forEach(key => {
151
+ if (key === 'envId') return
152
+ const keyFirstCharUpperCase = key.charAt(0).toUpperCase() + key.slice(1)
153
+ params[keyFirstCharUpperCase] = options[key]
154
+ })
155
+
156
+ const { Data = [] }: any = await scfService.request('GetFunctionLogs', params)
157
+ return Data
158
+ }
159
+
160
+ // 更新函数配置
161
+ export async function updateFunctionConfig(options: IUpdateFunctionConfigOptions): Promise<void> {
162
+ const { functionName, config, envId } = options
163
+
164
+ const functionService = await getFunctionService(envId)
165
+ await functionService.updateFunctionConfig({
166
+ name: functionName,
167
+ ...config
168
+ })
169
+ }
170
+
171
+ // 批量更新函数配置
172
+ export async function batchUpdateFunctionConfig(options: IFunctionBatchOptions): Promise<void> {
173
+ const { functions, envId, log } = options
174
+ const promises = functions.map(func =>
175
+ (async () => {
176
+ try {
177
+ await updateFunctionConfig({
178
+ functionName: func.name,
179
+ config: func,
180
+ envId
181
+ })
182
+ log && successLog(`[${func.name}] 更新云函数配置成功!`)
183
+ } catch (e) {
184
+ throw new CloudBaseError(`${func.name} 更新配置失败:${e.message}`)
185
+ }
186
+ })()
187
+ )
188
+
189
+ await Promise.all(promises)
190
+ }
191
+
192
+ // 调用函数
193
+ export async function invokeFunction(options: InvokeFunctionOptions) {
194
+ const { functionName, envId, params = {} } = options
195
+
196
+ const _params = {
197
+ FunctionName: functionName,
198
+ Namespace: envId,
199
+ ClientContext: JSON.stringify(params),
200
+ LogType: 'Tail'
201
+ }
202
+
203
+ try {
204
+ const { Result } = await scfService.request('Invoke', _params)
205
+ return Result
206
+ } catch (e) {
207
+ throw new CloudBaseError(`[${functionName}] 调用失败:\n${e.message}`)
208
+ }
209
+ }
210
+
211
+ // 批量触发云函数
212
+ export async function batchInvokeFunctions(options: IFunctionBatchOptions) {
213
+ const { functions, envId, log = false } = options
214
+
215
+ const promises = functions.map(func =>
216
+ (async () => {
217
+ try {
218
+ const result = await invokeFunction({
219
+ functionName: func.name,
220
+ params: func.params,
221
+ envId
222
+ })
223
+ if (log) {
224
+ successLog(`[${func.name}] 调用成功\n响应结果:\n`)
225
+ console.log(result)
226
+ }
227
+ return result
228
+ } catch (e) {
229
+ throw new CloudBaseError(`${func.name} 函数调用失败:${e.message}`)
230
+ }
231
+ })()
232
+ )
233
+
234
+ return Promise.all(promises)
235
+ }
236
+
237
+ // 复制云函数
238
+ export async function copyFunction(options: ICopyFunctionOptions) {
239
+ const { envId, functionName, newFunctionName, targetEnvId, force, codeSecret } = options
240
+
241
+ if (!envId || !functionName || !newFunctionName) {
242
+ throw new CloudBaseError('参数缺失')
243
+ }
244
+
245
+ await scfService.request('CopyFunction', {
246
+ FunctionName: functionName,
247
+ NewFunctionName: newFunctionName,
248
+ Namespace: envId,
249
+ TargetNamespace: targetEnvId || envId,
250
+ Override: force ? true : false,
251
+ CodeSecret: codeSecret
252
+ })
253
+ }
@@ -1,55 +1,55 @@
1
- import fs from 'fs'
2
- import path from 'path'
3
- import unzipper from 'unzipper'
4
- import { CloudApiService, fetchStream, delSync, checkFullAccess } from '../utils'
5
-
6
- interface IFunctionCodeOptions {
7
- envId: string
8
- destPath: string
9
- functionName: string
10
- codeSecret?: string
11
- unzip?: boolean
12
- }
13
-
14
- const scfService = CloudApiService.getInstance('scf')
15
-
16
- // 下载函数代码
17
- export async function downloadFunctionCode(options: IFunctionCodeOptions) {
18
- const { destPath, envId, functionName, codeSecret, unzip = false } = options
19
-
20
- // 检验路径是否存在
21
- checkFullAccess(destPath, true)
22
-
23
- // 获取下载链接
24
- const { Url } = await scfService.request('GetFunctionAddress', {
25
- FunctionName: functionName,
26
- Namespace: envId,
27
- CodeSecret: codeSecret
28
- })
29
-
30
- // 下载文件
31
- const res = await fetchStream(Url)
32
- const zipPath = path.join(destPath, `${functionName}.zip`)
33
- const dest = fs.createWriteStream(zipPath)
34
- res.body.pipe(dest)
35
- return new Promise<void>(resolve => {
36
- // 解压文件
37
- dest.on('close', () => {
38
- // 不解压 ZIP 文件
39
- if (!unzip) {
40
- resolve()
41
- return
42
- }
43
-
44
- const unzipStream = unzipper.Extract({
45
- path: destPath
46
- })
47
- fs.createReadStream(zipPath).pipe(unzipStream)
48
- unzipStream.on('close', () => {
49
- // 删除 ZIP 文件
50
- delSync([zipPath])
51
- resolve()
52
- })
53
- })
54
- })
55
- }
1
+ import fs from 'fs'
2
+ import path from 'path'
3
+ import unzipper from 'unzipper'
4
+ import { CloudApiService, fetchStream, delSync, checkFullAccess } from '../utils'
5
+
6
+ interface IFunctionCodeOptions {
7
+ envId: string
8
+ destPath: string
9
+ functionName: string
10
+ codeSecret?: string
11
+ unzip?: boolean
12
+ }
13
+
14
+ const scfService = CloudApiService.getInstance('scf')
15
+
16
+ // 下载函数代码
17
+ export async function downloadFunctionCode(options: IFunctionCodeOptions) {
18
+ const { destPath, envId, functionName, codeSecret, unzip = false } = options
19
+
20
+ // 检验路径是否存在
21
+ checkFullAccess(destPath, true)
22
+
23
+ // 获取下载链接
24
+ const { Url } = await scfService.request('GetFunctionAddress', {
25
+ FunctionName: functionName,
26
+ Namespace: envId,
27
+ CodeSecret: codeSecret
28
+ })
29
+
30
+ // 下载文件
31
+ const res = await fetchStream(Url)
32
+ const zipPath = path.join(destPath, `${functionName}.zip`)
33
+ const dest = fs.createWriteStream(zipPath)
34
+ res.body.pipe(dest)
35
+ return new Promise<void>(resolve => {
36
+ // 解压文件
37
+ dest.on('close', () => {
38
+ // 不解压 ZIP 文件
39
+ if (!unzip) {
40
+ resolve()
41
+ return
42
+ }
43
+
44
+ const unzipStream = unzipper.Extract({
45
+ path: destPath
46
+ })
47
+ fs.createReadStream(zipPath).pipe(unzipStream)
48
+ unzipStream.on('close', () => {
49
+ // 删除 ZIP 文件
50
+ delSync([zipPath])
51
+ resolve()
52
+ })
53
+ })
54
+ })
55
+ }