diff options
author | 2023-02-10 09:47:47 -0800 | |
---|---|---|
committer | 2023-02-10 09:47:59 -0800 | |
commit | ed2e0e1617d3a3200800f9166d400913cc2484bd (patch) | |
tree | 5afbcb3e8792b91ad824b9979974d7faace6b08d /packages/bun-ecosystem/src/runner.ts | |
parent | 09585c4b24c8cf6ffa3b0c10d98b144bea8b298e (diff) | |
download | bun-ed2e0e1617d3a3200800f9166d400913cc2484bd.tar.gz bun-ed2e0e1617d3a3200800f9166d400913cc2484bd.tar.zst bun-ed2e0e1617d3a3200800f9166d400913cc2484bd.zip |
Add bun-ecosystem for running tests on npm packages
Diffstat (limited to 'packages/bun-ecosystem/src/runner.ts')
-rw-r--r-- | packages/bun-ecosystem/src/runner.ts | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/packages/bun-ecosystem/src/runner.ts b/packages/bun-ecosystem/src/runner.ts new file mode 100644 index 000000000..8b4e42aa7 --- /dev/null +++ b/packages/bun-ecosystem/src/runner.ts @@ -0,0 +1,92 @@ +import type { Package } from "./packages"; +import { packages } from "./packages"; +import { existsSync, copyFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { globby } from "globby"; + +for (const pkg of packages) { + try { + await loadPackage(pkg, "tmp"); + } catch (error) { + console.error(pkg.name, error); + } +} + +async function loadPackage(pkg: Package, cwd?: string): Promise<void> { + await gitClone({ + cwd, + repository: pkg.repository, + name: pkg.name, + }); + const dir = join(cwd ?? "", pkg.name, pkg.cwd ?? ""); + await spawn({ + cwd: dir, + cmd: ["bun", "install"], + }); + if (!pkg.tests || pkg.tests.style !== "jest") { + return; + } + const files = await globby(pkg.tests.include, { + cwd: dir, + ignore: pkg.tests.exclude ?? [crypto.randomUUID()], + onlyFiles: true, + caseSensitiveMatch: false, + }); + if (!files.length) { + throw new Error("No tests found"); + } + for (const file of files) { + let path = file; + if (!file.includes(".test.")) { + const ext = path.lastIndexOf("."); + path = file.substring(0, ext) + ".test" + file.substring(ext); + copyFileSync(join(dir, file), join(dir, path)); + } + await spawn({ + cwd: dir, + cmd: ["bun", "wiptest", path], + }); + } +} + +type GitCloneOptions = { + repository: string; + cwd?: string; + name?: string; +}; + +async function gitClone(options: GitCloneOptions): Promise<void> { + const name = options.name ?? dirname(options.repository); + const cwd = options.cwd ?? process.cwd(); + const path = join(cwd, name); + if (existsSync(path)) { + await spawn({ + cwd: path, + cmd: ["git", "pull"], + }); + } else { + const url = `${options.repository}`; + await spawn({ + cwd, + cmd: ["git", "clone", "--single-branch", "--depth", "1", url, name], + }); + } +} + +type SpawnOptions = { + cwd: string; + cmd: string[]; +}; + +async function spawn({ cwd, cmd }: SpawnOptions) { + const { exited } = await Bun.spawn({ + cwd, + cmd, + stdout: "inherit", + stderr: "inherit", + }); + const exitCode = await exited; + if (exitCode !== 0) { + throw new Error(`"${cmd.join(" ")}" exited with ${exitCode}`); + } +} |