@cloudbase/manager-node 5.8.8-beta.0 → 5.8.9-beta.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.
@@ -0,0 +1,316 @@
1
+ stages:
2
+ - stage: 安装依赖
3
+ tasks:
4
+ - task: 安装依赖
5
+ cmds:
6
+ - plugin: cmds
7
+ params:
8
+ cmds:
9
+ - 'bash -lc ''
10
+
11
+ set -e
12
+
13
+ export NVM_DIR="$HOME/.nvm"
14
+
15
+ [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
16
+
17
+ nvm install 22.14.0
18
+
19
+ nvm use 22.14.0
20
+
21
+ node -v
22
+
23
+ npm -v
24
+
25
+ npm install
26
+
27
+ '''
28
+ - stage: 创建发布分支
29
+ tasks:
30
+ - task: 创建发布分支
31
+ cmds:
32
+ - plugin: cmds
33
+ params:
34
+ cmds:
35
+ - set -e
36
+ - echo "🌿 基于 ${QCI_REPO_BRANCH} 创建发布分支 release/${MANAGER_NODE_VERSION}"
37
+ - git config --global user.email "cloudbase-ci-bot@tencent.com"
38
+ - git config --global user.name "cloudbase-ci-bot"
39
+ - git fetch origin ${QCI_REPO_BRANCH}
40
+ - git checkout -B release/${MANAGER_NODE_VERSION} origin/${QCI_REPO_BRANCH}
41
+ - git push origin release/${MANAGER_NODE_VERSION} --force
42
+ - echo "✅ 发布分支 release/${MANAGER_NODE_VERSION} 已创建并推送"
43
+ - stage: 更新版本号
44
+ tasks:
45
+ - task: 更新版本号
46
+ cmds:
47
+ - plugin: cmds
48
+ params:
49
+ cmds:
50
+ - "bash -lc ' \nset -e \nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\"\
51
+ \ ] && . \"$NVM_DIR/nvm.sh\"\nnvm use 22.14.0\necho \"\U0001F4DD 更新 package.json\
52
+ \ version -> ${MANAGER_NODE_VERSION}\"\n# 配置 git \ngit config --global user.email\
53
+ \ \"cloudbase-ci-bot@tencent.com\"\ngit config --global user.name \"cloudbase-ci-bot\"\
54
+ \n# 切换到 release 分支 \ngit fetch origin release/${MANAGER_NODE_VERSION} \n\
55
+ git checkout release/${MANAGER_NODE_VERSION}\n# 更新版本号 \nnpm version ${MANAGER_NODE_VERSION}\
56
+ \ --no-git-tag-version --allow-same-version\n# 提交版本号变更 \ngit add package.json\
57
+ \ \ngit commit -m \"chore(release): bump version to ${MANAGER_NODE_VERSION}\"\
58
+ \ || echo \"版本号无变更\" \ngit push origin release/${MANAGER_NODE_VERSION} \n\
59
+ '"
60
+ - stage: Lint 检查
61
+ tasks:
62
+ - task: Lint 检查
63
+ cmds:
64
+ - plugin: cmds
65
+ params:
66
+ cmds:
67
+ - npm run lint
68
+ - stage: 构建
69
+ tasks:
70
+ - task: 构建
71
+ cmds:
72
+ - plugin: cmds
73
+ params:
74
+ cmds:
75
+ - npm run build
76
+ - stage: 产物检查
77
+ tasks:
78
+ - task: 产物检查
79
+ cmds:
80
+ - plugin: cmds
81
+ params:
82
+ cmds:
83
+ - '# 脚本内容默认是单行命令执行。'
84
+ - ' # 如需增加多行命令,请在开始和结束用"--"标识,例如:'
85
+ - ' # --'
86
+ - ' # if !(command -v unzip)'
87
+ - ' # then'
88
+ - ' # yum install -y unzip'
89
+ - ' # fi'
90
+ - ' # --'
91
+ - ' # sh hello.sh'
92
+ - '# 检查构建产物是否存在'
93
+ - "if [ ! -f \"lib/index.js\" ]; then\n echo \"❌ 构建产物 lib/index.js 不存在\"\n\
94
+ \ exit 1\nfi"
95
+ - "if [ ! -f \"types/index.d.ts\" ]; then\n echo \"❌ 类型声明文件 types/index.d.ts\
96
+ \ 不存在\"\n exit 1\nfi"
97
+ - '# 输出当前版本号供后续阶段使用'
98
+ - 'echo "当前发布版本: $(node -p "require(''./package.json'').version")"'
99
+ artifacts:
100
+ - ./lib/**
101
+ - prompt:
102
+ - msg: 人工审批
103
+ detail: '欢迎使用发布流水线,请确认以下信息:
104
+
105
+ 构建触发人: $QCI_TRIGGER
106
+
107
+ 分支: $QCI_REPO_BRANCH
108
+
109
+ 提交时间:${QCI_COMMIT_DATE}
110
+
111
+ 开发人员:${QCI_COMMIT_AUTHOR}
112
+
113
+ 提交信息:${QCI_COMMIT_MESSAGE}
114
+
115
+ 发布版本:${MANAGER_NODE_VERSION}
116
+
117
+ 请确认版本号和变更内容,审批通过后将会自动发布到 npmjs.com'
118
+ timeout_status: 6
119
+ env: {}
120
+ to: nenneyu;lucyqzhang;royhyang
121
+ if: $RELEASE_TYPE = latest
122
+ - stage: npm 发布
123
+ tasks:
124
+ - task: npm 发布
125
+ cmds:
126
+ - plugin: cmds
127
+ params:
128
+ cmds:
129
+ - '# 设置 npm registry'
130
+ - npm config set registry https://registry.npmjs.org
131
+ - '# 使用凭据注入的 NPM_TOKEN 进行认证'
132
+ - echo "//registry.npmjs.org/:_authToken=${YARN_NPM_AUTH_TOKEN}" > ~/.npmrc
133
+ - npm whoami
134
+ - cat ~/.npmrc
135
+ - npm publish --access public --tag ${RELEASE_TYPE}
136
+ - stage: 生成并同步 changelog(docs)
137
+ tasks:
138
+ - task: 生成并同步 changelog
139
+ cmds:
140
+ - plugin: ci_changelog
141
+ version: 0.12.0
142
+ params:
143
+ to_ref: HEAD
144
+ tag_pattern: ^v(\d+\.\d+\.\d+(?:-[\w.]+)?)$
145
+ enable_ai_summarize: true
146
+ ai_model: hy3
147
+ bilingual: true
148
+ enable_docs_sync: true
149
+ docs_base_branch: master
150
+ docs_branch_prefix: docs/manager-node-changelog-v
151
+ commit_message: 'docs(manager-node): sync changelog for v${version}'
152
+ force_push: true
153
+ output_zh_path: $QCI_WORKSPACE/changelog_content.md
154
+ output_en_path: $QCI_WORKSPACE/changelog_content_en.md
155
+ enable_repo_changelog: false
156
+ repo_base_branch: master
157
+ repo_branch_prefix: changelog/v
158
+ repo_changelog_path: CHANGELOG.md
159
+ repo_commit_message: 'docs: update CHANGELOG.md for v${version}'
160
+ repo_force_push: true
161
+ main_package_path: package.json
162
+ ai_api_url: ${AI_API_URL}
163
+ ai_api_key: ${AI_API_KEY}
164
+ docs_repo: https://git.woa.com/QBase/cloudbase-docs.git
165
+ zh_path: docs/api-reference/manager/node/changelog.md
166
+ en_path: i18n/en/docusaurus-plugin-content-docs/current/api-reference/manager/node/changelog.md
167
+ repo_repo: https://git.woa.com/QBase/server-side-sdk/cloudbase-manager-node.git
168
+ - stage: 生成changelog并打tag
169
+ tasks:
170
+ - task: 生成changelog并打tag
171
+ cmds:
172
+ - plugin: cmds
173
+ params:
174
+ cmds:
175
+ - "bash -lc '\nset -e\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\"\
176
+ \ ] && . \"$NVM_DIR/nvm.sh\"\nnvm use 22.14.0\necho \"==========================================\"\
177
+ \necho \"\U0001F4E6 写回插件生成的 changelog 并打 tag v${MANAGER_NODE_VERSION}\"\
178
+ \necho \"==========================================\"\n# 配置 git\ngit config --global\
179
+ \ user.email \"cloudbase-ci-bot@tencent.com\"\ngit config --global user.name\
180
+ \ \"cloudbase-ci-bot\"\n# 切换到 release 分支\ngit fetch origin release/${MANAGER_NODE_VERSION}\n\
181
+ git checkout release/${MANAGER_NODE_VERSION}\n# 1. 写回插件生成的 changelog(仅 latest\
182
+ \ 版本)\necho \"\"\necho \"\U0001F4DD Step 1: 写回插件产物到 CHANGELOG.md\"\nif [ \"$RELEASE_TYPE\"\
183
+ \ = \"latest\" ]; then\n if [ ! -f \"${QCI_WORKSPACE}/changelog_content.md\"\
184
+ \ ]; then\n echo \"❌ 插件产物 ${QCI_WORKSPACE}/changelog_content.md 不存在\"\
185
+ \n exit 1\n fi\n cat \"${QCI_WORKSPACE}/changelog_content.md\"\
186
+ \ CHANGELOG.md > CHANGELOG.md.new\n mv CHANGELOG.md.new CHANGELOG.md\n\
187
+ \ # 2. 提交 changelog\n echo \"\"\n echo \"\U0001F4DD Step 2: 提交变更\"\
188
+ \n git add CHANGELOG.md\n git commit -m \"docs(release): changelog\
189
+ \ for v${MANAGER_NODE_VERSION}\" || echo \"没有需要提交的变更\"\nelse\n echo\
190
+ \ \"⏭️ RELEASE_TYPE !== latest,跳过 CHANGELOG.md 写回\"\nfi\n# 3. 打 tag\necho\
191
+ \ \"\"\necho \"\U0001F3F7️ Step 3: 创建 tag v${MANAGER_NODE_VERSION}\"\
192
+ \ngit tag -a \"v${MANAGER_NODE_VERSION}\" -m \"Release v${MANAGER_NODE_VERSION}\"\
193
+ \n# 4. 推送分支和 tag\necho \"\"\necho \"\U0001F680 Step 4: 推送到远程\"\ngit push\
194
+ \ origin release/${MANAGER_NODE_VERSION}\ngit push origin \"v${MANAGER_NODE_VERSION}\"\
195
+ \necho \"\"\necho \"✅ 完成!\"\necho \" - changelog.md: 已更新\"\necho \" \
196
+ \ - tag: v${MANAGER_NODE_VERSION}\"\n'"
197
+ label: 命令行脚本
198
+ - stage: 创建合并请求
199
+ tasks:
200
+ - task: 创建合并请求
201
+ cmds:
202
+ - plugin: cmds
203
+ params:
204
+ cmds:
205
+ - 'if [[ ${RELEASE_TYPE} = "latest" ]]; then
206
+
207
+ echo "🔀 合并 release/${MANAGER_NODE_VERSION} 到 master"
208
+
209
+ # 配置 git(CI 机器人身份,使用 CI 内置 git 凭据)
210
+
211
+ git config --global user.email "cloudbase-ci-bot@tencent.com"
212
+
213
+ git config --global user.name "cloudbase-ci-bot"
214
+
215
+ # 拉取最新 master 和 release 分支
216
+
217
+ git fetch origin master
218
+
219
+ git fetch origin release/${MANAGER_NODE_VERSION}
220
+
221
+ # 切到 master 并合并 release 分支
222
+
223
+ git checkout master
224
+
225
+ git merge --no-ff origin/release/${MANAGER_NODE_VERSION} -m "chore(release):
226
+ v${MANAGER_NODE_VERSION}"
227
+
228
+ # 直接推送到 master(不走 MR)
229
+
230
+ git push origin master
231
+
232
+ echo "✅ 已合并并推送到 master"
233
+
234
+ fi'
235
+ if: $RELEASE_TYPE = latest
236
+ - stage: 企微群通知
237
+ tasks:
238
+ - task: 企微群通知
239
+ cmds:
240
+ - plugin: message_wework_group
241
+ params:
242
+ c_type: text
243
+ env_variable: _WEWORK_GROUP_ID
244
+ mentioned: lucyqzhang;nenneyu
245
+ content_path: ${QCI_WORKSPACE}/changelog_content.md
246
+ group_id: ww150005365489083
247
+ if: $RELEASE_TYPE = latest
248
+ version: '2.0'
249
+ worker:
250
+ label: JOB_MATRIX_DEVCLOUD
251
+ language: node_js-20.18.0
252
+ tools:
253
+ - envs: []
254
+ name: ''
255
+ version: ''
256
+ is_auto_interrupt: true
257
+ env:
258
+ AI_API_KEY:
259
+ type: string
260
+ secret: vur44V/GjXswyJwv3aHGdaDKqwJRyWz+gTxPKzwIX57Q74Fhm3GML5a9yiFzkd/VsqTGvgPcRWM8995Erfj8je3c1ScSb8hTjAU89NF6pOHoPVFr5qyIsOYk35e6wS4jUXZ3Er3o/UWzWzcb28UBzHFz5X/MQtYrGKsmv4/ahaUjf1gI7tiFqJcjQPe7KLq0wbuUjiFUiBteTe+hrMiNpzBNbmyw/34TWIWr6MhLFRNqrn0gp8Dbch0T8jqf2RAl6bM42OGsUXSf42/aSHLeCL6r4FAAW2nV8QrtN4il976WzGego+pKMziofQVCq6Ol46t4tVsal074k3a47R/IgC0XYsTCdIevrAdcNyK/jhwhcaw2EOCmVBC0KZ2s3fUhzRe1IDUKEVxkRykdn5Zb2dRysI3rU+HqjGDBkbKNAD0iDLH8aoafVFi1Sl+9TxnhbG2p/gzcrDLwNR4jEarWA8Na7himZS2S7uVNuS28W1gYxkjmgnm5AqxXcB0K+SUDcRyLACzmTNLZmac4lh5z69hJk1t2mzTzXvfXGxCMuF8XXNRlQLCNs3/7xD4ibJUonL7w2F1DnUXRQN7KPdp7fIXFAG7vSao69efATK1za4KdyZOvRr4q8nwhY5uyGoMfDfmt8gRo9uDP+wnZkJNdshmf8VDNOpfzoEm4pljcI8mZo/QM/sH31ZoY2QfhLJTLquSaZhPgD1hP4OjpUCPLNNHnBfAeEJsXMiutBilbAk+xo8i/RUU+6+CGh1KOrhZQEycdx6xqdCF5WBM85jLclpMw0bWYR8aRgy2ABWCsiFqTbpO8y8IufgxZG95mp5xLs0toi6stDFG9eCJ7CFbZDKluypIxSYiv/k8vNe152KYTTrERps7Y3ox5D5ofDdZGkXULeBoC0ZGorpS2Vs2yujRnoCSN0vV8GjliosMSX0wuyh3060vFJjOOX10YP1MA9UikH3uayrTWlviI4oqZROpKryYnxRkVgcKpiyyHWidfhrRX8efh3RCIRmcBi62r5gXG2JTCYSoft92u173KadcDtY6DCdzLCSwi4jl+BEytbPNfdD/xVsqJ0mRUzxjwpfJe9DywTouytttvW541hzZrG8jblkftZIVfGfg/7wwcWHAYzmkwVyDHNOIqdBxBl270jcCT6TPb6RrW7myHfJLdxfREqmIyGd7RMKq8uf953b237HsBR36f7PoAjXH2nXZgtshwbZBAVbH6dwbwP8tsy+RYPp7JGWcCpovdh7229ZOalZFIDKwcM+MgaanMNbMuKStKeOmLskbXaDXNZ7AUfEkjFhJdXHnkSVViwooRb5dF9loC+6SAlis+kwe+t9K+supJ6OThYQ3G72crl01SJsx4qVgAmoRqw4LBEuDYHRfwC6O7UcmVgKQyRWxJHsmhRqE3f/lGuIoLXpujmWtZN4JmzodRLBv4gSRRqILIAe32jOBHvRULNY0qAOcvsDdsG3/lKDLzuRM3HkFINseIG1VMsVmfG3jnbX+OjcM1DtTxnwVcwLTCvNMjlpQEEV6P4wd2PSjXZl0b/ia1IZV6O8LMEqBQV9bPRFHcceeAXXRnCkHFkieGLAbTKNkTWsoeaphLZ9/g8XaklAbrAJTP3/9eKdYEOkEI8QOlXNskW/0VU+9XW8Hbpaz/PRetyPDvDQ6KMBurbDXxceQeeqiYslv1GjGB2/DAiyA=
261
+ AI_API_URL: https://test-6g2rfs50c69b7fb8.api.tcloudbasegateway.com/v1/ai/cloudbase/chat/completions
262
+ MANAGER_NODE_VERSION:
263
+ value: ''
264
+ type: string
265
+ require: true
266
+ RELEASE_TYPE:
267
+ value: beta
268
+ type: select
269
+ option: beta;latest
270
+ YARN_NPM_AUTH_TOKEN:
271
+ type: string
272
+ readonly: true
273
+ secret: xd064H3Sd1KJSDSb8UamBMLnSps8RGqvpx40l2QlN2BrirV2I5KGEYVvmJo6o9q7vt86EHlDRT5UyTIIi1golfQ3UEAYDzEUF+/nAIW93rQYeFbiHx/kZV9zuhAMeK35gM7B+IlqZoPbEIFjinnmduOUrC8BFqK+9ei23GF8POw=
274
+ finally:
275
+ success:
276
+ cmds:
277
+ - plugin: cmds
278
+ params:
279
+ cmds:
280
+ - "# 清理分支\nif [ \"$RELEASE_TYPE\" = \"beta\" ]; then\n echo \"\U0001F9F9\
281
+ \ 清理 beta 分支\"\n git checkout master \n git branch -d release/${MANAGER_NODE_VERSION}\
282
+ \ \n git push origin --delete release/${MANAGER_NODE_VERSION} \n echo\
283
+ \ \"✅ beta 分支已清理\"\nelse\n echo \"⏭️ RELEASE_TYPE !== beta,跳过分支清理\"\n\
284
+ fi"
285
+ label: 清理分支
286
+ - plugin: message_wework_single
287
+ params:
288
+ c_type: text
289
+ content: '📦 @cloudbase/manager-node v${MANAGER_NODE_VERSION} 发布成功
290
+
291
+ 提交: ${QCI_COMMIT_MESSAGE}
292
+
293
+ tag: v${MANAGER_NODE_VERSION}'
294
+ to: nenneyu;lucyqzhang
295
+ failure:
296
+ cmds:
297
+ - plugin: cmds
298
+ params:
299
+ cmds:
300
+ - "# 清理分支\nif [ \"$RELEASE_TYPE\" = \"beta\" ]; then\n echo \"\U0001F9F9\
301
+ \ 清理 beta 分支\"\n git checkout master \n git branch -d release/${MANAGER_NODE_VERSION}\
302
+ \ \n git push origin --delete release/${MANAGER_NODE_VERSION} \n echo\
303
+ \ \"✅ beta 分支已清理\"\nelse\n echo \"⏭️ RELEASE_TYPE !== beta,跳过分支清理\"\n\
304
+ fi"
305
+ label: 清理分支
306
+ - plugin: message_wework_single
307
+ params:
308
+ c_type: text
309
+ content: '📦 @cloudbase/manager-node v${MANAGER_NODE_VERSION} 发布失败
310
+
311
+ 提交: ${QCI_COMMIT_MESSAGE}
312
+
313
+ tag: v${MANAGER_NODE_VERSION}'
314
+ to: lucyqzhang;nenneyu
315
+ maximum_builds: 1
316
+ tapd_workspace_id: '20422223'
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## @cloudbase/manager-node v5.8.8 版本发布 🚀(2026-09-18)
2
+
3
+ - 新增平台版套餐服务 PlatformService
4
+ - 新增 兼容共享 COS 桶(ExternalStorage)环境
5
+
6
+ ---
7
+
8
+ ## @cloudbase/manager-node v5.8.7 版本发布 🚀(2026-09-14)
9
+
10
+ - 新增 HTTP 服务缓存刷新相关 API
11
+ - 重构 移除 ENABLE_TCBF 开关,统一走 TCB 函数接口
12
+
13
+ ---
14
+
1
15
  ## @cloudbase/manager-node v5.8.6 版本发布 🚀(2026-09-09)
2
16
 
3
17
  - 新增 hosting 本地构建拆分 npm install 并导出构建能力供 CLI 复用
package/lib/env/index.js CHANGED
@@ -829,6 +829,25 @@ class EnvService {
829
829
  async deleteHttpServiceRoute(params) {
830
830
  return this.cloudService.request('DeleteHTTPServiceRoute', Object.assign({}, params));
831
831
  }
832
+ /**
833
+ * 清除HTTP访问服务域名缓存
834
+ * 支持 CDN 和 EO 两种缓存类型。CDN 仅支持 PURGE_URL 刷新方式;PURGE_PREFIX / PURGE_HOST 仅 EO 支持
835
+ * 清除缓存后会生成任务ID,可通过 DescribeHTTPServiceCachePurgeTask 查询任务进度和详细信息
836
+ * @param {PurgeHttpServiceCacheParams} params 清除缓存参数
837
+ * @returns {Promise<PurgeHttpServiceCacheRes>}
838
+ */
839
+ async purgeHttpServiceCache(params) {
840
+ return this.cloudService.request('PurgeHTTPServiceCache', Object.assign({}, params));
841
+ }
842
+ /**
843
+ * 查询HTTP访问服务域名缓存清除任务详情
844
+ * 通过 purgeHttpServiceCache 清除域名缓存后,可传入任务ID查询清除任务状态、时间、缓存类型等信息;也可不传任务ID查询历史任务记录
845
+ * @param {DescribeHttpServiceCachePurgeTaskParams} params 查询参数
846
+ * @returns {Promise<DescribeHttpServiceCachePurgeTaskRes>}
847
+ */
848
+ async describeHttpServiceCachePurgeTask(params) {
849
+ return this.cloudService.request('DescribeHTTPServiceCachePurgeTask', Object.assign({}, params));
850
+ }
832
851
  /**
833
852
  * 绑定自定义域名到HTTP访问服务
834
853
  * 底层调用 CreateHTTPServiceRoute API,专用于域名绑定场景
@@ -906,7 +925,9 @@ class EnvService {
906
925
  async modifyCosCorsDomain(domain, deleted = false) {
907
926
  var _a, _b, _c;
908
927
  const storage = (_b = (_a = this.environment.lazyEnvironmentConfig) === null || _a === void 0 ? void 0 : _a.Storages) === null || _b === void 0 ? void 0 : _b[0];
909
- if (!(storage === null || storage === void 0 ? void 0 : storage.Bucket) && ((_c = storage === null || storage === void 0 ? void 0 : storage.ExternalStorage) === null || _c === void 0 ? void 0 : _c.Enabled) === true) {
928
+ // 环境未开通云存储(Storages 为空)时同样跳过:此时 getStorageConfig() 会抛错,
929
+ // 而调用方未 await 本方法,抛出即为未处理的 Promise rejection
930
+ if (!storage || (!storage.Bucket && ((_c = storage.ExternalStorage) === null || _c === void 0 ? void 0 : _c.Enabled) === true)) {
910
931
  return;
911
932
  }
912
933
  const cos = this.getCos();
@@ -25,6 +25,7 @@ const sandbox_1 = require("./sandbox");
25
25
  const aiModel_1 = require("./aiModel");
26
26
  const monitor_1 = require("./monitor");
27
27
  const integration_1 = require("./integration");
28
+ const platform_1 = require("./platform");
28
29
  class Environment {
29
30
  constructor(context, envId) {
30
31
  this.inited = false;
@@ -52,6 +53,7 @@ class Environment {
52
53
  this.aiModelService = new aiModel_1.AiModelService(this);
53
54
  this.monitorService = new monitor_1.MonitorService(this);
54
55
  this.integrationService = new integration_1.IntegrationService(this);
56
+ this.platformService = new platform_1.PlatformService(this);
55
57
  }
56
58
  async lazyInit() {
57
59
  if (!this.inited) {
@@ -142,6 +144,12 @@ class Environment {
142
144
  getIntegrationService() {
143
145
  return this.integrationService;
144
146
  }
147
+ /**
148
+ * 获取平台版套餐服务
149
+ */
150
+ getPlatformService() {
151
+ return this.platformService;
152
+ }
145
153
  getCommonService(serviceType = 'tcb', serviceVersion) {
146
154
  return new common_1.CommonService(this, serviceType, serviceVersion);
147
155
  }
package/lib/error.js CHANGED
@@ -5,12 +5,13 @@ class CloudBaseError extends Error {
5
5
  constructor(message, options = {}) {
6
6
  super();
7
7
  this.name = 'CloudBaseError';
8
- const { code = '', action = '', original = null, requestId = '' } = options;
8
+ const { code = '', action = '', original = null, requestId = '', meta } = options;
9
9
  this.message = action ? `[${action}] ${message}` : message;
10
10
  this.original = original;
11
11
  this.code = code;
12
12
  this.requestId = requestId;
13
13
  this.action = action;
14
+ this.meta = meta;
14
15
  }
15
16
  }
16
17
  exports.CloudBaseError = CloudBaseError;
@@ -459,9 +459,10 @@ class HostingService {
459
459
  * 获取配置
460
460
  */
461
461
  getHostingConfig() {
462
- var _a;
462
+ var _a, _b;
463
463
  const envConfig = this.environment.lazyEnvironmentConfig;
464
- const appId = (_a = envConfig.Storages[0]) === null || _a === void 0 ? void 0 : _a.AppId;
464
+ // 环境未开通云存储时 Storages 为空,取 appId 不应崩溃(托管信息不依赖 appId)
465
+ const appId = (_b = (_a = envConfig.Storages) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.AppId;
465
466
  const { proxy } = this.environment.cloudBaseContext;
466
467
  return {
467
468
  appId,
package/lib/index.js CHANGED
@@ -151,6 +151,13 @@ class CloudBase {
151
151
  get monitor() {
152
152
  return this.currentEnvironment().getMonitorService();
153
153
  }
154
+ /**
155
+ * 平台版套餐服务
156
+ * 提供平台版套餐查询、环境管理、资源用量及 HTTP 访问服务路由等能力
157
+ */
158
+ get platform() {
159
+ return this.currentEnvironment().getPlatformService();
160
+ }
154
161
  get docs() {
155
162
  if (!this.docsService) {
156
163
  this.docsService = new docs_1.DocsService();
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PlatformService = void 0;
4
+ const error_1 = require("../error");
5
+ const utils_1 = require("../utils");
6
+ /**
7
+ * 平台版服务
8
+ * 提供平台版套餐查询、资源用量统计、环境生命周期管理及 HTTP 访问服务路由管理能力
9
+ */
10
+ class PlatformService {
11
+ constructor(environment) {
12
+ this.environment = environment;
13
+ this.envId = environment.getEnvId();
14
+ this.cloudService = new utils_1.CloudService(environment.cloudBaseContext, 'tcb', '2018-06-08');
15
+ }
16
+ /**
17
+ * 查询在售的平台版套餐列表
18
+ * 返回当前可购买的平台版套餐,包括计费下单配置(BillTags)、套餐规格(Spec)等商品信息,
19
+ * 用于购买前的套餐查询,不涉及用户已购资源。
20
+ * @param {DescribePlatformPackageListParams} params 查询参数,可通过 PackageId 查询指定套餐
21
+ * @returns {Promise<DescribePlatformPackageListRes>} 在售套餐列表
22
+ */
23
+ async describePlatformPackageList(params = {}) {
24
+ return this.cloudService.request('DescribePlatformPackageList', Object.assign({}, params));
25
+ }
26
+ /**
27
+ * 查询当前账号下的平台版资源实例列表
28
+ * 返回已购平台版资源的计费信息(购买与过期时间、计费状态、自动续费),
29
+ * 以及存储、日志、静态托管等底层资源明细。
30
+ * @param {DescribePlatformsParams} params 查询参数,PlatformIds 指定实例(缺省分页返回全部),Limit 取值 [10, 100]
31
+ * @returns {Promise<DescribePlatformsRes>} 平台版资源列表及总数
32
+ * @throws {CloudBaseError} Limit 非法时抛出,须为 10 至 100 的整数
33
+ */
34
+ async describePlatforms(params = {}) {
35
+ const { Limit } = params;
36
+ if (Limit !== undefined && (!Number.isInteger(Limit) || Limit < 10 || Limit > 100)) {
37
+ throw new error_1.CloudBaseError('Limit 必须是 10 至 100 的整数');
38
+ }
39
+ return this.cloudService.request('DescribePlatforms', Object.assign({}, params));
40
+ }
41
+ /**
42
+ * 查询平台版资源当前所处的计费周期
43
+ * 平台版资源点按月结算,计费周期自购买日起算,每个周期各享有一笔抵扣额度。
44
+ * 例如 2026-01-05 购买 3 个月(2026-04-05 到期),则三个周期分别为
45
+ * 01-05 ~ 02-05、02-06 ~ 03-05、03-06 ~ 04-05。
46
+ * @param {DescribePlatformAccountCircleParams} params 查询参数,WithHistoryCircle 为 true 时附带返回最近两个历史周期
47
+ * @returns {Promise<DescribePlatformAccountCircleRes>} 当前周期起止时间及是否过期
48
+ */
49
+ async describePlatformAccountCircle(params) {
50
+ return this.cloudService.request('DescribePlatformAccountCircle', Object.assign({}, params));
51
+ }
52
+ /**
53
+ * 查询平台版资源的资源点用量汇总
54
+ * 返回指定时间范围内的资源点用量统计,包括套餐内抵扣、资源包抵扣、
55
+ * 按量上报、原价消耗四类总量的每日明细。
56
+ * @param {DescribePlatformCreditsUsageParams} params 查询参数,StartDate/EndDate 格式为 'YYYY-MM-DD'
57
+ * @returns {Promise<DescribePlatformCreditsUsageRes>} 四类用量总量及每日明细
58
+ */
59
+ async describePlatformCreditsUsage(params) {
60
+ return this.cloudService.request('DescribePlatformCreditsUsage', Object.assign({}, params));
61
+ }
62
+ /**
63
+ * 查询平台版资源的资源点用量明细
64
+ * 按模块(Usages)→ 指标(MetricUsageDetail)→ 每日明细(ValueDetailList)三个层级,
65
+ * 返回各模块的资源点用量及原始用量明细。
66
+ * @param {DescribePlatformCreditsUsageDetailParams} params 查询参数,Modules 指定查询的模块(如 FLEXDB、SCF、AI、COS 等)
67
+ * @returns {Promise<DescribePlatformCreditsUsageDetailRes>} 各模块的用量明细数据
68
+ */
69
+ async describePlatformCreditsUsageDetail(params) {
70
+ return this.cloudService.request('DescribePlatformCreditsUsageDetail', Object.assign({}, params));
71
+ }
72
+ /**
73
+ * 查询平台版下各环境的资源点用量排行
74
+ * 按 TimeRange 指定的时间范围返回各环境的资源点用量排序,
75
+ * 排行数据由后台定时计算,可能存在小时级延迟。
76
+ * @param {DescribePlatformEnvCreditsRankingParams} params 查询参数,TimeRange 缺省为 Today(近 1 天)
77
+ * @returns {Promise<DescribePlatformEnvCreditsRankingRes>} 环境用量排行列表及分页信息
78
+ */
79
+ async describePlatformEnvCreditsRanking(params = {}) {
80
+ return this.cloudService.request('DescribePlatformEnvCreditsRanking', Object.assign({}, params));
81
+ }
82
+ /**
83
+ * 查询平台版环境内各资源类型的用量
84
+ * 按资源类型(存储、函数、数据库等)返回各指标的用量及按日明细,
85
+ * 包括资源点用量与原始用量值及对应单位。
86
+ * @param {DescribePlatformEnvUsageParams} params 查询参数,EnvId 缺省时使用当前环境,ResourceTypes 指定资源类型
87
+ * @returns {Promise<DescribePlatformEnvUsageRes>} 资源用量明细及资源点总量
88
+ */
89
+ async describePlatformEnvUsage(params) {
90
+ return this.cloudService.request('DescribePlatformEnvUsage', Object.assign(Object.assign({}, params), { EnvId: params.EnvId || this.envId }));
91
+ }
92
+ /**
93
+ * 创建平台版环境
94
+ * 在已购平台版资源下开通新环境。
95
+ * @param {CreatePlatformEnvParams} params 创建参数,ReqKey 为幂等键,可用于防止重复创建
96
+ * @returns {Promise<CreatePlatformEnvRes>} 新创建环境的 EnvId
97
+ */
98
+ async createPlatformEnv(params) {
99
+ return this.cloudService.request('CreatePlatformEnv', Object.assign({}, params));
100
+ }
101
+ /**
102
+ * 修改平台版环境状态
103
+ * 支持启用/禁用环境,以及云存储(Storage)、FlexDB 资源的状态变更,未传入的资源不做更新。
104
+ * @param {ModifyPlatformEnvParams} params 修改参数,EnvId 缺省时使用当前环境
105
+ * @returns {Promise<ModifyPlatformEnvRes>} 环境的最终状态
106
+ * @throws {CloudBaseError} Status 非法时抛出,仅支持 ENABLE / DISABLE
107
+ */
108
+ async modifyPlatformEnv(params) {
109
+ const { Status } = params;
110
+ const validStatus = ['ENABLE', 'DISABLE'];
111
+ if (Status !== undefined && !validStatus.includes(Status)) {
112
+ throw new error_1.CloudBaseError(`Invalid Status value: ${Status}. Only support 'ENABLE', 'DISABLE'`);
113
+ }
114
+ return this.cloudService.request('ModifyPlatformEnv', Object.assign(Object.assign({}, params), { EnvId: params.EnvId || this.envId }));
115
+ }
116
+ /**
117
+ * 删除平台版环境
118
+ * 删除操作不可逆,须显式指定目标环境 ID。
119
+ * @param {DestroyPlatformEnvParams} params 删除参数,EnvId 为必填
120
+ * @returns {Promise<DestroyPlatformEnvRes>} 请求执行结果
121
+ */
122
+ async destroyPlatformEnv(params) {
123
+ return this.cloudService.request('DestroyPlatformEnv', Object.assign({}, params));
124
+ }
125
+ /**
126
+ * 校验 HTTP 访问服务路由配置(预检)
127
+ * 创建路由前的只读预检,覆盖域名归属权、证书、配额、路由冲突、域名占用等检查项,
128
+ * 不创建任何资源。Passed 为 true 时可调用 createPlatformHttpServiceRoute 正式创建;
129
+ * 为 false 时根据各检查项的 Code 定位并修正问题。
130
+ * 预检通过不代表创建必然成功,但预检不通过则创建必然失败。
131
+ * @param {VerifyPlatformHTTPServiceRouteParams} params 校验参数,包含待校验的域名路由信息
132
+ * @returns {Promise<VerifyPlatformHTTPServiceRouteRes>} 整体校验结果及各检查项明细
133
+ */
134
+ async verifyPlatformHttpServiceRoute(params) {
135
+ return this.cloudService.request('VerifyPlatformHTTPServiceRoute', Object.assign({}, params));
136
+ }
137
+ /**
138
+ * 创建 HTTP 访问服务路由
139
+ * 不传 Domain.Routes 时仅创建域名信息。域名与路由均为异步下发,创建后需调用
140
+ * describePlatformHttpServiceRoute 轮询域名状态,直到 SUCCESS 或 FAIL(FAIL 可删除后重新创建);
141
+ * 下发完成前访问域名可能返回 404 或 HTTPS 握手失败。
142
+ * @param {CreatePlatformHTTPServiceRouteParams} params 创建参数
143
+ * @returns {Promise<CreatePlatformHTTPServiceRouteRes>} 域名归属权验证指引(归属校验未通过时返回)
144
+ */
145
+ async createPlatformHttpServiceRoute(params) {
146
+ return this.cloudService.request('CreatePlatformHTTPServiceRoute', Object.assign({}, params));
147
+ }
148
+ /**
149
+ * 修改 HTTP 访问服务路由
150
+ * 增量更新,对应字段未传入则不修改。
151
+ * @param {ModifyPlatformHTTPServiceRouteParams} params 修改参数,包含目标域名及待更新的路由信息
152
+ * @returns {Promise<ModifyPlatformHTTPServiceRouteRes>} 请求执行结果
153
+ */
154
+ async modifyPlatformHttpServiceRoute(params) {
155
+ return this.cloudService.request('ModifyPlatformHTTPServiceRoute', Object.assign({}, params));
156
+ }
157
+ /**
158
+ * 删除 HTTP 访问服务路由
159
+ * Paths 为空时删除域名及其下全部路由,非空时仅删除指定路径的路由。
160
+ * @param {DeletePlatformHTTPServiceRouteParams} params 删除参数,Paths 缺省时删除整个域名
161
+ * @returns {Promise<DeletePlatformHTTPServiceRouteRes>} 请求执行结果
162
+ */
163
+ async deletePlatformHttpServiceRoute(params) {
164
+ return this.cloudService.request('DeletePlatformHTTPServiceRoute', Object.assign({}, params));
165
+ }
166
+ /**
167
+ * 查询 HTTP 访问服务路由
168
+ * 返回各域名及其路由信息列表、自定义接入的源站域名及域名总数,
169
+ * 支持按 Domain、Path、DomainType、UpstreamResourceType 过滤及分页。
170
+ * @param {DescribePlatformHTTPServiceRouteParams} params 查询参数,Limit 默认 20、最大 1000
171
+ * @returns {Promise<DescribePlatformHTTPServiceRouteRes>} 域名路由列表及域名总数
172
+ */
173
+ async describePlatformHttpServiceRoute(params) {
174
+ return this.cloudService.request('DescribePlatformHTTPServiceRoute', Object.assign({}, params));
175
+ }
176
+ }
177
+ exports.PlatformService = PlatformService;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });