71 lines
1.5 KiB
TypeScript
71 lines
1.5 KiB
TypeScript
#!/usr/bin/env bun
|
|
|
|
import { readdirSync, statSync } from "node:fs";
|
|
import { join, relative } from "node:path";
|
|
|
|
const workspaceRoots = ["apps", "services", "packages"];
|
|
|
|
const findTsconfigs = (dir: string): string[] => {
|
|
const entries = readdirSync(dir, { withFileTypes: true });
|
|
const tsconfigs: string[] = [];
|
|
|
|
for (const entry of entries) {
|
|
if (!entry.isDirectory()) {
|
|
continue;
|
|
}
|
|
|
|
const workspacePath = join(dir, entry.name);
|
|
const tsconfigPath = join(workspacePath, "tsconfig.json");
|
|
|
|
if (statSync(tsconfigPath, { throwIfNoEntry: false })?.isFile()) {
|
|
tsconfigs.push(tsconfigPath);
|
|
}
|
|
}
|
|
|
|
return tsconfigs;
|
|
};
|
|
|
|
const tsconfigs = workspaceRoots.flatMap((root) => findTsconfigs(root)).sort();
|
|
|
|
if (tsconfigs.length === 0) {
|
|
console.log("No workspace tsconfig.json files found.");
|
|
process.exit(0);
|
|
}
|
|
|
|
let failed = false;
|
|
const bunExecutable = process.execPath;
|
|
|
|
for (const tsconfig of tsconfigs) {
|
|
const label = relative(process.cwd(), tsconfig);
|
|
console.log(`\nTypechecking ${label}`);
|
|
|
|
const result = Bun.spawnSync(
|
|
[
|
|
bunExecutable,
|
|
"x",
|
|
"tsc",
|
|
"-p",
|
|
tsconfig,
|
|
"--noEmit",
|
|
"--incremental",
|
|
"false",
|
|
"--pretty",
|
|
"false"
|
|
],
|
|
{
|
|
stdout: "inherit",
|
|
stderr: "inherit"
|
|
}
|
|
);
|
|
|
|
if (result.exitCode !== 0) {
|
|
failed = true;
|
|
}
|
|
}
|
|
|
|
if (failed) {
|
|
console.error("\nTypecheck failed.");
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log("\nTypecheck passed.");
|