mirror of
https://github.com/2234839/web-font.git
synced 2026-09-14 21:05:49 +08:00
- 修改 interface.ts: 接受 options.unlink 和 options.rm 作为 FS 适配器的可配置方法 - 修改 llrt.ts: 使用箭头函数 (path) => fs.rm(path) 避免 this 绑定问题 - 修改 app.ts: 通过 __RUNTIME__ 条件编译,仅在 LLRT 运行时引入 llrt.ts - 修改 tsdown.config.ts: format 从字符串数组改为字符串类型,添加 as const - 修改 tsconfig.node.json: 添加 node 类型支持 - 新增 backend/global.d.ts: 声明 __RUNTIME__ 全局变量类型 - 修改 .gitignore: 添加 dist_backend_node 目录 - 修改 build-backend.ts: 支持 Node.js 版本构建输出到 dist_backend_node 修复问题: - LLRT fs/promises 没有 unlink 方法,只有 rm 方法 - CJS 格式不支持 top-level await,改用 IIFE + require - 条件编译避免 Node.js 版本包含不必要的 LLRT 适配代码
84 lines
2.2 KiB
TypeScript
84 lines
2.2 KiB
TypeScript
export let stat: (path: string) => Promise<{
|
||
isFile: () => boolean;
|
||
size: number;
|
||
/** 最后修改时间戳(毫秒),用于文件变更检测 */
|
||
mtimeMs: number;
|
||
}>;
|
||
|
||
export let readFile: (path: string) => Promise<Uint8Array>;
|
||
|
||
export let writeFile: (path: string, data: Uint8Array) => Promise<void>;
|
||
|
||
export let readdir: (path: string) => Promise<{
|
||
isFile: () => boolean;
|
||
name: string;
|
||
}[]>;
|
||
|
||
export let mkdir: (path: string) => Promise<void>;
|
||
|
||
export let unlink: (path: string) => Promise<void>;
|
||
|
||
/** LLRT 专用:保存 rm 函数引用,避免闭包问题 */
|
||
let llrtRm: ((path: string) => Promise<void>) | undefined;
|
||
|
||
export const implInterface = (options: {
|
||
stat: typeof stat;
|
||
readFile: typeof readFile;
|
||
writeFile: typeof writeFile;
|
||
readdir: typeof readdir;
|
||
mkdir: typeof mkdir;
|
||
unlink?: typeof unlink;
|
||
/** LLRT 没有 unlink,提供 rm 作为替代 */
|
||
rm?: (path: string) => Promise<void>;
|
||
}) => {
|
||
stat = options.stat;
|
||
readFile = options.readFile;
|
||
writeFile = options.writeFile;
|
||
readdir = options.readdir;
|
||
mkdir = options.mkdir;
|
||
// 保存 rm 引用到模块级变量
|
||
llrtRm = options.rm;
|
||
/** LLRT 的 fs/promises 没有 unlink,需要用 rm 代替 */
|
||
unlink = async (path) => {
|
||
if (options.unlink) {
|
||
await options.unlink(path);
|
||
} else if (llrtRm) {
|
||
await llrtRm(path);
|
||
}
|
||
};
|
||
};
|
||
|
||
export function path_join(...paths: string[]) {
|
||
const sep = "/";
|
||
|
||
function trimSlashes(p: string) {
|
||
return p.replace(/\/+$/, "").replace(/^\/+/, "");
|
||
}
|
||
|
||
/** 将路径按 / 分割并解析 . 和 .. 段 */
|
||
function normalizeSegments(segments: string[]) {
|
||
const resolved: string[] = [];
|
||
for (const seg of segments) {
|
||
if (seg === "..") {
|
||
resolved.pop();
|
||
} else if (seg !== "." && seg !== "") {
|
||
resolved.push(seg);
|
||
}
|
||
}
|
||
return resolved;
|
||
}
|
||
|
||
const isAbsolute = paths[0] && paths[0].startsWith(sep);
|
||
const segments = paths
|
||
.map((path) => trimSlashes(path))
|
||
.join(sep)
|
||
.split(sep);
|
||
|
||
const resolved = normalizeSegments(segments);
|
||
|
||
if (!resolved.length) return isAbsolute ? sep : ".";
|
||
|
||
const result = resolved.join(sep);
|
||
return isAbsolute ? sep + result : result;
|
||
}
|