

























@@ -16,6 +16,8 @@ import {
1616listPluginSdkAliasCandidates,
1717listPluginSdkExportedSubpaths,
1818normalizeJitiAliasTargetPath,
19+resolvePluginLoaderJitiFsCacheDir,
20+resolvePluginLoaderJitiFsCacheOption,
1921resolvePluginLoaderModuleConfig,
2022resolvePluginLoaderTryNative,
2123resolveExtensionApiAlias,
@@ -49,6 +51,27 @@ function makeTempDir() {
4951return dir;
5052}
515354+function createTrustedOpenClawPackageFixture(version: string) {
55+const root = makeTempDir();
56+fs.writeFileSync(path.join(root, "openclaw.mjs"), "export {};\n", "utf-8");
57+fs.writeFileSync(
58+path.join(root, "package.json"),
59+JSON.stringify(
60+{
61+name: "openclaw",
62+ version,
63+bin: { openclaw: "openclaw.mjs" },
64+exports: { "./plugin-sdk": { default: "./dist/plugin-sdk/index.js" } },
65+},
66+null,
67+2,
68+),
69+"utf-8",
70+);
71+mkdirSafeDir(path.join(root, "dist", "plugins"));
72+return root;
73+}
74+5275function withCwd<T>(cwd: string, run: () => T): T {
5376const cwdSpy = vi.spyOn(process, "cwd").mockReturnValue(cwd);
5477try {
@@ -2091,6 +2114,80 @@ describe("buildPluginLoaderAliasMap memoization", () => {
20912114});
2092211520932116describe("buildPluginLoaderJitiOptions", () => {
2117+it("scopes jiti fs cache by OpenClaw package version and install metadata", () => {
2118+const root = createTrustedOpenClawPackageFixture("1.2.3-beta.4");
2119+const tmpDir = path.join(root, "tmp");
2120+2121+const fsCache = withEnv({ TMPDIR: tmpDir }, () =>
2122+resolvePluginLoaderJitiFsCacheDir({
2123+modulePath: path.join(root, "dist", "plugins", "loader.js"),
2124+}),
2125+);
2126+2127+expect(fsCache).toContain(path.join(tmpDir, "jiti", "openclaw", "1.2.3-beta.4") + path.sep);
2128+expect(path.basename(fsCache)).toMatch(/^\d+-\d+$/u);
2129+});
2130+2131+it("preserves jiti's tmpdir guard when TMPDIR resolves to cwd", () => {
2132+const root = createTrustedOpenClawPackageFixture("1.2.3-beta.4");
2133+2134+const guardedFsCache = withEnv({ TMPDIR: root, JITI_RESPECT_TMPDIR_ENV: undefined }, () =>
2135+withCwd(root, () =>
2136+resolvePluginLoaderJitiFsCacheDir({
2137+modulePath: path.join(root, "dist", "plugins", "loader.js"),
2138+}),
2139+),
2140+);
2141+const respectedFsCache = withEnv({ TMPDIR: root, JITI_RESPECT_TMPDIR_ENV: "1" }, () =>
2142+withCwd(root, () =>
2143+resolvePluginLoaderJitiFsCacheDir({
2144+modulePath: path.join(root, "dist", "plugins", "loader.js"),
2145+}),
2146+),
2147+);
2148+2149+expect(guardedFsCache).toContain(
2150+path.join("jiti", "openclaw", "1.2.3-beta.4") + path.sep,
2151+);
2152+expect(guardedFsCache.startsWith(path.join(root, "jiti") + path.sep)).toBe(false);
2153+expect(respectedFsCache).toContain(
2154+path.join(root, "jiti", "openclaw", "1.2.3-beta.4") + path.sep,
2155+);
2156+});
2157+2158+it("adds the versioned fs cache directory to plugin loader jiti options", () => {
2159+const root = createTrustedOpenClawPackageFixture("2.0.0");
2160+const tmpDir = path.join(root, "tmp");
2161+2162+const options = withEnv({ TMPDIR: tmpDir }, () =>
2163+buildPluginLoaderJitiOptions(
2164+{ "openclaw/plugin-sdk": path.join(root, "dist", "plugin-sdk", "root-alias.cjs") },
2165+{ modulePath: path.join(root, "dist", "plugins", "loader.js") },
2166+),
2167+);
2168+2169+expect(options.fsCache).toContain(path.join(tmpDir, "jiti", "openclaw", "2.0.0"));
2170+});
2171+2172+it("preserves jiti's fs cache environment opt-out", () => {
2173+const root = createTrustedOpenClawPackageFixture("2.0.0");
2174+2175+const explicitOptOut = withEnv({ JITI_FS_CACHE: "false" }, () =>
2176+resolvePluginLoaderJitiFsCacheOption({
2177+modulePath: path.join(root, "dist", "plugins", "loader.js"),
2178+}),
2179+);
2180+const legacyOptOut = withEnv({ JITI_CACHE: "false", JITI_FS_CACHE: undefined }, () =>
2181+buildPluginLoaderJitiOptions(
2182+{ "openclaw/plugin-sdk": path.join(root, "dist", "plugin-sdk", "root-alias.cjs") },
2183+{ modulePath: path.join(root, "dist", "plugins", "loader.js") },
2184+),
2185+);
2186+2187+expect(explicitOptOut).toBe(false);
2188+expect(legacyOptOut.fsCache).toBe(false);
2189+});
2190+20942191it("pre-normalizes and marks alias maps for source transforms", () => {
20952192const marker = Symbol.for("pathe:normalizedAlias");
20962193const aliasMap = {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。