{"version":3,"sources":["../src/clean-webpack-plugin.ts"],"names":["isPlainObject","value","Object","prototype","toString","call","getPrototypeOf","CleanWebpackPlugin","constructor","options","Error","allowExternal","dangerouslyAllowCleanPatternsOutsideProject","dry","console","warn","verbose","cleanStaleWebpackAssets","protectWebpackAssets","cleanAfterEveryBuildPatterns","Array","isArray","cleanOnceBeforeBuildPatterns","currentAssets","initialClean","outputPath","apply","bind","handleInitial","handleDone","removeFiles","compiler","output","path","hooks","length","emit","tap","compilation","plugin","callback","error","done","stats","getStats","hasErrors","assets","toJson","assetList","map","asset","name","staleFiles","filter","previousAsset","assetCurrent","includes","sort","removePatterns","push","patterns","deleted","force","cwd","dryRun","dot","ignore","forEach","file","filename","relative","process","message","needsForce","test"],"mappings":"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","sourcesContent":["import path from 'path';\nimport { sync as delSync } from 'del';\nimport { Compiler, Stats, compilation as compilationType } from 'webpack';\n\ntype Compilation = compilationType.Compilation;\n\nexport interface Options {\n    /**\n     * Simulate the removal of files\n     *\n     * default: false\n     */\n    dry?: boolean;\n\n    /**\n     * Write Logs to Console\n     * (Always enabled when dry is true)\n     *\n     * default: false\n     */\n    verbose?: boolean;\n\n    /**\n     * Automatically remove all unused webpack assets on rebuild\n     *\n     * default: true\n     */\n    cleanStaleWebpackAssets?: boolean;\n\n    /**\n     * Do not allow removal of current webpack assets\n     *\n     * default: true\n     */\n    protectWebpackAssets?: boolean;\n\n    /**\n     * Removes files once prior to Webpack compilation\n     *   Not included in rebuilds (watch mode)\n     *\n     * Use !negative patterns to exclude files\n     *\n     * default: ['**\\/*']\n     */\n    cleanOnceBeforeBuildPatterns?: string[];\n\n    /**\n     * Removes files after every build (including watch mode) that match this pattern.\n     * Used for files that are not created directly by Webpack.\n     *\n     * Use !negative patterns to exclude files\n     *\n     * default: []\n     */\n    cleanAfterEveryBuildPatterns?: string[];\n\n    /**\n     * Allow clean patterns outside of process.cwd()\n     *\n     * requires dry option to be explicitly set\n     *\n     * default: false\n     */\n    dangerouslyAllowCleanPatternsOutsideProject?: boolean;\n}\n\n// Copied from https://github.com/sindresorhus/is-plain-obj/blob/97480673cf12145b32ec2ee924980d66572e8a86/index.js\nfunction isPlainObject(value: unknown): boolean {\n    if (Object.prototype.toString.call(value) !== '[object Object]') {\n        return false;\n    }\n\n    const prototype = Object.getPrototypeOf(value);\n    return prototype === null || prototype === Object.getPrototypeOf({});\n}\n\nclass CleanWebpackPlugin {\n    private readonly dry: boolean;\n    private readonly verbose: boolean;\n    private readonly cleanStaleWebpackAssets: boolean;\n    private readonly protectWebpackAssets: boolean;\n    private readonly cleanAfterEveryBuildPatterns: string[];\n    private readonly cleanOnceBeforeBuildPatterns: string[];\n    private readonly dangerouslyAllowCleanPatternsOutsideProject: boolean;\n    private currentAssets: string[];\n    private initialClean: boolean;\n    private outputPath: string;\n\n    constructor(options: Options = {}) {\n        if (isPlainObject(options) === false) {\n            throw new Error(`clean-webpack-plugin only accepts an options object. See:\n            https://github.com/johnagan/clean-webpack-plugin#options-and-defaults-optional`);\n        }\n\n        // @ts-ignore\n        if (options.allowExternal) {\n            throw new Error(\n                'clean-webpack-plugin: `allowExternal` option no longer supported. Use `dangerouslyAllowCleanPatternsOutsideProject`',\n            );\n        }\n\n        if (\n            options.dangerouslyAllowCleanPatternsOutsideProject === true &&\n            options.dry !== true &&\n            options.dry !== false\n        ) {\n            // eslint-disable-next-line no-console\n            console.warn(\n                'clean-webpack-plugin: dangerouslyAllowCleanPatternsOutsideProject requires dry: false to be explicitly set. Enabling dry mode',\n            );\n        }\n\n        this.dangerouslyAllowCleanPatternsOutsideProject =\n            options.dangerouslyAllowCleanPatternsOutsideProject === true ||\n            false;\n\n        this.dry =\n            options.dry === true || options.dry === false\n                ? options.dry\n                : this.dangerouslyAllowCleanPatternsOutsideProject === true ||\n                  false;\n\n        this.verbose = this.dry === true || options.verbose === true || false;\n\n        this.cleanStaleWebpackAssets =\n            options.cleanStaleWebpackAssets === true ||\n            options.cleanStaleWebpackAssets === false\n                ? options.cleanStaleWebpackAssets\n                : true;\n\n        this.protectWebpackAssets =\n            options.protectWebpackAssets === true ||\n            options.protectWebpackAssets === false\n                ? options.protectWebpackAssets\n                : true;\n\n        this.cleanAfterEveryBuildPatterns = Array.isArray(\n            options.cleanAfterEveryBuildPatterns,\n        )\n            ? options.cleanAfterEveryBuildPatterns\n            : [];\n\n        this.cleanOnceBeforeBuildPatterns = Array.isArray(\n            options.cleanOnceBeforeBuildPatterns,\n        )\n            ? options.cleanOnceBeforeBuildPatterns\n            : ['**/*'];\n\n        /**\n         * Store webpack build assets\n         */\n        this.currentAssets = [];\n\n        /**\n         * Only used with cleanOnceBeforeBuildPatterns\n         */\n        this.initialClean = false;\n\n        this.outputPath = '';\n\n        this.apply = this.apply.bind(this);\n        this.handleInitial = this.handleInitial.bind(this);\n        this.handleDone = this.handleDone.bind(this);\n        this.removeFiles = this.removeFiles.bind(this);\n    }\n\n    apply(compiler: Compiler) {\n        if (!compiler.options.output || !compiler.options.output.path) {\n            // eslint-disable-next-line no-console\n            console.warn(\n                'clean-webpack-plugin: options.output.path not defined. Plugin disabled...',\n            );\n\n            return;\n        }\n\n        this.outputPath = compiler.options.output.path;\n\n        /**\n         * webpack 4+ comes with a new plugin system.\n         *\n         * Check for hooks in-order to support old plugin system\n         */\n        const hooks = compiler.hooks;\n\n        if (this.cleanOnceBeforeBuildPatterns.length !== 0) {\n            if (hooks) {\n                hooks.emit.tap('clean-webpack-plugin', (compilation) => {\n                    this.handleInitial(compilation);\n                });\n            } else {\n                compiler.plugin('emit', (compilation, callback) => {\n                    try {\n                        this.handleInitial(compilation);\n\n                        callback();\n                    } catch (error) {\n                        callback(error);\n                    }\n                });\n            }\n        }\n\n        if (hooks) {\n            hooks.done.tap('clean-webpack-plugin', (stats) => {\n                this.handleDone(stats);\n            });\n        } else {\n            compiler.plugin('done', (stats) => {\n                this.handleDone(stats);\n            });\n        }\n    }\n\n    /**\n     * Initially remove files from output directory prior to build.\n     *\n     * Only happens once.\n     *\n     * Warning: It is recommended to initially clean your build directory outside of webpack to minimize unexpected behavior.\n     */\n    handleInitial(compilation: Compilation) {\n        if (this.initialClean) {\n            return;\n        }\n\n        /**\n         * Do not remove files if there are compilation errors\n         *\n         * Handle logging inside this.handleDone\n         */\n        const stats = compilation.getStats();\n        if (stats.hasErrors()) {\n            return;\n        }\n\n        this.initialClean = true;\n\n        this.removeFiles(this.cleanOnceBeforeBuildPatterns);\n    }\n\n    handleDone(stats: Stats) {\n        /**\n         * Do nothing if there is a webpack error\n         */\n        if (stats.hasErrors()) {\n            if (this.verbose) {\n                // eslint-disable-next-line no-console\n                console.warn(\n                    'clean-webpack-plugin: pausing due to webpack errors',\n                );\n            }\n\n            return;\n        }\n\n        /**\n         * Fetch Webpack's output asset files\n         */\n        const assets = stats.toJson().assets || [];\n        const assetList = assets.map((asset: { name: string }) => {\n            return asset.name;\n        });\n\n        /**\n         * Get all files that were in the previous build but not the current\n         *\n         * (relies on del's cwd: outputPath option)\n         */\n        const staleFiles = this.currentAssets.filter((previousAsset) => {\n            const assetCurrent = assetList.includes(previousAsset) === false;\n\n            return assetCurrent;\n        });\n\n        /**\n         * Save assets for next compilation\n         */\n        this.currentAssets = assetList.sort();\n\n        const removePatterns = [];\n\n        /**\n         * Remove unused webpack assets\n         */\n        if (this.cleanStaleWebpackAssets === true && staleFiles.length !== 0) {\n            removePatterns.push(...staleFiles);\n        }\n\n        /**\n         * Remove cleanAfterEveryBuildPatterns\n         */\n        if (this.cleanAfterEveryBuildPatterns.length !== 0) {\n            removePatterns.push(...this.cleanAfterEveryBuildPatterns);\n        }\n\n        if (removePatterns.length !== 0) {\n            this.removeFiles(removePatterns);\n        }\n    }\n\n    removeFiles(patterns: string[]) {\n        try {\n            const deleted = delSync(patterns, {\n                force: this.dangerouslyAllowCleanPatternsOutsideProject,\n                // Change context to build directory\n                cwd: this.outputPath,\n                dryRun: this.dry,\n                dot: true,\n                ignore: this.protectWebpackAssets ? this.currentAssets : [],\n            });\n\n            /**\n             * Log if verbose is enabled\n             */\n            if (this.verbose) {\n                deleted.forEach((file) => {\n                    const filename = path.relative(process.cwd(), file);\n\n                    const message = this.dry ? 'dry' : 'removed';\n\n                    /**\n                     * Use console.warn over .log\n                     * https://github.com/webpack/webpack/issues/1904\n                     * https://github.com/johnagan/clean-webpack-plugin/issues/11\n                     */\n                    // eslint-disable-next-line no-console\n                    console.warn(\n                        `clean-webpack-plugin: ${message} ${filename}`,\n                    );\n                });\n            }\n        } catch (error) {\n            const needsForce = /Cannot delete files\\/folders outside the current working directory\\./.test(\n                error.message,\n            );\n\n            if (needsForce) {\n                const message =\n                    'clean-webpack-plugin: Cannot delete files/folders outside the current working directory. Can be overridden with the `dangerouslyAllowCleanPatternsOutsideProject` option.';\n\n                throw new Error(message);\n            }\n\n            throw error;\n        }\n    }\n}\n\nexport { CleanWebpackPlugin };\n"],"file":"clean-webpack-plugin.js"}