@heybox/hb-sdk 0.8.0-alpha.9 → 0.8.1-alpha.1
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/CHANGELOG.md +86 -0
- package/README.md +25 -19
- package/dist/cli-chunks/{build-DkokKVNy.cjs → build-kMLIWqWY.cjs} +8 -5
- package/dist/cli-chunks/{context-CKzZxKbF.cjs → context-CzFFRcL4.cjs} +42 -59
- package/dist/cli-chunks/{create-BQy5Jdmu.cjs → create-0ow6gA9w.cjs} +1 -1
- package/dist/cli-chunks/{dev-Dik2zr5R.cjs → dev-CPBPdpyu.cjs} +26 -15
- package/dist/cli-chunks/{doctor-Byr4uwKG.cjs → doctor-DQ8ctFKC.cjs} +1 -1
- package/dist/cli-chunks/{index-BwGBr1ZA.cjs → index-Buner4kE.cjs} +15 -15
- package/dist/cli-chunks/{index-Cl0XaX8e.cjs → index-RDcIrvwi.cjs} +2 -2
- package/dist/cli-chunks/{index.esm-BYifBABc.cjs → index.esm-qwrdRuy-.cjs} +8 -8
- package/dist/cli-chunks/{login-Dr9lclu3.cjs → login-DoduAO_f.cjs} +2 -2
- package/dist/cli-chunks/{project-vite-BIPrOtRO.cjs → project-vite-B-sK-qup.cjs} +1 -1
- package/dist/cli-chunks/{remote-DXxyA14a.cjs → remote-CF_SRmnj.cjs} +57 -25
- package/dist/cli-chunks/{runtime-gate-DFjw66kF.cjs → runtime-gate-FseEYZze.cjs} +11 -3
- package/dist/cli-chunks/{runtime-permission-env-CjsCe5bp.cjs → runtime-permission-env-DdQtxdut.cjs} +351 -0
- package/dist/cli-chunks/{session-B6Mo9eYW.cjs → session-DHbw2Xgh.cjs} +1 -1
- package/dist/cli-chunks/{skill-f90sxv28.cjs → skill-6IVv12JW.cjs} +2 -2
- package/dist/cli-chunks/{version-DDB_btOG.cjs → version-TXwWxKvv.cjs} +1 -1
- package/dist/cli.cjs +1 -1
- package/dist/devtools/browser-dev-host/assets/browser-dev-host-TzYf9L6C.js +99 -0
- package/dist/devtools/browser-dev-host/assets/{index-DaqmTjSF.js → index-C5MZZDa5.js} +4 -4
- package/dist/devtools/browser-dev-host/assets/index-P-ra4m1y.css +1 -0
- package/dist/devtools/browser-dev-host/assets/{workbench-state-wHgWRb7I.js → workbench-state-BwV7bm4n.js} +2 -2
- package/dist/devtools/browser-dev-host/index.html +3 -3
- package/dist/index.cjs.js +99 -1
- package/dist/index.esm.js +99 -1
- package/dist/protocol.cjs.js +189 -47
- package/dist/protocol.esm.js +189 -47
- package/dist/templates/vanilla-vite-js/package.json.ejs +2 -1
- package/dist/vite.cjs.js +281 -13
- package/dist/vite.esm.js +281 -13
- package/package.json +9 -11
- package/skill/SKILL.md +8 -9
- package/skill/references/api-protocol.md +1 -1
- package/skill/references/api-root.md +63 -21
- package/skill/references/cli.md +6 -6
- package/skill/references/examples.md +3 -3
- package/skill/references/recipes.md +35 -38
- package/skill/references/safety-boundaries.md +9 -5
- package/skill/skill.json +5 -5
- package/types/core/mini-dev-console.d.ts +36 -0
- package/types/miniapp-manifest/index.d.ts +1 -0
- package/types/miniapp-manifest/node.d.ts +3 -0
- package/types/miniapp-manifest/permissions.d.ts +37 -0
- package/types/miniapp-manifest/schema.d.ts +5 -0
- package/types/vite/index.d.ts +3 -1
- package/dist/devtools/browser-dev-host/assets/browser-dev-host-CbhA4h8z.js +0 -97
- package/dist/devtools/browser-dev-host/assets/index-DJFB5ySU.css +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,92 @@
|
|
|
2
2
|
|
|
3
3
|
本文件随 `@heybox/hb-sdk` npm 包公开分发,只记录外部小程序开发者可观察到的变化。内部集成、实现策略和审查证据不在此维护。
|
|
4
4
|
|
|
5
|
+
## 0.8.1-alpha.1
|
|
6
|
+
|
|
7
|
+
- 预发布版本:更新日志文档改为直接投影结构完整的稳定版条目,与 npm 当前版本和 dist-tag 独立发布、独立重试。
|
|
8
|
+
|
|
9
|
+
## 0.8.1-alpha.0
|
|
10
|
+
|
|
11
|
+
> 摘要:修正文档生成指纹策略,避免无内容变化的 API Reference 被批量改写。
|
|
12
|
+
> 影响级别:常规
|
|
13
|
+
> 开发者动作:无需操作。
|
|
14
|
+
> 兼容范围:不影响 SDK 运行时、公开 API 或小程序行为;仅调整文档生成元数据与校验方式。
|
|
15
|
+
|
|
16
|
+
### 问题修复
|
|
17
|
+
|
|
18
|
+
- API Reference 和 LLM Markdown 改用页级内容指纹,无关 Guide 或生成脚本变化不再改写全部页面。
|
|
19
|
+
|
|
20
|
+
### 文档与工具
|
|
21
|
+
|
|
22
|
+
- 文档生成元数据升级至 schema 4,并继续保留整套模型的全局完整性指纹。
|
|
23
|
+
|
|
24
|
+
## 0.8.0 - 2026-09-11
|
|
25
|
+
|
|
26
|
+
> 摘要:完善小程序权限声明、文件能力、分享体验和本地调试工具,并修复移动端网络请求兼容性。
|
|
27
|
+
> 影响级别:常规
|
|
28
|
+
> 开发者动作:升级 `@heybox/hb-sdk` 至 `0.8.0`;使用受控能力时按权限声明文档配置项目权限。
|
|
29
|
+
> 兼容范围:0.8 系列继续兼容未声明权限的存量小程序;现有业务 API 保持兼容,其他已支持平台行为不受影响。
|
|
30
|
+
|
|
31
|
+
### 必须操作
|
|
32
|
+
|
|
33
|
+
- 新项目或新增受控能力时,在 `package.json#heybox.permissions` 中声明实际需要的权限,并按平台审核结果使用对应能力。
|
|
34
|
+
|
|
35
|
+
### 新增能力
|
|
36
|
+
|
|
37
|
+
- 新 PC 工坊小程序支持隔离文件空间、单文件或目录选择、`saveFile()` 和公网流式下载;其他平台对尚未开放的文件能力保持明确不可用。
|
|
38
|
+
- `hb-sdk dev` 调试台新增「日志」页签,可实时查看业务 `console` 日志以及 SDK 诊断信息,生产构建不包含调试代码。
|
|
39
|
+
- `hb-sdk create` 使用可直接替换的 Vanilla JavaScript + Vite 模板;`hb-sdk skill install` 和 `hb-sdk doctor` 随 npm 包提供匹配版本的开发辅助能力。
|
|
40
|
+
|
|
41
|
+
### 行为调整
|
|
42
|
+
|
|
43
|
+
- 普通 `share.showShareMenu()` 分享统一使用当前小程序的通用落地页;原有 `extra` 页面状态、`share.copyLink()` 和 `share.getExtra()` 能力保持可用。
|
|
44
|
+
- `network` 权限只控制公开网络请求与下载能力,不再联动登录、用户资料和排行榜;权限声明、平台批准和能力支持状态会分别反馈。
|
|
45
|
+
- 移动端请求第三方接口时统一由应用网络层执行,原有 URL、method、headers、body、timeout 和 `withCredentials` 配置保持兼容。
|
|
46
|
+
|
|
47
|
+
### 问题修复
|
|
48
|
+
|
|
49
|
+
- 修复移动端第三方请求受 WebView CORS 限制而失败的问题。
|
|
50
|
+
- 修复本地设备预览尺寸、底部系统导航条和开发控制台输出等调试体验问题。
|
|
51
|
+
|
|
52
|
+
### 文档与工具
|
|
53
|
+
|
|
54
|
+
- 更新权限声明、文件与下载、分享和 API Reference 文档,并提供公开更新日志与 RSS 订阅。
|
|
55
|
+
|
|
56
|
+
## 0.8.0-alpha.14
|
|
57
|
+
|
|
58
|
+
- 摘要:修复移动端 `network.request()` 请求第三方接口时受 WebView CORS 限制的问题,统一交由 App Host 网络层执行。
|
|
59
|
+
- 影响级别:修复
|
|
60
|
+
- 开发者动作:无需修改调用代码;原有 URL、method、headers、body、timeout 与 `withCredentials` 配置保持兼容。
|
|
61
|
+
- 兼容范围:仅调整移动端 Host 的 buffered request;PC、Web 与 Browser Dev Host 行为不变。
|
|
62
|
+
- 问题修复
|
|
63
|
+
- 第三方绝对 URL 不再回退到 WebView Fetch,避免浏览器同源策略阻断请求。
|
|
64
|
+
- `withCredentials: false` 继续关闭 Cookie 与平台身份参数,第三方服务不会收到小黑盒客户端凭据。
|
|
65
|
+
|
|
66
|
+
## 0.8.0-alpha.13
|
|
67
|
+
|
|
68
|
+
- 预发布版本:更新日志 RSS 与页面保持一致,仅展示公开变化分类,并按页面发布日期输出订阅时间。
|
|
69
|
+
|
|
70
|
+
## 0.8.0-alpha.12
|
|
71
|
+
|
|
72
|
+
- 摘要:本地调试台新增业务 console 实时捕获与全量「日志」页签,开发期排查不再依赖各端孤立的控制台。
|
|
73
|
+
- 影响级别:常规
|
|
74
|
+
- 开发者动作:无需操作。使用 `hb-sdk dev` 时,调试台「日志」页签会自动显示业务与 SDK/Host 的实时日志。
|
|
75
|
+
- 兼容范围:仅影响本地开发链路与调试台 UI;生产构建零残留,线上小程序行为不变。
|
|
76
|
+
- 新增能力
|
|
77
|
+
- `hb-sdk dev` 调试台「日志」页签新增业务 `console.log()`、`console.info()`、`console.warn()`、`console.error()` 与 `console.debug()` 的实时捕获,业务代码零改动;SDK/Host 诊断日志同时进入同一页签并以来源区分。
|
|
78
|
+
- 日志页签升级为控制台式单行流:四级颜色区分、长内容自动换行完整展示、智能跟随滚动(向上翻自动暂停,拉回底部自动恢复)。
|
|
79
|
+
|
|
80
|
+
## 0.8.0-alpha.11
|
|
81
|
+
|
|
82
|
+
- 新 PC 工坊小程序支持隔离 sandbox、单文件/目录选择、`saveFile()` 与公网流式下载;多文件选择和小黑盒域名流式下载暂不支持。
|
|
83
|
+
- Mobile、Web 与 Browser Dev Host 继续对文件和下载能力 fail closed,不提供 Blob 或内存假实现。
|
|
84
|
+
|
|
85
|
+
## 0.8.0-alpha.10
|
|
86
|
+
|
|
87
|
+
- 预发布版本:新增 `package.json#heybox.permissions` 权限声明、运行时门禁和逐 API 权限文档;0.8 系列兼容未声明的存量小程序,0.9.0 起全面强制声明。
|
|
88
|
+
- `network` 仅控制公开 network 模块且仍需平台批准,不再联动登录、用户信息和排行榜;权限失败会区分未声明、未批准与 Host 不支持。
|
|
89
|
+
- 浏览器和手机调试保留完整权限快照,手机调试仍禁止使用官方域名网络配置。
|
|
90
|
+
|
|
5
91
|
## 0.8.0-alpha.9
|
|
6
92
|
|
|
7
93
|
- 预发布版本:增加公开更新日志、RSS 订阅和 CLI 更新链接,并统一 API Reference 地址。
|
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ SDK 只提供面向小程序开发者的稳定接口,不提供客户端内部
|
|
|
13
13
|
### 创建新项目
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
npx @heybox/hb-sdk@
|
|
16
|
+
npx @heybox/hb-sdk@latest create my-miniapp
|
|
17
17
|
cd my-miniapp
|
|
18
18
|
npm install
|
|
19
19
|
npm run dev
|
|
@@ -21,7 +21,7 @@ npm run dev
|
|
|
21
21
|
|
|
22
22
|
脚手架已包含 SDK、Vite 配置和常用开发命令。浏览器调试通过后,再从调试台的二维码入口使用手机小黑盒 APP 验收。
|
|
23
23
|
|
|
24
|
-
当前 `0.8`
|
|
24
|
+
当前 `0.8` 已发布为稳定版本,创建命令使用 `@latest`。
|
|
25
25
|
|
|
26
26
|
### 接入已有项目
|
|
27
27
|
|
|
@@ -47,7 +47,9 @@ hb-sdk skill install --all-agents
|
|
|
47
47
|
|
|
48
48
|
使用 `hb-sdk doctor` 或 `hb-sdk doctor --json` 检查各 Agent 的 Skill 是否与当前 npm 包匹配;已有内容被修改时,使用 `--force` 才会覆盖。
|
|
49
49
|
|
|
50
|
-
SDK 会在导入时启动握手,能力调用会自动等待 SDK
|
|
50
|
+
SDK 会在导入时启动握手,能力调用会自动等待 SDK 就绪。声明 `userInfo` 后,可通过 `user.getInfo()` 读取当前小程序内的隔离身份和已授权资料:
|
|
51
|
+
|
|
52
|
+
使用受保护能力前,需要在项目根 `package.json#heybox.permissions` 中显式声明。`auth.login()` 和 `user.getInfo()` 都只需要 `userInfo`,不依赖公开 `network` 权限;`network` 仅约束 `network.request()` 与 `network.download()`,并且声明后仍需平台批准。完整配置、无需声明白名单和 0.8/0.9 迁移规则见[权限声明](https://docs.xiaoheihe.cn/hb_sdk/guide/permissions)。
|
|
51
53
|
|
|
52
54
|
需要可信用户手势的按钮不能在点击回调里等待握手。页面加载时先用 `getHandshakeState()` 读取当前状态,再用 `onHandshakeStateChange()` 订阅并立即接收当前状态;仅在 `status === 'ready'` 时启用按钮,并在组件或页面销毁时调用订阅返回的取消函数。`ready` 生命周期事件只是握手成功瞬间派发、不会重放的边沿通知,不能用来判断当前状态。
|
|
53
55
|
|
|
@@ -62,7 +64,7 @@ async function getCurrentUser() {
|
|
|
62
64
|
|
|
63
65
|
`user.getInfo()` 不展示授权弹窗,也不要求可信用户手势。未登录时返回 `isHeyboxAppLoggedIn: false`;已登录时隐式授予当前本地用户 scopes(`identity`、`profile`),返回当前小程序隔离的 `app_user_id` 以及 `profile.nickname`、`profile.avatar`。
|
|
64
66
|
|
|
65
|
-
|
|
67
|
+
声明 `userInfo` 后,小程序可在按钮点击等明确的用户操作中调用 `auth.login()`:
|
|
66
68
|
|
|
67
69
|
```ts
|
|
68
70
|
async function loginFromUserAction() {
|
|
@@ -76,7 +78,7 @@ async function loginFromUserAction() {
|
|
|
76
78
|
}
|
|
77
79
|
```
|
|
78
80
|
|
|
79
|
-
`auth.login()` 返回 `{ code, expiresIn: 300, scopes }`,其中 `identity` 隐式强制包含;它不返回 user、profile、`app_user_id` 或 token。页面只能把 code 交给开发者服务端,再由服务端按后端 OpenAPI 文档换取 token
|
|
81
|
+
`auth.login()` 返回 `{ code, expiresIn: 300, scopes }`,其中 `identity` 隐式强制包含;它不返回 user、profile、`app_user_id` 或 token。页面只能把 code 交给开发者服务端,再由服务端按后端 OpenAPI 文档换取 token。它内部使用 Host 受信请求,不依赖公开 `network` 权限;示例中的 `network.request()` 本身仍需声明并获得 `network` 平台批准。完整边界见[用户身份与登录](https://docs.xiaoheihe.cn/hb_sdk/guide/auth)。
|
|
80
82
|
|
|
81
83
|
用户可以在明确的按钮点击和二次确认后撤销当前小程序的授权:
|
|
82
84
|
|
|
@@ -90,7 +92,7 @@ async function revokeAuthorizationFromUserAction() {
|
|
|
90
92
|
}
|
|
91
93
|
```
|
|
92
94
|
|
|
93
|
-
`user.revokeAuthorization()`
|
|
95
|
+
`user.revokeAuthorization()` 位于无需声明白名单,不接收小程序 ID、黑盒用户 ID 或手势参数。调用必须来自可信用户操作,否则返回 `USER_GESTURE_REQUIRED`。撤销成功后,后续身份或授权读取会重新进入授权流程;SDK 不会替业务清理已经持久化的数据。
|
|
94
96
|
|
|
95
97
|
已有 Vite 项目还需要启用构建插件:
|
|
96
98
|
|
|
@@ -134,14 +136,14 @@ const downloaded = await hbSDK.network.download({
|
|
|
134
136
|
console.log(await downloaded.readText());
|
|
135
137
|
```
|
|
136
138
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
Runtime 不认识新 method 时返回 `METHOD_NOT_FOUND`,且不提供 Blob 或内存假实现。
|
|
139
|
+
新 PC 已开放 `files` sandbox、单文件/目录 picker 与公网 `network.download()`;其它 Host 尚未开放
|
|
140
|
+
对应 primitive 时返回 `METHOD_FORBIDDEN`,旧 Runtime 不认识新 method 时返回 `METHOD_NOT_FOUND`。
|
|
141
|
+
新 PC 的下载字节留在插件 Node 并直接原子落盘,不提供 Blob 或内存假实现。
|
|
141
142
|
|
|
142
|
-
外部 picker 必须从可信用户操作触发。`files.saveFile({ suggestedName })`
|
|
143
|
-
|
|
144
|
-
|
|
143
|
+
外部 picker 必须从可信用户操作触发。`files.saveFile({ suggestedName })` 返回精确 File 授权,
|
|
144
|
+
不会额外保留 Directory 授权;新 PC 当前先让用户选择保存目录,再以 `suggestedName` 独占创建空文件,
|
|
145
|
+
同名文件返回 `FILE_ALREADY_EXISTS`。V1 不接受 `accept`,只有 `pickFiles()` 支持扩展名过滤。完整路径、
|
|
146
|
+
创建、存在性和下载语义见[快速开始](https://docs.xiaoheihe.cn/hb_sdk/guide/quick-start#文件与下载)。
|
|
145
147
|
|
|
146
148
|
`remove()` 只允许删除 sandbox 对象;外部 picker、`saveFile()` 及其派生项即使是 `readwrite` 也返回 `FILE_ACCESS_DENIED`。单个 Runtime session 最多保留 1024 个外部 direct handle,超限返回 `FILE_QUOTA_EXCEEDED`。Host 文件错误只向 SDK 暴露稳定 code 与 canonical 安全文案,业务不要依赖平台原始 message 或附加 data。
|
|
147
149
|
|
|
@@ -190,16 +192,16 @@ SDK 还提供 `getHandshakeState()` / `onHandshakeStateChange()` 管理持久握
|
|
|
190
192
|
- `ready` 生命周期事件是不可重放的边沿通知,不代表可查询状态,也不能替代握手状态 API。
|
|
191
193
|
- `auth.login({ scopes? })` 只返回 `{ code, expiresIn: 300, scopes }`;identity 隐式强制包含,code 只能提交给开发者服务端。
|
|
192
194
|
- 需要授权 UI 时,`auth.login()` 必须来自可信用户手势,否则返回 `USER_GESTURE_REQUIRED`;用户取消或关闭时返回 `AUTHORIZATION_CANCELLED`。已授权时可以静默返回新 code。
|
|
193
|
-
- `user.
|
|
194
|
-
- 已开通网络权限时,公开的 `user.getInfo()` 返回 `SERVER_API_REQUIRED`;对应身份和资料数据应由开发者服务端通过 OpenAPI 获取。
|
|
195
|
-
- 未开通网络权限时,`user.getInfo()` 隐式授予 `identity` 与 `profile`,静默返回 `userInfo.app_user_id`、昵称和头像;这条路径仍不能获取 code 或调用 OpenAPI。
|
|
195
|
+
- `auth.login()`、`user.getInfo()` 和 `user.getSteamGameList()` 的可用性不由 `network` 决定;它们分别要求 `userInfo` 或 `steamLibrary`,并继续遵循各自的用户授权和数据规则。
|
|
196
196
|
- `user.revokeAuthorization()` 在两种网络模式下都要求可信用户手势;成功后必须停止使用并清理业务缓存的旧身份、资料和服务端会话。
|
|
197
197
|
- `on()` 返回取消监听函数,组件卸载或页面销毁时需要调用。
|
|
198
198
|
- 业务网络请求使用 `network.request()`,不要依赖浏览器原生网络出口。
|
|
199
199
|
- 公开 `network.request()` 与 `network.download()` 均使用 no-follow redirect policy;3xx 不会在 Host 内静默跳转。
|
|
200
200
|
- `network.request()` 不能访问平台保留的 runtime auth 与 OpenAPI 内部路径;页面不得持有或交换服务端应用凭据。
|
|
201
201
|
- `network.request` 不支持 `multipart/form-data`;App Host 仅支持 form(`application/x-www-form-urlencoded`)与 JSON。表单请用 `URLSearchParams#toString()` 作为 `data`,文件上传请走专用上传能力。
|
|
202
|
-
-
|
|
202
|
+
- 新 PC 开放持久 sandbox、单文件/目录 picker、精确 File 保存与公网 `network.download()`;多选和小黑盒域名流式下载暂不支持。Mobile、Web 与 Browser Dev Host 仍未开放这些 primitive。
|
|
203
|
+
- 新 PC 支持 `network.request`,但会忽略 `withCredentials`;它不改变请求路由或凭据行为。其他平台继续遵循各自的 Host 语义。
|
|
204
|
+
- 新 PC 不支持振动、分享菜单和截图分享;`navigation.openAppPage` 仅支持 `game_detail`,用户/帖子详情会明确失败。调用平台相关能力时应处理 `METHOD_FORBIDDEN` 或 `REQUEST_UNSUPPORTED`。
|
|
203
205
|
- picker 必须来自可信用户手势;取消选择返回 `FILE_PICKER_CANCELLED`。`saveFile()` 只接受 `suggestedName`,不接受 `accept`。
|
|
204
206
|
- `pickFiles()` / `pickDirectory()` 默认只读;`pickFiles()` 仅在显式传入 `multiple: true` 时允许 Host 返回多个文件。要写入或作为下载目标时显式请求 `mode: 'readwrite'`。
|
|
205
207
|
- `file()` / `directory()` 只接受以 `/` 分隔的规范相对路径;拒绝绝对路径、空 segment、`.`、`..`、反斜杠、尾分隔符和控制字符。
|
|
@@ -209,9 +211,13 @@ SDK 还提供 `getHandshakeState()` / `onHandshakeStateChange()` 管理持久握
|
|
|
209
211
|
- 单个 Runtime session 最多保留 1024 个 picker/saveFile direct handle;整批授权超限时返回 `FILE_QUOTA_EXCEEDED`,不会保留部分结果。
|
|
210
212
|
- Host 文件错误只保留稳定 code 与 canonical 安全文案;原始 message、data、native path 和 credential 不会进入小程序。
|
|
211
213
|
- `FileStat.size` 是非负 safe integer;`modifiedAt` / `createdAt` 若存在,单位为 Unix epoch milliseconds。
|
|
212
|
-
-
|
|
214
|
+
- 仅当当前版本声明且平台已批准 `network` 时,`hb-sdk dev` 与 `hb-sdk remote deploy` 构建才会跳过平台 CSP;其他构建继续注入平台 CSP。`useOfficialDomain` 不参与 CSP 跳过判定。
|
|
213
215
|
- 构建必须启用 `miniappManifest({ platforms })` 并显式声明实际承诺适配的平台,推荐统一使用 `hb-sdk build`。新项目模板中的 `['android', 'ios', 'ohos']` 只是初始配置,不代表已经完成真机验收。
|
|
214
216
|
|
|
217
|
+
私有 Page Channel 适配没有修改 `@heybox/hb-sdk` 公开 API 或 iframe wire;本次 files/download
|
|
218
|
+
Runtime 能力随 `0.8.0-alpha.11` release family 发布,部署 detail 前必须保证
|
|
219
|
+
`@heybox/hb-sdk`、`@heybox/hb-sdk-runtime` 与 `@heybox/hb-sdk-protocol` 三个 package 均可解析。
|
|
220
|
+
|
|
215
221
|
## 分享扩展数据
|
|
216
222
|
|
|
217
223
|
`share.showShareMenu()` 的落地页固定为当前小程序的 `common_share`,不接受自定义 `url`。分享和复制链接可以携带小程序自行定义的页面状态:
|
|
@@ -274,7 +280,7 @@ hb-sdk remote deploy --release-note "本次更新说明"
|
|
|
274
280
|
|
|
275
281
|
`hb-sdk create` 默认生成可直接删除的 Vanilla JavaScript + Vite HelloWorld,只保留 SDK Toast 示例、三端 Manifest 和开发/构建/部署命令,不绑定业务框架或项目内测试工具。
|
|
276
282
|
|
|
277
|
-
`hb-sdk dev` 会启动 Vue 3 Browser Dev Host
|
|
283
|
+
`hb-sdk dev` 会启动 Vue 3 Browser Dev Host。左侧诊断面板集中展示日志、当前小程序作用域内的 Storage 快照和问题,右侧设备预览可在 iPhone 16 Pro Max(`440 x 956`)与 Pixel 9 Pro(`410 x 914`)间切换。切换预设只改变设备外框和 viewport,不会重新加载 iframe 或重启 Runtime;授权与操作弹窗、Toast、Loading 和振动反馈都限制在预览框内。
|
|
278
284
|
|
|
279
285
|
浏览器调试入口不要求 CLI 登录或项目绑定;需要账号或远端配置的能力会按当前可用上下文返回结果或明确失败。调试台不提供权限修改入口,远端权限快照始终是 Runtime 的规范输入。手机验收统一从右上角二维码入口进入,选择手机可达的局域网网卡后扫码;二维码使用 `open_inapp` 与 `heybox://` `openWindow` 包装的短链。完整操作见 [CLI 指南](https://docs.xiaoheihe.cn/hb_sdk/guide/cli),实现与安全边界由 [Runtime Host 迁移](./docs/runtime-host-migration.md) 维护。
|
|
280
286
|
|
|
@@ -3,10 +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-
|
|
7
|
-
var runtimeGate = require('./runtime-gate-
|
|
8
|
-
var index = require('./index-
|
|
9
|
-
var projectVite = require('./project-vite-
|
|
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');
|
|
10
11
|
require('node:async_hooks');
|
|
11
12
|
require('node:module');
|
|
12
13
|
require('path');
|
|
@@ -27,6 +28,7 @@ async function runBuildCommand(_options = {}, runtime = {}) {
|
|
|
27
28
|
const env = runtime.env ?? process.env;
|
|
28
29
|
const mode = env.HB_SDK_ENV?.trim() || undefined;
|
|
29
30
|
const skipPlatformCsp = runtimePermissionEnv.shouldSkipMiniappPlatformCspFromEnv(env);
|
|
31
|
+
runtimePermissionEnv.readMiniappPermissionsFromPackageJson(projectRoot, runtimePermissionEnv.resolveMiniappSdkVersion());
|
|
30
32
|
await fs.rm(distDir, { force: true, recursive: true });
|
|
31
33
|
try {
|
|
32
34
|
return await runtimePermissionEnv.withMiniappPlatformCspEnv(skipPlatformCsp, async () => {
|
|
@@ -91,7 +93,7 @@ async function validateBuildOutput(projectRoot, logger) {
|
|
|
91
93
|
if (hadBom) {
|
|
92
94
|
logger.warn('dist/manifest.json 包含 BOM,已自动剥离');
|
|
93
95
|
}
|
|
94
|
-
const { platforms, sdkVersion, version } = runtimeGate.validateMiniappManifestForDeploy(manifest);
|
|
96
|
+
const { platforms, sdkVersion, version, permissions } = runtimeGate.validateMiniappManifestForDeploy(manifest);
|
|
95
97
|
const allFiles = await walkDistFiles(distDir);
|
|
96
98
|
const uploadFiles = allFiles.filter((file) => runtimePermissionEnv.shouldUploadDistFile(file.relativePath));
|
|
97
99
|
const sizeError = runtimePermissionEnv.validateUploadTotalSize(uploadFiles);
|
|
@@ -103,6 +105,7 @@ async function validateBuildOutput(projectRoot, logger) {
|
|
|
103
105
|
fileCount: uploadFiles.length,
|
|
104
106
|
sdkVersion,
|
|
105
107
|
platforms,
|
|
108
|
+
...(permissions === undefined ? {} : { permissions }),
|
|
106
109
|
totalBytes: uploadFiles.reduce((total, file) => total + file.size, 0),
|
|
107
110
|
version,
|
|
108
111
|
};
|
|
@@ -1,53 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var runtimePermissionEnv = require('./runtime-permission-env-DdQtxdut.cjs');
|
|
4
|
+
var session = require('./session-DHbw2Xgh.cjs');
|
|
5
5
|
var fs$1 = require('node:fs');
|
|
6
6
|
var fs = require('node:fs/promises');
|
|
7
7
|
var path = require('node:path');
|
|
8
8
|
|
|
9
|
-
const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(['network.request']);
|
|
10
|
-
function isManagedMiniProgramRuntimePermissionKey(key) {
|
|
11
|
-
return MANAGED_RUNTIME_PERMISSION_KEYS.has(key);
|
|
12
|
-
}
|
|
13
|
-
function parseMiniProgramRuntimePermissions(snapshot) {
|
|
14
|
-
if (!isRecord(snapshot) || snapshot.schema_version !== 1 || !Array.isArray(snapshot.entries)) {
|
|
15
|
-
return { valid: false, permissions: {} };
|
|
16
|
-
}
|
|
17
|
-
if (snapshot.revision !== undefined && (typeof snapshot.revision !== 'number' || !Number.isInteger(snapshot.revision) || snapshot.revision < 0)) {
|
|
18
|
-
return { valid: false, permissions: {} };
|
|
19
|
-
}
|
|
20
|
-
const seenKeys = new Set();
|
|
21
|
-
const permissions = {};
|
|
22
|
-
for (const rawEntry of snapshot.entries) {
|
|
23
|
-
if (!isRecord(rawEntry) || typeof rawEntry.key !== 'string' || !rawEntry.key.trim()) {
|
|
24
|
-
return { valid: false, permissions: {} };
|
|
25
|
-
}
|
|
26
|
-
const key = rawEntry.key.trim();
|
|
27
|
-
if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled') || !isRecord(rawEntry.config)) {
|
|
28
|
-
return { valid: false, permissions: {} };
|
|
29
|
-
}
|
|
30
|
-
seenKeys.add(key);
|
|
31
|
-
if (!isManagedMiniProgramRuntimePermissionKey(key))
|
|
32
|
-
continue;
|
|
33
|
-
if (key === 'network.request' && typeof rawEntry.config.useOfficialDomain !== 'boolean') {
|
|
34
|
-
return { valid: false, permissions: {} };
|
|
35
|
-
}
|
|
36
|
-
permissions[key] = {
|
|
37
|
-
key,
|
|
38
|
-
status: rawEntry.status,
|
|
39
|
-
config: { useOfficialDomain: rawEntry.config.useOfficialDomain },
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
return { valid: true, permissions };
|
|
43
|
-
}
|
|
44
|
-
function isRecord(value) {
|
|
45
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
9
|
function shouldSkipMiniappPlatformCsp(runtimePermissions) {
|
|
49
|
-
const parsed = parseMiniProgramRuntimePermissions(runtimePermissions);
|
|
50
|
-
const networkRequest = parsed.permissions
|
|
10
|
+
const parsed = runtimePermissionEnv.parseMiniProgramRuntimePermissions(runtimePermissions);
|
|
11
|
+
const networkRequest = parsed.permissions.network;
|
|
51
12
|
return parsed.valid && networkRequest?.status === 'enabled';
|
|
52
13
|
}
|
|
53
14
|
const DEFAULT_PERMISSION_STATE = {
|
|
@@ -57,8 +18,8 @@ const DEFAULT_PERMISSION_STATE = {
|
|
|
57
18
|
},
|
|
58
19
|
};
|
|
59
20
|
function createBrowserDevPermissionState(context) {
|
|
60
|
-
const parsed = parseMiniProgramRuntimePermissions(context.runtimePermissions);
|
|
61
|
-
const networkRequest = parsed.permissions
|
|
21
|
+
const parsed = runtimePermissionEnv.parseMiniProgramRuntimePermissions(context.runtimePermissions);
|
|
22
|
+
const networkRequest = parsed.permissions.network;
|
|
62
23
|
return parsed.valid && networkRequest
|
|
63
24
|
? {
|
|
64
25
|
networkRequest: {
|
|
@@ -68,25 +29,48 @@ function createBrowserDevPermissionState(context) {
|
|
|
68
29
|
}
|
|
69
30
|
: cloneDefaultPermissionState();
|
|
70
31
|
}
|
|
71
|
-
function createBrowserDevRuntimePermissions(state) {
|
|
72
|
-
return
|
|
73
|
-
schema_version: 1,
|
|
74
|
-
entries: [
|
|
75
|
-
{
|
|
76
|
-
key: 'network.request',
|
|
77
|
-
status: state.networkRequest.status,
|
|
78
|
-
config: {
|
|
79
|
-
useOfficialDomain: state.networkRequest.useOfficialDomain,
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
],
|
|
83
|
-
};
|
|
32
|
+
function createBrowserDevRuntimePermissions(snapshot, state) {
|
|
33
|
+
return createDevRuntimePermissions(snapshot, state, state.networkRequest.useOfficialDomain);
|
|
84
34
|
}
|
|
85
35
|
function cloneDefaultPermissionState() {
|
|
86
36
|
return {
|
|
87
37
|
networkRequest: { ...DEFAULT_PERMISSION_STATE.networkRequest },
|
|
88
38
|
};
|
|
89
39
|
}
|
|
40
|
+
function createDevRuntimePermissions(snapshot, state, useOfficialDomain) {
|
|
41
|
+
const parsed = runtimePermissionEnv.parseMiniProgramRuntimePermissions(snapshot);
|
|
42
|
+
if (!parsed.valid) {
|
|
43
|
+
return { schema_version: 1, entries: [] };
|
|
44
|
+
}
|
|
45
|
+
const entries = [];
|
|
46
|
+
for (const key of runtimePermissionEnv.MINI_PROGRAM_PERMISSION_KEYS) {
|
|
47
|
+
const entry = parsed.permissions[key];
|
|
48
|
+
if (!entry)
|
|
49
|
+
continue;
|
|
50
|
+
entries.push(key === 'network'
|
|
51
|
+
? {
|
|
52
|
+
key,
|
|
53
|
+
status: state.networkRequest.status,
|
|
54
|
+
config: { useOfficialDomain },
|
|
55
|
+
}
|
|
56
|
+
: {
|
|
57
|
+
key,
|
|
58
|
+
status: entry.status,
|
|
59
|
+
config: {},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const revision = isPlainRecord(snapshot) && typeof snapshot.revision === 'number' && Number.isInteger(snapshot.revision) && snapshot.revision >= 0
|
|
63
|
+
? snapshot.revision
|
|
64
|
+
: undefined;
|
|
65
|
+
return {
|
|
66
|
+
schema_version: 1,
|
|
67
|
+
...(revision === undefined ? {} : { revision }),
|
|
68
|
+
entries,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function isPlainRecord(value) {
|
|
72
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
|
|
73
|
+
}
|
|
90
74
|
|
|
91
75
|
function createRemoteApiClient(options) {
|
|
92
76
|
return {
|
|
@@ -401,7 +385,6 @@ exports.createBrowserDevRuntimePermissions = createBrowserDevRuntimePermissions;
|
|
|
401
385
|
exports.createLocalDevLaunchToken = createLocalDevLaunchToken;
|
|
402
386
|
exports.createRemoteApiClientForEnvironment = createRemoteApiClientForEnvironment;
|
|
403
387
|
exports.getBoundMiniProgram = getBoundMiniProgram;
|
|
404
|
-
exports.parseMiniProgramRuntimePermissions = parseMiniProgramRuntimePermissions;
|
|
405
388
|
exports.readBoundMiniProgramId = readBoundMiniProgramId;
|
|
406
389
|
exports.readBoundMiniProgramIdFromPackageJson = readBoundMiniProgramIdFromPackageJson;
|
|
407
390
|
exports.readMiniProgramProjectPackage = readMiniProgramProjectPackage;
|
|
@@ -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-Buner4kE.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-
|
|
11
|
+
var context = require('./context-CzFFRcL4.cjs');
|
|
12
|
+
var runtimePermissionEnv = require('./runtime-permission-env-DdQtxdut.cjs');
|
|
12
13
|
var undici = require('undici');
|
|
13
14
|
var fs$1 = require('node:fs/promises');
|
|
14
|
-
var index = require('./index-
|
|
15
|
+
var index = require('./index-Buner4kE.cjs');
|
|
15
16
|
var require$$0$1 = require('crypto');
|
|
16
17
|
var require$$0 = require('buffer');
|
|
17
|
-
var session = require('./session-
|
|
18
|
+
var session = require('./session-DHbw2Xgh.cjs');
|
|
18
19
|
var browser = require('./browser-RAy8e8cV.cjs');
|
|
19
|
-
var projectVite = require('./project-vite-
|
|
20
|
-
var version = require('./version-
|
|
21
|
-
var runtimePermissionEnv = require('./runtime-permission-env-CjsCe5bp.cjs');
|
|
20
|
+
var projectVite = require('./project-vite-B-sK-qup.cjs');
|
|
21
|
+
var version = require('./version-TXwWxKvv.cjs');
|
|
22
22
|
|
|
23
23
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
24
24
|
class Locked extends Error {
|
|
@@ -1149,11 +1149,11 @@ function validateDevSessionCreatePayload(payload, allowedMiniUrlOrigins) {
|
|
|
1149
1149
|
!allowedMiniUrlOrigins.has(miniUrlOrigin.origin)) {
|
|
1150
1150
|
throw new TypeError('mini_url_origin must be an allowed LAN origin');
|
|
1151
1151
|
}
|
|
1152
|
-
const parsedPermissions =
|
|
1152
|
+
const parsedPermissions = runtimePermissionEnv.parseMiniProgramRuntimePermissions(payload.runtime_permissions);
|
|
1153
1153
|
if (!parsedPermissions.valid) {
|
|
1154
1154
|
throw new TypeError('runtime_permissions is invalid');
|
|
1155
1155
|
}
|
|
1156
|
-
const networkPermission = parsedPermissions.permissions
|
|
1156
|
+
const networkPermission = parsedPermissions.permissions.network;
|
|
1157
1157
|
if (networkPermission?.config.useOfficialDomain !== false) {
|
|
1158
1158
|
throw new TypeError('Dev Session does not allow official domains');
|
|
1159
1159
|
}
|
|
@@ -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-
|
|
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-
|
|
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');
|
|
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'),
|
|
@@ -5217,6 +5217,9 @@ function resolveRuntimeLogTelemetryReportId(entry) {
|
|
|
5217
5217
|
function shouldReportRuntimeLogToTelemetry(entry, options = {}) {
|
|
5218
5218
|
const minLevel = options.minLevel ?? DEFAULT_RUNTIME_LOG_TELEMETRY_MIN_LEVEL;
|
|
5219
5219
|
const ignoreMessages = options.ignoreMessages ?? [...DEFAULT_RUNTIME_LOG_TELEMETRY_IGNORE_MESSAGES];
|
|
5220
|
+
if (options.shouldReport && !options.shouldReport(entry)) {
|
|
5221
|
+
return false;
|
|
5222
|
+
}
|
|
5220
5223
|
return isRuntimeLogLevelEnabled(entry.level, minLevel) && !ignoreMessages.some((pattern) => pattern.test(entry.message));
|
|
5221
5224
|
}
|
|
5222
5225
|
/**
|
|
@@ -5518,10 +5521,14 @@ function createTelemetryRuntimeLogSink(telemetry, options = {}) {
|
|
|
5518
5521
|
severity: entry.level,
|
|
5519
5522
|
});
|
|
5520
5523
|
const { requestId, ...reportContext } = entry.context ?? {};
|
|
5524
|
+
// 调用方可在上下文里显式给出聚合指纹(例如全局错误捕获已按统一规则算好);
|
|
5525
|
+
// 显式值优先于按本条日志错误推导的指纹,避免同一错误在直接上报与 sink 转发
|
|
5526
|
+
// 两条出口下落到不同 issue。
|
|
5527
|
+
const contextFingerprint = reportContext.runtime_error_fingerprint;
|
|
5521
5528
|
currentTelemetry.reportError({
|
|
5522
5529
|
addition: {
|
|
5523
5530
|
...reportContext,
|
|
5524
|
-
runtime_error_fingerprint: entry.errorInfo?.fingerprint,
|
|
5531
|
+
runtime_error_fingerprint: typeof contextFingerprint === 'string' && contextFingerprint ? contextFingerprint : entry.errorInfo?.fingerprint,
|
|
5525
5532
|
runtime_log_domain: entry.domain,
|
|
5526
5533
|
runtime_log_id: entry.id,
|
|
5527
5534
|
runtime_log_level: entry.level,
|
|
@@ -10895,7 +10902,7 @@ function assertNodeRuntimeCapabilities(ctx, settings) {
|
|
|
10895
10902
|
function createNodeRealtimeDriverRegistry() {
|
|
10896
10903
|
const registry = createRuntimeRealtimeDriverRegistry();
|
|
10897
10904
|
registry.registerLazy('node-websocket', async () => {
|
|
10898
|
-
const mod = await Promise.resolve().then(function () { return require('./index.esm-
|
|
10905
|
+
const mod = await Promise.resolve().then(function () { return require('./index.esm-qwrdRuy-.cjs'); });
|
|
10899
10906
|
return mod.createNodeWebSocketRuntimeDriver();
|
|
10900
10907
|
});
|
|
10901
10908
|
return registry;
|
|
@@ -14908,7 +14915,7 @@ function createLaunchSnapshot(source, requestOrigin) {
|
|
|
14908
14915
|
if (storedContextUrl) {
|
|
14909
14916
|
snapshot.dev_context_url = projectStoredDevContextUrl(storedContextUrl, requestOrigin.hostname);
|
|
14910
14917
|
}
|
|
14911
|
-
if (
|
|
14918
|
+
if (runtimePermissionEnv.parseMiniProgramRuntimePermissions(source.runtimePermissions).valid && source.runtimePermissions) {
|
|
14912
14919
|
snapshot.runtime_permissions = JSON.parse(JSON.stringify(source.runtimePermissions));
|
|
14913
14920
|
}
|
|
14914
14921
|
return snapshot;
|
|
@@ -14991,7 +14998,7 @@ async function runDevCommand(options, runtime = {}) {
|
|
|
14991
14998
|
projectRoot,
|
|
14992
14999
|
timeoutMs: runtime.devContextTimeoutMs ?? DEFAULT_DEV_CONTEXT_TIMEOUT_MS,
|
|
14993
15000
|
});
|
|
14994
|
-
const launchRuntimePermissions = context.createBrowserDevRuntimePermissions(context.createBrowserDevPermissionState(devLaunchContext));
|
|
15001
|
+
const launchRuntimePermissions = context.createBrowserDevRuntimePermissions(devLaunchContext.runtimePermissions, context.createBrowserDevPermissionState(devLaunchContext));
|
|
14995
15002
|
const vite = await runDevStartupTask(logger, '正在加载项目 Vite', () => projectVite.loadProjectVite(projectRoot), '已加载项目 Vite');
|
|
14996
15003
|
const appServer = await runDevStartupTask(logger, '正在创建 Vite 开发服务器', () => runtimePermissionEnv.withMiniappPlatformCspEnv(context.shouldSkipMiniappPlatformCsp(devLaunchContext.runtimePermissions), () => withManagedDevOutputEnv(() => vite.createServer(createViteServerOptions(projectRoot, resolvedOptions)), runtime.env), runtime.env), '已创建 Vite 开发服务器');
|
|
14997
15004
|
const mobileDevContextUrlsByOrigin = new Map();
|
|
@@ -15106,11 +15113,15 @@ async function loadDevLaunchContext(options) {
|
|
|
15106
15113
|
}),
|
|
15107
15114
|
timeoutMs: options.timeoutMs,
|
|
15108
15115
|
}), '已读取远端小程序权限');
|
|
15116
|
+
const localPermissions = runtimePermissionEnv.readMiniappPermissionsFromPackageJson(options.projectRoot, runtimePermissionEnv.resolveMiniappSdkVersion());
|
|
15117
|
+
if (!localPermissions.declared)
|
|
15118
|
+
options.logger.warn(runtimePermissionEnv.getMissingPermissionsWarning());
|
|
15119
|
+
const effectivePermissions = runtimePermissionEnv.composeMiniappRuntimePermissions(localPermissions, detail.runtime_permissions).runtimePermissions;
|
|
15109
15120
|
return {
|
|
15110
15121
|
context: {
|
|
15111
15122
|
source: 'remote',
|
|
15112
15123
|
miniProgramId: verifiedMiniProgramId,
|
|
15113
|
-
runtimePermissions:
|
|
15124
|
+
runtimePermissions: effectivePermissions,
|
|
15114
15125
|
},
|
|
15115
15126
|
miniProgram: createMiniProgramSummary(verifiedMiniProgramId, detail),
|
|
15116
15127
|
};
|
|
@@ -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-Buner4kE.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-Buner4kE.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-Buner4kE.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-Buner4kE.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-Buner4kE.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.
|
|
13356
|
+
const BUILT_CLI_VERSION = '0.8.1-alpha.1';
|
|
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-
|
|
13704
|
+
const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-DoduAO_f.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-
|
|
13708
|
+
const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-DoduAO_f.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-
|
|
13712
|
+
const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-DoduAO_f.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-
|
|
13716
|
+
const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-kMLIWqWY.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-
|
|
13720
|
+
const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-0ow6gA9w.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-
|
|
13724
|
+
const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-CPBPdpyu.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-
|
|
13728
|
+
const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-DQ8ctFKC.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-
|
|
13732
|
+
const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-6IVv12JW.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-
|
|
13736
|
+
const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-CF_SRmnj.cjs'); });
|
|
13737
13737
|
return runRemoteCommand(...args);
|
|
13738
13738
|
};
|
|
13739
13739
|
function resolveStandaloneLogger(options, verbose) {
|