Linux unitednationsplay.com 3.10.0-1160.45.1.el7.x86_64 #1 SMP Wed Oct 13 17:20:51 UTC 2021 x86_64
nginx/1.20.1
Server IP : 188.130.139.92 & Your IP : 3.140.201.179
Domains :
Cant Read [ /etc/named.conf ]
User : web
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
home /
www /
wb /
node_modules /
webpack /
lib /
Delete
Unzip
Name
Size
Permission
Date
Action
asset
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
async-modules
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
cache
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
config
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
container
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
css
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
debug
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
dependencies
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
electron
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
errors
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
esm
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
hmr
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
ids
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
javascript
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
json
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
library
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
logging
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
node
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
optimize
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
performance
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
prefetch
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
rules
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
runtime
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
schemes
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
serialization
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
sharing
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
stats
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
util
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
wasm
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
wasm-async
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
wasm-sync
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
web
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
webworker
[ DIR ]
drwxrwxr-x
2022-08-30 11:49
APIPlugin.js
6.72
KB
-rw-rw-r--
2022-08-30 11:49
AbstractMethodError.js
1.11
KB
-rw-rw-r--
2022-08-30 11:49
AsyncDependenciesBlock.js
2.86
KB
-rw-rw-r--
2022-08-30 11:49
AsyncDependencyToInitialChunkError.js
913
B
-rw-rw-r--
2022-08-30 11:49
AutomaticPrefetchPlugin.js
1.46
KB
-rw-rw-r--
2022-08-30 11:49
BannerPlugin.js
2.93
KB
-rw-rw-r--
2022-08-30 11:49
Cache.js
3.88
KB
-rw-rw-r--
2022-08-30 11:49
CacheFacade.js
8.38
KB
-rw-rw-r--
2022-08-30 11:49
CaseSensitiveModulesWarning.js
2.06
KB
-rw-rw-r--
2022-08-30 11:49
Chunk.js
21.1
KB
-rw-rw-r--
2022-08-30 11:49
ChunkGraph.js
49.33
KB
-rw-rw-r--
2022-08-30 11:49
ChunkGroup.js
14.77
KB
-rw-rw-r--
2022-08-30 11:49
ChunkRenderError.js
657
B
-rw-rw-r--
2022-08-30 11:49
ChunkTemplate.js
3.9
KB
-rw-rw-r--
2022-08-30 11:49
CleanPlugin.js
11.24
KB
-rw-rw-r--
2022-08-30 11:49
CodeGenerationError.js
619
B
-rw-rw-r--
2022-08-30 11:49
CodeGenerationResults.js
4.36
KB
-rw-rw-r--
2022-08-30 11:49
CommentCompilationWarning.js
729
B
-rw-rw-r--
2022-08-30 11:49
CompatibilityPlugin.js
4.54
KB
-rw-rw-r--
2022-08-30 11:49
Compilation.js
157.69
KB
-rw-rw-r--
2022-08-30 11:49
Compiler.js
35.03
KB
-rw-rw-r--
2022-08-30 11:49
ConcatenationScope.js
4.53
KB
-rw-rw-r--
2022-08-30 11:49
ConcurrentCompilationError.js
441
B
-rw-rw-r--
2022-08-30 11:49
ConditionalInitFragment.js
3.36
KB
-rw-rw-r--
2022-08-30 11:49
ConstPlugin.js
14.42
KB
-rw-rw-r--
2022-08-30 11:49
ContextExclusionPlugin.js
797
B
-rw-rw-r--
2022-08-30 11:49
ContextModule.js
33.63
KB
-rw-rw-r--
2022-08-30 11:49
ContextModuleFactory.js
12.3
KB
-rw-rw-r--
2022-08-30 11:49
ContextReplacementPlugin.js
4.61
KB
-rw-rw-r--
2022-08-30 11:49
DefinePlugin.js
16.28
KB
-rw-rw-r--
2022-08-30 11:49
DelegatedModule.js
7.08
KB
-rw-rw-r--
2022-08-30 11:49
DelegatedModuleFactoryPlugin.js
2.28
KB
-rw-rw-r--
2022-08-30 11:49
DelegatedPlugin.js
1015
B
-rw-rw-r--
2022-08-30 11:49
DependenciesBlock.js
2.53
KB
-rw-rw-r--
2022-08-30 11:49
Dependency.js
9.36
KB
-rw-rw-r--
2022-08-30 11:49
DependencyTemplate.js
2.43
KB
-rw-rw-r--
2022-08-30 11:49
DependencyTemplates.js
1.69
KB
-rw-rw-r--
2022-08-30 11:49
DllEntryPlugin.js
1.25
KB
-rw-rw-r--
2022-08-30 11:49
DllModule.js
4.4
KB
-rw-rw-r--
2022-08-30 11:49
DllModuleFactory.js
1008
B
-rw-rw-r--
2022-08-30 11:49
DllPlugin.js
1.66
KB
-rw-rw-r--
2022-08-30 11:49
DllReferencePlugin.js
5.01
KB
-rw-rw-r--
2022-08-30 11:49
DynamicEntryPlugin.js
1.99
KB
-rw-rw-r--
2022-08-30 11:49
EntryOptionPlugin.js
2.77
KB
-rw-rw-r--
2022-08-30 11:49
EntryPlugin.js
1.7
KB
-rw-rw-r--
2022-08-30 11:49
Entrypoint.js
2.95
KB
-rw-rw-r--
2022-08-30 11:49
EnvironmentPlugin.js
1.7
KB
-rw-rw-r--
2022-08-30 11:49
ErrorHelpers.js
1.42
KB
-rw-rw-r--
2022-08-30 11:49
EvalDevToolModulePlugin.js
3.67
KB
-rw-rw-r--
2022-08-30 11:49
EvalSourceMapDevToolPlugin.js
6.67
KB
-rw-rw-r--
2022-08-30 11:49
ExportsInfo.js
42.96
KB
-rw-rw-r--
2022-08-30 11:49
ExportsInfoApiPlugin.js
2.02
KB
-rw-rw-r--
2022-08-30 11:49
ExternalModule.js
21.94
KB
-rw-rw-r--
2022-08-30 11:49
ExternalModuleFactoryPlugin.js
7.06
KB
-rw-rw-r--
2022-08-30 11:49
ExternalsPlugin.js
899
B
-rw-rw-r--
2022-08-30 11:49
FileSystemInfo.js
102.03
KB
-rw-rw-r--
2022-08-30 11:49
FlagAllModulesAsUsedPlugin.js
1.42
KB
-rw-rw-r--
2022-08-30 11:49
FlagDependencyExportsPlugin.js
12.91
KB
-rw-rw-r--
2022-08-30 11:49
FlagDependencyUsagePlugin.js
10.74
KB
-rw-rw-r--
2022-08-30 11:49
FlagEntryExportAsUsedPlugin.js
1.34
KB
-rw-rw-r--
2022-08-30 11:49
Generator.js
4.73
KB
-rw-rw-r--
2022-08-30 11:49
GraphHelpers.js
1.05
KB
-rw-rw-r--
2022-08-30 11:49
HarmonyLinkingError.js
357
B
-rw-rw-r--
2022-08-30 11:49
HookWebpackError.js
2.03
KB
-rw-rw-r--
2022-08-30 11:49
HotModuleReplacementPlugin.js
25.72
KB
-rw-rw-r--
2022-08-30 11:49
HotUpdateChunk.js
353
B
-rw-rw-r--
2022-08-30 11:49
IgnoreErrorModuleFactory.js
1.02
KB
-rw-rw-r--
2022-08-30 11:49
IgnorePlugin.js
2.2
KB
-rw-rw-r--
2022-08-30 11:49
IgnoreWarningsPlugin.js
964
B
-rw-rw-r--
2022-08-30 11:49
InitFragment.js
4.54
KB
-rw-rw-r--
2022-08-30 11:49
InvalidDependenciesModuleWarning.js
1.83
KB
-rw-rw-r--
2022-08-30 11:49
JavascriptMetaInfoPlugin.js
2.03
KB
-rw-rw-r--
2022-08-30 11:49
LibManifestPlugin.js
3.04
KB
-rw-rw-r--
2022-08-30 11:49
LibraryTemplatePlugin.js
1.55
KB
-rw-rw-r--
2022-08-30 11:49
LoaderOptionsPlugin.js
1.81
KB
-rw-rw-r--
2022-08-30 11:49
LoaderTargetPlugin.js
747
B
-rw-rw-r--
2022-08-30 11:49
MainTemplate.js
10.15
KB
-rw-rw-r--
2022-08-30 11:49
Module.js
29.96
KB
-rw-rw-r--
2022-08-30 11:49
ModuleBuildError.js
1.59
KB
-rw-rw-r--
2022-08-30 11:49
ModuleDependencyError.js
1.08
KB
-rw-rw-r--
2022-08-30 11:49
ModuleDependencyWarning.js
1.19
KB
-rw-rw-r--
2022-08-30 11:49
ModuleError.js
1.17
KB
-rw-rw-r--
2022-08-30 11:49
ModuleFactory.js
1.39
KB
-rw-rw-r--
2022-08-30 11:49
ModuleFilenameHelpers.js
7.98
KB
-rw-rw-r--
2022-08-30 11:49
ModuleGraph.js
23.99
KB
-rw-rw-r--
2022-08-30 11:49
ModuleGraphConnection.js
5.09
KB
-rw-rw-r--
2022-08-30 11:49
ModuleHashingError.js
615
B
-rw-rw-r--
2022-08-30 11:49
ModuleInfoHeaderPlugin.js
7.01
KB
-rw-rw-r--
2022-08-30 11:49
ModuleNotFoundError.js
2.55
KB
-rw-rw-r--
2022-08-30 11:49
ModuleParseError.js
3.25
KB
-rw-rw-r--
2022-08-30 11:49
ModuleProfile.js
2.38
KB
-rw-rw-r--
2022-08-30 11:49
ModuleRestoreError.js
957
B
-rw-rw-r--
2022-08-30 11:49
ModuleStoreError.js
951
B
-rw-rw-r--
2022-08-30 11:49
ModuleTemplate.js
3.91
KB
-rw-rw-r--
2022-08-30 11:49
ModuleWarning.js
1.25
KB
-rw-rw-r--
2022-08-30 11:49
MultiCompiler.js
15.67
KB
-rw-rw-r--
2022-08-30 11:49
MultiStats.js
4.12
KB
-rw-rw-r--
2022-08-30 11:49
MultiWatching.js
1.44
KB
-rw-rw-r--
2022-08-30 11:49
NoEmitOnErrorsPlugin.js
713
B
-rw-rw-r--
2022-08-30 11:49
NoModeWarning.js
663
B
-rw-rw-r--
2022-08-30 11:49
NodeStuffInWebError.js
843
B
-rw-rw-r--
2022-08-30 11:49
NodeStuffPlugin.js
5.27
KB
-rw-rw-r--
2022-08-30 11:49
NormalModule.js
41.09
KB
-rw-rw-r--
2022-08-30 11:49
NormalModuleFactory.js
31.6
KB
-rw-rw-r--
2022-08-30 11:49
NormalModuleReplacementPlugin.js
1.84
KB
-rw-rw-r--
2022-08-30 11:49
NullFactory.js
628
B
-rw-rw-r--
2022-08-30 11:49
OptimizationStages.js
204
B
-rw-rw-r--
2022-08-30 11:49
OptionsApply.js
201
B
-rw-rw-r--
2022-08-30 11:49
Parser.js
968
B
-rw-rw-r--
2022-08-30 11:49
PrefetchPlugin.js
1.02
KB
-rw-rw-r--
2022-08-30 11:49
ProgressPlugin.js
16.78
KB
-rw-rw-r--
2022-08-30 11:49
ProvidePlugin.js
2.82
KB
-rw-rw-r--
2022-08-30 11:49
RawModule.js
4.53
KB
-rw-rw-r--
2022-08-30 11:49
RecordIdsPlugin.js
6.66
KB
-rw-rw-r--
2022-08-30 11:49
RequestShortener.js
755
B
-rw-rw-r--
2022-08-30 11:49
RequireJsStuffPlugin.js
1.86
KB
-rw-rw-r--
2022-08-30 11:49
ResolverFactory.js
4.83
KB
-rw-rw-r--
2022-08-30 11:49
RuntimeGlobals.js
9.01
KB
-rw-rw-r--
2022-08-30 11:49
RuntimeModule.js
5.63
KB
-rw-rw-r--
2022-08-30 11:49
RuntimePlugin.js
14.68
KB
-rw-rw-r--
2022-08-30 11:49
RuntimeTemplate.js
31.11
KB
-rw-rw-r--
2022-08-30 11:49
SelfModuleFactory.js
384
B
-rw-rw-r--
2022-08-30 11:49
SingleEntryPlugin.js
161
B
-rw-rw-r--
2022-08-30 11:49
SizeFormatHelpers.js
583
B
-rw-rw-r--
2022-08-30 11:49
SourceMapDevToolModuleOptionsPlugin.js
1.29
KB
-rw-rw-r--
2022-08-30 11:49
SourceMapDevToolPlugin.js
16.61
KB
-rw-rw-r--
2022-08-30 11:49
Stats.js
1.96
KB
-rw-rw-r--
2022-08-30 11:49
Template.js
12.52
KB
-rw-rw-r--
2022-08-30 11:49
TemplatedPathPlugin.js
8.58
KB
-rw-rw-r--
2022-08-30 11:49
UnhandledSchemeError.js
833
B
-rw-rw-r--
2022-08-30 11:49
UnsupportedFeatureWarning.js
780
B
-rw-rw-r--
2022-08-30 11:49
UseStrictPlugin.js
1.61
KB
-rw-rw-r--
2022-08-30 11:49
WarnCaseSensitiveModulesPlugin.js
1.38
KB
-rw-rw-r--
2022-08-30 11:49
WarnDeprecatedOptionPlugin.js
1.25
KB
-rw-rw-r--
2022-08-30 11:49
WarnNoModeSetPlugin.js
545
B
-rw-rw-r--
2022-08-30 11:49
WatchIgnorePlugin.js
3.27
KB
-rw-rw-r--
2022-08-30 11:49
Watching.js
12.62
KB
-rw-rw-r--
2022-08-30 11:49
WebpackError.js
1.34
KB
-rw-rw-r--
2022-08-30 11:49
WebpackIsIncludedPlugin.js
2.36
KB
-rw-rw-r--
2022-08-30 11:49
WebpackOptionsApply.js
25.69
KB
-rw-rw-r--
2022-08-30 11:49
WebpackOptionsDefaulter.js
470
B
-rw-rw-r--
2022-08-30 11:49
buildChunkGraph.js
44.55
KB
-rw-rw-r--
2022-08-30 11:49
cli.js
16.2
KB
-rw-rw-r--
2022-08-30 11:49
formatLocation.js
1.74
KB
-rw-rw-r--
2022-08-30 11:49
index.js
16.21
KB
-rw-rw-r--
2022-08-30 11:49
validateSchema.js
6.25
KB
-rw-rw-r--
2022-08-30 11:49
webpack.js
5.27
KB
-rw-rw-r--
2022-08-30 11:49
Save
Rename
/* MIT License http://www.opensource.org/licenses/mit-license.php Author Sergey Melyukov @smelukov */ "use strict"; const asyncLib = require("neo-async"); const { SyncBailHook } = require("tapable"); const Compilation = require("../lib/Compilation"); const createSchemaValidation = require("./util/create-schema-validation"); const { join } = require("./util/fs"); const processAsyncTree = require("./util/processAsyncTree"); /** @typedef {import("../declarations/WebpackOptions").CleanOptions} CleanOptions */ /** @typedef {import("./Compiler")} Compiler */ /** @typedef {import("./logging/Logger").Logger} Logger */ /** @typedef {import("./util/fs").OutputFileSystem} OutputFileSystem */ /** @typedef {import("./util/fs").StatsCallback} StatsCallback */ /** @typedef {(function(string):boolean)|RegExp} IgnoreItem */ /** @typedef {Map<string, number>} Assets */ /** @typedef {function(IgnoreItem): void} AddToIgnoreCallback */ /** * @typedef {Object} CleanPluginCompilationHooks * @property {SyncBailHook<[string], boolean>} keep when returning true the file/directory will be kept during cleaning, returning false will clean it and ignore the following plugins and config */ const validate = createSchemaValidation( undefined, () => { const { definitions } = require("../schemas/WebpackOptions.json"); return { definitions, oneOf: [{ $ref: "#/definitions/CleanOptions" }] }; }, { name: "Clean Plugin", baseDataPath: "options" } ); const _10sec = 10 * 1000; /** * marge assets map 2 into map 1 * @param {Assets} as1 assets * @param {Assets} as2 assets * @returns {void} */ const mergeAssets = (as1, as2) => { for (const [key, value1] of as2) { const value2 = as1.get(key); if (!value2 || value1 > value2) as1.set(key, value1); } }; /** * @param {OutputFileSystem} fs filesystem * @param {string} outputPath output path * @param {Map<string, number>} currentAssets filename of the current assets (must not start with .. or ., must only use / as path separator) * @param {function((Error | null)=, Set<string>=): void} callback returns the filenames of the assets that shouldn't be there * @returns {void} */ const getDiffToFs = (fs, outputPath, currentAssets, callback) => { const directories = new Set(); // get directories of assets for (const [asset] of currentAssets) { directories.add(asset.replace(/(^|\/)[^/]*$/, "")); } // and all parent directories for (const directory of directories) { directories.add(directory.replace(/(^|\/)[^/]*$/, "")); } const diff = new Set(); asyncLib.forEachLimit( directories, 10, (directory, callback) => { fs.readdir(join(fs, outputPath, directory), (err, entries) => { if (err) { if (err.code === "ENOENT") return callback(); if (err.code === "ENOTDIR") { diff.add(directory); return callback(); } return callback(err); } for (const entry of entries) { const file = /** @type {string} */ (entry); const filename = directory ? `${directory}/${file}` : file; if (!directories.has(filename) && !currentAssets.has(filename)) { diff.add(filename); } } callback(); }); }, err => { if (err) return callback(err); callback(null, diff); } ); }; /** * @param {Assets} currentAssets assets list * @param {Assets} oldAssets old assets list * @returns {Set<string>} diff */ const getDiffToOldAssets = (currentAssets, oldAssets) => { const diff = new Set(); const now = Date.now(); for (const [asset, ts] of oldAssets) { if (ts >= now) continue; if (!currentAssets.has(asset)) diff.add(asset); } return diff; }; /** * @param {OutputFileSystem} fs filesystem * @param {string} filename path to file * @param {StatsCallback} callback callback for provided filename * @returns {void} */ const doStat = (fs, filename, callback) => { if ("lstat" in fs) { fs.lstat(filename, callback); } else { fs.stat(filename, callback); } }; /** * @param {OutputFileSystem} fs filesystem * @param {string} outputPath output path * @param {boolean} dry only log instead of fs modification * @param {Logger} logger logger * @param {Set<string>} diff filenames of the assets that shouldn't be there * @param {function(string): boolean} isKept check if the entry is ignored * @param {function(Error=, Assets=): void} callback callback * @returns {void} */ const applyDiff = (fs, outputPath, dry, logger, diff, isKept, callback) => { const log = msg => { if (dry) { logger.info(msg); } else { logger.log(msg); } }; /** @typedef {{ type: "check" | "unlink" | "rmdir", filename: string, parent: { remaining: number, job: Job } | undefined }} Job */ /** @type {Job[]} */ const jobs = Array.from(diff.keys(), filename => ({ type: "check", filename, parent: undefined })); /** @type {Assets} */ const keptAssets = new Map(); processAsyncTree( jobs, 10, ({ type, filename, parent }, push, callback) => { const handleError = err => { if (err.code === "ENOENT") { log(`${filename} was removed during cleaning by something else`); handleParent(); return callback(); } return callback(err); }; const handleParent = () => { if (parent && --parent.remaining === 0) push(parent.job); }; const path = join(fs, outputPath, filename); switch (type) { case "check": if (isKept(filename)) { keptAssets.set(filename, 0); // do not decrement parent entry as we don't want to delete the parent log(`${filename} will be kept`); return process.nextTick(callback); } doStat(fs, path, (err, stats) => { if (err) return handleError(err); if (!stats.isDirectory()) { push({ type: "unlink", filename, parent }); return callback(); } fs.readdir(path, (err, entries) => { if (err) return handleError(err); /** @type {Job} */ const deleteJob = { type: "rmdir", filename, parent }; if (entries.length === 0) { push(deleteJob); } else { const parentToken = { remaining: entries.length, job: deleteJob }; for (const entry of entries) { const file = /** @type {string} */ (entry); if (file.startsWith(".")) { log( `${filename} will be kept (dot-files will never be removed)` ); continue; } push({ type: "check", filename: `${filename}/${file}`, parent: parentToken }); } } return callback(); }); }); break; case "rmdir": log(`${filename} will be removed`); if (dry) { handleParent(); return process.nextTick(callback); } if (!fs.rmdir) { logger.warn( `${filename} can't be removed because output file system doesn't support removing directories (rmdir)` ); return process.nextTick(callback); } fs.rmdir(path, err => { if (err) return handleError(err); handleParent(); callback(); }); break; case "unlink": log(`${filename} will be removed`); if (dry) { handleParent(); return process.nextTick(callback); } if (!fs.unlink) { logger.warn( `${filename} can't be removed because output file system doesn't support removing files (rmdir)` ); return process.nextTick(callback); } fs.unlink(path, err => { if (err) return handleError(err); handleParent(); callback(); }); break; } }, err => { if (err) return callback(err); callback(undefined, keptAssets); } ); }; /** @type {WeakMap<Compilation, CleanPluginCompilationHooks>} */ const compilationHooksMap = new WeakMap(); class CleanPlugin { /** * @param {Compilation} compilation the compilation * @returns {CleanPluginCompilationHooks} the attached hooks */ static getCompilationHooks(compilation) { if (!(compilation instanceof Compilation)) { throw new TypeError( "The 'compilation' argument must be an instance of Compilation" ); } let hooks = compilationHooksMap.get(compilation); if (hooks === undefined) { hooks = { /** @type {SyncBailHook<[string], boolean>} */ keep: new SyncBailHook(["ignore"]) }; compilationHooksMap.set(compilation, hooks); } return hooks; } /** @param {CleanOptions} options options */ constructor(options = {}) { validate(options); this.options = { dry: false, ...options }; } /** * Apply the plugin * @param {Compiler} compiler the compiler instance * @returns {void} */ apply(compiler) { const { dry, keep } = this.options; const keepFn = typeof keep === "function" ? keep : typeof keep === "string" ? path => path.startsWith(keep) : typeof keep === "object" && keep.test ? path => keep.test(path) : () => false; // We assume that no external modification happens while the compiler is active // So we can store the old assets and only diff to them to avoid fs access on // incremental builds /** @type {undefined|Assets} */ let oldAssets; compiler.hooks.emit.tapAsync( { name: "CleanPlugin", stage: 100 }, (compilation, callback) => { const hooks = CleanPlugin.getCompilationHooks(compilation); const logger = compilation.getLogger("webpack.CleanPlugin"); const fs = compiler.outputFileSystem; if (!fs.readdir) { return callback( new Error( "CleanPlugin: Output filesystem doesn't support listing directories (readdir)" ) ); } /** @type {Assets} */ const currentAssets = new Map(); const now = Date.now(); for (const asset of Object.keys(compilation.assets)) { if (/^[A-Za-z]:\\|^\/|^\\\\/.test(asset)) continue; let normalizedAsset; let newNormalizedAsset = asset.replace(/\\/g, "/"); do { normalizedAsset = newNormalizedAsset; newNormalizedAsset = normalizedAsset.replace( /(^|\/)(?!\.\.)[^/]+\/\.\.\//g, "$1" ); } while (newNormalizedAsset !== normalizedAsset); if (normalizedAsset.startsWith("../")) continue; const assetInfo = compilation.assetsInfo.get(asset); if (assetInfo && assetInfo.hotModuleReplacement) { currentAssets.set(normalizedAsset, now + _10sec); } else { currentAssets.set(normalizedAsset, 0); } } const outputPath = compilation.getPath(compiler.outputPath, {}); const isKept = path => { const result = hooks.keep.call(path); if (result !== undefined) return result; return keepFn(path); }; /** * @param {Error=} err err * @param {Set<string>=} diff diff */ const diffCallback = (err, diff) => { if (err) { oldAssets = undefined; callback(err); return; } applyDiff( fs, outputPath, dry, logger, diff, isKept, (err, keptAssets) => { if (err) { oldAssets = undefined; } else { if (oldAssets) mergeAssets(currentAssets, oldAssets); oldAssets = currentAssets; if (keptAssets) mergeAssets(oldAssets, keptAssets); } callback(err); } ); }; if (oldAssets) { diffCallback(null, getDiffToOldAssets(currentAssets, oldAssets)); } else { getDiffToFs(fs, outputPath, currentAssets, diffCallback); } } ); } } module.exports = CleanPlugin;