60 lines · 1.7 KB · TypeScript
RawDownload
#!/usr/bin/env bunimport fs from "node:fs";import path from "node:path";import { fileURLToPath } from "node:url"; const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); const rootTargets = ["node_modules", ".turbo", ".astro", "dist"];for (const name of rootTargets) {  const p = path.join(root, name);  if (fs.existsSync(p)) {    try {      fs.rmSync(p, { recursive: true, force: true });      console.log("removed", p);    } catch (e: any) {      console.warn("skipped (in use?):", p, "-", e.message);    }  }} const nestedTargets = new Set(["node_modules", "dist", ".turbo", ".output", ".astro"]);const nestedGlobs = /\.tsbuildinfo$/;const searchRoots = ["apps", "packages"];const maxDepth = 5; function clean(dir: string, depth: number) {  if (depth > maxDepth) return;  let entries: fs.Dirent[];  try {    entries = fs.readdirSync(dir, { withFileTypes: true });  } catch {    return;  }  for (const entry of entries) {    const full = path.join(dir, entry.name);    if (entry.isDirectory()) {      if (nestedTargets.has(entry.name)) {        try {          fs.rmSync(full, { recursive: true, force: true });          console.log("removed", full);        } catch (e: any) {          console.warn("skipped (in use?):", full, "-", e.message);        }      } else {        clean(full, depth + 1);      }    } else if (entry.isFile() && nestedGlobs.test(entry.name)) {      try {        fs.rmSync(full, { force: true });        console.log("removed", full);      } catch (e: any) {        console.warn("skipped (in use?):", full, "-", e.message);      }    }  }} for (const dir of searchRoots) {  clean(path.join(root, dir), 1);}