fixture.ts 754 B

12345678910111213141516171819202122232425
  1. import { $ } from "bun"
  2. import { realpathSync } from "fs"
  3. import os from "os"
  4. import path from "path"
  5. type TmpDirOptions<T> = {
  6. git?: boolean
  7. init?: (dir: string) => Promise<T>
  8. dispose?: (dir: string) => Promise<T>
  9. }
  10. export async function tmpdir<T>(options?: TmpDirOptions<T>) {
  11. const dirpath = path.join(os.tmpdir(), "opencode-test-" + Math.random().toString(36).slice(2))
  12. await $`mkdir -p ${dirpath}`.quiet()
  13. if (options?.git) await $`git init`.cwd(dirpath).quiet()
  14. const extra = await options?.init?.(dirpath)
  15. const result = {
  16. [Symbol.asyncDispose]: async () => {
  17. await options?.dispose?.(dirpath)
  18. await $`rm -rf ${dirpath}`.quiet()
  19. },
  20. path: realpathSync(dirpath),
  21. extra: extra as T,
  22. }
  23. return result
  24. }