import fs from "fs/promises" import path from "path" import { describe, expect, test } from "bun:test" import { Npm } from "@opencode-ai/core/npm" import { tmpdir } from "./fixture/tmpdir" const win = process.platform === "win32" const writePackage = (dir: string, pkg: Record) => Bun.write( path.join(dir, "package.json"), JSON.stringify({ version: "1.0.0", ...pkg, }), ) describe("Npm.sanitize", () => { test("keeps normal scoped package specs unchanged", () => { expect(Npm.sanitize("@opencode/acme")).toBe("@opencode/acme") expect(Npm.sanitize("@opencode/acme@1.0.0")).toBe("@opencode/acme@1.0.0") expect(Npm.sanitize("prettier")).toBe("prettier") }) test("handles git https specs", () => { const spec = "acme@git+https://github.com/opencode/acme.git" const expected = win ? "acme@git+https_//github.com/opencode/acme.git" : spec expect(Npm.sanitize(spec)).toBe(expected) }) }) describe("Npm.install", () => { test("respects omit from project .npmrc", async () => { await using tmp = await tmpdir() await writePackage(tmp.path, { name: "fixture", dependencies: { "prod-pkg": "file:./prod-pkg", }, devDependencies: { "dev-pkg": "file:./dev-pkg", }, }) await Bun.write(path.join(tmp.path, ".npmrc"), "omit=dev\n") await fs.mkdir(path.join(tmp.path, "prod-pkg")) await fs.mkdir(path.join(tmp.path, "dev-pkg")) await writePackage(path.join(tmp.path, "prod-pkg"), { name: "prod-pkg" }) await writePackage(path.join(tmp.path, "dev-pkg"), { name: "dev-pkg" }) await Npm.install(tmp.path) await expect(fs.stat(path.join(tmp.path, "node_modules", "prod-pkg"))).resolves.toBeDefined() await expect(fs.stat(path.join(tmp.path, "node_modules", "dev-pkg"))).rejects.toThrow() }) })