来自 descriptor、capability payload 或其他不可信 wire 边界的候选目录引用。
值满足 MiniProgramDirectoryRef 任一分支的最低结构时返回 true,并将 TypeScript 类型
收窄为 direct/derived 目录引用联合;否则返回 false。
两个分支都要求 kind === 'directory',并对通常的对象字面量使用互斥的 canonical key 集合:
{ kind: 'directory', handleId }。handleId 必须是非空字符串;不能同时携带 root 或
relativePath。{ kind: 'directory', root, relativePath }。不能携带 handleId;root 必须通过
isMiniProgramPathRootRef,即精确的 { kind: 'sandbox' },或带非空 handleId 的 direct
directory root。file ref 与再次嵌套的 derived directory ref 都不能作为 root。Derived ref 的 relativePath 可以是 '.',表示 root 目录自身;这是目录引用专属规则,普通
isMiniProgramRelativePath 和 file ref 都不接受 '.'。其他相对路径必须非空,不以 / 开头或结尾,
不含空段、. / .. 点段、反斜杠、U+0000-U+001F 控制字符或 U+007F。该校验不会 URL decode、
Unicode normalize、解析平台分隔符、限制长度,或判断路径指向的目录是否存在。
direct 与 derived 分支都会拒绝 canonical 集合之外的可枚举自有字符串键,包括值为 undefined 的额外键。
检查基于 Object.keys(),因此非枚举属性、symbol 键和继承属性不会被列入;必需属性本身也不要求是自有
或可枚举属性。返回对象不会被复制、冻结或规范化。
返回 true 只证明当前结构可按 wire 类型读取,不证明 direct handleId 或 root handle 由当前 Runtime 签发、
属于当前 session/origin、仍然有效且确为目录,也不证明目标存在、filesystem 权限已启用、访问模式允许
当前操作或 Host 支持对应 capability。Runtime 在实际解析 ref 时仍须查询 handle registry、执行权限与
provenance 校验,并解析 derived path。
import { isMiniProgramDirectoryRef } from '@heybox/hb-sdk/protocol';
const candidate: unknown = {
kind: 'directory',
root: { kind: 'directory', handleId: 'directory_1' },
relativePath: 'screenshots/2026',
};
if (isMiniProgramDirectoryRef(candidate)) {
if ('handleId' in candidate) {
console.log('direct', candidate.handleId);
} else {
console.log('derived', candidate.root, candidate.relativePath);
}
}
isMiniProgramDirectoryRef({ kind: 'directory', root: { kind: 'sandbox' }, relativePath: '.' }); // true
isMiniProgramDirectoryRef({ kind: 'directory', handleId: 'd1', relativePath: '.' }); // false:分支键混用
'.' 相对路径规则。'.' 的文件引用 guard。
判断未知值是否为 direct handle 或 path-derived 目录引用。