module.test.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { describe, expect, test } from "bun:test"
  2. import path from "path"
  3. import { Module } from "@opencode-ai/shared/util/module"
  4. import { Filesystem } from "../../src/util"
  5. import { tmpdir } from "../fixture/fixture"
  6. describe("util.module", () => {
  7. test("resolves package subpaths from the provided dir", async () => {
  8. await using tmp = await tmpdir()
  9. const root = path.join(tmp.path, "proj")
  10. const file = path.join(root, "node_modules/typescript/lib/tsserver.js")
  11. await Filesystem.write(file, "export {}\n")
  12. await Filesystem.writeJson(path.join(root, "node_modules/typescript/package.json"), { name: "typescript" })
  13. expect(Module.resolve("typescript/lib/tsserver.js", root)).toBe(file)
  14. })
  15. test("resolves packages through ancestor node_modules", async () => {
  16. await using tmp = await tmpdir()
  17. const root = path.join(tmp.path, "proj")
  18. const cwd = path.join(root, "apps/web")
  19. const file = path.join(root, "node_modules/eslint/lib/api.js")
  20. await Filesystem.write(file, "export {}\n")
  21. await Filesystem.writeJson(path.join(root, "node_modules/eslint/package.json"), {
  22. name: "eslint",
  23. main: "lib/api.js",
  24. })
  25. await Filesystem.write(path.join(cwd, ".keep"), "")
  26. expect(Module.resolve("eslint", cwd)).toBe(file)
  27. })
  28. test("resolves relative to the provided dir", async () => {
  29. await using tmp = await tmpdir()
  30. const a = path.join(tmp.path, "a")
  31. const b = path.join(tmp.path, "b")
  32. const left = path.join(a, "node_modules/biome/index.js")
  33. const right = path.join(b, "node_modules/biome/index.js")
  34. await Filesystem.write(left, "export {}\n")
  35. await Filesystem.write(right, "export {}\n")
  36. await Filesystem.writeJson(path.join(a, "node_modules/biome/package.json"), {
  37. name: "biome",
  38. main: "index.js",
  39. })
  40. await Filesystem.writeJson(path.join(b, "node_modules/biome/package.json"), {
  41. name: "biome",
  42. main: "index.js",
  43. })
  44. expect(Module.resolve("biome", a)).toBe(left)
  45. expect(Module.resolve("biome", b)).toBe(right)
  46. expect(Module.resolve("biome", a)).not.toBe(Module.resolve("biome", b))
  47. })
  48. test("returns undefined when resolution fails", async () => {
  49. await using tmp = await tmpdir()
  50. expect(Module.resolve("missing-package", tmp.path)).toBeUndefined()
  51. })
  52. })