Files
bun.sh/test/cli/install/bun-lockb.test.ts
Michael H ba20670da3 implement pnpm migration (#22262)
### What does this PR do?

fixes #7157, fixes #14662

migrates pnpm-workspace.yaml data to package.json & converts
pnpm-lock.yml to bun.lock

---

### How did you verify your code works?

manually, tests and real world examples

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Dylan Conway <dylan.conway567@gmail.com>
2025-09-27 00:45:29 -07:00

113 lines
3.5 KiB
TypeScript

import { file, spawn, write } from "bun";
import { afterAll, beforeAll, expect, it } from "bun:test";
import { copyFile, exists, open, writeFile } from "fs/promises";
import { bunExe, bunEnv as env, isWindows, runBunInstall, VerdaccioRegistry } from "harness";
import { join } from "path";
const registry = new VerdaccioRegistry();
beforeAll(async () => {
await registry.start();
});
afterAll(() => {
registry.stop();
});
it("should not print anything to stderr when running bun.lockb", async () => {
const { packageDir, packageJson } = await registry.createTestDir({ bunfigOpts: { saveTextLockfile: false } });
// copy bar-0.0.2.tgz to package_dir
await copyFile(join(__dirname, "bar-0.0.2.tgz"), join(packageDir, "bar-0.0.2.tgz"));
// Create a simple package.json
await writeFile(
packageJson,
JSON.stringify({
name: "test-package",
version: "1.0.0",
dependencies: {
"dummy-package": "file:./bar-0.0.2.tgz",
},
}),
);
// Run 'bun install' to generate the lockfile
const installResult = spawn({
cmd: [bunExe(), "install"],
cwd: packageDir,
env,
});
await installResult.exited;
// Ensure the lockfile was created
expect(await exists(join(packageDir, "bun.lockb"))).toBe(true);
// Assert that the lockfile has the correct permissions
const file = await open(join(packageDir, "bun.lockb"), "r");
const stat = await file.stat();
// in unix, 0o755 == 33261
let mode = 33261;
// ..but windows is different
if (isWindows) {
mode = 33206;
}
expect(stat.mode).toBe(mode);
// create a .env
await writeFile(join(packageDir, ".env"), "FOO=bar");
// Now test 'bun bun.lockb'
const { stdout, stderr, exited } = spawn({
cmd: [bunExe(), "bun.lockb"],
cwd: packageDir,
stdout: "pipe",
stderr: "pipe",
env,
});
const stdoutOutput = await stdout.text();
expect(stdoutOutput).toBe(
`# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n# yarn lockfile v1\n# bun ./bun.lockb --hash: 8B7A1C2DA8966A48-f4830e6e283fffe9-DE5BD0E91FD9910F-f0bf88071b3f7ec9\n\n\n\"bar@file:./bar-0.0.2.tgz\":\n version \"./bar-0.0.2.tgz\"\n resolved \"./bar-0.0.2.tgz\"\n`,
);
const stderrOutput = await stderr.text();
expect(stderrOutput).toBe("");
expect(await exited).toBe(0);
});
it("should continue using a binary lockfile if it exists", async () => {
const { packageDir, packageJson } = await registry.createTestDir({ bunfigOpts: { saveTextLockfile: false } });
await write(
packageJson,
JSON.stringify({
name: "binary-lockfile-package",
version: "1.0.0",
dependencies: {
"no-deps": "1.0.0",
},
}),
);
await runBunInstall(env, packageDir);
const firstLockfile = await file(join(packageDir, "bun.lockb")).text();
// now remove the saveTextLockfile option from bunfig
await registry.writeBunfig(packageDir);
// another install will keep the existing binary lockfile
await runBunInstall(env, packageDir, { savesLockfile: false });
expect(await exists(join(packageDir, "bun.lock"))).toBe(false);
const secondLockfile = await file(join(packageDir, "bun.lockb")).text();
expect(firstLockfile).toBe(secondLockfile);
// adding a package will add to the binary lockfile
await runBunInstall(env, packageDir, { packages: ["a-dep"] });
expect(await exists(join(packageDir, "bun.lock"))).toBe(false);
const thirdLockfile = await file(join(packageDir, "bun.lockb")).text();
expect(thirdLockfile).not.toBe(secondLockfile);
});