@heybox/hb-sdk 0.5.17 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +46 -25
  2. package/dist/cli-chunks/{create-CPIjDM-n.cjs → create-DYb53EQ-.cjs} +1 -1
  3. package/dist/cli-chunks/{dev-Cr2u9ajy.cjs → dev-CPKTuA6q.cjs} +35 -6
  4. package/dist/cli-chunks/{doctor-mIgvLfLl.cjs → doctor-TshFvqHC.cjs} +1 -1
  5. package/dist/cli-chunks/{index-Dor8wa6R.cjs → index-CCeHouBU.cjs} +269 -17
  6. package/dist/cli-chunks/{index-DHWEoki_.cjs → index-NOO3q8_C.cjs} +3 -3
  7. package/dist/cli-chunks/{login-B63QgKed.cjs → login-DtXHSm8R.cjs} +2 -2
  8. package/dist/cli-chunks/remote-BWfn7qIN.cjs +9915 -0
  9. package/dist/cli-chunks/{context-mav2gs13.cjs → sdk-version-policy-B1CFC1Dk.cjs} +122 -1
  10. package/dist/cli-chunks/{session-BMSThs93.cjs → session-DIcRjyDY.cjs} +4 -54
  11. package/dist/cli.cjs +1 -1
  12. package/dist/devtools/mock-host/index.html +40 -0
  13. package/dist/devtools/mock-host/main.js +85 -0
  14. package/dist/index.cjs.js +232 -4
  15. package/dist/index.esm.js +233 -3
  16. package/dist/miniapp-publish.cjs.js +4 -0
  17. package/dist/miniapp-publish.esm.js +4 -1
  18. package/dist/protocol.cjs.js +9 -0
  19. package/dist/protocol.esm.js +7 -1
  20. package/dist/vite.cjs.js +9159 -22
  21. package/dist/vite.esm.js +9159 -23
  22. package/package.json +19 -7
  23. package/skill/SKILL.md +23 -23
  24. package/skill/references/api-protocol.md +11 -2
  25. package/skill/references/api-root.md +145 -19
  26. package/skill/references/cli.md +29 -14
  27. package/skill/references/recipes.md +12 -44
  28. package/skill/references/safety-boundaries.md +1 -2
  29. package/skill/scripts/sync-references.mjs +2 -2
  30. package/skill/skill.json +4 -4
  31. package/types/cli/auth/base-url.d.ts +20 -0
  32. package/types/cli/config.d.ts +11 -0
  33. package/types/core/client.d.ts +7 -0
  34. package/types/core/csp-violation.d.ts +5 -0
  35. package/types/core/history-observer.d.ts +4 -0
  36. package/types/core/version.d.ts +2 -0
  37. package/types/index.d.ts +0 -2
  38. package/types/miniapp-manifest/schema.d.ts +6 -1
  39. package/types/miniapp-manifest/sdk-version-policy.d.ts +9 -0
  40. package/types/miniapp-publish/index.d.ts +1 -0
  41. package/types/protocol/constants.d.ts +6 -0
  42. package/types/protocol/types.d.ts +45 -0
  43. package/types/protocol.d.ts +2 -2
  44. package/types/vite/html-policy.d.ts +4 -0
  45. package/types/vite/index.d.ts +23 -3
  46. package/types/vite/runtime-gate.d.ts +5 -0
  47. package/types/vite/sdk-version-gate.d.ts +8 -0
  48. package/dist/cli-chunks/remote-Dksa9s5M.cjs +0 -1603
package/README.md CHANGED
@@ -332,7 +332,7 @@ await network.request({
332
332
 
333
333
  ## 生命周期事件
334
334
 
335
- SDK 实例创建后会自动开始与父容器握手。使用 `on()` 监听父容器派发的小程序事件时,默认单例会被懒创建并自动开始握手;`on()` 会返回取消监听函数,组件卸载或页面销毁时应及时调用。
335
+ 导入 SDK 根包时会 eager 创建唯一默认实例并立即开始与父容器握手。使用 `on()` 监听父容器派发的小程序事件时不会创建第二个实例;`on()` 会返回取消监听函数,组件卸载或页面销毁时应及时调用。
336
336
 
337
337
  ```ts
338
338
  import { on } from '@heybox/hb-sdk';
@@ -390,7 +390,7 @@ try {
390
390
  | `hb-sdk remote bind <mini-program-id> [--force]` | 校验当前 CLI 用户可管理目标小程序后,再把它绑定到当前项目。 |
391
391
  | `hb-sdk remote info` | 查看当前项目绑定的小程序详情及完整只读 Runtime 权限/config。 |
392
392
  | `hb-sdk remote allowlist list/add/remove/set ...` | 管理绑定小程序的预览白名单。 |
393
- | `hb-sdk remote deploy --release-note <text> [--skip-build \| --from-version <version>] [--auto-publish]` | 构建、上传并提交当前小程序版本审核;`--skip-build` 跳过 build 直接上传 `dist/`,`--from-version` 复用指定历史版本产物。 |
393
+ | `hb-sdk remote deploy --release-note <text> [--from-version <version>] [--auto-publish]` | 构建、上传并提交当前小程序版本审核;`--from-version` 复用指定历史版本产物。 |
394
394
  | `hb-sdk remote versions` | 列出绑定小程序的远端版本。 |
395
395
  | `hb-sdk remote preview <version>` | 查看指定版本的远端预览入口。 |
396
396
  | `hb-sdk remote release <version> [--yes]` | 发布审核通过的版本;非 TTY 环境必须传 `--yes`。 |
@@ -431,23 +431,20 @@ try {
431
431
  1. 校验 `heybox.miniProgramId`、发布日志和登录态。
432
432
  2. 读取服务端 current entity 和绑定小程序详情,确认 `detail.entity_id` 与 current entity 一致;主体不一致时直接失败,不触发 precheck、build、upload 或 submit audit。
433
433
  3. 普通 remote deploy 读取 `package.json.version`,主体校验通过后、build 前调用 `/mall/developer/user_miniprogram/version/precheck`,入参为 `mini_program_id`、`version`、`release_note`、`auto_publish`。
434
- 4. 触发 `<pm> run build`,除非使用 `--skip-build`。
435
- 5. 解析 `dist/manifest.json`,校验 `version` `x.y.z`,自动剥离 BOM;普通 remote deploy 要求该版本与 precheck 使用的 `package.json.version` 一致。
436
- 6. `--skip-build` 会先读取已有 `dist/manifest.json.version`,再调用 precheck。
437
- 7. `--from-version <version>` 会跳过本地 build、`dist/` 读取和 CDN 上传,直接让远端复用指定历史版本产物提交审核;它与 `--skip-build` 互斥。
438
- 8. 遍历 `dist/` 文件,跳过 `manifest.json`、`.DS_Store`、`.map`;遇到 symlink 或 `node_modules` 直接报错。
439
- 9. 校验所有上传路径长度不超过 64,并在任何上传请求发生前限制实际上传产物总大小不超过 100MiB。错误提示中使用 `100MB`,方便开发者理解。
440
- 10. 上传信息、上传凭证和上传回调按批次执行,每批最多 50 个文件;批次串行,批内保持 4 并发上传到 COS。CLI 会校验 CDN 上传信息接口返回的 key 与本地期望 key 完全一致,异常时停止后续批次且不提交审核。
441
- 11. 默认只展示上传阶段和文件总数,例如 `正在上传 137/244 个文件`;`--verbose` 会展示并发数、批次数、当前批次、bucket / region 和逐文件结果,但不会输出 keys、签名、cookie、pkey、token 或临时密钥。
442
- 12. 全部上传成功后调用 `/mall/developer/user_miniprogram/version/submit_audit`;`--from-version` 路径会直接调用提交审核接口并传入 `source_version`。CLI 输出提交审核成功、发布策略和可用的 preview URL;后端原始失败细节只在 `--verbose` 下展示。
434
+ 4. 触发 `<pm> run build`。
435
+ 5. 解析 `dist/manifest.json`,校验 `version` 与自动生成的 `sdkVersion` 均为合法 SemVer,自动剥离 BOM;普通 remote deploy 要求业务版本与 precheck 使用的 `package.json.version` 一致。
436
+ 6. `--from-version <version>` 会跳过本地 build、`dist/` 读取和 CDN 上传,直接让远端复用指定历史版本产物提交审核。
437
+ 7. 遍历 `dist/` 文件,跳过 `manifest.json`、`.DS_Store`、`.map`;遇到 symlink `node_modules` 直接报错。
438
+ 8. 校验所有上传路径长度不超过 64,并在任何上传请求发生前限制实际上传产物总大小不超过 100MiB。错误提示中使用 `100MB`,方便开发者理解。
439
+ 9. 上传信息、上传凭证和上传回调按批次执行,每批最多 50 个文件;批次串行,批内保持 4 并发上传到 COS。CLI 会校验 CDN 上传信息接口返回的 key 与本地期望 key 完全一致,异常时停止后续批次且不提交审核。
440
+ 10. 默认只展示上传阶段和文件总数,例如 `正在上传 137/244 个文件`;`--verbose` 会展示并发数、批次数、当前批次、bucket / region 和逐文件结果,但不会输出 keys、签名、cookie、pkey、token 或临时密钥。
441
+ 11. 全部上传成功后调用 `/mall/developer/user_miniprogram/version/submit_audit`;`--from-version` 路径会直接调用提交审核接口并传入 `source_version`。CLI 输出提交审核成功、发布策略和可用的 preview URL;后端原始失败细节只在 `--verbose` 下展示。
443
442
 
444
443
  默认 `auto_publish=false`,审核通过后使用 `hb-sdk remote versions` 查看版本状态,再用 `hb-sdk remote release <version>` 发布;使用 `--auto-publish` 时提交 `auto_publish=true`,审核通过后自动发布。未发布候选版本可通过 `hb-sdk remote allowlist add <heybox_id>` 加入预览白名单,让指定用户在广场看到;正式入口使用 `mini_program_id`,`mini_url` 仅用于本地调试。
445
444
 
446
- `--skip-build` 用于 CI 双阶段:上一步已经 build 完缓存好了 `dist/`,本步只做预检、上传和提交审核。`dist/manifest.json` 或 `dist/index.html` 缺失会立即报错。
445
+ `--from-version <version>` 用于复用已经上传过的远端历史版本产物提交新一轮审核。该模式不读取本地 `dist/`,也不会执行 build 或上传;目标审核版本由服务端根据版本表最高 SemVer 自动派生。
447
446
 
448
- `--from-version <version>` 用于复用已经上传过的远端历史版本产物提交新一轮审核。该模式不读取本地 `dist/`,也不会执行 build 或上传;目标审核版本由服务端根据版本表最高 SemVer 自动派生。不要和 `--skip-build` 同时使用。
449
-
450
- `manifest.json` 不会上传到 CDN,只作为 submit audit 请求的 `manifest` 字段提交。这与 Vite 插件文档中的契约一致。名称、icon 和介绍图从 `package.json.heybox.miniProgramProfile` 读取,并随 precheck 和 submit audit 一起提交:
447
+ `manifest.json` 不会上传到 CDN,只作为 submit audit 请求的 `manifest` 字段提交。`sdkVersion` SDK 构建自动生成,业务配置不能覆盖;复用历史 Version Artifact 时继续使用源 Artifact 的 `sdkVersion`。名称、icon 和介绍图从 `package.json.heybox.miniProgramProfile` 读取,并随 precheck 和 submit audit 一起提交:
451
448
 
452
449
  ```json
453
450
  {
@@ -473,10 +470,27 @@ hb-sdk login --login-base-url https://login.test.xiaoheihe.cn
473
470
  hb-sdk remote deploy --api-base-url https://api.test.xiaoheihe.cn --login-base-url https://login.test.xiaoheihe.cn --release-note "测试环境验证"
474
471
  hb-sdk remote deploy --verbose --api-base-url https://api.test.xiaoheihe.cn --login-base-url https://login.test.xiaoheihe.cn --release-note "排查预检失败"
475
472
 
476
- HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1 hb-sdk remote deploy --api-base-url http://127.0.0.1:8080 --release-note "本地后台联调"
473
+ HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1 hb-sdk remote deploy --api-base-url http://127.0.1:8080 --release-note "本地后台联调"
474
+ ```
475
+
476
+ 切换测试环境时往往需要同时配置后台 host、登录 host 和 service tag。为避免每条命令都重复书写这些 env/flag,CLI 支持加载 `.env.<name>` 预设:
477
+
478
+ ```bash
479
+ # 在项目根准备 .env.test(可提交当团队默认,或 gitignore 仅本地保留)
480
+ # HB_SDK_API_BASE_URL=https://api.test.xiaoheihe.cn
481
+ # HB_SDK_LOGIN_BASE_URL=https://login.test.xiaoheihe.cn
482
+ # HB_SDK_SERVICE_TAG=my-test-tag
483
+
484
+ hb-sdk remote deploy --env test --release-note "测试环境验证" # 一次加载三项配置
485
+ hb-sdk remote info --env test # 复用同一预设
486
+ HB_SDK_ENV=test hb-sdk remote versions # 环境变量形式,CI 友好
487
+ hb-sdk remote deploy --env-file .env.local --release-note "本地联调" # 显式指定文件路径
488
+ hb-sdk remote deploy --env test --service-tag other-tag --release-note "灰度" # 单项 flag 覆盖预设
477
489
  ```
478
490
 
479
- `--api-base-url` 优先于 `HB_SDK_API_BASE_URL`,影响 `hb-sdk remote` 里的远端平台后台 API,包括预检、CDN 上传凭证/回调、提交审核、版本、发布、撤回、下架、重新上架、详情和白名单等调用;`--login-base-url` 优先于 `HB_SDK_LOGIN_BASE_URL`,用于 `hb-sdk login` 的登录入口,以及 remote 命令前校验当前 CLI 登录态是否属于同一个登录环境。仓库内开发可在 `packages/hb-sdk/src/cli/config.ts` 里按 `@heybox/hb-types` `RylaiServiceTagConfig` 配置 `default_tag` 或 path-prefix 级 `special_tag`,给 Heybox 后台请求附加 `x-rylai-service-tag` header,并复用命中的 tag 追加 `special_tag` 请求参数,用于开发环境路由或灰度验证。自定义地址只接受 origin,不允许包含 path、query hash;API origin 默认还必须是 Heybox 受信 HTTPS 域名,只有本地联调等场景可显式使用 `--allow-unsafe-api-base-url` `HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1` 放开。日志只输出 origin,不输出带身份和签名参数的完整请求 URL。`hb-sdk doctor`、npm latest 检查、mock host 的 `network.request()` 不受这些配置影响。
491
+ `--env <name>` 会读取项目根下的 `.env.<name>`,`--env-file <path>` 显式指定路径且优先级高于 `--env`;两者也可通过 `HB_SDK_ENV=<name>` 触发。加载遵循 dotenv 惯例:不覆盖进程已有的同名变量,因此 CI 或命令行显式设置的值优先。使用 `--env <name>` `HB_SDK_ENV=<name>` 执行 `remote deploy` 时,CLI 还会把同一个 `name` 作为 `--mode <name>` 传给项目 build,使 CLI 后端环境与 Vite mode 保持一致。文件仅支持 `KEY=VALUE`、空行和 `#` 注释,不做变量插值;文件不存在时静默跳过。`--verbose` 会打印生效的文件路径和被跳过的 key。
492
+
493
+ `--api-base-url` 优先于 `HB_SDK_API_BASE_URL`,影响 `hb-sdk remote` 里的远端平台后台 API,包括预检、CDN 上传凭证/回调、提交审核、版本、发布、撤回、下架、重新上架、详情和白名单等调用;`--login-base-url` 优先于 `HB_SDK_LOGIN_BASE_URL`,用于 `hb-sdk login` 的登录入口,以及 remote 命令前校验当前 CLI 登录态是否属于同一个登录环境。`--service-tag <tag>` 优先于 `HB_SDK_SERVICE_TAG`,给 Heybox 后台请求附加 `x-rylai-service-tag` header,并复用命中的 tag 追加 `special_tag` 请求参数,用于开发环境路由或灰度验证。deploy 子构建会继承 `.env.<name>` 中的 `HB_SDK_SERVICE_TAG`,Vite 最低 SDK 版本门禁请求也会同时携带该 header 和 query;仓库内开发也可继续在 `packages/hb-sdk/src/cli/config.ts` 里按 `@heybox/hb-types` 的 `RylaiServiceTagConfig` 配置 path-prefix 级 `special_tag`。自定义地址只接受 origin,不允许包含 path、query 或 hash;API origin 默认还必须是 Heybox 受信 HTTPS 域名,只有本地联调等场景可显式使用 `--allow-unsafe-api-base-url` 或 `HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1` 放开。日志只输出 origin,不输出带身份和签名参数的完整请求 URL。`hb-sdk doctor`、npm latest 检查、mock host 的 `network.request()` 不受这些配置影响。
480
494
 
481
495
  ## hb-sdk remote 命令参考
482
496
 
@@ -496,7 +510,7 @@ HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1 hb-sdk remote deploy --api-base-url http://12
496
510
  | `hb-sdk remote allowlist add <heybox-id...>` | 添加十进制 Heybox ID 到预览白名单。 |
497
511
  | `hb-sdk remote allowlist remove <heybox-id...>` | 从预览白名单移除非 owner 条目。 |
498
512
  | `hb-sdk remote allowlist set <heybox-id...>` | 替换非 owner 白名单条目,并保留平台返回的 owner 语义。 |
499
- | `hb-sdk remote deploy --release-note <text> [--skip-build \| --from-version <version>] [--auto-publish]` | 构建、上传或复用历史产物并提交当前版本审核。 |
513
+ | `hb-sdk remote deploy --release-note <text> [--from-version <version>] [--auto-publish]` | 构建、上传或复用历史产物并提交当前版本审核。 |
500
514
  | `hb-sdk remote versions` | 列出当前绑定小程序的远端版本。 |
501
515
  | `hb-sdk remote preview <version>` | 查看指定版本的远端预览入口。 |
502
516
  | `hb-sdk remote release <version> [--yes]` | 发布审核通过的版本;交互式终端会确认,非 TTY 必须传 `--yes`。 |
@@ -518,14 +532,13 @@ CLI 登录态只供 CLI 命令访问黑盒接口时复用,不会注入 iframe
518
532
 
519
533
  ## 能力边界
520
534
 
521
- - SDK 实例创建后会自动开始握手;默认单例仍按需懒创建,`ready()`、`on()` 或任意模块能力调用都会创建默认单例并开始握手。
535
+ - 导入 SDK 根包时会 eager 创建唯一默认实例并立即开始握手;`ready()` 只等待这次握手结果。
522
536
  - `ready()` 只等待已有握手结果,不主动触发新的握手;调用模块能力前会自动等待 `ready()`,但业务仍建议在页面启动阶段显式 `await ready()`,便于集中处理握手失败。
523
537
  - `user.getInfo()`、`user.getCurrentUserDetail()`、`user.getCurrentUserProfile()`、`user.getPlatformAccountOverview()`、`user.getPlatformAccountInfo(platform)` 和 `user.getSteamGameList(options)` 不会触发登录;登录必须由业务在用户操作后调用 `auth.login()`。
524
538
  - 当前用户详情和平台账号 API 只允许读取当前登录用户,不支持传入 `userid` 查询其他人,也不透传 `/account/home_v2/` 原始响应。
525
539
  - 分享、截图、UI、设备、导航、storage 和网络请求只开放稳定窄接口,不透传黑盒客户端内部协议参数。
526
540
  - `network.request()` 的 `validateStatus` 只在 SDK 本地执行,不会被序列化给父容器。
527
541
  - `on()` 返回取消监听函数;组件卸载或页面销毁时应主动取消监听。
528
- - 使用 `createMiniProgramSDK()` 创建独立实例后,不再需要时应调用 `destroy()`。
529
542
  - 构建产物可以包含 `dist/manifest.json`,业务代码不应自行 fetch 已部署的 manifest;这个文件由发布流水线读取并上送后台。
530
543
 
531
544
  ## Manifest
@@ -534,11 +547,12 @@ CLI 登录态只供 CLI 命令访问黑盒接口时复用,不会注入 iframe
534
547
 
535
548
  ```json
536
549
  {
537
- "version": "1.2.3"
550
+ "version": "1.2.3",
551
+ "sdkVersion": "0.6.0"
538
552
  }
539
553
  ```
540
554
 
541
- `version` 来自小程序项目自身的 `package.json.version`。`hb-sdk create` 生成的模板默认已注册插件;现有 Vite 项目可以在 `vite.config.ts` 中手动接入:
555
+ `version` 来自小程序项目自身的 `package.json.version`,`sdkVersion` 来自当前安装 SDK 的构建版本且不能由业务覆盖。`hb-sdk create` 生成的模板默认已注册插件;现有 Vite 项目可以在 `vite.config.ts` 中手动接入:
542
556
 
543
557
  ```ts
544
558
  import { miniappManifest } from '@heybox/hb-sdk/vite';
@@ -552,12 +566,18 @@ export default defineConfig({
552
566
 
553
567
  `base: './'` 用于让构建产物里的 JS/CSS/图片资源以 `./assets/...` 相对路径引用,避免小程序资源目录不是站点根路径时访问 `/assets/...` 失败。若没有显式配置 `base`,`miniappManifest()` 也会在 build 时默认补成 `./`。
554
568
 
569
+ 工坊小程序构建产物只能在兼容的小黑盒 Runtime 中启动。普通浏览器直接打开时不会执行标准业务脚本,并会提示在小黑盒 APP 内打开。项目应使用标准 Vite module 入口。
570
+
571
+ 插件只接受单页应用:输出目录只能存在入口 `index.html`。build 会用结构化 HTML parser 校验入口,并把平台 CSP 插入 `<head>` 首位;已有 CSP 会原样保留,两份策略按浏览器交集生效。正式策略禁止 `fetch`、XHR、WebSocket、EventSource、Beacon、Worker、iframe、表单和对象加载等浏览器原生出口;业务网络请求应使用 `network.request()`。dev 使用相同策略,只额外放行当前 Vite 的精确 HMR WebSocket 地址。
572
+
573
+ meta refresh、外部 anchor、`dns-prefetch`、`preconnect`、`prerender`、外部资源 URL 和额外 HTML 会使 build 失败。内联 script/style 允许,但 `unsafe-eval` 不允许。`dev`、build 和 deploy 会读取 `/user_miniprogram/public/sdk_config` 的 `minimumSdkVersion`;最新请求失败时只回退当前 Remote Environment 下 24 小时内的有效缓存,无缓存则默认阻断并提示升级 `@heybox/hb-sdk@latest`。
574
+
555
575
  失败与警告语义:
556
576
 
557
577
  - 读取 `package.json` 失败或 JSON 解析失败:`vite build` 直接失败,并输出具体原因。
558
578
  - `package.json.version` 不是非空字符串:`vite build` 直接失败。
559
- - `package.json.version` 仍是模板默认值 `0.0.0`:`vite build` 输出 warning 并写入 manifest;`hb-sdk remote deploy` 会拒绝发布,必须改成实际 `x.y.z` 版本。
560
- - 版本号不满足极简 semver 形态 `x.y.z`:只输出 Rollup/Vite warning,仍会写入 manifest。
579
+ - `package.json.version` 仍是模板默认值 `0.0.0`:`vite build` 直接失败,必须改成实际 SemVer。
580
+ - 版本号不是严格 SemVer、包含 build metadata 或缺少 `sdkVersion`:build/deploy 直接失败。
561
581
 
562
582
  `manifest.json` 不部署到 CDN,只交给发布流水线读取后上送后台;Host 通过后台 API 间接读取版本信息。第一阶段只支持 Vite 项目,非 Vite 打包器未来通过其他子入口扩展。
563
583
 
@@ -569,7 +589,6 @@ export default defineConfig({
569
589
 
570
590
  - `ready`、`on`、`off`
571
591
  - `auth`、`user`、`share`、`viewport`、`storage`、`cloud`、`network`、`ui`、`device`、`navigation`
572
- - `createMiniProgramSDK`、`MiniProgramSDK`
573
592
  - `HbMiniProgramSDKError`、`HbMiniProgramNetworkError`
574
593
  - 各模块公开类型,例如 `MiniProgramNetworkRequestConfig`、`MiniProgramNetworkResponse`、`MiniProgramUserInfoResult`
575
594
 
@@ -577,6 +596,8 @@ export default defineConfig({
577
596
 
578
597
  构建时插件 `miniappManifest` 通过 `@heybox/hb-sdk/vite` 子入口导出,仅供 `vite.config.ts` 使用,不应在小程序业务代码里 import。
579
598
 
599
+ 从 0.5 升级时请阅读 [0.6 迁移说明](./docs/migration-0.6.md)。
600
+
580
601
  ## 本仓库开发
581
602
 
582
603
  ```bash
@@ -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-Dor8wa6R.cjs');
8
+ var index = require('./index-CCeHouBU.cjs');
9
9
  require('node:module');
10
10
  require('os');
11
11
  require('readline');
@@ -9,8 +9,9 @@ var node_url = require('node:url');
9
9
  var net = require('node:net');
10
10
  var node_http = require('node:http');
11
11
  var browser = require('./browser-RAy8e8cV.cjs');
12
- var index = require('./index-Dor8wa6R.cjs');
13
- var context = require('./context-mav2gs13.cjs');
12
+ var index = require('./index-CCeHouBU.cjs');
13
+ var sdkVersionPolicy = require('./sdk-version-policy-B1CFC1Dk.cjs');
14
+ var session = require('./session-DIcRjyDY.cjs');
14
15
  require('node:process');
15
16
  require('node:buffer');
16
17
  require('node:util');
@@ -24,7 +25,6 @@ require('events');
24
25
  require('stream');
25
26
  require('buffer');
26
27
  require('util');
27
- require('./session-BMSThs93.cjs');
28
28
  require('node:crypto');
29
29
  require('fs');
30
30
  require('constants');
@@ -599,6 +599,7 @@ function readErrorMessage(error) {
599
599
 
600
600
  const MINI_PROGRAM_URL_QUERY_PARAM = 'mini_url';
601
601
  const MINI_PROGRAM_RUNTIME_URL_QUERY_PARAM = 'runtime_url';
602
+ const MINI_PROGRAM_SDK_VERSION_QUERY_PARAM = 'sdk_version';
602
603
  const MINI_PROGRAM_DEV_SHELL_URL = 'heybox-mini-dev://sandbox';
603
604
  const OPEN_IN_APP_URL = 'https://api.xiaoheihe.cn/open_inapp/';
604
605
  function createMacAppProtocol(appUrl, options = {}) {
@@ -636,6 +637,10 @@ function createPartiallyEncodedMiniProgramDevShellUrl(appUrl, options) {
636
637
  if (hasRuntimeUrl(options.runtimeUrl)) {
637
638
  devShellUrl += `&${MINI_PROGRAM_RUNTIME_URL_QUERY_PARAM}=${encodeURIComponent(options.runtimeUrl)}`;
638
639
  }
640
+ const sdkVersion = options.sdkVersion?.trim();
641
+ if (sdkVersion) {
642
+ devShellUrl += `&${MINI_PROGRAM_SDK_VERSION_QUERY_PARAM}=${encodeURIComponent(sdkVersion)}`;
643
+ }
639
644
  return devShellUrl;
640
645
  }
641
646
  function createEncodedMiniProgramDevShellUrl(appUrl, options) {
@@ -648,6 +653,10 @@ function createEncodedMiniProgramDevShellUrl(appUrl, options) {
648
653
  if (hasRuntimeUrl(options.runtimeUrl)) {
649
654
  devShellUrl.searchParams.set(MINI_PROGRAM_RUNTIME_URL_QUERY_PARAM, options.runtimeUrl);
650
655
  }
656
+ const sdkVersion = options.sdkVersion?.trim();
657
+ if (sdkVersion) {
658
+ devShellUrl.searchParams.set(MINI_PROGRAM_SDK_VERSION_QUERY_PARAM, sdkVersion);
659
+ }
651
660
  return devShellUrl.toString();
652
661
  }
653
662
  function hasRuntimeUrl(runtimeUrl) {
@@ -657,6 +666,11 @@ function createHeyboxProtocol(payload) {
657
666
  return `heybox://${encodeURIComponent(JSON.stringify(payload))}`;
658
667
  }
659
668
 
669
+ /** 构建时替换为当前发布包的实际版本。 */
670
+ const HB_SDK_VERSION = typeof undefined === 'string'
671
+ ? undefined
672
+ : '0.6.0';
673
+
660
674
  const DEFAULT_APP_PORT = 5173;
661
675
  const DEFAULT_MOCK_PORT = 5174;
662
676
  const DEV_LISTEN_HOST = '0.0.0.0';
@@ -667,6 +681,13 @@ const VITE_LOG_LEVEL = 'warn';
667
681
  async function runDevCommand(options, runtime = {}) {
668
682
  const logger = runtime.logger ?? index.createCliLogger();
669
683
  const fetchImpl = runtime.fetchImpl ?? fetch;
684
+ const environment = session.resolveHeyboxApiBaseUrl({ env: runtime.env });
685
+ await (runtime.enforceRemoteSdkVersion ?? sdkVersionPolicy.enforceRemoteSdkVersion)({
686
+ sdkVersion: HB_SDK_VERSION,
687
+ environment,
688
+ fetchImpl,
689
+ allowPrerelease: true,
690
+ });
670
691
  const openUrl = runtime.openExternalUrl ?? browser.openExternalUrl;
671
692
  const networkInterfaceSnapshot = (runtime.networkInterfaces ?? os.networkInterfaces)();
672
693
  const getPortImpl = runtime.getPort ?? getPorts;
@@ -678,6 +699,7 @@ async function runDevCommand(options, runtime = {}) {
678
699
  });
679
700
  const resolvedOptions = {
680
701
  ...options,
702
+ hmrHost: createLanInterfaceCandidates(networkInterfaceSnapshot)[0]?.address,
681
703
  port: appPort,
682
704
  };
683
705
  const projectRoot = findProjectRoot(runtime.cwd ?? process.cwd());
@@ -697,9 +719,11 @@ async function runDevCommand(options, runtime = {}) {
697
719
  });
698
720
  const lanAddresses = createLanAddressCandidates({
699
721
  appUrl,
722
+ hmrHost: resolvedOptions.hmrHost,
700
723
  interfaces: networkInterfaceSnapshot,
701
724
  miniProgramId: devLaunchContext.miniProgramId,
702
725
  runtimeUrl: options.runtimeUrl,
726
+ sdkVersion: HB_SDK_VERSION,
703
727
  viteNetworkUrls: appServer.resolvedUrls?.network ?? [],
704
728
  });
705
729
  const closers = [() => appServer.close()];
@@ -715,6 +739,7 @@ async function runDevCommand(options, runtime = {}) {
715
739
  ? createMacAppProtocol(appUrl, {
716
740
  miniProgramId: devLaunchContext.miniProgramId,
717
741
  runtimeUrl: options.runtimeUrl,
742
+ sdkVersion: HB_SDK_VERSION,
718
743
  })
719
744
  : undefined,
720
745
  nativeAppLaunchUnavailableReason: devLaunchContext.nativeAppLaunchUnavailableReason,
@@ -746,14 +771,14 @@ async function runDevCommand(options, runtime = {}) {
746
771
  installShutdownHandlers(closers, runtime.process ?? process);
747
772
  }
748
773
  async function loadDevLaunchContext(options) {
749
- const miniProgramId = await context.readBoundMiniProgramId(options.projectRoot);
774
+ const miniProgramId = await sdkVersionPolicy.readBoundMiniProgramId(options.projectRoot);
750
775
  if (!miniProgramId) {
751
776
  const nativeAppLaunchUnavailableReason = '当前项目未绑定小程序。请先运行 hb-sdk remote create 或 hb-sdk remote bind <mini-program-id>。';
752
777
  options.logger.warn(`未读取到远端 Runtime 权限,Mock runtime 将默认拒绝受管能力:${nativeAppLaunchUnavailableReason}`);
753
778
  return { nativeAppLaunchUnavailableReason };
754
779
  }
755
780
  try {
756
- const { detail, miniProgramId: verifiedMiniProgramId } = await options.logger.task('正在读取远端小程序权限', () => context.getBoundMiniProgram({
781
+ const { detail, miniProgramId: verifiedMiniProgramId } = await options.logger.task('正在读取远端小程序权限', () => sdkVersionPolicy.getBoundMiniProgram({
757
782
  cwd: options.projectRoot,
758
783
  env: options.env,
759
784
  fetchImpl: options.fetchImpl,
@@ -771,7 +796,7 @@ async function loadDevLaunchContext(options) {
771
796
  }
772
797
  }
773
798
  function canFallbackToDefaultRuntimePermissions(error) {
774
- if (error instanceof context.MiniProgramProjectBindingError) {
799
+ if (error instanceof sdkVersionPolicy.MiniProgramProjectBindingError) {
775
800
  return error.code === 'MINI_PROGRAM_UNBOUND';
776
801
  }
777
802
  if (error instanceof TypeError && error.message === 'fetch failed') {
@@ -822,6 +847,7 @@ function createViteServerOptions(projectRoot, options) {
822
847
  cors: true,
823
848
  hmr: {
824
849
  clientPort: options.port ?? DEFAULT_APP_PORT,
850
+ ...(options.hmrHost ? { host: options.hmrHost } : {}),
825
851
  },
826
852
  host: DEV_LISTEN_HOST,
827
853
  port: options.port ?? DEFAULT_APP_PORT,
@@ -972,6 +998,7 @@ function createLanAddressCandidates(options) {
972
998
  .map((url) => [readUrlHost(url), url])
973
999
  .filter((entry) => Boolean(entry[0])));
974
1000
  const candidates = createLanInterfaceCandidates(options.interfaces)
1001
+ .filter(({ address }) => address === options.hmrHost)
975
1002
  .map(({ address, id, name }) => {
976
1003
  const appUrl = viteNetworkUrlByHost.get(address) ?? replaceUrlHost(options.appUrl, address);
977
1004
  if (!appUrl) {
@@ -988,11 +1015,13 @@ function createLanAddressCandidates(options) {
988
1015
  candidate.mobileAppQrPayload = createMobileAppQrPayload(appUrl, {
989
1016
  miniProgramId: options.miniProgramId,
990
1017
  runtimeUrl,
1018
+ sdkVersion: options.sdkVersion,
991
1019
  });
992
1020
  }
993
1021
  else {
994
1022
  candidate.mobileAppQrPayload = createMobileAppQrPayload(appUrl, {
995
1023
  miniProgramId: options.miniProgramId,
1024
+ sdkVersion: options.sdkVersion,
996
1025
  });
997
1026
  }
998
1027
  return candidate;
@@ -4,7 +4,7 @@ var fs$1 = require('node:fs');
4
4
  var fs = require('node:fs/promises');
5
5
  var os = require('node:os');
6
6
  var path = require('node:path');
7
- var index = require('./index-Dor8wa6R.cjs');
7
+ var index = require('./index-CCeHouBU.cjs');
8
8
  require('node:module');
9
9
  require('path');
10
10
  require('os');