@heybox/hb-sdk 0.5.18 → 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.
- package/README.md +29 -25
- package/dist/cli-chunks/{create-OZOIdeBz.cjs → create-DYb53EQ-.cjs} +1 -1
- package/dist/cli-chunks/{dev-DXz8izSJ.cjs → dev-CPKTuA6q.cjs} +35 -6
- package/dist/cli-chunks/{doctor-DjMSJoQ5.cjs → doctor-TshFvqHC.cjs} +1 -1
- package/dist/cli-chunks/{index-CsOcGUzF.cjs → index-CCeHouBU.cjs} +21 -16
- package/dist/cli-chunks/{index-Cl5HFTBW.cjs → index-NOO3q8_C.cjs} +3 -3
- package/dist/cli-chunks/{login-Ct-46gLx.cjs → login-DtXHSm8R.cjs} +2 -2
- package/dist/cli-chunks/remote-BWfn7qIN.cjs +9915 -0
- package/dist/cli-chunks/{context-CKJlNcSN.cjs → sdk-version-policy-B1CFC1Dk.cjs} +122 -1
- package/dist/cli-chunks/{session-dRGPpyS1.cjs → session-DIcRjyDY.cjs} +2 -1
- package/dist/cli.cjs +1 -1
- package/dist/devtools/mock-host/index.html +40 -0
- package/dist/devtools/mock-host/main.js +85 -0
- package/dist/index.cjs.js +232 -4
- package/dist/index.esm.js +233 -3
- package/dist/miniapp-publish.cjs.js +4 -0
- package/dist/miniapp-publish.esm.js +4 -1
- package/dist/protocol.cjs.js +9 -0
- package/dist/protocol.esm.js +7 -1
- package/dist/vite.cjs.js +9159 -22
- package/dist/vite.esm.js +9159 -23
- package/package.json +19 -7
- package/skill/SKILL.md +23 -23
- package/skill/references/api-protocol.md +11 -2
- package/skill/references/api-root.md +145 -19
- package/skill/references/cli.md +13 -15
- package/skill/references/recipes.md +12 -44
- package/skill/references/safety-boundaries.md +1 -2
- package/skill/scripts/sync-references.mjs +2 -2
- package/skill/skill.json +4 -4
- package/types/cli/auth/base-url.d.ts +20 -0
- package/types/cli/config.d.ts +11 -0
- package/types/core/client.d.ts +7 -0
- package/types/core/csp-violation.d.ts +5 -0
- package/types/core/history-observer.d.ts +4 -0
- package/types/core/version.d.ts +2 -0
- package/types/index.d.ts +0 -2
- package/types/miniapp-manifest/schema.d.ts +6 -1
- package/types/miniapp-manifest/sdk-version-policy.d.ts +9 -0
- package/types/miniapp-publish/index.d.ts +1 -0
- package/types/protocol/constants.d.ts +6 -0
- package/types/protocol/types.d.ts +45 -0
- package/types/protocol.d.ts +2 -2
- package/types/vite/html-policy.d.ts +4 -0
- package/types/vite/index.d.ts +23 -3
- package/types/vite/runtime-gate.d.ts +5 -0
- package/types/vite/sdk-version-gate.d.ts +8 -0
- package/dist/cli-chunks/remote-C77axNSw.cjs +0 -1604
package/README.md
CHANGED
|
@@ -332,7 +332,7 @@ await network.request({
|
|
|
332
332
|
|
|
333
333
|
## 生命周期事件
|
|
334
334
|
|
|
335
|
-
SDK
|
|
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> [--
|
|
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
|
|
435
|
-
5. 解析 `dist/manifest.json`,校验 `version`
|
|
436
|
-
6. `--
|
|
437
|
-
7.
|
|
438
|
-
8.
|
|
439
|
-
9.
|
|
440
|
-
10.
|
|
441
|
-
11.
|
|
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
|
-
`--
|
|
445
|
+
`--from-version <version>` 用于复用已经上传过的远端历史版本产物提交新一轮审核。该模式不读取本地 `dist/`,也不会执行 build 或上传;目标审核版本由服务端根据版本表最高 SemVer 自动派生。
|
|
447
446
|
|
|
448
|
-
|
|
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
|
{
|
|
@@ -491,9 +488,9 @@ hb-sdk remote deploy --env-file .env.local --release-note "本地联调" # 显
|
|
|
491
488
|
hb-sdk remote deploy --env test --service-tag other-tag --release-note "灰度" # 单项 flag 覆盖预设
|
|
492
489
|
```
|
|
493
490
|
|
|
494
|
-
`--env <name>` 会读取项目根下的 `.env.<name>`,`--env-file <path>` 显式指定路径且优先级高于 `--env`;两者也可通过 `HB_SDK_ENV=<name>` 触发。加载遵循 dotenv 惯例:不覆盖进程已有的同名变量,因此 CI
|
|
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。
|
|
495
492
|
|
|
496
|
-
`--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`
|
|
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()` 不受这些配置影响。
|
|
497
494
|
|
|
498
495
|
## hb-sdk remote 命令参考
|
|
499
496
|
|
|
@@ -513,7 +510,7 @@ hb-sdk remote deploy --env test --service-tag other-tag --release-note "灰度"
|
|
|
513
510
|
| `hb-sdk remote allowlist add <heybox-id...>` | 添加十进制 Heybox ID 到预览白名单。 |
|
|
514
511
|
| `hb-sdk remote allowlist remove <heybox-id...>` | 从预览白名单移除非 owner 条目。 |
|
|
515
512
|
| `hb-sdk remote allowlist set <heybox-id...>` | 替换非 owner 白名单条目,并保留平台返回的 owner 语义。 |
|
|
516
|
-
| `hb-sdk remote deploy --release-note <text> [--
|
|
513
|
+
| `hb-sdk remote deploy --release-note <text> [--from-version <version>] [--auto-publish]` | 构建、上传或复用历史产物并提交当前版本审核。 |
|
|
517
514
|
| `hb-sdk remote versions` | 列出当前绑定小程序的远端版本。 |
|
|
518
515
|
| `hb-sdk remote preview <version>` | 查看指定版本的远端预览入口。 |
|
|
519
516
|
| `hb-sdk remote release <version> [--yes]` | 发布审核通过的版本;交互式终端会确认,非 TTY 必须传 `--yes`。 |
|
|
@@ -535,14 +532,13 @@ CLI 登录态只供 CLI 命令访问黑盒接口时复用,不会注入 iframe
|
|
|
535
532
|
|
|
536
533
|
## 能力边界
|
|
537
534
|
|
|
538
|
-
- SDK
|
|
535
|
+
- 导入 SDK 根包时会 eager 创建唯一默认实例并立即开始握手;`ready()` 只等待这次握手结果。
|
|
539
536
|
- `ready()` 只等待已有握手结果,不主动触发新的握手;调用模块能力前会自动等待 `ready()`,但业务仍建议在页面启动阶段显式 `await ready()`,便于集中处理握手失败。
|
|
540
537
|
- `user.getInfo()`、`user.getCurrentUserDetail()`、`user.getCurrentUserProfile()`、`user.getPlatformAccountOverview()`、`user.getPlatformAccountInfo(platform)` 和 `user.getSteamGameList(options)` 不会触发登录;登录必须由业务在用户操作后调用 `auth.login()`。
|
|
541
538
|
- 当前用户详情和平台账号 API 只允许读取当前登录用户,不支持传入 `userid` 查询其他人,也不透传 `/account/home_v2/` 原始响应。
|
|
542
539
|
- 分享、截图、UI、设备、导航、storage 和网络请求只开放稳定窄接口,不透传黑盒客户端内部协议参数。
|
|
543
540
|
- `network.request()` 的 `validateStatus` 只在 SDK 本地执行,不会被序列化给父容器。
|
|
544
541
|
- `on()` 返回取消监听函数;组件卸载或页面销毁时应主动取消监听。
|
|
545
|
-
- 使用 `createMiniProgramSDK()` 创建独立实例后,不再需要时应调用 `destroy()`。
|
|
546
542
|
- 构建产物可以包含 `dist/manifest.json`,业务代码不应自行 fetch 已部署的 manifest;这个文件由发布流水线读取并上送后台。
|
|
547
543
|
|
|
548
544
|
## Manifest
|
|
@@ -551,11 +547,12 @@ CLI 登录态只供 CLI 命令访问黑盒接口时复用,不会注入 iframe
|
|
|
551
547
|
|
|
552
548
|
```json
|
|
553
549
|
{
|
|
554
|
-
"version": "1.2.3"
|
|
550
|
+
"version": "1.2.3",
|
|
551
|
+
"sdkVersion": "0.6.0"
|
|
555
552
|
}
|
|
556
553
|
```
|
|
557
554
|
|
|
558
|
-
`version` 来自小程序项目自身的 `package.json.version
|
|
555
|
+
`version` 来自小程序项目自身的 `package.json.version`,`sdkVersion` 来自当前安装 SDK 的构建版本且不能由业务覆盖。`hb-sdk create` 生成的模板默认已注册插件;现有 Vite 项目可以在 `vite.config.ts` 中手动接入:
|
|
559
556
|
|
|
560
557
|
```ts
|
|
561
558
|
import { miniappManifest } from '@heybox/hb-sdk/vite';
|
|
@@ -569,12 +566,18 @@ export default defineConfig({
|
|
|
569
566
|
|
|
570
567
|
`base: './'` 用于让构建产物里的 JS/CSS/图片资源以 `./assets/...` 相对路径引用,避免小程序资源目录不是站点根路径时访问 `/assets/...` 失败。若没有显式配置 `base`,`miniappManifest()` 也会在 build 时默认补成 `./`。
|
|
571
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
|
+
|
|
572
575
|
失败与警告语义:
|
|
573
576
|
|
|
574
577
|
- 读取 `package.json` 失败或 JSON 解析失败:`vite build` 直接失败,并输出具体原因。
|
|
575
578
|
- `package.json.version` 不是非空字符串:`vite build` 直接失败。
|
|
576
|
-
- `package.json.version` 仍是模板默认值 `0.0.0`:`vite build`
|
|
577
|
-
-
|
|
579
|
+
- `package.json.version` 仍是模板默认值 `0.0.0`:`vite build` 直接失败,必须改成实际 SemVer。
|
|
580
|
+
- 版本号不是严格 SemVer、包含 build metadata 或缺少 `sdkVersion`:build/deploy 直接失败。
|
|
578
581
|
|
|
579
582
|
`manifest.json` 不部署到 CDN,只交给发布流水线读取后上送后台;Host 通过后台 API 间接读取版本信息。第一阶段只支持 Vite 项目,非 Vite 打包器未来通过其他子入口扩展。
|
|
580
583
|
|
|
@@ -586,7 +589,6 @@ export default defineConfig({
|
|
|
586
589
|
|
|
587
590
|
- `ready`、`on`、`off`
|
|
588
591
|
- `auth`、`user`、`share`、`viewport`、`storage`、`cloud`、`network`、`ui`、`device`、`navigation`
|
|
589
|
-
- `createMiniProgramSDK`、`MiniProgramSDK`
|
|
590
592
|
- `HbMiniProgramSDKError`、`HbMiniProgramNetworkError`
|
|
591
593
|
- 各模块公开类型,例如 `MiniProgramNetworkRequestConfig`、`MiniProgramNetworkResponse`、`MiniProgramUserInfoResult`
|
|
592
594
|
|
|
@@ -594,6 +596,8 @@ export default defineConfig({
|
|
|
594
596
|
|
|
595
597
|
构建时插件 `miniappManifest` 通过 `@heybox/hb-sdk/vite` 子入口导出,仅供 `vite.config.ts` 使用,不应在小程序业务代码里 import。
|
|
596
598
|
|
|
599
|
+
从 0.5 升级时请阅读 [0.6 迁移说明](./docs/migration-0.6.md)。
|
|
600
|
+
|
|
597
601
|
## 本仓库开发
|
|
598
602
|
|
|
599
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-
|
|
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-
|
|
13
|
-
var
|
|
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-dRGPpyS1.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
|
|
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('正在读取远端小程序权限', () =>
|
|
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
|
|
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-
|
|
7
|
+
var index = require('./index-CCeHouBU.cjs');
|
|
8
8
|
require('node:module');
|
|
9
9
|
require('path');
|
|
10
10
|
require('os');
|
|
@@ -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-
|
|
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-CCeHouBU.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-
|
|
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-CCeHouBU.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-
|
|
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-CCeHouBU.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-
|
|
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-CCeHouBU.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-
|
|
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-CCeHouBU.cjs', document.baseURI).href)));
|
|
250
250
|
function __require() { return require$1("node:process"); }
|
|
251
251
|
|
|
252
252
|
var help = {};
|
|
@@ -13203,6 +13203,13 @@ function loadEnvPreset(argv, options = {}) {
|
|
|
13203
13203
|
targetEnv[key] = value;
|
|
13204
13204
|
appliedKeys.push(key);
|
|
13205
13205
|
}
|
|
13206
|
+
const explicitName = readEnvNameArgFromArgv(argv);
|
|
13207
|
+
if (explicitName) {
|
|
13208
|
+
targetEnv.HB_SDK_ENV = explicitName;
|
|
13209
|
+
if (!appliedKeys.includes('HB_SDK_ENV')) {
|
|
13210
|
+
appliedKeys.push('HB_SDK_ENV');
|
|
13211
|
+
}
|
|
13212
|
+
}
|
|
13206
13213
|
return { filePath, appliedKeys, skippedKeys };
|
|
13207
13214
|
}
|
|
13208
13215
|
/**
|
|
@@ -13316,7 +13323,7 @@ function getPathname(pathWithQuery) {
|
|
|
13316
13323
|
}
|
|
13317
13324
|
|
|
13318
13325
|
const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
|
|
13319
|
-
const BUILT_CLI_VERSION = '0.
|
|
13326
|
+
const BUILT_CLI_VERSION = '0.6.0';
|
|
13320
13327
|
const PACKAGE_JSON_CANDIDATES = [
|
|
13321
13328
|
path.resolve(__dirname, '..', '..', 'package.json'),
|
|
13322
13329
|
path.resolve(__dirname, '..', 'package.json'),
|
|
@@ -13389,7 +13396,7 @@ function createCliProgram(overrides = {}) {
|
|
|
13389
13396
|
.description('hb-sdk developer tools')
|
|
13390
13397
|
.version(getCliVersion())
|
|
13391
13398
|
.option('-v, --verbose', '输出详细调试信息')
|
|
13392
|
-
.option('--env <name>', '加载项目根下 .env.<name>
|
|
13399
|
+
.option('--env <name>', '加载项目根下 .env.<name> 预设,并将 deploy 构建的 Vite mode 设为 name')
|
|
13393
13400
|
.option('--env-file <path>', '显式指定 .env 文件路径,优先级高于 --env')
|
|
13394
13401
|
.showHelpAfterError()
|
|
13395
13402
|
.exitOverride();
|
|
@@ -13526,7 +13533,6 @@ function installRemoteCommands(program, handlers, resolveLogger) {
|
|
|
13526
13533
|
addRemotePublicOptions(remote
|
|
13527
13534
|
.command('deploy')
|
|
13528
13535
|
.description('构建并提交当前小程序版本审核')
|
|
13529
|
-
.option('--skip-build', '跳过 build,直接读 dist 目录上传并提交审核')
|
|
13530
13536
|
.option('--from-version <version>', '复用指定历史版本产物提交审核')
|
|
13531
13537
|
.option('--release-note <text>', '发布日志,提交审核必填')
|
|
13532
13538
|
.option('--auto-publish', '审核通过后自动发布;默认需在 CLI 中手动发布')).action(createRemoteAction(handlers, resolveLogger, 'deploy', (command) => {
|
|
@@ -13535,7 +13541,6 @@ function installRemoteCommands(program, handlers, resolveLogger) {
|
|
|
13535
13541
|
autoPublish: Boolean(options.autoPublish),
|
|
13536
13542
|
fromVersion: readStringOption(options.fromVersion),
|
|
13537
13543
|
releaseNote: readStringOption(options.releaseNote),
|
|
13538
|
-
skipBuild: Boolean(options.skipBuild),
|
|
13539
13544
|
};
|
|
13540
13545
|
}));
|
|
13541
13546
|
addRemotePublicOptions(remote.command('versions').description('列出当前绑定小程序的远程版本')).action(createRemoteAction(handlers, resolveLogger, 'versions'));
|
|
@@ -13639,31 +13644,31 @@ function createCommandLoggerResolver(options) {
|
|
|
13639
13644
|
};
|
|
13640
13645
|
}
|
|
13641
13646
|
const defaultClearLoginStatus = async (...args) => {
|
|
13642
|
-
const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-
|
|
13647
|
+
const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-DtXHSm8R.cjs'); });
|
|
13643
13648
|
return clearLoginStatus(...args);
|
|
13644
13649
|
};
|
|
13645
13650
|
const defaultLoginToHeybox = async (...args) => {
|
|
13646
|
-
const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-
|
|
13651
|
+
const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-DtXHSm8R.cjs'); });
|
|
13647
13652
|
return loginToHeybox(...args);
|
|
13648
13653
|
};
|
|
13649
13654
|
const defaultPrintLoginStatus = async (...args) => {
|
|
13650
|
-
const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-
|
|
13655
|
+
const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-DtXHSm8R.cjs'); });
|
|
13651
13656
|
return printLoginStatus(...args);
|
|
13652
13657
|
};
|
|
13653
13658
|
const defaultRunCreateCommand = async (...args) => {
|
|
13654
|
-
const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-
|
|
13659
|
+
const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-DYb53EQ-.cjs'); });
|
|
13655
13660
|
return runCreateCommand(...args);
|
|
13656
13661
|
};
|
|
13657
13662
|
const defaultRunDevCommand = async (...args) => {
|
|
13658
|
-
const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-
|
|
13663
|
+
const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-CPKTuA6q.cjs'); });
|
|
13659
13664
|
return runDevCommand(...args);
|
|
13660
13665
|
};
|
|
13661
13666
|
const defaultRunDoctorCommand = async (...args) => {
|
|
13662
|
-
const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-
|
|
13667
|
+
const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-TshFvqHC.cjs'); });
|
|
13663
13668
|
return runDoctorCommand(...args);
|
|
13664
13669
|
};
|
|
13665
13670
|
const defaultRunRemoteCommand = async (...args) => {
|
|
13666
|
-
const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-
|
|
13671
|
+
const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-BWfn7qIN.cjs'); });
|
|
13667
13672
|
return runRemoteCommand(...args);
|
|
13668
13673
|
};
|
|
13669
13674
|
function resolveStandaloneLogger(options, verbose) {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index$2 = require('./index-
|
|
3
|
+
var index$2 = require('./index-CCeHouBU.cjs');
|
|
4
4
|
var require$$0$2 = require('fs');
|
|
5
5
|
var require$$2$1 = require('crypto');
|
|
6
6
|
var require$$1$2 = require('path');
|
|
7
7
|
var require$$0$3 = require('assert');
|
|
8
8
|
var require$$4$2 = require('events');
|
|
9
9
|
var require$$1$1 = require('util');
|
|
10
|
-
var
|
|
10
|
+
var sdkVersionPolicy = require('./sdk-version-policy-B1CFC1Dk.cjs');
|
|
11
11
|
var require$$0$5 = require('net');
|
|
12
12
|
var require$$0$4 = require('url');
|
|
13
13
|
var require$$2$2 = require('http');
|
|
@@ -13707,7 +13707,7 @@ function requireSource () {
|
|
|
13707
13707
|
const ajv_1 = requireAjv$1();
|
|
13708
13708
|
const ajv_formats_1 = requireDist();
|
|
13709
13709
|
const debounceFn = requireDebounceFn();
|
|
13710
|
-
const semver =
|
|
13710
|
+
const semver = sdkVersionPolicy.requireSemver();
|
|
13711
13711
|
const onetime = index$2.requireOnetime();
|
|
13712
13712
|
const encryptionAlgorithm = 'aes-256-cbc';
|
|
13713
13713
|
const createPlainObject = () => {
|
|
@@ -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-
|
|
6
|
+
var session = require('./session-DIcRjyDY.cjs');
|
|
7
7
|
var browser = require('./browser-RAy8e8cV.cjs');
|
|
8
|
-
var index = require('./index-
|
|
8
|
+
var index = require('./index-CCeHouBU.cjs');
|
|
9
9
|
require('node:path');
|
|
10
10
|
require('fs');
|
|
11
11
|
require('constants');
|