diff options
-rw-r--r-- | src/install/lockfile.zig | 13 | ||||
-rw-r--r-- | test/cli/install/bun-install.test.ts | 49 |
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); |