import { Buffer } from "node:buffer" ;
import crypto from "node:crypto" ;
import { build, type Plugin } from "esbuild" ;
import { describe, expect, it } from "vitest" ;
describe("tmp-openclaw-dir browser-safe import" , () => {
it("loads when a browser fs shim omits constants" , async () => {
const resultKey = `__openclawTmpDirBrowserImport_${crypto.randomUUID().replaceAll("-" , "_" )}`;
const nodeShimPlugin: Plugin = {
name: "node-browser-shims" ,
setup(pluginBuild) {
pluginBuild.onResolve({ filter: /^node:(fs|os|path)$/ }, (args) => ({
path: args.path,
namespace: "node-browser-shim" ,
}));
pluginBuild.onLoad({ filter: /^node:fs$/, namespace: "node-browser-shim" }, () => ({
contents: "export default { constants: undefined };" ,
loader: "js" ,
}));
pluginBuild.onLoad({ filter: /^node:os$/, namespace: "node-browser-shim" }, () => ({
contents: 'export const tmpdir = () => "/tmp";' ,
loader: "js" ,
}));
pluginBuild.onLoad({ filter: /^node:path$/, namespace: "node-browser-shim" }, () => ({
contents: "export default { join: (...parts) => parts.join('/') };" ,
loader: "js" ,
}));
},
};
const bundled = await build({
bundle: true ,
format: "esm" ,
platform: "browser" ,
plugins: [nodeShimPlugin],
stdin: {
contents: `
import { POSIX_OPENCLAW_TMP_DIR, resolvePreferredOpenClawTmpDir } from "./src/infra/tmp-openclaw-dir.ts" ;
globalThis.${resultKey} = {
posixTmpDir: POSIX_OPENCLAW_TMP_DIR,
resolverType: typeof resolvePreferredOpenClawTmpDir,
};
`,
loader: "ts" ,
resolveDir: process.cwd(),
sourcefile: "tmp-openclaw-dir-browser-entry.ts" ,
},
write: false ,
});
const bundledSource = bundled.outputFiles[0 ]?.text;
expect(bundledSource).toBeTruthy();
await import (
`data:text/javascript;base64,${Buffer.from(bundledSource ?? "" ).toString("base64" )}`
);
try {
expect((globalThis as Record<string, unknown>)[resultKey]).toEqual({
posixTmpDir: "/tmp/openclaw" ,
resolverType: "function" ,
});
} finally {
delete (globalThis as Record<string, unknown>)[resultKey];
}
});
});
Messung V0.5 in Prozent C=93 H=93 G=92
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-06)
¤
*© Formatika GbR, Deutschland