@heybox/hb-sdk 0.6.4-alpha.0 → 0.6.4
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 +3 -3
- package/dist/cli-chunks/{context-BCwksd8H.cjs → context-BEgbP7mM.cjs} +1 -1
- package/dist/cli-chunks/{create-BO8GHVi0.cjs → create-BHsWWo3V.cjs} +1 -1
- package/dist/cli-chunks/{dev-DmgKnEC2.cjs → dev-CSjs2OYB.cjs} +9 -13
- package/dist/cli-chunks/{doctor-BlKB4f78.cjs → doctor-B3AOQgyN.cjs} +1 -1
- package/dist/cli-chunks/{index-Q0G1SsEs.cjs → index-B0zGksOA.cjs} +38 -13
- package/dist/cli-chunks/{index-PxkpQ5of.cjs → index-BGFf6g7V.cjs} +2 -2
- package/dist/cli-chunks/{login-Cxdo4B6Z.cjs → login-ClQuL2r6.cjs} +2 -2
- package/dist/cli-chunks/{remote-C1Rsb1dx.cjs → remote-ib5THDbw.cjs} +4 -4
- package/dist/cli-chunks/{session-CC3Oz3Xc.cjs → session-D7nmqMiy.cjs} +1 -1
- package/dist/cli.cjs +1 -1
- package/dist/devtools/mock-host/index.html +0 -19
- package/dist/devtools/mock-host/main.js +72 -91
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/protocol.cjs.js +54 -0
- package/dist/protocol.esm.js +53 -1
- package/dist/vite.cjs.js +1 -1
- package/dist/vite.esm.js +1 -1
- package/package.json +1 -1
- package/skill/references/api-protocol.md +18 -17
- package/skill/references/api-root.md +3 -3
- package/skill/references/cli.md +23 -32
- package/skill/references/recipes.md +78 -29
- package/skill/scripts/sync-references.mjs +2 -0
- package/skill/skill.json +4 -4
- package/types/protocol/runtime-permissions.d.ts +41 -0
- package/types/protocol.d.ts +4 -2
package/README.md
CHANGED
|
@@ -57,9 +57,9 @@ SDK 需要在黑盒小程序 iframe 容器内运行。父容器会为页面注
|
|
|
57
57
|
npm run dev
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
调试页会通过 iframe 加载本地页面并补齐小程序 bridge 环境。`hb-sdk dev` 的基础启动只依赖本地页面地址:即使项目未绑定、CLI 未登录或远端暂时不可用,浏览器 Mock、Mac 启动协议和手机二维码也会继续生成,真机 dev shell 以匿名本地沙箱加载 `mini_url`,不会把公开 `detail` 查询作为启动门禁。项目已绑定时会限时 3 秒读取远端 dev context;成功后 Mock Host 用真实 Runtime 权限快照初始化本地模拟,失败或超时则显示脱敏警告,并默认拒绝 `network.request`
|
|
60
|
+
调试页会通过 iframe 加载本地页面并补齐小程序 bridge 环境。`hb-sdk dev` 的基础启动只依赖本地页面地址:即使项目未绑定、CLI 未登录或远端暂时不可用,浏览器 Mock、Mac 启动协议和手机二维码也会继续生成,真机 dev shell 以匿名本地沙箱加载 `mini_url`,不会把公开 `detail` 查询作为启动门禁。项目已绑定时会限时 3 秒读取远端 dev context;成功后 Mock Host 用真实 Runtime 权限快照初始化本地模拟,失败或超时则显示脱敏警告,并默认拒绝 `network.request` 等受管能力。需要定位降级原因时可使用 `hb-sdk dev --verbose`;详细错误只写入本地调试日志,其中 URL 用户名、密码和敏感 query/hash 会被遮蔽,不会进入 LAN bootstrap。
|
|
61
61
|
|
|
62
|
-
Mock Host
|
|
62
|
+
Mock Host 可以在内存中切换 devtools-only 的 `network.request` 权限,不会重建 iframe,因此不影响 Vite HMR;官方域名权限只读取线上快照,本地设置不会修改线上权限。调试页会对比已读取的线上快照,提示本地放开但上线后会返回 `PERMISSION_DENIED` 的差异。权限快照只通过 mock host 的同源只读 bootstrap 接口传递,URL query 不能提供或覆盖权限。真实容器加载开发 `mini_url` 前会提示“即将打开未经验证的开发网页。该页面可能由本机或局域网服务提供,请确认来源可信后继续。”,用户确认后才继续加载。Codex、VSCode 等内嵌浏览器可能无法唤起系统 APP;遇到这种情况时,请在系统浏览器中打开同一个调试页后重试。
|
|
63
63
|
|
|
64
64
|
在未使用脚手架的 Vite 项目中,可以把命令加到 `package.json`:
|
|
65
65
|
|
|
@@ -581,7 +581,7 @@ meta refresh、外部 anchor、`dns-prefetch`、`preconnect`、`prerender`、外
|
|
|
581
581
|
- `HbMiniProgramSDKError`、`HbMiniProgramNetworkError`
|
|
582
582
|
- 各模块公开类型,例如 `MiniProgramNetworkRequestConfig`、`MiniProgramNetworkResponse`、`MiniProgramUserInfoResult`
|
|
583
583
|
|
|
584
|
-
协议常量、消息类型、能力目录、payload/result
|
|
584
|
+
协议常量、消息类型、能力目录、payload/result 映射、守卫和 Runtime 权限快照解析器只通过 `@heybox/hb-sdk/protocol` 子入口导出。`parseMiniProgramRuntimePermissions` 是正式 Runtime 与 Mock Host 共用的 fail-closed 解析 owner;`@heybox/hb-sdk-runtime` 保留同名兼容导出。iframe 小程序业务代码不应构造 raw bridge message、解析宿主权限快照,也不应直接处理 nonce 或 `postMessage` 信封;宿主运行时等非业务页面代码使用 `@heybox/hb-sdk/protocol`。
|
|
585
585
|
|
|
586
586
|
构建时插件 `miniappManifest` 通过 `@heybox/hb-sdk/vite` 子入口导出,仅供 `vite.config.ts` 使用,不应在小程序业务代码里 import。
|
|
587
587
|
|
|
@@ -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-B0zGksOA.cjs');
|
|
9
9
|
require('node:module');
|
|
10
10
|
require('os');
|
|
11
11
|
require('readline');
|
|
@@ -9,8 +9,8 @@ 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 context = require('./context-
|
|
12
|
+
var index = require('./index-B0zGksOA.cjs');
|
|
13
|
+
var context = require('./context-BEgbP7mM.cjs');
|
|
14
14
|
require('node:process');
|
|
15
15
|
require('node:buffer');
|
|
16
16
|
require('node:util');
|
|
@@ -24,7 +24,7 @@ require('events');
|
|
|
24
24
|
require('stream');
|
|
25
25
|
require('buffer');
|
|
26
26
|
require('util');
|
|
27
|
-
require('./session-
|
|
27
|
+
require('./session-D7nmqMiy.cjs');
|
|
28
28
|
require('node:crypto');
|
|
29
29
|
require('fs');
|
|
30
30
|
require('constants');
|
|
@@ -670,7 +670,7 @@ function createHeyboxProtocol(payload) {
|
|
|
670
670
|
/** 构建时替换为当前发布包的实际版本。 */
|
|
671
671
|
const HB_SDK_VERSION = typeof undefined === 'string'
|
|
672
672
|
? undefined
|
|
673
|
-
: '0.6.4
|
|
673
|
+
: '0.6.4';
|
|
674
674
|
|
|
675
675
|
const DEFAULT_APP_PORT = 5173;
|
|
676
676
|
const DEFAULT_MOCK_PORT = 5174;
|
|
@@ -776,7 +776,7 @@ async function loadDevLaunchContext(options) {
|
|
|
776
776
|
try {
|
|
777
777
|
const { detail, miniProgramId: verifiedMiniProgramId } = await options.logger.task('正在读取远端小程序权限', () => loadRemoteDevContextWithTimeout({
|
|
778
778
|
fetchImpl: options.fetchImpl,
|
|
779
|
-
load: fetchImpl => context.getBoundMiniProgram({
|
|
779
|
+
load: (fetchImpl) => context.getBoundMiniProgram({
|
|
780
780
|
cwd: options.projectRoot,
|
|
781
781
|
env: options.env,
|
|
782
782
|
fetchImpl,
|
|
@@ -790,10 +790,10 @@ async function loadDevLaunchContext(options) {
|
|
|
790
790
|
};
|
|
791
791
|
}
|
|
792
792
|
catch (error) {
|
|
793
|
-
if (error instanceof context.MiniProgramProjectBindingError &&
|
|
794
|
-
error.code !== 'MINI_PROGRAM_UNBOUND') {
|
|
793
|
+
if (error instanceof context.MiniProgramProjectBindingError && error.code !== 'MINI_PROGRAM_UNBOUND') {
|
|
795
794
|
throw error;
|
|
796
795
|
}
|
|
796
|
+
options.logger.debug(`远端 dev context 失败详情:${index.readRedactedErrorMessage(error, { verbose: true })}`);
|
|
797
797
|
options.logger.warn(`未读取到远端 Runtime 权限,Mock runtime 将默认拒绝受管能力:${DEV_CONTEXT_UNAVAILABLE_WARNING}`);
|
|
798
798
|
return {
|
|
799
799
|
source: 'anonymous',
|
|
@@ -1005,9 +1005,7 @@ async function closeAll(closers) {
|
|
|
1005
1005
|
await Promise.allSettled(closers.map((close) => close()));
|
|
1006
1006
|
}
|
|
1007
1007
|
function createLanAddressCandidates(options) {
|
|
1008
|
-
const viteNetworkUrlByHost = new Map(options.viteNetworkUrls
|
|
1009
|
-
.map((url) => [readUrlHost(url), url])
|
|
1010
|
-
.filter((entry) => Boolean(entry[0])));
|
|
1008
|
+
const viteNetworkUrlByHost = new Map(options.viteNetworkUrls.map((url) => [readUrlHost(url), url]).filter((entry) => Boolean(entry[0])));
|
|
1011
1009
|
const candidates = createLanInterfaceCandidates(options.interfaces)
|
|
1012
1010
|
.filter(({ address }) => address === options.hmrHost)
|
|
1013
1011
|
.map(({ address, id, name }) => {
|
|
@@ -1118,9 +1116,7 @@ function isPrivateIPv4(address) {
|
|
|
1118
1116
|
if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) {
|
|
1119
1117
|
return false;
|
|
1120
1118
|
}
|
|
1121
|
-
return
|
|
1122
|
-
(parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) ||
|
|
1123
|
-
(parts[0] === 192 && parts[1] === 168));
|
|
1119
|
+
return parts[0] === 10 || (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) || (parts[0] === 192 && parts[1] === 168);
|
|
1124
1120
|
}
|
|
1125
1121
|
|
|
1126
1122
|
exports.runDevCommand = runDevCommand;
|
|
@@ -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-B0zGksOA.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-B0zGksOA.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-B0zGksOA.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-B0zGksOA.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-B0zGksOA.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-B0zGksOA.cjs', document.baseURI).href)));
|
|
250
250
|
function __require() { return require$1("node:process"); }
|
|
251
251
|
|
|
252
252
|
var help = {};
|
|
@@ -13094,6 +13094,30 @@ function readErrorMessage(error, options = {}) {
|
|
|
13094
13094
|
}
|
|
13095
13095
|
return String(error);
|
|
13096
13096
|
}
|
|
13097
|
+
function readRedactedErrorMessage(error, options = {}) {
|
|
13098
|
+
return redactSensitiveUrls(readErrorMessage(error, options));
|
|
13099
|
+
}
|
|
13100
|
+
function redactSensitiveUrls(message) {
|
|
13101
|
+
return message.replace(/https?:\/\/[^\s<>"'`]+/gi, (rawUrl) => {
|
|
13102
|
+
try {
|
|
13103
|
+
const url = new URL(rawUrl);
|
|
13104
|
+
url.username = '';
|
|
13105
|
+
url.password = '';
|
|
13106
|
+
for (const key of url.searchParams.keys()) {
|
|
13107
|
+
if (/(?:authorization|cookie|password|passwd|pkey|secret|session|token)/i.test(key)) {
|
|
13108
|
+
url.searchParams.set(key, '[REDACTED]');
|
|
13109
|
+
}
|
|
13110
|
+
}
|
|
13111
|
+
if (url.hash) {
|
|
13112
|
+
url.hash = '#[REDACTED]';
|
|
13113
|
+
}
|
|
13114
|
+
return url.toString();
|
|
13115
|
+
}
|
|
13116
|
+
catch {
|
|
13117
|
+
return '[REDACTED_URL]';
|
|
13118
|
+
}
|
|
13119
|
+
});
|
|
13120
|
+
}
|
|
13097
13121
|
|
|
13098
13122
|
/**
|
|
13099
13123
|
* 极简 .env 文件解析器。
|
|
@@ -13323,7 +13347,7 @@ function getPathname(pathWithQuery) {
|
|
|
13323
13347
|
}
|
|
13324
13348
|
|
|
13325
13349
|
const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
|
|
13326
|
-
const BUILT_CLI_VERSION = '0.6.4
|
|
13350
|
+
const BUILT_CLI_VERSION = '0.6.4';
|
|
13327
13351
|
const PACKAGE_JSON_CANDIDATES = [
|
|
13328
13352
|
path.resolve(__dirname, '..', '..', 'package.json'),
|
|
13329
13353
|
path.resolve(__dirname, '..', 'package.json'),
|
|
@@ -13644,31 +13668,31 @@ function createCommandLoggerResolver(options) {
|
|
|
13644
13668
|
};
|
|
13645
13669
|
}
|
|
13646
13670
|
const defaultClearLoginStatus = async (...args) => {
|
|
13647
|
-
const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-
|
|
13671
|
+
const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-ClQuL2r6.cjs'); });
|
|
13648
13672
|
return clearLoginStatus(...args);
|
|
13649
13673
|
};
|
|
13650
13674
|
const defaultLoginToHeybox = async (...args) => {
|
|
13651
|
-
const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-
|
|
13675
|
+
const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-ClQuL2r6.cjs'); });
|
|
13652
13676
|
return loginToHeybox(...args);
|
|
13653
13677
|
};
|
|
13654
13678
|
const defaultPrintLoginStatus = async (...args) => {
|
|
13655
|
-
const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-
|
|
13679
|
+
const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-ClQuL2r6.cjs'); });
|
|
13656
13680
|
return printLoginStatus(...args);
|
|
13657
13681
|
};
|
|
13658
13682
|
const defaultRunCreateCommand = async (...args) => {
|
|
13659
|
-
const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-
|
|
13683
|
+
const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-BHsWWo3V.cjs'); });
|
|
13660
13684
|
return runCreateCommand(...args);
|
|
13661
13685
|
};
|
|
13662
13686
|
const defaultRunDevCommand = async (...args) => {
|
|
13663
|
-
const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-
|
|
13687
|
+
const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-CSjs2OYB.cjs'); });
|
|
13664
13688
|
return runDevCommand(...args);
|
|
13665
13689
|
};
|
|
13666
13690
|
const defaultRunDoctorCommand = async (...args) => {
|
|
13667
|
-
const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-
|
|
13691
|
+
const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-B3AOQgyN.cjs'); });
|
|
13668
13692
|
return runDoctorCommand(...args);
|
|
13669
13693
|
};
|
|
13670
13694
|
const defaultRunRemoteCommand = async (...args) => {
|
|
13671
|
-
const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-
|
|
13695
|
+
const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-ib5THDbw.cjs'); });
|
|
13672
13696
|
return runRemoteCommand(...args);
|
|
13673
13697
|
};
|
|
13674
13698
|
function resolveStandaloneLogger(options, verbose) {
|
|
@@ -13773,6 +13797,7 @@ exports.createCliProgram = createCliProgram;
|
|
|
13773
13797
|
exports.envPaths = envPaths;
|
|
13774
13798
|
exports.getDefaultExportFromCjs = getDefaultExportFromCjs;
|
|
13775
13799
|
exports.readErrorMessage = readErrorMessage;
|
|
13800
|
+
exports.readRedactedErrorMessage = readRedactedErrorMessage;
|
|
13776
13801
|
exports.requireEnvPaths = requireEnvPaths;
|
|
13777
13802
|
exports.requireOnetime = requireOnetime;
|
|
13778
13803
|
exports.requireSafeBuffer = requireSafeBuffer;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index$2 = require('./index-
|
|
3
|
+
var index$2 = require('./index-B0zGksOA.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 context$1 = require('./context-
|
|
10
|
+
var context$1 = require('./context-BEgbP7mM.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');
|
|
@@ -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-D7nmqMiy.cjs');
|
|
7
7
|
var browser = require('./browser-RAy8e8cV.cjs');
|
|
8
|
-
var index = require('./index-
|
|
8
|
+
var index = require('./index-B0zGksOA.cjs');
|
|
9
9
|
require('node:path');
|
|
10
10
|
require('fs');
|
|
11
11
|
require('constants');
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var promises = require('node:readline/promises');
|
|
4
|
-
var index = require('./index-
|
|
5
|
-
var session = require('./session-
|
|
4
|
+
var index = require('./index-B0zGksOA.cjs');
|
|
5
|
+
var session = require('./session-D7nmqMiy.cjs');
|
|
6
6
|
var childProcess = require('node:child_process');
|
|
7
7
|
var fs = require('node:fs');
|
|
8
8
|
var fs$1 = require('node:fs/promises');
|
|
9
9
|
var path = require('node:path');
|
|
10
|
-
var context = require('./context-
|
|
10
|
+
var context = require('./context-BEgbP7mM.cjs');
|
|
11
11
|
require('node:module');
|
|
12
12
|
require('path');
|
|
13
13
|
require('os');
|
|
@@ -264,7 +264,7 @@ async function createDefaultCosClient(uploadToken) {
|
|
|
264
264
|
};
|
|
265
265
|
}
|
|
266
266
|
async function loadCosConstructor() {
|
|
267
|
-
const cosModule = await Promise.resolve().then(function () { return require('./index-
|
|
267
|
+
const cosModule = await Promise.resolve().then(function () { return require('./index-BGFf6g7V.cjs'); }).then(function (n) { return n.index; });
|
|
268
268
|
return cosModule.default;
|
|
269
269
|
}
|
|
270
270
|
function formatSize(bytes) {
|
package/dist/cli.cjs
CHANGED
|
@@ -191,21 +191,6 @@
|
|
|
191
191
|
background: #fff;
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
.inline-field {
|
|
195
|
-
display: flex;
|
|
196
|
-
align-items: center;
|
|
197
|
-
gap: 8px;
|
|
198
|
-
margin-top: 10px;
|
|
199
|
-
color: #475569;
|
|
200
|
-
font-size: 13px;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
.inline-field input {
|
|
204
|
-
width: 16px;
|
|
205
|
-
height: 16px;
|
|
206
|
-
margin: 0;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
194
|
.release-diagnostics {
|
|
210
195
|
display: grid;
|
|
211
196
|
gap: 6px;
|
|
@@ -396,10 +381,6 @@
|
|
|
396
381
|
<option value="enabled">允许</option>
|
|
397
382
|
</select>
|
|
398
383
|
</label>
|
|
399
|
-
<label class="inline-field">
|
|
400
|
-
<input id="official-domain-checkbox" type="checkbox" />
|
|
401
|
-
<span>允许访问小黑盒官方域名</span>
|
|
402
|
-
</label>
|
|
403
384
|
<div class="actions" style="margin-top: 10px">
|
|
404
385
|
<button id="reset-permissions-button" type="button">恢复初始权限</button>
|
|
405
386
|
</div>
|
|
@@ -7,6 +7,58 @@ const MINI_PROGRAM_BRIDGE_NONCE_PARAM = 'hb_mini_bridge_nonce';
|
|
|
7
7
|
/** SDK 向 Runtime 报告 CSP 违规的内部方法名。 */
|
|
8
8
|
const SDK_CSP_VIOLATION_METHOD = 'sdk.csp.violation';
|
|
9
9
|
|
|
10
|
+
const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(['network.request']);
|
|
11
|
+
/**
|
|
12
|
+
* 判断 permission key 是否由 Runtime 权限快照管理。
|
|
13
|
+
*
|
|
14
|
+
* @param key 待判断的 permission key。
|
|
15
|
+
* @returns 该 key 需要读取 Runtime 权限快照时返回 `true`。
|
|
16
|
+
*/
|
|
17
|
+
function isManagedMiniProgramRuntimePermissionKey(key) {
|
|
18
|
+
return MANAGED_RUNTIME_PERMISSION_KEYS.has(key);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 解析服务端权限快照;格式不完整时整份快照失效并 fail closed。
|
|
22
|
+
*
|
|
23
|
+
* @param snapshot 待校验的服务端权限快照。
|
|
24
|
+
* @returns 解析状态和通过校验的受管权限。
|
|
25
|
+
*/
|
|
26
|
+
function parseMiniProgramRuntimePermissions(snapshot) {
|
|
27
|
+
if (!isRecord$2(snapshot) || snapshot.schema_version !== 1 || !Array.isArray(snapshot.entries)) {
|
|
28
|
+
return { valid: false, permissions: {} };
|
|
29
|
+
}
|
|
30
|
+
if (snapshot.revision !== undefined && (typeof snapshot.revision !== 'number' || !Number.isInteger(snapshot.revision) || snapshot.revision < 0)) {
|
|
31
|
+
return { valid: false, permissions: {} };
|
|
32
|
+
}
|
|
33
|
+
const seenKeys = new Set();
|
|
34
|
+
const permissions = {};
|
|
35
|
+
for (const rawEntry of snapshot.entries) {
|
|
36
|
+
if (!isRecord$2(rawEntry) || typeof rawEntry.key !== 'string' || !rawEntry.key.trim()) {
|
|
37
|
+
return { valid: false, permissions: {} };
|
|
38
|
+
}
|
|
39
|
+
const key = rawEntry.key.trim();
|
|
40
|
+
if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled') || !isRecord$2(rawEntry.config)) {
|
|
41
|
+
return { valid: false, permissions: {} };
|
|
42
|
+
}
|
|
43
|
+
seenKeys.add(key);
|
|
44
|
+
if (!isManagedMiniProgramRuntimePermissionKey(key)) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (key === 'network.request' && typeof rawEntry.config.useOfficialDomain !== 'boolean') {
|
|
48
|
+
return { valid: false, permissions: {} };
|
|
49
|
+
}
|
|
50
|
+
permissions[key] = {
|
|
51
|
+
key,
|
|
52
|
+
status: rawEntry.status,
|
|
53
|
+
config: { useOfficialDomain: rawEntry.config.useOfficialDomain },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return { valid: true, permissions };
|
|
57
|
+
}
|
|
58
|
+
function isRecord$2(value) {
|
|
59
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
60
|
+
}
|
|
61
|
+
|
|
10
62
|
/**
|
|
11
63
|
* 登录授权能力方法名。
|
|
12
64
|
*
|
|
@@ -3452,9 +3504,15 @@ const DEFAULT_PERMISSION_STATE = {
|
|
|
3452
3504
|
},
|
|
3453
3505
|
};
|
|
3454
3506
|
function createMiniProgramMockPermissionState(context) {
|
|
3455
|
-
const parsed =
|
|
3456
|
-
|
|
3457
|
-
|
|
3507
|
+
const parsed = parseMiniProgramRuntimePermissions(context.runtimePermissions);
|
|
3508
|
+
const networkRequest = parsed.permissions['network.request'];
|
|
3509
|
+
return parsed.valid && networkRequest
|
|
3510
|
+
? {
|
|
3511
|
+
networkRequest: {
|
|
3512
|
+
status: networkRequest.status,
|
|
3513
|
+
useOfficialDomain: networkRequest.config.useOfficialDomain === true,
|
|
3514
|
+
},
|
|
3515
|
+
}
|
|
3458
3516
|
: cloneDefaultPermissionState();
|
|
3459
3517
|
}
|
|
3460
3518
|
function createMiniProgramMockRuntimePermissions(state) {
|
|
@@ -3481,7 +3539,7 @@ function createMiniProgramDevReleaseDiagnostics(context, localState) {
|
|
|
3481
3539
|
},
|
|
3482
3540
|
];
|
|
3483
3541
|
}
|
|
3484
|
-
const parsedRemote =
|
|
3542
|
+
const parsedRemote = parseMiniProgramRuntimePermissions(context.runtimePermissions);
|
|
3485
3543
|
if (!parsedRemote.valid) {
|
|
3486
3544
|
return [
|
|
3487
3545
|
{
|
|
@@ -3491,9 +3549,14 @@ function createMiniProgramDevReleaseDiagnostics(context, localState) {
|
|
|
3491
3549
|
},
|
|
3492
3550
|
];
|
|
3493
3551
|
}
|
|
3494
|
-
const
|
|
3495
|
-
|
|
3496
|
-
|
|
3552
|
+
const remoteNetworkRequest = parsedRemote.permissions['network.request'];
|
|
3553
|
+
const remoteState = remoteNetworkRequest
|
|
3554
|
+
? {
|
|
3555
|
+
status: remoteNetworkRequest.status,
|
|
3556
|
+
useOfficialDomain: remoteNetworkRequest.config.useOfficialDomain === true,
|
|
3557
|
+
}
|
|
3558
|
+
: DEFAULT_PERMISSION_STATE.networkRequest;
|
|
3559
|
+
if (localState.networkRequest.status === 'enabled' && remoteState.status !== 'enabled') {
|
|
3497
3560
|
return [
|
|
3498
3561
|
{
|
|
3499
3562
|
code: 'NETWORK_REQUEST_DISABLED_ONLINE',
|
|
@@ -3502,9 +3565,7 @@ function createMiniProgramDevReleaseDiagnostics(context, localState) {
|
|
|
3502
3565
|
},
|
|
3503
3566
|
];
|
|
3504
3567
|
}
|
|
3505
|
-
if (localState.networkRequest.status === 'enabled' &&
|
|
3506
|
-
localState.networkRequest.useOfficialDomain &&
|
|
3507
|
-
!remoteState.useOfficialDomain) {
|
|
3568
|
+
if (localState.networkRequest.status === 'enabled' && localState.networkRequest.useOfficialDomain && !remoteState.useOfficialDomain) {
|
|
3508
3569
|
return [
|
|
3509
3570
|
{
|
|
3510
3571
|
code: 'OFFICIAL_DOMAIN_DISABLED_ONLINE',
|
|
@@ -3515,49 +3576,11 @@ function createMiniProgramDevReleaseDiagnostics(context, localState) {
|
|
|
3515
3576
|
}
|
|
3516
3577
|
return [];
|
|
3517
3578
|
}
|
|
3518
|
-
function parseRuntimePermissions(snapshot) {
|
|
3519
|
-
if (!isRecord$2(snapshot) || snapshot.schema_version !== 1 || !Array.isArray(snapshot.entries)) {
|
|
3520
|
-
return { valid: false };
|
|
3521
|
-
}
|
|
3522
|
-
if (snapshot.revision !== undefined &&
|
|
3523
|
-
(typeof snapshot.revision !== 'number' ||
|
|
3524
|
-
!Number.isInteger(snapshot.revision) ||
|
|
3525
|
-
snapshot.revision < 0)) {
|
|
3526
|
-
return { valid: false };
|
|
3527
|
-
}
|
|
3528
|
-
const seenKeys = new Set();
|
|
3529
|
-
let networkRequest;
|
|
3530
|
-
for (const entry of snapshot.entries) {
|
|
3531
|
-
if (!isRecord$2(entry) || typeof entry.key !== 'string' || !entry.key.trim()) {
|
|
3532
|
-
return { valid: false };
|
|
3533
|
-
}
|
|
3534
|
-
const key = entry.key.trim();
|
|
3535
|
-
if (seenKeys.has(key) ||
|
|
3536
|
-
(entry.status !== 'enabled' && entry.status !== 'disabled') ||
|
|
3537
|
-
!isRecord$2(entry.config)) {
|
|
3538
|
-
return { valid: false };
|
|
3539
|
-
}
|
|
3540
|
-
seenKeys.add(key);
|
|
3541
|
-
if (key === 'network.request') {
|
|
3542
|
-
if (typeof entry.config.useOfficialDomain !== 'boolean') {
|
|
3543
|
-
return { valid: false };
|
|
3544
|
-
}
|
|
3545
|
-
networkRequest = {
|
|
3546
|
-
status: entry.status,
|
|
3547
|
-
useOfficialDomain: entry.config.useOfficialDomain,
|
|
3548
|
-
};
|
|
3549
|
-
}
|
|
3550
|
-
}
|
|
3551
|
-
return { valid: true, networkRequest };
|
|
3552
|
-
}
|
|
3553
3579
|
function cloneDefaultPermissionState() {
|
|
3554
3580
|
return {
|
|
3555
3581
|
networkRequest: { ...DEFAULT_PERMISSION_STATE.networkRequest },
|
|
3556
3582
|
};
|
|
3557
3583
|
}
|
|
3558
|
-
function isRecord$2(value) {
|
|
3559
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
3560
|
-
}
|
|
3561
3584
|
|
|
3562
3585
|
async function getMiniProgramRuntimeUserInfo(platformAdapter) {
|
|
3563
3586
|
const userId = await resolveCurrentUserId(platformAdapter);
|
|
@@ -5145,46 +5168,11 @@ function isOfficialMiniProgramNetworkUrl(value) {
|
|
|
5145
5168
|
}
|
|
5146
5169
|
}
|
|
5147
5170
|
|
|
5148
|
-
const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(['network.request']);
|
|
5149
|
-
/** 解析服务端权限快照;格式不完整时整份快照失效并 fail closed。 */
|
|
5150
|
-
function parseMiniProgramRuntimePermissions(snapshot) {
|
|
5151
|
-
if (!isRecord$1(snapshot) || snapshot.schema_version !== 1 || !Array.isArray(snapshot.entries)) {
|
|
5152
|
-
return { valid: false, permissions: {} };
|
|
5153
|
-
}
|
|
5154
|
-
if (snapshot.revision !== undefined &&
|
|
5155
|
-
(typeof snapshot.revision !== 'number' || !Number.isInteger(snapshot.revision) || snapshot.revision < 0)) {
|
|
5156
|
-
return { valid: false, permissions: {} };
|
|
5157
|
-
}
|
|
5158
|
-
const seenKeys = new Set();
|
|
5159
|
-
const permissions = {};
|
|
5160
|
-
for (const rawEntry of snapshot.entries) {
|
|
5161
|
-
if (!isRecord$1(rawEntry) || typeof rawEntry.key !== 'string' || !rawEntry.key.trim()) {
|
|
5162
|
-
return { valid: false, permissions: {} };
|
|
5163
|
-
}
|
|
5164
|
-
const key = rawEntry.key.trim();
|
|
5165
|
-
if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled') || !isRecord$1(rawEntry.config)) {
|
|
5166
|
-
return { valid: false, permissions: {} };
|
|
5167
|
-
}
|
|
5168
|
-
seenKeys.add(key);
|
|
5169
|
-
if (!MANAGED_RUNTIME_PERMISSION_KEYS.has(key)) {
|
|
5170
|
-
continue;
|
|
5171
|
-
}
|
|
5172
|
-
if (key === 'network.request' && typeof rawEntry.config.useOfficialDomain !== 'boolean') {
|
|
5173
|
-
return { valid: false, permissions: {} };
|
|
5174
|
-
}
|
|
5175
|
-
permissions[key] = {
|
|
5176
|
-
key,
|
|
5177
|
-
status: rawEntry.status,
|
|
5178
|
-
config: { useOfficialDomain: rawEntry.config.useOfficialDomain },
|
|
5179
|
-
};
|
|
5180
|
-
}
|
|
5181
|
-
return { valid: true, permissions };
|
|
5182
|
-
}
|
|
5183
5171
|
/** 创建只依赖启动快照的纯权限 evaluator,供正式 Runtime 与 Mock Host 共用。 */
|
|
5184
5172
|
function createMiniProgramRuntimePermissionEvaluator(snapshot) {
|
|
5185
5173
|
const parsed = parseMiniProgramRuntimePermissions(snapshot);
|
|
5186
5174
|
return (permissionKey, payload) => {
|
|
5187
|
-
if (!
|
|
5175
|
+
if (!isManagedMiniProgramRuntimePermissionKey(permissionKey)) {
|
|
5188
5176
|
return { allowed: true };
|
|
5189
5177
|
}
|
|
5190
5178
|
const entry = parsed.valid ? parsed.permissions[permissionKey] : undefined;
|
|
@@ -6431,7 +6419,6 @@ const elements = {
|
|
|
6431
6419
|
mobileQrStatus: queryElement('#mobile-qr-status'),
|
|
6432
6420
|
nicknameInput: queryElement('#nickname-input'),
|
|
6433
6421
|
networkPermissionSelect: queryElement('#network-permission-select'),
|
|
6434
|
-
officialDomainCheckbox: queryElement('#official-domain-checkbox'),
|
|
6435
6422
|
releaseDiagnostics: queryElement('#release-diagnostics'),
|
|
6436
6423
|
resetPermissionsButton: queryElement('#reset-permissions-button'),
|
|
6437
6424
|
storageSnapshot: queryElement('#storage-snapshot'),
|
|
@@ -6511,10 +6498,6 @@ elements.networkPermissionSelect.addEventListener('change', () => {
|
|
|
6511
6498
|
elements.networkPermissionSelect.value === 'enabled' ? 'enabled' : 'disabled';
|
|
6512
6499
|
rebuildRuntimeWithPermissions();
|
|
6513
6500
|
});
|
|
6514
|
-
elements.officialDomainCheckbox.addEventListener('change', () => {
|
|
6515
|
-
permissionState.networkRequest.useOfficialDomain = elements.officialDomainCheckbox.checked;
|
|
6516
|
-
rebuildRuntimeWithPermissions();
|
|
6517
|
-
});
|
|
6518
6501
|
elements.resetPermissionsButton.addEventListener('click', () => {
|
|
6519
6502
|
permissionState = clonePermissionState(initialPermissionState);
|
|
6520
6503
|
rebuildRuntimeWithPermissions();
|
|
@@ -6536,8 +6519,6 @@ function updatePermissionControls() {
|
|
|
6536
6519
|
? `已连接线上配置${devContext.miniProgramId ? ` · ${devContext.miniProgramId}` : ''}`
|
|
6537
6520
|
: '匿名本地沙箱';
|
|
6538
6521
|
elements.networkPermissionSelect.value = permissionState.networkRequest.status;
|
|
6539
|
-
elements.officialDomainCheckbox.checked = permissionState.networkRequest.useOfficialDomain;
|
|
6540
|
-
elements.officialDomainCheckbox.disabled = permissionState.networkRequest.status !== 'enabled';
|
|
6541
6522
|
const diagnostics = createMiniProgramDevReleaseDiagnostics(devContext, permissionState);
|
|
6542
6523
|
elements.releaseDiagnostics.innerHTML = diagnostics
|
|
6543
6524
|
.map((diagnostic) => `<li>${escapeHtml(diagnostic.message)}</li>`)
|
package/dist/index.cjs.js
CHANGED