mirror of https://github.com/webpack/webpack.git
				
				
				
			chore(types): add Compiler and Compilation type support
This commit is contained in:
		
							parent
							
								
									2773122578
								
							
						
					
					
						commit
						a3092c6431
					
				|  | @ -8,6 +8,99 @@ declare namespace NodeJS { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| declare module "neo-async" { | ||||
| 	export interface Dictionary<T> { | ||||
| 		[key: string]: T; | ||||
| 	} | ||||
| 	export type IterableCollection<T> = T[] | IterableIterator<T> | Dictionary<T>; | ||||
| 
 | ||||
| 	export interface ErrorCallback<T> { | ||||
| 		(err?: T): void; | ||||
| 	} | ||||
| 	export interface AsyncBooleanResultCallback<E> { | ||||
| 		(err?: E, truthValue?: boolean): void; | ||||
| 	} | ||||
| 	export interface AsyncResultCallback<T, E> { | ||||
| 		(err?: E, result?: T): void; | ||||
| 	} | ||||
| 	export interface AsyncResultArrayCallback<T, E> { | ||||
| 		(err?: E, results?: Array<T | undefined>): void; | ||||
| 	} | ||||
| 	export interface AsyncResultObjectCallback<T, E> { | ||||
| 		(err: E | undefined, results: Dictionary<T | undefined>): void; | ||||
| 	} | ||||
| 
 | ||||
| 	export interface AsyncFunction<T, E> { | ||||
| 		(callback: (err?: E, result?: T) => void): void; | ||||
| 	} | ||||
| 	export interface AsyncFunctionEx<T, E> { | ||||
| 		(callback: (err?: E, ...results: T[]) => void): void; | ||||
| 	} | ||||
| 	export interface AsyncIterator<T, E> { | ||||
| 		(item: T, callback: ErrorCallback<E>): void; | ||||
| 	} | ||||
| 	export interface AsyncForEachOfIterator<T, E> { | ||||
| 		(item: T, key: number | string, callback: ErrorCallback<E>): void; | ||||
| 	} | ||||
| 	export interface AsyncResultIterator<T, R, E> { | ||||
| 		(item: T, callback: AsyncResultCallback<R, E>): void; | ||||
| 	} | ||||
| 	export interface AsyncMemoIterator<T, R, E> { | ||||
| 		(memo: R | undefined, item: T, callback: AsyncResultCallback<R, E>): void; | ||||
| 	} | ||||
| 	export interface AsyncBooleanIterator<T, E> { | ||||
| 		(item: T, callback: AsyncBooleanResultCallback<E>): void; | ||||
| 	} | ||||
| 
 | ||||
| 	export interface AsyncWorker<T, E> { | ||||
| 		(task: T, callback: ErrorCallback<E>): void; | ||||
| 	} | ||||
| 	export interface AsyncVoidFunction<E> { | ||||
| 		(callback: ErrorCallback<E>): void; | ||||
| 	} | ||||
| 
 | ||||
| 	export type AsyncAutoTasks<R extends Dictionary<any>, E> = { | ||||
| 		[K in keyof R]: AsyncAutoTask<R[K], R, E> | ||||
| 	}; | ||||
| 	export type AsyncAutoTask<R1, R extends Dictionary<any>, E> = | ||||
| 		| AsyncAutoTaskFunctionWithoutDependencies<R1, E> | ||||
| 		| (keyof R | AsyncAutoTaskFunction<R1, R, E>)[]; | ||||
| 	export interface AsyncAutoTaskFunctionWithoutDependencies<R1, E> { | ||||
| 		(cb: AsyncResultCallback<R1, E> | ErrorCallback<E>): void; | ||||
| 	} | ||||
| 	export interface AsyncAutoTaskFunction<R1, R extends Dictionary<any>, E> { | ||||
| 		(results: R, cb: AsyncResultCallback<R1, E> | ErrorCallback<E>): void; | ||||
| 	} | ||||
| 
 | ||||
| 	export function each<T, E>( | ||||
| 		arr: IterableCollection<T>, | ||||
| 		iterator: AsyncIterator<T, E>, | ||||
| 		callback?: ErrorCallback<E> | ||||
| 	): void; | ||||
| 
 | ||||
| 	export function map<T, R, E>( | ||||
| 		arr: T[] | IterableIterator<T>, | ||||
| 		iterator: AsyncResultIterator<T, R, E>, | ||||
| 		callback?: AsyncResultArrayCallback<R, E> | ||||
| 	): void; | ||||
| 	export function map<T, R, E>( | ||||
| 		arr: Dictionary<T>, | ||||
| 		iterator: AsyncResultIterator<T, R, E>, | ||||
| 		callback?: AsyncResultArrayCallback<R, E> | ||||
| 	): void; | ||||
| 
 | ||||
| 	export function parallel<T, E>( | ||||
| 		tasks: Array<AsyncFunction<T, E>>, | ||||
| 		callback?: AsyncResultArrayCallback<T, E> | ||||
| 	): void; | ||||
| 	export function parallel<T, E>( | ||||
| 		tasks: Dictionary<AsyncFunction<T, E>>, | ||||
| 		callback?: AsyncResultObjectCallback<T, E> | ||||
| 	): void; | ||||
| 
 | ||||
| 	export const forEach: typeof each; | ||||
| } | ||||
| 
 | ||||
| // There are no typings for chrome-trace-event
 | ||||
| declare module "chrome-trace-event" { | ||||
| 	interface Event { | ||||
|  |  | |||
|  | @ -5,7 +5,34 @@ | |||
| "use strict"; | ||||
| const DependenciesBlock = require("./DependenciesBlock"); | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {import("./ChunkGroup")} ChunkGroup | ||||
|  * @typedef {import("./Module")} Module | ||||
|  * @typedef {import("crypto").Hash} Hash | ||||
|  * @typedef {TODO} GroupOptions | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} SourcePosition | ||||
|  * @property {number} line | ||||
|  * @property {number} column | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} SourceLocation | ||||
|  * @property {number} index | ||||
|  * @property {SourcePosition} start | ||||
|  * @property {SourcePosition} end | ||||
|  */ | ||||
| 
 | ||||
| module.exports = class AsyncDependenciesBlock extends DependenciesBlock { | ||||
| 	/** | ||||
| 	 * @param {GroupOptions} groupOptions options for the group | ||||
| 	 * @param {Module} module the Module object | ||||
| 	 * @param {SourceLocation=} loc the line of code | ||||
| 	 * @param {TODO=} request the request | ||||
| 	 */ | ||||
| 	constructor(groupOptions, module, loc, request) { | ||||
| 		super(); | ||||
| 		if (typeof groupOptions === "string") { | ||||
|  | @ -14,28 +41,50 @@ module.exports = class AsyncDependenciesBlock extends DependenciesBlock { | |||
| 			groupOptions = { name: undefined }; | ||||
| 		} | ||||
| 		this.groupOptions = groupOptions; | ||||
| 		/** @type {ChunkGroup=} */ | ||||
| 		this.chunkGroup = undefined; | ||||
| 		this.module = module; | ||||
| 		this.loc = loc; | ||||
| 		this.request = request; | ||||
| 		/** @type {DependenciesBlock} */ | ||||
| 		this.parent = undefined; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @returns {string} The name of the chunk | ||||
| 	 */ | ||||
| 	get chunkName() { | ||||
| 		return this.groupOptions.name; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {string} value The new chunk name | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	set chunkName(value) { | ||||
| 		this.groupOptions.name = value; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @returns {never} this throws and should never be called | ||||
| 	 */ | ||||
| 	get chunks() { | ||||
| 		throw new Error("Moved to AsyncDependenciesBlock.chunkGroup"); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {never} value setter value | ||||
| 	 * @returns {never} this is going to throw therefore we should throw type | ||||
| 	 * assertions by returning never | ||||
| 	 */ | ||||
| 	set chunks(value) { | ||||
| 		throw new Error("Moved to AsyncDependenciesBlock.chunkGroup"); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Hash} hash the hash used to track block changes, from "crypto" module | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	updateHash(hash) { | ||||
| 		hash.update(JSON.stringify(this.groupOptions)); | ||||
| 		hash.update( | ||||
|  | @ -50,16 +99,25 @@ module.exports = class AsyncDependenciesBlock extends DependenciesBlock { | |||
| 		super.updateHash(hash); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	disconnect() { | ||||
| 		this.chunkGroup = undefined; | ||||
| 		super.disconnect(); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	unseal() { | ||||
| 		this.chunkGroup = undefined; | ||||
| 		super.unseal(); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	sortItems() { | ||||
| 		super.sortItems(); | ||||
| 	} | ||||
|  |  | |||
							
								
								
									
										22
									
								
								lib/Chunk.js
								
								
								
								
							
							
						
						
									
										22
									
								
								lib/Chunk.js
								
								
								
								
							|  | @ -17,6 +17,7 @@ const ERR_CHUNK_INITIAL = | |||
| /** @typedef {import("./ChunkGroup")} ChunkGroup */ | ||||
| /** @typedef {import("./ModuleReason.js")} ModuleReason */ | ||||
| /** @typedef {import("webpack-sources").Source} Source */ | ||||
| /** @typedef {import("crypto").Hash} Hash */ | ||||
| 
 | ||||
| /** | ||||
|  *  @typedef {Object} Identifiable an object who contains an identifier function property | ||||
|  | @ -471,6 +472,11 @@ class Chunk { | |||
| 		return this.addMultiplierAndOverhead(this.modulesSize(), options); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Chunk} otherChunk the other chunk | ||||
| 	 * @param {TODO} options the options for this function | ||||
| 	 * @returns {number | false} the size, or false if it can't be integrated | ||||
| 	 */ | ||||
| 	integratedSize(otherChunk, options) { | ||||
| 		// Chunk if it's possible to integrate this chunk
 | ||||
| 		if (!this.canBeIntegrated(otherChunk)) { | ||||
|  | @ -500,6 +506,9 @@ class Chunk { | |||
| 		this.sortModules(); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @returns {Set<Chunk>} a set of all the async chunks | ||||
| 	 */ | ||||
| 	getAllAsyncChunks() { | ||||
| 		const queue = new Set(); | ||||
| 		const chunks = new Set(); | ||||
|  | @ -522,6 +531,10 @@ class Chunk { | |||
| 		return chunks; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Hash} realHash the hash for the chunk maps | ||||
| 	 * @returns {{ hash: TODO, contentHash: TODO, name: TODO }} the chunk map information | ||||
| 	 */ | ||||
| 	getChunkMaps(realHash) { | ||||
| 		const chunkHashMap = Object.create(null); | ||||
| 		const chunkContentHashMap = Object.create(null); | ||||
|  | @ -544,6 +557,9 @@ class Chunk { | |||
| 		}; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @returns {Record<string, Array<Set<TODO>>>} a record object of names to lists of child ids(?) | ||||
| 	 */ | ||||
| 	getChildIdsByOrders() { | ||||
| 		const lists = new Map(); | ||||
| 		for (const group of this.groupsIterable) { | ||||
|  | @ -600,6 +616,12 @@ class Chunk { | |||
| 		return chunkMaps; | ||||
| 	} | ||||
| 
 | ||||
| 	/** @typedef {(module: Module) => true} FilterFn */ | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {FilterFn} filterFn function used to filter modules | ||||
| 	 * @returns {TODO} module map information | ||||
| 	 */ | ||||
| 	getChunkModuleMaps(filterFn) { | ||||
| 		const chunkModuleIdMap = Object.create(null); | ||||
| 		const chunkModuleHashMap = Object.create(null); | ||||
|  |  | |||
|  | @ -35,14 +35,93 @@ const createHash = require("./util/createHash"); | |||
| const Queue = require("./util/Queue"); | ||||
| const SortableSet = require("./util/SortableSet"); | ||||
| const GraphHelpers = require("./GraphHelpers"); | ||||
| const SingleEntryDependency = require("./dependencies/SingleEntryDependency"); | ||||
| 
 | ||||
| const byId = (a, b) => { | ||||
| 	if (a.id < b.id) return -1; | ||||
| 	if (a.id > b.id) return 1; | ||||
| /** @typedef {import("./Module")} Module */ | ||||
| /** @typedef {import("./Compiler")} Compiler */ | ||||
| /** @typedef {import("webpack-sources").Source} Source */ | ||||
| /** @typedef {import("./WebpackError")} WebpackError */ | ||||
| /** @typedef {import("./DependenciesBlockVariable")} DependenciesBlockVariable */ | ||||
| /** @typedef {import("./dependencies/SingleEntryDependency")} SingleEntryDependency */ | ||||
| /** @typedef {import("./dependencies/MultiEntryDependency")} MultiEntryDependency */ | ||||
| /** @typedef {import("./dependencies/DllEntryDependency")} DllEntryDependency */ | ||||
| /** @typedef {import("./DependenciesBlock")} DependenciesBlock */ | ||||
| /** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */ | ||||
| 
 | ||||
| /** @typedef {SingleEntryDependency|MultiEntryDependency|DllEntryDependency} PossibleEntryDependencies */ | ||||
| /** @typedef {{[assetName: string]: Source}} CompilationAssets */ | ||||
| /** @typedef {(err: Error|null, result?: Module) => void } ModuleCallback */ | ||||
| /** @typedef {(err?: Error|null, result?: Module) => void } ModuleChainCallback */ | ||||
| /** @typedef {(module: Module) => void} OnModuleCallback */ | ||||
| /** @typedef {(err?: Error|null) => void} CompilationSealCallback */ | ||||
| /** @typedef {{apply: (dep: Dependency, source: Source, runtime: RuntimeTemplate) => void}} DependencyTemplate */ | ||||
| /** @typedef {(d: Dependency) => any} DepBlockVarDependenciesCallback */ | ||||
| /** @typedef {new (...args: any[]) => Dependency} DepConstructor */ | ||||
| /** @typedef {{apply: () => void}} Plugin */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} ModuleFactoryCreateDataContextInfo | ||||
|  * @property {string} issuer | ||||
|  * @property {string} compiler | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} ModuleFactoryCreateData | ||||
|  * @property {ModuleFactoryCreateDataContextInfo} contextInfo | ||||
|  * @property {any=} resolveOptions | ||||
|  * @property {string} context | ||||
|  * @property {Dependency[]} dependencies | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} ModuleFactory | ||||
|  * @property {(data: ModuleFactoryCreateData, callback: ModuleCallback) => any} create | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} SortedDependency | ||||
|  * @property {ModuleFactory} factory | ||||
|  * @property {Dependency[]} dependencies | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} SourcePosition | ||||
|  * @property {number} line | ||||
|  * @property {number} column | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} SourceLocation | ||||
|  * @property {number} index | ||||
|  * @property {SourcePosition} start | ||||
|  * @property {SourcePosition} end | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} AvailableModulesChunkGroupMapping | ||||
|  * @property {ChunkGroup} chunkGroup | ||||
|  * @property {Set<Module>} availableModules | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @param {Chunk} a first chunk to sort by id | ||||
|  * @param {Chunk} b second chunk to sort by id | ||||
|  * @returns {-1|0|1} sort value | ||||
|  */ | ||||
| function byId(a, b) { | ||||
| 	if (a.id && b.id) { | ||||
| 		if (a.id < b.id) return -1; | ||||
| 		if (a.id > b.id) return 1; | ||||
| 	} | ||||
| 	return 0; | ||||
| }; | ||||
| } | ||||
| 
 | ||||
| const byIdOrIdentifier = (a, b) => { | ||||
| /** | ||||
|  * @param {Module} a first module to sort by | ||||
|  * @param {Module} b second module to sort by | ||||
|  * @returns {-1|0|1} sort value | ||||
|  */ | ||||
| function byIdOrIdentifier(a, b) { | ||||
| 	if (a.id < b.id) return -1; | ||||
| 	if (a.id > b.id) return 1; | ||||
| 	const identA = a.identifier(); | ||||
|  | @ -50,9 +129,14 @@ const byIdOrIdentifier = (a, b) => { | |||
| 	if (identA < identB) return -1; | ||||
| 	if (identA > identB) return 1; | ||||
| 	return 0; | ||||
| }; | ||||
| } | ||||
| 
 | ||||
| const byIndexOrIdentifier = (a, b) => { | ||||
| /** | ||||
|  * @param {Module} a first module to sort by | ||||
|  * @param {Module} b second module to sort by | ||||
|  * @returns {-1|0|1} sort value | ||||
|  */ | ||||
| function byIndexOrIdentifier(a, b) { | ||||
| 	if (a.index < b.index) return -1; | ||||
| 	if (a.index > b.index) return 1; | ||||
| 	const identA = a.identifier(); | ||||
|  | @ -60,35 +144,59 @@ const byIndexOrIdentifier = (a, b) => { | |||
| 	if (identA < identB) return -1; | ||||
| 	if (identA > identB) return 1; | ||||
| 	return 0; | ||||
| }; | ||||
| } | ||||
| 
 | ||||
| const byNameOrHash = (a, b) => { | ||||
| /** | ||||
|  * @param {Compilation} a first compilation to sort by | ||||
|  * @param {Compilation} b second compilation to sort by | ||||
|  * @returns {-1|0|1} sort value | ||||
|  */ | ||||
| function byNameOrHash(a, b) { | ||||
| 	if (a.name < b.name) return -1; | ||||
| 	if (a.name > b.name) return 1; | ||||
| 	if (a.fullHash < b.fullHash) return -1; | ||||
| 	if (a.fullhash > b.fullHash) return 1; | ||||
| 	if (a.fullHash > b.fullHash) return 1; | ||||
| 	return 0; | ||||
| }; | ||||
| } | ||||
| 
 | ||||
| const iterationBlockVariable = (variables, fn) => { | ||||
| /** | ||||
|  * @param {DependenciesBlockVariable[]} variables DepBlock Variables to iterate over | ||||
|  * @param {DepBlockVarDependenciesCallback} fn callback to apply on iterated elements | ||||
|  * @returns {void} | ||||
|  */ | ||||
| function iterationBlockVariable(variables, fn) { | ||||
| 	for ( | ||||
| 		let indexVariable = 0; | ||||
| 		indexVariable < variables.length; | ||||
| 		indexVariable++ | ||||
| 	) { | ||||
| 		// TODO: Remove when Dependency + DependenciesBlockVariable is typed
 | ||||
| 		/** @type {Dependency[]} */ | ||||
| 		const varDep = variables[indexVariable].dependencies; | ||||
| 		for (let indexVDep = 0; indexVDep < varDep.length; indexVDep++) { | ||||
| 			fn(varDep[indexVDep]); | ||||
| 		} | ||||
| 	} | ||||
| }; | ||||
| } | ||||
| 
 | ||||
| const iterationOfArrayCallback = (arr, fn) => { | ||||
| /** | ||||
|  * @template {T} | ||||
|  * @param {T[]} arr array of elements to iterate over | ||||
|  * @param {function(T): void} fn callback applied to each element | ||||
|  * @returns {void} | ||||
|  */ | ||||
| function iterationOfArrayCallback(arr, fn) { | ||||
| 	for (let index = 0; index < arr.length; index++) { | ||||
| 		fn(arr[index]); | ||||
| 	} | ||||
| }; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @template {T} | ||||
|  * @param {Set<T>} set set to add items to | ||||
|  * @param {Set<T>} otherSet set to add items from | ||||
|  * @returns {void} | ||||
|  */ | ||||
| function addAllToSet(set, otherSet) { | ||||
| 	for (const item of otherSet) { | ||||
| 		set.add(item); | ||||
|  | @ -96,92 +204,156 @@ function addAllToSet(set, otherSet) { | |||
| } | ||||
| 
 | ||||
| class Compilation extends Tapable { | ||||
| 	/** | ||||
| 	 * Creates an instance of Compilation. | ||||
| 	 * @param {Compiler} compiler the compiler which created the compilation | ||||
| 	 */ | ||||
| 	constructor(compiler) { | ||||
| 		super(); | ||||
| 		this.hooks = { | ||||
| 			/** @type {SyncHook<Module>} */ | ||||
| 			buildModule: new SyncHook(["module"]), | ||||
| 			/** @type {SyncHook<Module>} */ | ||||
| 			rebuildModule: new SyncHook(["module"]), | ||||
| 			/** @type {SyncHook<Module, Error>} */ | ||||
| 			failedModule: new SyncHook(["module", "error"]), | ||||
| 			/** @type {SyncHook<Module>} */ | ||||
| 			succeedModule: new SyncHook(["module"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<Module[]>} */ | ||||
| 			finishModules: new SyncHook(["modules"]), | ||||
| 			/** @type {SyncHook<Module>} */ | ||||
| 			finishRebuildingModule: new SyncHook(["module"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook} */ | ||||
| 			unseal: new SyncHook([]), | ||||
| 			/** @type {SyncHook} */ | ||||
| 			seal: new SyncHook([]), | ||||
| 
 | ||||
| 			/** @type {SyncBailHook<Module[]>} */ | ||||
| 			optimizeDependenciesBasic: new SyncBailHook(["modules"]), | ||||
| 			/** @type {SyncBailHook<Module[]>} */ | ||||
| 			optimizeDependencies: new SyncBailHook(["modules"]), | ||||
| 			/** @type {SyncBailHook<Module[]>} */ | ||||
| 			optimizeDependenciesAdvanced: new SyncBailHook(["modules"]), | ||||
| 			/** @type {SyncBailHook<Module[]>} */ | ||||
| 			afterOptimizeDependencies: new SyncHook(["modules"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook} */ | ||||
| 			optimize: new SyncHook([]), | ||||
| 
 | ||||
| 			/** @type {SyncBailHook<Module[]>} */ | ||||
| 			optimizeModulesBasic: new SyncBailHook(["modules"]), | ||||
| 			/** @type {SyncBailHook<Module[]>} */ | ||||
| 			optimizeModules: new SyncBailHook(["modules"]), | ||||
| 			/** @type {SyncBailHook<Module[]>} */ | ||||
| 			optimizeModulesAdvanced: new SyncBailHook(["modules"]), | ||||
| 			/** @type {SyncHook<Module[]>} */ | ||||
| 			afterOptimizeModules: new SyncHook(["modules"]), | ||||
| 
 | ||||
| 			/** @type {SyncBailHook<Chunk[], ChunkGroup[]>} */ | ||||
| 			optimizeChunksBasic: new SyncBailHook(["chunks", "chunkGroups"]), | ||||
| 			/** @type {SyncBailHook<Chunk[], ChunkGroup[]>} */ | ||||
| 			optimizeChunks: new SyncBailHook(["chunks", "chunkGroups"]), | ||||
| 			/** @type {SyncBailHook<Chunk[], ChunkGroup[]>} */ | ||||
| 			optimizeChunksAdvanced: new SyncBailHook(["chunks", "chunkGroups"]), | ||||
| 			/** @type {SyncHook<Chunk[], ChunkGroup[]>} */ | ||||
| 			afterOptimizeChunks: new SyncHook(["chunks", "chunkGroups"]), | ||||
| 
 | ||||
| 			/** @type {AsyncSeriesHook<Chunk[], Module[]>} */ | ||||
| 			optimizeTree: new AsyncSeriesHook(["chunks", "modules"]), | ||||
| 			/** @type {SyncHook<Chunk[], Module[]>} */ | ||||
| 			afterOptimizeTree: new SyncHook(["chunks", "modules"]), | ||||
| 
 | ||||
| 			/** @type {SyncBailHook<Chunk[], Module[]>} */ | ||||
| 			optimizeChunkModulesBasic: new SyncBailHook(["chunks", "modules"]), | ||||
| 			/** @type {SyncBailHook<Chunk[], Module[]>} */ | ||||
| 			optimizeChunkModules: new SyncBailHook(["chunks", "modules"]), | ||||
| 			/** @type {SyncBailHook<Chunk[], Module[]>} */ | ||||
| 			optimizeChunkModulesAdvanced: new SyncBailHook(["chunks", "modules"]), | ||||
| 			/** @type {SyncHook<Chunk[], Module[]>} */ | ||||
| 			afterOptimizeChunkModules: new SyncHook(["chunks", "modules"]), | ||||
| 			/** @type {SyncBailHook} */ | ||||
| 			shouldRecord: new SyncBailHook([]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<Module[], any>} */ | ||||
| 			reviveModules: new SyncHook(["modules", "records"]), | ||||
| 			/** @type {SyncHook<Module[]>} */ | ||||
| 			optimizeModuleOrder: new SyncHook(["modules"]), | ||||
| 			/** @type {SyncHook<Module[]>} */ | ||||
| 			advancedOptimizeModuleOrder: new SyncHook(["modules"]), | ||||
| 			/** @type {SyncHook<Module[]>} */ | ||||
| 			beforeModuleIds: new SyncHook(["modules"]), | ||||
| 			/** @type {SyncHook<Module[]>} */ | ||||
| 			moduleIds: new SyncHook(["modules"]), | ||||
| 			/** @type {SyncHook<Module[]>} */ | ||||
| 			optimizeModuleIds: new SyncHook(["modules"]), | ||||
| 			/** @type {SyncHook<Module[]>} */ | ||||
| 			afterOptimizeModuleIds: new SyncHook(["modules"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<Chunk[], any>} */ | ||||
| 			reviveChunks: new SyncHook(["chunks", "records"]), | ||||
| 			/** @type {SyncHook<Chunk[]>} */ | ||||
| 			optimizeChunkOrder: new SyncHook(["chunks"]), | ||||
| 			/** @type {SyncHook<Chunk[]>} */ | ||||
| 			beforeChunkIds: new SyncHook(["chunks"]), | ||||
| 			/** @type {SyncHook<Chunk[]>} */ | ||||
| 			optimizeChunkIds: new SyncHook(["chunks"]), | ||||
| 			/** @type {SyncHook<Chunk[]>} */ | ||||
| 			afterOptimizeChunkIds: new SyncHook(["chunks"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<Module[], any>} */ | ||||
| 			recordModules: new SyncHook(["modules", "records"]), | ||||
| 			/** @type {SyncHook<Chunk[], any>} */ | ||||
| 			recordChunks: new SyncHook(["chunks", "records"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook} */ | ||||
| 			beforeHash: new SyncHook([]), | ||||
| 			/** @type {SyncHook<Chunk>} */ | ||||
| 			contentHash: new SyncHook(["chunk"]), | ||||
| 			/** @type {SyncHook} */ | ||||
| 			afterHash: new SyncHook([]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<any>} */ | ||||
| 			recordHash: new SyncHook(["records"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<Compilation, any>} */ | ||||
| 			record: new SyncHook(["compilation", "records"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook} */ | ||||
| 			beforeModuleAssets: new SyncHook([]), | ||||
| 			/** @type {SyncBailHook} */ | ||||
| 			shouldGenerateChunkAssets: new SyncBailHook([]), | ||||
| 			/** @type {SyncHook} */ | ||||
| 			beforeChunkAssets: new SyncHook([]), | ||||
| 			/** @type {SyncHook<Chunk[]>} */ | ||||
| 			additionalChunkAssets: new SyncHook(["chunks"]), | ||||
| 
 | ||||
| 			/** @type {AsyncSeriesHook} */ | ||||
| 			additionalAssets: new AsyncSeriesHook([]), | ||||
| 			/** @type {AsyncSeriesHook<Chunk[]>} */ | ||||
| 			optimizeChunkAssets: new AsyncSeriesHook(["chunks"]), | ||||
| 			/** @type {SyncHook<Chunk[]>} */ | ||||
| 			afterOptimizeChunkAssets: new SyncHook(["chunks"]), | ||||
| 			/** @type {AsyncSeriesHook<CompilationAssets>} */ | ||||
| 			optimizeAssets: new AsyncSeriesHook(["assets"]), | ||||
| 			/** @type {SyncHook<CompilationAssets>} */ | ||||
| 			afterOptimizeAssets: new SyncHook(["assets"]), | ||||
| 
 | ||||
| 			/** @type {SyncBailHook} */ | ||||
| 			needAdditionalSeal: new SyncBailHook([]), | ||||
| 			/** @type {AsyncSeriesHook} */ | ||||
| 			afterSeal: new AsyncSeriesHook([]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<Chunk, any>} */ | ||||
| 			chunkHash: new SyncHook(["chunk", "chunkHash"]), | ||||
| 			/** @type {SyncHook<Module, string>} */ | ||||
| 			moduleAsset: new SyncHook(["module", "filename"]), | ||||
| 			/** @type {SyncHook<Chunk, string>} */ | ||||
| 			chunkAsset: new SyncHook(["chunk", "filename"]), | ||||
| 
 | ||||
| 			/** @type {SyncWaterfallHook<string, any>} */ | ||||
| 			assetPath: new SyncWaterfallHook(["filename", "data"]), // TODO MainTemplate
 | ||||
| 
 | ||||
| 			/** @type {SyncBailHook} */ | ||||
| 			needAdditionalPass: new SyncBailHook([]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<Compiler, string, number>} */ | ||||
| 			childCompiler: new SyncHook([ | ||||
| 				"childCompiler", | ||||
| 				"compilerName", | ||||
|  | @ -190,11 +362,16 @@ class Compilation extends Tapable { | |||
| 
 | ||||
| 			// TODO the following hooks are weirdly located here
 | ||||
| 			// TODO move them for webpack 5
 | ||||
| 			/** @type {SyncHook<string, Module>} */ | ||||
| 			normalModuleLoader: new SyncHook(["loaderContext", "module"]), | ||||
| 
 | ||||
| 			/** @type {SyncBailHook<Chunk[]>} */ | ||||
| 			optimizeExtractedChunksBasic: new SyncBailHook(["chunks"]), | ||||
| 			/** @type {SyncBailHook<Chunk[]>} */ | ||||
| 			optimizeExtractedChunks: new SyncBailHook(["chunks"]), | ||||
| 			/** @type {SyncBailHook<Chunk[]>} */ | ||||
| 			optimizeExtractedChunksAdvanced: new SyncBailHook(["chunks"]), | ||||
| 			/** @type {SyncHook<Chunk[]>} */ | ||||
| 			afterOptimizeExtractedChunks: new SyncHook(["chunks"]) | ||||
| 		}; | ||||
| 		this._pluginCompat.tap("Compilation", options => { | ||||
|  | @ -208,7 +385,9 @@ class Compilation extends Tapable { | |||
| 					break; | ||||
| 			} | ||||
| 		}); | ||||
| 		/** @type {string=} */ | ||||
| 		this.name = undefined; | ||||
| 		/** @type {Compiler} */ | ||||
| 		this.compiler = compiler; | ||||
| 		this.resolverFactory = compiler.resolverFactory; | ||||
| 		this.inputFileSystem = compiler.inputFileSystem; | ||||
|  | @ -216,6 +395,7 @@ class Compilation extends Tapable { | |||
| 
 | ||||
| 		const options = (this.options = compiler.options); | ||||
| 		this.outputOptions = options && options.output; | ||||
| 		/** @type {boolean=} */ | ||||
| 		this.bail = options && options.bail; | ||||
| 		this.profile = options && options.profile; | ||||
| 		this.performance = options && options.performance; | ||||
|  | @ -237,34 +417,56 @@ class Compilation extends Tapable { | |||
| 		this.semaphore = new Semaphore(options.parallelism || 100); | ||||
| 
 | ||||
| 		this.entries = []; | ||||
| 		/** @private @type {{name: string, request: string, module: Module}[]} */ | ||||
| 		this._preparedEntrypoints = []; | ||||
| 		this.entrypoints = new Map(); | ||||
| 		/** @type {Chunk[]} */ | ||||
| 		this.chunks = []; | ||||
| 		/** @type {ChunkGroup[]} */ | ||||
| 		this.chunkGroups = []; | ||||
| 		/** @type {Map<string, ChunkGroup>} */ | ||||
| 		this.namedChunkGroups = new Map(); | ||||
| 		/** @type {Map<string, Chunk>} */ | ||||
| 		this.namedChunks = new Map(); | ||||
| 		/** @type {Module[]} */ | ||||
| 		this.modules = []; | ||||
| 		/** @private @type {Map<string, Module>} */ | ||||
| 		this._modules = new Map(); | ||||
| 		this.cache = null; | ||||
| 		this.records = null; | ||||
| 		/** @type {number=} */ | ||||
| 		this.nextFreeModuleIndex = undefined; | ||||
| 		/** @type {number=} */ | ||||
| 		this.nextFreeModuleIndex2 = undefined; | ||||
| 		/** @type {string[]} */ | ||||
| 		this.additionalChunkAssets = []; | ||||
| 		/** @type {CompilationAssets} */ | ||||
| 		this.assets = {}; | ||||
| 		/** @type {WebpackError[]} */ | ||||
| 		this.errors = []; | ||||
| 		/** @type {WebpackError[]} */ | ||||
| 		this.warnings = []; | ||||
| 		/** @type {Compilation[]} */ | ||||
| 		this.children = []; | ||||
| 		/** @type {Map<DepConstructor, ModuleFactory>} */ | ||||
| 		this.dependencyFactories = new Map(); | ||||
| 		/** @type {Map<DepConstructor|string, DependencyTemplate|string>} */ | ||||
| 		this.dependencyTemplates = new Map(); | ||||
| 		this.dependencyTemplates.set("hash", ""); | ||||
| 		this.childrenCounters = {}; | ||||
| 		/** @type {Set<number>} */ | ||||
| 		this.usedChunkIds = null; | ||||
| 		/** @type {Set<number>} */ | ||||
| 		this.usedModuleIds = null; | ||||
| 		/** @type {Map<string, number>=} */ | ||||
| 		this.fileTimestamps = undefined; | ||||
| 		/** @type {Map<string, number>=} */ | ||||
| 		this.contextTimestamps = undefined; | ||||
| 		/** @type {Set} */ | ||||
| 		this.compilationDependencies = undefined; | ||||
| 
 | ||||
| 		/** @private @type {Map<Module, any>} */ | ||||
| 		this._buildingModules = new Map(); | ||||
| 		/** @private @type {Map<Module, any>} */ | ||||
| 		this._rebuildingModules = new Map(); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -272,6 +474,12 @@ class Compilation extends Tapable { | |||
| 		return new Stats(this); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Module} module module to be added that was created | ||||
| 	 * @param {any=} cacheGroup cacheGroup it is apart of | ||||
| 	 * @returns {{module: Module, issuer: boolean, build: boolean, dependencies: boolean}} returns meta about whether or not the module had built | ||||
| 	 * had an issuer, or any dependnecies | ||||
| 	 */ | ||||
| 	addModule(module, cacheGroup) { | ||||
| 		const identifier = module.identifier(); | ||||
| 		const alreadyAddedModule = this._modules.get(identifier); | ||||
|  | @ -327,15 +535,30 @@ class Compilation extends Tapable { | |||
| 		}; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Fetches a module from a compilation by its identifier | ||||
| 	 * @param {Module} module the module provided | ||||
| 	 * @returns {Module} the module requested | ||||
| 	 */ | ||||
| 	getModule(module) { | ||||
| 		const identifier = module.identifier(); | ||||
| 		return this._modules.get(identifier); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Attempts to search for a module by its identifier | ||||
| 	 * @param {string} identifier identifier (usually path) for module | ||||
| 	 * @returns {Module|undefined} attempt to search for module and return it, else undefined | ||||
| 	 */ | ||||
| 	findModule(identifier) { | ||||
| 		return this._modules.get(identifier); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Module} module module with its callback list | ||||
| 	 * @param {any} callback the callback function | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	waitForBuildingFinished(module, callback) { | ||||
| 		let callbackList = this._buildingModules.get(module); | ||||
| 		if (callbackList) { | ||||
|  | @ -345,6 +568,16 @@ class Compilation extends Tapable { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Builds the module object | ||||
| 	 * | ||||
| 	 * @param {Module} module module to be built | ||||
| 	 * @param {boolean} optional optional flag | ||||
| 	 * @param {Module=} origin origin module this module build was requested from | ||||
| 	 * @param {Dependency[]=} dependencies optional dependencies from the module to be built | ||||
| 	 * @param {any} thisCallback the callback | ||||
| 	 * @returns {any} returns the callback function with results | ||||
| 	 */ | ||||
| 	buildModule(module, optional, origin, dependencies, thisCallback) { | ||||
| 		let callbackList = this._buildingModules.get(module); | ||||
| 		if (callbackList) { | ||||
|  | @ -396,6 +629,11 @@ class Compilation extends Tapable { | |||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Module} module to be processed for deps | ||||
| 	 * @param {*} callback callback to be triggered | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	processModuleDependencies(module, callback) { | ||||
| 		const dependencies = new Map(); | ||||
| 
 | ||||
|  | @ -457,6 +695,15 @@ class Compilation extends Tapable { | |||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Module} module module to add deps to | ||||
| 	 * @param {SortedDependency[]} dependencies set of sorted dependencies to iterate through | ||||
| 	 * @param {(boolean|null)=} bail whether to bail or not | ||||
| 	 * @param {any} cacheGroup optional cacheGroup | ||||
| 	 * @param {boolean} recursive whether it is recursive traversal | ||||
| 	 * @param {function} callback callback for when dependencies are finished being added | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	addModuleDependencies( | ||||
| 		module, | ||||
| 		dependencies, | ||||
|  | @ -623,6 +870,14 @@ class Compilation extends Tapable { | |||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * | ||||
| 	 * @param {string} context context string path | ||||
| 	 * @param {Dependency} dependency dependency used to create Module chain | ||||
| 	 * @param {OnModuleCallback} onModule function invoked on modules creation | ||||
| 	 * @param {ModuleChainCallback} callback callback for when module chain is complete | ||||
| 	 * @returns {void|never} will throw if dependency instance is not a valid Dependency | ||||
| 	 */ | ||||
| 	_addModuleChain(context, dependency, onModule, callback) { | ||||
| 		const start = this.profile && Date.now(); | ||||
| 		const currentProfile = this.profile && {}; | ||||
|  | @ -644,7 +899,10 @@ class Compilation extends Tapable { | |||
| 		) { | ||||
| 			throw new Error("Parameter 'dependency' must be a Dependency"); | ||||
| 		} | ||||
| 
 | ||||
| 		// @ts-ignore
 | ||||
| 		// TODO: Not sure how to handle the
 | ||||
| 		// dependency.constructor error,
 | ||||
| 		// maybe I typed it wrong
 | ||||
| 		const moduleFactory = this.dependencyFactories.get(dependency.constructor); | ||||
| 		if (!moduleFactory) { | ||||
| 			throw new Error( | ||||
|  | @ -655,6 +913,7 @@ class Compilation extends Tapable { | |||
| 		} | ||||
| 
 | ||||
| 		this.semaphore.acquire(() => { | ||||
| 			/** @type {ModuleFactory} */ | ||||
| 			moduleFactory.create( | ||||
| 				{ | ||||
| 					contextInfo: { | ||||
|  | @ -731,12 +990,25 @@ class Compilation extends Tapable { | |||
| 		}); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * | ||||
| 	 * @param {string} context context path for entry | ||||
| 	 * @param {PossibleEntryDependencies} entry entry dependency being created | ||||
| 	 * @param {string} name name of entry | ||||
| 	 * @param {ModuleCallback} callback callback function | ||||
| 	 * @returns {void} returns | ||||
| 	 */ | ||||
| 	addEntry(context, entry, name, callback) { | ||||
| 		const slot = { | ||||
| 			name: name, | ||||
| 			request: entry.request, | ||||
| 			request: null, | ||||
| 			module: null | ||||
| 		}; | ||||
| 
 | ||||
| 		if (entry instanceof SingleEntryDependency) { | ||||
| 			slot.request = entry.request; | ||||
| 		} | ||||
| 
 | ||||
| 		this._preparedEntrypoints.push(slot); | ||||
| 		this._addModuleChain( | ||||
| 			context, | ||||
|  | @ -760,6 +1032,12 @@ class Compilation extends Tapable { | |||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {string} context context path string | ||||
| 	 * @param {PossibleEntryDependencies} dependency dep used to create module | ||||
| 	 * @param {ModuleCallback} callback module callback sending module up a level | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	prefetch(context, dependency, callback) { | ||||
| 		this._addModuleChain( | ||||
| 			context, | ||||
|  | @ -831,6 +1109,10 @@ class Compilation extends Tapable { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {CompilationSealCallback} callback signals when the seal method is finishes | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	seal(callback) { | ||||
| 		this.hooks.seal.call(); | ||||
| 
 | ||||
|  | @ -970,10 +1252,19 @@ class Compilation extends Tapable { | |||
| 		}); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Module[]} modules the modules array on compilation to perform the sort for | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	sortModules(modules) { | ||||
| 		modules.sort(byIndexOrIdentifier); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Module} module moulde to report from | ||||
| 	 * @param {DependenciesBlock[]} blocks blocks to report from | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	reportDependencyErrorsAndWarnings(module, blocks) { | ||||
| 		for (let indexBlock = 0; indexBlock < blocks.length; indexBlock++) { | ||||
| 			const block = blocks[indexBlock]; | ||||
|  | @ -1006,6 +1297,13 @@ class Compilation extends Tapable { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {any} groupOptions options provided for group | ||||
| 	 * @param {Module} module module in question | ||||
| 	 * @param {SourceLocation} loc source location reference | ||||
| 	 * @param {string} request request string | ||||
| 	 * @returns {ChunkGroup} the chunk group added inside | ||||
| 	 */ | ||||
| 	addChunkInGroup(groupOptions, module, loc, request) { | ||||
| 		if (typeof groupOptions === "string") { | ||||
| 			groupOptions = { name: groupOptions }; | ||||
|  | @ -1034,6 +1332,13 @@ class Compilation extends Tapable { | |||
| 		return chunkGroup; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * This method first looks to see if a name is provided for a new chunk, | ||||
| 	 * and first looks to see if any named chunks already exist and reuse that chunk instead. | ||||
| 	 * | ||||
| 	 * @param {string=} name optional chunk name to be provided | ||||
| 	 * @returns {Chunk} create a chunk (invoked during seal event) | ||||
| 	 */ | ||||
| 	addChunk(name) { | ||||
| 		if (name) { | ||||
| 			const chunk = this.namedChunks.get(name); | ||||
|  | @ -1049,7 +1354,15 @@ class Compilation extends Tapable { | |||
| 		return chunk; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Module} module index will be assigned to this module | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	assignIndex(module) { | ||||
| 		/** | ||||
| 		 * @param {Module} module assign index to the module | ||||
| 		 * @returns {void} | ||||
| 		 */ | ||||
| 		const assignIndexToModule = module => { | ||||
| 			// enter module
 | ||||
| 			if (typeof module.index !== "number") { | ||||
|  | @ -1069,11 +1382,23 @@ class Compilation extends Tapable { | |||
| 			} | ||||
| 		}; | ||||
| 
 | ||||
| 		/** | ||||
| 		 * @param {DependenciesBlock} block to assign index to | ||||
| 		 * @returns {void} | ||||
| 		 */ | ||||
| 		const assignIndexToDependencyBlock = block => { | ||||
| 			let allDependencies = []; | ||||
| 
 | ||||
| 			/** | ||||
| 			 * @param {Dependency} d iterator over dependencies | ||||
| 			 * @returns {number} returned push function value (side-effect) | ||||
| 			 */ | ||||
| 			const iteratorDependency = d => allDependencies.push(d); | ||||
| 
 | ||||
| 			/** | ||||
| 			 * @param {DependenciesBlock} b blocks to iterate | ||||
| 			 * @returns {number} returned push value from queue (side-effect) | ||||
| 			 */ | ||||
| 			const iteratorBlock = b => | ||||
| 				queue.push(() => assignIndexToDependencyBlock(b)); | ||||
| 
 | ||||
|  | @ -1104,6 +1429,10 @@ class Compilation extends Tapable { | |||
| 			} | ||||
| 		]; | ||||
| 
 | ||||
| 		/** | ||||
| 		 * @param {(Dependency|DependenciesBlockVariable)[]} d all dependencies of a block being added to queue | ||||
| 		 * @returns {void} | ||||
| 		 */ | ||||
| 		const iteratorAllDependencies = d => { | ||||
| 			queue.push(() => assignIndexToDependency(d)); | ||||
| 		}; | ||||
|  | @ -1113,12 +1442,20 @@ class Compilation extends Tapable { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Module} module module to assign depth | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	assignDepth(module) { | ||||
| 		const queue = new Set([module]); | ||||
| 		let depth; | ||||
| 
 | ||||
| 		module.depth = 0; | ||||
| 
 | ||||
| 		/** | ||||
| 		 * @param {Module} module module for processeing | ||||
| 		 * @returns {void} | ||||
| 		 */ | ||||
| 		const enqueueJob = module => { | ||||
| 			const d = module.depth; | ||||
| 			if (typeof d === "number" && d <= depth) return; | ||||
|  | @ -1126,12 +1463,20 @@ class Compilation extends Tapable { | |||
| 			module.depth = depth; | ||||
| 		}; | ||||
| 
 | ||||
| 		const assignDepthToDependency = (dependency, depth) => { | ||||
| 		/** | ||||
| 		 * @param {Dependency} dependency dependency to assign depth to | ||||
| 		 * @returns {void} | ||||
| 		 */ | ||||
| 		const assignDepthToDependency = dependency => { | ||||
| 			if (dependency.module) { | ||||
| 				enqueueJob(dependency.module); | ||||
| 			} | ||||
| 		}; | ||||
| 
 | ||||
| 		/** | ||||
| 		 * @param {DependenciesBlock} block block to assign depth to | ||||
| 		 * @returns {void} | ||||
| 		 */ | ||||
| 		const assignDepthToDependencyBlock = block => { | ||||
| 			if (block.variables) { | ||||
| 				iterationBlockVariable(block.variables, assignDepthToDependency); | ||||
|  | @ -1156,6 +1501,10 @@ class Compilation extends Tapable { | |||
| 	} | ||||
| 
 | ||||
| 	// This method creates the Chunk graph from the Module graph
 | ||||
| 	/** | ||||
| 	 * @param {TODO} inputChunkGroups input chunkGroups to be processed | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	processDependenciesBlocksForChunkGroups(inputChunkGroups) { | ||||
| 		// Process is splitting into two parts:
 | ||||
| 		// Part one traverse the module graph and builds a very basic chunks graph
 | ||||
|  | @ -1169,8 +1518,13 @@ class Compilation extends Tapable { | |||
| 		const allCreatedChunkGroups = new Set(); | ||||
| 
 | ||||
| 		// PREPARE
 | ||||
| 		/** @type {Map<DependenciesBlock, {modules: Set<Module>, blocks: AsyncDependenciesBlock[]}>} */ | ||||
| 		const blockInfoMap = new Map(); | ||||
| 
 | ||||
| 		/** | ||||
| 		 * @param {Dependency} d dependency to iterate over | ||||
| 		 * @returns {void} | ||||
| 		 */ | ||||
| 		const iteratorDependency = d => { | ||||
| 			// We skip Dependencies without Reference
 | ||||
| 			const ref = d.getReference(); | ||||
|  | @ -1190,12 +1544,23 @@ class Compilation extends Tapable { | |||
| 			blockInfoModules.add(refModule); | ||||
| 		}; | ||||
| 
 | ||||
| 		/** | ||||
| 		 * @param {AsyncDependenciesBlock} b blocks to prepare | ||||
| 		 * @returns {void} | ||||
| 		 */ | ||||
| 		const iteratorBlockPrepare = b => { | ||||
| 			blockInfoBlocks.push(b); | ||||
| 			blockQueue.push(b); | ||||
| 		}; | ||||
| 
 | ||||
| 		let block, blockQueue, blockInfoModules, blockInfoBlocks; | ||||
| 		/** @type {DependenciesBlock} */ | ||||
| 		let block; | ||||
| 		/** @type {DependenciesBlock[]} */ | ||||
| 		let blockQueue; | ||||
| 		/** @type {Set<Module>} */ | ||||
| 		let blockInfoModules; | ||||
| 		/** @type {AsyncDependenciesBlock[]} */ | ||||
| 		let blockInfoBlocks; | ||||
| 		for (const module of this.modules) { | ||||
| 			blockQueue = [module]; | ||||
| 			while (blockQueue.length > 0) { | ||||
|  | @ -1224,10 +1589,12 @@ class Compilation extends Tapable { | |||
| 		} | ||||
| 
 | ||||
| 		// PART ONE
 | ||||
| 
 | ||||
| 		/** @type {Map<DependenciesBlock, ChunkGroup>} */ | ||||
| 		const blockChunkGroups = new Map(); | ||||
| 
 | ||||
| 		// Start with the provided modules/chunks
 | ||||
| 		/** @type {{block: DependenciesBlock, module: Module, chunk: Chunk, chunkGroup: ChunkGroup}[]} */ | ||||
| 
 | ||||
| 		const queue = inputChunkGroups.map(chunkGroup => ({ | ||||
| 			block: chunkGroup.chunks[0].entryModule, | ||||
| 			module: chunkGroup.chunks[0].entryModule, | ||||
|  | @ -1235,9 +1602,18 @@ class Compilation extends Tapable { | |||
| 			chunkGroup | ||||
| 		})); | ||||
| 
 | ||||
| 		let module, chunk, chunkGroup; | ||||
| 		/** @type {Module} */ | ||||
| 		let module; | ||||
| 		/** @type {Chunk} */ | ||||
| 		let chunk; | ||||
| 		/** @type {ChunkGroup} */ | ||||
| 		let chunkGroup; | ||||
| 
 | ||||
| 		// For each async Block in graph
 | ||||
| 		/** | ||||
| 		 * @param {AsyncDependenciesBlock} b iterating over each Async DepBlock | ||||
| 		 * @returns {void} | ||||
| 		 */ | ||||
| 		const iteratorBlock = b => { | ||||
| 			// 1. We create a chunk for this Block
 | ||||
| 			// but only once (blockChunkGroups map)
 | ||||
|  | @ -1315,9 +1691,10 @@ class Compilation extends Tapable { | |||
| 		} | ||||
| 
 | ||||
| 		// PART TWO
 | ||||
| 
 | ||||
| 		/** @type {Set<Module>} */ | ||||
| 		let availableModules; | ||||
| 		let newAvailableModules; | ||||
| 		/** @type {Queue<AvailableModulesChunkGroupMapping>} */ | ||||
| 		const queue2 = new Queue( | ||||
| 			inputChunkGroups.map(chunkGroup => ({ | ||||
| 				chunkGroup, | ||||
|  | @ -1325,7 +1702,13 @@ class Compilation extends Tapable { | |||
| 			})) | ||||
| 		); | ||||
| 
 | ||||
| 		// Helper function to check if all modules of a chunk are available
 | ||||
| 		/** | ||||
| 		 * Helper function to check if all modules of a chunk are available | ||||
| 		 * | ||||
| 		 * @param {ChunkGroup} chunkGroup the chunkGroup to scan | ||||
| 		 * @param {Set<Module>} availableModules the comparitor set | ||||
| 		 * @returns {boolean} return true if all modules of a chunk are available | ||||
| 		 */ | ||||
| 		const areModulesAvailable = (chunkGroup, availableModules) => { | ||||
| 			for (const chunk of chunkGroup.chunks) { | ||||
| 				for (const module of chunk.modulesIterable) { | ||||
|  | @ -1336,14 +1719,18 @@ class Compilation extends Tapable { | |||
| 		}; | ||||
| 
 | ||||
| 		// For each edge in the basic chunk graph
 | ||||
| 		/** | ||||
| 		 * @param {TODO} dep the dependency used for filtering | ||||
| 		 * @returns {boolean} used to filter "edges" (aka Dependencies) that were pointing | ||||
| 		 * to modules that are already available. Also filters circular dependencies in the chunks graph | ||||
| 		 */ | ||||
| 		const filterFn = dep => { | ||||
| 			// Filter egdes that are not needed because all modules are already available
 | ||||
| 			// This also filters circular dependencies in the chunks graph
 | ||||
| 			const depChunkGroup = dep.chunkGroup; | ||||
| 			if (areModulesAvailable(depChunkGroup, newAvailableModules)) return false; // break all modules are already available
 | ||||
| 			return true; | ||||
| 		}; | ||||
| 
 | ||||
| 		/** @type {Map<ChunkGroup, Set<Module>>} */ | ||||
| 		const minAvailableModulesMap = new Map(); | ||||
| 
 | ||||
| 		// Iterative traversing of the basic chunk graph
 | ||||
|  | @ -1425,6 +1812,12 @@ class Compilation extends Tapable { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * | ||||
| 	 * @param {Module} module module relationship for removal | ||||
| 	 * @param {DependenciesBlock} block //TODO: good description
 | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	removeReasonsOfDependencyBlock(module, block) { | ||||
| 		const iteratorDependency = d => { | ||||
| 			if (!d.module) { | ||||
|  | @ -1452,6 +1845,11 @@ class Compilation extends Tapable { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Module} module module to patch tie | ||||
| 	 * @param {Chunk} chunk chunk to patch tie | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	patchChunksAfterReasonRemoval(module, chunk) { | ||||
| 		if (!module.hasReasons()) { | ||||
| 			this.removeReasonsOfDependencyBlock(module, module); | ||||
|  | @ -1463,6 +1861,12 @@ class Compilation extends Tapable { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * | ||||
| 	 * @param {DependenciesBlock} block block tie for Chunk | ||||
| 	 * @param {Chunk} chunk chunk to remove from dep | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	removeChunkFromDependencies(block, chunk) { | ||||
| 		const iteratorDependency = d => { | ||||
| 			if (!d.module) { | ||||
|  | @ -1473,12 +1877,15 @@ class Compilation extends Tapable { | |||
| 
 | ||||
| 		const blocks = block.blocks; | ||||
| 		for (let indexBlock = 0; indexBlock < blocks.length; indexBlock++) { | ||||
| 			const chunks = blocks[indexBlock].chunks; | ||||
| 			// Grab all chunks from the first Block's AsyncDepBlock
 | ||||
| 			const chunks = blocks[indexBlock].chunkGroup.chunks; | ||||
| 			// For each chunk in chunkGroup
 | ||||
| 			for (let indexChunk = 0; indexChunk < chunks.length; indexChunk++) { | ||||
| 				const blockChunk = chunks[indexChunk]; | ||||
| 				chunk.removeChunk(blockChunk); | ||||
| 				blockChunk.removeParent(chunk); | ||||
| 				this.removeChunkFromDependencies(chunks, blockChunk); | ||||
| 				const iteratedChunk = chunks[indexChunk]; | ||||
| 				block.chunkGroup.removeChunk(iteratedChunk); | ||||
| 				block.chunkGroup.removeParent(iteratedChunk); | ||||
| 				// Recurse
 | ||||
| 				this.removeChunkFromDependencies(block, iteratedChunk); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  | @ -1539,6 +1946,7 @@ class Compilation extends Tapable { | |||
| 	} | ||||
| 
 | ||||
| 	applyChunkIds() { | ||||
| 		/** @type {Set<number|string>} */ | ||||
| 		const usedIds = new Set(); | ||||
| 
 | ||||
| 		// Get used ids from usedChunkIds property (i. e. from records)
 | ||||
|  | @ -1568,11 +1976,15 @@ class Compilation extends Tapable { | |||
| 		// Calculate maximum assigned chunk id
 | ||||
| 		let nextFreeChunkId = -1; | ||||
| 		for (const id of usedIds) { | ||||
| 			if (typeof id !== "number") { | ||||
| 				continue; | ||||
| 			} | ||||
| 			nextFreeChunkId = Math.max(nextFreeChunkId, id); | ||||
| 		} | ||||
| 		nextFreeChunkId++; | ||||
| 
 | ||||
| 		// Determine free chunk ids from 0 to maximum
 | ||||
| 		/** @type {number[]} */ | ||||
| 		const unusedIds = []; | ||||
| 		if (nextFreeChunkId > 0) { | ||||
| 			let index = nextFreeChunkId; | ||||
|  | @ -1630,6 +2042,16 @@ class Compilation extends Tapable { | |||
| 			chunks[indexChunk].sortItems(true); | ||||
| 		} | ||||
| 
 | ||||
| 		/** | ||||
| 		 * Used to sort errors and warnings in compilation. this.warnings, and | ||||
| 		 * this.errors contribute to the compilation hash and therefore shoudl be | ||||
| 		 * updated whenever other references (having a chunk id) are sorted. This preserves the hash | ||||
| 		 * integrity | ||||
| 		 * | ||||
| 		 * @param {WebpackError} a first WebpackError instance (including subclasses) | ||||
| 		 * @param {WebpackError} b second WebpackError instance (including subclasses) | ||||
| 		 * @returns {-1|0|1} sort order index | ||||
| 		 */ | ||||
| 		const byMessage = (a, b) => { | ||||
| 			const ma = `${a.message}`; | ||||
| 			const mb = `${b.message}`; | ||||
|  | @ -1746,6 +2168,10 @@ class Compilation extends Tapable { | |||
| 		this.hash = this.fullHash.substr(0, hashDigestLength); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {TODO} update //TODO (update hash function?)
 | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	modifyHash(update) { | ||||
| 		const outputOptions = this.outputOptions; | ||||
| 		const hashFunction = outputOptions.hashFunction; | ||||
|  | @ -1839,12 +2265,27 @@ class Compilation extends Tapable { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {string} filename used to get asset path with hash | ||||
| 	 * @param {TODO=} data // TODO: figure out this param type
 | ||||
| 	 * @returns {TODO} figure out this return type | ||||
| 	 */ | ||||
| 	getPath(filename, data) { | ||||
| 		data = data || {}; | ||||
| 		data.hash = data.hash || this.hash; | ||||
| 		return this.mainTemplate.getAssetPath(filename, data); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * This function allows you to run another instance of webpack inside of webpack however as | ||||
| 	 * a child with different settings and configurations (if desired) applied. It copies all hooks, plugins | ||||
| 	 * from parent (or top level compiler) and creates a child Compilation | ||||
| 	 * | ||||
| 	 * @param {string} name name of the child compiler | ||||
| 	 * @param {TODO} outputOptions // Need to convert config schema to types for this
 | ||||
| 	 * @param {Plugin[]} plugins webpack plugins that will be applied | ||||
| 	 * @returns {Compiler} creates a child Compiler instance | ||||
| 	 */ | ||||
| 	createChildCompiler(name, outputOptions, plugins) { | ||||
| 		const idx = this.childrenCounters[name] || 0; | ||||
| 		this.childrenCounters[name] = idx + 1; | ||||
|  | @ -1858,6 +2299,7 @@ class Compilation extends Tapable { | |||
| 	} | ||||
| 
 | ||||
| 	checkConstraints() { | ||||
| 		/** @type {Set<number|string>} */ | ||||
| 		const usedIds = new Set(); | ||||
| 
 | ||||
| 		const modules = this.modules; | ||||
|  |  | |||
|  | @ -26,38 +26,92 @@ const RequestShortener = require("./RequestShortener"); | |||
| const { makePathsRelative } = require("./util/identifier"); | ||||
| const ConcurrentCompilationError = require("./ConcurrentCompilationError"); | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} CompilationParams | ||||
|  * @property {NormalModuleFactory} normalModuleFactory | ||||
|  * @property {ContextModuleFactory} contextModuleFactory | ||||
|  * @property {Set<any>} compilationDependencies | ||||
|  */ | ||||
| 
 | ||||
| /** @typedef {string|string[]} EntryValues */ | ||||
| /** @typedef {{[entryKey: string]: EntryValues}} EntryOptionValues */ | ||||
| /** @typedef {(() => EntryOptionValues) | EntryOptionValues | EntryValues} EntryOptions */ | ||||
| 
 | ||||
| class Compiler extends Tapable { | ||||
| 	constructor(context) { | ||||
| 		super(); | ||||
| 		this.hooks = { | ||||
| 			/** @type {SyncBailHook<Compilation>} */ | ||||
| 			shouldEmit: new SyncBailHook(["compilation"]), | ||||
| 
 | ||||
| 			/** @type {AsyncSeriesHook<Stats>} */ | ||||
| 			done: new AsyncSeriesHook(["stats"]), | ||||
| 
 | ||||
| 			/** @type {AsyncSeriesHook<>} */ | ||||
| 			additionalPass: new AsyncSeriesHook([]), | ||||
| 			beforeRun: new AsyncSeriesHook(["compilation"]), | ||||
| 			run: new AsyncSeriesHook(["compilation"]), | ||||
| 
 | ||||
| 			/** @type {AsyncSeriesHook<Compiler>} */ | ||||
| 			beforeRun: new AsyncSeriesHook(["compiler"]), | ||||
| 
 | ||||
| 			/** @type {AsyncSeriesHook<Compiler>} */ | ||||
| 			run: new AsyncSeriesHook(["compiler"]), | ||||
| 
 | ||||
| 			/** @type {AsyncSeriesHook<Compilation>} */ | ||||
| 			emit: new AsyncSeriesHook(["compilation"]), | ||||
| 
 | ||||
| 			/** @type {AsyncSeriesHook<Compilation>} */ | ||||
| 			afterEmit: new AsyncSeriesHook(["compilation"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<Compilation, CompilationParams>} */ | ||||
| 			thisCompilation: new SyncHook(["compilation", "params"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<Compilation, CompilationParams>} */ | ||||
| 			compilation: new SyncHook(["compilation", "params"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<NormalModuleFactory>} */ | ||||
| 			normalModuleFactory: new SyncHook(["normalModuleFactory"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<ContextModuleFactory>}  */ | ||||
| 			contextModuleFactory: new SyncHook(["contextModulefactory"]), | ||||
| 
 | ||||
| 			/** @type {AsyncSeriesHook<CompilationParams>} */ | ||||
| 			beforeCompile: new AsyncSeriesHook(["params"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<CompilationParams>} */ | ||||
| 			compile: new SyncHook(["params"]), | ||||
| 
 | ||||
| 			/** @type {AsyncParallelHook<Compilation>} */ | ||||
| 			make: new AsyncParallelHook(["compilation"]), | ||||
| 
 | ||||
| 			/** @type {AsyncSeriesHook<Compilation>} */ | ||||
| 			afterCompile: new AsyncSeriesHook(["compilation"]), | ||||
| 
 | ||||
| 			/** @type {AsyncSeriesHook<Compiler>} */ | ||||
| 			watchRun: new AsyncSeriesHook(["compiler"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<Error>} */ | ||||
| 			failed: new SyncHook(["error"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook<string, string>} */ | ||||
| 			invalid: new SyncHook(["filename", "changeTime"]), | ||||
| 
 | ||||
| 			/** @type {SyncHook} */ | ||||
| 			watchClose: new SyncHook([]), | ||||
| 
 | ||||
| 			// TODO the following hooks are weirdly located here
 | ||||
| 			// TODO move them for webpack 5
 | ||||
| 			/** @type {SyncHook} */ | ||||
| 			environment: new SyncHook([]), | ||||
| 			/** @type {SyncHook} */ | ||||
| 			afterEnvironment: new SyncHook([]), | ||||
| 			/** @type {SyncHook<Compiler>} */ | ||||
| 			afterPlugins: new SyncHook(["compiler"]), | ||||
| 			/** @type {SyncHook<Compiler>} */ | ||||
| 			afterResolvers: new SyncHook(["compiler"]), | ||||
| 			/** @type {SyncBailHook<string, EntryOptions>} */ | ||||
| 			entryOption: new SyncBailHook(["context", "entry"]) | ||||
| 		}; | ||||
| 
 | ||||
| 		this._pluginCompat.tap("Compiler", options => { | ||||
| 			switch (options.name) { | ||||
| 				case "additional-pass": | ||||
|  | @ -74,19 +128,26 @@ class Compiler extends Tapable { | |||
| 			} | ||||
| 		}); | ||||
| 
 | ||||
| 		/** @type {string=} */ | ||||
| 		this.name = undefined; | ||||
| 		/** @type {Compilation=} */ | ||||
| 		this.parentCompilation = undefined; | ||||
| 		/** @type {string} */ | ||||
| 		this.outputPath = ""; | ||||
| 
 | ||||
| 		this.outputFileSystem = null; | ||||
| 		this.inputFileSystem = null; | ||||
| 
 | ||||
| 		/** @type {string|null} */ | ||||
| 		this.recordsInputPath = null; | ||||
| 		/** @type {string|null} */ | ||||
| 		this.recordsOutputPath = null; | ||||
| 		this.records = {}; | ||||
| 
 | ||||
| 		/** @type {Map<string, number>} */ | ||||
| 		this.fileTimestamps = new Map(); | ||||
| 		/** @type {Map<string, number>} */ | ||||
| 		this.contextTimestamps = new Map(); | ||||
| 
 | ||||
| 		/** @type {ResolverFactory} */ | ||||
| 		this.resolverFactory = new ResolverFactory(); | ||||
| 
 | ||||
| 		// TODO remove in webpack 5
 | ||||
|  | @ -135,6 +196,7 @@ class Compiler extends Tapable { | |||
| 
 | ||||
| 		this.requestShortener = new RequestShortener(context); | ||||
| 
 | ||||
| 		/** @type {boolean} */ | ||||
| 		this.running = false; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ const util = require("util"); | |||
| const { OriginalSource, RawSource } = require("webpack-sources"); | ||||
| const Module = require("./Module"); | ||||
| const AsyncDependenciesBlock = require("./AsyncDependenciesBlock"); | ||||
| const ModuleDependency = require("./dependencies/ModuleDependency"); | ||||
| const Template = require("./Template"); | ||||
| 
 | ||||
| class ContextModule extends Module { | ||||
|  | @ -645,10 +646,10 @@ webpackEmptyAsyncContext.id = ${JSON.stringify(id)};`; | |||
| 		const initialSize = 160; | ||||
| 
 | ||||
| 		// if we dont have dependencies we stop here.
 | ||||
| 		return this.dependencies.reduce( | ||||
| 			(size, dependency) => size + 5 + dependency.userRequest.length, | ||||
| 			initialSize | ||||
| 		); | ||||
| 		return this.dependencies.reduce((size, dependency) => { | ||||
| 			if (dependency instanceof ModuleDependency) | ||||
| 				return size + 5 + dependency.userRequest.length; | ||||
| 		}, initialSize); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,6 +11,8 @@ const WebpackMissingModule = require("./dependencies/WebpackMissingModule"); | |||
| const DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency"); | ||||
| const DelegatedExportsDependency = require("./dependencies/DelegatedExportsDependency"); | ||||
| 
 | ||||
| /** @typedef {import("./dependencies/ModuleDependency")} ModuleDependency */ | ||||
| 
 | ||||
| class DelegatedModule extends Module { | ||||
| 	constructor(sourceRequest, data, type, userRequest, originalRequest) { | ||||
| 		super("javascript/dynamic", null); | ||||
|  | @ -48,6 +50,8 @@ class DelegatedModule extends Module { | |||
| 		this.built = true; | ||||
| 		this.buildMeta = Object.assign({}, this.delegateData.buildMeta); | ||||
| 		this.buildInfo = {}; | ||||
| 		/** @type {ModuleDependency[]=} */ | ||||
| 		this.dependencies = []; | ||||
| 		this.addDependency(new DelegatedSourceDependency(this.sourceRequest)); | ||||
| 		this.addDependency( | ||||
| 			new DelegatedExportsDependency(this, this.delegateData.exports || true) | ||||
|  |  | |||
|  | @ -6,23 +6,46 @@ | |||
| 
 | ||||
| const DependenciesBlockVariable = require("./DependenciesBlockVariable"); | ||||
| 
 | ||||
| /** @typedef {import("./ChunkGroup")} ChunkGroup */ | ||||
| /** | ||||
|  * @typedef {import("./ChunkGroup")} ChunkGroup | ||||
|  * @typedef {import("./Dependency")} Dependency | ||||
|  * @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock | ||||
|  * @typedef {import("./DependenciesBlockVariable")} DependenciesBlockVariable | ||||
|  * @typedef {(d: Dependency) => boolean} DependencyFilterFunction | ||||
|  * @typedef {import("crypto").Hash} Hash | ||||
|  */ | ||||
| 
 | ||||
| class DependenciesBlock { | ||||
| 	constructor() { | ||||
| 		/** @type {Dependency[]} */ | ||||
| 		this.dependencies = []; | ||||
| 		/** @type {AsyncDependenciesBlock[]} */ | ||||
| 		this.blocks = []; | ||||
| 		/** @type {DependenciesBlockVariable[]} */ | ||||
| 		this.variables = []; | ||||
| 		// TODO remove this line, it's wrong
 | ||||
| 		/** @type {ChunkGroup=} */ | ||||
| 		this.chunkGroup = undefined; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Adds a DependencyBlock to DependencyBlock relationship. | ||||
| 	 * This is used for when a Module has a AsyncDependencyBlock tie (for code-splitting) | ||||
| 	 * | ||||
| 	 * @param {AsyncDependenciesBlock} block block being added | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	addBlock(block) { | ||||
| 		this.blocks.push(block); | ||||
| 		block.parent = this; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {string} name name of dependency | ||||
| 	 * @param {string} expression expression string for variable | ||||
| 	 * @param {Dependency[]} dependencies dependency instances tied to variable | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	addVariable(name, expression, dependencies) { | ||||
| 		for (let v of this.variables) { | ||||
| 			if (v.name === name && v.expression === expression) { | ||||
|  | @ -34,15 +57,28 @@ class DependenciesBlock { | |||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Dependency} dependency dependency being tied to block. | ||||
| 	 * This is an "edge" pointing to another "node" on module graph. | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	addDependency(dependency) { | ||||
| 		this.dependencies.push(dependency); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Dependency} dependency dependency being removed | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	removeDependency(dependency) { | ||||
| 		const idx = this.dependencies.indexOf(dependency); | ||||
| 		if (idx >= 0) this.dependencies.splice(idx, 1); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Hash} hash the hash used to track dependencies, from "crypto" module | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	updateHash(hash) { | ||||
| 		for (const dep of this.dependencies) dep.updateHash(hash); | ||||
| 		for (const block of this.blocks) block.updateHash(hash); | ||||
|  | @ -59,6 +95,10 @@ class DependenciesBlock { | |||
| 		for (const block of this.blocks) block.unseal(); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {DependencyFilterFunction} filter filter function for dependencies, gets passed all dependency ties from current instance | ||||
| 	 * @returns {boolean} returns boolean for filter | ||||
| 	 */ | ||||
| 	hasDependencies(filter) { | ||||
| 		if (filter) { | ||||
| 			for (const dep of this.dependencies) { | ||||
|  |  | |||
|  | @ -6,13 +6,29 @@ | |||
| 
 | ||||
| const { RawSource, ReplaceSource } = require("webpack-sources"); | ||||
| 
 | ||||
| /** @typedef {import("./Dependency")} Dependency */ | ||||
| /** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */ | ||||
| /** @typedef {import("crypto").Hash} Hash */ | ||||
| /** @typedef {(d: Dependency) => boolean} DependencyFilterFunction */ | ||||
| /** @typedef {Map<Dependency["constructor"], any>} DependencyFactoryConstruction */ | ||||
| 
 | ||||
| class DependenciesBlockVariable { | ||||
| 	/** | ||||
| 	 * Creates an instance of DependenciesBlockVariable. | ||||
| 	 * @param {string} name name of DependenciesBlockVariable | ||||
| 	 * @param {string} expression expression string | ||||
| 	 * @param {Dependency[]=} dependencies dependencies tied to this varaiable | ||||
| 	 */ | ||||
| 	constructor(name, expression, dependencies) { | ||||
| 		this.name = name; | ||||
| 		this.expression = expression; | ||||
| 		this.dependencies = dependencies || []; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Hash} hash hash for instance to update | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	updateHash(hash) { | ||||
| 		hash.update(this.name); | ||||
| 		hash.update(this.expression); | ||||
|  | @ -21,8 +37,13 @@ class DependenciesBlockVariable { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {DependencyFactoryConstruction} dependencyTemplates Dependency constructors and templates Map. | ||||
| 	 * @param {RuntimeTemplate} runtimeTemplate runtimeTemplate to generate expression souce | ||||
| 	 * @returns {ReplaceSource} returns constructed source for expression via templates | ||||
| 	 */ | ||||
| 	expressionSource(dependencyTemplates, runtimeTemplate) { | ||||
| 		const source = new ReplaceSource(new RawSource(this.expression)); | ||||
| 		const source = new ReplaceSource(new RawSource(this.expression), null); | ||||
| 		for (const dep of this.dependencies) { | ||||
| 			const template = dependencyTemplates.get(dep.constructor); | ||||
| 			if (!template) | ||||
|  |  | |||
|  | @ -7,8 +7,11 @@ | |||
| const compareLocations = require("./compareLocations"); | ||||
| const DependencyReference = require("./dependencies/DependencyReference"); | ||||
| 
 | ||||
| /** @typedef {import("./Module")} Module */ | ||||
| 
 | ||||
| class Dependency { | ||||
| 	constructor() { | ||||
| 		/** @type {Module|null} */ | ||||
| 		this.module = null; | ||||
| 		this.weak = false; | ||||
| 		this.optional = false; | ||||
|  |  | |||
|  | @ -10,12 +10,25 @@ const MultiModuleFactory = require("./MultiModuleFactory"); | |||
| const MultiEntryPlugin = require("./MultiEntryPlugin"); | ||||
| const SingleEntryPlugin = require("./SingleEntryPlugin"); | ||||
| 
 | ||||
| /** @typedef {import("./Compiler")} Compiler */ | ||||
| /** @typedef {string|string[]} EntryValues */ | ||||
| /** @typedef {{[entryKey: string]: EntryValues | EntryValues}} EntryOptionValues */ | ||||
| /** @typedef {(() => (EntryOptionValues|EntryValues))} EntryOptionValuesFunction */ | ||||
| 
 | ||||
| class DynamicEntryPlugin { | ||||
| 	/** | ||||
| 	 * @param {string} context the context path | ||||
| 	 * @param {EntryOptionValuesFunction} entry the entry value | ||||
| 	 */ | ||||
| 	constructor(context, entry) { | ||||
| 		this.context = context; | ||||
| 		this.entry = entry; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Compiler} compiler the compiler instance | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	apply(compiler) { | ||||
| 		compiler.hooks.compilation.tap( | ||||
| 			"DynamicEntryPlugin", | ||||
|  | @ -36,6 +49,11 @@ class DynamicEntryPlugin { | |||
| 		compiler.hooks.make.tapAsync( | ||||
| 			"DynamicEntryPlugin", | ||||
| 			(compilation, callback) => { | ||||
| 				/** | ||||
| 				 * @param {string|string[]} entry entry value or array of entry values | ||||
| 				 * @param {string} name name of entry | ||||
| 				 * @returns {Promise<any>} returns the promise resolving the Compilation#addEntry function | ||||
| 				 */ | ||||
| 				const addEntry = (entry, name) => { | ||||
| 					const dep = DynamicEntryPlugin.createDependency(entry, name); | ||||
| 					return new Promise((resolve, reject) => { | ||||
|  | @ -63,7 +81,11 @@ class DynamicEntryPlugin { | |||
| } | ||||
| 
 | ||||
| module.exports = DynamicEntryPlugin; | ||||
| 
 | ||||
| /** | ||||
|  * @param {string|string[]} entry entry value or array of entry paths | ||||
|  * @param {string} name name of entry | ||||
|  * @returns {SingleEntryDependency|MultiEntryDependency} returns dep | ||||
|  */ | ||||
| DynamicEntryPlugin.createDependency = (entry, name) => { | ||||
| 	if (Array.isArray(entry)) | ||||
| 		return MultiEntryPlugin.createDependency(entry, name); | ||||
|  |  | |||
|  | @ -8,6 +8,14 @@ const SingleEntryPlugin = require("./SingleEntryPlugin"); | |||
| const MultiEntryPlugin = require("./MultiEntryPlugin"); | ||||
| const DynamicEntryPlugin = require("./DynamicEntryPlugin"); | ||||
| 
 | ||||
| /** @typedef {import("./Compiler")} Compiler */ | ||||
| 
 | ||||
| /** | ||||
|  * @param {string} context context path | ||||
|  * @param {string | string[]} item entry array or single path | ||||
|  * @param {string} name entry key name | ||||
|  * @returns {SingleEntryPlugin | MultiEntryPlugin} returns either a single or multi entry plugin | ||||
|  */ | ||||
| const itemToPlugin = (context, item, name) => { | ||||
| 	if (Array.isArray(item)) { | ||||
| 		return new MultiEntryPlugin(context, item, name); | ||||
|  | @ -16,6 +24,10 @@ const itemToPlugin = (context, item, name) => { | |||
| }; | ||||
| 
 | ||||
| module.exports = class EntryOptionPlugin { | ||||
| 	/** | ||||
| 	 * @param {Compiler} compiler the compiler instance one is tapping into | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	apply(compiler) { | ||||
| 		compiler.hooks.entryOption.tap("EntryOptionPlugin", (context, entry) => { | ||||
| 			if (typeof entry === "string" || Array.isArray(entry)) { | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ class JavascriptGenerator { | |||
| 			return new RawSource("throw new Error('No source available');"); | ||||
| 		} | ||||
| 
 | ||||
| 		const source = new ReplaceSource(originalSource); | ||||
| 		const source = new ReplaceSource(originalSource, null); | ||||
| 
 | ||||
| 		this.sourceBlock( | ||||
| 			module, | ||||
|  |  | |||
|  | @ -11,8 +11,14 @@ const ModuleReason = require("./ModuleReason"); | |||
| const SortableSet = require("./util/SortableSet"); | ||||
| const Template = require("./Template"); | ||||
| 
 | ||||
| <<<<<<< HEAD | ||||
| /** @typedef {import("./Chunk")} Chunk */ | ||||
| /** @typedef {import("./RequestShortener")} RequestShortener */ | ||||
| ======= | ||||
| /** @typedef {typeof import("./Chunk")} Chunk */ | ||||
| /** @typedef {typeof import("./RequestShortener")} RequestShortener */ | ||||
| /** @typedef {import("./WebpackError")} WebpackError */ | ||||
| >>>>>>> 206d1a6... chore(types): add Compiler and Compilation type support | ||||
| 
 | ||||
| const EMPTY_RESOLVE_OPTIONS = {}; | ||||
| 
 | ||||
|  | @ -47,15 +53,15 @@ class Module extends DependenciesBlock { | |||
| 		this.renderedHash = undefined; | ||||
| 
 | ||||
| 		// Info from Factory
 | ||||
| 		/** @type {object} */ | ||||
| 		/** @type {any} */ | ||||
| 		this.resolveOptions = EMPTY_RESOLVE_OPTIONS; | ||||
| 		/** @type {object} */ | ||||
| 		this.factoryMeta = {}; | ||||
| 
 | ||||
| 		// Info from Build
 | ||||
| 		/** @type {Error[]} */ | ||||
| 		/** @type {WebpackError[]} */ | ||||
| 		this.warnings = []; | ||||
| 		/** @type {Error[]} */ | ||||
| 		/** @type {WebpackError[]} */ | ||||
| 		this.errors = []; | ||||
| 		/** @type {object} */ | ||||
| 		this.buildMeta = undefined; | ||||
|  |  | |||
|  | @ -8,13 +8,25 @@ const MultiEntryDependency = require("./dependencies/MultiEntryDependency"); | |||
| const SingleEntryDependency = require("./dependencies/SingleEntryDependency"); | ||||
| const MultiModuleFactory = require("./MultiModuleFactory"); | ||||
| 
 | ||||
| module.exports = class MultiEntryPlugin { | ||||
| /** @typedef {import("./Compiler")} Compiler */ | ||||
| 
 | ||||
| class MultiEntryPlugin { | ||||
| 	/** | ||||
| 	 * The MultiEntryPlugin is invoked whenever this.options.entry value is an array of paths | ||||
| 	 * @param {string} context context path | ||||
| 	 * @param {string[]} entries array of entry paths | ||||
| 	 * @param {string} name entry key name | ||||
| 	 */ | ||||
| 	constructor(context, entries, name) { | ||||
| 		this.context = context; | ||||
| 		this.entries = entries; | ||||
| 		this.name = name; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Compiler} compiler the compiler instance | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	apply(compiler) { | ||||
| 		compiler.hooks.compilation.tap( | ||||
| 			"MultiEntryPlugin", | ||||
|  | @ -43,6 +55,11 @@ module.exports = class MultiEntryPlugin { | |||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {string[]} entries each entry path string | ||||
| 	 * @param {string} name name of the entry | ||||
| 	 * @return {MultiEntryDependency} returns a constructed Dependency | ||||
| 	 */ | ||||
| 	static createDependency(entries, name) { | ||||
| 		return new MultiEntryDependency( | ||||
| 			entries.map((e, idx) => { | ||||
|  | @ -55,4 +72,6 @@ module.exports = class MultiEntryPlugin { | |||
| 			name | ||||
| 		); | ||||
| 	} | ||||
| }; | ||||
| } | ||||
| 
 | ||||
| module.exports = MultiEntryPlugin; | ||||
|  |  | |||
|  | @ -218,6 +218,8 @@ class NormalModule extends Module { | |||
| 		} | ||||
| 
 | ||||
| 		if (Buffer.isBuffer(source)) { | ||||
| 			// @ts-ignore
 | ||||
| 			// TODO We need to fix @types/webpack-sources to allow RawSource to take a Buffer | string
 | ||||
| 			return new RawSource(source); | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,13 +5,27 @@ | |||
| "use strict"; | ||||
| const SingleEntryDependency = require("./dependencies/SingleEntryDependency"); | ||||
| 
 | ||||
| /** @typedef {import("./Compiler")} Compiler */ | ||||
| 
 | ||||
| class SingleEntryPlugin { | ||||
| 	/** | ||||
| 	 * An entry plugin which will handle | ||||
| 	 * creation of the SingleEntryDependency | ||||
| 	 * | ||||
| 	 * @param {string} context context path | ||||
| 	 * @param {string} entry entry path | ||||
| 	 * @param {string} name entry key name | ||||
| 	 */ | ||||
| 	constructor(context, entry, name) { | ||||
| 		this.context = context; | ||||
| 		this.entry = entry; | ||||
| 		this.name = name; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {Compiler} compiler the compiler instance | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	apply(compiler) { | ||||
| 		compiler.hooks.compilation.tap( | ||||
| 			"SingleEntryPlugin", | ||||
|  |  | |||
|  | @ -4,11 +4,16 @@ | |||
| */ | ||||
| "use strict"; | ||||
| 
 | ||||
| module.exports = class WebpackError extends Error { | ||||
| class WebpackError extends Error { | ||||
| 	constructor(message) { | ||||
| 		super(message); | ||||
| 
 | ||||
| 		this.details = undefined; | ||||
| 		this.missing = undefined; | ||||
| 		this.origin = undefined; | ||||
| 		this.dependencies = undefined; | ||||
| 		this.module = undefined; | ||||
| 		this.message = undefined; | ||||
| 
 | ||||
| 		Error.captureStackTrace(this, this.constructor); | ||||
| 	} | ||||
|  | @ -16,4 +21,6 @@ module.exports = class WebpackError extends Error { | |||
| 	inspect() { | ||||
| 		return this.stack + (this.details ? `\n${this.details}` : ""); | ||||
| 	} | ||||
| }; | ||||
| } | ||||
| 
 | ||||
| module.exports = WebpackError; | ||||
|  |  | |||
|  | @ -4,7 +4,16 @@ | |||
| */ | ||||
| "use strict"; | ||||
| 
 | ||||
| /** @typedef {import('../Module')} Module */ | ||||
| 
 | ||||
| class DependencyReference { | ||||
| 	/** | ||||
| 	 * Creates an instance of DependencyReference. | ||||
| 	 * @param {Module} module module there reference comes from | ||||
| 	 * @param {string[]|boolean} importedNames imported names or boolean | ||||
| 	 * @param {boolean} weak is weak reference or not | ||||
| 	 * @memberof DependencyReference | ||||
| 	 */ | ||||
| 	constructor(module, importedNames, weak) { | ||||
| 		this.module = module; | ||||
| 		// true: full object
 | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| const LoaderDependency = require("./LoaderDependency"); | ||||
| const NormalModule = require("../NormalModule"); | ||||
| 
 | ||||
| class LoaderPlugin { | ||||
| 	apply(compiler) { | ||||
|  | @ -51,11 +52,10 @@ class LoaderPlugin { | |||
| 							err => { | ||||
| 								compilation.semaphore.acquire(() => { | ||||
| 									if (err) return callback(err); | ||||
| 
 | ||||
| 									if (!dep.module) | ||||
| 										return callback(new Error("Cannot load the module")); | ||||
| 
 | ||||
| 									if (dep.module.error) return callback(dep.module.error); | ||||
| 									if (dep.module instanceof NormalModule && dep.module.error) | ||||
| 										return callback(dep.module.error); | ||||
| 									if (!dep.module._source) | ||||
| 										throw new Error( | ||||
| 											"The module created for a LoaderDependency must have a property _source" | ||||
|  |  | |||
|  | @ -6,6 +6,9 @@ | |||
| const Dependency = require("../Dependency"); | ||||
| 
 | ||||
| class ModuleDependency extends Dependency { | ||||
| 	/** | ||||
| 	 * @param {string} request request path which needs resolving | ||||
| 	 */ | ||||
| 	constructor(request) { | ||||
| 		super(); | ||||
| 		this.request = request; | ||||
|  |  | |||
|  | @ -3,9 +3,14 @@ | |||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| "use strict"; | ||||
| /** @typedef {import("./SingleEntryDependency")} SingleEntryDependency */ | ||||
| const Dependency = require("../Dependency"); | ||||
| 
 | ||||
| class MultiEntryDependency extends Dependency { | ||||
| 	/** | ||||
| 	 * @param {SingleEntryDependency[]} dependencies an array of SingleEntryDependencies | ||||
| 	 * @param {string} name entry name | ||||
| 	 */ | ||||
| 	constructor(dependencies, name) { | ||||
| 		super(); | ||||
| 		this.dependencies = dependencies; | ||||
|  |  | |||
|  | @ -6,8 +6,12 @@ | |||
| const ModuleDependency = require("./ModuleDependency"); | ||||
| 
 | ||||
| class SingleEntryDependency extends ModuleDependency { | ||||
| 	/** | ||||
| 	 * @param {string} request request path for entry | ||||
| 	 */ | ||||
| 	constructor(request) { | ||||
| 		super(request); | ||||
| 		this.request = request; | ||||
| 	} | ||||
| 
 | ||||
| 	get type() { | ||||
|  |  | |||
|  | @ -621,7 +621,7 @@ class ConcatenatedModule extends Module { | |||
| 				}); | ||||
| 				const globalScope = scopeManager.acquire(ast); | ||||
| 				const moduleScope = globalScope.childScopes[0]; | ||||
| 				const resultSource = new ReplaceSource(source); | ||||
| 				const resultSource = new ReplaceSource(source, null); | ||||
| 				info.ast = ast; | ||||
| 				info.internalSource = source; | ||||
| 				info.source = resultSource; | ||||
|  |  | |||
|  | @ -5,12 +5,24 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| class Semaphore { | ||||
| 	/** | ||||
| 	 * Creates an instance of Semaphore. | ||||
| 	 * | ||||
| 	 * @param {number} available the amount available number of "tasks" | ||||
| 	 * in the Semaphore | ||||
| 	 */ | ||||
| 	constructor(available) { | ||||
| 		this.available = available; | ||||
| 		/** @type {(() => void)[]} */ | ||||
| 		this.waiters = []; | ||||
| 		/** @private */ | ||||
| 		this._continue = this._continue.bind(this); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param {function(): void} callback function block to capture and run | ||||
| 	 * @returns {void} | ||||
| 	 */ | ||||
| 	acquire(callback) { | ||||
| 		if (this.available > 0) { | ||||
| 			this.available--; | ||||
|  |  | |||
|  | @ -31,6 +31,7 @@ | |||
|   "devDependencies": { | ||||
|     "@types/node": "^9.6.4", | ||||
|     "@types/tapable": "^1.0.1", | ||||
|     "@types/webpack-sources": "^0.1.4", | ||||
|     "benchmark": "^2.1.1", | ||||
|     "bundle-loader": "~0.5.0", | ||||
|     "codacy-coverage": "^2.0.1", | ||||
|  |  | |||
							
								
								
									
										113
									
								
								tsconfig.json
								
								
								
								
							
							
						
						
									
										113
									
								
								tsconfig.json
								
								
								
								
							|  | @ -1,62 +1,65 @@ | |||
| { | ||||
|   "compilerOptions": { | ||||
|     /* Basic Options */ | ||||
|     "target": "ES2017",                       /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ | ||||
|     "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ | ||||
|     "lib": ["es2017", "dom"],                 /* Specify library files to be included in the compilation. */ | ||||
|     "allowJs": true,                          /* Allow javascript files to be compiled. */ | ||||
|     "checkJs": true,                          /* Report errors in .js files. */ | ||||
|     // "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ | ||||
|     // "declaration": true,                   /* Generates corresponding '.d.ts' file. */ | ||||
|     // "sourceMap": true,                     /* Generates corresponding '.map' file. */ | ||||
|     // "outFile": "./",                       /* Concatenate and emit output to single file. */ | ||||
|     // "outDir": "./",                        /* Redirect output structure to the directory. */ | ||||
|     // "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ | ||||
|     // "removeComments": true,                /* Do not emit comments to output. */ | ||||
|     "noEmit": true,                           /* Do not emit outputs. */ | ||||
|     // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */ | ||||
|     // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ | ||||
|     // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ | ||||
| 	"compilerOptions": { | ||||
| 		/* Basic Options */ | ||||
| 		"target": | ||||
| 			"ES2017" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, | ||||
| 		"module": | ||||
| 			"commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, | ||||
| 		"lib": [ | ||||
| 			"es2017", | ||||
| 			"dom" | ||||
| 		] /* Specify library files to be included in the compilation. */, | ||||
| 		"allowJs": true /* Allow javascript files to be compiled. */, | ||||
| 		"checkJs": true /* Report errors in .js files. */, | ||||
| 		// "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ | ||||
| 		// "declaration": true,                   /* Generates corresponding '.d.ts' file. */ | ||||
| 		// "sourceMap": true,                     /* Generates corresponding '.map' file. */ | ||||
| 		// "outFile": "./",                       /* Concatenate and emit output to single file. */ | ||||
| 		// "outDir": "./",                        /* Redirect output structure to the directory. */ | ||||
| 		// "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ | ||||
| 		// "removeComments": true,                /* Do not emit comments to output. */ | ||||
| 		"noEmit": true /* Do not emit outputs. */, | ||||
| 		// "importHelpers": true,                 /* Import emit helpers from 'tslib'. */ | ||||
| 		// "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ | ||||
| 		// "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ | ||||
| 
 | ||||
|     /* Strict Type-Checking Options */ | ||||
|     "strict": false,                          /* Enable all strict type-checking options. */ | ||||
|     // "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */ | ||||
|     // "strictNullChecks": true,              /* Enable strict null checks. */ | ||||
|     "strictFunctionTypes": true,              /* Enable strict checking of function types. */ | ||||
|     // "strictPropertyInitialization": true,  /* Enable strict checking of property initialization in classes. */ | ||||
|     // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */ | ||||
|     "alwaysStrict": true,                     /* Parse in strict mode and emit "use strict" for each source file. */ | ||||
| 		/* Strict Type-Checking Options */ | ||||
| 		"strict": false /* Enable all strict type-checking options. */, | ||||
| 		// "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, | ||||
| 		// "strictNullChecks": true /* Enable strict null checks. */, | ||||
| 		// "strictFunctionTypes": true /* Enable strict checking of function types. */, | ||||
| 		// "strictPropertyInitialization": true /* Enable strict checking of property initialization in classes. */, | ||||
| 		// "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */ | ||||
| 		"alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, | ||||
| 
 | ||||
|     /* Additional Checks */ | ||||
|     // "noUnusedLocals": true,                /* Report errors on unused locals. */ | ||||
|     // "noUnusedParameters": true,            /* Report errors on unused parameters. */ | ||||
|     // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */ | ||||
|     // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */ | ||||
| 		/* Additional Checks */ | ||||
| 		// "noUnusedLocals": true,                /* Report errors on unused locals. */ | ||||
| 		// "noUnusedParameters": true,            /* Report errors on unused parameters. */ | ||||
| 		// "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */ | ||||
| 		// "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */ | ||||
| 
 | ||||
|     /* Module Resolution Options */ | ||||
|     // "moduleResolution": "node",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ | ||||
|     // "baseUrl": "./",                       /* Base directory to resolve non-absolute module names. */ | ||||
|     // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ | ||||
|     // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */ | ||||
|     // "typeRoots": [],                       /* List of folders to include type definitions from. */ | ||||
|     "types": ["node"],                        /* Type declaration files to be included in compilation. */ | ||||
|     // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ | ||||
|     "esModuleInterop": true                   /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ | ||||
|     // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */ | ||||
| 		/* Module Resolution Options */ | ||||
| 		// "moduleResolution": "node",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ | ||||
| 		// "baseUrl": "./",                       /* Base directory to resolve non-absolute module names. */ | ||||
| 		// "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ | ||||
| 		// "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */ | ||||
| 		// "typeRoots": [],                       /* List of folders to include type definitions from. */ | ||||
| 		"types": [ | ||||
| 			"node" | ||||
| 		] /* Type declaration files to be included in compilation. */, | ||||
| 		// "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ | ||||
| 		"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ | ||||
| 		// "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */ | ||||
| 
 | ||||
|     /* Source Map Options */ | ||||
|     // "sourceRoot": "./",                    /* Specify the location where debugger should locate TypeScript files instead of source locations. */ | ||||
|     // "mapRoot": "./",                       /* Specify the location where debugger should locate map files instead of generated locations. */ | ||||
|     // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */ | ||||
|     // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ | ||||
| 		/* Source Map Options */ | ||||
| 		// "sourceRoot": "./",                    /* Specify the location where debugger should locate TypeScript files instead of source locations. */ | ||||
| 		// "mapRoot": "./",                       /* Specify the location where debugger should locate map files instead of generated locations. */ | ||||
| 		// "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */ | ||||
| 		// "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ | ||||
| 
 | ||||
|     /* Experimental Options */ | ||||
|     // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */ | ||||
|     // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */ | ||||
|   }, | ||||
|   "include": [ | ||||
|     "declarations.d.ts", | ||||
|     "bin/*.js", | ||||
|     "lib/**/*.js" | ||||
|   ] | ||||
| 		/* Experimental Options */ | ||||
| 		// "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */ | ||||
| 		// "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */ | ||||
| 	}, | ||||
| 	"include": ["declarations.d.ts", "bin/*.js", "lib/**/*.js"] | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue