You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			1527 lines
		
	
	
		
			44 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			1527 lines
		
	
	
		
			44 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | /* | ||
|  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||
|  | 	Author Tobias Koppers @sokra | ||
|  | */ | ||
|  | 
 | ||
|  | "use strict"; | ||
|  | 
 | ||
|  | const fs = require("fs"); | ||
|  | const path = require("path"); | ||
|  | const { | ||
|  | 	JAVASCRIPT_MODULE_TYPE_AUTO, | ||
|  | 	JSON_MODULE_TYPE, | ||
|  | 	WEBASSEMBLY_MODULE_TYPE_ASYNC, | ||
|  | 	JAVASCRIPT_MODULE_TYPE_ESM, | ||
|  | 	JAVASCRIPT_MODULE_TYPE_DYNAMIC, | ||
|  | 	WEBASSEMBLY_MODULE_TYPE_SYNC, | ||
|  | 	ASSET_MODULE_TYPE, | ||
|  | 	CSS_MODULE_TYPE_AUTO, | ||
|  | 	CSS_MODULE_TYPE, | ||
|  | 	CSS_MODULE_TYPE_MODULE | ||
|  | } = require("../ModuleTypeConstants"); | ||
|  | const Template = require("../Template"); | ||
|  | const { cleverMerge } = require("../util/cleverMerge"); | ||
|  | const { | ||
|  | 	getTargetsProperties, | ||
|  | 	getTargetProperties, | ||
|  | 	getDefaultTarget | ||
|  | } = require("./target"); | ||
|  | 
 | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").CacheOptionsNormalized} CacheOptions */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").Context} Context */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").CssExperimentOptions} CssExperimentOptions */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").EntryDescription} EntryDescription */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").EntryNormalized} Entry */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").EntryStaticNormalized} EntryStaticNormalized */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").Environment} Environment */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").Experiments} Experiments */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").ExperimentsNormalized} ExperimentsNormalized */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").ExternalsPresets} ExternalsPresets */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").ExternalsType} ExternalsType */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").FileCacheOptions} FileCacheOptions */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").InfrastructureLogging} InfrastructureLogging */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").Library} Library */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").LibraryName} LibraryName */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").Loader} Loader */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").Mode} Mode */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").ModuleOptionsNormalized} ModuleOptions */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").Node} WebpackNode */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").Optimization} Optimization */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksOptions} OptimizationSplitChunksOptions */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} Output */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").ParserOptionsByModuleTypeKnown} ParserOptionsByModuleTypeKnown */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").Performance} Performance */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").ResolveOptions} ResolveOptions */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").RuleSetRules} RuleSetRules */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").SnapshotOptions} SnapshotOptions */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").Target} Target */ | ||
|  | /** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */ | ||
|  | /** @typedef {import("../Compiler")} Compiler */ | ||
|  | /** @typedef {import("../Module")} Module */ | ||
|  | /** @typedef {import("./target").TargetProperties} TargetProperties */ | ||
|  | 
 | ||
|  | const NODE_MODULES_REGEXP = /[\\/]node_modules[\\/]/i; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Sets a constant default value when undefined | ||
|  |  * @template T | ||
|  |  * @template {keyof T} P | ||
|  |  * @param {T} obj an object | ||
|  |  * @param {P} prop a property of this object | ||
|  |  * @param {T[P]} value a default value of the property | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const D = (obj, prop, value) => { | ||
|  | 	if (obj[prop] === undefined) { | ||
|  | 		obj[prop] = value; | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Sets a dynamic default value when undefined, by calling the factory function | ||
|  |  * @template T | ||
|  |  * @template {keyof T} P | ||
|  |  * @param {T} obj an object | ||
|  |  * @param {P} prop a property of this object | ||
|  |  * @param {function(): T[P]} factory a default value factory for the property | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const F = (obj, prop, factory) => { | ||
|  | 	if (obj[prop] === undefined) { | ||
|  | 		obj[prop] = factory(); | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Sets a dynamic default value when undefined, by calling the factory function. | ||
|  |  * factory must return an array or undefined | ||
|  |  * When the current value is already an array an contains "..." it's replaced with | ||
|  |  * the result of the factory function | ||
|  |  * @template T | ||
|  |  * @template {keyof T} P | ||
|  |  * @param {T} obj an object | ||
|  |  * @param {P} prop a property of this object | ||
|  |  * @param {function(): T[P]} factory a default value factory for the property | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const A = (obj, prop, factory) => { | ||
|  | 	const value = obj[prop]; | ||
|  | 	if (value === undefined) { | ||
|  | 		obj[prop] = factory(); | ||
|  | 	} else if (Array.isArray(value)) { | ||
|  | 		/** @type {any[] | undefined} */ | ||
|  | 		let newArray = undefined; | ||
|  | 		for (let i = 0; i < value.length; i++) { | ||
|  | 			const item = value[i]; | ||
|  | 			if (item === "...") { | ||
|  | 				if (newArray === undefined) { | ||
|  | 					newArray = value.slice(0, i); | ||
|  | 					obj[prop] = /** @type {T[P]} */ (/** @type {unknown} */ (newArray)); | ||
|  | 				} | ||
|  | 				const items = /** @type {any[]} */ (/** @type {unknown} */ (factory())); | ||
|  | 				if (items !== undefined) { | ||
|  | 					for (const item of items) { | ||
|  | 						newArray.push(item); | ||
|  | 					} | ||
|  | 				} | ||
|  | 			} else if (newArray !== undefined) { | ||
|  | 				newArray.push(item); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {WebpackOptions} options options to be modified | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyWebpackOptionsBaseDefaults = options => { | ||
|  | 	F(options, "context", () => process.cwd()); | ||
|  | 	applyInfrastructureLoggingDefaults(options.infrastructureLogging); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {WebpackOptions} options options to be modified | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyWebpackOptionsDefaults = options => { | ||
|  | 	F(options, "context", () => process.cwd()); | ||
|  | 	F(options, "target", () => { | ||
|  | 		return getDefaultTarget(/** @type {string} */ (options.context)); | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	const { mode, name, target } = options; | ||
|  | 
 | ||
|  | 	let targetProperties = | ||
|  | 		target === false | ||
|  | 			? /** @type {false} */ (false) | ||
|  | 			: typeof target === "string" | ||
|  | 			? getTargetProperties(target, /** @type {Context} */ (options.context)) | ||
|  | 			: getTargetsProperties( | ||
|  | 					/** @type {string[]} */ (target), | ||
|  | 					/** @type {Context} */ (options.context) | ||
|  | 			  ); | ||
|  | 
 | ||
|  | 	const development = mode === "development"; | ||
|  | 	const production = mode === "production" || !mode; | ||
|  | 
 | ||
|  | 	if (typeof options.entry !== "function") { | ||
|  | 		for (const key of Object.keys(options.entry)) { | ||
|  | 			F( | ||
|  | 				options.entry[key], | ||
|  | 				"import", | ||
|  | 				() => /** @type {[string]} */ (["./src"]) | ||
|  | 			); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	F(options, "devtool", () => (development ? "eval" : false)); | ||
|  | 	D(options, "watch", false); | ||
|  | 	D(options, "profile", false); | ||
|  | 	D(options, "parallelism", 100); | ||
|  | 	D(options, "recordsInputPath", false); | ||
|  | 	D(options, "recordsOutputPath", false); | ||
|  | 
 | ||
|  | 	applyExperimentsDefaults(options.experiments, { | ||
|  | 		production, | ||
|  | 		development, | ||
|  | 		targetProperties | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	const futureDefaults = | ||
|  | 		/** @type {NonNullable<ExperimentsNormalized["futureDefaults"]>} */ | ||
|  | 		(options.experiments.futureDefaults); | ||
|  | 
 | ||
|  | 	F(options, "cache", () => | ||
|  | 		development ? { type: /** @type {"memory"} */ ("memory") } : false | ||
|  | 	); | ||
|  | 	applyCacheDefaults(options.cache, { | ||
|  | 		name: name || "default", | ||
|  | 		mode: mode || "production", | ||
|  | 		development, | ||
|  | 		cacheUnaffected: options.experiments.cacheUnaffected | ||
|  | 	}); | ||
|  | 	const cache = !!options.cache; | ||
|  | 
 | ||
|  | 	applySnapshotDefaults(options.snapshot, { | ||
|  | 		production, | ||
|  | 		futureDefaults | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	applyModuleDefaults(options.module, { | ||
|  | 		cache, | ||
|  | 		syncWebAssembly: | ||
|  | 			/** @type {NonNullable<ExperimentsNormalized["syncWebAssembly"]>} */ | ||
|  | 			(options.experiments.syncWebAssembly), | ||
|  | 		asyncWebAssembly: | ||
|  | 			/** @type {NonNullable<ExperimentsNormalized["asyncWebAssembly"]>} */ | ||
|  | 			(options.experiments.asyncWebAssembly), | ||
|  | 		css: | ||
|  | 			/** @type {NonNullable<ExperimentsNormalized["css"]>} */ | ||
|  | 			(options.experiments.css), | ||
|  | 		futureDefaults, | ||
|  | 		isNode: targetProperties && targetProperties.node === true | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	applyOutputDefaults(options.output, { | ||
|  | 		context: /** @type {Context} */ (options.context), | ||
|  | 		targetProperties, | ||
|  | 		isAffectedByBrowserslist: | ||
|  | 			target === undefined || | ||
|  | 			(typeof target === "string" && target.startsWith("browserslist")) || | ||
|  | 			(Array.isArray(target) && | ||
|  | 				target.some(target => target.startsWith("browserslist"))), | ||
|  | 		outputModule: | ||
|  | 			/** @type {NonNullable<ExperimentsNormalized["outputModule"]>} */ | ||
|  | 			(options.experiments.outputModule), | ||
|  | 		development, | ||
|  | 		entry: options.entry, | ||
|  | 		module: options.module, | ||
|  | 		futureDefaults | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	applyExternalsPresetsDefaults(options.externalsPresets, { | ||
|  | 		targetProperties, | ||
|  | 		buildHttp: !!options.experiments.buildHttp | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	applyLoaderDefaults( | ||
|  | 		/** @type {NonNullable<WebpackOptions["loader"]>} */ (options.loader), | ||
|  | 		{ targetProperties, environment: options.output.environment } | ||
|  | 	); | ||
|  | 
 | ||
|  | 	F(options, "externalsType", () => { | ||
|  | 		const validExternalTypes = require("../../schemas/WebpackOptions.json") | ||
|  | 			.definitions.ExternalsType.enum; | ||
|  | 		return options.output.library && | ||
|  | 			validExternalTypes.includes(options.output.library.type) | ||
|  | 			? /** @type {ExternalsType} */ (options.output.library.type) | ||
|  | 			: options.output.module | ||
|  | 			? "module" | ||
|  | 			: "var"; | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	applyNodeDefaults(options.node, { | ||
|  | 		futureDefaults: | ||
|  | 			/** @type {NonNullable<WebpackOptions["experiments"]["futureDefaults"]>} */ | ||
|  | 			(options.experiments.futureDefaults), | ||
|  | 		targetProperties | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	F(options, "performance", () => | ||
|  | 		production && | ||
|  | 		targetProperties && | ||
|  | 		(targetProperties.browser || targetProperties.browser === null) | ||
|  | 			? {} | ||
|  | 			: false | ||
|  | 	); | ||
|  | 	applyPerformanceDefaults( | ||
|  | 		/** @type {NonNullable<WebpackOptions["performance"]>} */ | ||
|  | 		(options.performance), | ||
|  | 		{ | ||
|  | 			production | ||
|  | 		} | ||
|  | 	); | ||
|  | 
 | ||
|  | 	applyOptimizationDefaults(options.optimization, { | ||
|  | 		development, | ||
|  | 		production, | ||
|  | 		css: | ||
|  | 			/** @type {NonNullable<ExperimentsNormalized["css"]>} */ | ||
|  | 			(options.experiments.css), | ||
|  | 		records: !!(options.recordsInputPath || options.recordsOutputPath) | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	options.resolve = cleverMerge( | ||
|  | 		getResolveDefaults({ | ||
|  | 			cache, | ||
|  | 			context: /** @type {Context} */ (options.context), | ||
|  | 			targetProperties, | ||
|  | 			mode: /** @type {Mode} */ (options.mode), | ||
|  | 			css: | ||
|  | 				/** @type {NonNullable<ExperimentsNormalized["css"]>} */ | ||
|  | 				(options.experiments.css) | ||
|  | 		}), | ||
|  | 		options.resolve | ||
|  | 	); | ||
|  | 
 | ||
|  | 	options.resolveLoader = cleverMerge( | ||
|  | 		getResolveLoaderDefaults({ cache }), | ||
|  | 		options.resolveLoader | ||
|  | 	); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {ExperimentsNormalized} experiments options | ||
|  |  * @param {Object} options options | ||
|  |  * @param {boolean} options.production is production | ||
|  |  * @param {boolean} options.development is development mode | ||
|  |  * @param {TargetProperties | false} options.targetProperties target properties | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyExperimentsDefaults = ( | ||
|  | 	experiments, | ||
|  | 	{ production, development, targetProperties } | ||
|  | ) => { | ||
|  | 	D(experiments, "futureDefaults", false); | ||
|  | 	D(experiments, "backCompat", !experiments.futureDefaults); | ||
|  | 	D(experiments, "syncWebAssembly", false); | ||
|  | 	D(experiments, "asyncWebAssembly", experiments.futureDefaults); | ||
|  | 	D(experiments, "outputModule", false); | ||
|  | 	D(experiments, "layers", false); | ||
|  | 	D(experiments, "lazyCompilation", undefined); | ||
|  | 	D(experiments, "buildHttp", undefined); | ||
|  | 	D(experiments, "cacheUnaffected", experiments.futureDefaults); | ||
|  | 	F(experiments, "css", () => (experiments.futureDefaults ? {} : undefined)); | ||
|  | 
 | ||
|  | 	// TODO webpack 6: remove this. topLevelAwait should be enabled by default
 | ||
|  | 	let shouldEnableTopLevelAwait = true; | ||
|  | 	if (typeof experiments.topLevelAwait === "boolean") { | ||
|  | 		shouldEnableTopLevelAwait = experiments.topLevelAwait; | ||
|  | 	} | ||
|  | 	D(experiments, "topLevelAwait", shouldEnableTopLevelAwait); | ||
|  | 
 | ||
|  | 	if (typeof experiments.buildHttp === "object") { | ||
|  | 		D(experiments.buildHttp, "frozen", production); | ||
|  | 		D(experiments.buildHttp, "upgrade", false); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if (typeof experiments.css === "object") { | ||
|  | 		D( | ||
|  | 			experiments.css, | ||
|  | 			"exportsOnly", | ||
|  | 			!targetProperties || !targetProperties.document | ||
|  | 		); | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {CacheOptions} cache options | ||
|  |  * @param {Object} options options | ||
|  |  * @param {string} options.name name | ||
|  |  * @param {Mode} options.mode mode | ||
|  |  * @param {boolean} options.development is development mode | ||
|  |  * @param {Experiments["cacheUnaffected"]} options.cacheUnaffected the cacheUnaffected experiment is enabled | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyCacheDefaults = ( | ||
|  | 	cache, | ||
|  | 	{ name, mode, development, cacheUnaffected } | ||
|  | ) => { | ||
|  | 	if (cache === false) return; | ||
|  | 	switch (cache.type) { | ||
|  | 		case "filesystem": | ||
|  | 			F(cache, "name", () => name + "-" + mode); | ||
|  | 			D(cache, "version", ""); | ||
|  | 			F(cache, "cacheDirectory", () => { | ||
|  | 				const cwd = process.cwd(); | ||
|  | 				/** @type {string | undefined} */ | ||
|  | 				let dir = cwd; | ||
|  | 				for (;;) { | ||
|  | 					try { | ||
|  | 						if (fs.statSync(path.join(dir, "package.json")).isFile()) break; | ||
|  | 						// eslint-disable-next-line no-empty
 | ||
|  | 					} catch (e) {} | ||
|  | 					const parent = path.dirname(dir); | ||
|  | 					if (dir === parent) { | ||
|  | 						dir = undefined; | ||
|  | 						break; | ||
|  | 					} | ||
|  | 					dir = parent; | ||
|  | 				} | ||
|  | 				if (!dir) { | ||
|  | 					return path.resolve(cwd, ".cache/webpack"); | ||
|  | 				} else if (process.versions.pnp === "1") { | ||
|  | 					return path.resolve(dir, ".pnp/.cache/webpack"); | ||
|  | 				} else if (process.versions.pnp === "3") { | ||
|  | 					return path.resolve(dir, ".yarn/.cache/webpack"); | ||
|  | 				} else { | ||
|  | 					return path.resolve(dir, "node_modules/.cache/webpack"); | ||
|  | 				} | ||
|  | 			}); | ||
|  | 			F(cache, "cacheLocation", () => | ||
|  | 				path.resolve( | ||
|  | 					/** @type {NonNullable<FileCacheOptions["cacheDirectory"]>} */ | ||
|  | 					(cache.cacheDirectory), | ||
|  | 					/** @type {NonNullable<FileCacheOptions["name"]>} */ (cache.name) | ||
|  | 				) | ||
|  | 			); | ||
|  | 			D(cache, "hashAlgorithm", "md4"); | ||
|  | 			D(cache, "store", "pack"); | ||
|  | 			D(cache, "compression", false); | ||
|  | 			D(cache, "profile", false); | ||
|  | 			D(cache, "idleTimeout", 60000); | ||
|  | 			D(cache, "idleTimeoutForInitialStore", 5000); | ||
|  | 			D(cache, "idleTimeoutAfterLargeChanges", 1000); | ||
|  | 			D(cache, "maxMemoryGenerations", development ? 5 : Infinity); | ||
|  | 			D(cache, "maxAge", 1000 * 60 * 60 * 24 * 60); // 1 month
 | ||
|  | 			D(cache, "allowCollectingMemory", development); | ||
|  | 			D(cache, "memoryCacheUnaffected", development && cacheUnaffected); | ||
|  | 			D(cache, "readonly", false); | ||
|  | 			D( | ||
|  | 				/** @type {NonNullable<FileCacheOptions["buildDependencies"]>} */ | ||
|  | 				(cache.buildDependencies), | ||
|  | 				"defaultWebpack", | ||
|  | 				[path.resolve(__dirname, "..") + path.sep] | ||
|  | 			); | ||
|  | 			break; | ||
|  | 		case "memory": | ||
|  | 			D(cache, "maxGenerations", Infinity); | ||
|  | 			D(cache, "cacheUnaffected", development && cacheUnaffected); | ||
|  | 			break; | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {SnapshotOptions} snapshot options | ||
|  |  * @param {Object} options options | ||
|  |  * @param {boolean} options.production is production | ||
|  |  * @param {boolean} options.futureDefaults is future defaults enabled | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applySnapshotDefaults = (snapshot, { production, futureDefaults }) => { | ||
|  | 	if (futureDefaults) { | ||
|  | 		F(snapshot, "managedPaths", () => | ||
|  | 			process.versions.pnp === "3" | ||
|  | 				? [ | ||
|  | 						/^(.+?(?:[\\/]\.yarn[\\/]unplugged[\\/][^\\/]+)?[\\/]node_modules[\\/])/ | ||
|  | 				  ] | ||
|  | 				: [/^(.+?[\\/]node_modules[\\/])/] | ||
|  | 		); | ||
|  | 		F(snapshot, "immutablePaths", () => | ||
|  | 			process.versions.pnp === "3" | ||
|  | 				? [/^(.+?[\\/]cache[\\/][^\\/]+\.zip[\\/]node_modules[\\/])/] | ||
|  | 				: [] | ||
|  | 		); | ||
|  | 	} else { | ||
|  | 		A(snapshot, "managedPaths", () => { | ||
|  | 			if (process.versions.pnp === "3") { | ||
|  | 				const match = | ||
|  | 					/^(.+?)[\\/]cache[\\/]watchpack-npm-[^\\/]+\.zip[\\/]node_modules[\\/]/.exec( | ||
|  | 						require.resolve("watchpack") | ||
|  | 					); | ||
|  | 				if (match) { | ||
|  | 					return [path.resolve(match[1], "unplugged")]; | ||
|  | 				} | ||
|  | 			} else { | ||
|  | 				const match = /^(.+?[\\/]node_modules[\\/])/.exec( | ||
|  | 					// eslint-disable-next-line node/no-extraneous-require
 | ||
|  | 					require.resolve("watchpack") | ||
|  | 				); | ||
|  | 				if (match) { | ||
|  | 					return [match[1]]; | ||
|  | 				} | ||
|  | 			} | ||
|  | 			return []; | ||
|  | 		}); | ||
|  | 		A(snapshot, "immutablePaths", () => { | ||
|  | 			if (process.versions.pnp === "1") { | ||
|  | 				const match = | ||
|  | 					/^(.+?[\\/]v4)[\\/]npm-watchpack-[^\\/]+-[\da-f]{40}[\\/]node_modules[\\/]/.exec( | ||
|  | 						require.resolve("watchpack") | ||
|  | 					); | ||
|  | 				if (match) { | ||
|  | 					return [match[1]]; | ||
|  | 				} | ||
|  | 			} else if (process.versions.pnp === "3") { | ||
|  | 				const match = | ||
|  | 					/^(.+?)[\\/]watchpack-npm-[^\\/]+\.zip[\\/]node_modules[\\/]/.exec( | ||
|  | 						require.resolve("watchpack") | ||
|  | 					); | ||
|  | 				if (match) { | ||
|  | 					return [match[1]]; | ||
|  | 				} | ||
|  | 			} | ||
|  | 			return []; | ||
|  | 		}); | ||
|  | 	} | ||
|  | 	F(snapshot, "resolveBuildDependencies", () => ({ | ||
|  | 		timestamp: true, | ||
|  | 		hash: true | ||
|  | 	})); | ||
|  | 	F(snapshot, "buildDependencies", () => ({ timestamp: true, hash: true })); | ||
|  | 	F(snapshot, "module", () => | ||
|  | 		production ? { timestamp: true, hash: true } : { timestamp: true } | ||
|  | 	); | ||
|  | 	F(snapshot, "resolve", () => | ||
|  | 		production ? { timestamp: true, hash: true } : { timestamp: true } | ||
|  | 	); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {JavascriptParserOptions} parserOptions parser options | ||
|  |  * @param {Object} options options | ||
|  |  * @param {boolean} options.futureDefaults is future defaults enabled | ||
|  |  * @param {boolean} options.isNode is node target platform | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyJavascriptParserOptionsDefaults = ( | ||
|  | 	parserOptions, | ||
|  | 	{ futureDefaults, isNode } | ||
|  | ) => { | ||
|  | 	D(parserOptions, "unknownContextRequest", "."); | ||
|  | 	D(parserOptions, "unknownContextRegExp", false); | ||
|  | 	D(parserOptions, "unknownContextRecursive", true); | ||
|  | 	D(parserOptions, "unknownContextCritical", true); | ||
|  | 	D(parserOptions, "exprContextRequest", "."); | ||
|  | 	D(parserOptions, "exprContextRegExp", false); | ||
|  | 	D(parserOptions, "exprContextRecursive", true); | ||
|  | 	D(parserOptions, "exprContextCritical", true); | ||
|  | 	D(parserOptions, "wrappedContextRegExp", /.*/); | ||
|  | 	D(parserOptions, "wrappedContextRecursive", true); | ||
|  | 	D(parserOptions, "wrappedContextCritical", false); | ||
|  | 	D(parserOptions, "strictThisContextOnImports", false); | ||
|  | 	D(parserOptions, "importMeta", true); | ||
|  | 	D(parserOptions, "dynamicImportMode", "lazy"); | ||
|  | 	D(parserOptions, "dynamicImportPrefetch", false); | ||
|  | 	D(parserOptions, "dynamicImportPreload", false); | ||
|  | 	D(parserOptions, "dynamicImportFetchPriority", false); | ||
|  | 	D(parserOptions, "createRequire", isNode); | ||
|  | 	if (futureDefaults) D(parserOptions, "exportsPresence", "error"); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {ModuleOptions} module options | ||
|  |  * @param {Object} options options | ||
|  |  * @param {boolean} options.cache is caching enabled | ||
|  |  * @param {boolean} options.syncWebAssembly is syncWebAssembly enabled | ||
|  |  * @param {boolean} options.asyncWebAssembly is asyncWebAssembly enabled | ||
|  |  * @param {CssExperimentOptions|false} options.css is css enabled | ||
|  |  * @param {boolean} options.futureDefaults is future defaults enabled | ||
|  |  * @param {boolean} options.isNode is node target platform | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyModuleDefaults = ( | ||
|  | 	module, | ||
|  | 	{ cache, syncWebAssembly, asyncWebAssembly, css, futureDefaults, isNode } | ||
|  | ) => { | ||
|  | 	if (cache) { | ||
|  | 		D( | ||
|  | 			module, | ||
|  | 			"unsafeCache", | ||
|  | 			/** | ||
|  | 			 * @param {Module} module module | ||
|  | 			 * @returns {boolean | null | string} true, if we want to cache the module | ||
|  | 			 */ | ||
|  | 			module => { | ||
|  | 				const name = module.nameForCondition(); | ||
|  | 				return name && NODE_MODULES_REGEXP.test(name); | ||
|  | 			} | ||
|  | 		); | ||
|  | 	} else { | ||
|  | 		D(module, "unsafeCache", false); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	F(module.parser, ASSET_MODULE_TYPE, () => ({})); | ||
|  | 	F( | ||
|  | 		/** @type {NonNullable<ParserOptionsByModuleTypeKnown["asset"]>} */ | ||
|  | 		(module.parser.asset), | ||
|  | 		"dataUrlCondition", | ||
|  | 		() => ({}) | ||
|  | 	); | ||
|  | 	if ( | ||
|  | 		typeof ( | ||
|  | 			/** @type {NonNullable<ParserOptionsByModuleTypeKnown["asset"]>} */ | ||
|  | 			(module.parser.asset).dataUrlCondition | ||
|  | 		) === "object" | ||
|  | 	) { | ||
|  | 		D( | ||
|  | 			/** @type {NonNullable<ParserOptionsByModuleTypeKnown["asset"]>} */ | ||
|  | 			(module.parser.asset).dataUrlCondition, | ||
|  | 			"maxSize", | ||
|  | 			8096 | ||
|  | 		); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	F(module.parser, "javascript", () => ({})); | ||
|  | 
 | ||
|  | 	applyJavascriptParserOptionsDefaults( | ||
|  | 		/** @type {NonNullable<ParserOptionsByModuleTypeKnown["javascript"]>} */ | ||
|  | 		(module.parser.javascript), | ||
|  | 		{ | ||
|  | 			futureDefaults, | ||
|  | 			isNode | ||
|  | 		} | ||
|  | 	); | ||
|  | 
 | ||
|  | 	A(module, "defaultRules", () => { | ||
|  | 		const esm = { | ||
|  | 			type: JAVASCRIPT_MODULE_TYPE_ESM, | ||
|  | 			resolve: { | ||
|  | 				byDependency: { | ||
|  | 					esm: { | ||
|  | 						fullySpecified: true | ||
|  | 					} | ||
|  | 				} | ||
|  | 			} | ||
|  | 		}; | ||
|  | 		const commonjs = { | ||
|  | 			type: JAVASCRIPT_MODULE_TYPE_DYNAMIC | ||
|  | 		}; | ||
|  | 		/** @type {RuleSetRules} */ | ||
|  | 		const rules = [ | ||
|  | 			{ | ||
|  | 				mimetype: "application/node", | ||
|  | 				type: JAVASCRIPT_MODULE_TYPE_AUTO | ||
|  | 			}, | ||
|  | 			{ | ||
|  | 				test: /\.json$/i, | ||
|  | 				type: JSON_MODULE_TYPE | ||
|  | 			}, | ||
|  | 			{ | ||
|  | 				mimetype: "application/json", | ||
|  | 				type: JSON_MODULE_TYPE | ||
|  | 			}, | ||
|  | 			{ | ||
|  | 				test: /\.mjs$/i, | ||
|  | 				...esm | ||
|  | 			}, | ||
|  | 			{ | ||
|  | 				test: /\.js$/i, | ||
|  | 				descriptionData: { | ||
|  | 					type: "module" | ||
|  | 				}, | ||
|  | 				...esm | ||
|  | 			}, | ||
|  | 			{ | ||
|  | 				test: /\.cjs$/i, | ||
|  | 				...commonjs | ||
|  | 			}, | ||
|  | 			{ | ||
|  | 				test: /\.js$/i, | ||
|  | 				descriptionData: { | ||
|  | 					type: "commonjs" | ||
|  | 				}, | ||
|  | 				...commonjs | ||
|  | 			}, | ||
|  | 			{ | ||
|  | 				mimetype: { | ||
|  | 					or: ["text/javascript", "application/javascript"] | ||
|  | 				}, | ||
|  | 				...esm | ||
|  | 			} | ||
|  | 		]; | ||
|  | 		if (asyncWebAssembly) { | ||
|  | 			const wasm = { | ||
|  | 				type: WEBASSEMBLY_MODULE_TYPE_ASYNC, | ||
|  | 				rules: [ | ||
|  | 					{ | ||
|  | 						descriptionData: { | ||
|  | 							type: "module" | ||
|  | 						}, | ||
|  | 						resolve: { | ||
|  | 							fullySpecified: true | ||
|  | 						} | ||
|  | 					} | ||
|  | 				] | ||
|  | 			}; | ||
|  | 			rules.push({ | ||
|  | 				test: /\.wasm$/i, | ||
|  | 				...wasm | ||
|  | 			}); | ||
|  | 			rules.push({ | ||
|  | 				mimetype: "application/wasm", | ||
|  | 				...wasm | ||
|  | 			}); | ||
|  | 		} else if (syncWebAssembly) { | ||
|  | 			const wasm = { | ||
|  | 				type: WEBASSEMBLY_MODULE_TYPE_SYNC, | ||
|  | 				rules: [ | ||
|  | 					{ | ||
|  | 						descriptionData: { | ||
|  | 							type: "module" | ||
|  | 						}, | ||
|  | 						resolve: { | ||
|  | 							fullySpecified: true | ||
|  | 						} | ||
|  | 					} | ||
|  | 				] | ||
|  | 			}; | ||
|  | 			rules.push({ | ||
|  | 				test: /\.wasm$/i, | ||
|  | 				...wasm | ||
|  | 			}); | ||
|  | 			rules.push({ | ||
|  | 				mimetype: "application/wasm", | ||
|  | 				...wasm | ||
|  | 			}); | ||
|  | 		} | ||
|  | 		if (css) { | ||
|  | 			const resolve = { | ||
|  | 				fullySpecified: true, | ||
|  | 				preferRelative: true | ||
|  | 			}; | ||
|  | 			rules.push({ | ||
|  | 				test: /\.css$/i, | ||
|  | 				type: CSS_MODULE_TYPE_AUTO, | ||
|  | 				resolve | ||
|  | 			}); | ||
|  | 			rules.push({ | ||
|  | 				mimetype: "text/css+module", | ||
|  | 				type: CSS_MODULE_TYPE_MODULE, | ||
|  | 				resolve | ||
|  | 			}); | ||
|  | 			rules.push({ | ||
|  | 				mimetype: "text/css", | ||
|  | 				type: CSS_MODULE_TYPE, | ||
|  | 				resolve | ||
|  | 			}); | ||
|  | 		} | ||
|  | 		rules.push( | ||
|  | 			{ | ||
|  | 				dependency: "url", | ||
|  | 				oneOf: [ | ||
|  | 					{ | ||
|  | 						scheme: /^data$/, | ||
|  | 						type: "asset/inline" | ||
|  | 					}, | ||
|  | 					{ | ||
|  | 						type: "asset/resource" | ||
|  | 					} | ||
|  | 				] | ||
|  | 			}, | ||
|  | 			{ | ||
|  | 				assert: { type: "json" }, | ||
|  | 				type: JSON_MODULE_TYPE | ||
|  | 			} | ||
|  | 		); | ||
|  | 		return rules; | ||
|  | 	}); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {Output} output options | ||
|  |  * @param {Object} options options | ||
|  |  * @param {string} options.context context | ||
|  |  * @param {TargetProperties | false} options.targetProperties target properties | ||
|  |  * @param {boolean} options.isAffectedByBrowserslist is affected by browserslist | ||
|  |  * @param {boolean} options.outputModule is outputModule experiment enabled | ||
|  |  * @param {boolean} options.development is development mode | ||
|  |  * @param {Entry} options.entry entry option | ||
|  |  * @param {ModuleOptions} options.module module option | ||
|  |  * @param {boolean} options.futureDefaults is future defaults enabled | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyOutputDefaults = ( | ||
|  | 	output, | ||
|  | 	{ | ||
|  | 		context, | ||
|  | 		targetProperties: tp, | ||
|  | 		isAffectedByBrowserslist, | ||
|  | 		outputModule, | ||
|  | 		development, | ||
|  | 		entry, | ||
|  | 		module, | ||
|  | 		futureDefaults | ||
|  | 	} | ||
|  | ) => { | ||
|  | 	/** | ||
|  | 	 * @param {Library=} library the library option | ||
|  | 	 * @returns {string} a readable library name | ||
|  | 	 */ | ||
|  | 	const getLibraryName = library => { | ||
|  | 		const libraryName = | ||
|  | 			typeof library === "object" && | ||
|  | 			library && | ||
|  | 			!Array.isArray(library) && | ||
|  | 			"type" in library | ||
|  | 				? library.name | ||
|  | 				: /** @type {LibraryName} */ (library); | ||
|  | 		if (Array.isArray(libraryName)) { | ||
|  | 			return libraryName.join("."); | ||
|  | 		} else if (typeof libraryName === "object") { | ||
|  | 			return getLibraryName(libraryName.root); | ||
|  | 		} else if (typeof libraryName === "string") { | ||
|  | 			return libraryName; | ||
|  | 		} | ||
|  | 		return ""; | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	F(output, "uniqueName", () => { | ||
|  | 		const libraryName = getLibraryName(output.library).replace( | ||
|  | 			/^\[(\\*[\w:]+\\*)\](\.)|(\.)\[(\\*[\w:]+\\*)\](?=\.|$)|\[(\\*[\w:]+\\*)\]/g, | ||
|  | 			(m, a, d1, d2, b, c) => { | ||
|  | 				const content = a || b || c; | ||
|  | 				return content.startsWith("\\") && content.endsWith("\\") | ||
|  | 					? `${d2 || ""}[${content.slice(1, -1)}]${d1 || ""}` | ||
|  | 					: ""; | ||
|  | 			} | ||
|  | 		); | ||
|  | 		if (libraryName) return libraryName; | ||
|  | 		const pkgPath = path.resolve(context, "package.json"); | ||
|  | 		try { | ||
|  | 			const packageInfo = JSON.parse(fs.readFileSync(pkgPath, "utf-8")); | ||
|  | 			return packageInfo.name || ""; | ||
|  | 		} catch (e) { | ||
|  | 			if (/** @type {Error & { code: string }} */ (e).code !== "ENOENT") { | ||
|  | 				/** @type {Error & { code: string }} */ | ||
|  | 				( | ||
|  | 					e | ||
|  | 				).message += `\nwhile determining default 'output.uniqueName' from 'name' in ${pkgPath}`; | ||
|  | 				throw e; | ||
|  | 			} | ||
|  | 			return ""; | ||
|  | 		} | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	F(output, "module", () => !!outputModule); | ||
|  | 	D(output, "filename", output.module ? "[name].mjs" : "[name].js"); | ||
|  | 	F(output, "iife", () => !output.module); | ||
|  | 	D(output, "importFunctionName", "import"); | ||
|  | 	D(output, "importMetaName", "import.meta"); | ||
|  | 	F(output, "chunkFilename", () => { | ||
|  | 		const filename = | ||
|  | 			/** @type {NonNullable<Output["chunkFilename"]>} */ | ||
|  | 			(output.filename); | ||
|  | 		if (typeof filename !== "function") { | ||
|  | 			const hasName = filename.includes("[name]"); | ||
|  | 			const hasId = filename.includes("[id]"); | ||
|  | 			const hasChunkHash = filename.includes("[chunkhash]"); | ||
|  | 			const hasContentHash = filename.includes("[contenthash]"); | ||
|  | 			// Anything changing depending on chunk is fine
 | ||
|  | 			if (hasChunkHash || hasContentHash || hasName || hasId) return filename; | ||
|  | 			// Otherwise prefix "[id]." in front of the basename to make it changing
 | ||
|  | 			return filename.replace(/(^|\/)([^/]*(?:\?|$))/, "$1[id].$2"); | ||
|  | 		} | ||
|  | 		return output.module ? "[id].mjs" : "[id].js"; | ||
|  | 	}); | ||
|  | 	F(output, "cssFilename", () => { | ||
|  | 		const filename = | ||
|  | 			/** @type {NonNullable<Output["cssFilename"]>} */ | ||
|  | 			(output.filename); | ||
|  | 		if (typeof filename !== "function") { | ||
|  | 			return filename.replace(/\.[mc]?js(\?|$)/, ".css$1"); | ||
|  | 		} | ||
|  | 		return "[id].css"; | ||
|  | 	}); | ||
|  | 	F(output, "cssChunkFilename", () => { | ||
|  | 		const chunkFilename = | ||
|  | 			/** @type {NonNullable<Output["cssChunkFilename"]>} */ | ||
|  | 			(output.chunkFilename); | ||
|  | 		if (typeof chunkFilename !== "function") { | ||
|  | 			return chunkFilename.replace(/\.[mc]?js(\?|$)/, ".css$1"); | ||
|  | 		} | ||
|  | 		return "[id].css"; | ||
|  | 	}); | ||
|  | 	D(output, "assetModuleFilename", "[hash][ext][query]"); | ||
|  | 	D(output, "webassemblyModuleFilename", "[hash].module.wasm"); | ||
|  | 	D(output, "compareBeforeEmit", true); | ||
|  | 	D(output, "charset", true); | ||
|  | 	F(output, "hotUpdateGlobal", () => | ||
|  | 		Template.toIdentifier( | ||
|  | 			"webpackHotUpdate" + | ||
|  | 				Template.toIdentifier( | ||
|  | 					/** @type {NonNullable<Output["uniqueName"]>} */ (output.uniqueName) | ||
|  | 				) | ||
|  | 		) | ||
|  | 	); | ||
|  | 	F(output, "chunkLoadingGlobal", () => | ||
|  | 		Template.toIdentifier( | ||
|  | 			"webpackChunk" + | ||
|  | 				Template.toIdentifier( | ||
|  | 					/** @type {NonNullable<Output["uniqueName"]>} */ (output.uniqueName) | ||
|  | 				) | ||
|  | 		) | ||
|  | 	); | ||
|  | 	F(output, "globalObject", () => { | ||
|  | 		if (tp) { | ||
|  | 			if (tp.global) return "global"; | ||
|  | 			if (tp.globalThis) return "globalThis"; | ||
|  | 		} | ||
|  | 		return "self"; | ||
|  | 	}); | ||
|  | 	F(output, "chunkFormat", () => { | ||
|  | 		if (tp) { | ||
|  | 			const helpMessage = isAffectedByBrowserslist | ||
|  | 				? "Make sure that your 'browserslist' includes only platforms that support these features or select an appropriate 'target' to allow selecting a chunk format by default. Alternatively specify the 'output.chunkFormat' directly." | ||
|  | 				: "Select an appropriate 'target' to allow selecting one by default, or specify the 'output.chunkFormat' directly."; | ||
|  | 			if (output.module) { | ||
|  | 				if (tp.dynamicImport) return "module"; | ||
|  | 				if (tp.document) return "array-push"; | ||
|  | 				throw new Error( | ||
|  | 					"For the selected environment is no default ESM chunk format available:\n" + | ||
|  | 						"ESM exports can be chosen when 'import()' is available.\n" + | ||
|  | 						"JSONP Array push can be chosen when 'document' is available.\n" + | ||
|  | 						helpMessage | ||
|  | 				); | ||
|  | 			} else { | ||
|  | 				if (tp.document) return "array-push"; | ||
|  | 				if (tp.require) return "commonjs"; | ||
|  | 				if (tp.nodeBuiltins) return "commonjs"; | ||
|  | 				if (tp.importScripts) return "array-push"; | ||
|  | 				throw new Error( | ||
|  | 					"For the selected environment is no default script chunk format available:\n" + | ||
|  | 						"JSONP Array push can be chosen when 'document' or 'importScripts' is available.\n" + | ||
|  | 						"CommonJs exports can be chosen when 'require' or node builtins are available.\n" + | ||
|  | 						helpMessage | ||
|  | 				); | ||
|  | 			} | ||
|  | 		} | ||
|  | 		throw new Error( | ||
|  | 			"Chunk format can't be selected by default when no target is specified" | ||
|  | 		); | ||
|  | 	}); | ||
|  | 	D(output, "asyncChunks", true); | ||
|  | 	F(output, "chunkLoading", () => { | ||
|  | 		if (tp) { | ||
|  | 			switch (output.chunkFormat) { | ||
|  | 				case "array-push": | ||
|  | 					if (tp.document) return "jsonp"; | ||
|  | 					if (tp.importScripts) return "import-scripts"; | ||
|  | 					break; | ||
|  | 				case "commonjs": | ||
|  | 					if (tp.require) return "require"; | ||
|  | 					if (tp.nodeBuiltins) return "async-node"; | ||
|  | 					break; | ||
|  | 				case "module": | ||
|  | 					if (tp.dynamicImport) return "import"; | ||
|  | 					break; | ||
|  | 			} | ||
|  | 			if ( | ||
|  | 				tp.require === null || | ||
|  | 				tp.nodeBuiltins === null || | ||
|  | 				tp.document === null || | ||
|  | 				tp.importScripts === null | ||
|  | 			) { | ||
|  | 				return "universal"; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		return false; | ||
|  | 	}); | ||
|  | 	F(output, "workerChunkLoading", () => { | ||
|  | 		if (tp) { | ||
|  | 			switch (output.chunkFormat) { | ||
|  | 				case "array-push": | ||
|  | 					if (tp.importScriptsInWorker) return "import-scripts"; | ||
|  | 					break; | ||
|  | 				case "commonjs": | ||
|  | 					if (tp.require) return "require"; | ||
|  | 					if (tp.nodeBuiltins) return "async-node"; | ||
|  | 					break; | ||
|  | 				case "module": | ||
|  | 					if (tp.dynamicImportInWorker) return "import"; | ||
|  | 					break; | ||
|  | 			} | ||
|  | 			if ( | ||
|  | 				tp.require === null || | ||
|  | 				tp.nodeBuiltins === null || | ||
|  | 				tp.importScriptsInWorker === null | ||
|  | 			) { | ||
|  | 				return "universal"; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		return false; | ||
|  | 	}); | ||
|  | 	F(output, "wasmLoading", () => { | ||
|  | 		if (tp) { | ||
|  | 			if (tp.fetchWasm) return "fetch"; | ||
|  | 			if (tp.nodeBuiltins) | ||
|  | 				return output.module ? "async-node-module" : "async-node"; | ||
|  | 			if (tp.nodeBuiltins === null || tp.fetchWasm === null) { | ||
|  | 				return "universal"; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		return false; | ||
|  | 	}); | ||
|  | 	F(output, "workerWasmLoading", () => output.wasmLoading); | ||
|  | 	F(output, "devtoolNamespace", () => output.uniqueName); | ||
|  | 	if (output.library) { | ||
|  | 		F(output.library, "type", () => (output.module ? "module" : "var")); | ||
|  | 	} | ||
|  | 	F(output, "path", () => path.join(process.cwd(), "dist")); | ||
|  | 	F(output, "pathinfo", () => development); | ||
|  | 	D(output, "sourceMapFilename", "[file].map[query]"); | ||
|  | 	D( | ||
|  | 		output, | ||
|  | 		"hotUpdateChunkFilename", | ||
|  | 		`[id].[fullhash].hot-update.${output.module ? "mjs" : "js"}` | ||
|  | 	); | ||
|  | 	D(output, "hotUpdateMainFilename", "[runtime].[fullhash].hot-update.json"); | ||
|  | 	D(output, "crossOriginLoading", false); | ||
|  | 	F(output, "scriptType", () => (output.module ? "module" : false)); | ||
|  | 	D( | ||
|  | 		output, | ||
|  | 		"publicPath", | ||
|  | 		(tp && (tp.document || tp.importScripts)) || output.scriptType === "module" | ||
|  | 			? "auto" | ||
|  | 			: "" | ||
|  | 	); | ||
|  | 	D(output, "workerPublicPath", ""); | ||
|  | 	D(output, "chunkLoadTimeout", 120000); | ||
|  | 	D(output, "hashFunction", futureDefaults ? "xxhash64" : "md4"); | ||
|  | 	D(output, "hashDigest", "hex"); | ||
|  | 	D(output, "hashDigestLength", futureDefaults ? 16 : 20); | ||
|  | 	D(output, "strictModuleExceptionHandling", false); | ||
|  | 
 | ||
|  | 	const environment = /** @type {Environment} */ (output.environment); | ||
|  | 	/** | ||
|  | 	 * @param {boolean | undefined} v value | ||
|  | 	 * @returns {boolean} true, when v is truthy or undefined | ||
|  | 	 */ | ||
|  | 	const optimistic = v => v || v === undefined; | ||
|  | 	/** | ||
|  | 	 * @param {boolean | undefined} v value | ||
|  | 	 * @param {boolean | undefined} c condition | ||
|  | 	 * @returns {boolean | undefined} true, when v is truthy or undefined, or c is truthy | ||
|  | 	 */ | ||
|  | 	const conditionallyOptimistic = (v, c) => (v === undefined && c) || v; | ||
|  | 
 | ||
|  | 	F( | ||
|  | 		environment, | ||
|  | 		"globalThis", | ||
|  | 		() => /** @type {boolean | undefined} */ (tp && tp.globalThis) | ||
|  | 	); | ||
|  | 	F( | ||
|  | 		environment, | ||
|  | 		"bigIntLiteral", | ||
|  | 		() => /** @type {boolean | undefined} */ (tp && tp.bigIntLiteral) | ||
|  | 	); | ||
|  | 	F( | ||
|  | 		environment, | ||
|  | 		"const", | ||
|  | 		() => tp && optimistic(/** @type {boolean | undefined} */ (tp.const)) | ||
|  | 	); | ||
|  | 	F( | ||
|  | 		environment, | ||
|  | 		"arrowFunction", | ||
|  | 		() => | ||
|  | 			tp && optimistic(/** @type {boolean | undefined} */ (tp.arrowFunction)) | ||
|  | 	); | ||
|  | 	F( | ||
|  | 		environment, | ||
|  | 		"forOf", | ||
|  | 		() => tp && optimistic(/** @type {boolean | undefined} */ (tp.forOf)) | ||
|  | 	); | ||
|  | 	F( | ||
|  | 		environment, | ||
|  | 		"destructuring", | ||
|  | 		() => | ||
|  | 			tp && optimistic(/** @type {boolean | undefined} */ (tp.destructuring)) | ||
|  | 	); | ||
|  | 	F( | ||
|  | 		environment, | ||
|  | 		"optionalChaining", | ||
|  | 		() => | ||
|  | 			tp && optimistic(/** @type {boolean | undefined} */ (tp.optionalChaining)) | ||
|  | 	); | ||
|  | 	F( | ||
|  | 		environment, | ||
|  | 		"templateLiteral", | ||
|  | 		() => | ||
|  | 			tp && optimistic(/** @type {boolean | undefined} */ (tp.templateLiteral)) | ||
|  | 	); | ||
|  | 	F(environment, "dynamicImport", () => | ||
|  | 		conditionallyOptimistic( | ||
|  | 			/** @type {boolean | undefined} */ (tp && tp.dynamicImport), | ||
|  | 			output.module | ||
|  | 		) | ||
|  | 	); | ||
|  | 	F(environment, "dynamicImportInWorker", () => | ||
|  | 		conditionallyOptimistic( | ||
|  | 			/** @type {boolean | undefined} */ (tp && tp.dynamicImportInWorker), | ||
|  | 			output.module | ||
|  | 		) | ||
|  | 	); | ||
|  | 	F(environment, "module", () => | ||
|  | 		conditionallyOptimistic( | ||
|  | 			/** @type {boolean | undefined} */ (tp && tp.module), | ||
|  | 			output.module | ||
|  | 		) | ||
|  | 	); | ||
|  | 
 | ||
|  | 	const { trustedTypes } = output; | ||
|  | 	if (trustedTypes) { | ||
|  | 		F( | ||
|  | 			trustedTypes, | ||
|  | 			"policyName", | ||
|  | 			() => | ||
|  | 				/** @type {NonNullable<Output["uniqueName"]>} */ | ||
|  | 				(output.uniqueName).replace(/[^a-zA-Z0-9\-#=_/@.%]+/g, "_") || "webpack" | ||
|  | 		); | ||
|  | 		D(trustedTypes, "onPolicyCreationFailure", "stop"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @param {function(EntryDescription): void} fn iterator | ||
|  | 	 * @returns {void} | ||
|  | 	 */ | ||
|  | 	const forEachEntry = fn => { | ||
|  | 		for (const name of Object.keys(entry)) { | ||
|  | 			fn(/** @type {{[k: string] : EntryDescription}} */ (entry)[name]); | ||
|  | 		} | ||
|  | 	}; | ||
|  | 	A(output, "enabledLibraryTypes", () => { | ||
|  | 		/** @type {LibraryType[]} */ | ||
|  | 		const enabledLibraryTypes = []; | ||
|  | 		if (output.library) { | ||
|  | 			enabledLibraryTypes.push(output.library.type); | ||
|  | 		} | ||
|  | 		forEachEntry(desc => { | ||
|  | 			if (desc.library) { | ||
|  | 				enabledLibraryTypes.push(desc.library.type); | ||
|  | 			} | ||
|  | 		}); | ||
|  | 		return enabledLibraryTypes; | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	A(output, "enabledChunkLoadingTypes", () => { | ||
|  | 		const enabledChunkLoadingTypes = new Set(); | ||
|  | 		if (output.chunkLoading) { | ||
|  | 			enabledChunkLoadingTypes.add(output.chunkLoading); | ||
|  | 		} | ||
|  | 		if (output.workerChunkLoading) { | ||
|  | 			enabledChunkLoadingTypes.add(output.workerChunkLoading); | ||
|  | 		} | ||
|  | 		forEachEntry(desc => { | ||
|  | 			if (desc.chunkLoading) { | ||
|  | 				enabledChunkLoadingTypes.add(desc.chunkLoading); | ||
|  | 			} | ||
|  | 		}); | ||
|  | 		return Array.from(enabledChunkLoadingTypes); | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	A(output, "enabledWasmLoadingTypes", () => { | ||
|  | 		const enabledWasmLoadingTypes = new Set(); | ||
|  | 		if (output.wasmLoading) { | ||
|  | 			enabledWasmLoadingTypes.add(output.wasmLoading); | ||
|  | 		} | ||
|  | 		if (output.workerWasmLoading) { | ||
|  | 			enabledWasmLoadingTypes.add(output.workerWasmLoading); | ||
|  | 		} | ||
|  | 		forEachEntry(desc => { | ||
|  | 			if (desc.wasmLoading) { | ||
|  | 				enabledWasmLoadingTypes.add(desc.wasmLoading); | ||
|  | 			} | ||
|  | 		}); | ||
|  | 		return Array.from(enabledWasmLoadingTypes); | ||
|  | 	}); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {ExternalsPresets} externalsPresets options | ||
|  |  * @param {Object} options options | ||
|  |  * @param {TargetProperties | false} options.targetProperties target properties | ||
|  |  * @param {boolean} options.buildHttp buildHttp experiment enabled | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyExternalsPresetsDefaults = ( | ||
|  | 	externalsPresets, | ||
|  | 	{ targetProperties, buildHttp } | ||
|  | ) => { | ||
|  | 	D( | ||
|  | 		externalsPresets, | ||
|  | 		"web", | ||
|  | 		/** @type {boolean | undefined} */ | ||
|  | 		(!buildHttp && targetProperties && targetProperties.web) | ||
|  | 	); | ||
|  | 	D( | ||
|  | 		externalsPresets, | ||
|  | 		"node", | ||
|  | 		/** @type {boolean | undefined} */ | ||
|  | 		(targetProperties && targetProperties.node) | ||
|  | 	); | ||
|  | 	D( | ||
|  | 		externalsPresets, | ||
|  | 		"nwjs", | ||
|  | 		/** @type {boolean | undefined} */ | ||
|  | 		(targetProperties && targetProperties.nwjs) | ||
|  | 	); | ||
|  | 	D( | ||
|  | 		externalsPresets, | ||
|  | 		"electron", | ||
|  | 		/** @type {boolean | undefined} */ | ||
|  | 		(targetProperties && targetProperties.electron) | ||
|  | 	); | ||
|  | 	D( | ||
|  | 		externalsPresets, | ||
|  | 		"electronMain", | ||
|  | 		/** @type {boolean | undefined} */ | ||
|  | 		( | ||
|  | 			targetProperties && | ||
|  | 				targetProperties.electron && | ||
|  | 				targetProperties.electronMain | ||
|  | 		) | ||
|  | 	); | ||
|  | 	D( | ||
|  | 		externalsPresets, | ||
|  | 		"electronPreload", | ||
|  | 		/** @type {boolean | undefined} */ | ||
|  | 		( | ||
|  | 			targetProperties && | ||
|  | 				targetProperties.electron && | ||
|  | 				targetProperties.electronPreload | ||
|  | 		) | ||
|  | 	); | ||
|  | 	D( | ||
|  | 		externalsPresets, | ||
|  | 		"electronRenderer", | ||
|  | 		/** @type {boolean | undefined} */ | ||
|  | 		( | ||
|  | 			targetProperties && | ||
|  | 				targetProperties.electron && | ||
|  | 				targetProperties.electronRenderer | ||
|  | 		) | ||
|  | 	); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {Loader} loader options | ||
|  |  * @param {Object} options options | ||
|  |  * @param {TargetProperties | false} options.targetProperties target properties | ||
|  |  * @param {Environment} options.environment environment | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyLoaderDefaults = (loader, { targetProperties, environment }) => { | ||
|  | 	F(loader, "target", () => { | ||
|  | 		if (targetProperties) { | ||
|  | 			if (targetProperties.electron) { | ||
|  | 				if (targetProperties.electronMain) return "electron-main"; | ||
|  | 				if (targetProperties.electronPreload) return "electron-preload"; | ||
|  | 				if (targetProperties.electronRenderer) return "electron-renderer"; | ||
|  | 				return "electron"; | ||
|  | 			} | ||
|  | 			if (targetProperties.nwjs) return "nwjs"; | ||
|  | 			if (targetProperties.node) return "node"; | ||
|  | 			if (targetProperties.web) return "web"; | ||
|  | 		} | ||
|  | 	}); | ||
|  | 	D(loader, "environment", environment); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {WebpackNode} node options | ||
|  |  * @param {Object} options options | ||
|  |  * @param {TargetProperties | false} options.targetProperties target properties | ||
|  |  * @param {boolean} options.futureDefaults is future defaults enabled | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyNodeDefaults = (node, { futureDefaults, targetProperties }) => { | ||
|  | 	if (node === false) return; | ||
|  | 
 | ||
|  | 	F(node, "global", () => { | ||
|  | 		if (targetProperties && targetProperties.global) return false; | ||
|  | 		// TODO webpack 6 should always default to false
 | ||
|  | 		return futureDefaults ? "warn" : true; | ||
|  | 	}); | ||
|  | 	F(node, "__filename", () => { | ||
|  | 		if (targetProperties && targetProperties.node) return "eval-only"; | ||
|  | 		// TODO webpack 6 should always default to false
 | ||
|  | 		return futureDefaults ? "warn-mock" : "mock"; | ||
|  | 	}); | ||
|  | 	F(node, "__dirname", () => { | ||
|  | 		if (targetProperties && targetProperties.node) return "eval-only"; | ||
|  | 		// TODO webpack 6 should always default to false
 | ||
|  | 		return futureDefaults ? "warn-mock" : "mock"; | ||
|  | 	}); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {Performance} performance options | ||
|  |  * @param {Object} options options | ||
|  |  * @param {boolean} options.production is production | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyPerformanceDefaults = (performance, { production }) => { | ||
|  | 	if (performance === false) return; | ||
|  | 	D(performance, "maxAssetSize", 250000); | ||
|  | 	D(performance, "maxEntrypointSize", 250000); | ||
|  | 	F(performance, "hints", () => (production ? "warning" : false)); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {Optimization} optimization options | ||
|  |  * @param {Object} options options | ||
|  |  * @param {boolean} options.production is production | ||
|  |  * @param {boolean} options.development is development | ||
|  |  * @param {CssExperimentOptions|false} options.css is css enabled | ||
|  |  * @param {boolean} options.records using records | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyOptimizationDefaults = ( | ||
|  | 	optimization, | ||
|  | 	{ production, development, css, records } | ||
|  | ) => { | ||
|  | 	D(optimization, "removeAvailableModules", false); | ||
|  | 	D(optimization, "removeEmptyChunks", true); | ||
|  | 	D(optimization, "mergeDuplicateChunks", true); | ||
|  | 	D(optimization, "flagIncludedChunks", production); | ||
|  | 	F(optimization, "moduleIds", () => { | ||
|  | 		if (production) return "deterministic"; | ||
|  | 		if (development) return "named"; | ||
|  | 		return "natural"; | ||
|  | 	}); | ||
|  | 	F(optimization, "chunkIds", () => { | ||
|  | 		if (production) return "deterministic"; | ||
|  | 		if (development) return "named"; | ||
|  | 		return "natural"; | ||
|  | 	}); | ||
|  | 	F(optimization, "sideEffects", () => (production ? true : "flag")); | ||
|  | 	D(optimization, "providedExports", true); | ||
|  | 	D(optimization, "usedExports", production); | ||
|  | 	D(optimization, "innerGraph", production); | ||
|  | 	D(optimization, "mangleExports", production); | ||
|  | 	D(optimization, "concatenateModules", production); | ||
|  | 	D(optimization, "runtimeChunk", false); | ||
|  | 	D(optimization, "emitOnErrors", !production); | ||
|  | 	D(optimization, "checkWasmTypes", production); | ||
|  | 	D(optimization, "mangleWasmImports", false); | ||
|  | 	D(optimization, "portableRecords", records); | ||
|  | 	D(optimization, "realContentHash", production); | ||
|  | 	D(optimization, "minimize", production); | ||
|  | 	A(optimization, "minimizer", () => [ | ||
|  | 		{ | ||
|  | 			apply: compiler => { | ||
|  | 				// Lazy load the Terser plugin
 | ||
|  | 				const TerserPlugin = require("terser-webpack-plugin"); | ||
|  | 				new TerserPlugin({ | ||
|  | 					terserOptions: { | ||
|  | 						compress: { | ||
|  | 							passes: 2 | ||
|  | 						} | ||
|  | 					} | ||
|  | 				}).apply(compiler); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	]); | ||
|  | 	F(optimization, "nodeEnv", () => { | ||
|  | 		if (production) return "production"; | ||
|  | 		if (development) return "development"; | ||
|  | 		return false; | ||
|  | 	}); | ||
|  | 	const { splitChunks } = optimization; | ||
|  | 	if (splitChunks) { | ||
|  | 		A(splitChunks, "defaultSizeTypes", () => | ||
|  | 			css ? ["javascript", "css", "unknown"] : ["javascript", "unknown"] | ||
|  | 		); | ||
|  | 		D(splitChunks, "hidePathInfo", production); | ||
|  | 		D(splitChunks, "chunks", "async"); | ||
|  | 		D(splitChunks, "usedExports", optimization.usedExports === true); | ||
|  | 		D(splitChunks, "minChunks", 1); | ||
|  | 		F(splitChunks, "minSize", () => (production ? 20000 : 10000)); | ||
|  | 		F(splitChunks, "minRemainingSize", () => (development ? 0 : undefined)); | ||
|  | 		F(splitChunks, "enforceSizeThreshold", () => (production ? 50000 : 30000)); | ||
|  | 		F(splitChunks, "maxAsyncRequests", () => (production ? 30 : Infinity)); | ||
|  | 		F(splitChunks, "maxInitialRequests", () => (production ? 30 : Infinity)); | ||
|  | 		D(splitChunks, "automaticNameDelimiter", "-"); | ||
|  | 		const cacheGroups = | ||
|  | 			/** @type {NonNullable<OptimizationSplitChunksOptions["cacheGroups"]>} */ | ||
|  | 			(splitChunks.cacheGroups); | ||
|  | 		F(cacheGroups, "default", () => ({ | ||
|  | 			idHint: "", | ||
|  | 			reuseExistingChunk: true, | ||
|  | 			minChunks: 2, | ||
|  | 			priority: -20 | ||
|  | 		})); | ||
|  | 		F(cacheGroups, "defaultVendors", () => ({ | ||
|  | 			idHint: "vendors", | ||
|  | 			reuseExistingChunk: true, | ||
|  | 			test: NODE_MODULES_REGEXP, | ||
|  | 			priority: -10 | ||
|  | 		})); | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {Object} options options | ||
|  |  * @param {boolean} options.cache is cache enable | ||
|  |  * @param {string} options.context build context | ||
|  |  * @param {TargetProperties | false} options.targetProperties target properties | ||
|  |  * @param {Mode} options.mode mode | ||
|  |  * @param {CssExperimentOptions|false} options.css is css enabled | ||
|  |  * @returns {ResolveOptions} resolve options | ||
|  |  */ | ||
|  | const getResolveDefaults = ({ | ||
|  | 	cache, | ||
|  | 	context, | ||
|  | 	targetProperties, | ||
|  | 	mode, | ||
|  | 	css | ||
|  | }) => { | ||
|  | 	/** @type {string[]} */ | ||
|  | 	const conditions = ["webpack"]; | ||
|  | 
 | ||
|  | 	conditions.push(mode === "development" ? "development" : "production"); | ||
|  | 
 | ||
|  | 	if (targetProperties) { | ||
|  | 		if (targetProperties.webworker) conditions.push("worker"); | ||
|  | 		if (targetProperties.node) conditions.push("node"); | ||
|  | 		if (targetProperties.web) conditions.push("browser"); | ||
|  | 		if (targetProperties.electron) conditions.push("electron"); | ||
|  | 		if (targetProperties.nwjs) conditions.push("nwjs"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	const jsExtensions = [".js", ".json", ".wasm"]; | ||
|  | 
 | ||
|  | 	const tp = targetProperties; | ||
|  | 	const browserField = | ||
|  | 		tp && tp.web && (!tp.node || (tp.electron && tp.electronRenderer)); | ||
|  | 
 | ||
|  | 	/** @type {function(): ResolveOptions} */ | ||
|  | 	const cjsDeps = () => ({ | ||
|  | 		aliasFields: browserField ? ["browser"] : [], | ||
|  | 		mainFields: browserField ? ["browser", "module", "..."] : ["module", "..."], | ||
|  | 		conditionNames: ["require", "module", "..."], | ||
|  | 		extensions: [...jsExtensions] | ||
|  | 	}); | ||
|  | 	/** @type {function(): ResolveOptions} */ | ||
|  | 	const esmDeps = () => ({ | ||
|  | 		aliasFields: browserField ? ["browser"] : [], | ||
|  | 		mainFields: browserField ? ["browser", "module", "..."] : ["module", "..."], | ||
|  | 		conditionNames: ["import", "module", "..."], | ||
|  | 		extensions: [...jsExtensions] | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	/** @type {ResolveOptions} */ | ||
|  | 	const resolveOptions = { | ||
|  | 		cache, | ||
|  | 		modules: ["node_modules"], | ||
|  | 		conditionNames: conditions, | ||
|  | 		mainFiles: ["index"], | ||
|  | 		extensions: [], | ||
|  | 		aliasFields: [], | ||
|  | 		exportsFields: ["exports"], | ||
|  | 		roots: [context], | ||
|  | 		mainFields: ["main"], | ||
|  | 		byDependency: { | ||
|  | 			wasm: esmDeps(), | ||
|  | 			esm: esmDeps(), | ||
|  | 			loaderImport: esmDeps(), | ||
|  | 			url: { | ||
|  | 				preferRelative: true | ||
|  | 			}, | ||
|  | 			worker: { | ||
|  | 				...esmDeps(), | ||
|  | 				preferRelative: true | ||
|  | 			}, | ||
|  | 			commonjs: cjsDeps(), | ||
|  | 			amd: cjsDeps(), | ||
|  | 			// for backward-compat: loadModule
 | ||
|  | 			loader: cjsDeps(), | ||
|  | 			// for backward-compat: Custom Dependency
 | ||
|  | 			unknown: cjsDeps(), | ||
|  | 			// for backward-compat: getResolve without dependencyType
 | ||
|  | 			undefined: cjsDeps() | ||
|  | 		} | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	if (css) { | ||
|  | 		const styleConditions = []; | ||
|  | 
 | ||
|  | 		styleConditions.push("webpack"); | ||
|  | 		styleConditions.push(mode === "development" ? "development" : "production"); | ||
|  | 		styleConditions.push("style"); | ||
|  | 
 | ||
|  | 		resolveOptions.byDependency["css-import"] = { | ||
|  | 			// We avoid using any main files because we have to be consistent with CSS `@import`
 | ||
|  | 			// and CSS `@import` does not handle `main` files in directories,
 | ||
|  | 			// you should always specify the full URL for styles
 | ||
|  | 			mainFiles: [], | ||
|  | 			mainFields: ["style", "..."], | ||
|  | 			conditionNames: styleConditions, | ||
|  | 			extensions: [".css"] | ||
|  | 		}; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return resolveOptions; | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {Object} options options | ||
|  |  * @param {boolean} options.cache is cache enable | ||
|  |  * @returns {ResolveOptions} resolve options | ||
|  |  */ | ||
|  | const getResolveLoaderDefaults = ({ cache }) => { | ||
|  | 	/** @type {ResolveOptions} */ | ||
|  | 	const resolveOptions = { | ||
|  | 		cache, | ||
|  | 		conditionNames: ["loader", "require", "node"], | ||
|  | 		exportsFields: ["exports"], | ||
|  | 		mainFields: ["loader", "main"], | ||
|  | 		extensions: [".js"], | ||
|  | 		mainFiles: ["index"] | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	return resolveOptions; | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {InfrastructureLogging} infrastructureLogging options | ||
|  |  * @returns {void} | ||
|  |  */ | ||
|  | const applyInfrastructureLoggingDefaults = infrastructureLogging => { | ||
|  | 	F(infrastructureLogging, "stream", () => process.stderr); | ||
|  | 	const tty = | ||
|  | 		/** @type {any} */ (infrastructureLogging.stream).isTTY && | ||
|  | 		process.env.TERM !== "dumb"; | ||
|  | 	D(infrastructureLogging, "level", "info"); | ||
|  | 	D(infrastructureLogging, "debug", false); | ||
|  | 	D(infrastructureLogging, "colors", tty); | ||
|  | 	D(infrastructureLogging, "appendOnly", !tty); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.applyWebpackOptionsBaseDefaults = applyWebpackOptionsBaseDefaults; | ||
|  | exports.applyWebpackOptionsDefaults = applyWebpackOptionsDefaults; |