You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.1 KiB
71 lines
2.1 KiB
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Tobias Koppers @sokra |
|
*/ |
|
|
|
"use strict"; |
|
|
|
const WebpackError = require("./WebpackError"); |
|
|
|
/** @typedef {import("./Module")} Module */ |
|
/** @typedef {import("./ModuleGraph")} ModuleGraph */ |
|
|
|
/** |
|
* @param {Module[]} modules the modules to be sorted |
|
* @returns {Module[]} sorted version of original modules |
|
*/ |
|
const sortModules = modules => { |
|
return modules.sort((a, b) => { |
|
const aIdent = a.identifier(); |
|
const bIdent = b.identifier(); |
|
/* istanbul ignore next */ |
|
if (aIdent < bIdent) return -1; |
|
/* istanbul ignore next */ |
|
if (aIdent > bIdent) return 1; |
|
/* istanbul ignore next */ |
|
return 0; |
|
}); |
|
}; |
|
|
|
/** |
|
* @param {Module[]} modules each module from throw |
|
* @param {ModuleGraph} moduleGraph the module graph |
|
* @returns {string} each message from provided modules |
|
*/ |
|
const createModulesListMessage = (modules, moduleGraph) => { |
|
return modules |
|
.map(m => { |
|
let message = `* ${m.identifier()}`; |
|
const validReasons = Array.from( |
|
moduleGraph.getIncomingConnectionsByOriginModule(m).keys() |
|
).filter(x => x); |
|
|
|
if (validReasons.length > 0) { |
|
message += `\n Used by ${validReasons.length} module(s), i. e.`; |
|
message += `\n ${validReasons[0].identifier()}`; |
|
} |
|
return message; |
|
}) |
|
.join("\n"); |
|
}; |
|
|
|
class CaseSensitiveModulesWarning extends WebpackError { |
|
/** |
|
* Creates an instance of CaseSensitiveModulesWarning. |
|
* @param {Iterable<Module>} modules modules that were detected |
|
* @param {ModuleGraph} moduleGraph the module graph |
|
*/ |
|
constructor(modules, moduleGraph) { |
|
const sortedModules = sortModules(Array.from(modules)); |
|
const modulesList = createModulesListMessage(sortedModules, moduleGraph); |
|
super(`There are multiple modules with names that only differ in casing. |
|
This can lead to unexpected behavior when compiling on a filesystem with other case-semantic. |
|
Use equal casing. Compare these module identifiers: |
|
${modulesList}`); |
|
|
|
this.name = "CaseSensitiveModulesWarning"; |
|
this.module = sortedModules[0]; |
|
} |
|
} |
|
|
|
module.exports = CaseSensitiveModulesWarning;
|
|
|