
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
const { validate } = require("schema-utils");
/* cSpell:disable */
const DID_YOU_MEAN = {
rules: "module.rules",
loaders: "module.rules or module.rules.*.use",
query: "module.rules.*.options (BREAKING CHANGE since webpack 5)",
noParse: "module.noParse",
filename: "output.filename or module.rules.*.generator.filename",
file: "output.filename",
chunkFilename: "output.chunkFilename",
chunkfilename: "output.chunkFilename",
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)",
ecma: "output.environment (output.ecmaVersion was a temporary configuration option during webpack 5 beta)",
path: "output.path",
pathinfo: "output.pathinfo",
pathInfo: "output.pathinfo",
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)",
splitChunks: "optimization.splitChunks",
immutablePaths: "snapshot.immutablePaths",
managedPaths: "snapshot.managedPaths",
maxModules: "stats.modulesSpace (BREAKING CHANGE since webpack 5)",
hashedModuleIds:
'optimization.moduleIds: "hashed" (BREAKING CHANGE since webpack 5)',
namedChunks:
'optimization.chunkIds: "named" (BREAKING CHANGE since webpack 5)',
namedModules:
'optimization.moduleIds: "named" (BREAKING CHANGE since webpack 5)',
occurrenceOrder:
'optimization.chunkIds: "size" and optimization.moduleIds: "size" (BREAKING CHANGE since webpack 5)',
automaticNamePrefix:
"optimization.splitChunks.[cacheGroups.*].idHint (BREAKING CHANGE since webpack 5)",
noEmitOnErrors:
"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:
"BREAKING CHANGE: resolve.concord has been removed and is no longer available.",
devtoolLineToLine:
"BREAKING CHANGE: output.devtoolLineToLine has been removed and is no longer available."
};
/* cSpell:enable */
/**
* @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;
if (
children &&
children.some(
child =>
child.keyword === "absolutePath" &&
child.dataPath === ".output.filename"
)
) {
return `${formattedError}\nPlease use output.path to specify absolute path and output.filename for the file name.`;
}
if (
children &&
children.some(
child =>
child.keyword === "pattern" && child.dataPath === ".devtool"
)
) {
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."
);
}
if (error.keyword === "additionalProperties") {
const params =
/** @type {import("ajv").AdditionalPropertiesParams} */ (
error.params
);
if (
Object.prototype.hasOwnProperty.call(
DID_YOU_MEAN,
params.additionalProperty
)
) {
return `${formattedError}\nDid you mean ${
DID_YOU_MEAN[params.additionalProperty]
}?`;
}
if (
Object.prototype.hasOwnProperty.call(
REMOVED,
params.additionalProperty
)
) {
return `${formattedError}\n${REMOVED[params.additionalProperty]}?`;
}
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" +
" ]"
);
}
}
}
return formattedError;
}
}
);
};
module.exports = validateSchema;
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176/*MIT License http://www.opensource.org/licenses/mit-license.phpAuthor Tobias Koppers @sokra*/"use strict";const { validate } = require("schema-utils");/* cSpell:disable */const DID_YOU_MEAN = {rules: "module.rules",loaders: "module.rules or module.rules.*.use",query: "module.rules.*.options (BREAKING CHANGE since webpack 5)",noParse: "module.noParse",filename: "output.filename or module.rules.*.generator.filename",file: "output.filename",chunkFilename: "output.chunkFilename",chunkfilename: "output.chunkFilename",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)",ecma: "output.environment (output.ecmaVersion was a temporary configuration option during webpack 5 beta)",path: "output.path",pathinfo: "output.pathinfo",pathInfo: "output.pathinfo",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)",splitChunks: "optimization.splitChunks",immutablePaths: "snapshot.immutablePaths",managedPaths: "snapshot.managedPaths",maxModules: "stats.modulesSpace (BREAKING CHANGE since webpack 5)",hashedModuleIds:'optimization.moduleIds: "hashed" (BREAKING CHANGE since webpack 5)',namedChunks:'optimization.chunkIds: "named" (BREAKING CHANGE since webpack 5)',namedModules:'optimization.moduleIds: "named" (BREAKING CHANGE since webpack 5)',occurrenceOrder:'optimization.chunkIds: "size" and optimization.moduleIds: "size" (BREAKING CHANGE since webpack 5)',automaticNamePrefix:"optimization.splitChunks.[cacheGroups.*].idHint (BREAKING CHANGE since webpack 5)",noEmitOnErrors:"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:"BREAKING CHANGE: resolve.concord has been removed and is no longer available.",devtoolLineToLine:"BREAKING CHANGE: output.devtoolLineToLine has been removed and is no longer available."};/* cSpell:enable *//*** @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;if (children &&children.some(child =>child.keyword === "absolutePath" &&child.dataPath === ".output.filename")) {return `${formattedError}\nPlease use output.path to specify absolute path and output.filename for the file name.`;}if (children &&children.some(child =>child.keyword === "pattern" && child.dataPath === ".devtool")) {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.");}if (error.keyword === "additionalProperties") {const params =/** @type {import("ajv").AdditionalPropertiesParams} */ (error.params);if (Object.prototype.hasOwnProperty.call(DID_YOU_MEAN,params.additionalProperty)) {return `${formattedError}\nDid you mean ${DID_YOU_MEAN[params.additionalProperty]}?`;}if (Object.prototype.hasOwnProperty.call(REMOVED,params.additionalProperty)) {return `${formattedError}\n${REMOVED[params.additionalProperty]}?`;}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" +" ]");}}}return formattedError;}});};module.exports = validateSchema;