来自 Host、bridge response、目录列表或其他不可信边界的候选 descriptor。
顶层字段及嵌套目录引用都满足协议最低结构时返回 true,并将 TypeScript 类型收窄为
MiniProgramDirectoryDescriptor;否则返回 false。
guard 会读取并校验以下四个属性;对通常的对象字面量,它们也是唯一允许的可枚举自有字符串字段:
kind:固定为 'directory'。name:非空字符串。该 guard 不检查空白、.、..、斜杠、反斜杠、控制字符或平台文件名规则;
SDK 将 descriptor 转为 DirectoryHandle 时还会执行更严格的名称校验。mode:只能是 'read' 或 'readwrite';这里只识别声明值,不证明 Host 实际授予了对应访问模式。ref:必须通过 isMiniProgramDirectoryRef。ref 可以是 { kind: 'directory', handleId } 形式的直接引用,其中 handleId 只要求为非空字符串;
也可以是 { kind: 'directory', root, relativePath } 形式的派生引用。派生引用的 root 只能是精确的
sandbox root,或带非空 handleId 的直接目录 root;relativePath 可用 '.' 表示 root 自身,其他值
必须是非空、非绝对、无尾随 /、无空段/点段/父目录段、反斜杠或控制字符的规范相对路径。
顶层 descriptor、ref 与 root 的额外可枚举自有字符串键都会导致失败;但非枚举属性、symbol 键和
继承属性不在 Object.keys() 检查范围内,必需属性本身也不要求是自有或可枚举属性。该函数不会复制、
冻结或规范化对象,也不会验证 handleId 是否由当前 Runtime 签发、是否属于当前 session/origin、目标目录
是否存在、name 是否与真实目录一致,或 Manifest/Runtime 权限、Host 支持及当前操作是否允许。
返回 true 只建立结构类型收窄,不建立信任边界。
isMiniProgramFileSystemEntityDescriptor 使用本 guard 与文件 descriptor guard 共同识别目录列表项。
files.pickDirectory() 成功结果还要求 direct ref,而 sandbox/path 派生的目录可由 DirectoryHandle
的路径 API 产生;这些来源和能力差异不能仅凭本 guard 判定。
import { isMiniProgramDirectoryDescriptor } from '@heybox/hb-sdk/protocol';
const candidate = {
kind: 'directory',
name: 'screenshots',
mode: 'readwrite',
ref: {
kind: 'directory',
root: { kind: 'sandbox' },
relativePath: 'exports/screenshots',
},
};
const untrusted: unknown = candidate;
if (isMiniProgramDirectoryDescriptor(untrusted)) {
// 这里只能安全读取已收窄的 wire 字段;实际操作仍交给 files API/Runtime。
console.log(untrusted.name, untrusted.ref);
}
isMiniProgramDirectoryDescriptor({ ...candidate, size: 0 }); // false:顶层存在额外键
files 公开能力入口。
判断未知值是否具有目录 descriptor 的精确 wire 结构。