47 lines
1.6 KiB
JavaScript
47 lines
1.6 KiB
JavaScript
import { rm } from 'node:fs/promises';
|
|
import { dirname, relative, resolve } from 'node:path';
|
|
import {
|
|
assertInsideDir,
|
|
readPackageJson,
|
|
resolvePackagePath,
|
|
resolvePackageRoot,
|
|
toPosixPath,
|
|
} from './package-utils.mjs';
|
|
|
|
const packageRoot = resolvePackageRoot();
|
|
const packageJson = readPackageJson(packageRoot);
|
|
const packageName = packageJson.name ?? packageRoot;
|
|
const targetDirs = getCleanTargetDirs(packageJson).map(target =>
|
|
resolvePackagePath(packageRoot, target, 'clean target'),
|
|
);
|
|
|
|
for (const targetDir of [...new Set(targetDirs.map(dir => resolve(dir)))]) {
|
|
assertInsideDir(packageRoot, targetDir, 'Clean target');
|
|
|
|
if (resolve(targetDir) === resolve(packageRoot)) {
|
|
throw new Error(`Refusing to clean the package root: ${targetDir}`);
|
|
}
|
|
|
|
await rm(targetDir, { recursive: true, force: true });
|
|
console.log(`[package-clean] Removed ${formatPackagePath(targetDir)} for ${packageName}.`);
|
|
}
|
|
|
|
function getCleanTargetDirs(metadata) {
|
|
const configuredTargets = metadata.aholoClean?.targets;
|
|
|
|
if (Array.isArray(configuredTargets) && configuredTargets.length > 0) {
|
|
return configuredTargets;
|
|
}
|
|
|
|
const outputDirs = [metadata.main, metadata.module, metadata.types, metadata.typings]
|
|
.filter(value => typeof value === 'string' && value.trim() !== '')
|
|
.map(filePath => dirname(filePath))
|
|
.filter(dir => dir !== '.');
|
|
|
|
return outputDirs.length > 0 ? [...new Set(outputDirs)] : ['dist'];
|
|
}
|
|
|
|
function formatPackagePath(filePath) {
|
|
return toPosixPath(relative(packageRoot, filePath));
|
|
}
|