/** * Clean the repository of build and execution artifacts. * * clean: A quick clean that removes all build artifacts making the output safe to publish * clean-tests: Removes all build and test artifacts should not be required if tests are setup correctly. * clean-all: Removes all build, test, and execution artifacts. Including cluster config and logs! */ import path from "node:path"; import fs from "node:fs/promises"; import yargs from "yargs"; import npmPackage from "./package.json" with { type: "json" }; const workspaces = npmPackage.workspaces .map(p => p.slice(0, -2)) .filter(p => !p.includes("external_plugins")); let DRY = false; /** * Attempt to remove a file / directory if it exists. * * @param {string} filePath The path to remove. */ async function tryRemove(filePath) { try { await fs.access(filePath); console.log(filePath); } catch { return; } if (!DRY) { await fs.rm(filePath, { force: true, recursive: true, maxRetries: 10 }); } } /** * Removes all build artifacts */ async function removeBuildArtifacts() { const tasks = []; for (const workspace of workspaces) { const basePath = path.resolve(workspace); const packages = await fs.readdir(basePath); for (const packageName of packages) { tasks.push( tryRemove(path.join(basePath, packageName, "dist")) ); tasks.push( tryRemove(path.join(basePath, packageName, "node_modules", ".vite")) ); } } await Promise.all(tasks); } /** * Removes all test artifacts */ async function removeTestArtifacts() { const artifacts = [ ".nyc_output", "coverage", "temp", "static", ]; await Promise.all(artifacts.map(artifact => tryRemove(path.resolve(artifact)))); } /** * Removes all execution artifacts */ async function removeExecutionArtifacts() { const artifacts = [ "database", "instances", "logs", "mods", "config-ctl.json", "config-controller.json", "config-host.json", "FactorioAdminToken.txt", "plugin-list.json", ]; await Promise.all(artifacts.map(artifact => tryRemove(path.resolve(artifact)))); } /** * Main function for this script */ async function main() { await yargs(process.argv.slice(2)) .scriptName("clean") .option("dry-run", { alias: "dry", nargs: 0, describe: "Will not delete any files", default: false, type: "boolean", }) .command("all", "Remove all artifacts", () => {}, argv => { DRY = argv.dry; removeBuildArtifacts(); removeTestArtifacts(); removeExecutionArtifacts(); }) .command("tests", "Remove all build and test artifacts", () => {}, argv => { DRY = argv.dry; removeBuildArtifacts(); removeTestArtifacts(); }) .command("$0", "Remove all build artifacts", () => {}, argv => { DRY = argv.dry; removeBuildArtifacts(); }) .demandCommand(1, "A command must be specified") .strict() .parse(); } // Run main if started from command line if (import.meta.main) { main(); }