| 
									
										
										
										
											2019-08-08 18:44:45 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 02:41:45 +08:00
										 |  |  | const { validate } = require("schema-utils"); | 
					
						
							| 
									
										
										
										
											2019-08-08 18:44:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-13 00:51:26 +08:00
										 |  |  | /* cSpell:disable */ | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | const DID_YOU_MEAN = { | 
					
						
							|  |  |  | 	rules: "module.rules", | 
					
						
							|  |  |  | 	loaders: "module.rules or module.rules.*.use", | 
					
						
							| 
									
										
										
										
											2020-09-22 03:59:33 +08:00
										 |  |  | 	query: "module.rules.*.options (BREAKING CHANGE since webpack 5)", | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | 	noParse: "module.noParse", | 
					
						
							|  |  |  | 	filename: "output.filename or module.rules.*.generator.filename", | 
					
						
							|  |  |  | 	file: "output.filename", | 
					
						
							|  |  |  | 	chunkFilename: "output.chunkFilename", | 
					
						
							|  |  |  | 	chunkfilename: "output.chunkFilename", | 
					
						
							| 
									
										
										
										
											2020-09-22 03:59:33 +08:00
										 |  |  | 	ecmaVersion: | 
					
						
							|  |  |  | 		"output.environment (output.ecmaVersion was a temporary configuration option during webpack 5 beta)", | 
					
						
							|  |  |  | 	ecmaversion: | 
					
						
							|  |  |  | 		"output.environment (output.ecmaVersion was a temporary configuration option during webpack 5 beta)", | 
					
						
							| 
									
										
										
										
											2021-05-11 15:31:46 +08:00
										 |  |  | 	ecma: "output.environment (output.ecmaVersion was a temporary configuration option during webpack 5 beta)", | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | 	path: "output.path", | 
					
						
							|  |  |  | 	pathinfo: "output.pathinfo", | 
					
						
							|  |  |  | 	pathInfo: "output.pathinfo", | 
					
						
							| 
									
										
										
										
											2020-09-22 03:59:33 +08:00
										 |  |  | 	jsonpFunction: "output.chunkLoadingGlobal (BREAKING CHANGE since webpack 5)", | 
					
						
							|  |  |  | 	chunkCallbackName: | 
					
						
							|  |  |  | 		"output.chunkLoadingGlobal (BREAKING CHANGE since webpack 5)", | 
					
						
							|  |  |  | 	jsonpScriptType: "output.scriptType (BREAKING CHANGE since webpack 5)", | 
					
						
							|  |  |  | 	hotUpdateFunction: "output.hotUpdateGlobal (BREAKING CHANGE since webpack 5)", | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | 	splitChunks: "optimization.splitChunks", | 
					
						
							| 
									
										
										
										
											2020-08-26 06:36:16 +08:00
										 |  |  | 	immutablePaths: "snapshot.immutablePaths", | 
					
						
							|  |  |  | 	managedPaths: "snapshot.managedPaths", | 
					
						
							| 
									
										
										
										
											2020-09-22 03:59:33 +08:00
										 |  |  | 	maxModules: "stats.modulesSpace (BREAKING CHANGE since webpack 5)", | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | 	hashedModuleIds: | 
					
						
							|  |  |  | 		'optimization.moduleIds: "hashed" (BREAKING CHANGE since webpack 5)', | 
					
						
							|  |  |  | 	namedChunks: | 
					
						
							|  |  |  | 		'optimization.chunkIds: "named" (BREAKING CHANGE since webpack 5)', | 
					
						
							| 
									
										
										
										
											2020-09-22 03:59:33 +08:00
										 |  |  | 	namedModules: | 
					
						
							|  |  |  | 		'optimization.moduleIds: "named" (BREAKING CHANGE since webpack 5)', | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | 	occurrenceOrder: | 
					
						
							|  |  |  | 		'optimization.chunkIds: "size" and optimization.moduleIds: "size" (BREAKING CHANGE since webpack 5)', | 
					
						
							|  |  |  | 	automaticNamePrefix: | 
					
						
							| 
									
										
										
										
											2020-07-17 21:39:16 +08:00
										 |  |  | 		"optimization.splitChunks.[cacheGroups.*].idHint (BREAKING CHANGE since webpack 5)", | 
					
						
							|  |  |  | 	noEmitOnErrors: | 
					
						
							| 
									
										
										
										
											2020-09-22 03:59:33 +08:00
										 |  |  | 		"optimization.emitOnErrors (BREAKING CHANGE since webpack 5: logic is inverted to avoid negative flags)", | 
					
						
							|  |  |  | 	Buffer: | 
					
						
							|  |  |  | 		"to use the ProvidePlugin to process the Buffer variable to modules as polyfill\n" + | 
					
						
							|  |  |  | 		"BREAKING CHANGE: webpack 5 no longer provided Node.js polyfills by default.\n" + | 
					
						
							|  |  |  | 		"Note: if you are using 'node.Buffer: false', you can just remove that as this is the default behavior now.\n" + | 
					
						
							|  |  |  | 		"To provide a polyfill to modules use:\n" + | 
					
						
							|  |  |  | 		'new ProvidePlugin({ Buffer: ["buffer", "Buffer"] }) and npm install buffer.', | 
					
						
							|  |  |  | 	process: | 
					
						
							|  |  |  | 		"to use the ProvidePlugin to process the process variable to modules as polyfill\n" + | 
					
						
							|  |  |  | 		"BREAKING CHANGE: webpack 5 no longer provided Node.js polyfills by default.\n" + | 
					
						
							|  |  |  | 		"Note: if you are using 'node.process: false', you can just remove that as this is the default behavior now.\n" + | 
					
						
							|  |  |  | 		"To provide a polyfill to modules use:\n" + | 
					
						
							|  |  |  | 		'new ProvidePlugin({ process: "process" }) and npm install buffer.' | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const REMOVED = { | 
					
						
							|  |  |  | 	concord: | 
					
						
							| 
									
										
										
										
											2021-02-01 11:08:09 +08:00
										 |  |  | 		"BREAKING CHANGE: resolve.concord has been removed and is no longer available.", | 
					
						
							| 
									
										
										
										
											2020-09-22 03:59:33 +08:00
										 |  |  | 	devtoolLineToLine: | 
					
						
							| 
									
										
										
										
											2021-02-01 11:08:09 +08:00
										 |  |  | 		"BREAKING CHANGE: output.devtoolLineToLine has been removed and is no longer available." | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2020-03-13 00:51:26 +08:00
										 |  |  | /* cSpell:enable */ | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {Parameters<typeof validate>[0]} schema a json schema | 
					
						
							|  |  |  |  * @param {Parameters<typeof validate>[1]} options the options that should be validated | 
					
						
							|  |  |  |  * @param {Parameters<typeof validate>[2]=} validationConfiguration configuration for generating errors | 
					
						
							|  |  |  |  * @returns {void} | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const validateSchema = (schema, options, validationConfiguration) => { | 
					
						
							|  |  |  | 	validate( | 
					
						
							|  |  |  | 		schema, | 
					
						
							|  |  |  | 		options, | 
					
						
							|  |  |  | 		validationConfiguration || { | 
					
						
							|  |  |  | 			name: "Webpack", | 
					
						
							|  |  |  | 			postFormatter: (formattedError, error) => { | 
					
						
							|  |  |  | 				const children = error.children; | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | 				if ( | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | 					children && | 
					
						
							|  |  |  | 					children.some( | 
					
						
							|  |  |  | 						child => | 
					
						
							|  |  |  | 							child.keyword === "absolutePath" && | 
					
						
							|  |  |  | 							child.dataPath === ".output.filename" | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | 					) | 
					
						
							|  |  |  | 				) { | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | 					return `${formattedError}\nPlease use output.path to specify absolute path and output.filename for the file name.`; | 
					
						
							| 
									
										
										
										
											2019-08-08 18:44:45 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 03:59:33 +08:00
										 |  |  | 				if ( | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | 					children && | 
					
						
							|  |  |  | 					children.some( | 
					
						
							|  |  |  | 						child => | 
					
						
							|  |  |  | 							child.keyword === "pattern" && child.dataPath === ".devtool" | 
					
						
							| 
									
										
										
										
											2020-09-22 03:59:33 +08:00
										 |  |  | 					) | 
					
						
							|  |  |  | 				) { | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | 					return ( | 
					
						
							|  |  |  | 						`${formattedError}\n` + | 
					
						
							|  |  |  | 						"BREAKING CHANGE since webpack 5: The devtool option is more strict.\n" + | 
					
						
							|  |  |  | 						"Please strictly follow the order of the keywords in the pattern." | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2020-09-22 03:59:33 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | 				if (error.keyword === "additionalProperties") { | 
					
						
							| 
									
										
										
										
											2021-05-11 15:31:46 +08:00
										 |  |  | 					const params = | 
					
						
							|  |  |  | 						/** @type {import("ajv").AdditionalPropertiesParams} */ ( | 
					
						
							|  |  |  | 							error.params | 
					
						
							|  |  |  | 						); | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | 					if ( | 
					
						
							|  |  |  | 						Object.prototype.hasOwnProperty.call( | 
					
						
							|  |  |  | 							DID_YOU_MEAN, | 
					
						
							|  |  |  | 							params.additionalProperty | 
					
						
							|  |  |  | 						) | 
					
						
							|  |  |  | 					) { | 
					
						
							|  |  |  | 						return `${formattedError}\nDid you mean ${ | 
					
						
							| 
									
										
										
										
											2023-06-13 01:24:59 +08:00
										 |  |  | 							DID_YOU_MEAN[ | 
					
						
							|  |  |  | 								/** @type {keyof DID_YOU_MEAN} */ (params.additionalProperty) | 
					
						
							|  |  |  | 							] | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | 						}?`;
 | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | 					if ( | 
					
						
							|  |  |  | 						Object.prototype.hasOwnProperty.call( | 
					
						
							|  |  |  | 							REMOVED, | 
					
						
							|  |  |  | 							params.additionalProperty | 
					
						
							|  |  |  | 						) | 
					
						
							|  |  |  | 					) { | 
					
						
							| 
									
										
										
										
											2023-06-13 01:24:59 +08:00
										 |  |  | 						return `${formattedError}\n${ | 
					
						
							|  |  |  | 							REMOVED[/** @type {keyof REMOVED} */ (params.additionalProperty)] | 
					
						
							|  |  |  | 						}?`;
 | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if (!error.dataPath) { | 
					
						
							|  |  |  | 						if (params.additionalProperty === "debug") { | 
					
						
							|  |  |  | 							return ( | 
					
						
							|  |  |  | 								`${formattedError}\n` + | 
					
						
							|  |  |  | 								"The 'debug' property was removed in webpack 2.0.0.\n" + | 
					
						
							|  |  |  | 								"Loaders should be updated to allow passing this option via loader options in module.rules.\n" + | 
					
						
							|  |  |  | 								"Until loaders are updated one can use the LoaderOptionsPlugin to switch loaders into debug mode:\n" + | 
					
						
							|  |  |  | 								"plugins: [\n" + | 
					
						
							|  |  |  | 								"  new webpack.LoaderOptionsPlugin({\n" + | 
					
						
							|  |  |  | 								"    debug: true\n" + | 
					
						
							|  |  |  | 								"  })\n" + | 
					
						
							|  |  |  | 								"]" | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						if (params.additionalProperty) { | 
					
						
							|  |  |  | 							return ( | 
					
						
							|  |  |  | 								`${formattedError}\n` + | 
					
						
							|  |  |  | 								"For typos: please correct them.\n" + | 
					
						
							|  |  |  | 								"For loader options: webpack >= v2.0.0 no longer allows custom properties in configuration.\n" + | 
					
						
							|  |  |  | 								"  Loaders should be updated to allow passing options via loader options in module.rules.\n" + | 
					
						
							|  |  |  | 								"  Until loaders are updated one can use the LoaderOptionsPlugin to pass these options to the loader:\n" + | 
					
						
							|  |  |  | 								"  plugins: [\n" + | 
					
						
							|  |  |  | 								"    new webpack.LoaderOptionsPlugin({\n" + | 
					
						
							|  |  |  | 								"      // test: /\\.xxx$/, // may apply this only for some modules\n" + | 
					
						
							|  |  |  | 								"      options: {\n" + | 
					
						
							|  |  |  | 								`        ${params.additionalProperty}: …\n` + | 
					
						
							|  |  |  | 								"      }\n" + | 
					
						
							|  |  |  | 								"    })\n" + | 
					
						
							|  |  |  | 								"  ]" | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2020-02-18 03:39:40 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2019-08-08 18:44:45 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | 				return formattedError; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-08-08 18:44:45 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-12-17 17:41:28 +08:00
										 |  |  | 	); | 
					
						
							| 
									
										
										
										
											2019-08-08 18:44:45 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | module.exports = validateSchema; |