产物写入 Manifest 的 hb-sdk 版本,不是小程序自身的发布 version。
undefined、空字符串和纯空白按历史“缺失 sdkVersion”处理;其他字符串会先 trim,再按
canonical strict SemVer 校验并参与 precedence 比较。
待解析的不可信 Manifest。必须是非 null、非数组的对象;函数只读取其
自有 platforms 字段,其他字段不参与平台解析。
冻结的 MiniappPlatformResolution。显式声明返回规范排序后的 declared / effective;历史兼容返回空 declared 与历史兜底平台集合 effective。
manifest 不是对象时抛出;非空 sdkVersion 不完整、含 v 前缀或 build metadata、
不是 canonical SemVer 时抛出;sdkVersion precedence 达到 0.9.0 但缺少 platforms 时抛出;
显式 platforms 不是非空数组、包含未知/非字符串/重复平台时抛出。
解析顺序与后端领域层保持一致:先校验 Manifest 对象,再处理 sdkVersion;只要非空
sdkVersion 非法,即使存在合法 platforms 也会抛出,不会忽略版本。版本比较使用 SemVer
precedence,不做字符串比较:0.9.0-alpha.1 < 0.9.0,而 0.10.0 > 0.9.0。
Manifest 拥有 platforms 字段时总是走 explicit:字段必须是非空数组,每项必须属于
MINIAPP_PLATFORM_VALUES 且不能重复;结果按固定平台词表排序,而不是保留输入顺序。
该规则与 sdkVersion 是否缺失、低于或达到硬切点无关。显式声明一旦非法绝不回退到
legacy 默认值。
Manifest 完全没有 platforms 字段时才判断硬切:sdkVersion 缺失/空白,或 precedence
低于 MINIAPP_PLATFORM_HARD_CUT_SDK_VERSION(0.9.0)时返回
legacy_mobile_default;0.9.0 稳定版及更高版本直接抛错。0.9.0-* prerelease 仍低于
稳定硬切点,因此可解析历史缺失声明。
返回对象被 Object.freeze();显式声明数组和 legacy 的空 declared 数组也被冻结。所有
数组均以 readonly 合同暴露,调用方应直接消费 effective,不得再比较版本或补默认值。
当前 Vite 构建入口
miniappManifest
会从 package.json#heybox.platforms 读取并写入显式声明;legacy 分支只用于解析缺少字段
的历史产物,不是新项目省略 platforms 的许可。
isValidVersion
判断的是小程序发布 version,并额外拒绝模板值 0.0.0;本函数的 sdkVersion 是 hb-sdk
版本,0.0.0 本身是可比较的 strict SemVer 并低于硬切点。两类版本不能互换校验。
import { resolveMiniappManifestPlatforms } from '@heybox/hb-sdk/miniapp-publish'
const explicit = resolveMiniappManifestPlatforms('0.9.0', {
platforms: ['linux', 'android', 'macos'],
})
console.log(explicit)
// {
// declared: ['android', 'macos', 'linux'],
// effective: ['android', 'macos', 'linux'],
// platformsDeclared: true,
// policy: 'explicit'
// }
const legacy = resolveMiniappManifestPlatforms('0.9.0-alpha.1', {})
console.log(legacy.effective) // ['android', 'ios', 'ohos', 'windows', 'macos']
解析 Manifest 平台声明,是
0.9.0硬切规则的唯一实现。