@heybox/hb-sdk 0.9.1-alpha.9 → 0.9.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +104 -19
  2. package/README.md +17 -16
  3. package/dist/cli-chunks/{build-mIRvG3a8.cjs → build-DCp9C9V4.cjs} +5 -5
  4. package/dist/cli-chunks/{context-0uq4_H2M.cjs → context-Bg6C5ow7.cjs} +10 -5
  5. package/dist/cli-chunks/{create-DDPUUzi1.cjs → create-D5bX2Xvw.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-BOrmDVzH.cjs → dev-CFjwhG3q.cjs} +194 -81
  7. package/dist/cli-chunks/{doctor-BtOKr1SN.cjs → doctor-CMz_Kf7-.cjs} +1 -1
  8. package/dist/cli-chunks/{index-MMLoNdeZ.cjs → index-B_KKGIBN.cjs} +16 -16
  9. package/dist/cli-chunks/{index-DYqbUZfk.cjs → index-YnVa6S_p.cjs} +1 -1
  10. package/dist/cli-chunks/{index.esm-DYKzLyvN.cjs → index.esm-CgZPnqEA.cjs} +6 -6
  11. package/dist/cli-chunks/{login-Be95cDi7.cjs → login-Df_v6jNs.cjs} +1 -1
  12. package/dist/cli-chunks/{project-vite-Si5Tyi7Q.cjs → project-vite-By8cnIwP.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-D2XvKzs6.cjs → remote-ClIJz-e2.cjs} +28 -16
  14. package/dist/cli-chunks/{runtime-gate-B0YPKxEd.cjs → runtime-gate-DKiyNwX2.cjs} +2 -2
  15. package/dist/cli-chunks/{runtime-permission-env-CzhGcDRj.cjs → runtime-permission-env-BNQ2fx4w.cjs} +77 -4
  16. package/dist/cli-chunks/{skill-7n-Yn9ny.cjs → skill-Bk-EBSbJ.cjs} +2 -2
  17. package/dist/cli-chunks/{version-B1aYSptt.cjs → version-CG_VNZGM.cjs} +1 -1
  18. package/dist/cli.cjs +1 -1
  19. package/dist/devtools/browser-dev-host/assets/browser-dev-host-C1g2tadT.js +102 -0
  20. package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-DzaVQPma.js → desktop-app-launch-sH2a_jbj.js} +1 -1
  21. package/dist/devtools/browser-dev-host/assets/{index-BRxbUJVN.css → index-7Cq8iNcD.css} +1 -1
  22. package/dist/devtools/browser-dev-host/assets/{index-hh0NzK3n.js → index-Bpxbe1lP.js} +4 -4
  23. package/dist/devtools/browser-dev-host/index.html +3 -3
  24. package/dist/index.cjs.js +16 -8
  25. package/dist/index.esm.js +16 -8
  26. package/dist/miniapp-publish.cjs.js +27 -0
  27. package/dist/miniapp-publish.esm.js +27 -0
  28. package/dist/protocol.cjs.js +1 -1
  29. package/dist/protocol.esm.js +1 -1
  30. package/dist/vite.cjs.js +36 -1
  31. package/dist/vite.esm.js +36 -1
  32. package/docs/runtime-host-migration.md +4 -2
  33. package/package.json +4 -4
  34. package/skill/SKILL.md +10 -0
  35. package/skill/skill.json +5 -5
  36. package/types/index.d.ts +124 -94
  37. package/types/miniapp-publish/index.d.ts +3 -0
  38. package/types/protocol.d.ts +47 -39
  39. package/types/vite/index.d.ts +1 -0
  40. package/dist/devtools/browser-dev-host/assets/browser-dev-host-Iyo4aIMO.js +0 -102
@@ -238,19 +238,19 @@ function requireArgument () {
238
238
 
239
239
  var command = {};
240
240
 
241
- 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-MMLoNdeZ.cjs', document.baseURI).href)));
241
+ 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-B_KKGIBN.cjs', document.baseURI).href)));
242
242
  function __require$4() { return require$5("node:events"); }
243
243
 
244
- 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-MMLoNdeZ.cjs', document.baseURI).href)));
244
+ 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-B_KKGIBN.cjs', document.baseURI).href)));
245
245
  function __require$3() { return require$4("node:child_process"); }
246
246
 
247
- 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-MMLoNdeZ.cjs', document.baseURI).href)));
247
+ 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-B_KKGIBN.cjs', document.baseURI).href)));
248
248
  function __require$2() { return require$3("node:path"); }
249
249
 
250
- 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-MMLoNdeZ.cjs', document.baseURI).href)));
250
+ 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-B_KKGIBN.cjs', document.baseURI).href)));
251
251
  function __require$1() { return require$2("node:fs"); }
252
252
 
253
- 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-MMLoNdeZ.cjs', document.baseURI).href)));
253
+ 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-B_KKGIBN.cjs', document.baseURI).href)));
254
254
  function __require() { return require$1("node:process"); }
255
255
 
256
256
  var help = {};
@@ -17249,7 +17249,7 @@ async function inspectFeedbackLog(file, size) {
17249
17249
  return { mimeType: 'text/plain', width: 0, height: 0 };
17250
17250
  }
17251
17251
  async function createFeedbackCosClient(getToken) {
17252
- const { default: COS } = await Promise.resolve().then(function () { return require('./index-DYqbUZfk.cjs'); }).then(function (n) { return n.index; });
17252
+ const { default: COS } = await Promise.resolve().then(function () { return require('./index-YnVa6S_p.cjs'); }).then(function (n) { return n.index; });
17253
17253
  const cos = new COS({
17254
17254
  getAuthorization(_options, callback) {
17255
17255
  void getToken().then((token) => callback({
@@ -20900,7 +20900,7 @@ function readEnvNameArgFromArgv(argv) {
20900
20900
  }
20901
20901
 
20902
20902
  const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
20903
- const BUILT_CLI_VERSION = '0.9.1-alpha.9';
20903
+ const BUILT_CLI_VERSION = '0.9.1';
20904
20904
  const PACKAGE_JSON_CANDIDATES = [
20905
20905
  path.resolve(__dirname, '..', '..', 'package.json'),
20906
20906
  path.resolve(__dirname, '..', 'package.json'),
@@ -21269,39 +21269,39 @@ function createCommandLoggerResolver(options) {
21269
21269
  };
21270
21270
  }
21271
21271
  const defaultClearLoginStatus = async (...args) => {
21272
- const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-Be95cDi7.cjs'); });
21272
+ const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-Df_v6jNs.cjs'); });
21273
21273
  return clearLoginStatus(...args);
21274
21274
  };
21275
21275
  const defaultLoginToHeybox = async (...args) => {
21276
- const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-Be95cDi7.cjs'); });
21276
+ const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-Df_v6jNs.cjs'); });
21277
21277
  return loginToHeybox(...args);
21278
21278
  };
21279
21279
  const defaultPrintLoginStatus = async (...args) => {
21280
- const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-Be95cDi7.cjs'); });
21280
+ const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-Df_v6jNs.cjs'); });
21281
21281
  return printLoginStatus(...args);
21282
21282
  };
21283
21283
  const defaultRunBuildCommand = async (...args) => {
21284
- const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-mIRvG3a8.cjs'); });
21284
+ const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-DCp9C9V4.cjs'); });
21285
21285
  return runBuildCommand(...args);
21286
21286
  };
21287
21287
  const defaultRunCreateCommand = async (...args) => {
21288
- const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-DDPUUzi1.cjs'); });
21288
+ const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-D5bX2Xvw.cjs'); });
21289
21289
  return runCreateCommand(...args);
21290
21290
  };
21291
21291
  const defaultRunDevCommand = async (...args) => {
21292
- const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-BOrmDVzH.cjs'); }).then(function (n) { return n.dev; });
21292
+ const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-CFjwhG3q.cjs'); }).then(function (n) { return n.dev; });
21293
21293
  return runDevCommand(...args);
21294
21294
  };
21295
21295
  const defaultRunDoctorCommand = async (...args) => {
21296
- const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-BtOKr1SN.cjs'); });
21296
+ const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-CMz_Kf7-.cjs'); });
21297
21297
  return runDoctorCommand(...args);
21298
21298
  };
21299
21299
  const defaultRunSkillInstallCommand = async (...args) => {
21300
- const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-7n-Yn9ny.cjs'); });
21300
+ const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-Bk-EBSbJ.cjs'); });
21301
21301
  return runSkillInstallCommand(...args);
21302
21302
  };
21303
21303
  const defaultRunRemoteCommand = async (...args) => {
21304
- const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-D2XvKzs6.cjs'); });
21304
+ const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-ClIJz-e2.cjs'); });
21305
21305
  return runRemoteCommand(...args);
21306
21306
  };
21307
21307
  function resolveStandaloneLogger(options, verbose) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index$2 = require('./index-MMLoNdeZ.cjs');
3
+ var index$2 = require('./index-B_KKGIBN.cjs');
4
4
  var require$$0$3 = require('fs');
5
5
  var require$$0$2 = require('crypto');
6
6
  var require$$1$2 = require('path');
@@ -11,8 +11,8 @@ var require$$0$3 = require('url');
11
11
  var require$$5 = require('zlib');
12
12
  var require$$0 = require('buffer');
13
13
  var require$$1 = require('util');
14
- var index = require('./index-MMLoNdeZ.cjs');
15
- var dev = require('./dev-BOrmDVzH.cjs');
14
+ var index = require('./index-B_KKGIBN.cjs');
15
+ var dev = require('./dev-CFjwhG3q.cjs');
16
16
  require('node:module');
17
17
  require('readline');
18
18
  require('os');
@@ -26,9 +26,9 @@ require('constants');
26
26
  require('node:fs');
27
27
  require('node:fs/promises');
28
28
  require('node:zlib');
29
- require('./context-0uq4_H2M.cjs');
30
- require('./runtime-permission-env-CzhGcDRj.cjs');
31
- require('./version-B1aYSptt.cjs');
29
+ require('./context-Bg6C5ow7.cjs');
30
+ require('./runtime-permission-env-BNQ2fx4w.cjs');
31
+ require('./version-CG_VNZGM.cjs');
32
32
  require('node:async_hooks');
33
33
  require('sharp');
34
34
  require('node:os');
@@ -42,7 +42,7 @@ require('node:buffer');
42
42
  require('node:url');
43
43
  require('node:util');
44
44
  require('node:child_process');
45
- require('./project-vite-Si5Tyi7Q.cjs');
45
+ require('./project-vite-By8cnIwP.cjs');
46
46
 
47
47
  var bufferUtil = {exports: {}};
48
48
 
@@ -3,7 +3,7 @@
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 index = require('./index-MMLoNdeZ.cjs');
6
+ var index = require('./index-B_KKGIBN.cjs');
7
7
  var browser = require('./browser-RAy8e8cV.cjs');
8
8
  require('node:module');
9
9
  require('readline');
@@ -5,7 +5,7 @@ var fs$1 = require('node:fs/promises');
5
5
  var node_module = require('node:module');
6
6
  var path = require('node:path');
7
7
  var node_url = require('node:url');
8
- var index = require('./index-MMLoNdeZ.cjs');
8
+ var index = require('./index-B_KKGIBN.cjs');
9
9
 
10
10
  function findProjectRoot(startDir) {
11
11
  let current = path.resolve(startDir);
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var runtimePermissionEnv = require('./runtime-permission-env-CzhGcDRj.cjs');
4
- var context = require('./context-0uq4_H2M.cjs');
3
+ var runtimePermissionEnv = require('./runtime-permission-env-BNQ2fx4w.cjs');
4
+ var context = require('./context-Bg6C5ow7.cjs');
5
5
  var promises = require('node:readline/promises');
6
- var index = require('./index-MMLoNdeZ.cjs');
7
- var runtimeGate = require('./runtime-gate-B0YPKxEd.cjs');
6
+ var index = require('./index-B_KKGIBN.cjs');
7
+ var runtimeGate = require('./runtime-gate-DKiyNwX2.cjs');
8
8
  var childProcess = require('node:child_process');
9
9
  var fs = require('node:fs');
10
10
  var fs$1 = require('node:fs/promises');
11
11
  var path = require('node:path');
12
12
  var node_crypto = require('node:crypto');
13
13
  require('node:zlib');
14
- require('./version-B1aYSptt.cjs');
14
+ require('./version-CG_VNZGM.cjs');
15
15
  require('node:async_hooks');
16
16
  require('sharp');
17
17
  require('node:module');
@@ -286,7 +286,7 @@ function createDefaultCosClient(uploadToken, COS) {
286
286
  };
287
287
  }
288
288
  async function loadCosConstructor() {
289
- const cosModule = await Promise.resolve().then(function () { return require('./index-DYqbUZfk.cjs'); }).then(function (n) { return n.index; });
289
+ const cosModule = await Promise.resolve().then(function () { return require('./index-YnVa6S_p.cjs'); }).then(function (n) { return n.index; });
290
290
  return cosModule.default;
291
291
  }
292
292
  function formatSize(bytes) {
@@ -1385,7 +1385,7 @@ async function remoteInfo(options, context$1, runtime) {
1385
1385
  const removed = currentBindApps.filter((item) => !localIDs.has(item.appid));
1386
1386
  const bindings = { local, current: currentBindApps, added, removed };
1387
1387
  const basicInfo = await context.compareBasicInfo(context$1.packageJson.projectRoot, detail, runtime.fetchImpl);
1388
- const output = { changed: false, miniProgramId, detail: toCamelCaseDeep(detail), permissions: permissionViews, bindings, basicInfo };
1388
+ const output = { changed: false, miniProgramId, detail: toCamelCaseDeep(detail), permissions: permissionViews, permissionSources: { localDeclaration: localPermissions.permissions ?? null, onlineManifest: detail.manifest ?? null, onlineRuntimeSnapshot: detail.effective_runtime_permissions ?? null, platformApprovals: detail.runtime_permissions ?? null }, bindings, basicInfo };
1389
1389
  if (!options.json)
1390
1390
  context$1.logger.info(`版本资料:${basicInfo.status}`);
1391
1391
  if (!options.json) {
@@ -1952,16 +1952,28 @@ function printMiniProgramDetail(logger, detail, permissionViews, bindings) {
1952
1952
  if (detail.protocol_string) {
1953
1953
  logger.info(`Protocol: ${detail.protocol_string}`);
1954
1954
  }
1955
- logger.info('权限:');
1956
- for (const view of permissionViews) {
1957
- const approval = view.approvalSource === 'first-party'
1958
- ? ` 需申请=否 批准来源=第一方自动批准 原始批准=${view.approved ? '是' : '否'}`
1959
- : view.access === 'platform-approval' ? ` 需申请=是 批准=${view.approved ? '是' : '否'}` : ' 需申请=否';
1960
- const configs = view.requestedConfig
1961
- ? ` requested=${JSON.stringify(view.requestedConfig)} approved=${JSON.stringify(view.approvedConfig)} effective=${JSON.stringify(view.effectiveConfig)}`
1962
- : '';
1963
- logger.info(` ${view.key}: 声明=${view.declared ? '是' : '否'}${approval} 最终=${view.effective ? '可用' : '不可用'}${configs}`);
1955
+ logger.info('权限(本地声明 / 线上版本声明 / 平台批准):');
1956
+ const manifest = detail.manifest && typeof detail.manifest === 'object' ? detail.manifest : undefined;
1957
+ let online;
1958
+ try {
1959
+ online = manifest ? runtimePermissionEnv.parseMiniappPermissions(manifest.permissions, { present: Object.hasOwn(manifest, 'permissions'), sdkVersion: typeof detail.sdk_version === 'string' ? detail.sdk_version : '0.8.0' }) : undefined;
1964
1960
  }
1961
+ catch { /* 缺失或未知声明保持未知,不能推断线上可用。 */ }
1962
+ const publishedRuntime = runtimePermissionEnv.parseMiniProgramRuntimePermissions(detail.effective_runtime_permissions);
1963
+ let differs = false;
1964
+ for (const view of permissionViews) {
1965
+ const published = online ? online.permissions?.[view.key]?.enabled === true : undefined;
1966
+ const requested = online?.permissions?.[view.key];
1967
+ const changed = published !== undefined && (published !== view.declared ||
1968
+ (view.key === 'network' && published && view.requestedConfig?.useOfficialDomain !== (requested && 'useOfficialDomain' in requested ? requested.useOfficialDomain : undefined)));
1969
+ differs ||= changed;
1970
+ const approval = view.access === 'platform-approval' ? (view.approvalSource === 'first-party' ? '第一方自动批准' : view.approved ? '已批准' : '未批准') : '无需审批';
1971
+ logger.info(` ${view.key}: 本地声明=${view.declared ? '是' : '否'} 线上版本声明=${published === undefined ? '未知' : published ? '是' : '否'} 平台批准=${approval} 线上快照=${publishedRuntime.valid ? publishedRuntime.permissions[view.key]?.status ?? '缺少条目' : '未知'}${changed ? ' [不一致]' : ''}`);
1972
+ }
1973
+ if (differs)
1974
+ logger.warn('本地声明与线上版本不一致;本地调试结果不代表线上生效,需发布包含声明的新版本。');
1975
+ if (!online)
1976
+ logger.warn('未取得线上版本声明,无法确认线上生效状态;平台批准和本地声明不代表已发布。');
1965
1977
  if (bindings) {
1966
1978
  logger.info('关联游戏(本地/线上/新增/移除):');
1967
1979
  logger.info(` local=${formatBoundApps(bindings.local)}`);
@@ -5,8 +5,8 @@ require('node:module');
5
5
  require('node:url');
6
6
  var fs = require('node:fs');
7
7
  var path = require('node:path');
8
- var runtimePermissionEnv = require('./runtime-permission-env-CzhGcDRj.cjs');
9
- var index = require('./index-MMLoNdeZ.cjs');
8
+ var runtimePermissionEnv = require('./runtime-permission-env-BNQ2fx4w.cjs');
9
+ var index = require('./index-B_KKGIBN.cjs');
10
10
  var _commonjsDynamicModules = require('./_commonjs-dynamic-modules-DUamuDzp.cjs');
11
11
  var require$$0$1 = require('fs');
12
12
  var require$$1 = require('path');
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-MMLoNdeZ.cjs');
3
+ var index = require('./index-B_KKGIBN.cjs');
4
4
  var fs = require('node:fs');
5
5
  var path = require('node:path');
6
- var version$1 = require('./version-B1aYSptt.cjs');
6
+ var version$1 = require('./version-CG_VNZGM.cjs');
7
7
  require('node:crypto');
8
8
  var node_async_hooks = require('node:async_hooks');
9
9
 
@@ -297,7 +297,7 @@ function isManagedMiniProgramRuntimePermissionKey(key) {
297
297
  * `requirement`:`kind: 'none'` 不读取权限;`kind: 'all'` 要求列出的每个 canonical entry 都存在
298
298
  * 且 `status === 'enabled'`。之后仍需通过 Host capability、可信手势、用户授权、参数和业务
299
299
  * policy。当前 Runtime 对 `valid: false` 按空权限表 fail closed,受保护 method 会得到
300
- * `PERMISSION_NOT_DECLARED`,而不是沿用输入中的部分 enabled entry。
300
+ * `PERMISSION_NOT_IN_SNAPSHOT`,而不是沿用输入中的部分 enabled entry。
301
301
  *
302
302
  * @example
303
303
  * ```ts
@@ -447,7 +447,7 @@ function createMiniProgramLocalDevGrant(options) {
447
447
  return { schema_version: 1, revision: options.revision, entries };
448
448
  }
449
449
  /**
450
- * 线上基线先与本地声明求交,再补齐临时权限,返回与输入脱离的普通 Runtime 快照。
450
+ * 声明型权限由本地声明生成;审批型权限先与平台基线求交,再补齐临时授权。
451
451
  * 调用方只可在当前 Dev Session 已验证且用户接受后传入 grant;本函数不证明其可信来源。
452
452
  * 非法 grant 整体降权到基线,已批准配置不会被临时配置覆盖。
453
453
  */
@@ -459,6 +459,9 @@ function composeLocalDevRuntimePermissions(options) {
459
459
  if (options.declaredPermissions[key]?.enabled !== true) {
460
460
  delete permissions[key];
461
461
  }
462
+ else if (MINI_PROGRAM_PERMISSION_CATALOG.some(definition => definition.key === key && definition.access === 'declaration')) {
463
+ permissions[key] = { key, status: 'enabled', config: {} };
464
+ }
462
465
  else if (key === 'network' && permissions.network) {
463
466
  permissions.network.config.useOfficialDomain = permissions.network.status === 'enabled'
464
467
  && permissions.network.config.useOfficialDomain === true
@@ -6904,6 +6907,47 @@ function validateWorkspaceCardReceiptV2(raw, controller) {
6904
6907
  fail('v2 asset path 非法');
6905
6908
  }
6906
6909
 
6910
+ /** 固定序列化顺序,供 CLI 与 Host 对同一份开发描述计算摘要。 */
6911
+ function serializeMiniProgramDevelopmentSnapshot(snapshot) {
6912
+ if (snapshot.schema_version !== 1 ||
6913
+ !/^[a-f0-9]{32}$/.test(snapshot.session_id) ||
6914
+ !Number.isSafeInteger(snapshot.revision) ||
6915
+ snapshot.revision < 1 ||
6916
+ !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(snapshot.sdk_version) ||
6917
+ !snapshot.declared_permissions ||
6918
+ typeof snapshot.declared_permissions !== 'object' ||
6919
+ Array.isArray(snapshot.declared_permissions) ||
6920
+ !Array.isArray(snapshot.platforms) ||
6921
+ snapshot.platforms.some((platform) => !['android', 'ios', 'ohos', 'windows', 'macos', 'linux'].includes(platform)) ||
6922
+ new Set(snapshot.platforms).size !== snapshot.platforms.length)
6923
+ throw new Error('开发快照无效');
6924
+ const declared_permissions = {};
6925
+ for (const key of MINI_PROGRAM_PERMISSION_KEYS) {
6926
+ const declaration = snapshot.declared_permissions[key];
6927
+ if (!declaration)
6928
+ continue;
6929
+ if (typeof declaration.enabled !== 'boolean')
6930
+ throw new Error('开发权限声明无效');
6931
+ declared_permissions[key] =
6932
+ key === 'network'
6933
+ ? { enabled: declaration.enabled, useOfficialDomain: declaration.useOfficialDomain === true }
6934
+ : { enabled: declaration.enabled };
6935
+ }
6936
+ if (Object.keys(snapshot.declared_permissions).some((key) => !MINI_PROGRAM_PERMISSION_KEYS.includes(key)))
6937
+ throw new Error('开发权限声明无效');
6938
+ if (snapshot.companion_manifest_sha256 !== undefined && !/^[a-f0-9]{64}$/.test(snapshot.companion_manifest_sha256))
6939
+ throw new Error('开发产物摘要无效');
6940
+ return JSON.stringify({
6941
+ schema_version: 1,
6942
+ session_id: snapshot.session_id,
6943
+ revision: snapshot.revision,
6944
+ sdk_version: snapshot.sdk_version,
6945
+ declared_permissions,
6946
+ platforms: [...snapshot.platforms].sort(),
6947
+ ...(snapshot.companion_manifest_sha256 ? { companion_manifest_sha256: snapshot.companion_manifest_sha256 } : {}),
6948
+ });
6949
+ }
6950
+
6907
6951
  /**
6908
6952
  * 校验项目配置或产物中的小程序类别。
6909
6953
  *
@@ -7061,6 +7105,31 @@ function parseMiniappBindAppIds(value, options = {}) {
7061
7105
  return Object.freeze(appIds);
7062
7106
  }
7063
7107
 
7108
+ /** 小程序简介最大长度(Unicode code point),与服务端截断口径一致。 */
7109
+ const MINIAPP_DESC_MAX_LENGTH = 200;
7110
+ /**
7111
+ * 校验并规范化 `package.json#heybox.desc` / `manifest.desc`。
7112
+ *
7113
+ * @param value - 原始声明;未声明时为 `undefined`。
7114
+ * @param sourceLabel - 错误消息中的字段来源,默认 `package.json#heybox.desc`。
7115
+ * @returns 去除首尾空白后的简介;未声明或为空串时返回 `undefined`。
7116
+ * @throws `Error` 非字符串、超过 200 个字符,或包含除换行外的控制字符时抛出。
7117
+ */
7118
+ function parseMiniappDesc(value, sourceLabel = 'package.json#heybox.desc') {
7119
+ if (value === undefined)
7120
+ return undefined;
7121
+ if (typeof value !== 'string')
7122
+ throw new Error(`${sourceLabel} 必须是字符串`);
7123
+ const desc = value.replace(/^\p{White_Space}+|\p{White_Space}+$/gu, '');
7124
+ if (!desc)
7125
+ return undefined;
7126
+ if (Array.from(desc).length > MINIAPP_DESC_MAX_LENGTH)
7127
+ throw new Error(`${sourceLabel} 不能超过 ${MINIAPP_DESC_MAX_LENGTH} 个字符`);
7128
+ if (/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]/u.test(desc.replace(/\n/g, '')))
7129
+ throw new Error(`${sourceLabel} 不能包含控制字符`);
7130
+ return desc;
7131
+ }
7132
+
7064
7133
  const MINIAPP_PERMISSION_KEYS = MINI_PROGRAM_PERMISSION_KEYS;
7065
7134
  function parseMiniappPermissions(value, options) {
7066
7135
  const sourceLabel = options.sourceLabel ?? 'package.json#heybox.permissions';
@@ -7299,6 +7368,7 @@ function validateMiniappManifestForDeploy(manifest) {
7299
7368
  throw new Error('manifest.category 缺失,请在 package.json#heybox.category 声明 tool、game 或 other 后重新构建');
7300
7369
  }
7301
7370
  const bindAppIds = parseMiniappBindAppIds(manifest.bindAppIds, { sourceLabel: 'manifest.bindAppIds' });
7371
+ const desc = parseMiniappDesc(manifest.desc, 'manifest.desc');
7302
7372
  return {
7303
7373
  version,
7304
7374
  sdkVersion,
@@ -7310,6 +7380,7 @@ function validateMiniappManifestForDeploy(manifest) {
7310
7380
  ...(window === undefined ? {} : { window }),
7311
7381
  ...(bindAppIds.length === 0 ? {} : { bindAppIds }),
7312
7382
  ...(category === undefined ? {} : { category }),
7383
+ ...(desc === undefined ? {} : { desc }),
7313
7384
  };
7314
7385
  }
7315
7386
  function validateGeneratedCompanions(value) {
@@ -16628,6 +16699,7 @@ exports.parseMiniProgramLocalDevGrant = parseMiniProgramLocalDevGrant;
16628
16699
  exports.parseMiniProgramRuntimePermissions = parseMiniProgramRuntimePermissions;
16629
16700
  exports.parseMiniappBasicInfo = parseMiniappBasicInfo;
16630
16701
  exports.parseMiniappManifestJson = parseMiniappManifestJson;
16702
+ exports.parseMiniappPermissions = parseMiniappPermissions;
16631
16703
  exports.prepareMiniappArtifactFiles = prepareMiniappArtifactFiles;
16632
16704
  exports.readMiniappBindAppIdsFromPackageJson = readMiniappBindAppIdsFromPackageJson;
16633
16705
  exports.readMiniappCategoryFromPackageJson = readMiniappCategoryFromPackageJson;
@@ -16638,6 +16710,7 @@ exports.readMiniappWorkspaceCardsFromPackageJson = readMiniappWorkspaceCardsFrom
16638
16710
  exports.relativePathContainsNodeModulesSegment = relativePathContainsNodeModulesSegment;
16639
16711
  exports.resolveMiniappSdkVersion = resolveMiniappSdkVersion;
16640
16712
  exports.resolveMiniappUploadSessionFiles = resolveMiniappUploadSessionFiles;
16713
+ exports.serializeMiniProgramDevelopmentSnapshot = serializeMiniProgramDevelopmentSnapshot;
16641
16714
  exports.shouldSkipMiniappPlatformCspFromEnv = shouldSkipMiniappPlatformCspFromEnv;
16642
16715
  exports.shouldUploadDistFile = shouldUploadDistFile;
16643
16716
  exports.validateBasicInfoPath = validateBasicInfoPath;
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var version = require('./version-B1aYSptt.cjs');
3
+ var version = require('./version-CG_VNZGM.cjs');
4
4
  var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
6
  var childProcess = require('node:child_process');
7
- var index = require('./index-MMLoNdeZ.cjs');
7
+ var index = require('./index-B_KKGIBN.cjs');
8
8
  require('node:module');
9
9
  require('readline');
10
10
  require('os');
@@ -3,6 +3,6 @@
3
3
  /** 构建时替换为当前发布包的实际版本。 */
4
4
  const HB_SDK_VERSION = typeof undefined === 'string'
5
5
  ? undefined
6
- : '0.9.1-alpha.9';
6
+ : '0.9.1';
7
7
 
8
8
  exports.HB_SDK_VERSION = HB_SDK_VERSION;
package/dist/cli.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./cli-chunks/index-MMLoNdeZ.cjs');
3
+ var index = require('./cli-chunks/index-B_KKGIBN.cjs');
4
4
  require('node:module');
5
5
  require('readline');
6
6
  require('os');