mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 18:38:55 +00:00
### What does this PR do? Adds `"configVersion"` to bun.lock(b). The version will be used to keep default settings the same if they would be breaking across bun versions. fixes ENG-21389 fixes ENG-21388 ### How did you verify your code works? TODO: - [ ] new project - [ ] existing project without configVersion - [ ] existing project with configVersion - [ ] same as above but with bun.lockb - [ ] configVersion@0 defaults to hoisted linker - [ ] new projects use isolated linker --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
174 lines
5.3 KiB
TypeScript
174 lines
5.3 KiB
TypeScript
/**
|
|
* These tests are derived from the [deno_task_shell](https://github.com/denoland/deno_task_shell/) rm tests, which are developed and maintained by the Deno authors.
|
|
* Copyright 2018-2023 the Deno authors.
|
|
*
|
|
* This code is licensed under the MIT License: https://opensource.org/licenses/MIT
|
|
*/
|
|
import { $ } from "bun";
|
|
import { beforeAll, describe, expect, setDefaultTimeout, test } from "bun:test";
|
|
import { tempDirWithFiles } from "harness";
|
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
import path from "path";
|
|
import { createTestBuilder, sortedShellOutput } from "../util";
|
|
const TestBuilder = createTestBuilder(import.meta.path);
|
|
|
|
const fileExists = async (path: string): Promise<boolean> =>
|
|
$`ls -d ${path}`.then(o => o.stdout.toString() === `${path}\n`);
|
|
|
|
$.nothrow();
|
|
|
|
beforeAll(() => {
|
|
setDefaultTimeout(1000 * 60 * 5);
|
|
});
|
|
|
|
const BUN = process.argv0;
|
|
const DEV_NULL = process.platform === "win32" ? "NUL" : "/dev/null";
|
|
|
|
describe.concurrent("bunshell rm", () => {
|
|
TestBuilder.command`echo ${packagejson()} > package.json; ${BUN} install --linker hoisted &> ${DEV_NULL}; rm -rf node_modules/`
|
|
.ensureTempDir()
|
|
.doesNotExist("node_modules")
|
|
.runAsTest("node_modules");
|
|
|
|
test("force", async () => {
|
|
const files = {
|
|
"existent.txt": "",
|
|
};
|
|
const tempdir = tempDirWithFiles("rmforce", files);
|
|
|
|
expect(await $`rm -f ${tempdir}/non_existent.txt`.then(o => o.exitCode)).toBe(0);
|
|
|
|
{
|
|
const { stderr, exitCode } = await $`rm ${tempdir}/non_existent.txt`;
|
|
expect(stderr.toString()).toEqual(`rm: ${tempdir}/non_existent.txt: No such file or directory\n`);
|
|
expect(exitCode).toBe(1);
|
|
}
|
|
|
|
{
|
|
expect(await fileExists(`${tempdir}/existent.txt`)).toBeTrue();
|
|
const { stdout, exitCode } = await $`rm -v ${tempdir}/existent.txt`;
|
|
expect(stdout.toString()).toEqual(`${tempdir}/existent.txt\n`);
|
|
expect(exitCode).toBe(0);
|
|
expect(await fileExists(`${tempdir}/existent.txt`)).toBeFalse();
|
|
}
|
|
});
|
|
|
|
test("recursive", async () => {
|
|
const files = {
|
|
"existent.txt": "",
|
|
};
|
|
|
|
const tempdir = tempDirWithFiles("rmrecursive", files);
|
|
|
|
// test on a file
|
|
{
|
|
expect(await fileExists(`${tempdir}/existent.txt`)).toBeTrue();
|
|
const { stdout, stderr, exitCode } = await $`rm -rv ${tempdir}/existent.txt`;
|
|
expect(stderr.length).toBe(0);
|
|
expect(stdout.toString()).toEqual(`${tempdir}/existent.txt\n`);
|
|
expect(exitCode).toBe(0);
|
|
expect(await fileExists(`${tempdir}/existent.txt`)).toBeFalse();
|
|
}
|
|
|
|
// test on a directory
|
|
{
|
|
let subDir = path.join(tempdir, "folder", "sub");
|
|
mkdirSync(subDir, { recursive: true });
|
|
let subFile = path.join(subDir, "file.txt");
|
|
writeFileSync(subFile, "test");
|
|
const { stdout, exitCode } = await $`rm -rv ${path.join(tempdir, "folder")}`;
|
|
expect(sortedShellOutput(stdout.toString())).toEqual(
|
|
sortedShellOutput(`${subFile}\n${subDir}\n${path.join(tempdir, "folder")}\n`),
|
|
);
|
|
expect(exitCode).toBe(0);
|
|
|
|
expect(await fileExists(subDir)).toBeFalse();
|
|
expect(await fileExists(subFile)).toBeFalse();
|
|
{
|
|
const { stdout, stderr, exitCode } = await $`ls ${tempdir}`;
|
|
console.log("NICE", stdout.toString(), exitCode);
|
|
console.log("NICE", stderr.toString());
|
|
}
|
|
expect(await fileExists(tempdir)).toBeTrue();
|
|
}
|
|
|
|
// test with cwd
|
|
{
|
|
const tmpdir = TestBuilder.tmpdir();
|
|
const { stdout, stderr } =
|
|
await $`mkdir foo; touch ./foo/lol ./foo/nice ./foo/lmao; mkdir foo/bar; touch ./foo/bar/great; touch ./foo/bar/wow; rm -rfv foo/`.cwd(
|
|
tmpdir,
|
|
);
|
|
expect(sortedShellOutput(stdout.toString())).toEqual(
|
|
sortedShellOutput(
|
|
`foo/lol
|
|
foo/nice
|
|
foo/lmao
|
|
foo/bar
|
|
foo/bar/great
|
|
foo/bar/wow
|
|
foo/
|
|
`,
|
|
),
|
|
);
|
|
}
|
|
});
|
|
|
|
test("dir", async () => {
|
|
const files = {
|
|
"existent.txt": "",
|
|
"sub_dir": {},
|
|
"sub_dir_files/file.txt": "",
|
|
};
|
|
|
|
const tempdir = tempDirWithFiles("rmdir", files);
|
|
|
|
{
|
|
const { stdout, stderr, exitCode } = await $`rm -d ${tempdir}/existent.txt`;
|
|
expect(exitCode).toBe(0);
|
|
expect(await fileExists(`${tempdir}/existent.txt`)).toBeFalse();
|
|
}
|
|
|
|
{
|
|
const { stdout, stderr, exitCode } = await $`rm -d ${tempdir}/sub_dir`;
|
|
console.log(stderr.toString());
|
|
expect(exitCode).toBe(0);
|
|
expect(await fileExists(`${tempdir}/sub_dir`)).toBeFalse();
|
|
}
|
|
|
|
{
|
|
const { stdout, stderr, exitCode } = await $`rm -d ${tempdir}/sub_dir_files`;
|
|
console.log(exitCode, "STDOUT", stdout.toString());
|
|
expect(stderr.toString()).toEqual(`rm: ${tempdir}/sub_dir_files: Directory not empty\n`);
|
|
expect(exitCode).toBe(1);
|
|
expect(await fileExists(`${tempdir}/sub_dir_files`)).toBeTrue();
|
|
}
|
|
});
|
|
});
|
|
|
|
function packagejson() {
|
|
return `{
|
|
"name": "dummy",
|
|
"dependencies": {
|
|
"@biomejs/biome": "^1.5.3",
|
|
"@vscode/debugadapter": "^1.61.0",
|
|
"esbuild": "^0.17.15",
|
|
"eslint": "^8.20.0",
|
|
"eslint-config-prettier": "^8.5.0",
|
|
"mitata": "^0.1.3",
|
|
"peechy": "0.4.34",
|
|
"prettier": "3.2.2",
|
|
"react": "next",
|
|
"react-dom": "next",
|
|
"source-map-js": "^1.0.2",
|
|
"typescript": "^5.0.2"
|
|
},
|
|
"devDependencies": {
|
|
"@types/react": "^18.0.25",
|
|
"@typescript-eslint/eslint-plugin": "^5.31.0",
|
|
"@typescript-eslint/parser": "^5.31.0"
|
|
},
|
|
"version": "0.0.0"
|
|
}`;
|
|
}
|