| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- import { describe, expect } from "bun:test"
- import fs from "fs/promises"
- import path from "path"
- import { Effect } from "effect"
- import { LayerNode } from "@opencode-ai/util/effect/layer-node"
- import { Ripgrep } from "@opencode-ai/core/ripgrep"
- import { AbsolutePath, RelativePath } from "@opencode-ai/core/schema"
- import { tmpdir } from "../fixture/tmpdir"
- import { testEffect } from "../lib/effect"
- const it = testEffect(LayerNode.compile(Ripgrep.node))
- const withTmp = <A, E, R>(f: (directory: AbsolutePath) => Effect.Effect<A, E, R>) =>
- Effect.acquireRelease(
- Effect.promise(() => tmpdir()),
- (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()),
- ).pipe(Effect.flatMap((tmp) => f(AbsolutePath.make(tmp.path))))
- describe("Ripgrep", () => {
- it.live("globs files as an array", () =>
- withTmp((cwd) =>
- Effect.gen(function* () {
- yield* Effect.promise(() => fs.mkdir(path.join(cwd, "src")))
- yield* Effect.promise(() => fs.writeFile(path.join(cwd, "src", "match.ts"), "needle\n"))
- const result = yield* (yield* Ripgrep.Service).glob({ cwd, pattern: "**/*.ts", limit: 10 })
- expect(result.map((item) => item.path)).toEqual([RelativePath.make("src/match.ts")])
- }),
- ),
- )
- it.live("greps files with include filtering", () =>
- withTmp((cwd) =>
- Effect.gen(function* () {
- yield* Effect.promise(() => fs.mkdir(path.join(cwd, "src")))
- yield* Effect.promise(() => fs.writeFile(path.join(cwd, "src", "match.ts"), "needle\n"))
- yield* Effect.promise(() => fs.writeFile(path.join(cwd, "src", "skip.txt"), "needle\n"))
- const result = yield* (yield* Ripgrep.Service).grep({ cwd, pattern: "needle", include: "*.ts", limit: 10 })
- expect(result).toHaveLength(1)
- expect(result[0]?.entry.path).toBe(RelativePath.make("src/match.ts"))
- expect(result[0]?.submatches[0]?.text).toBe("needle")
- }),
- ),
- )
- })
|