ripgrep.test.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import { describe, expect } from "bun:test"
  2. import fs from "fs/promises"
  3. import path from "path"
  4. import { Effect } from "effect"
  5. import { Ripgrep } from "@opencode-ai/core/ripgrep"
  6. import { RelativePath } from "@opencode-ai/core/schema"
  7. import { tmpdir } from "./fixture/tmpdir"
  8. import { testEffect } from "./lib/effect"
  9. const it = testEffect(Ripgrep.defaultLayer)
  10. describe("Ripgrep", () => {
  11. it.live("allows caller globs to re-include git metadata", () =>
  12. Effect.acquireUseRelease(
  13. Effect.promise(() => tmpdir()),
  14. (tmp) =>
  15. Effect.gen(function* () {
  16. yield* Effect.promise(() => fs.mkdir(path.join(tmp.path, ".opencode")))
  17. yield* Effect.promise(() => fs.writeFile(path.join(tmp.path, ".opencode", "config"), "needle\n"))
  18. yield* Effect.promise(() => fs.mkdir(path.join(tmp.path, ".git")))
  19. yield* Effect.promise(() => fs.writeFile(path.join(tmp.path, ".git", "config"), "needle\n"))
  20. const ripgrep = yield* Ripgrep.Service
  21. const files = yield* ripgrep.find({ cwd: tmp.path, pattern: "**/*", limit: 10 })
  22. expect(files.map((item) => item.path)).toContain(RelativePath.make(".opencode/config"))
  23. expect(files.map((item) => item.path)).toContain(RelativePath.make(".git/config"))
  24. const matches = yield* ripgrep.grep({ cwd: tmp.path, pattern: "needle", include: "config", limit: 10 })
  25. expect(matches.map((item) => item.entry.path)).toContain(RelativePath.make(".opencode/config"))
  26. expect(matches.map((item) => item.entry.path)).toContain(RelativePath.make(".git/config"))
  27. }),
  28. (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()),
  29. ),
  30. )
  31. })