| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-17 21:39:16 +08:00
										 |  |  | const util = require("util"); | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | /** @typedef {import("../../declarations/WebpackOptions").CacheOptionsNormalized} CacheOptions */ | 
					
						
							|  |  |  | /** @typedef {import("../../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescriptionNormalized */ | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | /** @typedef {import("../../declarations/WebpackOptions").EntryStatic} EntryStatic */ | 
					
						
							|  |  |  | /** @typedef {import("../../declarations/WebpackOptions").EntryStaticNormalized} EntryStaticNormalized */ | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | /** @typedef {import("../../declarations/WebpackOptions").Externals} Externals */ | 
					
						
							| 
									
										
										
										
											2020-02-20 03:25:49 +08:00
										 |  |  | /** @typedef {import("../../declarations/WebpackOptions").LibraryName} LibraryName */ | 
					
						
							|  |  |  | /** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */ | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | /** @typedef {import("../../declarations/WebpackOptions").ModuleOptionsNormalized} ModuleOptionsNormalized */ | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | /** @typedef {import("../../declarations/WebpackOptions").OptimizationRuntimeChunk} OptimizationRuntimeChunk */ | 
					
						
							|  |  |  | /** @typedef {import("../../declarations/WebpackOptions").OptimizationRuntimeChunkNormalized} OptimizationRuntimeChunkNormalized */ | 
					
						
							| 
									
										
										
										
											2020-02-20 03:25:49 +08:00
										 |  |  | /** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} OutputNormalized */ | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | /** @typedef {import("../../declarations/WebpackOptions").Plugins} Plugins */ | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | /** @typedef {import("../../declarations/WebpackOptions").WebpackOptions} WebpackOptions */ | 
					
						
							|  |  |  | /** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptionsNormalized */ | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | /** @typedef {import("../Entrypoint")} Entrypoint */ | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-17 21:39:16 +08:00
										 |  |  | const handledDeprecatedNoEmitOnErrors = util.deprecate( | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {boolean} noEmitOnErrors no emit on errors | 
					
						
							|  |  |  | 	 * @param {boolean | undefined} emitOnErrors emit on errors | 
					
						
							|  |  |  | 	 * @returns {boolean} emit on errors | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-07-17 21:39:16 +08:00
										 |  |  | 	(noEmitOnErrors, emitOnErrors) => { | 
					
						
							|  |  |  | 		if (emitOnErrors !== undefined && !noEmitOnErrors === !emitOnErrors) { | 
					
						
							|  |  |  | 			throw new Error( | 
					
						
							|  |  |  | 				"Conflicting use of 'optimization.noEmitOnErrors' and 'optimization.emitOnErrors'. Remove deprecated 'optimization.noEmitOnErrors' from config." | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return !noEmitOnErrors; | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	"optimization.noEmitOnErrors is deprecated in favor of optimization.emitOnErrors", | 
					
						
							|  |  |  | 	"DEP_WEBPACK_CONFIGURATION_OPTIMIZATION_NO_EMIT_ON_ERRORS" | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @template R | 
					
						
							| 
									
										
										
										
											2020-05-08 05:44:15 +08:00
										 |  |  |  * @param {T|undefined} value value or not | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  |  * @param {function(T): R} fn nested handler | 
					
						
							|  |  |  |  * @returns {R} result value | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const nestedConfig = (value, fn) => | 
					
						
							|  |  |  | 	value === undefined ? fn(/** @type {T} */ ({})) : fn(value); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-05 18:11:02 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @param {T|undefined} value value or not | 
					
						
							|  |  |  |  * @returns {T} result value | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | const cloneObject = value => /** @type {T} */ ({ ...value }); | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @template R | 
					
						
							| 
									
										
										
										
											2020-05-08 05:44:15 +08:00
										 |  |  |  * @param {T|undefined} value value or not | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  |  * @param {function(T): R} fn nested handler | 
					
						
							| 
									
										
										
										
											2020-05-08 05:44:15 +08:00
										 |  |  |  * @returns {R|undefined} result value | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const optionalNestedConfig = (value, fn) => | 
					
						
							|  |  |  | 	value === undefined ? undefined : fn(value); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @template R | 
					
						
							| 
									
										
										
										
											2020-05-08 05:44:15 +08:00
										 |  |  |  * @param {T[]|undefined} value array or not | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  |  * @param {function(T[]): R[]} fn nested handler | 
					
						
							| 
									
										
										
										
											2020-05-08 05:44:15 +08:00
										 |  |  |  * @returns {R[]|undefined} cloned value | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const nestedArray = (value, fn) => (Array.isArray(value) ? fn(value) : fn([])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @template R | 
					
						
							| 
									
										
										
										
											2020-05-08 05:44:15 +08:00
										 |  |  |  * @param {T[]|undefined} value array or not | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  |  * @param {function(T[]): R[]} fn nested handler | 
					
						
							| 
									
										
										
										
											2020-05-08 05:44:15 +08:00
										 |  |  |  * @returns {R[]|undefined} cloned value | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const optionalNestedArray = (value, fn) => | 
					
						
							|  |  |  | 	Array.isArray(value) ? fn(value) : undefined; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-28 22:52:30 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @template R | 
					
						
							|  |  |  |  * @param {Record<string, T>|undefined} value value or not | 
					
						
							|  |  |  |  * @param {function(T): R} fn nested handler | 
					
						
							| 
									
										
										
										
											2021-01-20 22:08:58 +08:00
										 |  |  |  * @param {Record<string, function(T): R>=} customKeys custom nested handler for some keys | 
					
						
							| 
									
										
										
										
											2020-05-28 22:52:30 +08:00
										 |  |  |  * @returns {Record<string, R>} result value | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-01-20 22:08:58 +08:00
										 |  |  | const keyedNestedConfig = (value, fn, customKeys) => { | 
					
						
							| 
									
										
										
										
											2024-07-31 13:38:50 +08:00
										 |  |  | 	/* eslint-disable no-sequences */ | 
					
						
							| 
									
										
										
										
											2021-01-20 22:08:58 +08:00
										 |  |  | 	const result = | 
					
						
							|  |  |  | 		value === undefined | 
					
						
							|  |  |  | 			? {} | 
					
						
							|  |  |  | 			: Object.keys(value).reduce( | 
					
						
							|  |  |  | 					(obj, key) => ( | 
					
						
							| 
									
										
										
										
											2021-05-11 15:31:46 +08:00
										 |  |  | 						(obj[key] = ( | 
					
						
							|  |  |  | 							customKeys && key in customKeys ? customKeys[key] : fn | 
					
						
							|  |  |  | 						)(value[key])), | 
					
						
							| 
									
										
										
										
											2021-01-20 22:08:58 +08:00
										 |  |  | 						obj | 
					
						
							|  |  |  | 					), | 
					
						
							|  |  |  | 					/** @type {Record<string, R>} */ ({}) | 
					
						
							| 
									
										
										
										
											2024-07-31 05:43:19 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2024-07-31 13:38:50 +08:00
										 |  |  | 	/* eslint-enable no-sequences */ | 
					
						
							| 
									
										
										
										
											2021-01-20 22:08:58 +08:00
										 |  |  | 	if (customKeys) { | 
					
						
							|  |  |  | 		for (const key of Object.keys(customKeys)) { | 
					
						
							|  |  |  | 			if (!(key in result)) { | 
					
						
							|  |  |  | 				result[key] = customKeys[key](/** @type {T} */ ({})); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2020-05-28 22:52:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {WebpackOptions} config input config | 
					
						
							|  |  |  |  * @returns {WebpackOptionsNormalized} normalized options | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | const getNormalizedWebpackOptions = config => ({ | 
					
						
							|  |  |  | 	amd: config.amd, | 
					
						
							|  |  |  | 	bail: config.bail, | 
					
						
							|  |  |  | 	cache: | 
					
						
							|  |  |  | 		/** @type {NonNullable<CacheOptions>} */ | 
					
						
							|  |  |  | 		( | 
					
						
							|  |  |  | 			optionalNestedConfig(config.cache, cache => { | 
					
						
							|  |  |  | 				if (cache === false) return false; | 
					
						
							|  |  |  | 				if (cache === true) { | 
					
						
							|  |  |  | 					return { | 
					
						
							|  |  |  | 						type: "memory", | 
					
						
							|  |  |  | 						maxGenerations: undefined | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				switch (cache.type) { | 
					
						
							|  |  |  | 					case "filesystem": | 
					
						
							|  |  |  | 						return { | 
					
						
							|  |  |  | 							type: "filesystem", | 
					
						
							|  |  |  | 							allowCollectingMemory: cache.allowCollectingMemory, | 
					
						
							|  |  |  | 							maxMemoryGenerations: cache.maxMemoryGenerations, | 
					
						
							|  |  |  | 							maxAge: cache.maxAge, | 
					
						
							|  |  |  | 							profile: cache.profile, | 
					
						
							|  |  |  | 							buildDependencies: cloneObject(cache.buildDependencies), | 
					
						
							|  |  |  | 							cacheDirectory: cache.cacheDirectory, | 
					
						
							|  |  |  | 							cacheLocation: cache.cacheLocation, | 
					
						
							|  |  |  | 							hashAlgorithm: cache.hashAlgorithm, | 
					
						
							|  |  |  | 							compression: cache.compression, | 
					
						
							|  |  |  | 							idleTimeout: cache.idleTimeout, | 
					
						
							|  |  |  | 							idleTimeoutForInitialStore: cache.idleTimeoutForInitialStore, | 
					
						
							|  |  |  | 							idleTimeoutAfterLargeChanges: cache.idleTimeoutAfterLargeChanges, | 
					
						
							|  |  |  | 							name: cache.name, | 
					
						
							|  |  |  | 							store: cache.store, | 
					
						
							|  |  |  | 							version: cache.version, | 
					
						
							|  |  |  | 							readonly: cache.readonly | 
					
						
							|  |  |  | 						}; | 
					
						
							|  |  |  | 					case undefined: | 
					
						
							|  |  |  | 					case "memory": | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | 						return { | 
					
						
							|  |  |  | 							type: "memory", | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 							maxGenerations: cache.maxGenerations | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | 						}; | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 					default: | 
					
						
							|  |  |  | 						// @ts-expect-error Property 'type' does not exist on type 'never'. ts(2339)
 | 
					
						
							|  |  |  | 						throw new Error(`Not implemented cache.type ${cache.type}`); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 	context: config.context, | 
					
						
							|  |  |  | 	dependencies: config.dependencies, | 
					
						
							|  |  |  | 	devServer: optionalNestedConfig(config.devServer, devServer => { | 
					
						
							|  |  |  | 		if (devServer === false) return false; | 
					
						
							|  |  |  | 		return { ...devServer }; | 
					
						
							|  |  |  | 	}), | 
					
						
							|  |  |  | 	devtool: config.devtool, | 
					
						
							|  |  |  | 	entry: | 
					
						
							|  |  |  | 		config.entry === undefined | 
					
						
							|  |  |  | 			? { main: {} } | 
					
						
							|  |  |  | 			: typeof config.entry === "function" | 
					
						
							|  |  |  | 				? ( | 
					
						
							|  |  |  | 						fn => () => | 
					
						
							|  |  |  | 							Promise.resolve().then(fn).then(getNormalizedEntryStatic) | 
					
						
							|  |  |  | 					)(config.entry) | 
					
						
							|  |  |  | 				: getNormalizedEntryStatic(config.entry), | 
					
						
							|  |  |  | 	experiments: nestedConfig(config.experiments, experiments => ({ | 
					
						
							|  |  |  | 		...experiments, | 
					
						
							|  |  |  | 		buildHttp: optionalNestedConfig(experiments.buildHttp, options => | 
					
						
							|  |  |  | 			Array.isArray(options) ? { allowedUris: options } : options | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 		lazyCompilation: optionalNestedConfig( | 
					
						
							|  |  |  | 			experiments.lazyCompilation, | 
					
						
							|  |  |  | 			options => (options === true ? {} : options) | 
					
						
							|  |  |  | 		) | 
					
						
							|  |  |  | 	})), | 
					
						
							|  |  |  | 	externals: /** @type {NonNullable<Externals>} */ (config.externals), | 
					
						
							|  |  |  | 	externalsPresets: cloneObject(config.externalsPresets), | 
					
						
							|  |  |  | 	externalsType: config.externalsType, | 
					
						
							|  |  |  | 	ignoreWarnings: config.ignoreWarnings | 
					
						
							|  |  |  | 		? config.ignoreWarnings.map(ignore => { | 
					
						
							|  |  |  | 				if (typeof ignore === "function") return ignore; | 
					
						
							|  |  |  | 				const i = ignore instanceof RegExp ? { message: ignore } : ignore; | 
					
						
							|  |  |  | 				return (warning, { requestShortener }) => { | 
					
						
							|  |  |  | 					if (!i.message && !i.module && !i.file) return false; | 
					
						
							|  |  |  | 					if (i.message && !i.message.test(warning.message)) { | 
					
						
							|  |  |  | 						return false; | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 					if ( | 
					
						
							|  |  |  | 						i.module && | 
					
						
							|  |  |  | 						(!warning.module || | 
					
						
							|  |  |  | 							!i.module.test( | 
					
						
							|  |  |  | 								warning.module.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 							)) | 
					
						
							|  |  |  | 					) { | 
					
						
							|  |  |  | 						return false; | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 					if (i.file && (!warning.file || !i.file.test(warning.file))) { | 
					
						
							|  |  |  | 						return false; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					return true; | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		: undefined, | 
					
						
							|  |  |  | 	infrastructureLogging: cloneObject(config.infrastructureLogging), | 
					
						
							|  |  |  | 	loader: cloneObject(config.loader), | 
					
						
							|  |  |  | 	mode: config.mode, | 
					
						
							|  |  |  | 	module: | 
					
						
							|  |  |  | 		/** @type {ModuleOptionsNormalized} */ | 
					
						
							|  |  |  | 		( | 
					
						
							|  |  |  | 			nestedConfig(config.module, module => ({ | 
					
						
							|  |  |  | 				noParse: module.noParse, | 
					
						
							|  |  |  | 				unsafeCache: module.unsafeCache, | 
					
						
							|  |  |  | 				parser: keyedNestedConfig(module.parser, cloneObject, { | 
					
						
							|  |  |  | 					javascript: parserOptions => ({ | 
					
						
							|  |  |  | 						unknownContextRequest: module.unknownContextRequest, | 
					
						
							|  |  |  | 						unknownContextRegExp: module.unknownContextRegExp, | 
					
						
							|  |  |  | 						unknownContextRecursive: module.unknownContextRecursive, | 
					
						
							|  |  |  | 						unknownContextCritical: module.unknownContextCritical, | 
					
						
							|  |  |  | 						exprContextRequest: module.exprContextRequest, | 
					
						
							|  |  |  | 						exprContextRegExp: module.exprContextRegExp, | 
					
						
							|  |  |  | 						exprContextRecursive: module.exprContextRecursive, | 
					
						
							|  |  |  | 						exprContextCritical: module.exprContextCritical, | 
					
						
							|  |  |  | 						wrappedContextRegExp: module.wrappedContextRegExp, | 
					
						
							|  |  |  | 						wrappedContextRecursive: module.wrappedContextRecursive, | 
					
						
							|  |  |  | 						wrappedContextCritical: module.wrappedContextCritical, | 
					
						
							|  |  |  | 						// TODO webpack 6 remove
 | 
					
						
							|  |  |  | 						strictExportPresence: module.strictExportPresence, | 
					
						
							|  |  |  | 						strictThisContextOnImports: module.strictThisContextOnImports, | 
					
						
							|  |  |  | 						...parserOptions | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 				}), | 
					
						
							|  |  |  | 				generator: cloneObject(module.generator), | 
					
						
							|  |  |  | 				defaultRules: optionalNestedArray(module.defaultRules, r => [...r]), | 
					
						
							|  |  |  | 				rules: nestedArray(module.rules, r => [...r]) | 
					
						
							|  |  |  | 			})) | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 	name: config.name, | 
					
						
							|  |  |  | 	node: nestedConfig( | 
					
						
							|  |  |  | 		config.node, | 
					
						
							|  |  |  | 		node => | 
					
						
							|  |  |  | 			node && { | 
					
						
							|  |  |  | 				...node | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 	), | 
					
						
							|  |  |  | 	optimization: nestedConfig(config.optimization, optimization => ({ | 
					
						
							|  |  |  | 		...optimization, | 
					
						
							|  |  |  | 		runtimeChunk: getNormalizedOptimizationRuntimeChunk( | 
					
						
							|  |  |  | 			optimization.runtimeChunk | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 		splitChunks: nestedConfig( | 
					
						
							|  |  |  | 			optimization.splitChunks, | 
					
						
							|  |  |  | 			splitChunks => | 
					
						
							|  |  |  | 				splitChunks && { | 
					
						
							|  |  |  | 					...splitChunks, | 
					
						
							|  |  |  | 					defaultSizeTypes: splitChunks.defaultSizeTypes | 
					
						
							|  |  |  | 						? [...splitChunks.defaultSizeTypes] | 
					
						
							|  |  |  | 						: ["..."], | 
					
						
							|  |  |  | 					cacheGroups: cloneObject(splitChunks.cacheGroups) | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 		), | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 		emitOnErrors: | 
					
						
							|  |  |  | 			optimization.noEmitOnErrors !== undefined | 
					
						
							|  |  |  | 				? handledDeprecatedNoEmitOnErrors( | 
					
						
							|  |  |  | 						optimization.noEmitOnErrors, | 
					
						
							|  |  |  | 						optimization.emitOnErrors | 
					
						
							|  |  |  | 					) | 
					
						
							|  |  |  | 				: optimization.emitOnErrors | 
					
						
							|  |  |  | 	})), | 
					
						
							|  |  |  | 	output: nestedConfig(config.output, output => { | 
					
						
							|  |  |  | 		const { library } = output; | 
					
						
							|  |  |  | 		const libraryAsName = /** @type {LibraryName} */ (library); | 
					
						
							|  |  |  | 		const libraryBase = | 
					
						
							|  |  |  | 			typeof library === "object" && | 
					
						
							|  |  |  | 			library && | 
					
						
							|  |  |  | 			!Array.isArray(library) && | 
					
						
							|  |  |  | 			"type" in library | 
					
						
							|  |  |  | 				? library | 
					
						
							|  |  |  | 				: libraryAsName || output.libraryTarget | 
					
						
							|  |  |  | 					? /** @type {LibraryOptions} */ ({ | 
					
						
							|  |  |  | 							name: libraryAsName | 
					
						
							|  |  |  | 						}) | 
					
						
							|  |  |  | 					: undefined; | 
					
						
							|  |  |  | 		/** @type {OutputNormalized} */ | 
					
						
							|  |  |  | 		const result = { | 
					
						
							|  |  |  | 			assetModuleFilename: output.assetModuleFilename, | 
					
						
							|  |  |  | 			asyncChunks: output.asyncChunks, | 
					
						
							|  |  |  | 			charset: output.charset, | 
					
						
							|  |  |  | 			chunkFilename: output.chunkFilename, | 
					
						
							|  |  |  | 			chunkFormat: output.chunkFormat, | 
					
						
							|  |  |  | 			chunkLoading: output.chunkLoading, | 
					
						
							|  |  |  | 			chunkLoadingGlobal: output.chunkLoadingGlobal, | 
					
						
							|  |  |  | 			chunkLoadTimeout: output.chunkLoadTimeout, | 
					
						
							|  |  |  | 			cssFilename: output.cssFilename, | 
					
						
							|  |  |  | 			cssChunkFilename: output.cssChunkFilename, | 
					
						
							|  |  |  | 			cssHeadDataCompression: output.cssHeadDataCompression, | 
					
						
							|  |  |  | 			clean: output.clean, | 
					
						
							|  |  |  | 			compareBeforeEmit: output.compareBeforeEmit, | 
					
						
							|  |  |  | 			crossOriginLoading: output.crossOriginLoading, | 
					
						
							|  |  |  | 			devtoolFallbackModuleFilenameTemplate: | 
					
						
							|  |  |  | 				output.devtoolFallbackModuleFilenameTemplate, | 
					
						
							|  |  |  | 			devtoolModuleFilenameTemplate: output.devtoolModuleFilenameTemplate, | 
					
						
							|  |  |  | 			devtoolNamespace: output.devtoolNamespace, | 
					
						
							|  |  |  | 			environment: cloneObject(output.environment), | 
					
						
							|  |  |  | 			enabledChunkLoadingTypes: output.enabledChunkLoadingTypes | 
					
						
							|  |  |  | 				? [...output.enabledChunkLoadingTypes] | 
					
						
							|  |  |  | 				: ["..."], | 
					
						
							|  |  |  | 			enabledLibraryTypes: output.enabledLibraryTypes | 
					
						
							|  |  |  | 				? [...output.enabledLibraryTypes] | 
					
						
							|  |  |  | 				: ["..."], | 
					
						
							|  |  |  | 			enabledWasmLoadingTypes: output.enabledWasmLoadingTypes | 
					
						
							|  |  |  | 				? [...output.enabledWasmLoadingTypes] | 
					
						
							|  |  |  | 				: ["..."], | 
					
						
							|  |  |  | 			filename: output.filename, | 
					
						
							|  |  |  | 			globalObject: output.globalObject, | 
					
						
							|  |  |  | 			hashDigest: output.hashDigest, | 
					
						
							|  |  |  | 			hashDigestLength: output.hashDigestLength, | 
					
						
							|  |  |  | 			hashFunction: output.hashFunction, | 
					
						
							|  |  |  | 			hashSalt: output.hashSalt, | 
					
						
							|  |  |  | 			hotUpdateChunkFilename: output.hotUpdateChunkFilename, | 
					
						
							|  |  |  | 			hotUpdateGlobal: output.hotUpdateGlobal, | 
					
						
							|  |  |  | 			hotUpdateMainFilename: output.hotUpdateMainFilename, | 
					
						
							|  |  |  | 			ignoreBrowserWarnings: output.ignoreBrowserWarnings, | 
					
						
							|  |  |  | 			iife: output.iife, | 
					
						
							|  |  |  | 			importFunctionName: output.importFunctionName, | 
					
						
							|  |  |  | 			importMetaName: output.importMetaName, | 
					
						
							|  |  |  | 			scriptType: output.scriptType, | 
					
						
							|  |  |  | 			library: libraryBase && { | 
					
						
							|  |  |  | 				type: | 
					
						
							|  |  |  | 					output.libraryTarget !== undefined | 
					
						
							|  |  |  | 						? output.libraryTarget | 
					
						
							|  |  |  | 						: libraryBase.type, | 
					
						
							|  |  |  | 				auxiliaryComment: | 
					
						
							|  |  |  | 					output.auxiliaryComment !== undefined | 
					
						
							|  |  |  | 						? output.auxiliaryComment | 
					
						
							|  |  |  | 						: libraryBase.auxiliaryComment, | 
					
						
							|  |  |  | 				amdContainer: | 
					
						
							|  |  |  | 					output.amdContainer !== undefined | 
					
						
							|  |  |  | 						? output.amdContainer | 
					
						
							|  |  |  | 						: libraryBase.amdContainer, | 
					
						
							|  |  |  | 				export: | 
					
						
							|  |  |  | 					output.libraryExport !== undefined | 
					
						
							|  |  |  | 						? output.libraryExport | 
					
						
							|  |  |  | 						: libraryBase.export, | 
					
						
							|  |  |  | 				name: libraryBase.name, | 
					
						
							|  |  |  | 				umdNamedDefine: | 
					
						
							|  |  |  | 					output.umdNamedDefine !== undefined | 
					
						
							|  |  |  | 						? output.umdNamedDefine | 
					
						
							|  |  |  | 						: libraryBase.umdNamedDefine | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			module: output.module, | 
					
						
							|  |  |  | 			path: output.path, | 
					
						
							|  |  |  | 			pathinfo: output.pathinfo, | 
					
						
							|  |  |  | 			publicPath: output.publicPath, | 
					
						
							|  |  |  | 			sourceMapFilename: output.sourceMapFilename, | 
					
						
							|  |  |  | 			sourcePrefix: output.sourcePrefix, | 
					
						
							|  |  |  | 			strictModuleErrorHandling: output.strictModuleErrorHandling, | 
					
						
							|  |  |  | 			strictModuleExceptionHandling: output.strictModuleExceptionHandling, | 
					
						
							|  |  |  | 			trustedTypes: optionalNestedConfig(output.trustedTypes, trustedTypes => { | 
					
						
							|  |  |  | 				if (trustedTypes === true) return {}; | 
					
						
							|  |  |  | 				if (typeof trustedTypes === "string") | 
					
						
							|  |  |  | 					return { policyName: trustedTypes }; | 
					
						
							|  |  |  | 				return { ...trustedTypes }; | 
					
						
							|  |  |  | 			}), | 
					
						
							|  |  |  | 			uniqueName: output.uniqueName, | 
					
						
							|  |  |  | 			wasmLoading: output.wasmLoading, | 
					
						
							|  |  |  | 			webassemblyModuleFilename: output.webassemblyModuleFilename, | 
					
						
							|  |  |  | 			workerPublicPath: output.workerPublicPath, | 
					
						
							|  |  |  | 			workerChunkLoading: output.workerChunkLoading, | 
					
						
							|  |  |  | 			workerWasmLoading: output.workerWasmLoading | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		return result; | 
					
						
							|  |  |  | 	}), | 
					
						
							|  |  |  | 	parallelism: config.parallelism, | 
					
						
							|  |  |  | 	performance: optionalNestedConfig(config.performance, performance => { | 
					
						
							|  |  |  | 		if (performance === false) return false; | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			...performance | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	}), | 
					
						
							|  |  |  | 	plugins: /** @type {Plugins} */ (nestedArray(config.plugins, p => [...p])), | 
					
						
							|  |  |  | 	profile: config.profile, | 
					
						
							|  |  |  | 	recordsInputPath: | 
					
						
							|  |  |  | 		config.recordsInputPath !== undefined | 
					
						
							|  |  |  | 			? config.recordsInputPath | 
					
						
							|  |  |  | 			: config.recordsPath, | 
					
						
							|  |  |  | 	recordsOutputPath: | 
					
						
							|  |  |  | 		config.recordsOutputPath !== undefined | 
					
						
							|  |  |  | 			? config.recordsOutputPath | 
					
						
							|  |  |  | 			: config.recordsPath, | 
					
						
							|  |  |  | 	resolve: nestedConfig(config.resolve, resolve => ({ | 
					
						
							|  |  |  | 		...resolve, | 
					
						
							|  |  |  | 		byDependency: keyedNestedConfig(resolve.byDependency, cloneObject) | 
					
						
							|  |  |  | 	})), | 
					
						
							|  |  |  | 	resolveLoader: cloneObject(config.resolveLoader), | 
					
						
							|  |  |  | 	snapshot: nestedConfig(config.snapshot, snapshot => ({ | 
					
						
							|  |  |  | 		resolveBuildDependencies: optionalNestedConfig( | 
					
						
							|  |  |  | 			snapshot.resolveBuildDependencies, | 
					
						
							|  |  |  | 			resolveBuildDependencies => ({ | 
					
						
							|  |  |  | 				timestamp: resolveBuildDependencies.timestamp, | 
					
						
							|  |  |  | 				hash: resolveBuildDependencies.hash | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 		buildDependencies: optionalNestedConfig( | 
					
						
							|  |  |  | 			snapshot.buildDependencies, | 
					
						
							|  |  |  | 			buildDependencies => ({ | 
					
						
							|  |  |  | 				timestamp: buildDependencies.timestamp, | 
					
						
							|  |  |  | 				hash: buildDependencies.hash | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 		resolve: optionalNestedConfig(snapshot.resolve, resolve => ({ | 
					
						
							|  |  |  | 			timestamp: resolve.timestamp, | 
					
						
							|  |  |  | 			hash: resolve.hash | 
					
						
							|  |  |  | 		})), | 
					
						
							|  |  |  | 		module: optionalNestedConfig(snapshot.module, module => ({ | 
					
						
							|  |  |  | 			timestamp: module.timestamp, | 
					
						
							|  |  |  | 			hash: module.hash | 
					
						
							|  |  |  | 		})), | 
					
						
							|  |  |  | 		immutablePaths: optionalNestedArray(snapshot.immutablePaths, p => [...p]), | 
					
						
							|  |  |  | 		managedPaths: optionalNestedArray(snapshot.managedPaths, p => [...p]), | 
					
						
							|  |  |  | 		unmanagedPaths: optionalNestedArray(snapshot.unmanagedPaths, p => [...p]) | 
					
						
							|  |  |  | 	})), | 
					
						
							|  |  |  | 	stats: nestedConfig(config.stats, stats => { | 
					
						
							|  |  |  | 		if (stats === false) { | 
					
						
							| 
									
										
										
										
											2020-07-17 21:39:16 +08:00
										 |  |  | 			return { | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 				preset: "none" | 
					
						
							| 
									
										
										
										
											2020-07-17 21:39:16 +08:00
										 |  |  | 			}; | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if (stats === true) { | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | 			return { | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 				preset: "normal" | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | 			}; | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if (typeof stats === "string") { | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | 			return { | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 				preset: stats | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | 			}; | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			...stats | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	}), | 
					
						
							|  |  |  | 	target: config.target, | 
					
						
							|  |  |  | 	watch: config.watch, | 
					
						
							|  |  |  | 	watchOptions: cloneObject(config.watchOptions) | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @param {EntryStatic} entry static entry options | 
					
						
							|  |  |  |  * @returns {EntryStaticNormalized} normalized static entry options | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const getNormalizedEntryStatic = entry => { | 
					
						
							|  |  |  | 	if (typeof entry === "string") { | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			main: { | 
					
						
							|  |  |  | 				import: [entry] | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (Array.isArray(entry)) { | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			main: { | 
					
						
							|  |  |  | 				import: entry | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	/** @type {EntryStaticNormalized} */ | 
					
						
							|  |  |  | 	const result = {}; | 
					
						
							|  |  |  | 	for (const key of Object.keys(entry)) { | 
					
						
							|  |  |  | 		const value = entry[key]; | 
					
						
							|  |  |  | 		if (typeof value === "string") { | 
					
						
							|  |  |  | 			result[key] = { | 
					
						
							|  |  |  | 				import: [value] | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 		} else if (Array.isArray(value)) { | 
					
						
							|  |  |  | 			result[key] = { | 
					
						
							|  |  |  | 				import: value | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2020-02-26 20:08:05 +08:00
										 |  |  | 			result[key] = { | 
					
						
							|  |  |  | 				import: | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | 					/** @type {EntryDescriptionNormalized["import"]} */ | 
					
						
							|  |  |  | 					( | 
					
						
							|  |  |  | 						value.import && | 
					
						
							|  |  |  | 							(Array.isArray(value.import) ? value.import : [value.import]) | 
					
						
							|  |  |  | 					), | 
					
						
							| 
									
										
										
										
											2020-02-26 20:08:05 +08:00
										 |  |  | 				filename: value.filename, | 
					
						
							| 
									
										
										
										
											2020-12-22 21:51:09 +08:00
										 |  |  | 				layer: value.layer, | 
					
						
							| 
									
										
										
										
											2020-07-30 17:18:09 +08:00
										 |  |  | 				runtime: value.runtime, | 
					
						
							| 
									
										
										
										
											2022-02-21 21:23:47 +08:00
										 |  |  | 				baseUri: value.baseUri, | 
					
						
							| 
									
										
										
										
											2021-04-14 22:38:01 +08:00
										 |  |  | 				publicPath: value.publicPath, | 
					
						
							| 
									
										
										
										
											2020-08-26 03:45:56 +08:00
										 |  |  | 				chunkLoading: value.chunkLoading, | 
					
						
							| 
									
										
										
										
											2021-11-10 21:23:03 +08:00
										 |  |  | 				asyncChunks: value.asyncChunks, | 
					
						
							| 
									
										
										
										
											2020-09-09 15:23:01 +08:00
										 |  |  | 				wasmLoading: value.wasmLoading, | 
					
						
							| 
									
										
										
										
											2020-02-26 20:08:05 +08:00
										 |  |  | 				dependOn: | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | 					/** @type {EntryDescriptionNormalized["dependOn"]} */ | 
					
						
							|  |  |  | 					( | 
					
						
							|  |  |  | 						value.dependOn && | 
					
						
							|  |  |  | 							(Array.isArray(value.dependOn) | 
					
						
							|  |  |  | 								? value.dependOn | 
					
						
							|  |  |  | 								: [value.dependOn]) | 
					
						
							|  |  |  | 					), | 
					
						
							| 
									
										
										
										
											2020-02-26 19:34:57 +08:00
										 |  |  | 				library: value.library | 
					
						
							| 
									
										
										
										
											2020-02-26 20:08:05 +08:00
										 |  |  | 			}; | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @param {OptimizationRuntimeChunk=} runtimeChunk runtimeChunk option | 
					
						
							|  |  |  |  * @returns {OptimizationRuntimeChunkNormalized=} normalized runtimeChunk option | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const getNormalizedOptimizationRuntimeChunk = runtimeChunk => { | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 	if (runtimeChunk === undefined) return; | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | 	if (runtimeChunk === false) return false; | 
					
						
							|  |  |  | 	if (runtimeChunk === "single") { | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			name: () => "runtime" | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (runtimeChunk === true || runtimeChunk === "multiple") { | 
					
						
							|  |  |  | 		return { | 
					
						
							| 
									
										
										
										
											2023-05-24 05:25:06 +08:00
										 |  |  | 			/** | 
					
						
							|  |  |  | 			 * @param {Entrypoint} entrypoint entrypoint | 
					
						
							|  |  |  | 			 * @returns {string} runtime chunk name | 
					
						
							|  |  |  | 			 */ | 
					
						
							| 
									
										
										
										
											2020-02-17 17:27:46 +08:00
										 |  |  | 			name: entrypoint => `runtime~${entrypoint.name}` | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	const { name } = runtimeChunk; | 
					
						
							|  |  |  | 	return { | 
					
						
							|  |  |  | 		name: typeof name === "function" ? name : () => name | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-31 04:54:55 +08:00
										 |  |  | module.exports.getNormalizedWebpackOptions = getNormalizedWebpackOptions; |