diff options
Diffstat (limited to 'test/cli/install')
-rw-r--r-- | test/cli/install/bun-install.test.ts | 408 |
1 files changed, 408 insertions, 0 deletions
diff --git a/test/cli/install/bun-install.test.ts b/test/cli/install/bun-install.test.ts index 6fb303b5d..bf095f6e4 100644 --- a/test/cli/install/bun-install.test.ts +++ b/test/cli/install/bun-install.test.ts @@ -5358,6 +5358,414 @@ it("should handle `workspaces:bar` and `workspace:bar` gracefully", async () => await access(join(package_dir, "bun.lockb")); }); +it("should handle installing packages from inside a workspace with `*`", async () => { + await writeFile( + join(package_dir, "package.json"), + JSON.stringify({ + name: "main", + workspaces: ["packages/*"], + private: true, + }), + ); + await mkdir(join(package_dir, "packages", "yolo"), { recursive: true }); + const yolo_package = JSON.stringify({ + name: "yolo", + version: "0.0.1", + dependencies: { + swag: "workspace:*", + }, + }); + await writeFile(join(package_dir, "packages", "yolo", "package.json"), yolo_package); + await mkdir(join(package_dir, "packages", "swag")); + const swag_package = JSON.stringify({ + name: "swag", + version: "0.0.1", + }); + await writeFile(join(package_dir, "packages", "swag", "package.json"), swag_package); + const { + stdout: stdout1, + stderr: stderr1, + exited: exited1, + } = spawn({ + cmd: [bunExe(), "install"], + cwd: join(package_dir, "packages", "yolo"), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr1).toBeDefined(); + const err1 = await new Response(stderr1).text(); + expect(err1).toContain("Saved lockfile"); + expect(stdout1).toBeDefined(); + const out1 = await new Response(stdout1).text(); + expect(out1.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([ + " + swag@workspace:packages/swag", + " + yolo@workspace:packages/yolo", + "", + " 2 packages installed", + ]); + expect(await exited1).toBe(0); + expect(requested).toBe(0); + await access(join(package_dir, "bun.lockb")); + + const urls: string[] = []; + setHandler(dummyRegistry(urls)); + + const { + stdout: stdout2, + stderr: stderr2, + exited: exited2, + } = spawn({ + cmd: [bunExe(), "install", "bar"], + cwd: join(package_dir, "packages", "yolo"), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr1).toBeDefined(); + const err2 = await new Response(stderr2).text(); + expect(err2).toContain("Saved lockfile"); + expect(stdout2).toBeDefined(); + const out2 = await new Response(stdout2).text(); + expect(out2).toContain("installed bar"); + expect(await exited2).toBe(0); + expect(urls.sort()).toEqual([`${root_url}/bar`, `${root_url}/bar-0.0.2.tgz`]); + await access(join(package_dir, "bun.lockb")); +}); + +it("should handle installing packages inside workspaces with difference versions", async () => { + await writeFile( + join(package_dir, "package.json"), + JSON.stringify({ + name: "main", + workspaces: ["packages/*"], + private: true, + }), + ); + { + await mkdir(join(package_dir, "packages", "package1"), { recursive: true }); + const package1 = JSON.stringify({ + name: "package1", + version: "0.0.2", + }); + await writeFile(join(package_dir, "packages", "package1", "package.json"), package1); + } + { + await mkdir(join(package_dir, "packages", "package2")); + const package2 = JSON.stringify({ + name: "package2", + version: "0.0.1", + dependencies: { + package1: "workspace:*", + }, + }); + await writeFile(join(package_dir, "packages", "package2", "package.json"), package2); + } + { + await mkdir(join(package_dir, "packages", "package3")); + const package3 = JSON.stringify({ + name: "package3", + version: "0.0.1", + dependencies: { + package1: "workspace:^", + }, + }); + await writeFile(join(package_dir, "packages", "package3", "package.json"), package3); + } + { + await mkdir(join(package_dir, "packages", "package4")); + const package4 = JSON.stringify({ + name: "package4", + version: "0.0.1", + dependencies: { + package1: "workspace:../package1", + }, + }); + await writeFile(join(package_dir, "packages", "package4", "package.json"), package4); + } + { + await mkdir(join(package_dir, "packages", "package5")); + const package5 = JSON.stringify({ + name: "package5", + version: "0.0.1", + dependencies: { + package1: "workspace:0.0.2", + }, + }); + await writeFile(join(package_dir, "packages", "package5", "package.json"), package5); + } + + const { + stdout: stdout1, + stderr: stderr1, + exited: exited1, + } = spawn({ + cmd: [bunExe(), "install"], + cwd: join(package_dir, "packages", "package2"), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr1).toBeDefined(); + const err1 = await new Response(stderr1).text(); + expect(err1).toContain("Saved lockfile"); + const out1 = await new Response(stdout1).text(); + expect(out1.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([ + " + package1@workspace:packages/package1", + " + package2@workspace:packages/package2", + " + package3@workspace:packages/package3", + " + package4@workspace:packages/package4", + " + package5@workspace:packages/package5", + "", + " 5 packages installed", + ]); + expect(await exited1).toBe(0); + expect(requested).toBe(0); + await access(join(package_dir, "bun.lockb")); + + var urls: string[] = []; + setHandler(dummyRegistry(urls)); + + const { + stdout: stdout1_2, + stderr: stderr1_2, + exited: exited1_2, + } = spawn({ + cmd: [bunExe(), "install", "bar"], + cwd: join(package_dir, "packages", "package2"), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr1_2).toBeDefined(); + expect(stderr1_2).toBeDefined(); + const err1_2 = await new Response(stderr1_2).text(); + expect(err1_2).toContain("Saved lockfile"); + expect(stdout1_2).toBeDefined(); + const out1_2 = await new Response(stdout1_2).text(); + expect(out1_2).toContain("installed bar"); + expect(await exited1_2).toBe(0); + expect(urls.sort()).toEqual([`${root_url}/bar`, `${root_url}/bar-0.0.2.tgz`]); + await access(join(package_dir, "bun.lockb")); + + await rm(join(package_dir, "node_modules"), { force: true, recursive: true }); + await rm(join(package_dir, "bun.lockb"), { force: true, recursive: true }); + + const { + stdout: stdout2, + stderr: stderr2, + exited: exited2, + } = spawn({ + cmd: [bunExe(), "install"], + cwd: join(package_dir, "packages", "package3"), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr2).toBeDefined(); + const err2 = await new Response(stderr2).text(); + expect(err2).toContain("Saved lockfile"); + expect(stdout2).toBeDefined(); + const out2 = await new Response(stdout2).text(); + expect(out2.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([ + " + package1@workspace:packages/package1", + " + package2@workspace:packages/package2", + " + package3@workspace:packages/package3", + " + package4@workspace:packages/package4", + " + package5@workspace:packages/package5", + "", + " 6 packages installed", + ]); + expect(await exited2).toBe(0); + + const { + stdout: stdout2_2, + stderr: stderr2_2, + exited: exited2_2, + } = spawn({ + cmd: [bunExe(), "install", "bar"], + cwd: join(package_dir, "packages", "package3"), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr2_2).toBeDefined(); + expect(stderr2_2).toBeDefined(); + const err2_2 = await new Response(stderr2_2).text(); + expect(err2_2).toContain("Saved lockfile"); + expect(stdout2_2).toBeDefined(); + const out2_2 = await new Response(stdout2_2).text(); + expect(out2_2).toContain("installed bar"); + expect(await exited2_2).toBe(0); + await access(join(package_dir, "bun.lockb")); + + await rm(join(package_dir, "node_modules"), { force: true, recursive: true }); + await rm(join(package_dir, "bun.lockb"), { force: true, recursive: true }); + + const { + stdout: stdout3, + stderr: stderr3, + exited: exited3, + } = spawn({ + cmd: [bunExe(), "install"], + cwd: join(package_dir, "packages", "package4"), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr2).toBeDefined(); + const err3 = await new Response(stderr3).text(); + expect(err3).toContain("Saved lockfile"); + expect(stdout3).toBeDefined(); + const out3 = await new Response(stdout3).text(); + expect(out3.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([ + " + package1@workspace:packages/package1", + " + package2@workspace:packages/package2", + " + package3@workspace:packages/package3", + " + package4@workspace:packages/package4", + " + package5@workspace:packages/package5", + "", + " 6 packages installed", + ]); + expect(await exited3).toBe(0); + + const { + stdout: stdout3_2, + stderr: stderr3_2, + exited: exited3_2, + } = spawn({ + cmd: [bunExe(), "install", "bar"], + cwd: join(package_dir, "packages", "package4"), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr3_2).toBeDefined(); + expect(stderr3_2).toBeDefined(); + const err3_2 = await new Response(stderr3_2).text(); + expect(err3_2).toContain("Saved lockfile"); + expect(stdout3_2).toBeDefined(); + const out3_2 = await new Response(stdout3_2).text(); + expect(out3_2).toContain("installed bar"); + expect(await exited3_2).toBe(0); + await access(join(package_dir, "bun.lockb")); + + await rm(join(package_dir, "node_modules"), { force: true, recursive: true }); + await rm(join(package_dir, "bun.lockb"), { force: true, recursive: true }); + + const { + stdout: stdout4, + stderr: stderr4, + exited: exited4, + } = spawn({ + cmd: [bunExe(), "install"], + cwd: join(package_dir, "packages", "package5"), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr4).toBeDefined(); + const err4 = await new Response(stderr4).text(); + expect(err4).toContain("Saved lockfile"); + expect(stdout4).toBeDefined(); + const out4 = await new Response(stdout4).text(); + expect(out4.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([ + " + package1@workspace:packages/package1", + " + package2@workspace:packages/package2", + " + package3@workspace:packages/package3", + " + package4@workspace:packages/package4", + " + package5@workspace:packages/package5", + "", + " 6 packages installed", + ]); + expect(await exited4).toBe(0); + + const { + stdout: stdout4_2, + stderr: stderr4_2, + exited: exited4_2, + } = spawn({ + cmd: [bunExe(), "install", "bar"], + cwd: join(package_dir, "packages", "package5"), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr4_2).toBeDefined(); + expect(stderr4_2).toBeDefined(); + const err4_2 = await new Response(stderr4_2).text(); + expect(err4_2).toContain("Saved lockfile"); + expect(stdout4_2).toBeDefined(); + const out4_2 = await new Response(stdout4_2).text(); + expect(out4_2).toContain("installed bar"); + expect(await exited4_2).toBe(0); + await access(join(package_dir, "bun.lockb")); + + // from the root + await rm(join(package_dir, "node_modules"), { force: true, recursive: true }); + await rm(join(package_dir, "bun.lockb"), { force: true, recursive: true }); + + const { + stdout: stdout5, + stderr: stderr5, + exited: exited5, + } = spawn({ + cmd: [bunExe(), "install"], + cwd: join(package_dir), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr5).toBeDefined(); + const err5 = await new Response(stderr5).text(); + expect(err5).toContain("Saved lockfile"); + expect(stdout5).toBeDefined(); + const out5 = await new Response(stdout5).text(); + expect(out5.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([ + " + package1@workspace:packages/package1", + " + package2@workspace:packages/package2", + " + package3@workspace:packages/package3", + " + package4@workspace:packages/package4", + " + package5@workspace:packages/package5", + "", + " 6 packages installed", + ]); + expect(await exited5).toBe(0); + + const { + stdout: stdout5_2, + stderr: stderr5_2, + exited: exited5_2, + } = spawn({ + cmd: [bunExe(), "install", "bar"], + cwd: join(package_dir), + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr5_2).toBeDefined(); + expect(stderr5_2).toBeDefined(); + const err5_2 = await new Response(stderr5_2).text(); + expect(err5_2).toContain("Saved lockfile"); + expect(stdout5_2).toBeDefined(); + const out5_2 = await new Response(stdout5_2).text(); + expect(out5_2).toContain("installed bar"); + expect(await exited5_2).toBe(0); + await access(join(package_dir, "bun.lockb")); +}); + it("should override npm dependency by matching workspace", async () => { const urls: string[] = []; setHandler(dummyRegistry(urls)); |