
























@@ -61,27 +61,6 @@ describe("bundled plugin postinstall", () => {
6161).toBe(true);
6262});
636364-it("does not install bundled plugin package deps outside of source checkouts by default", async () => {
65-const extensionsDir = await createExtensionsDir();
66-const packageRoot = path.dirname(path.dirname(extensionsDir));
67-await writePluginPackage(extensionsDir, "acpx", {
68-dependencies: {
69-acpx: "0.4.1",
70-},
71-});
72-const spawnSync = vi.fn();
73-74-runBundledPluginPostinstall({
75-env: { HOME: "/tmp/home" },
76- extensionsDir,
77- packageRoot,
78- spawnSync,
79-log: { log: vi.fn(), warn: vi.fn() },
80-});
81-82-expect(spawnSync).not.toHaveBeenCalled();
83-});
84-8564it("prunes Node versioned compile cache dirs during package postinstall", () => {
8665const configuredBase = path.join("/tmp", "openclaw-cache");
8766const defaultBase = path.join(tmpdir(), "node-compile-cache");
@@ -173,19 +152,15 @@ describe("bundled plugin postinstall", () => {
173152path.join(extensionsDir, "acpx", "node_modules", "acpx", "package.json"),
174153JSON.stringify({ name: "acpx", version: "0.4.1" }),
175154);
176-const spawnSync = vi.fn();
177-178155runBundledPluginPostinstall({
179156env: { HOME: "/tmp/home" },
180157 packageRoot,
181- spawnSync,
182158log: { log: vi.fn(), warn: vi.fn() },
183159});
184160185161await expect(fs.stat(path.join(extensionsDir, "acpx", "node_modules"))).rejects.toMatchObject({
186162code: "ENOENT",
187163});
188-expect(spawnSync).not.toHaveBeenCalled();
189164});
190165191166it("keeps source-checkout prune non-fatal", async () => {
@@ -419,7 +394,6 @@ describe("bundled plugin postinstall", () => {
419394420395runBundledPluginPostinstall({
421396 packageRoot,
422-spawnSync: vi.fn(),
423397log: { log: vi.fn(), warn: vi.fn() },
424398});
425399@@ -529,11 +503,20 @@ describe("bundled plugin postinstall", () => {
529503).toThrow("unsafe dist entry: dist/escape");
530504});
531505532-it("ignores staged bundled plugin node_modules when pruning packaged dist", async () => {
506+it("prunes stale bundled plugin dependency debris from packaged dist", async () => {
533507const packageRoot = await createTempDirAsync("openclaw-packaged-install-dist-prune-");
534508const staleFile = path.join(packageRoot, "dist", "stale-runtime.js");
535509const packageJson = path.join(packageRoot, "dist", "extensions", "slack", "package.json");
536510const binDir = path.join(packageRoot, "dist", "extensions", "slack", "node_modules", ".bin");
511+const dependencyFile = path.join(
512+packageRoot,
513+"dist",
514+"extensions",
515+"slack",
516+"node_modules",
517+"typebox",
518+"package.json",
519+);
537520const installStageFile = path.join(
538521packageRoot,
539522"dist",
@@ -561,10 +544,12 @@ describe("bundled plugin postinstall", () => {
561544await fs.mkdir(path.dirname(staleFile), { recursive: true });
562545await fs.mkdir(path.dirname(packageJson), { recursive: true });
563546await fs.mkdir(binDir, { recursive: true });
547+await fs.mkdir(path.dirname(dependencyFile), { recursive: true });
564548await fs.mkdir(path.dirname(installStageFile), { recursive: true });
565549await fs.mkdir(path.dirname(retryInstallStageFile), { recursive: true });
566550await fs.writeFile(staleFile, "export {};\n");
567551await fs.writeFile(packageJson, "{}\n");
552+await fs.writeFile(dependencyFile, "{}\n");
568553await fs.writeFile(installStageFile, "export {};\n");
569554await fs.writeFile(retryInstallStageFile, "export {};\n");
570555await fs.symlink("../fxparser/bin.js", path.join(binDir, "fxparser"));
@@ -576,8 +561,15 @@ describe("bundled plugin postinstall", () => {
576561log: { log: vi.fn(), warn: vi.fn() },
577562}),
578563).toEqual(["dist/stale-runtime.js"]);
579-await expect(fs.stat(installStageFile)).resolves.toBeDefined();
580-await expect(fs.stat(retryInstallStageFile)).resolves.toBeDefined();
564+await expect(
565+fs.stat(path.join(packageRoot, "dist", "extensions", "slack", "node_modules")),
566+).rejects.toMatchObject({ code: "ENOENT" });
567+await expect(fs.stat(path.dirname(installStageFile))).rejects.toMatchObject({
568+code: "ENOENT",
569+});
570+await expect(fs.stat(path.dirname(retryInstallStageFile))).rejects.toMatchObject({
571+code: "ENOENT",
572+});
581573});
582574583575it("unlinks stale files instead of recursive pruning them", () => {
@@ -614,32 +606,6 @@ describe("bundled plugin postinstall", () => {
614606expect(unlinkSync).toHaveBeenCalledWith("/pkg/dist/stale.js");
615607});
616608617-it("skips reinstall when the bundled sentinel package already exists", async () => {
618-const extensionsDir = await createExtensionsDir();
619-const packageRoot = path.dirname(path.dirname(extensionsDir));
620-await writePluginPackage(extensionsDir, "acpx", {
621-dependencies: {
622-acpx: "0.4.1",
623-},
624-});
625-await fs.mkdir(path.join(packageRoot, "node_modules", "acpx"), { recursive: true });
626-await fs.writeFile(
627-path.join(packageRoot, "node_modules", "acpx", "package.json"),
628-"{}\n",
629-"utf8",
630-);
631-const spawnSync = vi.fn();
632-633-runBundledPluginPostinstall({
634-env: { npm_config_global: "true" },
635- extensionsDir,
636- packageRoot,
637- spawnSync,
638-});
639-640-expect(spawnSync).not.toHaveBeenCalled();
641-});
642-643609it("prunes only bundled plugin package node_modules in source checkouts", async () => {
644610const packageRoot = await createTempDirAsync("openclaw-source-prune-");
645611const extensionsDir = path.join(packageRoot, "extensions");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。