import { describe, expect, test } from "bun:test"; import { mkdirSync } from "fs"; import { bunEnv, bunExe, tmpdirSync } from "harness"; import { join } from "path"; // --install= Configure auto-install behavior. One of "auto" (default, auto-installs when no node_modules), "fallback" (missing packages only), "force" (always). // -i Auto-install dependencies during execution. Equivalent to --install=fallback. describe("basic autoinstall", () => { for (const install of ["", "-i", "--install=auto", "--install=fallback", "--install=force"]) { for (const has_node_modules of [true, false]) { let should_install = false; if (has_node_modules) { if (install === "" || install === "--install=auto") { should_install = false; } else { should_install = true; } } else { should_install = true; } test(`${install || ""} ${has_node_modules ? "with" : "without"} node_modules ${should_install ? "should" : "should not"} autoinstall`, async () => { const dir = tmpdirSync(); mkdirSync(dir, { recursive: true }); await Bun.write(join(dir, "index.js"), "import isEven from 'is-even'; console.log(isEven(2));"); const env = bunEnv; env.BUN_INSTALL = install; if (has_node_modules) { mkdirSync(join(dir, "node_modules/abc"), { recursive: true }); } const { stdout, stderr } = Bun.spawnSync({ cmd: [bunExe(), ...(install === "" ? [] : [install]), join(dir, "index.js")], cwd: dir, env, stdout: "pipe", stderr: "pipe", }); if (should_install) { expect(stderr?.toString("utf8")).not.toContain("error: Cannot find package 'is-even'"); expect(stdout?.toString("utf8")).toBe("true\n"); } else { expect(stderr?.toString("utf8")).toContain("error: Cannot find package 'is-even'"); } }); } } }); test("--install=fallback to install missing packages", async () => { const dir = tmpdirSync(); mkdirSync(dir, { recursive: true }); await Promise.all([ Bun.write( join(dir, "index.js"), "import isEven from 'is-even'; import isOdd from 'is-odd'; console.log(isEven(2), isOdd(2));", ), Bun.write( join(dir, "package.json"), JSON.stringify({ name: "test", dependencies: { "is-odd": "1.0.0", }, }), ), ]); Bun.spawnSync({ cmd: [bunExe(), "install"], cwd: dir, env: bunEnv, }); const { stdout, stderr } = Bun.spawnSync({ cmd: [bunExe(), "--install=fallback", join(dir, "index.js")], cwd: dir, env: bunEnv, stdout: "pipe", stderr: "pipe", }); expect(stderr?.toString("utf8")).not.toContain("error: Cannot find package 'is-odd'"); expect(stdout?.toString("utf8")).toBe("true false\n"); });