@heybox/hb-sdk 0.6.7-alpha.0 → 0.6.7-alpha.2
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/{build-mTmtBJbp.cjs → build-CQmYxfxm.cjs} +25 -29
- package/dist/cli-chunks/{context-wI8oXc58.cjs → context-ChkYWwH_.cjs} +23 -122
- package/dist/cli-chunks/{create-DEwECU7u.cjs → create-CC5r_8bL.cjs} +1 -1
- package/dist/cli-chunks/{dev-BZ7FJEeZ.cjs → dev-CD-38TgO.cjs} +110 -21
- package/dist/cli-chunks/{doctor-DbJQPPs2.cjs → doctor-43yEfVr0.cjs} +1 -1
- package/dist/cli-chunks/{index-UecHob74.cjs → index-BM6oH2Hs.cjs} +3 -3
- package/dist/cli-chunks/{runtime-permission-env-BSs4uCNa.cjs → index-BQm5XmMC.cjs} +0 -71
- package/dist/cli-chunks/{index-Df14XqmW.cjs → index-CQnkS0Z8.cjs} +14 -14
- package/dist/cli-chunks/{login-BzSUtgRH.cjs → login-BmisXAdp.cjs} +2 -2
- package/dist/cli-chunks/{project-vite-D2Hx7XPp.cjs → project-vite-D9_v57vp.cjs} +1 -1
- package/dist/cli-chunks/{remote-BZiSfXOm.cjs → remote-BXtT6M2f.cjs} +22 -40
- package/dist/cli-chunks/{runtime-gate--rPXjiG6.cjs → runtime-gate-B2MQf1vc.cjs} +3 -3
- package/dist/cli-chunks/{session-CqycMFvy.cjs → session-BjtjhtPg.cjs} +1 -1
- package/dist/cli.cjs +1 -1
- package/dist/devtools/mock-host/main.js +187 -21
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/vite.cjs.js +50 -28
- package/dist/vite.esm.js +50 -28
- package/package.json +1 -1
- package/skill/references/api-root.md +7 -9
- package/skill/skill.json +4 -4
- package/types/vite/html-policy.d.ts +0 -1
- package/types/vite/index.d.ts +1 -0
- package/types/vite/runtime-permission-env.d.ts +0 -9
package/README.md
CHANGED
|
@@ -598,11 +598,11 @@ export default defineConfig({
|
|
|
598
598
|
|
|
599
599
|
工坊小程序构建产物只能在兼容的小黑盒 Runtime 中启动。普通浏览器直接打开时不会执行标准业务脚本,并会提示在小黑盒 APP 内打开。项目应使用标准 Vite module 入口。
|
|
600
600
|
|
|
601
|
-
插件只接受单页应用:输出目录只能存在入口 `index.html
|
|
601
|
+
插件只接受单页应用:输出目录只能存在入口 `index.html`。build 和 dev 都会把平台 CSP 插入 `<head>` 首位,已有 CSP 始终原样保留;两份策略按浏览器交集生效。平台 CSP 在脚本、样式、图片、字体和媒体指令中放行 `xiaoheihe.cn`、`max-c.com`、`debugmode.cn`、`maxjia.com` 的 HTTPS 根域及子域;入口 HTML 中相应资源标签也可使用这些官方 HTTPS URL。
|
|
602
602
|
|
|
603
|
-
平台 CSP 会禁止 `fetch`、XHR、WebSocket、EventSource、Beacon、Worker、iframe
|
|
603
|
+
平台 CSP 会禁止 `fetch`、XHR、WebSocket、EventSource、Beacon、Worker、iframe、表单和对象加载等浏览器原生出口;`connect-src` 始终为 `'none'`,dev 只额外放行当前 Vite 的精确 HMR WebSocket 地址。需要宿主授权的业务网络请求仍应使用 `network.request()`。
|
|
604
604
|
|
|
605
|
-
meta refresh、外部 anchor、`dns-prefetch`、`preconnect`、`prerender
|
|
605
|
+
meta refresh、外部 anchor、`dns-prefetch`、`preconnect`、`prerender`、非官方外部资源 URL 和额外 HTML 会使 build 失败。内联 script/style 允许,但 `unsafe-eval` 不允许。`dev`、`hb-sdk build` 和手动 Vite build 都不请求远端最低 SDK 版本;构建仍会把当前 `sdkVersion` 写入 Manifest,`hb-sdk remote deploy` 仍校验 Manifest 结构并经过服务端 precheck / submit-audit 策略。
|
|
606
606
|
|
|
607
607
|
失败与警告语义:
|
|
608
608
|
|
|
@@ -3,11 +3,10 @@
|
|
|
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
|
|
7
|
-
var runtimeGate = require('./runtime-gate
|
|
8
|
-
var index = require('./index-
|
|
9
|
-
var projectVite = require('./project-vite-
|
|
10
|
-
require('node:async_hooks');
|
|
6
|
+
var index$1 = require('./index-BQm5XmMC.cjs');
|
|
7
|
+
var runtimeGate = require('./runtime-gate-B2MQf1vc.cjs');
|
|
8
|
+
var index = require('./index-CQnkS0Z8.cjs');
|
|
9
|
+
var projectVite = require('./project-vite-D9_v57vp.cjs');
|
|
11
10
|
require('node:module');
|
|
12
11
|
require('path');
|
|
13
12
|
require('os');
|
|
@@ -26,28 +25,25 @@ async function runBuildCommand(_options = {}, runtime = {}) {
|
|
|
26
25
|
const distDir = path.join(projectRoot, 'dist');
|
|
27
26
|
const env = runtime.env ?? process.env;
|
|
28
27
|
const mode = env.HB_SDK_ENV?.trim() || undefined;
|
|
29
|
-
const skipPlatformCsp = runtimePermissionEnv.shouldSkipMiniappPlatformCspFromEnv(env);
|
|
30
28
|
await fs.rm(distDir, { force: true, recursive: true });
|
|
31
29
|
try {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return result;
|
|
50
|
-
}, env);
|
|
30
|
+
const vite = await logger.task('正在加载项目 Vite', () => projectVite.loadProjectVite(projectRoot), {
|
|
31
|
+
successText: '已加载项目 Vite',
|
|
32
|
+
});
|
|
33
|
+
await logger.task('正在构建小程序', () => vite.build({
|
|
34
|
+
root: projectRoot,
|
|
35
|
+
...(mode ? { mode } : {}),
|
|
36
|
+
plugins: [createFixedBuildOutputPlugin(projectRoot)],
|
|
37
|
+
build: {
|
|
38
|
+
outDir: 'dist',
|
|
39
|
+
emptyOutDir: true,
|
|
40
|
+
watch: null,
|
|
41
|
+
write: true,
|
|
42
|
+
},
|
|
43
|
+
}), { successText: 'Vite 构建完成' });
|
|
44
|
+
const result = await validateBuildOutput(projectRoot, logger);
|
|
45
|
+
logger.success(`构建完成: dist/ | manifest version ${result.version} | sdkVersion ${result.sdkVersion} | 待上传文件 ${result.fileCount} 个 | ${formatSize(result.totalBytes)}`);
|
|
46
|
+
return result;
|
|
51
47
|
}
|
|
52
48
|
catch (error) {
|
|
53
49
|
await fs.rm(distDir, { force: true, recursive: true });
|
|
@@ -93,8 +89,8 @@ async function validateBuildOutput(projectRoot, logger) {
|
|
|
93
89
|
}
|
|
94
90
|
const { sdkVersion, version } = runtimeGate.validateMiniappManifestForDeploy(manifest);
|
|
95
91
|
const allFiles = await walkDistFiles(distDir);
|
|
96
|
-
const uploadFiles = allFiles.filter((file) =>
|
|
97
|
-
const sizeError =
|
|
92
|
+
const uploadFiles = allFiles.filter((file) => index$1.shouldUploadDistFile(file.relativePath));
|
|
93
|
+
const sizeError = index$1.validateUploadTotalSize(uploadFiles);
|
|
98
94
|
if (sizeError) {
|
|
99
95
|
throw new Error(sizeError.replace('重新 deploy', '重新 build'));
|
|
100
96
|
}
|
|
@@ -114,12 +110,12 @@ async function walkDistFiles(distDir) {
|
|
|
114
110
|
const entries = await fs.readdir(absDir, { withFileTypes: true });
|
|
115
111
|
for (const entry of entries) {
|
|
116
112
|
const absPath = path.join(absDir, entry.name);
|
|
117
|
-
const relPath =
|
|
113
|
+
const relPath = index$1.normalizeRelativePath(relDir ? `${relDir}/${entry.name}` : entry.name);
|
|
118
114
|
const link = await fs.lstat(absPath);
|
|
119
115
|
if (link.isSymbolicLink()) {
|
|
120
116
|
throw new Error(`dist 目录包含 symlink,拒绝处理:${relPath}`);
|
|
121
117
|
}
|
|
122
|
-
if (
|
|
118
|
+
if (index$1.relativePathContainsNodeModulesSegment(relPath)) {
|
|
123
119
|
throw new Error(`dist 目录含 node_modules:${relPath}`);
|
|
124
120
|
}
|
|
125
121
|
if (entry.isDirectory()) {
|
|
@@ -1,106 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var session = require('./session-
|
|
4
|
-
var
|
|
3
|
+
var session = require('./session-BjtjhtPg.cjs');
|
|
4
|
+
var index = require('./index-BQm5XmMC.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
|
-
/**
|
|
11
|
-
* 判断 permission key 是否由 Runtime 权限快照管理。
|
|
12
|
-
*
|
|
13
|
-
* @param key 待判断的 permission key。
|
|
14
|
-
* @returns 该 key 需要读取 Runtime 权限快照时返回 `true`。
|
|
15
|
-
*/
|
|
16
|
-
function isManagedMiniProgramRuntimePermissionKey(key) {
|
|
17
|
-
return MANAGED_RUNTIME_PERMISSION_KEYS.has(key);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* 解析服务端权限快照;格式不完整时整份快照失效并 fail closed。
|
|
21
|
-
*
|
|
22
|
-
* @param snapshot 待校验的服务端权限快照。
|
|
23
|
-
* @returns 解析状态和通过校验的受管权限。
|
|
24
|
-
*/
|
|
25
|
-
function parseMiniProgramRuntimePermissions(snapshot) {
|
|
26
|
-
if (!isRecord(snapshot) || snapshot.schema_version !== 1 || !Array.isArray(snapshot.entries)) {
|
|
27
|
-
return { valid: false, permissions: {} };
|
|
28
|
-
}
|
|
29
|
-
if (snapshot.revision !== undefined && (typeof snapshot.revision !== 'number' || !Number.isInteger(snapshot.revision) || snapshot.revision < 0)) {
|
|
30
|
-
return { valid: false, permissions: {} };
|
|
31
|
-
}
|
|
32
|
-
const seenKeys = new Set();
|
|
33
|
-
const permissions = {};
|
|
34
|
-
for (const rawEntry of snapshot.entries) {
|
|
35
|
-
if (!isRecord(rawEntry) || typeof rawEntry.key !== 'string' || !rawEntry.key.trim()) {
|
|
36
|
-
return { valid: false, permissions: {} };
|
|
37
|
-
}
|
|
38
|
-
const key = rawEntry.key.trim();
|
|
39
|
-
if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled') || !isRecord(rawEntry.config)) {
|
|
40
|
-
return { valid: false, permissions: {} };
|
|
41
|
-
}
|
|
42
|
-
seenKeys.add(key);
|
|
43
|
-
if (!isManagedMiniProgramRuntimePermissionKey(key)) {
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
if (key === 'network.request' && typeof rawEntry.config.useOfficialDomain !== 'boolean') {
|
|
47
|
-
return { valid: false, permissions: {} };
|
|
48
|
-
}
|
|
49
|
-
permissions[key] = {
|
|
50
|
-
key,
|
|
51
|
-
status: rawEntry.status,
|
|
52
|
-
config: { useOfficialDomain: rawEntry.config.useOfficialDomain },
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
return { valid: true, permissions };
|
|
56
|
-
}
|
|
57
|
-
function isRecord(value) {
|
|
58
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const DEFAULT_PERMISSION_STATE = {
|
|
62
|
-
networkRequest: {
|
|
63
|
-
status: 'disabled',
|
|
64
|
-
useOfficialDomain: false,
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
function createMiniProgramMockPermissionState(context) {
|
|
68
|
-
const parsed = parseMiniProgramRuntimePermissions(context.runtimePermissions);
|
|
69
|
-
const networkRequest = parsed.permissions['network.request'];
|
|
70
|
-
return parsed.valid && networkRequest
|
|
71
|
-
? {
|
|
72
|
-
networkRequest: {
|
|
73
|
-
status: networkRequest.status,
|
|
74
|
-
useOfficialDomain: networkRequest.config.useOfficialDomain === true,
|
|
75
|
-
},
|
|
76
|
-
}
|
|
77
|
-
: cloneDefaultPermissionState();
|
|
78
|
-
}
|
|
79
|
-
function shouldSkipMiniappPlatformCsp(runtimePermissions) {
|
|
80
|
-
const parsed = parseMiniProgramRuntimePermissions(runtimePermissions);
|
|
81
|
-
const networkRequest = parsed.permissions['network.request'];
|
|
82
|
-
return parsed.valid && networkRequest?.status === 'enabled' && networkRequest.config.useOfficialDomain === true;
|
|
83
|
-
}
|
|
84
|
-
function createMiniProgramMockRuntimePermissions(state) {
|
|
85
|
-
return {
|
|
86
|
-
schema_version: 1,
|
|
87
|
-
entries: [
|
|
88
|
-
{
|
|
89
|
-
key: 'network.request',
|
|
90
|
-
status: state.networkRequest.status,
|
|
91
|
-
config: {
|
|
92
|
-
useOfficialDomain: state.networkRequest.useOfficialDomain,
|
|
93
|
-
},
|
|
94
|
-
},
|
|
95
|
-
],
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
function cloneDefaultPermissionState() {
|
|
99
|
-
return {
|
|
100
|
-
networkRequest: { ...DEFAULT_PERMISSION_STATE.networkRequest },
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
9
|
function createRemoteApiClient(options) {
|
|
105
10
|
return {
|
|
106
11
|
listDeveloperEntities: () => listDeveloperEntities(options),
|
|
@@ -127,74 +32,74 @@ function createRemoteApiClient(options) {
|
|
|
127
32
|
};
|
|
128
33
|
}
|
|
129
34
|
async function listDeveloperEntities(runtime) {
|
|
130
|
-
return remoteGet(
|
|
35
|
+
return remoteGet(index.DEVELOPER_ENTITY_LIST_API_PATH, {}, runtime);
|
|
131
36
|
}
|
|
132
37
|
async function switchDeveloperEntity(options, runtime) {
|
|
133
|
-
return (await remotePostForm(
|
|
38
|
+
return (await remotePostForm(index.DEVELOPER_ENTITY_SWITCH_API_PATH, options, runtime, { requireResult: false })) ?? {};
|
|
134
39
|
}
|
|
135
40
|
async function getDeveloperAccessStatus(runtime) {
|
|
136
|
-
return remoteGet(
|
|
41
|
+
return remoteGet(index.USER_MINIPROGRAM_ACCESS_STATUS_API_PATH, {}, runtime);
|
|
137
42
|
}
|
|
138
43
|
async function listUserMiniprograms(options, runtime) {
|
|
139
|
-
return remoteGet(
|
|
44
|
+
return remoteGet(index.LIST_USER_MINIPROGRAM_API_PATH, options, runtime);
|
|
140
45
|
}
|
|
141
46
|
async function createUserMiniprogram(runtime) {
|
|
142
|
-
return remotePostForm(
|
|
47
|
+
return remotePostForm(index.CREATE_USER_MINIPROGRAM_API_PATH, {}, runtime);
|
|
143
48
|
}
|
|
144
49
|
async function getUserMiniprogramDetail(options, runtime) {
|
|
145
|
-
return remoteGet(
|
|
50
|
+
return remoteGet(index.DETAIL_USER_MINIPROGRAM_API_PATH, options, runtime);
|
|
146
51
|
}
|
|
147
52
|
async function getPreviewAllowlist(options, runtime) {
|
|
148
|
-
return remoteGet(
|
|
53
|
+
return remoteGet(index.USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH, options, runtime);
|
|
149
54
|
}
|
|
150
55
|
async function updatePreviewAllowlist(options, runtime) {
|
|
151
|
-
return remotePostForm(
|
|
56
|
+
return remotePostForm(index.UPDATE_USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH, options, runtime);
|
|
152
57
|
}
|
|
153
58
|
async function createUserMiniprogramLeaderboard(options, runtime) {
|
|
154
|
-
return remotePostForm(
|
|
59
|
+
return remotePostForm(index.CREATE_USER_MINIPROGRAM_LEADERBOARD_API_PATH, options, runtime);
|
|
155
60
|
}
|
|
156
61
|
async function getUserMiniprogramLeaderboard(options, runtime) {
|
|
157
|
-
return remoteGet(
|
|
62
|
+
return remoteGet(index.DETAIL_USER_MINIPROGRAM_LEADERBOARD_API_PATH, options, runtime);
|
|
158
63
|
}
|
|
159
64
|
async function listUserMiniprogramLeaderboards(options, runtime) {
|
|
160
|
-
return remoteGet(
|
|
65
|
+
return remoteGet(index.LIST_USER_MINIPROGRAM_LEADERBOARD_API_PATH, options, runtime);
|
|
161
66
|
}
|
|
162
67
|
async function deleteUserMiniprogramLeaderboard(options, runtime) {
|
|
163
|
-
return (await remotePostForm(
|
|
68
|
+
return (await remotePostForm(index.DELETE_USER_MINIPROGRAM_LEADERBOARD_API_PATH, options, runtime, { requireResult: false })) ?? {};
|
|
164
69
|
}
|
|
165
70
|
async function precheckUserMiniprogramVersion(options, runtime) {
|
|
166
|
-
return remotePostForm(
|
|
71
|
+
return remotePostForm(index.PRECHECK_USER_MINIPROGRAM_VERSION_API_PATH, options, runtime);
|
|
167
72
|
}
|
|
168
73
|
async function submitUserMiniprogramAudit(options, runtime) {
|
|
169
74
|
const form = { ...options };
|
|
170
75
|
if (form.manifest && typeof form.manifest !== 'string') {
|
|
171
76
|
form.manifest = JSON.stringify(form.manifest);
|
|
172
77
|
}
|
|
173
|
-
return remotePostForm(
|
|
78
|
+
return remotePostForm(index.SUBMIT_USER_MINIPROGRAM_AUDIT_API_PATH, form, runtime);
|
|
174
79
|
}
|
|
175
80
|
async function getVersionPreviewInfo(options, runtime) {
|
|
176
|
-
return remoteGet(
|
|
81
|
+
return remoteGet(index.USER_MINIPROGRAM_VERSION_PREVIEW_INFO_API_PATH, {
|
|
177
82
|
mini_program_id: options.mini_program_id,
|
|
178
83
|
preview_version: options.version,
|
|
179
84
|
}, runtime);
|
|
180
85
|
}
|
|
181
86
|
async function withdrawUserMiniprogramVersion(options, runtime) {
|
|
182
|
-
return remotePostForm(
|
|
87
|
+
return remotePostForm(index.WITHDRAW_USER_MINIPROGRAM_VERSION_API_PATH, options, runtime);
|
|
183
88
|
}
|
|
184
89
|
async function releaseUserMiniprogramVersion(options, runtime) {
|
|
185
|
-
return remotePostForm(
|
|
90
|
+
return remotePostForm(index.RELEASE_USER_MINIPROGRAM_VERSION_API_PATH, options, runtime);
|
|
186
91
|
}
|
|
187
92
|
async function takeDownUserMiniprogram(options, runtime) {
|
|
188
|
-
return remotePostForm(
|
|
93
|
+
return remotePostForm(index.TAKE_DOWN_USER_MINIPROGRAM_API_PATH, options, runtime);
|
|
189
94
|
}
|
|
190
95
|
async function reopenUserMiniprogram(options, runtime) {
|
|
191
|
-
return remotePostForm(
|
|
96
|
+
return remotePostForm(index.REOPEN_USER_MINIPROGRAM_API_PATH, options, runtime);
|
|
192
97
|
}
|
|
193
98
|
async function updateSquareDisplay(options, runtime) {
|
|
194
|
-
return remotePostForm(
|
|
99
|
+
return remotePostForm(index.UPDATE_SQUARE_DISPLAY_API_PATH, options, runtime);
|
|
195
100
|
}
|
|
196
101
|
async function listUserMiniprogramVersions(options, runtime) {
|
|
197
|
-
return remoteGet(
|
|
102
|
+
return remoteGet(index.LIST_USER_MINIPROGRAM_VERSION_API_PATH, options, runtime);
|
|
198
103
|
}
|
|
199
104
|
async function remoteGet(path, query, runtime) {
|
|
200
105
|
const pathWithQuery = createPathWithQuery(path, query);
|
|
@@ -397,14 +302,10 @@ function isTruthyEnvFlag(value) {
|
|
|
397
302
|
}
|
|
398
303
|
|
|
399
304
|
exports.MiniProgramProjectBindingError = MiniProgramProjectBindingError;
|
|
400
|
-
exports.createMiniProgramMockPermissionState = createMiniProgramMockPermissionState;
|
|
401
|
-
exports.createMiniProgramMockRuntimePermissions = createMiniProgramMockRuntimePermissions;
|
|
402
305
|
exports.createRemoteApiClientForEnvironment = createRemoteApiClientForEnvironment;
|
|
403
306
|
exports.getBoundMiniProgram = getBoundMiniProgram;
|
|
404
|
-
exports.parseMiniProgramRuntimePermissions = parseMiniProgramRuntimePermissions;
|
|
405
307
|
exports.readBoundMiniProgramId = readBoundMiniProgramId;
|
|
406
308
|
exports.readBoundMiniProgramIdFromPackageJson = readBoundMiniProgramIdFromPackageJson;
|
|
407
309
|
exports.readMiniProgramProjectPackage = readMiniProgramProjectPackage;
|
|
408
310
|
exports.resolveRemoteEnvironment = resolveRemoteEnvironment;
|
|
409
|
-
exports.shouldSkipMiniappPlatformCsp = shouldSkipMiniappPlatformCsp;
|
|
410
311
|
exports.writeBoundMiniProgramId = writeBoundMiniProgramId;
|
|
@@ -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-CQnkS0Z8.cjs');
|
|
9
9
|
require('node:module');
|
|
10
10
|
require('os');
|
|
11
11
|
require('readline');
|
|
@@ -6,33 +6,32 @@ var path = require('node:path');
|
|
|
6
6
|
var net = require('node:net');
|
|
7
7
|
var promises = require('node:dns/promises');
|
|
8
8
|
var node_http = require('node:http');
|
|
9
|
-
var context = require('./context-wI8oXc58.cjs');
|
|
10
9
|
var node_crypto = require('node:crypto');
|
|
11
10
|
var undici = require('undici');
|
|
12
11
|
var browser = require('./browser-RAy8e8cV.cjs');
|
|
13
|
-
var index = require('./index-
|
|
14
|
-
var projectVite = require('./project-vite-
|
|
12
|
+
var index = require('./index-CQnkS0Z8.cjs');
|
|
13
|
+
var projectVite = require('./project-vite-D9_v57vp.cjs');
|
|
14
|
+
var context = require('./context-ChkYWwH_.cjs');
|
|
15
15
|
var fs$1 = require('node:fs/promises');
|
|
16
|
-
var runtimePermissionEnv = require('./runtime-permission-env-BSs4uCNa.cjs');
|
|
17
|
-
require('./session-CqycMFvy.cjs');
|
|
18
|
-
require('fs');
|
|
19
|
-
require('constants');
|
|
20
|
-
require('stream');
|
|
21
|
-
require('util');
|
|
22
|
-
require('assert');
|
|
23
|
-
require('path');
|
|
24
16
|
require('node:process');
|
|
25
17
|
require('node:buffer');
|
|
26
18
|
require('node:url');
|
|
27
19
|
require('node:util');
|
|
28
20
|
require('node:child_process');
|
|
29
21
|
require('node:module');
|
|
22
|
+
require('path');
|
|
30
23
|
require('os');
|
|
31
24
|
require('readline');
|
|
32
25
|
require('tty');
|
|
26
|
+
require('assert');
|
|
33
27
|
require('events');
|
|
28
|
+
require('stream');
|
|
34
29
|
require('buffer');
|
|
35
|
-
require('
|
|
30
|
+
require('util');
|
|
31
|
+
require('./session-BjtjhtPg.cjs');
|
|
32
|
+
require('fs');
|
|
33
|
+
require('constants');
|
|
34
|
+
require('./index-BQm5XmMC.cjs');
|
|
36
35
|
|
|
37
36
|
class Locked extends Error {
|
|
38
37
|
constructor(port) {
|
|
@@ -196,6 +195,58 @@ async function getPorts(options) {
|
|
|
196
195
|
throw new Error('No available ports found');
|
|
197
196
|
}
|
|
198
197
|
|
|
198
|
+
const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(['network.request']);
|
|
199
|
+
/**
|
|
200
|
+
* 判断 permission key 是否由 Runtime 权限快照管理。
|
|
201
|
+
*
|
|
202
|
+
* @param key 待判断的 permission key。
|
|
203
|
+
* @returns 该 key 需要读取 Runtime 权限快照时返回 `true`。
|
|
204
|
+
*/
|
|
205
|
+
function isManagedMiniProgramRuntimePermissionKey(key) {
|
|
206
|
+
return MANAGED_RUNTIME_PERMISSION_KEYS.has(key);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* 解析服务端权限快照;格式不完整时整份快照失效并 fail closed。
|
|
210
|
+
*
|
|
211
|
+
* @param snapshot 待校验的服务端权限快照。
|
|
212
|
+
* @returns 解析状态和通过校验的受管权限。
|
|
213
|
+
*/
|
|
214
|
+
function parseMiniProgramRuntimePermissions(snapshot) {
|
|
215
|
+
if (!isRecord$2(snapshot) || snapshot.schema_version !== 1 || !Array.isArray(snapshot.entries)) {
|
|
216
|
+
return { valid: false, permissions: {} };
|
|
217
|
+
}
|
|
218
|
+
if (snapshot.revision !== undefined && (typeof snapshot.revision !== 'number' || !Number.isInteger(snapshot.revision) || snapshot.revision < 0)) {
|
|
219
|
+
return { valid: false, permissions: {} };
|
|
220
|
+
}
|
|
221
|
+
const seenKeys = new Set();
|
|
222
|
+
const permissions = {};
|
|
223
|
+
for (const rawEntry of snapshot.entries) {
|
|
224
|
+
if (!isRecord$2(rawEntry) || typeof rawEntry.key !== 'string' || !rawEntry.key.trim()) {
|
|
225
|
+
return { valid: false, permissions: {} };
|
|
226
|
+
}
|
|
227
|
+
const key = rawEntry.key.trim();
|
|
228
|
+
if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled') || !isRecord$2(rawEntry.config)) {
|
|
229
|
+
return { valid: false, permissions: {} };
|
|
230
|
+
}
|
|
231
|
+
seenKeys.add(key);
|
|
232
|
+
if (!isManagedMiniProgramRuntimePermissionKey(key)) {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
if (key === 'network.request' && typeof rawEntry.config.useOfficialDomain !== 'boolean') {
|
|
236
|
+
return { valid: false, permissions: {} };
|
|
237
|
+
}
|
|
238
|
+
permissions[key] = {
|
|
239
|
+
key,
|
|
240
|
+
status: rawEntry.status,
|
|
241
|
+
config: { useOfficialDomain: rawEntry.config.useOfficialDomain },
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
return { valid: true, permissions };
|
|
245
|
+
}
|
|
246
|
+
function isRecord$2(value) {
|
|
247
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
248
|
+
}
|
|
249
|
+
|
|
199
250
|
/** Dev Shell 读取局域网 Dev Session endpoint 的 query 参数。 */
|
|
200
251
|
/** Mock Host 创建和读取 Dev Session 的固定路径。 */
|
|
201
252
|
const MINI_PROGRAM_DEV_CONTEXT_PATH = '/__hb_sdk__/dev-context';
|
|
@@ -641,7 +692,7 @@ function validateDevSessionCreatePayload(payload, allowedMiniUrlOrigins) {
|
|
|
641
692
|
!allowedMiniUrlOrigins.has(miniUrlOrigin.origin)) {
|
|
642
693
|
throw new TypeError('mini_url_origin must be an allowed LAN origin');
|
|
643
694
|
}
|
|
644
|
-
const parsedPermissions =
|
|
695
|
+
const parsedPermissions = parseMiniProgramRuntimePermissions(payload.runtime_permissions);
|
|
645
696
|
if (!parsedPermissions.valid) {
|
|
646
697
|
throw new TypeError('runtime_permissions is invalid');
|
|
647
698
|
}
|
|
@@ -984,7 +1035,7 @@ async function handleDevPermissionMutation(request, response, controller) {
|
|
|
984
1035
|
if (!isRecord$1(payload) || Object.keys(payload).length !== 1 || !Object.hasOwn(payload, 'runtime_permissions')) {
|
|
985
1036
|
throw createMockHostError(400, 'INVALID_DEV_PERMISSIONS', 'Dev permissions update body is invalid');
|
|
986
1037
|
}
|
|
987
|
-
const parsed =
|
|
1038
|
+
const parsed = parseMiniProgramRuntimePermissions(payload.runtime_permissions);
|
|
988
1039
|
if (!parsed.valid) {
|
|
989
1040
|
throw createMockHostError(400, 'INVALID_DEV_PERMISSIONS', 'runtime_permissions is invalid');
|
|
990
1041
|
}
|
|
@@ -1167,10 +1218,48 @@ function createHeyboxProtocol(payload) {
|
|
|
1167
1218
|
return `heybox://${encodeURIComponent(JSON.stringify(payload))}`;
|
|
1168
1219
|
}
|
|
1169
1220
|
|
|
1221
|
+
const DEFAULT_PERMISSION_STATE = {
|
|
1222
|
+
networkRequest: {
|
|
1223
|
+
status: 'disabled',
|
|
1224
|
+
useOfficialDomain: false,
|
|
1225
|
+
},
|
|
1226
|
+
};
|
|
1227
|
+
function createMiniProgramMockPermissionState(context) {
|
|
1228
|
+
const parsed = parseMiniProgramRuntimePermissions(context.runtimePermissions);
|
|
1229
|
+
const networkRequest = parsed.permissions['network.request'];
|
|
1230
|
+
return parsed.valid && networkRequest
|
|
1231
|
+
? {
|
|
1232
|
+
networkRequest: {
|
|
1233
|
+
status: networkRequest.status,
|
|
1234
|
+
useOfficialDomain: networkRequest.config.useOfficialDomain === true,
|
|
1235
|
+
},
|
|
1236
|
+
}
|
|
1237
|
+
: cloneDefaultPermissionState();
|
|
1238
|
+
}
|
|
1239
|
+
function createMiniProgramMockRuntimePermissions(state) {
|
|
1240
|
+
return {
|
|
1241
|
+
schema_version: 1,
|
|
1242
|
+
entries: [
|
|
1243
|
+
{
|
|
1244
|
+
key: 'network.request',
|
|
1245
|
+
status: state.networkRequest.status,
|
|
1246
|
+
config: {
|
|
1247
|
+
useOfficialDomain: state.networkRequest.useOfficialDomain,
|
|
1248
|
+
},
|
|
1249
|
+
},
|
|
1250
|
+
],
|
|
1251
|
+
};
|
|
1252
|
+
}
|
|
1253
|
+
function cloneDefaultPermissionState() {
|
|
1254
|
+
return {
|
|
1255
|
+
networkRequest: { ...DEFAULT_PERMISSION_STATE.networkRequest },
|
|
1256
|
+
};
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1170
1259
|
/** 构建时替换为当前发布包的实际版本。 */
|
|
1171
1260
|
const HB_SDK_VERSION = typeof undefined === 'string'
|
|
1172
1261
|
? undefined
|
|
1173
|
-
: '0.6.7-alpha.
|
|
1262
|
+
: '0.6.7-alpha.2';
|
|
1174
1263
|
|
|
1175
1264
|
class DevPermissionOverrideStoreError extends Error {
|
|
1176
1265
|
code;
|
|
@@ -1341,7 +1430,7 @@ async function runDevCommand(options, runtime = {}) {
|
|
|
1341
1430
|
projectRoot,
|
|
1342
1431
|
});
|
|
1343
1432
|
const vite = await logger.task('正在加载项目 Vite', () => projectVite.loadProjectVite(projectRoot), { successText: '已加载项目 Vite' });
|
|
1344
|
-
const appServer = await logger.task('正在创建 Vite dev server', () => withManagedDevOutputEnv(() => vite.createServer(createViteServerOptions(projectRoot, resolvedOptions)), runtime.env
|
|
1433
|
+
const appServer = await logger.task('正在创建 Vite dev server', () => withManagedDevOutputEnv(() => vite.createServer(createViteServerOptions(projectRoot, resolvedOptions)), runtime.env), { successText: '已创建 Vite dev server' });
|
|
1345
1434
|
await logger.task('正在启动 Vite dev server', () => appServer.listen(appPort), {
|
|
1346
1435
|
successText: 'Vite dev server 已启动',
|
|
1347
1436
|
});
|
|
@@ -1458,7 +1547,7 @@ function createDevPermissionController(options) {
|
|
|
1458
1547
|
source: devContext.source,
|
|
1459
1548
|
...(miniProgramId ? { mini_program_id: miniProgramId } : {}),
|
|
1460
1549
|
...(isRuntimePermissionsSnapshot(devContext.runtimePermissions) ? { remote_permissions: devContext.runtimePermissions } : {}),
|
|
1461
|
-
...(overrides ? { override_permissions:
|
|
1550
|
+
...(overrides ? { override_permissions: createMiniProgramMockRuntimePermissions(overrides) } : {}),
|
|
1462
1551
|
...(error ? { persistence_error: error } : {}),
|
|
1463
1552
|
};
|
|
1464
1553
|
};
|
|
@@ -1495,7 +1584,7 @@ function createDevPermissionController(options) {
|
|
|
1495
1584
|
return createConfiguration(undefined);
|
|
1496
1585
|
},
|
|
1497
1586
|
async save(runtimePermissions) {
|
|
1498
|
-
const overrides =
|
|
1587
|
+
const overrides = createMiniProgramMockPermissionState({
|
|
1499
1588
|
runtimePermissions,
|
|
1500
1589
|
});
|
|
1501
1590
|
try {
|
|
@@ -1513,7 +1602,7 @@ function createDevPermissionController(options) {
|
|
|
1513
1602
|
};
|
|
1514
1603
|
}
|
|
1515
1604
|
function isRuntimePermissionsSnapshot(value) {
|
|
1516
|
-
return
|
|
1605
|
+
return parseMiniProgramRuntimePermissions(value).valid;
|
|
1517
1606
|
}
|
|
1518
1607
|
async function loadRemoteDevContextWithTimeout(options) {
|
|
1519
1608
|
const controller = new AbortController();
|
|
@@ -1655,11 +1744,11 @@ function rewriteLocalhostUrl(input) {
|
|
|
1655
1744
|
function isLocalhostHost(hostname) {
|
|
1656
1745
|
return hostname === 'localhost' || hostname === '::1' || hostname === '[::1]';
|
|
1657
1746
|
}
|
|
1658
|
-
async function withManagedDevOutputEnv(action, env = process.env
|
|
1747
|
+
async function withManagedDevOutputEnv(action, env = process.env) {
|
|
1659
1748
|
const previousManagedOutput = env[MANAGED_DEV_OUTPUT_ENV];
|
|
1660
1749
|
env[MANAGED_DEV_OUTPUT_ENV] = '1';
|
|
1661
1750
|
try {
|
|
1662
|
-
return await
|
|
1751
|
+
return await action();
|
|
1663
1752
|
}
|
|
1664
1753
|
finally {
|
|
1665
1754
|
if (previousManagedOutput === undefined) {
|
|
@@ -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-CQnkS0Z8.cjs');
|
|
8
8
|
require('node:module');
|
|
9
9
|
require('path');
|
|
10
10
|
require('os');
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index$2 = require('./index-
|
|
3
|
+
var index$2 = require('./index-CQnkS0Z8.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 index$3 = require('./index-BQm5XmMC.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 = index$3.requireSemver();
|
|
13711
13711
|
const onetime = index$2.requireOnetime();
|
|
13712
13712
|
const encryptionAlgorithm = 'aes-256-cbc';
|
|
13713
13713
|
const createPlainObject = () => {
|