import { execFileSync } from "node:child_process" ;
import fs from "node:fs" ;
import path from "node:path" ;
import { afterEach, describe, expect, it } from "vitest" ;
import {
cleanupTrackedTempDirs,
makeTrackedTempDir,
mkdirSafeDir,
} from "./test-helpers/fs-fixtures.js" ;
const tempRoots: string[] = [];
function makeTempDir() {
return makeTrackedTempDir("openclaw-plugin-loader" , tempRoots);
}
const mkdirSafe = mkdirSafeDir;
afterEach(() => {
cleanupTrackedTempDirs(tempRoots);
});
describe("plugin loader git path regression" , () => {
it("loads git-style package extension entries when they import plugin-sdk infra-runtime (#49806)" , async () => {
const copiedExtensionRoot = path.join(makeTempDir(), "extensions" , "imessage" );
const copiedSourceDir = path.join(copiedExtensionRoot, "src" );
const copiedPluginSdkDir = path.join(copiedExtensionRoot, "plugin-sdk" );
mkdirSafe(copiedSourceDir);
mkdirSafe(copiedPluginSdkDir);
const jitiBaseFile = path.join(copiedSourceDir, "__jiti-base__.mjs" );
fs.writeFileSync(jitiBaseFile, "export {};\n" , "utf-8" );
fs.writeFileSync(
path.join(copiedSourceDir, "channel.runtime.ts" ),
`import { resolveOutboundSendDep } from "openclaw/plugin-sdk/infra-runtime" ;
import { PAIRING_APPROVED_MESSAGE } from "../runtime-api.js" ;
export const copiedRuntimeMarker = {
resolveOutboundSendDep,
PAIRING_APPROVED_MESSAGE,
};
`,
"utf-8" ,
);
fs.writeFileSync(
path.join(copiedExtensionRoot, "runtime-api.ts" ),
`export const PAIRING_APPROVED_MESSAGE = "paired" ;
`,
"utf-8" ,
);
const copiedChannelRuntimeShim = path.join(copiedPluginSdkDir, "infra-runtime.ts" );
fs.writeFileSync(
copiedChannelRuntimeShim,
`export function resolveOutboundSendDep() {
return "shimmed" ;
}
`,
"utf-8" ,
);
const copiedChannelRuntime = path.join(copiedExtensionRoot, "src" , "channel.runtime.ts" );
const script = `
import { createJiti } from "jiti" ;
const withoutAlias = createJiti(${JSON.stringify(jitiBaseFile)}, {
interopDefault: true ,
tryNative: false ,
extensions: [".ts" , ".tsx" , ".mts" , ".cts" , ".mtsx" , ".ctsx" , ".js" , ".mjs" , ".cjs" , ".json" ],
});
let withoutAliasThrew = false ;
try {
withoutAlias(${JSON.stringify(copiedChannelRuntime)});
} catch {
withoutAliasThrew = true ;
}
const withAlias = createJiti(${JSON.stringify(jitiBaseFile)}, {
interopDefault: true ,
tryNative: false ,
extensions: [".ts" , ".tsx" , ".mts" , ".cts" , ".mtsx" , ".ctsx" , ".js" , ".mjs" , ".cjs" , ".json" ],
alias: {
"openclaw/plugin-sdk/infra-runtime" : ${JSON.stringify(copiedChannelRuntimeShim)},
},
});
const mod = withAlias(${JSON.stringify(copiedChannelRuntime)});
console.log(JSON.stringify({
withoutAliasThrew,
marker: mod.copiedRuntimeMarker?.PAIRING_APPROVED_MESSAGE,
dep: mod.copiedRuntimeMarker?.resolveOutboundSendDep?.(),
}));
`;
const raw = execFileSync(process.execPath, ["--input-type=module" , "--eval" , script], {
cwd: process.cwd(),
encoding: "utf-8" ,
});
const result = JSON.parse(raw) as {
withoutAliasThrew: boolean ;
marker?: string;
dep?: string;
};
expect(result.withoutAliasThrew).toBe(true );
expect(result.marker).toBe("paired" );
expect(result.dep).toBe("shimmed" );
});
});
Messung V0.5 in Prozent C=98 H=89 G=93
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-05)
¤
*© Formatika GbR, Deutschland