@cloudbase/cli 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/.editorconfig +9 -9
  2. package/.eslintignore +7 -7
  3. package/.eslintrc +35 -35
  4. package/.prettierrc.js +29 -29
  5. package/.vscode/launch.json +16 -16
  6. package/.vscode/settings.json +3 -0
  7. package/LICENSE +5 -5
  8. package/README.md +35 -35
  9. package/bin/cloudbase.js +5 -5
  10. package/bin/tcb.js +0 -0
  11. package/changelog.md +6 -6
  12. package/jest.config.js +17 -17
  13. package/lib/commands/account/login.js +18 -18
  14. package/lib/commands/storage/storage.js +1 -1
  15. package/lib/env/login.js +7 -7
  16. package/lib/run/service/deployPackage.js +2 -2
  17. package/package.json +2 -2
  18. package/post-install.js +61 -61
  19. package/runtime/nodejs/bootstrap.js +255 -255
  20. package/runtime/nodejs/runtime.js +183 -183
  21. package/src/auth/index.ts +1 -1
  22. package/src/auth/login.ts +91 -91
  23. package/src/auth/logout.ts +7 -7
  24. package/src/commands/account/index.ts +2 -2
  25. package/src/commands/account/login.ts +192 -192
  26. package/src/commands/account/logout.ts +24 -24
  27. package/src/commands/env/base.ts +90 -90
  28. package/src/commands/env/create.ts +92 -92
  29. package/src/commands/env/domain.ts +186 -186
  30. package/src/commands/env/index.ts +4 -4
  31. package/src/commands/env/login.ts +235 -235
  32. package/src/commands/framework/index.ts +124 -124
  33. package/src/commands/functions/alias/getRoute.ts +76 -76
  34. package/src/commands/functions/alias/index.ts +2 -2
  35. package/src/commands/functions/alias/setRoute.ts +82 -82
  36. package/src/commands/functions/code-download.ts +100 -100
  37. package/src/commands/functions/code-update.ts +62 -62
  38. package/src/commands/functions/concurrency/delete.ts +45 -45
  39. package/src/commands/functions/concurrency/index.ts +2 -2
  40. package/src/commands/functions/concurrency/list.ts +58 -58
  41. package/src/commands/functions/concurrency/set.ts +47 -47
  42. package/src/commands/functions/config-update.ts +76 -76
  43. package/src/commands/functions/copy.ts +62 -62
  44. package/src/commands/functions/delete.ts +79 -79
  45. package/src/commands/functions/deploy.ts +293 -293
  46. package/src/commands/functions/detail.ts +138 -138
  47. package/src/commands/functions/index.ts +16 -16
  48. package/src/commands/functions/invoke.ts +121 -121
  49. package/src/commands/functions/layer/bind.ts +182 -182
  50. package/src/commands/functions/layer/common.ts +8 -8
  51. package/src/commands/functions/layer/create.ts +49 -49
  52. package/src/commands/functions/layer/delete.ts +73 -73
  53. package/src/commands/functions/layer/download.ts +92 -92
  54. package/src/commands/functions/layer/index.ts +7 -7
  55. package/src/commands/functions/layer/list.ts +94 -94
  56. package/src/commands/functions/layer/sort.ts +76 -76
  57. package/src/commands/functions/list.ts +68 -68
  58. package/src/commands/functions/log.ts +148 -148
  59. package/src/commands/functions/run.ts +249 -249
  60. package/src/commands/functions/trigger-create.ts +79 -79
  61. package/src/commands/functions/trigger-delete.ts +105 -105
  62. package/src/commands/functions/version/index.ts +1 -1
  63. package/src/commands/functions/version/list.ts +73 -73
  64. package/src/commands/functions/version/publish.ts +43 -43
  65. package/src/commands/gateway/create.ts +109 -109
  66. package/src/commands/gateway/delete.ts +81 -81
  67. package/src/commands/gateway/domain.ts +159 -159
  68. package/src/commands/gateway/index.ts +5 -5
  69. package/src/commands/gateway/list.ts +76 -76
  70. package/src/commands/gateway/switch.ts +107 -107
  71. package/src/commands/helpers/index.ts +2 -2
  72. package/src/commands/helpers/init.ts +431 -431
  73. package/src/commands/helpers/new.ts +117 -117
  74. package/src/commands/helpers/open.ts +67 -67
  75. package/src/commands/hosting/hosting.ts +360 -360
  76. package/src/commands/index.ts +13 -13
  77. package/src/commands/lowcode/app.ts +34 -34
  78. package/src/commands/lowcode/comps.ts +322 -322
  79. package/src/commands/lowcode/index.ts +1 -1
  80. package/src/commands/lowcode/utils.ts +24 -24
  81. package/src/commands/run/image/index.ts +4 -4
  82. package/src/commands/run/standalonegateway/common.ts +7 -7
  83. package/src/commands/run/standalonegateway/create.ts +85 -85
  84. package/src/commands/run/standalonegateway/destroy.ts +59 -59
  85. package/src/commands/run/standalonegateway/index.ts +4 -4
  86. package/src/commands/run/standalonegateway/list.ts +53 -53
  87. package/src/commands/run/standalonegateway/package.ts +62 -62
  88. package/src/commands/run/standalonegateway/turn.ts +63 -63
  89. package/src/commands/run/version/index.ts +4 -4
  90. package/src/commands/smart.ts +132 -132
  91. package/src/commands/storage/storage.ts +464 -464
  92. package/src/commands/third/thirdAttach.ts +49 -49
  93. package/src/completion/index.ts +13 -13
  94. package/src/decorators/captureError.ts +25 -25
  95. package/src/decorators/constants.ts +12 -12
  96. package/src/decorators/deprecate.ts +25 -25
  97. package/src/decorators/guard.ts +42 -42
  98. package/src/decorators/index.ts +7 -7
  99. package/src/decorators/injectParams.ts +54 -54
  100. package/src/decorators/params/common.ts +28 -28
  101. package/src/decorators/params/index.ts +35 -35
  102. package/src/env/domain.ts +33 -33
  103. package/src/env/index.ts +63 -63
  104. package/src/env/login.ts +80 -80
  105. package/src/error.ts +36 -36
  106. package/src/function/alias.ts +43 -43
  107. package/src/function/base.ts +253 -253
  108. package/src/function/code.ts +55 -55
  109. package/src/function/concurrency.ts +57 -57
  110. package/src/function/create.ts +78 -78
  111. package/src/function/delete.ts +42 -42
  112. package/src/function/index.ts +10 -10
  113. package/src/function/layer/attach.ts +68 -68
  114. package/src/function/layer/create.ts +63 -63
  115. package/src/function/layer/delete.ts +21 -21
  116. package/src/function/layer/download.ts +54 -54
  117. package/src/function/layer/index.ts +7 -7
  118. package/src/function/layer/list.ts +32 -32
  119. package/src/function/layer/sort.ts +24 -24
  120. package/src/function/trigger.ts +97 -97
  121. package/src/function/update.ts +35 -35
  122. package/src/function/version.ts +38 -38
  123. package/src/function/vpc.ts +22 -22
  124. package/src/gateway/index.ts +137 -137
  125. package/src/hosting.ts +212 -212
  126. package/src/index.ts +13 -13
  127. package/src/logger.ts +17 -17
  128. package/src/run/create.ts +23 -23
  129. package/src/run/delete.ts +15 -15
  130. package/src/run/image/build.ts +36 -36
  131. package/src/run/image/delete.ts +13 -13
  132. package/src/run/image/index.ts +3 -3
  133. package/src/run/image/info.ts +26 -26
  134. package/src/run/list.ts +29 -29
  135. package/src/run/repo.ts +24 -24
  136. package/src/run/service/deployPackage.ts +1 -1
  137. package/src/run/standalonegateway/create.ts +24 -24
  138. package/src/run/standalonegateway/destroy.ts +19 -19
  139. package/src/run/standalonegateway/index.ts +4 -4
  140. package/src/run/standalonegateway/list.ts +74 -74
  141. package/src/run/standalonegateway/package/list.ts +24 -24
  142. package/src/run/standalonegateway/turn/index.ts +1 -1
  143. package/src/run/standalonegateway/turn/off.ts +19 -19
  144. package/src/run/standalonegateway/turn/on.ts +19 -19
  145. package/src/run/version/create.ts +68 -68
  146. package/src/run/version/delete.ts +15 -15
  147. package/src/run/version/index.ts +5 -5
  148. package/src/run/version/list.ts +16 -16
  149. package/src/run/version/modify.ts +16 -16
  150. package/src/run/version/repo.ts +27 -27
  151. package/src/run/version/update.ts +58 -58
  152. package/src/storage.ts +114 -114
  153. package/src/third/index.ts +12 -12
  154. package/src/utils/auth.ts +15 -15
  155. package/src/utils/cli-table.ts +23 -23
  156. package/src/utils/config.ts +39 -39
  157. package/src/utils/env.ts +244 -244
  158. package/src/utils/fs/del.ts +5 -5
  159. package/src/utils/fs/index.ts +71 -71
  160. package/src/utils/function-packer.ts +97 -97
  161. package/src/utils/log.ts +81 -81
  162. package/src/utils/net/cloud-api-request.ts +62 -62
  163. package/src/utils/net/credential.ts +53 -53
  164. package/src/utils/net/index.ts +4 -4
  165. package/src/utils/net/manager-service.ts +36 -36
  166. package/src/utils/net/proxy.ts +6 -6
  167. package/src/utils/notice.ts +28 -28
  168. package/src/utils/output/highlight.ts +5 -5
  169. package/src/utils/output/index.ts +2 -2
  170. package/src/utils/output/link.ts +10 -10
  171. package/src/utils/output/loading.ts +82 -82
  172. package/src/utils/parallel.ts +82 -82
  173. package/src/utils/platform/index.ts +2 -2
  174. package/src/utils/platform/mac.ts +21 -21
  175. package/src/utils/platform/os.ts +64 -64
  176. package/src/utils/platform/port.ts +10 -10
  177. package/src/utils/progress-bar.ts +38 -38
  178. package/src/utils/prompt/select.ts +59 -59
  179. package/src/utils/reporter/agree.ts +20 -20
  180. package/src/utils/reporter/download.ts +26 -26
  181. package/src/utils/reporter/index.ts +3 -3
  182. package/src/utils/reporter/usage.ts +20 -20
  183. package/src/utils/store/auth.ts +49 -49
  184. package/src/utils/store/common.ts +8 -8
  185. package/src/utils/store/db.ts +68 -68
  186. package/src/utils/store/index.ts +4 -4
  187. package/src/utils/store/usage.ts +12 -12
  188. package/src/utils/template.ts +170 -170
  189. package/src/utils/tools/encoding.ts +8 -8
  190. package/src/utils/tools/index.ts +4 -4
  191. package/src/utils/tools/object.ts +33 -33
  192. package/src/utils/tools/time.ts +38 -38
  193. package/src/utils/tools/uid.ts +19 -19
  194. package/templates/html/loginFail.html +90 -90
  195. package/templates/html/loginSuccess.html +86 -86
  196. package/templates/server/node/_gitignore +54 -54
  197. package/templates/server/node/cloudbaserc.json +10 -10
  198. package/templates/server/node/index.js +5 -5
  199. package/templates/server/node/package.json +9 -9
  200. package/tsconfig.json +19 -19
  201. package/tsconfig.test.json +13 -13
@@ -1,53 +1,53 @@
1
- import _ from 'lodash'
2
- import { checkAndGetCredential as _getCredentail } from '@cloudbase/toolbox'
3
- import { CloudBaseError } from '../../error'
4
- import { REQUEST_TIMEOUT } from '../../constant'
5
- import { Credential, AuthSecret } from '../../types'
6
-
7
- import { md5 } from '../tools'
8
- import { getMacAddress } from '../platform'
9
- import { getProxy } from './proxy'
10
- import { fetch } from './http-request'
11
-
12
-
13
- const refreshTokenUrl = 'https://iaas.cloud.tencent.com/tcb_refresh'
14
-
15
- // 临时密钥过期后,进行续期
16
- export async function refreshTmpToken(
17
- metaData: Credential & { isLogout?: boolean }
18
- ): Promise<Credential> {
19
- const mac = await getMacAddress()
20
- const hash = md5(mac)
21
- metaData.hash = hash
22
-
23
- const res = await fetch(refreshTokenUrl, {
24
- method: 'POST',
25
- body: JSON.stringify(metaData),
26
- headers: { 'Content-Type': 'application/json' }
27
- })
28
-
29
- if (res.code !== 0) {
30
- throw new CloudBaseError(res.message, {
31
- code: res.code
32
- })
33
- }
34
-
35
- const { data: credential } = res
36
- return credential
37
- }
38
-
39
- export async function checkAndGetCredential(throwError = false): Promise<AuthSecret> {
40
- const credential = await _getCredentail({
41
- proxy: getProxy(),
42
- timeout: REQUEST_TIMEOUT
43
- })
44
-
45
- if (!credential || _.isEmpty(credential)) {
46
- if (throwError) {
47
- throw new CloudBaseError('无有效身份信息,请使用 cloudbase login 登录')
48
- }
49
- return null
50
- }
51
-
52
- return credential
53
- }
1
+ import _ from 'lodash'
2
+ import { checkAndGetCredential as _getCredentail } from '@cloudbase/toolbox'
3
+ import { CloudBaseError } from '../../error'
4
+ import { REQUEST_TIMEOUT } from '../../constant'
5
+ import { Credential, AuthSecret } from '../../types'
6
+
7
+ import { md5 } from '../tools'
8
+ import { getMacAddress } from '../platform'
9
+ import { getProxy } from './proxy'
10
+ import { fetch } from './http-request'
11
+
12
+
13
+ const refreshTokenUrl = 'https://iaas.cloud.tencent.com/tcb_refresh'
14
+
15
+ // 临时密钥过期后,进行续期
16
+ export async function refreshTmpToken(
17
+ metaData: Credential & { isLogout?: boolean }
18
+ ): Promise<Credential> {
19
+ const mac = await getMacAddress()
20
+ const hash = md5(mac)
21
+ metaData.hash = hash
22
+
23
+ const res = await fetch(refreshTokenUrl, {
24
+ method: 'POST',
25
+ body: JSON.stringify(metaData),
26
+ headers: { 'Content-Type': 'application/json' }
27
+ })
28
+
29
+ if (res.code !== 0) {
30
+ throw new CloudBaseError(res.message, {
31
+ code: res.code
32
+ })
33
+ }
34
+
35
+ const { data: credential } = res
36
+ return credential
37
+ }
38
+
39
+ export async function checkAndGetCredential(throwError = false): Promise<AuthSecret> {
40
+ const credential = await _getCredentail({
41
+ proxy: getProxy(),
42
+ timeout: REQUEST_TIMEOUT
43
+ })
44
+
45
+ if (!credential || _.isEmpty(credential)) {
46
+ if (throwError) {
47
+ throw new CloudBaseError('无有效身份信息,请使用 cloudbase login 登录')
48
+ }
49
+ return null
50
+ }
51
+
52
+ return credential
53
+ }
@@ -1,5 +1,5 @@
1
- export * from './proxy'
2
- export * from './credential'
3
- export * from './http-request'
4
- export * from './manager-service'
1
+ export * from './proxy'
2
+ export * from './credential'
3
+ export * from './http-request'
4
+ export * from './manager-service'
5
5
  export * from './cloud-api-request'
@@ -1,36 +1,36 @@
1
- import CloudBase from '@cloudbase/manager-node'
2
- import { StorageService } from '@cloudbase/manager-node/types/storage'
3
- import { getRegion } from '@cloudbase/toolbox'
4
- import { checkAndGetCredential } from './credential'
5
- import { getProxy } from './proxy'
6
-
7
- export async function getMangerService(envId = ''): Promise<CloudBase> {
8
- const { secretId, secretKey, token } = await checkAndGetCredential(true)
9
- const region = await getRegion()
10
-
11
- const app = new CloudBase({
12
- token,
13
- envId,
14
- region,
15
- secretId,
16
- secretKey,
17
- proxy: getProxy()
18
- })
19
-
20
- return app
21
- }
22
-
23
- export async function getStorageService(envId: string): Promise<StorageService> {
24
- const { secretId, secretKey, token } = await checkAndGetCredential(true)
25
- const region = await getRegion()
26
-
27
- const app = new CloudBase({
28
- token,
29
- envId,
30
- secretId,
31
- region,
32
- secretKey,
33
- proxy: getProxy()
34
- })
35
- return app.storage
36
- }
1
+ import CloudBase from '@cloudbase/manager-node'
2
+ import { StorageService } from '@cloudbase/manager-node/types/storage'
3
+ import { getRegion } from '@cloudbase/toolbox'
4
+ import { checkAndGetCredential } from './credential'
5
+ import { getProxy } from './proxy'
6
+
7
+ export async function getMangerService(envId = ''): Promise<CloudBase> {
8
+ const { secretId, secretKey, token } = await checkAndGetCredential(true)
9
+ const region = await getRegion()
10
+
11
+ const app = new CloudBase({
12
+ token,
13
+ envId,
14
+ region,
15
+ secretId,
16
+ secretKey,
17
+ proxy: getProxy()
18
+ })
19
+
20
+ return app
21
+ }
22
+
23
+ export async function getStorageService(envId: string): Promise<StorageService> {
24
+ const { secretId, secretKey, token } = await checkAndGetCredential(true)
25
+ const region = await getRegion()
26
+
27
+ const app = new CloudBase({
28
+ token,
29
+ envId,
30
+ secretId,
31
+ region,
32
+ secretKey,
33
+ proxy: getProxy()
34
+ })
35
+ return app.storage
36
+ }
@@ -1,6 +1,6 @@
1
- // 解析 Proxy 配置
2
- export function getProxy(): string {
3
- const httpProxy = process.env.http_proxy || process.env.HTTP_PROXY
4
- const isTestMode = process.env.TCB_TEST_MODE
5
- return isTestMode ? process.env.TCB_TEST_PROXY || httpProxy : httpProxy
6
- }
1
+ // 解析 Proxy 配置
2
+ export function getProxy(): string {
3
+ const httpProxy = process.env.http_proxy || process.env.HTTP_PROXY
4
+ const isTestMode = process.env.TCB_TEST_MODE
5
+ return isTestMode ? process.env.TCB_TEST_PROXY || httpProxy : httpProxy
6
+ }
@@ -1,28 +1,28 @@
1
- import { postFetch } from './net'
2
- import { commonStore } from './store'
3
-
4
- const url = 'https://tcli.service.tcloudbase.com/notify'
5
-
6
- // 获取通知,最多每天获取一次
7
- const ONE_DAY = 86400000
8
-
9
- export async function getNotification() {
10
- // 不再获取通知
11
- return null
12
- const now = Date.now()
13
- // 上次记录的时间
14
- const lastTime = await commonStore.get('lastNotifyTime')
15
- const diff = now - Number(lastTime)
16
- const day = new Date(lastTime).getDay()
17
- const today = new Date().getDay()
18
- // 日期不同,且时差小于 1 天
19
- if (day === today && diff < ONE_DAY) return null
20
- const lastUid = await commonStore.get('lastNotificationUid')
21
- const data = await postFetch(url)
22
- const uid = data?.uid || 0
23
- // 消息已读
24
- if (Number(lastUid) >= Number(uid)) return
25
- await commonStore.set('readNotificationUid', data.uid)
26
- await commonStore.set('lastNotifyTime', Date.now())
27
- return data
28
- }
1
+ import { postFetch } from './net'
2
+ import { commonStore } from './store'
3
+
4
+ const url = 'https://tcli.service.tcloudbase.com/notify'
5
+
6
+ // 获取通知,最多每天获取一次
7
+ const ONE_DAY = 86400000
8
+
9
+ export async function getNotification() {
10
+ // 不再获取通知
11
+ return null
12
+ const now = Date.now()
13
+ // 上次记录的时间
14
+ const lastTime = await commonStore.get('lastNotifyTime')
15
+ const diff = now - Number(lastTime)
16
+ const day = new Date(lastTime).getDay()
17
+ const today = new Date().getDay()
18
+ // 日期不同,且时差小于 1 天
19
+ if (day === today && diff < ONE_DAY) return null
20
+ const lastUid = await commonStore.get('lastNotificationUid')
21
+ const data = await postFetch(url)
22
+ const uid = data?.uid || 0
23
+ // 消息已读
24
+ if (Number(lastUid) >= Number(uid)) return
25
+ await commonStore.set('readNotificationUid', data.uid)
26
+ await commonStore.set('lastNotifyTime', Date.now())
27
+ return data
28
+ }
@@ -1,5 +1,5 @@
1
- import chalk from 'chalk'
2
-
3
- export function highlightCommand(command: string) {
4
- return chalk.bold.cyan(command)
5
- }
1
+ import chalk from 'chalk'
2
+
3
+ export function highlightCommand(command: string) {
4
+ return chalk.bold.cyan(command)
5
+ }
@@ -1,3 +1,3 @@
1
- export * from './loading'
2
- export * from './link'
1
+ export * from './loading'
2
+ export * from './link'
3
3
  export * from './highlight'
@@ -1,10 +1,10 @@
1
- import chalk from 'chalk'
2
- import terminalLink from 'terminal-link'
3
-
4
- export function genClickableLink(link: string) {
5
- if (terminalLink.isSupported) {
6
- const clickablelink = terminalLink(link, link)
7
- return chalk.bold.cyan(clickablelink)
8
- }
9
- return chalk.bold.underline.cyan(link)
10
- }
1
+ import chalk from 'chalk'
2
+ import terminalLink from 'terminal-link'
3
+
4
+ export function genClickableLink(link: string) {
5
+ if (terminalLink.isSupported) {
6
+ const clickablelink = terminalLink(link, link)
7
+ return chalk.bold.cyan(clickablelink)
8
+ }
9
+ return chalk.bold.underline.cyan(link)
10
+ }
@@ -1,82 +1,82 @@
1
- import ora from 'ora'
2
-
3
- class Loading {
4
- private spinner: ReturnType<typeof ora>
5
-
6
- constructor() {
7
- // @ts-ignore
8
- process.on('tcbExit', this.stop.bind(this))
9
- // @ts-ignore
10
- process.on('tcbError', this.stop.bind(this))
11
- this.spinner = ora({
12
- discardStdin: false
13
- })
14
- }
15
-
16
- // eslint-disable-next-line
17
- set text(text: string) {
18
- this.spinner.text = text
19
- }
20
-
21
- start(text: string) {
22
- this.spinner = this.spinner.start(text)
23
- }
24
-
25
- stop() {
26
- if (this.spinner) {
27
- this.spinner = this.spinner.stop()
28
- }
29
- }
30
-
31
- succeed(text: string) {
32
- if (this.spinner) {
33
- this.spinner = this.spinner.succeed(text)
34
- }
35
- }
36
-
37
- fail(text: string) {
38
- if (this.spinner) {
39
- this.spinner = this.spinner.fail(text)
40
- }
41
- }
42
- }
43
-
44
- export const loadingFactory = (): Loading => {
45
- return new Loading()
46
- }
47
-
48
- type Task<T> = (flush: (text: string) => void, ...args: any[]) => Promise<T>
49
-
50
- export interface ILoadingOptions {
51
- startTip?: string
52
- successTip?: string
53
- failTip?: string
54
- }
55
-
56
- /**
57
- * 执行异步任务,显示 loading 动画
58
- * @param task
59
- * @param options
60
- */
61
- export const execWithLoading = async <T>(
62
- task: Task<T>,
63
- options: ILoadingOptions = {}
64
- ): Promise<T> => {
65
- const { startTip, successTip, failTip } = options
66
- const loading = loadingFactory()
67
-
68
- // 刷新 loading 提示
69
- const flush = (text: string) => {
70
- loading.text = text
71
- }
72
-
73
- try {
74
- loading.start(startTip)
75
- const res = await task(flush)
76
- successTip ? loading.succeed(successTip) : loading.stop()
77
- return res
78
- } catch (e) {
79
- failTip ? loading.fail(failTip) : loading.stop()
80
- throw e
81
- }
82
- }
1
+ import ora from 'ora'
2
+
3
+ class Loading {
4
+ private spinner: ReturnType<typeof ora>
5
+
6
+ constructor() {
7
+ // @ts-ignore
8
+ process.on('tcbExit', this.stop.bind(this))
9
+ // @ts-ignore
10
+ process.on('tcbError', this.stop.bind(this))
11
+ this.spinner = ora({
12
+ discardStdin: false
13
+ })
14
+ }
15
+
16
+ // eslint-disable-next-line
17
+ set text(text: string) {
18
+ this.spinner.text = text
19
+ }
20
+
21
+ start(text: string) {
22
+ this.spinner = this.spinner.start(text)
23
+ }
24
+
25
+ stop() {
26
+ if (this.spinner) {
27
+ this.spinner = this.spinner.stop()
28
+ }
29
+ }
30
+
31
+ succeed(text: string) {
32
+ if (this.spinner) {
33
+ this.spinner = this.spinner.succeed(text)
34
+ }
35
+ }
36
+
37
+ fail(text: string) {
38
+ if (this.spinner) {
39
+ this.spinner = this.spinner.fail(text)
40
+ }
41
+ }
42
+ }
43
+
44
+ export const loadingFactory = (): Loading => {
45
+ return new Loading()
46
+ }
47
+
48
+ type Task<T> = (flush: (text: string) => void, ...args: any[]) => Promise<T>
49
+
50
+ export interface ILoadingOptions {
51
+ startTip?: string
52
+ successTip?: string
53
+ failTip?: string
54
+ }
55
+
56
+ /**
57
+ * 执行异步任务,显示 loading 动画
58
+ * @param task
59
+ * @param options
60
+ */
61
+ export const execWithLoading = async <T>(
62
+ task: Task<T>,
63
+ options: ILoadingOptions = {}
64
+ ): Promise<T> => {
65
+ const { startTip, successTip, failTip } = options
66
+ const loading = loadingFactory()
67
+
68
+ // 刷新 loading 提示
69
+ const flush = (text: string) => {
70
+ loading.text = text
71
+ }
72
+
73
+ try {
74
+ loading.start(startTip)
75
+ const res = await task(flush)
76
+ successTip ? loading.succeed(successTip) : loading.stop()
77
+ return res
78
+ } catch (e) {
79
+ failTip ? loading.fail(failTip) : loading.stop()
80
+ throw e
81
+ }
82
+ }
@@ -1,82 +1,82 @@
1
- export type AsyncTask = () => Promise<any>
2
-
3
- /**
4
- * 异步任务并发控制器,以一定的并发数执行所有任务
5
- * 不具备队列性质,异步任务随机执行
6
- * 单个任务异常,错误会返回,单不会退出执行
7
- * 所有任务执行
8
- */
9
- export class AsyncTaskParallelController {
10
- // 任务最大并发数
11
- maxParallel: number
12
- // 异步任务队列
13
- tasks: AsyncTask[]
14
- // 检查间隔时间,单位 ms
15
- checkInterval: number
16
- // 所有任务数量
17
- totalTasks: number
18
-
19
- constructor(maxParallel: number, checkInterval = 20) {
20
- this.tasks = []
21
- this.maxParallel = Number(maxParallel) || 20
22
- this.checkInterval = checkInterval
23
- }
24
-
25
- loadTasks(tasks: AsyncTask[]) {
26
- this.tasks.push(...tasks)
27
- this.totalTasks = this.tasks.length
28
- }
29
-
30
- push(task: AsyncTask) {
31
- this.tasks.push(task)
32
- this.totalTasks = this.tasks.length
33
- }
34
-
35
- // 开始执行任务
36
- async run(): Promise<any[]> {
37
- // 存储任务执行结果
38
- const results = []
39
- // 记录已经运行的任务
40
- const taskHasRun = []
41
- // 记录任务是否执行完成
42
- const taskDone = []
43
- // 当前正在运行的任务数量
44
- let runningTask = 0
45
-
46
- return new Promise((resolve) => {
47
- // 使用定时器,不阻塞线程
48
- const timer = setInterval(() => {
49
- // 全部任务运行完成
50
- const taskDoneLength = taskDone.filter((item) => item).length
51
- if (runningTask === 0 && taskDoneLength === this.totalTasks) {
52
- clearInterval(timer)
53
- resolve(results)
54
- }
55
-
56
- // 当前运行任务数超过最大并发,不再执行新的任务
57
- if (runningTask >= this.maxParallel) {
58
- return
59
- }
60
-
61
- // 遍历任务列表,开始执行还没有执行的任务
62
- this.tasks.forEach((task, index) => {
63
- if (!taskHasRun[index] && runningTask < this.maxParallel) {
64
- runningTask++
65
- taskHasRun[index] = 1
66
- task()
67
- .then((res) => {
68
- results[index] = res
69
- })
70
- .catch((err) => {
71
- results[index] = err
72
- })
73
- .then(() => {
74
- runningTask--
75
- taskDone[index] = 1
76
- })
77
- }
78
- })
79
- }, this.checkInterval)
80
- })
81
- }
82
- }
1
+ export type AsyncTask = () => Promise<any>
2
+
3
+ /**
4
+ * 异步任务并发控制器,以一定的并发数执行所有任务
5
+ * 不具备队列性质,异步任务随机执行
6
+ * 单个任务异常,错误会返回,单不会退出执行
7
+ * 所有任务执行
8
+ */
9
+ export class AsyncTaskParallelController {
10
+ // 任务最大并发数
11
+ maxParallel: number
12
+ // 异步任务队列
13
+ tasks: AsyncTask[]
14
+ // 检查间隔时间,单位 ms
15
+ checkInterval: number
16
+ // 所有任务数量
17
+ totalTasks: number
18
+
19
+ constructor(maxParallel: number, checkInterval = 20) {
20
+ this.tasks = []
21
+ this.maxParallel = Number(maxParallel) || 20
22
+ this.checkInterval = checkInterval
23
+ }
24
+
25
+ loadTasks(tasks: AsyncTask[]) {
26
+ this.tasks.push(...tasks)
27
+ this.totalTasks = this.tasks.length
28
+ }
29
+
30
+ push(task: AsyncTask) {
31
+ this.tasks.push(task)
32
+ this.totalTasks = this.tasks.length
33
+ }
34
+
35
+ // 开始执行任务
36
+ async run(): Promise<any[]> {
37
+ // 存储任务执行结果
38
+ const results = []
39
+ // 记录已经运行的任务
40
+ const taskHasRun = []
41
+ // 记录任务是否执行完成
42
+ const taskDone = []
43
+ // 当前正在运行的任务数量
44
+ let runningTask = 0
45
+
46
+ return new Promise((resolve) => {
47
+ // 使用定时器,不阻塞线程
48
+ const timer = setInterval(() => {
49
+ // 全部任务运行完成
50
+ const taskDoneLength = taskDone.filter((item) => item).length
51
+ if (runningTask === 0 && taskDoneLength === this.totalTasks) {
52
+ clearInterval(timer)
53
+ resolve(results)
54
+ }
55
+
56
+ // 当前运行任务数超过最大并发,不再执行新的任务
57
+ if (runningTask >= this.maxParallel) {
58
+ return
59
+ }
60
+
61
+ // 遍历任务列表,开始执行还没有执行的任务
62
+ this.tasks.forEach((task, index) => {
63
+ if (!taskHasRun[index] && runningTask < this.maxParallel) {
64
+ runningTask++
65
+ taskHasRun[index] = 1
66
+ task()
67
+ .then((res) => {
68
+ results[index] = res
69
+ })
70
+ .catch((err) => {
71
+ results[index] = err
72
+ })
73
+ .then(() => {
74
+ runningTask--
75
+ taskDone[index] = 1
76
+ })
77
+ }
78
+ })
79
+ }, this.checkInterval)
80
+ })
81
+ }
82
+ }
@@ -1,3 +1,3 @@
1
- export * from './os'
2
- export * from './mac'
1
+ export * from './os'
2
+ export * from './mac'
3
3
  export * from './port'