import { file, spawn } from "bun"; import { afterEach, beforeEach, expect, it } from "bun:test"; import { bunExe, bunEnv as env } from "harness"; import { mkdtemp, realpath, rm, writeFile } from "fs/promises"; import { tmpdir } from "os"; import { join } from "path"; import { readdirSorted } from "./dummy.registry"; let run_dir: string; beforeEach(async () => { run_dir = await realpath(await mkdtemp(join(tmpdir(), "bun-run.test"))); }); afterEach(async () => { await rm(run_dir, { force: true, recursive: true }); }); it("should download dependency to run local file", async () => { await writeFile( join(run_dir, "test.js"), ` const { minify } = require("uglify-js@3.17.4"); console.log(minify("print(6 * 7)").code); `, ); const { stdout: stdout1, stderr: stderr1, exited: exited1, } = spawn({ cmd: [bunExe(), "run", "test.js"], cwd: run_dir, stdout: null, stdin: "pipe", stderr: "pipe", env: { ...env, BUN_INSTALL_CACHE_DIR: join(run_dir, ".cache"), }, }); expect(stderr1).toBeDefined(); const err1 = await new Response(stderr1).text(); expect(err1).toBe(""); expect(await readdirSorted(run_dir)).toEqual([".cache", "test.js"]); expect(await readdirSorted(join(run_dir, ".cache"))).toContain("uglify-js"); expect(await readdirSorted(join(run_dir, ".cache", "uglify-js"))).toEqual(["3.17.4"]); expect(stdout1).toBeDefined(); const out1 = await new Response(stdout1).text(); expect(out1.split(/\r?\n/)).toEqual(["print(42);", ""]); expect(await exited1).toBe(0); // Perform `bun test.js` with cached dependencies const { stdout: stdout2, stderr: stderr2, exited: exited2, } = spawn({ cmd: [bunExe(), "test.js"], cwd: run_dir, stdout: null, stdin: "pipe", stderr: "pipe", env: { ...env, BUN_INSTALL_CACHE_DIR: join(run_dir, ".cache"), }, }); expect(stderr2).toBeDefined(); const err2 = await new Response(stderr2).text(); expect(err2).toBe(""); expect(await readdirSorted(run_dir)).toEqual([".cache", "test.js"]); expect(await readdirSorted(join(run_dir, ".cache"))).toContain("uglify-js"); expect(await readdirSorted(join(run_dir, ".cache", "uglify-js"))).toEqual(["3.17.4"]); expect(stdout2).toBeDefined(); const out2 = await new Response(stdout2).text(); expect(out2.split(/\r?\n/)).toEqual(["print(42);", ""]); expect(await exited2).toBe(0); }); it("should download dependencies to run local file", async () => { await writeFile( join(run_dir, "test.js"), ` import { file } from "bun"; import decompress from "decompress@4.2.1"; const buffer = await file("${join(import.meta.dir, "baz-0.0.3.tgz")}").arrayBuffer(); for (const entry of await decompress(Buffer.from(buffer))) { console.log(\`\${entry.type}: \${entry.path}\`); } `, ); const { stdout: stdout1, stderr: stderr1, exited: exited1, } = spawn({ cmd: [bunExe(), "test.js"], cwd: run_dir, stdout: null, stdin: "pipe", stderr: "pipe", env: { ...env, BUN_INSTALL_CACHE_DIR: join(run_dir, ".cache"), }, }); expect(stderr1).toBeDefined(); const err1 = await new Response(stderr1).text(); expect(err1).toBe(""); expect(await readdirSorted(run_dir)).toEqual([".cache", "test.js"]); expect(await readdirSorted(join(run_dir, ".cache"))).toContain("decompress"); expect(await readdirSorted(join(run_dir, ".cache", "decompress"))).toEqual(["4.2.1"]); expect(await readdirSorted(join(run_dir, ".cache", "decompress", "4.2.1"))).toEqual([ "index.js", "license", "package.json", "readme.md", ]); expect(await file(join(run_dir, ".cache", "decompress", "4.2.1", "index.js")).text()).toContain( "\nmodule.exports = ", ); expect(stdout1).toBeDefined(); const out1 = await new Response(stdout1).text(); expect(out1.split(/\r?\n/)).toEqual([ "directory: package/", "file: package/index.js", "file: package/package.json", "", ]); expect(await exited1).toBe(0); // Perform `bun run test.js` with cached dependencies const { stdout: stdout2, stderr: stderr2, exited: exited2, } = spawn({ cmd: [bunExe(), "run", "test.js"], cwd: run_dir, stdout: null, stdin: "pipe", stderr: "pipe", env: { ...env, BUN_INSTALL_CACHE_DIR: join(run_dir, ".cache"), }, }); expect(stderr2).toBeDefined(); const err2 = await new Response(stderr2).text(); expect(err2).toBe(""); expect(await readdirSorted(run_dir)).toEqual([".cache", "test.js"]); expect(await readdirSorted(join(run_dir, ".cache"))).toContain("decompress"); expect(await readdirSorted(join(run_dir, ".cache", "decompress"))).toEqual(["4.2.1"]); expect(await readdirSorted(join(run_dir, ".cache", "decompress", "4.2.1"))).toEqual([ "index.js", "license", "package.json", "readme.md", ]); expect(await file(join(run_dir, ".cache", "decompress", "4.2.1", "index.js")).text()).toContain( "\nmodule.exports = ", ); expect(stdout2).toBeDefined(); const out2 = await new Response(stdout2).text(); expect(out2.split(/\r?\n/)).toEqual([ "directory: package/", "file: package/index.js", "file: package/package.json", "", ]); expect(await exited2).toBe(0); });