@heybox/hb-sdk 0.9.2-alpha.7 → 0.9.2-alpha.9

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 (43) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +4 -2
  3. package/dist/card-controller.cjs.js +35 -3
  4. package/dist/card-controller.esm.js +35 -3
  5. package/dist/cli-chunks/{build-Do22AWbq.cjs → build-DvHmPnZZ.cjs} +5 -5
  6. package/dist/cli-chunks/{context-DQhjWa7X.cjs → context-DYlZV8UG.cjs} +2 -2
  7. package/dist/cli-chunks/{create-QuI_mw8x.cjs → create-CJ0cyrJG.cjs} +1 -1
  8. package/dist/cli-chunks/deploy-lock-CmKl9M1c.cjs +148 -0
  9. package/dist/cli-chunks/{dev-KAhj5UTy.cjs → dev-DhEZBjd6.cjs} +8 -8
  10. package/dist/cli-chunks/{doctor-DNoQWBpo.cjs → doctor-B8q0UuXs.cjs} +1 -1
  11. package/dist/cli-chunks/games-CmO-AKXg.cjs +140 -0
  12. package/dist/cli-chunks/{index-DZUYwb3h.cjs → index-CRwNLk5w.cjs} +1 -1
  13. package/dist/cli-chunks/{index-bZIxID9N.cjs → index-hYvQR19Q.cjs} +35 -16
  14. package/dist/cli-chunks/{index.esm-EWleN3S5.cjs → index.esm-DU7YhFWI.cjs} +6 -6
  15. package/dist/cli-chunks/{login-BYM3Nwau.cjs → login-DMJ45_Bs.cjs} +1 -1
  16. package/dist/cli-chunks/{project-vite-6eLmb4Em.cjs → project-vite-BGy9w-Bx.cjs} +1 -1
  17. package/dist/cli-chunks/{remote-dvOjaxJu.cjs → remote-CSuwqlKA.cjs} +33 -146
  18. package/dist/cli-chunks/{runtime-gate-BKc2zPV-.cjs → runtime-gate-BvcLwvzi.cjs} +3 -2
  19. package/dist/cli-chunks/{runtime-permission-env-B9SqoP85.cjs → runtime-permission-env-CbqmHz0r.cjs} +14 -2
  20. package/dist/cli-chunks/{skill-DFXZ0SK_.cjs → skill-CtKW2J0U.cjs} +2 -2
  21. package/dist/cli-chunks/{version-CwEOrhL1.cjs → version-BQMfLqms.cjs} +1 -1
  22. package/dist/cli.cjs +1 -1
  23. package/dist/devtools/browser-dev-host/assets/{browser-dev-host-BitDUIsy.js → browser-dev-host-Cjw0mAi_.js} +1 -1
  24. package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-B0yrI7xe.js → desktop-app-launch-D9lPBkUV.js} +1 -1
  25. package/dist/devtools/browser-dev-host/assets/{index-D_mC4Hvt.js → index-DrbZkH9C.js} +3 -3
  26. package/dist/devtools/browser-dev-host/index.html +2 -2
  27. package/dist/index.cjs.js +13 -5
  28. package/dist/index.esm.js +13 -5
  29. package/dist/miniapp-publish.cjs.js +35 -81
  30. package/dist/miniapp-publish.esm.js +35 -80
  31. package/dist/protocol.cjs.js +13 -0
  32. package/dist/protocol.esm.js +13 -0
  33. package/dist/templates/vanilla-vite-js/README.md.ejs +4 -0
  34. package/dist/vite.cjs.js +51 -3
  35. package/dist/vite.esm.js +51 -3
  36. package/package.json +5 -4
  37. package/skill/SKILL.md +9 -0
  38. package/skill/skill.json +5 -5
  39. package/types/card-controller.d.ts +35 -3
  40. package/types/index.d.ts +51 -51
  41. package/types/miniapp-publish/index.d.ts +28 -60
  42. package/types/protocol.d.ts +10 -10
  43. package/types/vite/index.d.ts +8 -1
@@ -6593,6 +6593,7 @@ function validateWorkspaceCardReceiptV2(raw, controller) {
6593
6593
  * @param sourceLabel - 错误消息中的字段来源,默认 `package.json#heybox.category`。
6594
6594
  * @returns 合法类别原值;输入 `undefined` 时返回 `undefined`,由发布流程另行检查是否必填。
6595
6595
  * @throws `Error` 输入为其他值(包括 null 或空字符串)时抛出带字段来源的错误。
6596
+ * @since 0.8.3
6596
6597
  */
6597
6598
  function parseMiniappCategory(value, sourceLabel = 'package.json#heybox.category') {
6598
6599
  if (value === undefined)
@@ -9396,6 +9397,7 @@ const BASIC_INFO_MAX_PIXELS = 40_000_000;
9396
9397
  * @returns NFKC 规范化、去除首尾 Unicode White_Space 后的名称;不折叠规范化后的内部空白。
9397
9398
  * @throws `Error` 输入不是字符串,或规范化后不是 1–40 个 Unicode code point、不含文字或数字,或包含控制字符、
9398
9399
  * 格式字符、行/段分隔符以及 HTML 特殊字符 `<`、`>`、`&`、双引号或单引号时抛出。
9400
+ * @since 0.8.2
9399
9401
  */
9400
9402
  function normalizeBasicInfoName(raw) {
9401
9403
  if (typeof raw !== 'string')
@@ -9427,6 +9429,7 @@ function validateBasicInfoPath(raw) {
9427
9429
  * @remarks
9428
9430
  * 图片路径必须使用 `/` 分隔的非空相对路径,扩展名为 JPEG、PNG、GIF 或 WebP;拒绝 URL、点段、
9429
9431
  * 控制字符和构建/缓存等保留目录。此函数只校验声明,不读取文件,也不验证图片字节、尺寸或存在性。
9432
+ * @since 0.8.2
9430
9433
  */
9431
9434
  function parseMiniappBasicInfo(value, sdkVersion = '0.8.2') {
9432
9435
  sdkVersion = sdkVersion.trim();
@@ -9499,6 +9502,7 @@ const MINIAPP_BIND_APP_IDS_MAX_COUNT = 20;
9499
9502
  * @see [miniappManifest](/reference/symbols/vite/functions/miniappManifest)
9500
9503
  * @see [navigation.openAppPage](/reference/sdk/navigation/openAppPage)
9501
9504
  * @see [CLI 与远端发布](/guide/cli#生产构建)
9505
+ * @since 0.8.1
9502
9506
  */
9503
9507
  function parseMiniappBindAppIds(value, options = {}) {
9504
9508
  const sourceLabel = options.sourceLabel ?? 'package.json#heybox.bindAppIds';
@@ -9687,6 +9691,7 @@ const MINIAPP_WINDOW_ALLOWED_FIELDS = [...MINIAPP_WINDOW_NUMBER_FIELDS, 'resizab
9687
9691
  *
9688
9692
  * @see {@link resolveMiniappManifestPlatforms}
9689
9693
  * @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/symbols/vite/functions/miniappManifest | miniappManifest}
9694
+ * @since 0.3.1
9690
9695
  */
9691
9696
  function isValidMiniappManifestVersion(version) {
9692
9697
  return getMiniappManifestVersionError(version) === undefined;
@@ -9707,6 +9712,7 @@ function validateMiniappManifestVersion(version, sourceLabel = 'manifest.version
9707
9712
  * @remarks
9708
9713
  * 不修改输入对象,不执行文件 I/O;不会验证图片/归档是否存在、内容摘要是否匹配,也不查询远端发布资格。
9709
9714
  * 成功仅表示 Manifest 字段通过校验,不能替代文件检查与服务端发布预检。
9715
+ * @since 0.8.2
9710
9716
  */
9711
9717
  function validateMiniappManifestForDeploy(manifest) {
9712
9718
  const version = validateMiniappManifestVersion(manifest.version, 'manifest.version');
@@ -9880,6 +9886,7 @@ const NO_MINIAPP_PLATFORMS = Object.freeze([]);
9880
9886
  * @see {@link MINIAPP_LEGACY_DEFAULT_PLATFORM_VALUES}
9881
9887
  * @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/symbols/miniapp-publish/functions/isValidVersion | isValidVersion}
9882
9888
  * @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/symbols/vite/functions/miniappManifest | miniappManifest}
9889
+ * @since 0.8.1
9883
9890
  */
9884
9891
  function resolveMiniappManifestPlatforms(sdkVersion, manifest) {
9885
9892
  if (!isRecord$1(manifest)) {
@@ -10077,6 +10084,7 @@ const BASIC_INFO_PLACEHOLDER_SHA256 = 'd14e54b30f5e6d1bcbf51267bc82b06a0af7c333f
10077
10084
  * }
10078
10085
  * }
10079
10086
  * ```
10087
+ * @since 0.8.2
10080
10088
  */
10081
10089
  async function previewMiniappBasicInfo(manifest, files) {
10082
10090
  const profile = parseMiniappBasicInfo(manifest, String(manifest.sdkVersion ?? ''));
@@ -18379,6 +18387,7 @@ const RUNTIME_GATE_BOOTSTRAP_MARKER = 'data-heybox-runtime-gate-bootstrap';
18379
18387
  * @param html - 待检查的完整 HTML 文本,使用 HTML parser 解析。
18380
18388
  * @returns Gate、隐藏样式及 bootstrap 标记均出现时返回 `true`,否则返回 `false`。
18381
18389
  * @remarks 只识别标记,不验证脚本内容、标记所在节点或宿主握手;不能据此判断页面安全或实际可运行。
18390
+ * @since 0.8.2
18382
18391
  */
18383
18392
  function hasMiniappRuntimeGate(html) {
18384
18393
  const document = parse(html);
@@ -18408,6 +18417,27 @@ function walk(node, visit) {
18408
18417
  walk(node.content, visit);
18409
18418
  }
18410
18419
 
18420
+ /** 根据当前项目声明或实际版本 Manifest 检查资料完整性,不联网、不修改输入。 */
18421
+ function getMiniappMetadataWarnings(metadata) {
18422
+ const warnings = [];
18423
+ if (metadata.desc === undefined || (typeof metadata.desc === 'string' && !metadata.desc.trim())) {
18424
+ warnings.push({
18425
+ code: 'MINIAPP_DESC_MISSING',
18426
+ field: 'desc',
18427
+ message: '尚未填写小程序简介。建议在 package.json#heybox.desc 中说明主要功能和适用场景,修改后重新构建。',
18428
+ });
18429
+ }
18430
+ if (metadata.category === 'tool' &&
18431
+ (metadata.bindAppIds === undefined || (Array.isArray(metadata.bindAppIds) && metadata.bindAppIds.length === 0))) {
18432
+ warnings.push({
18433
+ code: 'MINIAPP_TOOL_GAME_BINDING_MISSING',
18434
+ field: 'bindAppIds',
18435
+ message: '当前小程序为工具类,尚未关联游戏。如服务于特定 PC 游戏,可通过 hb-sdk remote games search "游戏名" 查询 appid 并填写 package.json#heybox.bindAppIds,修改后重新构建;通用工具可保持为空。',
18436
+ });
18437
+ }
18438
+ return warnings;
18439
+ }
18440
+
18411
18441
  /** CDN 上传接口使用的小程序产物业务 scope。 */
18412
18442
  const MINIAPP_UPLOAD_SCOPE = 'activity';
18413
18443
  /** 完整 CDN 上传 key 的默认长度上限;旧固定版本流程按字符计数,上传会话流程按 UTF-8 bytes 计数。 */
@@ -18490,6 +18520,7 @@ const textEncoder = new TextEncoder();
18490
18520
  * @see {@link relativePathContainsNodeModulesSegment}
18491
18521
  * @see {@link shouldUploadDistFile}
18492
18522
  * @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/symbols/protocol/functions/isMiniProgramRelativePath | isMiniProgramRelativePath}
18523
+ * @since 0.3.1
18493
18524
  */
18494
18525
  function normalizeRelativePath(relativePath) {
18495
18526
  return String(relativePath || '')
@@ -18520,6 +18551,7 @@ function normalizeRelativePath(relativePath) {
18520
18551
  * @see [normalizeRelativePath](/reference/symbols/miniapp-publish/functions/normalizeRelativePath)
18521
18552
  * @see [shouldUploadDistFile](/reference/symbols/miniapp-publish/functions/shouldUploadDistFile)
18522
18553
  * @see [miniapp-publish](/reference/miniapp-publish/)
18554
+ * @since 0.3.1
18523
18555
  */
18524
18556
  function relativePathContainsNodeModulesSegment(relativePath) {
18525
18557
  return normalizeRelativePath(relativePath)
@@ -18547,85 +18579,6 @@ function getMiniProgramUploadAlias(miniProgramId) {
18547
18579
  }
18548
18580
  return hash.toString(36);
18549
18581
  }
18550
- /**
18551
- * 生成旧版固定版本 CDN 上传 key。
18552
- *
18553
- * @param input - 小程序 ID、版本和构建产物相对路径。
18554
- * @returns `/u/{alias}/{version}/{relativePath}` 形式的上传 key。
18555
- * @remarks 此函数不会校验版本、路径安全性或 key 长度;批量上传前应调用 {@link validateUploadPaths}。
18556
- * @example
18557
- * ```ts
18558
- * getMiniappUploadKey({
18559
- * miniProgramId: 'mp_example',
18560
- * version: '1.2.3',
18561
- * relativePath: 'assets\\app.js',
18562
- * }); // /u/<alias>/1.2.3/assets/app.js
18563
- * ```
18564
- */
18565
- function getMiniappUploadKey(input) {
18566
- const alias = getMiniProgramUploadAlias(input.miniProgramId);
18567
- const normalized = normalizeRelativePath(input.relativePath);
18568
- return `/u/${alias}/${input.version}/${normalized}`;
18569
- }
18570
- /**
18571
- * 校验旧版固定版本上传路径的格式、唯一性和完整 key 长度。
18572
- *
18573
- * @param items - 待上传条目;按数组顺序检查。
18574
- * @param options - 小程序 ID、版本和可选的 key 长度上限。
18575
- * @returns 第一个校验错误的中文提示;全部合法时返回 `undefined`。
18576
- * @remarks
18577
- * 路径会先统一分隔符,因此 `assets\\app.js` 与 `assets/app.js` 视为重复。
18578
- * 长度按 JavaScript 字符串 `length` 计算;上传会话的 UTF-8 字节限制应使用 {@link validateMiniappUploadPathLengths}。
18579
- * @example
18580
- * ```ts
18581
- * const error = validateUploadPaths(
18582
- * [{ relativePath: 'index.html' }, { relativePath: 'assets/app.js' }],
18583
- * { miniProgramId: 'mp_example', version: '1.2.3' },
18584
- * );
18585
- * if (error) throw new Error(error);
18586
- * ```
18587
- */
18588
- function validateUploadPaths(items, options) {
18589
- const limit = options.maxLength ?? ACTIVITY_UPLOAD_KEY_MAX_LENGTH;
18590
- const uploadKeys = new Set();
18591
- for (const item of items) {
18592
- const relativePath = String(item.relativePath ?? '');
18593
- const normalizedRelativePath = normalizeRelativePath(relativePath);
18594
- const invalidReason = getInvalidUploadPathReason(normalizedRelativePath);
18595
- if (invalidReason) {
18596
- return `构建产物文件路径不合法(${invalidReason}):${JSON.stringify(relativePath)}`;
18597
- }
18598
- const key = getMiniappUploadKey({
18599
- miniProgramId: options.miniProgramId,
18600
- version: options.version,
18601
- relativePath: normalizedRelativePath,
18602
- });
18603
- if (uploadKeys.has(key)) {
18604
- return `构建产物文件路径重复,无法上传到同一位置:${JSON.stringify(relativePath)}`;
18605
- }
18606
- uploadKeys.add(key);
18607
- if (key.length > limit) {
18608
- return `文件路径过长,请缩短构建产物文件名或目录层级:${relativePath}`;
18609
- }
18610
- }
18611
- return undefined;
18612
- }
18613
- function getInvalidUploadPathReason(relativePath) {
18614
- const segments = relativePath.replace(/\\/g, '/').split('/');
18615
- if (segments.some((segment) => !segment)) {
18616
- return '包含空路径段';
18617
- }
18618
- if (segments.some((segment) => segment === '.')) {
18619
- return '包含当前目录';
18620
- }
18621
- if (segments.some((segment) => segment === '..')) {
18622
- return '包含上级目录';
18623
- }
18624
- if (/[\u0000-\u001F\u007F]/.test(relativePath)) {
18625
- return '包含控制字符';
18626
- }
18627
- return undefined;
18628
- }
18629
18582
  /**
18630
18583
  * 校验一组构建产物的总大小是否超过给定上限。
18631
18584
  *
@@ -18682,6 +18635,7 @@ function getInvalidUploadPathReason(relativePath) {
18682
18635
  * @see {@link ValidateUploadTotalSizeOptions}
18683
18636
  * @see [shouldUploadDistFile](/reference/symbols/miniapp-publish/functions/shouldUploadDistFile)
18684
18637
  * @see [miniapp-publish](/reference/miniapp-publish/)
18638
+ * @since 0.4.7
18685
18639
  */
18686
18640
  function validateUploadTotalSize(items, options = {}) {
18687
18641
  const limit = options.limitBytes ?? MINIAPP_UPLOAD_TOTAL_SIZE_LIMIT_BYTES;
@@ -18774,6 +18728,7 @@ function validateMiniappUploadSizeBudgets(items, options = {}) {
18774
18728
  * @see [relativePathContainsNodeModulesSegment](/reference/symbols/miniapp-publish/functions/relativePathContainsNodeModulesSegment)
18775
18729
  * @see [validateUploadTotalSize](/reference/symbols/miniapp-publish/functions/validateUploadTotalSize)
18776
18730
  * @see [miniapp-publish](/reference/miniapp-publish/)
18731
+ * @since 0.3.1
18777
18732
  */
18778
18733
  function shouldUploadDistFile(relativePath) {
18779
18734
  const normalized = normalizeRelativePath(relativePath);
@@ -19161,4 +19116,4 @@ const LIST_USER_MINIPROGRAM_PERMISSION_APPLICATION_API_PATH = '/mall/developer/u
19161
19116
  /** 提交不绑定版本的平台权限申请。 */
19162
19117
  const SUBMIT_USER_MINIPROGRAM_PERMISSION_APPLICATION_API_PATH = '/mall/developer/user_miniprogram/runtime_permission/application_submit';
19163
19118
 
19164
- export { ACTIVITY_UPLOAD_KEY_MAX_LENGTH, CREATE_USER_MINIPROGRAM_API_PATH, CREATE_USER_MINIPROGRAM_LEADERBOARD_API_PATH, CREATE_USER_MINIPROGRAM_LOCAL_DEV_LAUNCH_TOKEN_API_PATH, DELETE_USER_MINIPROGRAM_LEADERBOARD_API_PATH, DETAIL_USER_MINIPROGRAM_API_PATH, DETAIL_USER_MINIPROGRAM_LEADERBOARD_API_PATH, DEVELOPER_ENTITY_LIST_API_PATH, DEVELOPER_ENTITY_SWITCH_API_PATH, LIST_USER_MINIPROGRAM_API_PATH, LIST_USER_MINIPROGRAM_LEADERBOARD_API_PATH, LIST_USER_MINIPROGRAM_PERMISSION_APPLICATION_API_PATH, LIST_USER_MINIPROGRAM_VERSION_API_PATH, MINIAPP_COMPANION_UPLOAD_TEMPORARY_SIZE_LIMIT_BYTES, MINIAPP_LEGACY_DEFAULT_PLATFORM_VALUES, MINIAPP_LEGACY_MOBILE_PLATFORM_VALUES, MINIAPP_PLATFORM_HARD_CUT_SDK_VERSION, MINIAPP_UPLOAD_BATCH_SIZE, MINIAPP_UPLOAD_SCOPE, MINIAPP_UPLOAD_TOTAL_SIZE_LIMIT_BYTES, PRECHECK_USER_MINIPROGRAM_VERSION_API_PATH, RELEASE_USER_MINIPROGRAM_VERSION_API_PATH, REOPEN_USER_MINIPROGRAM_API_PATH, SUBMIT_USER_MINIPROGRAM_AUDIT_API_PATH, SUBMIT_USER_MINIPROGRAM_PERMISSION_APPLICATION_API_PATH, TAKE_DOWN_USER_MINIPROGRAM_API_PATH, UPDATE_SQUARE_DISPLAY_API_PATH, UPDATE_USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH, USER_MINIPROGRAM_ACCESS_STATUS_API_PATH, USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH, USER_MINIPROGRAM_VERSION_PREVIEW_INFO_API_PATH, WITHDRAW_USER_MINIPROGRAM_VERSION_API_PATH, createMiniappArtifactFileHeader, createMiniappArtifactSignatureHeader, getMiniProgramUploadAlias, getMiniappUploadKey, hasMiniappRuntimeGate, isValidMiniappManifestVersion as isValidVersion, normalizeBasicInfoName, normalizeRelativePath, parseMiniappBasicInfo, parseMiniappBindAppIds, parseMiniappCategory, prepareMiniappArtifactFiles, previewMiniappBasicInfo, relativePathContainsNodeModulesSegment, resolveMiniappManifestPlatforms, resolveMiniappUploadSessionFiles, shouldUploadDistFile, validateMiniappCompanionFileReceipts, validateMiniappManifestForDeploy, validateMiniappUploadPathLengths, validateMiniappUploadSizeBudgets, validateMiniappWorkspaceCardFileReceipts, validateUploadPaths, validateUploadTotalSize };
19119
+ export { ACTIVITY_UPLOAD_KEY_MAX_LENGTH, CREATE_USER_MINIPROGRAM_API_PATH, CREATE_USER_MINIPROGRAM_LEADERBOARD_API_PATH, CREATE_USER_MINIPROGRAM_LOCAL_DEV_LAUNCH_TOKEN_API_PATH, DELETE_USER_MINIPROGRAM_LEADERBOARD_API_PATH, DETAIL_USER_MINIPROGRAM_API_PATH, DETAIL_USER_MINIPROGRAM_LEADERBOARD_API_PATH, DEVELOPER_ENTITY_LIST_API_PATH, DEVELOPER_ENTITY_SWITCH_API_PATH, LIST_USER_MINIPROGRAM_API_PATH, LIST_USER_MINIPROGRAM_LEADERBOARD_API_PATH, LIST_USER_MINIPROGRAM_PERMISSION_APPLICATION_API_PATH, LIST_USER_MINIPROGRAM_VERSION_API_PATH, MINIAPP_COMPANION_UPLOAD_TEMPORARY_SIZE_LIMIT_BYTES, MINIAPP_LEGACY_DEFAULT_PLATFORM_VALUES, MINIAPP_LEGACY_MOBILE_PLATFORM_VALUES, MINIAPP_PLATFORM_HARD_CUT_SDK_VERSION, MINIAPP_UPLOAD_BATCH_SIZE, MINIAPP_UPLOAD_SCOPE, MINIAPP_UPLOAD_TOTAL_SIZE_LIMIT_BYTES, PRECHECK_USER_MINIPROGRAM_VERSION_API_PATH, RELEASE_USER_MINIPROGRAM_VERSION_API_PATH, REOPEN_USER_MINIPROGRAM_API_PATH, SUBMIT_USER_MINIPROGRAM_AUDIT_API_PATH, SUBMIT_USER_MINIPROGRAM_PERMISSION_APPLICATION_API_PATH, TAKE_DOWN_USER_MINIPROGRAM_API_PATH, UPDATE_SQUARE_DISPLAY_API_PATH, UPDATE_USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH, USER_MINIPROGRAM_ACCESS_STATUS_API_PATH, USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH, USER_MINIPROGRAM_VERSION_PREVIEW_INFO_API_PATH, WITHDRAW_USER_MINIPROGRAM_VERSION_API_PATH, createMiniappArtifactFileHeader, createMiniappArtifactSignatureHeader, getMiniProgramUploadAlias, getMiniappMetadataWarnings, hasMiniappRuntimeGate, isValidMiniappManifestVersion as isValidVersion, normalizeBasicInfoName, normalizeRelativePath, parseMiniappBasicInfo, parseMiniappBindAppIds, parseMiniappCategory, prepareMiniappArtifactFiles, previewMiniappBasicInfo, relativePathContainsNodeModulesSegment, resolveMiniappManifestPlatforms, resolveMiniappUploadSessionFiles, shouldUploadDistFile, validateMiniappCompanionFileReceipts, validateMiniappManifestForDeploy, validateMiniappUploadPathLengths, validateMiniappUploadSizeBudgets, validateMiniappWorkspaceCardFileReceipts, validateUploadTotalSize };
@@ -504,6 +504,7 @@ const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
504
504
  * @see [MINI_PROGRAM_BRIDGE_NONCE_PARAM](/reference/symbols/protocol/constants/MINI_PROGRAM_BRIDGE_NONCE_PARAM) iframe URL 中的 nonce 参数名。
505
505
  * @see [MINI_PROGRAM_PROTOCOL_CAPABILITIES](/reference/symbols/protocol/constants/MINI_PROGRAM_PROTOCOL_CAPABILITIES) 公开 method 与权限 requirement 目录。
506
506
  * @see [parseMiniProgramRuntimePermissions](/reference/symbols/protocol/functions/parseMiniProgramRuntimePermissions) Runtime 权限快照解析器。
507
+ * @since 0.3.1
507
508
  */
508
509
  function isMiniProgramBridgeMessage(value) {
509
510
  if (!isRecord$3(value))
@@ -588,6 +589,7 @@ function isMiniProgramBridgeMessage(value) {
588
589
  * @see [PathRoot](/reference/symbols/root/interfaces/PathRoot) 提供 `file()` / `directory()` 的 SDK 路径入口。
589
590
  * @see [FileSystem](/reference/symbols/root/interfaces/FileSystem) `files.sandbox` 逻辑路径能力。
590
591
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 已授权目录下的相对路径能力。
592
+ * @since 0.8.0
591
593
  */
592
594
  function isMiniProgramRelativePath(value) {
593
595
  if (typeof value !== 'string' || !value || value.startsWith('/') || value.endsWith('/')) {
@@ -654,6 +656,7 @@ function isMiniProgramRelativePath(value) {
654
656
  * @see [PathRoot](/reference/symbols/root/interfaces/PathRoot) SDK 公开的逻辑路径 root 能力。
655
657
  * @see [FilesModule](/reference/symbols/root/interfaces/FilesModule) 提供 `files.sandbox` 与目录 picker 的入口。
656
658
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 可作为 derived path root 的目录代理。
659
+ * @since 0.8.0
657
660
  */
658
661
  function isMiniProgramPathRootRef(value) {
659
662
  if (!isRecord$3(value))
@@ -720,6 +723,7 @@ function isMiniProgramPathRootRef(value) {
720
723
  * @see [isMiniProgramFileDescriptor](/reference/symbols/protocol/functions/isMiniProgramFileDescriptor) 包含名称和 mode 的文件 descriptor guard。
721
724
  * @see [isMiniProgramDirectoryRef](/reference/symbols/protocol/functions/isMiniProgramDirectoryRef) 可用 `'.'` 指向 root 自身的目录引用 guard。
722
725
  * @see [FileHandle](/reference/symbols/root/interfaces/FileHandle) 使用文件引用的公开 I/O 代理。
726
+ * @since 0.8.0
723
727
  */
724
728
  function isMiniProgramFileRef(value) {
725
729
  if (!isRecord$3(value) || value.kind !== 'file')
@@ -787,6 +791,7 @@ function isMiniProgramFileRef(value) {
787
791
  * @see [isMiniProgramDirectoryDescriptor](/reference/symbols/protocol/functions/isMiniProgramDirectoryDescriptor) 包含名称和 mode 的目录 descriptor guard。
788
792
  * @see [isMiniProgramFileRef](/reference/symbols/protocol/functions/isMiniProgramFileRef) 不接受 root 自身 `'.'` 的文件引用 guard。
789
793
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 使用目录引用的公开路径操作代理。
794
+ * @since 0.8.0
790
795
  */
791
796
  function isMiniProgramDirectoryRef(value) {
792
797
  if (!isRecord$3(value) || value.kind !== 'directory')
@@ -861,6 +866,7 @@ function isMiniProgramDirectoryRef(value) {
861
866
  * @see [FileHandle](/reference/symbols/root/interfaces/FileHandle) 校验后由 SDK 建立的文件代理。
862
867
  * @see [PickFilesResult](/reference/symbols/protocol/types/PickFilesResult) picker 的 direct-ref 文件结果。
863
868
  * @see [SaveFileResult](/reference/symbols/protocol/types/SaveFileResult) save picker 的 direct-ref 文件结果。
869
+ * @since 0.8.0
864
870
  */
865
871
  function isMiniProgramFileDescriptor(value) {
866
872
  return (isRecord$3(value) &&
@@ -931,6 +937,7 @@ function isMiniProgramFileDescriptor(value) {
931
937
  * @see [FilesModule](/reference/symbols/root/interfaces/FilesModule) `files` 公开能力入口。
932
938
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 校验后由 SDK 建立的目录代理。
933
939
  * @see [PickDirectoryResult](/reference/symbols/protocol/types/PickDirectoryResult) picker 的 direct-ref 返回契约。
940
+ * @since 0.8.0
934
941
  */
935
942
  function isMiniProgramDirectoryDescriptor(value) {
936
943
  return (isRecord$3(value) &&
@@ -996,6 +1003,7 @@ function isMiniProgramDirectoryDescriptor(value) {
996
1003
  * @see [FileSystemEntity](/reference/symbols/root/types/FileSystemEntity) SDK 公开的 FileHandle/DirectoryHandle 联合。
997
1004
  * @see [FileHandle](/reference/symbols/root/interfaces/FileHandle) 文件 descriptor 对应的能力代理。
998
1005
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 目录 descriptor 对应的能力代理及 `list()` 入口。
1006
+ * @since 0.8.0
999
1007
  */
1000
1008
  function isMiniProgramFileSystemEntityDescriptor(value) {
1001
1009
  return isMiniProgramFileDescriptor(value) || isMiniProgramDirectoryDescriptor(value);
@@ -1051,6 +1059,7 @@ function isMiniProgramFileSystemEntityDescriptor(value) {
1051
1059
  * @see [CompanionStdio](/reference/symbols/root/interfaces/CompanionStdio) Companion 原始字节 stdin/stdout/stderr。
1052
1060
  * @see [isMiniProgramFileDescriptor](/reference/symbols/protocol/functions/isMiniProgramFileDescriptor) 文件 descriptor guard。
1053
1061
  * @see [isMiniProgramDirectoryDescriptor](/reference/symbols/protocol/functions/isMiniProgramDirectoryDescriptor) 目录 descriptor guard。
1062
+ * @since 0.8.0
1054
1063
  */
1055
1064
  function isMiniProgramByteArray(value) {
1056
1065
  return value instanceof Uint8Array && value.buffer instanceof ArrayBuffer;
@@ -1110,6 +1119,7 @@ function isMiniProgramByteArray(value) {
1110
1119
  * @see [FileStatResult](/reference/symbols/protocol/types/FileStatResult) `file.stat` 的 wire 返回类型。
1111
1120
  * @see [FileStat](/reference/symbols/root/interfaces/FileStat) SDK 向业务返回的元数据快照。
1112
1121
  * @see [FileHandle](/reference/symbols/root/interfaces/FileHandle) 提供 `stat()` 的当前 session 文件代理。
1122
+ * @since 0.8.0
1113
1123
  */
1114
1124
  function isMiniProgramFileStat(value) {
1115
1125
  return (isRecord$3(value) &&
@@ -1170,6 +1180,7 @@ function isMiniProgramFileStat(value) {
1170
1180
  * @see [DownloadProgress](/reference/symbols/root/interfaces/DownloadProgress) `onProgress` 接收的公开 SDK 进度类型。
1171
1181
  * @see [network.download](/reference/sdk/network/download) 产生并消费该进度的下载能力。
1172
1182
  * @see [isMiniProgramBridgeMessage](/reference/symbols/protocol/functions/isMiniProgramBridgeMessage) operation progress envelope 的最低校验。
1183
+ * @since 0.8.0
1173
1184
  */
1174
1185
  function isMiniProgramDownloadProgressPayload(value) {
1175
1186
  if (!isRecord$3(value) ||
@@ -1296,6 +1307,7 @@ const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(MINI_PROGRAM_PERMISSION_KEYS);
1296
1307
  * @see [parseMiniProgramRuntimePermissions](/reference/symbols/protocol/functions/parseMiniProgramRuntimePermissions) 完整 snapshot 的 trim、legacy 归一化与 config 校验。
1297
1308
  * @see [MINI_PROGRAM_PROTOCOL_CAPABILITIES](/reference/symbols/protocol/constants/MINI_PROGRAM_PROTOCOL_CAPABILITIES) method 到 permission requirement 的权威映射。
1298
1309
  * @see [权限声明](/guide/permissions) Manifest 声明、平台批准与 Runtime 状态的完整流程。
1310
+ * @since 0.6.4
1299
1311
  */
1300
1312
  function isManagedMiniProgramRuntimePermissionKey(key) {
1301
1313
  return MANAGED_RUNTIME_PERMISSION_KEYS.has(key);
@@ -1371,6 +1383,7 @@ function isManagedMiniProgramRuntimePermissionKey(key) {
1371
1383
  * @see {@link isManagedMiniProgramRuntimePermissionKey}
1372
1384
  * @see {@link MINI_PROGRAM_PROTOCOL_CAPABILITIES}
1373
1385
  * @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/permissions | 权限声明}
1386
+ * @since 0.6.4
1374
1387
  */
1375
1388
  function parseMiniProgramRuntimePermissions(snapshot) {
1376
1389
  if (!isRecord$2(snapshot) || snapshot.schema_version !== 1 || !Array.isArray(snapshot.entries)) {
@@ -502,6 +502,7 @@ const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
502
502
  * @see [MINI_PROGRAM_BRIDGE_NONCE_PARAM](/reference/symbols/protocol/constants/MINI_PROGRAM_BRIDGE_NONCE_PARAM) iframe URL 中的 nonce 参数名。
503
503
  * @see [MINI_PROGRAM_PROTOCOL_CAPABILITIES](/reference/symbols/protocol/constants/MINI_PROGRAM_PROTOCOL_CAPABILITIES) 公开 method 与权限 requirement 目录。
504
504
  * @see [parseMiniProgramRuntimePermissions](/reference/symbols/protocol/functions/parseMiniProgramRuntimePermissions) Runtime 权限快照解析器。
505
+ * @since 0.3.1
505
506
  */
506
507
  function isMiniProgramBridgeMessage(value) {
507
508
  if (!isRecord$3(value))
@@ -586,6 +587,7 @@ function isMiniProgramBridgeMessage(value) {
586
587
  * @see [PathRoot](/reference/symbols/root/interfaces/PathRoot) 提供 `file()` / `directory()` 的 SDK 路径入口。
587
588
  * @see [FileSystem](/reference/symbols/root/interfaces/FileSystem) `files.sandbox` 逻辑路径能力。
588
589
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 已授权目录下的相对路径能力。
590
+ * @since 0.8.0
589
591
  */
590
592
  function isMiniProgramRelativePath(value) {
591
593
  if (typeof value !== 'string' || !value || value.startsWith('/') || value.endsWith('/')) {
@@ -652,6 +654,7 @@ function isMiniProgramRelativePath(value) {
652
654
  * @see [PathRoot](/reference/symbols/root/interfaces/PathRoot) SDK 公开的逻辑路径 root 能力。
653
655
  * @see [FilesModule](/reference/symbols/root/interfaces/FilesModule) 提供 `files.sandbox` 与目录 picker 的入口。
654
656
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 可作为 derived path root 的目录代理。
657
+ * @since 0.8.0
655
658
  */
656
659
  function isMiniProgramPathRootRef(value) {
657
660
  if (!isRecord$3(value))
@@ -718,6 +721,7 @@ function isMiniProgramPathRootRef(value) {
718
721
  * @see [isMiniProgramFileDescriptor](/reference/symbols/protocol/functions/isMiniProgramFileDescriptor) 包含名称和 mode 的文件 descriptor guard。
719
722
  * @see [isMiniProgramDirectoryRef](/reference/symbols/protocol/functions/isMiniProgramDirectoryRef) 可用 `'.'` 指向 root 自身的目录引用 guard。
720
723
  * @see [FileHandle](/reference/symbols/root/interfaces/FileHandle) 使用文件引用的公开 I/O 代理。
724
+ * @since 0.8.0
721
725
  */
722
726
  function isMiniProgramFileRef(value) {
723
727
  if (!isRecord$3(value) || value.kind !== 'file')
@@ -785,6 +789,7 @@ function isMiniProgramFileRef(value) {
785
789
  * @see [isMiniProgramDirectoryDescriptor](/reference/symbols/protocol/functions/isMiniProgramDirectoryDescriptor) 包含名称和 mode 的目录 descriptor guard。
786
790
  * @see [isMiniProgramFileRef](/reference/symbols/protocol/functions/isMiniProgramFileRef) 不接受 root 自身 `'.'` 的文件引用 guard。
787
791
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 使用目录引用的公开路径操作代理。
792
+ * @since 0.8.0
788
793
  */
789
794
  function isMiniProgramDirectoryRef(value) {
790
795
  if (!isRecord$3(value) || value.kind !== 'directory')
@@ -859,6 +864,7 @@ function isMiniProgramDirectoryRef(value) {
859
864
  * @see [FileHandle](/reference/symbols/root/interfaces/FileHandle) 校验后由 SDK 建立的文件代理。
860
865
  * @see [PickFilesResult](/reference/symbols/protocol/types/PickFilesResult) picker 的 direct-ref 文件结果。
861
866
  * @see [SaveFileResult](/reference/symbols/protocol/types/SaveFileResult) save picker 的 direct-ref 文件结果。
867
+ * @since 0.8.0
862
868
  */
863
869
  function isMiniProgramFileDescriptor(value) {
864
870
  return (isRecord$3(value) &&
@@ -929,6 +935,7 @@ function isMiniProgramFileDescriptor(value) {
929
935
  * @see [FilesModule](/reference/symbols/root/interfaces/FilesModule) `files` 公开能力入口。
930
936
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 校验后由 SDK 建立的目录代理。
931
937
  * @see [PickDirectoryResult](/reference/symbols/protocol/types/PickDirectoryResult) picker 的 direct-ref 返回契约。
938
+ * @since 0.8.0
932
939
  */
933
940
  function isMiniProgramDirectoryDescriptor(value) {
934
941
  return (isRecord$3(value) &&
@@ -994,6 +1001,7 @@ function isMiniProgramDirectoryDescriptor(value) {
994
1001
  * @see [FileSystemEntity](/reference/symbols/root/types/FileSystemEntity) SDK 公开的 FileHandle/DirectoryHandle 联合。
995
1002
  * @see [FileHandle](/reference/symbols/root/interfaces/FileHandle) 文件 descriptor 对应的能力代理。
996
1003
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 目录 descriptor 对应的能力代理及 `list()` 入口。
1004
+ * @since 0.8.0
997
1005
  */
998
1006
  function isMiniProgramFileSystemEntityDescriptor(value) {
999
1007
  return isMiniProgramFileDescriptor(value) || isMiniProgramDirectoryDescriptor(value);
@@ -1049,6 +1057,7 @@ function isMiniProgramFileSystemEntityDescriptor(value) {
1049
1057
  * @see [CompanionStdio](/reference/symbols/root/interfaces/CompanionStdio) Companion 原始字节 stdin/stdout/stderr。
1050
1058
  * @see [isMiniProgramFileDescriptor](/reference/symbols/protocol/functions/isMiniProgramFileDescriptor) 文件 descriptor guard。
1051
1059
  * @see [isMiniProgramDirectoryDescriptor](/reference/symbols/protocol/functions/isMiniProgramDirectoryDescriptor) 目录 descriptor guard。
1060
+ * @since 0.8.0
1052
1061
  */
1053
1062
  function isMiniProgramByteArray(value) {
1054
1063
  return value instanceof Uint8Array && value.buffer instanceof ArrayBuffer;
@@ -1108,6 +1117,7 @@ function isMiniProgramByteArray(value) {
1108
1117
  * @see [FileStatResult](/reference/symbols/protocol/types/FileStatResult) `file.stat` 的 wire 返回类型。
1109
1118
  * @see [FileStat](/reference/symbols/root/interfaces/FileStat) SDK 向业务返回的元数据快照。
1110
1119
  * @see [FileHandle](/reference/symbols/root/interfaces/FileHandle) 提供 `stat()` 的当前 session 文件代理。
1120
+ * @since 0.8.0
1111
1121
  */
1112
1122
  function isMiniProgramFileStat(value) {
1113
1123
  return (isRecord$3(value) &&
@@ -1168,6 +1178,7 @@ function isMiniProgramFileStat(value) {
1168
1178
  * @see [DownloadProgress](/reference/symbols/root/interfaces/DownloadProgress) `onProgress` 接收的公开 SDK 进度类型。
1169
1179
  * @see [network.download](/reference/sdk/network/download) 产生并消费该进度的下载能力。
1170
1180
  * @see [isMiniProgramBridgeMessage](/reference/symbols/protocol/functions/isMiniProgramBridgeMessage) operation progress envelope 的最低校验。
1181
+ * @since 0.8.0
1171
1182
  */
1172
1183
  function isMiniProgramDownloadProgressPayload(value) {
1173
1184
  if (!isRecord$3(value) ||
@@ -1294,6 +1305,7 @@ const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(MINI_PROGRAM_PERMISSION_KEYS);
1294
1305
  * @see [parseMiniProgramRuntimePermissions](/reference/symbols/protocol/functions/parseMiniProgramRuntimePermissions) 完整 snapshot 的 trim、legacy 归一化与 config 校验。
1295
1306
  * @see [MINI_PROGRAM_PROTOCOL_CAPABILITIES](/reference/symbols/protocol/constants/MINI_PROGRAM_PROTOCOL_CAPABILITIES) method 到 permission requirement 的权威映射。
1296
1307
  * @see [权限声明](/guide/permissions) Manifest 声明、平台批准与 Runtime 状态的完整流程。
1308
+ * @since 0.6.4
1297
1309
  */
1298
1310
  function isManagedMiniProgramRuntimePermissionKey(key) {
1299
1311
  return MANAGED_RUNTIME_PERMISSION_KEYS.has(key);
@@ -1369,6 +1381,7 @@ function isManagedMiniProgramRuntimePermissionKey(key) {
1369
1381
  * @see {@link isManagedMiniProgramRuntimePermissionKey}
1370
1382
  * @see {@link MINI_PROGRAM_PROTOCOL_CAPABILITIES}
1371
1383
  * @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/permissions | 权限声明}
1384
+ * @since 0.6.4
1372
1385
  */
1373
1386
  function parseMiniProgramRuntimePermissions(snapshot) {
1374
1387
  if (!isRecord$2(snapshot) || snapshot.schema_version !== 1 || !Array.isArray(snapshot.entries)) {
@@ -14,6 +14,10 @@ npm run deploy -- --release-note "更新说明"
14
14
 
15
15
  `package.json#heybox.category` 初始声明为 `other`(其他)。发布前请按实际用途选择 `tool`(工具)、`game`(游戏)或 `other`(其他);该字段为必填,修改后需重新构建。
16
16
 
17
+ 发布前请补充 `package.json#heybox.desc`,描述已实现的主要功能和适用场景。模板不预填简介,以免占位文案被当作真实介绍发布。
18
+
19
+ 如果小程序服务于特定 PC 游戏,可运行 `npm run hb-sdk -- remote games search "游戏名" --json` 查询平台游戏 appid,核对结果后填写 `package.json#heybox.bindAppIds`(字符串数组)。工具类应主动检查,通用工具可保持为空。关联游戏随版本审核,修改后需重新构建;能否绑定以部署预检为准。
20
+
17
21
  `package.json#heybox.platforms` 默认声明全平台 `android`、`ios`、`ohos`、`windows`、`macos`,请按项目实际完成适配并验收的平台保留,未适配的平台务必删除。`linux` 目前没有客户端基线与 API 兼容声明,暂不建议声明。
18
22
 
19
23
  更多内容见 [CLI 指南](https://docs.xiaoheihe.cn/hb_sdk/guide/cli) 和 [SDK 文档](https://docs.xiaoheihe.cn/hb_sdk/)。
package/dist/vite.cjs.js CHANGED
@@ -15,6 +15,27 @@ var node_zlib = require('node:zlib');
15
15
  var node_async_hooks = require('node:async_hooks');
16
16
 
17
17
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
18
+ /** 根据当前项目声明或实际版本 Manifest 检查资料完整性,不联网、不修改输入。 */
19
+ function getMiniappMetadataWarnings(metadata) {
20
+ const warnings = [];
21
+ if (metadata.desc === undefined || (typeof metadata.desc === 'string' && !metadata.desc.trim())) {
22
+ warnings.push({
23
+ code: 'MINIAPP_DESC_MISSING',
24
+ field: 'desc',
25
+ message: '尚未填写小程序简介。建议在 package.json#heybox.desc 中说明主要功能和适用场景,修改后重新构建。',
26
+ });
27
+ }
28
+ if (metadata.category === 'tool' &&
29
+ (metadata.bindAppIds === undefined || (Array.isArray(metadata.bindAppIds) && metadata.bindAppIds.length === 0))) {
30
+ warnings.push({
31
+ code: 'MINIAPP_TOOL_GAME_BINDING_MISSING',
32
+ field: 'bindAppIds',
33
+ message: '当前小程序为工具类,尚未关联游戏。如服务于特定 PC 游戏,可通过 hb-sdk remote games search "游戏名" 查询 appid 并填写 package.json#heybox.bindAppIds,修改后重新构建;通用工具可保持为空。',
34
+ });
35
+ }
36
+ return warnings;
37
+ }
38
+
18
39
  /**
19
40
  * 所有小程序 iframe bridge envelope 共用的固定 namespace。
20
41
  *
@@ -10120,6 +10141,7 @@ const BASIC_INFO_MAX_PIXELS = 40_000_000;
10120
10141
  * @returns NFKC 规范化、去除首尾 Unicode White_Space 后的名称;不折叠规范化后的内部空白。
10121
10142
  * @throws `Error` 输入不是字符串,或规范化后不是 1–40 个 Unicode code point、不含文字或数字,或包含控制字符、
10122
10143
  * 格式字符、行/段分隔符以及 HTML 特殊字符 `<`、`>`、`&`、双引号或单引号时抛出。
10144
+ * @since 0.8.2
10123
10145
  */
10124
10146
  function normalizeBasicInfoName(raw) {
10125
10147
  if (typeof raw !== 'string')
@@ -10151,6 +10173,7 @@ function validateBasicInfoPath(raw) {
10151
10173
  * @remarks
10152
10174
  * 图片路径必须使用 `/` 分隔的非空相对路径,扩展名为 JPEG、PNG、GIF 或 WebP;拒绝 URL、点段、
10153
10175
  * 控制字符和构建/缓存等保留目录。此函数只校验声明,不读取文件,也不验证图片字节、尺寸或存在性。
10176
+ * @since 0.8.2
10154
10177
  */
10155
10178
  function parseMiniappBasicInfo(value, sdkVersion = '0.8.2') {
10156
10179
  sdkVersion = sdkVersion.trim();
@@ -10281,7 +10304,7 @@ async function ensureBasicInfoDirectory(rootPath, relative) {
10281
10304
  /** 构建时替换为当前发布包的实际版本。 */
10282
10305
  const HB_SDK_VERSION = typeof undefined === 'string'
10283
10306
  ? undefined
10284
- : '0.9.2-alpha.7';
10307
+ : '0.9.2-alpha.9';
10285
10308
 
10286
10309
  /**
10287
10310
  * iframe 与调试台页面的开发期 console 捕获转发。
@@ -10654,6 +10677,7 @@ const MINIAPP_BIND_APP_IDS_MAX_COUNT = 20;
10654
10677
  * @see [miniappManifest](/reference/symbols/vite/functions/miniappManifest)
10655
10678
  * @see [navigation.openAppPage](/reference/sdk/navigation/openAppPage)
10656
10679
  * @see [CLI 与远端发布](/guide/cli#生产构建)
10680
+ * @since 0.8.1
10657
10681
  */
10658
10682
  function parseMiniappBindAppIds(value, options = {}) {
10659
10683
  const sourceLabel = options.sourceLabel ?? 'package.json#heybox.bindAppIds';
@@ -10690,6 +10714,7 @@ function parseMiniappBindAppIds(value, options = {}) {
10690
10714
  * @param sourceLabel - 错误消息中的字段来源,默认 `package.json#heybox.category`。
10691
10715
  * @returns 合法类别原值;输入 `undefined` 时返回 `undefined`,由发布流程另行检查是否必填。
10692
10716
  * @throws `Error` 输入为其他值(包括 null 或空字符串)时抛出带字段来源的错误。
10717
+ * @since 0.8.3
10693
10718
  */
10694
10719
  function parseMiniappCategory(value, sourceLabel = 'package.json#heybox.category') {
10695
10720
  if (value === undefined)
@@ -20637,6 +20662,7 @@ const devSnapshotStores = devSnapshotRegistry[devSnapshotStoreKey];
20637
20662
  * @see [权限声明](/guide/permissions) `heybox.permissions` 严格 schema 与迁移规则。
20638
20663
  * @see [窗口尺寸与可缩放性](/guide/window-size) `heybox.window` 字段与 Host 消费语义。
20639
20664
  * @see [受管桌面程序](/guide/companion) Companion 声明、归档和本地联调边界。
20665
+ * @since 0.3.1
20640
20666
  */
20641
20667
  function miniappManifest() {
20642
20668
  const includeCompanions = process.env.HB_SDK_SKIP_COMPANIONS !== '1';
@@ -20650,6 +20676,7 @@ function miniappManifest() {
20650
20676
  let hmrWebSocketUrl;
20651
20677
  let configuredDeviceLogUploadUrls = [];
20652
20678
  let devServer;
20679
+ let metadataWarningsShown = false;
20653
20680
  /** 构建链路中更早的失败原因;closeBundle 不得再用产物校验覆盖它。 */
20654
20681
  let priorBuildError;
20655
20682
  return {
@@ -20685,7 +20712,7 @@ function miniappManifest() {
20685
20712
  devServer = server;
20686
20713
  // 开发期只对「仍是旧模板移动端默认」的声明做非阻断提示。声明缺失或非法一律交由
20687
20714
  // build / remote deploy 链路拒绝,因此这里只容忍读取阶段的异常,保持 hb-sdk dev
20688
- // 既有的启动语义;warn 调用留在 try 之外,避免把插件上下文错误一起吞掉。
20715
+ // 既有的启动语义;日志调用使用服务配置中的 logger,兼容没有插件上下文的 Vite 版本。
20689
20716
  let legacyMobileTemplate = false;
20690
20717
  try {
20691
20718
  legacyMobileTemplate = isLegacyMobileTemplatePlatforms(readMiniappPlatformsFromPackageJson(root));
@@ -20694,7 +20721,22 @@ function miniappManifest() {
20694
20721
  /* package.json#heybox.platforms 缺失或非法时不提示。 */
20695
20722
  }
20696
20723
  if (legacyMobileTemplate)
20697
- this.warn(getLegacyMobileTemplatePlatformsNotice());
20724
+ server.config.logger.warn(getLegacyMobileTemplatePlatformsNotice());
20725
+ if (!metadataWarningsShown) {
20726
+ // 开发期读取失败不改变启动行为;非法声明仍由构建与提审校验。
20727
+ let warnings = [];
20728
+ try {
20729
+ warnings = getMiniappMetadataWarnings({
20730
+ desc: readMiniappDescFromPackageJson(root),
20731
+ category: readMiniappCategoryFromPackageJson(root),
20732
+ bindAppIds: readMiniappBindAppIdsFromPackageJson(root),
20733
+ });
20734
+ }
20735
+ catch { /* 读取失败不推断为缺失。 */ }
20736
+ for (const warning of warnings)
20737
+ server.config.logger.warn(`[${warning.code}] ${warning.message}`);
20738
+ metadataWarningsShown = true;
20739
+ }
20698
20740
  let unregisterLogs;
20699
20741
  const registerLogs = () => {
20700
20742
  const address = server.httpServer?.address();
@@ -21068,6 +21110,12 @@ function miniappManifest() {
21068
21110
  if (workspaceCards && 'runtimeVersion' in workspaceCards && Buffer.byteLength(manifestText, 'utf8') > WORKSPACE_CARDS_V2_MANIFEST_MAX_BYTES)
21069
21111
  throw new Error('小程序 Manifest 超过 256 KiB');
21070
21112
  node_fs.writeFileSync(manifestPath, manifestText);
21113
+ // deploy 子进程将提示交给父进程按最终提交 Manifest 输出,避免重复并保留自定义构建兜底。
21114
+ if (process.env.HB_SDK_DEFER_METADATA_WARNINGS !== '1') {
21115
+ for (const warning of getMiniappMetadataWarnings({ desc, category, bindAppIds })) {
21116
+ this.warn(`[${warning.code}] ${warning.message}`);
21117
+ }
21118
+ }
21071
21119
  },
21072
21120
  };
21073
21121
  }