nuka-code
Version:
A package brought to you by the Nuka-Cola Corporation to zap away those pesky `cache`, `node_modules`, and other related files & directories.
139 lines (131 loc) • 3.84 kB
JavaScript
;
var path3 = require('path');
var ignore = require('ignore');
var rimraf = require('rimraf');
var promises = require('fs/promises');
require('consola');
require('fs');
require('ts-pattern');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var path3__default = /*#__PURE__*/_interopDefault(path3);
var ignore__default = /*#__PURE__*/_interopDefault(ignore);
// src/nuke.ts
// src/lib/project.ts
var FILE_IGNORE = ".nukeignore";
var ignoreFileCache = null;
async function readIgnoreFile(filePath = process.cwd()) {
try {
if (ignoreFileCache) {
return ignoreFileCache;
}
const ignoreFile = path3__default.default.join(filePath, FILE_IGNORE);
ignoreFileCache = await promises.readFile(ignoreFile, "utf8");
return ignoreFileCache;
} catch (error) {
return null;
}
}
function unique(array) {
return Array.from(new Set(array));
}
function toDeepGlob(filePaths) {
return unique(
filePaths.flatMap((filePath) => {
if (filePath.includes("node_modules")) {
return [filePath, `**/${filePath}`];
}
return [filePath, `**/[!node_modules]**/${filePath}`];
})
);
}
// src/nuke.ts
async function nukeEverything(rootDir = process.cwd()) {
const runId = Date.now();
const cache = await nukeCache(rootDir, runId);
const builds = await nukeBuilds(rootDir, runId);
const nodeModules = await nukeNodeModules(rootDir, runId);
return {
cache,
builds,
node_modules: nodeModules
};
}
async function nukeNodeModules(rootDir = process.cwd(), runId = Date.now()) {
const ignoreHelper = await createIgnoreFileHelper(rootDir);
return await rimraf.rimraf(getNukeNodeModulesGlob(), {
glob: true,
filter: async (filePath) => {
return !ignoreHelper.test(path3__default.default.relative(rootDir, filePath)).ignored;
}
});
}
async function nukeCache(rootDir = process.cwd(), runId = Date.now()) {
const ignoreHelper = await createIgnoreFileHelper(rootDir);
return await rimraf.rimraf(getNukeCacheGlob(), {
glob: true,
filter: async (filePath) => {
return !ignoreHelper.test(path3__default.default.relative(rootDir, filePath)).ignored;
}
});
}
async function nukeBuilds(rootDir = process.cwd(), runId = Date.now()) {
const ignoreHelper = await createIgnoreFileHelper(rootDir);
return await rimraf.rimraf(getNukeBuildsGlob(), {
glob: true,
filter: async (filePath) => {
return !ignoreHelper.test(path3__default.default.relative(rootDir, filePath)).ignored;
}
});
}
function getNukeEverythingGlob() {
return unique([
...getNukeNodeModulesGlob(),
...getNukeCacheGlob(),
...getNukeBuildsGlob()
]);
}
function getNukeNodeModulesGlob() {
return [
// Deeply nested node_modules
"node_modules",
"**/node_modules",
// Yarn 2+
".pnp.cjs",
".pnp.loader.mjs"
];
}
function getNukeCacheGlob() {
return toDeepGlob([".turbo", ".nx/cache"]);
}
function getNukeBuildsGlob() {
return toDeepGlob([
"dist",
"out",
"output",
"outputs",
"bundle",
// Frameworks
".vercel",
".next",
".nuxt",
".svelte-kit",
".vinxi",
".vuepress/dist",
"storybook-static",
"coverage",
"public/build"
]);
}
async function createIgnoreFileHelper(rootDir = process.cwd()) {
const ignoreFile = await readIgnoreFile(rootDir);
return ignore__default.default().add(ignoreFile ?? "");
}
exports.createIgnoreFileHelper = createIgnoreFileHelper;
exports.getNukeBuildsGlob = getNukeBuildsGlob;
exports.getNukeCacheGlob = getNukeCacheGlob;
exports.getNukeEverythingGlob = getNukeEverythingGlob;
exports.getNukeNodeModulesGlob = getNukeNodeModulesGlob;
exports.nukeBuilds = nukeBuilds;
exports.nukeCache = nukeCache;
exports.nukeEverything = nukeEverything;
exports.nukeNodeModules = nukeNodeModules;