aboutsummaryrefslogtreecommitdiff
path: root/packages/bun-ecosystem/src/runner.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/bun-ecosystem/src/runner.ts')
-rw-r--r--packages/bun-ecosystem/src/runner.ts92
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}`);
+ }
+}