@heybox/hb-sdk 0.8.1-alpha.1 → 0.8.1-alpha.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 (48) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +32 -3
  3. package/dist/cli-chunks/{build-kMLIWqWY.cjs → build-B5Sbi8Sq.cjs} +13 -9
  4. package/dist/cli-chunks/{context-CzFFRcL4.cjs → context-DuxaBL3Y.cjs} +2 -2
  5. package/dist/cli-chunks/{create-0ow6gA9w.cjs → create-CIfZrg3F.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-CPBPdpyu.cjs → dev-CFubP5kW.cjs} +10 -9
  7. package/dist/cli-chunks/{doctor-DQ8ctFKC.cjs → doctor-IPKn3PBn.cjs} +1 -1
  8. package/dist/cli-chunks/{index-Buner4kE.cjs → index-DCJN-V1y.cjs} +15 -15
  9. package/dist/cli-chunks/{index-RDcIrvwi.cjs → index-KHhdZ8eZ.cjs} +2 -2
  10. package/dist/cli-chunks/{index.esm-qwrdRuy-.cjs → index.esm-8hgZlNF8.cjs} +7 -7
  11. package/dist/cli-chunks/{login-DoduAO_f.cjs → login-CoB9jXxC.cjs} +2 -2
  12. package/dist/cli-chunks/{project-vite-B-sK-qup.cjs → project-vite-DMxdOWsU.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-CF_SRmnj.cjs → remote-D4ZcngLn.cjs} +14 -10
  14. package/dist/cli-chunks/{runtime-gate-FseEYZze.cjs → runtime-gate-BWb8QIcX.cjs} +0 -107
  15. package/dist/cli-chunks/{runtime-permission-env-DdQtxdut.cjs → runtime-permission-env-XAZFauvZ.cjs} +125 -9
  16. package/dist/cli-chunks/{session-DHbw2Xgh.cjs → session-BnoHxzFq.cjs} +1 -1
  17. package/dist/cli-chunks/{skill-6IVv12JW.cjs → skill-CDEJtATn.cjs} +2 -2
  18. package/dist/cli-chunks/{version-TXwWxKvv.cjs → version-BGzCIQhE.cjs} +1 -1
  19. package/dist/cli.cjs +1 -1
  20. package/dist/devtools/browser-dev-host/assets/browser-dev-host-DzEst9n7.js +99 -0
  21. package/dist/devtools/browser-dev-host/assets/{index-C5MZZDa5.js → index-B-NHlLsr.js} +2 -2
  22. package/dist/devtools/browser-dev-host/index.html +1 -1
  23. package/dist/index.cjs.js +83 -2
  24. package/dist/index.esm.js +83 -3
  25. package/dist/templates/vanilla-vite-js/README.md.ejs +1 -1
  26. package/dist/templates/vanilla-vite-js/package.json.ejs +1 -0
  27. package/dist/templates/vanilla-vite-js/vite.config.js +1 -1
  28. package/dist/vite.cjs.js +19 -10
  29. package/dist/vite.esm.js +19 -10
  30. package/package.json +7 -7
  31. package/skill/SKILL.md +5 -2
  32. package/skill/references/api-protocol.md +8 -4
  33. package/skill/references/api-root.md +114 -12
  34. package/skill/references/cli.md +2 -2
  35. package/skill/references/examples.md +9 -1
  36. package/skill/references/recipes.md +1 -0
  37. package/skill/references/safety-boundaries.md +1 -1
  38. package/skill/skill.json +5 -5
  39. package/types/core/client.d.ts +7 -1
  40. package/types/core/sdk.d.ts +3 -0
  41. package/types/core/singleton.d.ts +3 -0
  42. package/types/index.d.ts +3 -1
  43. package/types/miniapp-manifest/node.d.ts +2 -0
  44. package/types/miniapp-manifest/schema.d.ts +1 -0
  45. package/types/modules/environment/index.d.ts +70 -0
  46. package/types/protocol.d.ts +1 -1
  47. package/types/vite/index.d.ts +1 -4
  48. package/dist/devtools/browser-dev-host/assets/browser-dev-host-TzYf9L6C.js +0 -99
package/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  本文件随 `@heybox/hb-sdk` npm 包公开分发,只记录外部小程序开发者可观察到的变化。内部集成、实现策略和审查证据不在此维护。
4
4
 
5
+ ## 0.8.1-alpha.3
6
+
7
+ - 目标平台声明统一迁移到 `package.json#heybox.platforms`;`miniappManifest()` 恢复无参调用,并在构建时将该声明写入 `dist/manifest.json`。
8
+ - `hb-sdk dev`、`hb-sdk build` 和普通 `hb-sdk remote deploy` 会拒绝缺失或非法的平台声明;build/deploy 也会拒绝与项目配置不一致的 Manifest。已有项目升级时需把原 Vite 参数中的 `platforms` 移入 `package.json#heybox`。
9
+
10
+ ## 0.8.1-alpha.2
11
+
12
+ - 新增 `environment.getInfo()` 与 `environment.getInfoSync()`,用于读取运行模式、小黑盒 App 版本、canonical 小程序 ID/版本、操作系统和 SDK 版本的冻结快照。
13
+ - 异步方法会自动等待 SDK 握手;同步方法仅在 `ready` 后可用,提前调用返回 `ENVIRONMENT_NOT_READY`。
14
+ - 环境信息无需权限,只用于界面适配、兼容降级和诊断。旧 Host 与缺失字段按 `null` / `'unknown'` 降级,不影响小程序启动。
15
+ - Runtime 与 Host 集成新增向后兼容的握手环境 response;现有 SDK 会忽略该 response,现有 Host 仍可与新 SDK 握手。
16
+
5
17
  ## 0.8.1-alpha.1
6
18
 
7
19
  - 预发布版本:更新日志文档改为直接投影结构完整的稳定版条目,与 npm 当前版本和 dist-tag 独立发布、独立重试。
package/README.md CHANGED
@@ -94,7 +94,17 @@ async function revokeAuthorizationFromUserAction() {
94
94
 
95
95
  `user.revokeAuthorization()` 位于无需声明白名单,不接收小程序 ID、黑盒用户 ID 或手势参数。调用必须来自可信用户操作,否则返回 `USER_GESTURE_REQUIRED`。撤销成功后,后续身份或授权读取会重新进入授权流程;SDK 不会替业务清理已经持久化的数据。
96
96
 
97
- 已有 Vite 项目还需要启用构建插件:
97
+ 已有 Vite 项目先在 `package.json#heybox.platforms` 声明实际承诺适配的平台:
98
+
99
+ ```json
100
+ {
101
+ "heybox": {
102
+ "platforms": ["android", "ios", "ohos"]
103
+ }
104
+ }
105
+ ```
106
+
107
+ 再启用构建插件:
98
108
 
99
109
  ```ts
100
110
  import { miniappManifest } from '@heybox/hb-sdk/vite';
@@ -102,12 +112,30 @@ import { defineConfig } from 'vite';
102
112
 
103
113
  export default defineConfig({
104
114
  base: './',
105
- plugins: [miniappManifest({ platforms: ['android', 'ios', 'ohos'] })],
115
+ plugins: [miniappManifest()],
106
116
  });
107
117
  ```
108
118
 
109
119
  完整接入步骤见[快速开始](https://docs.xiaoheihe.cn/hb_sdk/guide/quick-start)。
110
120
 
121
+ ## 环境信息
122
+
123
+ 使用 `environment.getInfo()` 读取当前实例的冻结环境快照;它会自动等待 SDK 握手:
124
+
125
+ ```ts
126
+ const info = await hbSDK.environment.getInfo();
127
+
128
+ console.log(info.runtime.mode);
129
+ console.log(info.host.appVersion);
130
+ console.log(info.miniProgram.id, info.miniProgram.version);
131
+ console.log(info.operatingSystem.name, info.operatingSystem.version);
132
+ console.log(info.sdk.version);
133
+ ```
134
+
135
+ 已经确认 SDK 为 `ready` 时,可以通过 `environment.getInfoSync()` 同步读取同一份快照;握手前调用会抛出 `ENVIRONMENT_NOT_READY`。旧 Host 或缺失字段会返回固定结构,以 `null` / `'unknown'` 表示未知值。除 `sdk.version` 外,版本字段均为不透明字符串。
136
+
137
+ 环境信息无需权限,只用于界面适配、兼容降级、埋点和诊断,不能作为鉴权、权限控制或风控依据。完整字段和 Browser Mock 行为见[环境信息](https://docs.xiaoheihe.cn/hb_sdk/guide/environment)。
138
+
111
139
  ## 文件与下载
112
140
 
113
141
  `files` 提供当前小程序私有 sandbox 和由用户选择授予的外部 File/Directory;
@@ -172,6 +200,7 @@ SDK 还提供 `getHandshakeState()` / `onHandshakeStateChange()` 管理持久握
172
200
  | 模块 | 用途 |
173
201
  | ------------ | ----------------------------------------------- |
174
202
  | `auth` | 获取交给开发者服务端交换的短期授权码 |
203
+ | `environment` | 读取当前实例的冻结环境快照 |
175
204
  | `user` | 读取 Host 当前用户资料、隔离身份或撤销授权 |
176
205
  | `share` | 打开分享、复制链接或截图分享流程 |
177
206
  | `ui` | 展示 Toast 和 Loading |
@@ -212,7 +241,7 @@ SDK 还提供 `getHandshakeState()` / `onHandshakeStateChange()` 管理持久握
212
241
  - Host 文件错误只保留稳定 code 与 canonical 安全文案;原始 message、data、native path 和 credential 不会进入小程序。
213
242
  - `FileStat.size` 是非负 safe integer;`modifiedAt` / `createdAt` 若存在,单位为 Unix epoch milliseconds。
214
243
  - 仅当当前版本声明且平台已批准 `network` 时,`hb-sdk dev` 与 `hb-sdk remote deploy` 构建才会跳过平台 CSP;其他构建继续注入平台 CSP。`useOfficialDomain` 不参与 CSP 跳过判定。
215
- - 构建必须启用 `miniappManifest({ platforms })` 并显式声明实际承诺适配的平台,推荐统一使用 `hb-sdk build`。新项目模板中的 `['android', 'ios', 'ohos']` 只是初始配置,不代表已经完成真机验收。
244
+ - 构建必须启用 `miniappManifest()`,并在 `package.json#heybox.platforms` 显式声明实际承诺适配的平台,推荐统一使用 `hb-sdk build`。新项目模板中的 `['android', 'ios', 'ohos']` 只是初始配置,不代表已经完成真机验收。
216
245
 
217
246
  私有 Page Channel 适配没有修改 `@heybox/hb-sdk` 公开 API 或 iframe wire;本次 files/download
218
247
  Runtime 能力随 `0.8.0-alpha.11` release family 发布,部署 detail 前必须保证
@@ -3,11 +3,11 @@
3
3
  var fs$1 = require('node:fs');
4
4
  var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
- var runtimePermissionEnv = require('./runtime-permission-env-DdQtxdut.cjs');
7
- var runtimeGate = require('./runtime-gate-FseEYZze.cjs');
8
- var index = require('./index-Buner4kE.cjs');
9
- var projectVite = require('./project-vite-B-sK-qup.cjs');
10
- require('./version-TXwWxKvv.cjs');
6
+ var runtimePermissionEnv = require('./runtime-permission-env-XAZFauvZ.cjs');
7
+ var runtimeGate = require('./runtime-gate-BWb8QIcX.cjs');
8
+ var index = require('./index-DCJN-V1y.cjs');
9
+ var projectVite = require('./project-vite-DMxdOWsU.cjs');
10
+ require('./version-BGzCIQhE.cjs');
11
11
  require('node:async_hooks');
12
12
  require('node:module');
13
13
  require('path');
@@ -28,6 +28,7 @@ async function runBuildCommand(_options = {}, runtime = {}) {
28
28
  const env = runtime.env ?? process.env;
29
29
  const mode = env.HB_SDK_ENV?.trim() || undefined;
30
30
  const skipPlatformCsp = runtimePermissionEnv.shouldSkipMiniappPlatformCspFromEnv(env);
31
+ const declaredPlatforms = runtimePermissionEnv.readMiniappPlatformsFromPackageJson(projectRoot);
31
32
  runtimePermissionEnv.readMiniappPermissionsFromPackageJson(projectRoot, runtimePermissionEnv.resolveMiniappSdkVersion());
32
33
  await fs.rm(distDir, { force: true, recursive: true });
33
34
  try {
@@ -46,7 +47,7 @@ async function runBuildCommand(_options = {}, runtime = {}) {
46
47
  write: true,
47
48
  },
48
49
  }), { successText: 'Vite 构建完成' });
49
- const result = await validateBuildOutput(projectRoot, logger);
50
+ const result = await validateBuildOutput(projectRoot, logger, declaredPlatforms);
50
51
  logger.success(`构建完成: dist/ | manifest version ${result.version} | sdkVersion ${result.sdkVersion} | 待上传文件 ${result.fileCount} 个 | ${formatSize(result.totalBytes)}`);
51
52
  return result;
52
53
  }, env);
@@ -75,7 +76,7 @@ function createFixedBuildOutputPlugin(projectRoot) {
75
76
  },
76
77
  };
77
78
  }
78
- async function validateBuildOutput(projectRoot, logger) {
79
+ async function validateBuildOutput(projectRoot, logger, declaredPlatforms) {
79
80
  const distDir = path.join(projectRoot, 'dist');
80
81
  const entryHtmlPath = path.join(distDir, 'index.html');
81
82
  const manifestPath = path.join(distDir, 'manifest.json');
@@ -89,11 +90,14 @@ async function validateBuildOutput(projectRoot, logger) {
89
90
  if (!runtimeGate.hasMiniappRuntimeGate(entryHtml)) {
90
91
  throw new Error('dist/index.html 缺少平台 Runtime 启动门禁,请在 Vite 配置中显式启用 miniappManifest()');
91
92
  }
92
- const { manifest, hadBom } = runtimeGate.parseMiniappManifestJson(await fs.readFile(manifestPath, 'utf8'), 'dist/manifest.json');
93
+ const { manifest, hadBom } = runtimePermissionEnv.parseMiniappManifestJson(await fs.readFile(manifestPath, 'utf8'), 'dist/manifest.json');
93
94
  if (hadBom) {
94
95
  logger.warn('dist/manifest.json 包含 BOM,已自动剥离');
95
96
  }
96
- const { platforms, sdkVersion, version, permissions } = runtimeGate.validateMiniappManifestForDeploy(manifest);
97
+ const { platforms, sdkVersion, version, permissions } = runtimePermissionEnv.validateMiniappManifestForDeploy(manifest);
98
+ if (!runtimePermissionEnv.areMiniappPlatformsEqual(platforms, declaredPlatforms)) {
99
+ throw new Error('dist/manifest.json.platforms 与 package.json#heybox.platforms 不一致,请重新 build');
100
+ }
97
101
  const allFiles = await walkDistFiles(distDir);
98
102
  const uploadFiles = allFiles.filter((file) => runtimePermissionEnv.shouldUploadDistFile(file.relativePath));
99
103
  const sizeError = runtimePermissionEnv.validateUploadTotalSize(uploadFiles);
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var runtimePermissionEnv = require('./runtime-permission-env-DdQtxdut.cjs');
4
- var session = require('./session-DHbw2Xgh.cjs');
3
+ var runtimePermissionEnv = require('./runtime-permission-env-XAZFauvZ.cjs');
4
+ var session = require('./session-BnoHxzFq.cjs');
5
5
  var fs$1 = require('node:fs');
6
6
  var fs = require('node:fs/promises');
7
7
  var path = require('node:path');
@@ -5,7 +5,7 @@ var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
6
  var require$$0 = require('fs');
7
7
  var require$$1 = require('path');
8
- var index = require('./index-Buner4kE.cjs');
8
+ var index = require('./index-DCJN-V1y.cjs');
9
9
  require('node:module');
10
10
  require('os');
11
11
  require('readline');
@@ -8,17 +8,17 @@ var node_crypto = require('node:crypto');
8
8
  var promises = require('node:dns/promises');
9
9
  var node_http = require('node:http');
10
10
  var node_module = require('node:module');
11
- var context = require('./context-CzFFRcL4.cjs');
12
- var runtimePermissionEnv = require('./runtime-permission-env-DdQtxdut.cjs');
11
+ var context = require('./context-DuxaBL3Y.cjs');
12
+ var runtimePermissionEnv = require('./runtime-permission-env-XAZFauvZ.cjs');
13
13
  var undici = require('undici');
14
14
  var fs$1 = require('node:fs/promises');
15
- var index = require('./index-Buner4kE.cjs');
15
+ var index = require('./index-DCJN-V1y.cjs');
16
16
  var require$$0$1 = require('crypto');
17
17
  var require$$0 = require('buffer');
18
- var session = require('./session-DHbw2Xgh.cjs');
18
+ var session = require('./session-BnoHxzFq.cjs');
19
19
  var browser = require('./browser-RAy8e8cV.cjs');
20
- var projectVite = require('./project-vite-B-sK-qup.cjs');
21
- var version = require('./version-TXwWxKvv.cjs');
20
+ var projectVite = require('./project-vite-DMxdOWsU.cjs');
21
+ var version = require('./version-BGzCIQhE.cjs');
22
22
 
23
23
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
24
24
  class Locked extends Error {
@@ -1851,8 +1851,8 @@ const DEFAULT_CHANNEL_TRANSPORT = {
1851
1851
  };
1852
1852
  const IPV4_LOOPBACK_ADDRESSES = new net.BlockList();
1853
1853
  IPV4_LOOPBACK_ADDRESSES.addSubnet('127.0.0.0', 8, 'ipv4');
1854
- const { WebSocket, WebSocketServer } = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/dev-CPBPdpyu.cjs', document.baseURI).href)))('ws');
1855
- const { parse: parseHtml } = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/dev-CPBPdpyu.cjs', document.baseURI).href)))('parse5');
1854
+ const { WebSocket, WebSocketServer } = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/dev-CFubP5kW.cjs', document.baseURI).href)))('ws');
1855
+ const { parse: parseHtml } = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/dev-CFubP5kW.cjs', document.baseURI).href)))('parse5');
1856
1856
  const BROWSER_DEV_HOST_ROOT_CANDIDATES = [
1857
1857
  path.resolve(__dirname, 'devtools/browser-dev-host'),
1858
1858
  path.resolve(__dirname, '../devtools/browser-dev-host'),
@@ -10902,7 +10902,7 @@ function assertNodeRuntimeCapabilities(ctx, settings) {
10902
10902
  function createNodeRealtimeDriverRegistry() {
10903
10903
  const registry = createRuntimeRealtimeDriverRegistry();
10904
10904
  registry.registerLazy('node-websocket', async () => {
10905
- const mod = await Promise.resolve().then(function () { return require('./index.esm-qwrdRuy-.cjs'); });
10905
+ const mod = await Promise.resolve().then(function () { return require('./index.esm-8hgZlNF8.cjs'); });
10906
10906
  return mod.createNodeWebSocketRuntimeDriver();
10907
10907
  });
10908
10908
  return registry;
@@ -14991,6 +14991,7 @@ async function runDevCommand(options, runtime = {}) {
14991
14991
  port: appPort,
14992
14992
  };
14993
14993
  const projectRoot = projectVite.findProjectRoot(runtime.cwd ?? process.cwd());
14994
+ runtimePermissionEnv.readMiniappPlatformsFromPackageJson(projectRoot);
14994
14995
  const { context: devLaunchContext, miniProgram } = await loadDevLaunchContext({
14995
14996
  env: runtime.env,
14996
14997
  fetchImpl,
@@ -3,7 +3,7 @@
3
3
  var fs = require('node:fs/promises');
4
4
  var os = require('node:os');
5
5
  var path = require('node:path');
6
- var index = require('./index-Buner4kE.cjs');
6
+ var index = require('./index-DCJN-V1y.cjs');
7
7
  require('node:module');
8
8
  require('node:fs');
9
9
  require('path');
@@ -234,19 +234,19 @@ function requireArgument () {
234
234
 
235
235
  var command = {};
236
236
 
237
- const require$5 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Buner4kE.cjs', document.baseURI).href)));
237
+ const require$5 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-DCJN-V1y.cjs', document.baseURI).href)));
238
238
  function __require$4() { return require$5("node:events"); }
239
239
 
240
- const require$4 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Buner4kE.cjs', document.baseURI).href)));
240
+ const require$4 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-DCJN-V1y.cjs', document.baseURI).href)));
241
241
  function __require$3() { return require$4("node:child_process"); }
242
242
 
243
- const require$3 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Buner4kE.cjs', document.baseURI).href)));
243
+ const require$3 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-DCJN-V1y.cjs', document.baseURI).href)));
244
244
  function __require$2() { return require$3("node:path"); }
245
245
 
246
- const require$2 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Buner4kE.cjs', document.baseURI).href)));
246
+ const require$2 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-DCJN-V1y.cjs', document.baseURI).href)));
247
247
  function __require$1() { return require$2("node:fs"); }
248
248
 
249
- const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Buner4kE.cjs', document.baseURI).href)));
249
+ const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-DCJN-V1y.cjs', document.baseURI).href)));
250
250
  function __require() { return require$1("node:process"); }
251
251
 
252
252
  var help = {};
@@ -13353,7 +13353,7 @@ function getPathname(pathWithQuery) {
13353
13353
  }
13354
13354
 
13355
13355
  const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
13356
- const BUILT_CLI_VERSION = '0.8.1-alpha.1';
13356
+ const BUILT_CLI_VERSION = '0.8.1-alpha.3';
13357
13357
  const PACKAGE_JSON_CANDIDATES = [
13358
13358
  path.resolve(__dirname, '..', '..', 'package.json'),
13359
13359
  path.resolve(__dirname, '..', 'package.json'),
@@ -13701,39 +13701,39 @@ function createCommandLoggerResolver(options) {
13701
13701
  };
13702
13702
  }
13703
13703
  const defaultClearLoginStatus = async (...args) => {
13704
- const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-DoduAO_f.cjs'); });
13704
+ const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-CoB9jXxC.cjs'); });
13705
13705
  return clearLoginStatus(...args);
13706
13706
  };
13707
13707
  const defaultLoginToHeybox = async (...args) => {
13708
- const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-DoduAO_f.cjs'); });
13708
+ const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-CoB9jXxC.cjs'); });
13709
13709
  return loginToHeybox(...args);
13710
13710
  };
13711
13711
  const defaultPrintLoginStatus = async (...args) => {
13712
- const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-DoduAO_f.cjs'); });
13712
+ const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-CoB9jXxC.cjs'); });
13713
13713
  return printLoginStatus(...args);
13714
13714
  };
13715
13715
  const defaultRunBuildCommand = async (...args) => {
13716
- const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-kMLIWqWY.cjs'); });
13716
+ const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-B5Sbi8Sq.cjs'); });
13717
13717
  return runBuildCommand(...args);
13718
13718
  };
13719
13719
  const defaultRunCreateCommand = async (...args) => {
13720
- const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-0ow6gA9w.cjs'); });
13720
+ const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-CIfZrg3F.cjs'); });
13721
13721
  return runCreateCommand(...args);
13722
13722
  };
13723
13723
  const defaultRunDevCommand = async (...args) => {
13724
- const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-CPBPdpyu.cjs'); }).then(function (n) { return n.dev; });
13724
+ const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-CFubP5kW.cjs'); }).then(function (n) { return n.dev; });
13725
13725
  return runDevCommand(...args);
13726
13726
  };
13727
13727
  const defaultRunDoctorCommand = async (...args) => {
13728
- const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-DQ8ctFKC.cjs'); });
13728
+ const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-IPKn3PBn.cjs'); });
13729
13729
  return runDoctorCommand(...args);
13730
13730
  };
13731
13731
  const defaultRunSkillInstallCommand = async (...args) => {
13732
- const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-6IVv12JW.cjs'); });
13732
+ const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-CDEJtATn.cjs'); });
13733
13733
  return runSkillInstallCommand(...args);
13734
13734
  };
13735
13735
  const defaultRunRemoteCommand = async (...args) => {
13736
- const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-CF_SRmnj.cjs'); });
13736
+ const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-D4ZcngLn.cjs'); });
13737
13737
  return runRemoteCommand(...args);
13738
13738
  };
13739
13739
  function resolveStandaloneLogger(options, verbose) {
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var index$2 = require('./index-Buner4kE.cjs');
3
+ var index$2 = require('./index-DCJN-V1y.cjs');
4
4
  var require$$0$3 = require('fs');
5
5
  var require$$0$2 = require('crypto');
6
6
  var require$$1$2 = require('path');
7
7
  var require$$0$5 = require('assert');
8
8
  var require$$0$4 = require('events');
9
9
  var require$$1$1 = require('util');
10
- var runtimePermissionEnv = require('./runtime-permission-env-DdQtxdut.cjs');
10
+ var runtimePermissionEnv = require('./runtime-permission-env-XAZFauvZ.cjs');
11
11
  var require$$0$7 = require('net');
12
12
  var require$$0$6 = require('url');
13
13
  var require$$2$1 = require('http');
@@ -11,8 +11,8 @@ var require$$0$4 = require('url');
11
11
  var require$$0 = require('zlib');
12
12
  var require$$0$1 = require('buffer');
13
13
  var require$$1 = require('util');
14
- var index = require('./index-Buner4kE.cjs');
15
- var dev = require('./dev-CPBPdpyu.cjs');
14
+ var index = require('./index-DCJN-V1y.cjs');
15
+ var dev = require('./dev-CFubP5kW.cjs');
16
16
  require('node:module');
17
17
  require('node:fs');
18
18
  require('node:fs/promises');
@@ -27,11 +27,11 @@ require('node:net');
27
27
  require('node:crypto');
28
28
  require('node:dns/promises');
29
29
  require('node:http');
30
- require('./context-CzFFRcL4.cjs');
31
- require('./runtime-permission-env-DdQtxdut.cjs');
32
- require('./version-TXwWxKvv.cjs');
30
+ require('./context-DuxaBL3Y.cjs');
31
+ require('./runtime-permission-env-XAZFauvZ.cjs');
32
+ require('./version-BGzCIQhE.cjs');
33
33
  require('node:async_hooks');
34
- require('./session-DHbw2Xgh.cjs');
34
+ require('./session-BnoHxzFq.cjs');
35
35
  require('fs');
36
36
  require('constants');
37
37
  require('undici');
@@ -41,7 +41,7 @@ require('node:buffer');
41
41
  require('node:url');
42
42
  require('node:util');
43
43
  require('node:child_process');
44
- require('./project-vite-B-sK-qup.cjs');
44
+ require('./project-vite-DMxdOWsU.cjs');
45
45
 
46
46
  var bufferUtil = {exports: {}};
47
47
 
@@ -3,9 +3,9 @@
3
3
  var promises = require('node:readline/promises');
4
4
  var node_crypto = require('node:crypto');
5
5
  var node_http = require('node:http');
6
- var session = require('./session-DHbw2Xgh.cjs');
6
+ var session = require('./session-BnoHxzFq.cjs');
7
7
  var browser = require('./browser-RAy8e8cV.cjs');
8
- var index = require('./index-Buner4kE.cjs');
8
+ var index = require('./index-DCJN-V1y.cjs');
9
9
  require('node:path');
10
10
  require('fs');
11
11
  require('constants');
@@ -5,7 +5,7 @@ var fs$1 = require('node:fs/promises');
5
5
  var node_module = require('node:module');
6
6
  var path = require('node:path');
7
7
  var node_url = require('node:url');
8
- var index = require('./index-Buner4kE.cjs');
8
+ var index = require('./index-DCJN-V1y.cjs');
9
9
 
10
10
  function findProjectRoot(startDir) {
11
11
  let current = path.resolve(startDir);
@@ -1,16 +1,16 @@
1
1
  'use strict';
2
2
 
3
3
  var promises = require('node:readline/promises');
4
- var index = require('./index-Buner4kE.cjs');
5
- var session = require('./session-DHbw2Xgh.cjs');
4
+ var index = require('./index-DCJN-V1y.cjs');
5
+ var session = require('./session-BnoHxzFq.cjs');
6
6
  var childProcess = require('node:child_process');
7
7
  var fs = require('node:fs');
8
8
  var fs$1 = require('node:fs/promises');
9
9
  var path = require('node:path');
10
- var runtimePermissionEnv = require('./runtime-permission-env-DdQtxdut.cjs');
11
- var runtimeGate = require('./runtime-gate-FseEYZze.cjs');
10
+ var runtimePermissionEnv = require('./runtime-permission-env-XAZFauvZ.cjs');
12
11
  var node_crypto = require('node:crypto');
13
- var context = require('./context-CzFFRcL4.cjs');
12
+ var runtimeGate = require('./runtime-gate-BWb8QIcX.cjs');
13
+ var context = require('./context-DuxaBL3Y.cjs');
14
14
  require('node:module');
15
15
  require('path');
16
16
  require('os');
@@ -23,7 +23,7 @@ require('buffer');
23
23
  require('util');
24
24
  require('fs');
25
25
  require('constants');
26
- require('./version-TXwWxKvv.cjs');
26
+ require('./version-BGzCIQhE.cjs');
27
27
  require('node:async_hooks');
28
28
 
29
29
  async function getCDNUploadInfo(options, runtime = {}) {
@@ -272,7 +272,7 @@ function createDefaultCosClient(uploadToken, COS) {
272
272
  };
273
273
  }
274
274
  async function loadCosConstructor() {
275
- const cosModule = await Promise.resolve().then(function () { return require('./index-RDcIrvwi.cjs'); }).then(function (n) { return n.index; });
275
+ const cosModule = await Promise.resolve().then(function () { return require('./index-KHhdZ8eZ.cjs'); }).then(function (n) { return n.index; });
276
276
  return cosModule.default;
277
277
  }
278
278
  function formatSize(bytes) {
@@ -509,6 +509,7 @@ async function runDeployCommand(options, runtime = {}) {
509
509
  throw new Error('未在 package.json 中找到 heybox.miniProgramId,请先配置 mini program id');
510
510
  }
511
511
  const fromVersion = options.fromVersion?.trim();
512
+ const declaredPlatforms = fromVersion ? undefined : runtimePermissionEnv.readMiniappPlatformsFromPackageJson(projectRoot);
512
513
  const releaseNote = await resolveDeployReleaseNote(options, runtime);
513
514
  const session$1 = await logger.task('正在校验 Heybox 登录态', () => (runtime.requireAuthSession ?? session.requireHeyboxAuthSession)({ loginBaseUrl }), { successText: 'Heybox 登录态有效' });
514
515
  logger.debug(`Heybox API: ${apiBaseUrl}`);
@@ -583,6 +584,9 @@ async function runDeployCommand(options, runtime = {}) {
583
584
  const distDir = path.join(projectRoot, 'dist');
584
585
  const parsedManifest = await readDeployManifest(projectRoot, logger);
585
586
  ({ manifest, version } = parsedManifest);
587
+ if (!declaredPlatforms || !runtimePermissionEnv.areMiniappPlatformsEqual(parsedManifest.platforms, declaredPlatforms)) {
588
+ throw new Error('dist/manifest.json.platforms 与 package.json#heybox.platforms 不一致,请重新 build 后再 deploy');
589
+ }
586
590
  if (version !== precheckVersion) {
587
591
  throw new Error(`dist/manifest.json.version (${version}) 与预检版本 (${precheckVersion}) 不一致,请重新 build 后再 deploy`);
588
592
  }
@@ -734,11 +738,11 @@ async function readDeployManifest(projectRoot, logger) {
734
738
  if (!runtimeGate.hasMiniappRuntimeGate(entryHtml)) {
735
739
  throw new Error('dist/index.html 缺少平台 Runtime 启动门禁,请在 Vite 配置中启用 miniappManifest() 后重新 build');
736
740
  }
737
- const { manifest, hadBom } = runtimeGate.parseMiniappManifestJson(await fs$1.readFile(manifestPath, 'utf8'), 'dist/manifest.json');
741
+ const { manifest, hadBom } = runtimePermissionEnv.parseMiniappManifestJson(await fs$1.readFile(manifestPath, 'utf8'), 'dist/manifest.json');
738
742
  if (hadBom) {
739
743
  logger.warn('dist/manifest.json 包含 BOM,已自动剥离');
740
744
  }
741
- const validated = runtimeGate.validateMiniappManifestForDeploy(manifest);
745
+ const validated = runtimePermissionEnv.validateMiniappManifestForDeploy(manifest);
742
746
  return {
743
747
  manifest: { ...manifest, platforms: validated.platforms },
744
748
  sdkVersion: validated.sdkVersion,
@@ -747,7 +751,7 @@ async function readDeployManifest(projectRoot, logger) {
747
751
  };
748
752
  }
749
753
  function validateVersionForDeploy(version, sourceLabel) {
750
- if (typeof version !== 'string' || !runtimeGate.isValidMiniappManifestVersion(version)) {
754
+ if (typeof version !== 'string' || !runtimePermissionEnv.isValidMiniappManifestVersion(version)) {
751
755
  throw new Error(`${sourceLabel} 必须是合法 SemVer,允许 prerelease,不允许 build metadata 和 0.0.0:${String(version)}`);
752
756
  }
753
757
  return version.trim();
@@ -1,109 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var runtimePermissionEnv = require('./runtime-permission-env-DdQtxdut.cjs');
4
-
5
- const MINIAPP_PLATFORM_VALUES = ['android', 'ios', 'ohos', 'windows', 'macos', 'linux'];
6
- function isValidMiniappManifestVersion(version) {
7
- return getMiniappManifestVersionError(version) === undefined;
8
- }
9
- function validateMiniappManifestVersion(version, sourceLabel = 'manifest.version') {
10
- const error = getMiniappManifestVersionError(version);
11
- if (error) {
12
- throw new Error(`${sourceLabel} ${error}`);
13
- }
14
- return String(version).trim();
15
- }
16
- function parseMiniappManifestJson(raw, sourceLabel = 'manifest.json') {
17
- const hadBom = raw.charCodeAt(0) === 0xfeff;
18
- const text = hadBom ? raw.slice(1) : raw;
19
- let parsed;
20
- try {
21
- parsed = JSON.parse(text);
22
- }
23
- catch (error) {
24
- throw new Error(`${sourceLabel} 不是合法 JSON:${formatReason(error)}`);
25
- }
26
- if (!isManifestRecord(parsed)) {
27
- throw new Error(`${sourceLabel} 必须是 JSON 对象`);
28
- }
29
- return {
30
- manifest: parsed,
31
- hadBom,
32
- };
33
- }
34
- function validateMiniappManifestForDeploy(manifest) {
35
- const version = validateMiniappManifestVersion(manifest.version, 'manifest.version');
36
- const sdkVersion = validateSdkVersion(manifest.sdkVersion, 'manifest.sdkVersion');
37
- const permissions = runtimePermissionEnv.parseMiniappPermissions(manifest.permissions, {
38
- present: Object.prototype.hasOwnProperty.call(manifest, 'permissions'),
39
- sdkVersion,
40
- sourceLabel: 'manifest.permissions',
41
- });
42
- return {
43
- version,
44
- sdkVersion,
45
- platforms: validateMiniappPlatforms(manifest.platforms, 'manifest.platforms'),
46
- ...(permissions.permissions === undefined ? {} : { permissions: permissions.permissions }),
47
- };
48
- }
49
- function validateMiniappPlatforms(platforms, sourceLabel = 'platforms') {
50
- if (!Array.isArray(platforms) || platforms.length === 0) {
51
- throw new Error(`${sourceLabel} 必须是非空平台数组`);
52
- }
53
- const allowedPlatforms = new Set(MINIAPP_PLATFORM_VALUES);
54
- const seen = new Set();
55
- for (const platform of platforms) {
56
- if (typeof platform !== 'string' || !allowedPlatforms.has(platform)) {
57
- throw new Error(`${sourceLabel} 包含不支持的平台:${String(platform)}`);
58
- }
59
- if (seen.has(platform)) {
60
- throw new Error(`${sourceLabel} 包含重复平台:${platform}`);
61
- }
62
- seen.add(platform);
63
- }
64
- return Object.freeze(MINIAPP_PLATFORM_VALUES.filter((platform) => seen.has(platform)));
65
- }
66
- function validateSdkVersion(version, sourceLabel = 'sdkVersion') {
67
- if (typeof version !== 'string' || version.trim() === '') {
68
- throw new Error(`${sourceLabel} 必须是合法 SemVer:${String(version)}`);
69
- }
70
- const normalized = version.trim();
71
- const parsed = runtimePermissionEnv.semverExports.parse(normalized);
72
- if (!parsed || parsed.version !== normalized || parsed.build.length > 0) {
73
- throw new Error(`${sourceLabel} 必须是合法 SemVer:${normalized}`);
74
- }
75
- return normalized;
76
- }
77
- function isManifestRecord(value) {
78
- return typeof value === 'object' && value !== null && !Array.isArray(value);
79
- }
80
- function getMiniappManifestVersionError(version) {
81
- if (typeof version !== 'string' || version.trim() === '') {
82
- return `必须是合法 SemVer:${String(version)}`;
83
- }
84
- const normalized = version.trim();
85
- const parsed = runtimePermissionEnv.semverExports.parse(normalized);
86
- if (!parsed) {
87
- return `必须是合法 SemVer:${normalized}`;
88
- }
89
- if (parsed.build.length > 0) {
90
- return `不能包含 build metadata:${normalized}`;
91
- }
92
- if (parsed.version !== normalized) {
93
- return `必须是合法 SemVer:${normalized}`;
94
- }
95
- if (parsed.major === 0 && parsed.minor === 0 && parsed.patch === 0) {
96
- return '不能是模板默认版本 0.0.0';
97
- }
98
- return undefined;
99
- }
100
- function formatReason(error) {
101
- if (error instanceof Error && error.message) {
102
- return error.message;
103
- }
104
- return String(error);
105
- }
106
-
107
3
  const UNDEFINED_CODE_POINTS = new Set([
108
4
  65534, 65535, 131070, 131071, 196606, 196607, 262142, 262143, 327678, 327679, 393214,
109
5
  393215, 458750, 458751, 524286, 524287, 589822, 589823, 655358, 655359, 720894,
@@ -8390,6 +8286,3 @@ function walk(node, visit) {
8390
8286
  }
8391
8287
 
8392
8288
  exports.hasMiniappRuntimeGate = hasMiniappRuntimeGate;
8393
- exports.isValidMiniappManifestVersion = isValidMiniappManifestVersion;
8394
- exports.parseMiniappManifestJson = parseMiniappManifestJson;
8395
- exports.validateMiniappManifestForDeploy = validateMiniappManifestForDeploy;