




























@@ -444,7 +444,7 @@ describe("installPluginFromNpmSpec e2e", () => {
444444).resolves.toBeTruthy();
445445});
446446447-it("scans repaired pre-existing peer dependencies during later installs", async () => {
447+it("repairs pre-existing peer dependencies during later installs", async () => {
448448const rootDir = await makeTempDir("npm-plugin-repaired-peer-scan-e2e");
449449const npmRoot = path.join(rootDir, "managed-npm");
450450const pluginWithRuntimePeer = `existing-peer-plugin-${crypto.randomUUID().replace(/-/g, "").slice(0, 12)}`;
@@ -531,27 +531,25 @@ describe("installPluginFromNpmSpec e2e", () => {
531531logger: { info: () => {}, warn: () => {} },
532532timeoutMs: 120_000,
533533});
534-expect(later.ok).toBe(false);
535-if (later.ok) {
536-throw new Error("expected repaired peer dependency scan to block installation");
534+if (!later.ok) {
535+throw new Error(later.error);
537536}
538-expect(later.error).toContain("Dynamic code execution detected");
539537540538await expect(
541539fs.lstat(path.join(npmRoot, "node_modules", laterPlugin, "package.json")),
542-).rejects.toHaveProperty("code", "ENOENT");
540+).resolves.toBeTruthy();
543541await expect(
544542fs.lstat(path.join(npmRoot, "node_modules", runtimePeer, "package.json")),
545-).rejects.toHaveProperty("code", "ENOENT");
543+).resolves.toBeTruthy();
546544const rootManifest = JSON.parse(
547545await fs.readFile(path.join(npmRoot, "package.json"), "utf8"),
548546) as {
549547dependencies?: Record<string, string>;
550548openclaw?: { managedPeerDependencies?: string[] };
551549};
552-expect(rootManifest.dependencies?.[laterPlugin]).toBeUndefined();
553-expect(rootManifest.dependencies?.[runtimePeer]).toBeUndefined();
554-expect(rootManifest.openclaw?.managedPeerDependencies ?? []).not.toContain(runtimePeer);
550+expect(rootManifest.dependencies?.[laterPlugin]).toBe("1.0.0");
551+expect(rootManifest.dependencies?.[runtimePeer]).toBe("^1.0.0");
552+expect(rootManifest.openclaw?.managedPeerDependencies ?? []).toContain(runtimePeer);
555553});
556554557555it("bounds peer dependency discovery across repeated nested package realpaths", async () => {
@@ -643,6 +641,7 @@ describe("installPluginFromNpmSpec e2e", () => {
643641latest: "1.0.0",
644642versions: [
645643await packPlugin({
644+indexJs: "eval('1');\n",
646645packageName: blockedPlugin,
647646peerDependencies: { [runtimePeer]: "^1.0.0" },
648647peerDependenciesMeta: {},
@@ -657,7 +656,6 @@ describe("installPluginFromNpmSpec e2e", () => {
657656latest: "1.0.0",
658657versions: [
659658await packPlugin({
660-indexJs: "eval('1');\n",
661659packageName: runtimePeer,
662660pluginId: runtimePeer,
663661version: "1.0.0",
@@ -718,6 +716,7 @@ describe("installPluginFromNpmSpec e2e", () => {
718716latest: "1.0.0",
719717versions: [
720718await packPlugin({
719+indexJs: "eval('1');\n",
721720packageName: blockedPlugin,
722721peerDependencies: {
723722[existingRootDependency]: "^1.0.0",
@@ -735,7 +734,6 @@ describe("installPluginFromNpmSpec e2e", () => {
735734latest: "1.0.0",
736735versions: [
737736await packPlugin({
738-indexJs: "eval('1');\n",
739737packageName: runtimePeer,
740738pluginId: runtimePeer,
741739version: "1.0.0",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。