mirror of
https://github.com/oven-sh/bun
synced 2026-02-12 11:59:00 +00:00
More bun install hoisting tests (#8112)
* hoisting tests * more comments on hoistDependency * fix test
This commit is contained in:
@@ -526,9 +526,9 @@ pub const Tree = struct {
|
||||
}
|
||||
|
||||
// This function does one of three things:
|
||||
// - de-duplicate (skip) the package
|
||||
// - move the package to the top directory
|
||||
// - leave the package at the same (relative) directory
|
||||
// 1 (return hoisted) - de-duplicate (skip) the package
|
||||
// 2 (return id) - move the package to the top directory
|
||||
// 3 (return dependency_loop) - leave the package at the same (relative) directory
|
||||
fn hoistDependency(
|
||||
this: *Tree,
|
||||
comptime as_defined: bool,
|
||||
@@ -556,9 +556,9 @@ pub const Tree = struct {
|
||||
return error.DependencyLoop;
|
||||
}
|
||||
// ignore versioning conflicts caused by peer dependencies
|
||||
return dependency_loop;
|
||||
return dependency_loop; // 3
|
||||
}
|
||||
return hoisted;
|
||||
return hoisted; // 1
|
||||
}
|
||||
|
||||
if (this.parent < error_id) {
|
||||
@@ -571,10 +571,10 @@ pub const Tree = struct {
|
||||
trees,
|
||||
builder,
|
||||
) catch unreachable;
|
||||
if (!as_defined or id != dependency_loop) return id;
|
||||
if (!as_defined or id != dependency_loop) return id; // 1 or 2
|
||||
}
|
||||
|
||||
return this.id;
|
||||
return this.id; // 2
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -930,6 +930,202 @@ describe("hoisting", async () => {
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
test("hoisting/using incorrect peer dep after install", async () => {
|
||||
await writeFile(
|
||||
join(packageDir, "package.json"),
|
||||
JSON.stringify({
|
||||
name: "foo",
|
||||
dependencies: {
|
||||
"peer-deps-fixed": "1.0.0",
|
||||
"no-deps": "1.0.0",
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
var { stdout, stderr, exited } = spawn({
|
||||
cmd: [bunExe(), "install"],
|
||||
cwd: packageDir,
|
||||
stdout: "pipe",
|
||||
stdin: "pipe",
|
||||
stderr: "pipe",
|
||||
env,
|
||||
});
|
||||
|
||||
var err = await new Response(stderr).text();
|
||||
var out = await new Response(stdout).text();
|
||||
expect(err).toContain("Saved lockfile");
|
||||
expect(err).not.toContain("not found");
|
||||
expect(err).not.toContain("error:");
|
||||
expect(err).not.toContain("incorrect peer dependency");
|
||||
|
||||
expect(out.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([
|
||||
"",
|
||||
" + no-deps@1.0.0",
|
||||
" + peer-deps-fixed@1.0.0",
|
||||
"",
|
||||
" 2 packages installed",
|
||||
]);
|
||||
|
||||
expect(await exited).toBe(0);
|
||||
expect(await file(join(packageDir, "node_modules", "no-deps", "package.json")).json()).toEqual({
|
||||
name: "no-deps",
|
||||
version: "1.0.0",
|
||||
} as any);
|
||||
expect(await file(join(packageDir, "node_modules", "peer-deps-fixed", "package.json")).json()).toEqual({
|
||||
name: "peer-deps-fixed",
|
||||
version: "1.0.0",
|
||||
peerDependencies: {
|
||||
"no-deps": "^1.0.0",
|
||||
},
|
||||
} as any);
|
||||
expect(await exists(join(packageDir, "node_modules", "peer-deps-fixed", "node_modules"))).toBeFalse();
|
||||
|
||||
await writeFile(
|
||||
join(packageDir, "package.json"),
|
||||
JSON.stringify({
|
||||
name: "foo",
|
||||
dependencies: {
|
||||
"peer-deps-fixed": "1.0.0",
|
||||
"no-deps": "2.0.0",
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
({ stdout, stderr, exited } = spawn({
|
||||
cmd: [bunExe(), "install"],
|
||||
cwd: packageDir,
|
||||
stdout: "pipe",
|
||||
stdin: "pipe",
|
||||
stderr: "pipe",
|
||||
env,
|
||||
}));
|
||||
|
||||
err = await new Response(stderr).text();
|
||||
out = await new Response(stdout).text();
|
||||
expect(err).toContain("Saved lockfile");
|
||||
expect(err).not.toContain("not found");
|
||||
expect(err).not.toContain("error:");
|
||||
|
||||
expect(out.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([
|
||||
"",
|
||||
" + no-deps@2.0.0",
|
||||
"",
|
||||
" 1 package installed",
|
||||
]);
|
||||
|
||||
expect(await exited).toBe(0);
|
||||
expect(await file(join(packageDir, "node_modules", "no-deps", "package.json")).json()).toEqual({
|
||||
name: "no-deps",
|
||||
version: "2.0.0",
|
||||
} as any);
|
||||
expect(await file(join(packageDir, "node_modules", "peer-deps-fixed", "package.json")).json()).toEqual({
|
||||
name: "peer-deps-fixed",
|
||||
version: "1.0.0",
|
||||
peerDependencies: {
|
||||
"no-deps": "^1.0.0",
|
||||
},
|
||||
} as any);
|
||||
expect(await exists(join(packageDir, "node_modules", "peer-deps-fixed", "node_modules"))).toBeFalse();
|
||||
});
|
||||
|
||||
test("hoisting/using incorrect peer dep on initial install", async () => {
|
||||
await writeFile(
|
||||
join(packageDir, "package.json"),
|
||||
JSON.stringify({
|
||||
name: "foo",
|
||||
dependencies: {
|
||||
"peer-deps-fixed": "1.0.0",
|
||||
"no-deps": "2.0.0",
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
var { stdout, stderr, exited } = spawn({
|
||||
cmd: [bunExe(), "install"],
|
||||
cwd: packageDir,
|
||||
stdout: "pipe",
|
||||
stdin: "pipe",
|
||||
stderr: "pipe",
|
||||
env,
|
||||
});
|
||||
|
||||
var err = await new Response(stderr).text();
|
||||
var out = await new Response(stdout).text();
|
||||
expect(err).toContain("Saved lockfile");
|
||||
expect(err).not.toContain("not found");
|
||||
expect(err).not.toContain("error:");
|
||||
expect(err).toContain("incorrect peer dependency");
|
||||
|
||||
expect(out.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([
|
||||
"",
|
||||
" + no-deps@2.0.0",
|
||||
" + peer-deps-fixed@1.0.0",
|
||||
"",
|
||||
" 2 packages installed",
|
||||
]);
|
||||
|
||||
expect(await exited).toBe(0);
|
||||
expect(await file(join(packageDir, "node_modules", "no-deps", "package.json")).json()).toEqual({
|
||||
name: "no-deps",
|
||||
version: "2.0.0",
|
||||
} as any);
|
||||
expect(await file(join(packageDir, "node_modules", "peer-deps-fixed", "package.json")).json()).toEqual({
|
||||
name: "peer-deps-fixed",
|
||||
version: "1.0.0",
|
||||
peerDependencies: {
|
||||
"no-deps": "^1.0.0",
|
||||
},
|
||||
} as any);
|
||||
expect(await exists(join(packageDir, "node_modules", "peer-deps-fixed", "node_modules"))).toBeFalse();
|
||||
|
||||
await writeFile(
|
||||
join(packageDir, "package.json"),
|
||||
JSON.stringify({
|
||||
name: "foo",
|
||||
dependencies: {
|
||||
"peer-deps-fixed": "1.0.0",
|
||||
"no-deps": "1.0.0",
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
({ stdout, stderr, exited } = spawn({
|
||||
cmd: [bunExe(), "install"],
|
||||
cwd: packageDir,
|
||||
stdout: "pipe",
|
||||
stdin: "pipe",
|
||||
stderr: "pipe",
|
||||
env,
|
||||
}));
|
||||
|
||||
err = await new Response(stderr).text();
|
||||
out = await new Response(stdout).text();
|
||||
expect(err).toContain("Saved lockfile");
|
||||
expect(err).not.toContain("not found");
|
||||
expect(err).not.toContain("error:");
|
||||
|
||||
expect(out.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([
|
||||
"",
|
||||
" + no-deps@1.0.0",
|
||||
"",
|
||||
" 1 package installed",
|
||||
]);
|
||||
|
||||
expect(await exited).toBe(0);
|
||||
expect(await file(join(packageDir, "node_modules", "no-deps", "package.json")).json()).toEqual({
|
||||
name: "no-deps",
|
||||
version: "1.0.0",
|
||||
} as any);
|
||||
expect(await file(join(packageDir, "node_modules", "peer-deps-fixed", "package.json")).json()).toEqual({
|
||||
name: "peer-deps-fixed",
|
||||
version: "1.0.0",
|
||||
peerDependencies: {
|
||||
"no-deps": "^1.0.0",
|
||||
},
|
||||
} as any);
|
||||
expect(await exists(join(packageDir, "node_modules", "peer-deps-fixed", "node_modules"))).toBeFalse();
|
||||
});
|
||||
});
|
||||
|
||||
describe("workspaces", async () => {
|
||||
|
||||
Reference in New Issue
Block a user