beesbuild
Version:
构建工具链
117 lines (116 loc) • 4.27 kB
JavaScript
import path from "path";
import chalk from "chalk-unified";
import { consola, runSync } from "@beesbuild/utils";
import glob from "fast-glob";
import { flattenDeep, isString, mergeWith, uniq } from "lodash-unified";
import { getBuildContext } from "./utils/getBuildContext.mjs";
async function _rimraf(ctx, rimrafOptions) {
var _a;
const options = ctx.options;
const rootDir = ctx.options.rootDir;
let rimraf2 = (_a = ctx.options.rimraf) != null ? _a : {};
if (!rimrafOptions) {
rimraf2 = mergeWith({}, rimraf2, rimrafOptions != null ? rimrafOptions : {}, (value, srcValue, key) => {
if (key === "dirs") {
return uniq(flattenDeep([srcValue, value]).filter(Boolean));
}
});
}
if (!(rimraf2 == null ? void 0 : rimraf2.dirs) || rimraf2.dirs.length === 0 || !rimraf2) return;
const excludeFiles = [];
const filter = typeof options.filter === "string" ? options.filter.replace(/^((\.?)+(\/)+)+/, "") : "";
const includeFiles = rimraf2.dirs.reduce((dirs, dir) => {
if (dir.includes(".")) return dirs;
dir = dir.replace(/(\/){1,}$/g, "");
if (/((\.){2,}|(\/){2,})/g.test(dir) || !dir) return dirs;
const exclude = `!**/node_modules/**/${dir}`;
excludeFiles.push(exclude);
if (isString(filter)) {
dir = path.relative(options.rootDir, path.join(options.rootDir, ".", `${filter}/${dir}`));
}
return dirs.concat([dir]);
}, []);
if (options.changedFilesIgnorePattern) excludeFiles.push(options.changedFilesIgnorePattern);
const source = includeFiles.concat(excludeFiles).filter((dir) => !!dir);
if (options.verbose) {
consola.info(chalk.blue(`\u76EE\u5F55\u7B5B\u9009\u6761\u4EF6\uFF1A${options.rootDir}`));
source.forEach((v) => consola.info(`> ${chalk.cyan(v)}`));
}
const directories = [];
const globOptions = {
cwd: options.rootDir,
deep: 5,
absolute: true,
ignore: ["**/.git/**", "**/.svn/**", "**/.hg/**"]
};
if (rimraf2.onlyDirectories) {
directories.push(
...glob.sync(source, {
...globOptions,
onlyDirectories: true
})
);
}
if (directories.length > 0) {
await Promise.allSettled(
directories.map((dir) => runSync(`rimraf ${dir}`, { cwd: process.cwd() }))
);
if (options.verbose) {
consola.info(chalk.blue(`\u9700\u8981\u5220\u9664\u7684\u76EE\u5F55\u6570\u91CF\uFF1A${directories.length}`));
directories.forEach(
(dir) => consola.info(chalk.cyan("> \u5220\u9664\u76EE\u5F55\uFF1A"), path.relative(options.rootDir, dir))
);
}
} else {
consola.warn(chalk.cyan("\u6CA1\u6709\u9700\u8981\u5220\u9664\u7684\u76EE\u5F55"));
}
if (!rimraf2.onlyFiles) return;
const files = [];
const fileGlobOptions = {
...globOptions,
onlyFiles: true,
ignore: ["**/node_modules/**"]
};
for (const dir of rimraf2.dirs) {
const [a, ...dirs] = dir.split("/");
if (!dir.includes(".") || !/^\w+/.test(a)) continue;
const suffix = dirs.pop();
const source2 = suffix ? dirs.concat([suffix]) : dirs;
const r = filter ? `${filter}/${a}` : a;
const dirss = glob.sync(r, {
...globOptions,
ignore: ["**/node_modules/**"],
deep: 5,
onlyDirectories: true
});
if (dirss.length === 0) continue;
const source22 = dirss.map((dir2) => `${path.relative(rootDir, dir2)}/${source2.join("/")}`);
if (options.verbose) {
consola.info(chalk.blue("\u6587\u4EF6\u7B5B\u9009\u6761\u4EF6\uFF1A"));
source22.forEach((v) => consola.info(`> ${chalk.cyan(v)}`));
}
files.push(...glob.sync(source22, fileGlobOptions));
}
if (files.length === 0) {
return consola.warn(chalk.cyan("\u6CA1\u6709\u9700\u8981\u5220\u9664\u7684\u6587\u4EF6"));
}
if (options.verbose) {
await Promise.allSettled(
files.map(
(dir) => runSync(`rimraf ${dir}`, {
cwd: process.cwd()
})
)
);
consola.info(chalk.blue(`\u9700\u8981\u5220\u9664\u7684\u6587\u4EF6\u6570\u91CF\uFF1A${files.length}`));
files.forEach((dir) => consola.info(chalk.cyan("> \u5220\u9664\u6587\u4EF6\uFF1A"), path.relative(rootDir, dir)));
}
}
async function rimraf(options) {
const ctx = await getBuildContext(options);
await _rimraf(ctx, options);
}
export {
_rimraf,
rimraf
};