






















@@ -708,6 +708,44 @@ describe("stageBundledPluginRuntimeDeps", () => {
708708);
709709});
710710711+it("replaces legacy OpenClaw-owned symlinked plugin node_modules", () => {
712+const { pluginDir, repoRoot } = createBundledPluginFixture({
713+packageJson: {
714+name: "@openclaw/fixture-plugin",
715+version: "1.0.0",
716+dependencies: { direct: "1.0.0" },
717+openclaw: { bundle: { stageRuntimeDependencies: true } },
718+},
719+});
720+const directDir = path.join(repoRoot, "node_modules", "direct");
721+const legacyNodeModulesDir = path.join(
722+repoRoot,
723+".local",
724+"bundled-plugin-runtime-deps",
725+"fixture-plugin-1234567890abcdef",
726+"node_modules",
727+);
728+const nodeModulesDir = path.join(pluginDir, "node_modules");
729+fs.mkdirSync(directDir, { recursive: true });
730+fs.mkdirSync(legacyNodeModulesDir, { recursive: true });
731+fs.writeFileSync(
732+path.join(directDir, "package.json"),
733+'{ "name": "direct", "version": "1.0.0" }\n',
734+"utf8",
735+);
736+fs.writeFileSync(path.join(directDir, "index.js"), "module.exports = 'direct';\n", "utf8");
737+fs.writeFileSync(path.join(legacyNodeModulesDir, "legacy.js"), "module.exports = 0;\n", "utf8");
738+fs.symlinkSync(legacyNodeModulesDir, nodeModulesDir);
739+740+stageBundledPluginRuntimeDeps({ cwd: repoRoot });
741+742+expect(fs.lstatSync(nodeModulesDir).isSymbolicLink()).toBe(false);
743+expect(fs.readFileSync(path.join(nodeModulesDir, "direct", "index.js"), "utf8")).toBe(
744+"module.exports = 'direct';\n",
745+);
746+expect(fs.existsSync(path.join(legacyNodeModulesDir, "legacy.js"))).toBe(true);
747+});
748+711749it("refuses to write a runtime deps stamp through a symlink", () => {
712750const { repoRoot } = createBundledPluginFixture({
713751packageJson: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。