From 01ccc973513e00968cfddd3b05eba089ebaf42c1 Mon Sep 17 00:00:00 2001 From: EGOIST <0x142857@gmail.com> Date: Mon, 1 Mar 2021 22:07:59 +0800 Subject: [PATCH] feat: add --clean flag --- src/cli.ts | 1 + src/index.ts | 9 +++++++++ src/rollup.ts | 22 +++++++++++++++++----- src/utils.ts | 9 +++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index 63f360e..9b7db0a 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -56,6 +56,7 @@ async function main() { ) .option('--replaceNodeEnv', 'Replace process.env.NODE_ENV') .option('--no-splitting', 'Disable code splitting') + .option('--clean', 'Clean output directory') .action(async (files: string[], flags) => { const { build } = await import('./') const options: Options = { diff --git a/src/index.ts b/src/index.ts index 0aeca34..bf0ff24 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,6 +11,7 @@ import { loadPkg, getBabel, loadTsupConfig, + removeFiles, } from './utils' import { FSWatcher } from 'chokidar' import glob from 'globby' @@ -74,6 +75,10 @@ export type Options = { * You may want to disable code splitting sometimes: #255 */ splitting?: boolean + /** + * Clean output directory before each build + */ + clean?: boolean } export type NormalizedOptions = MarkRequired< @@ -354,6 +359,10 @@ export async function build(_options: Options) { } const buildAll = async () => { + if (options.clean) { + await removeFiles(['**/*', '!**/*.d.ts'], options.outDir) + } + const css: Map = new Map() await Promise.all([ ...options.format.map((format, index) => diff --git a/src/rollup.ts b/src/rollup.ts index ab469c2..efdf04a 100644 --- a/src/rollup.ts +++ b/src/rollup.ts @@ -1,20 +1,22 @@ import { parentPort } from 'worker_threads' -import { InputOptions, OutputOptions } from 'rollup' -import { Options, makeLabel } from './' +import { InputOptions, OutputOptions, Plugin } from 'rollup' +import { makeLabel, NormalizedOptions } from './' import hashbangPlugin from 'rollup-plugin-hashbang' import jsonPlugin from '@rollup/plugin-json' import nodeResolvePlugin, { RollupNodeResolveOptions, } from '@rollup/plugin-node-resolve' import { handlError } from './errors' -import { getDeps } from './utils' +import { getDeps, removeFiles } from './utils' type RollupConfig = { inputConfig: InputOptions outputConfig: OutputOptions } -const getRollupConfig = async (options: Options): Promise => { +const getRollupConfig = async ( + options: NormalizedOptions +): Promise => { const dtsOptions = typeof options.dts === 'string' ? { entry: options.dts } @@ -38,6 +40,15 @@ const getRollupConfig = async (options: Options): Promise => { const deps = await getDeps(process.cwd()) + const tsupCleanPlugin: Plugin = { + name: 'tsup:clean', + async buildStart() { + if (options.clean) { + await removeFiles(['**/*.d.ts'], options.outDir) + } + }, + } + return { inputConfig: { input: dtsOptions.entry, @@ -52,6 +63,7 @@ const getRollupConfig = async (options: Options): Promise => { return handler(warning) }, plugins: [ + tsupCleanPlugin, nodeResolveOptions && nodeResolvePlugin(nodeResolveOptions), hashbangPlugin(), jsonPlugin(), @@ -113,7 +125,7 @@ async function watchRollup(options: { }) } -parentPort?.on('message', async (data: { options: Options }) => { +parentPort?.on('message', async (data: { options: NormalizedOptions }) => { const config = await getRollupConfig(data.options) if (data.options.watch) { watchRollup(config) diff --git a/src/utils.ts b/src/utils.ts index 768bae3..8b89cbf 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -5,6 +5,7 @@ import stripJsonComments from 'strip-json-comments' import resovleFrom from 'resolve-from' import { parse as parseJson } from 'jju/lib/parse' import { transform } from 'sucrase' +import glob from 'globby' import { requireFromString } from './require-from-string' const joycon = new JoyCon() @@ -139,3 +140,11 @@ export function loadTsupConfig(cwd: string) { path.dirname(cwd) ) } + +export async function removeFiles(patterns: string[], dir: string) { + const files = await glob(patterns, { + cwd: dir, + absolute: true, + }) + await Promise.all(files.map((file) => fs.promises.unlink(file))) +}