aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/install/lockfile.zig13
-rw-r--r--test/cli/install/bun-install.test.ts49
2 files changed, 46 insertions, 16 deletions
diff --git a/src/install/lockfile.zig b/src/install/lockfile.zig
index ce9199ab3..b17691853 100644
--- a/src/install/lockfile.zig
+++ b/src/install/lockfile.zig
@@ -2033,19 +2033,20 @@ pub const Package = extern struct {
cloner.trees_count += @as(u32, @intFromBool(old_resolutions.len > 0));
- for (old_resolutions, 0..) |old_resolution, i| {
- if (old_resolution >= max_package_id) continue;
+ for (old_resolutions, resolutions, 0..) |old_resolution, *resolution, i| {
+ if (old_resolution >= max_package_id) {
+ resolution.* = invalid_package_id;
+ continue;
+ }
const mapped = package_id_mapping[old_resolution];
- const resolve_id = new_package.resolutions.off + @intCast(PackageID, i);
-
if (mapped < max_package_id) {
- resolutions[i] = mapped;
+ resolution.* = mapped;
} else {
try cloner.clone_queue.append(.{
.old_resolution = old_resolution,
.parent = new_package.meta.id,
- .resolve_id = resolve_id,
+ .resolve_id = new_package.resolutions.off + @intCast(PackageID, i),
});
}
}
diff --git a/test/cli/install/bun-install.test.ts b/test/cli/install/bun-install.test.ts
index f44dc5a7e..4b3342e3a 100644
--- a/test/cli/install/bun-install.test.ts
+++ b/test/cli/install/bun-install.test.ts
@@ -4259,7 +4259,11 @@ it("should perform bin-linking across multiple dependencies", async () => {
cache = false
`,
);
- const { stdout, stderr, exited } = spawn({
+ const {
+ stdout: stdout1,
+ stderr: stderr1,
+ exited: exited1,
+ } = spawn({
cmd: [bunExe(), "install"],
cwd: package_dir,
stdout: null,
@@ -4267,13 +4271,13 @@ cache = false
stderr: "pipe",
env,
});
- expect(stderr).toBeDefined();
- const err = await new Response(stderr).text();
- expect(err).toContain("Saved lockfile");
- expect(err).not.toContain("error:");
- expect(stdout).toBeDefined();
- const out = await new Response(stdout).text();
- expect(out.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([
+ expect(stderr1).toBeDefined();
+ const err1 = await new Response(stderr1).text();
+ expect(err1).toContain("Saved lockfile");
+ expect(err1).not.toContain("error:");
+ expect(stdout1).toBeDefined();
+ const out1 = await new Response(stdout1).text();
+ expect(out1.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([
" + conditional-type-checks@1.0.6",
" + prettier@2.8.8",
" + tsd@0.22.0",
@@ -4281,7 +4285,7 @@ cache = false
"",
" 119 packages installed",
]);
- expect(await exited).toBe(0);
+ expect(await exited1).toBe(0);
expect(await readdirSorted(package_dir)).toEqual(["bun.lockb", "bunfig.toml", "node_modules", "package.json"]);
expect(await file(join(package_dir, "package.json")).text()).toEqual(foo_package);
expect(await readdirSorted(join(package_dir, "node_modules"))).toEqual([
@@ -4394,4 +4398,29 @@ cache = false
"tsd",
"tsserver",
]);
-}, 10000);
+ // Perform `bun install --production` with lockfile from before
+ await rm(join(package_dir, "node_modules"), { force: true, recursive: true });
+ const {
+ stdout: stdout2,
+ stderr: stderr2,
+ exited: exited2,
+ } = spawn({
+ cmd: [bunExe(), "install", "--production"],
+ cwd: package_dir,
+ stdout: null,
+ stdin: "pipe",
+ stderr: "pipe",
+ env,
+ });
+ expect(stderr2).toBeDefined();
+ const err2 = await new Response(stderr2).text();
+ expect(err2).not.toContain("Saved lockfile");
+ expect(err2).not.toContain("error:");
+ expect(stdout2).toBeDefined();
+ const out2 = await new Response(stdout2).text();
+ expect(out2.replace(/\[[0-9\.]+m?s\]/, "[]").split(/\r?\n/)).toEqual(["[] done", ""]);
+ expect(await exited2).toBe(0);
+ expect(await readdirSorted(package_dir)).toEqual(["bun.lockb", "bunfig.toml", "node_modules", "package.json"]);
+ expect(await file(join(package_dir, "package.json")).text()).toEqual(foo_package);
+ expect(await readdirSorted(join(package_dir, "node_modules"))).toEqual([]);
+}, 20000);