Files
bun.sh/test/cli/install/bun-pm.test.ts

375 lines
9.4 KiB
TypeScript

import { spawn } from "bun";
import { afterAll, afterEach, beforeAll, beforeEach, expect, it } from "bun:test";
import { exists, mkdir, writeFile } from "fs/promises";
import { bunEnv, bunExe, bunEnv as env, readdirSorted, tmpdirSync } from "harness";
import { cpSync } from "node:fs";
import { join } from "path";
import {
dummyAfterAll,
dummyAfterEach,
dummyBeforeAll,
dummyBeforeEach,
dummyRegistry,
package_dir,
requested,
root_url,
setHandler,
} from "./dummy.registry";
beforeAll(dummyBeforeAll);
afterAll(dummyAfterAll);
beforeEach(dummyBeforeEach);
afterEach(dummyAfterEach);
it("should list top-level dependency", async () => {
const urls: string[] = [];
setHandler(dummyRegistry(urls));
await writeFile(
join(package_dir, "package.json"),
JSON.stringify({
name: "foo",
version: "0.0.1",
dependencies: {
moo: "./moo",
},
}),
);
await mkdir(join(package_dir, "moo"));
await writeFile(
join(package_dir, "moo", "package.json"),
JSON.stringify({
name: "moo",
version: "0.1.0",
dependencies: {
bar: "latest",
},
}),
);
{
const { stderr, stdout, exited } = spawn({
cmd: [bunExe(), "install"],
cwd: package_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env,
});
const err = await new Response(stderr).text();
expect(err).not.toContain("error:");
expect(err).toContain("Saved lockfile");
expect(await exited).toBe(0);
}
expect(urls.sort()).toEqual([`${root_url}/bar`, `${root_url}/bar-0.0.2.tgz`]);
expect(requested).toBe(2);
urls.length = 0;
const { stdout, stderr, exited } = spawn({
cmd: [bunExe(), "pm", "ls"],
cwd: package_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env,
});
expect(await new Response(stderr).text()).toBe("");
expect(await new Response(stdout).text()).toBe(`${package_dir} node_modules (2)
└── moo@moo
`);
expect(await exited).toBe(0);
expect(urls.sort()).toEqual([]);
expect(requested).toBe(2);
});
it("should list all dependencies", async () => {
const urls: string[] = [];
setHandler(dummyRegistry(urls));
await writeFile(
join(package_dir, "package.json"),
JSON.stringify({
name: "foo",
version: "0.0.1",
dependencies: {
moo: "./moo",
},
}),
);
await mkdir(join(package_dir, "moo"));
await writeFile(
join(package_dir, "moo", "package.json"),
JSON.stringify({
name: "moo",
version: "0.1.0",
dependencies: {
bar: "latest",
},
}),
);
{
const { stderr, stdout, exited } = spawn({
cmd: [bunExe(), "install"],
cwd: package_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env,
});
const err = await new Response(stderr).text();
expect(err).not.toContain("error:");
expect(err).toContain("Saved lockfile");
expect(await exited).toBe(0);
}
expect(urls.sort()).toEqual([`${root_url}/bar`, `${root_url}/bar-0.0.2.tgz`]);
expect(requested).toBe(2);
urls.length = 0;
const { stdout, stderr, exited } = spawn({
cmd: [bunExe(), "pm", "ls", "--all"],
cwd: package_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env,
});
expect(await new Response(stderr).text()).toBe("");
expect(await new Response(stdout).text()).toBe(`${package_dir} node_modules
├── bar@0.0.2
└── moo@moo
`);
expect(await exited).toBe(0);
expect(urls.sort()).toEqual([]);
expect(requested).toBe(2);
});
it("should list top-level aliased dependency", async () => {
const urls: string[] = [];
setHandler(dummyRegistry(urls));
await writeFile(
join(package_dir, "package.json"),
JSON.stringify({
name: "foo",
version: "0.0.1",
dependencies: {
"moo-1": "./moo",
},
}),
);
await mkdir(join(package_dir, "moo"));
await writeFile(
join(package_dir, "moo", "package.json"),
JSON.stringify({
name: "moo",
version: "0.1.0",
dependencies: {
"bar-1": "npm:bar",
},
}),
);
{
const { stderr, stdout, exited } = spawn({
cmd: [bunExe(), "install"],
cwd: package_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env,
});
const err = await new Response(stderr).text();
expect(err).not.toContain("error:");
expect(err).toContain("Saved lockfile");
expect(await exited).toBe(0);
}
expect(urls.sort()).toEqual([`${root_url}/bar`, `${root_url}/bar-0.0.2.tgz`]);
expect(requested).toBe(2);
urls.length = 0;
const { stdout, stderr, exited } = spawn({
cmd: [bunExe(), "pm", "ls"],
cwd: package_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env,
});
expect(await new Response(stderr).text()).toBe("");
expect(await new Response(stdout).text()).toBe(`${package_dir} node_modules (2)
└── moo-1@moo
`);
expect(await exited).toBe(0);
expect(urls.sort()).toEqual([]);
expect(requested).toBe(2);
});
it("should list aliased dependencies", async () => {
const urls: string[] = [];
setHandler(dummyRegistry(urls));
await writeFile(
join(package_dir, "package.json"),
JSON.stringify({
name: "foo",
version: "0.0.1",
dependencies: {
"moo-1": "./moo",
},
}),
);
await mkdir(join(package_dir, "moo"));
await writeFile(
join(package_dir, "moo", "package.json"),
JSON.stringify({
name: "moo",
version: "0.1.0",
dependencies: {
"bar-1": "npm:bar",
},
}),
);
{
const { stderr, stdout, exited } = spawn({
cmd: [bunExe(), "install"],
cwd: package_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env,
});
const err = await new Response(stderr).text();
expect(err).not.toContain("error:");
expect(err).toContain("Saved lockfile");
expect(await exited).toBe(0);
}
expect(urls.sort()).toEqual([`${root_url}/bar`, `${root_url}/bar-0.0.2.tgz`]);
expect(requested).toBe(2);
urls.length = 0;
const { stdout, stderr, exited } = spawn({
cmd: [bunExe(), "pm", "ls", "--all"],
cwd: package_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env,
});
expect(await new Response(stderr).text()).toBe("");
expect(await new Response(stdout).text()).toBe(`${package_dir} node_modules
├── bar-1@0.0.2
└── moo-1@moo
`);
expect(await exited).toBe(0);
expect(urls.sort()).toEqual([]);
expect(requested).toBe(2);
});
it("should remove all cache", async () => {
const urls: string[] = [];
setHandler(dummyRegistry(urls));
await writeFile(
join(package_dir, "package.json"),
JSON.stringify({
name: "foo",
version: "0.0.1",
dependencies: {
"moo-1": "./moo",
},
}),
);
await mkdir(join(package_dir, "moo"));
await writeFile(
join(package_dir, "moo", "package.json"),
JSON.stringify({
name: "moo",
version: "0.1.0",
dependencies: {
"bar-1": "npm:bar",
},
}),
);
let cache_dir: string = join(package_dir, "node_modules", ".cache");
{
const { stderr, stdout, exited } = spawn({
cmd: [bunExe(), "install"],
cwd: package_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env: {
...env,
BUN_INSTALL_CACHE_DIR: cache_dir,
},
});
const err = await new Response(stderr).text();
expect(err).not.toContain("error:");
expect(err).toContain("Saved lockfile");
expect(await exited).toBe(0);
}
expect(urls.sort()).toEqual([`${root_url}/bar`, `${root_url}/bar-0.0.2.tgz`]);
expect(requested).toBe(2);
expect(await readdirSorted(cache_dir)).toContain("bar");
const {
stdout: stdout1,
stderr: stderr1,
exited: exited1,
} = spawn({
cmd: [bunExe(), "pm", "cache"],
cwd: package_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env: {
...env,
BUN_INSTALL_CACHE_DIR: cache_dir,
},
});
expect(await new Response(stderr1).text()).toBe("");
expect(await new Response(stdout1).text()).toBe(cache_dir);
expect(await exited1).toBe(0);
const {
stdout: stdout2,
stderr: stderr2,
exited: exited2,
} = spawn({
cmd: [bunExe(), "pm", "cache", "rm"],
cwd: package_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env: {
...env,
BUN_INSTALL_CACHE_DIR: cache_dir,
},
});
expect(await new Response(stderr2).text()).toBe("");
expect(await new Response(stdout2).text()).toInclude("Cleared 'bun install' cache\n");
expect(await exited2).toBe(0);
expect(await exists(cache_dir)).toBeFalse();
});
it("bun pm migrate", async () => {
const test_dir = tmpdirSync();
cpSync(join(import.meta.dir, "migration/contoso-test"), test_dir, { recursive: true });
const { stdout, stderr, exitCode } = Bun.spawnSync({
cmd: [bunExe(), "pm", "migrate", "--force"],
cwd: test_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env: bunEnv,
});
expect(exitCode).toBe(0);
expect(stdout.toString("utf-8")).toBe("");
expect(stderr.toString("utf-8")).toEndWith("migrated lockfile from package-lock.json\n");
const hashExec = Bun.spawnSync({
cmd: [bunExe(), "pm", "hash"],
cwd: test_dir,
stdout: "pipe",
stdin: "pipe",
stderr: "pipe",
env: bunEnv,
});
expect(hashExec.exitCode).toBe(0);
const hash = hashExec.stdout.toString("utf-8").trim();
expect(hash).toMatchSnapshot();
});