UNPKG

beesbuild

Version:

构建工具链

117 lines (116 loc) 4.27 kB
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 };