CaseSensitiveModulesWarning.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const WebpackError = require("./WebpackError");
  7. module.exports = class CaseSensitiveModulesWarning extends WebpackError {
  8. constructor(modules) {
  9. super();
  10. this.name = "CaseSensitiveModulesWarning";
  11. const sortedModules = this._sort(modules);
  12. const modulesList = this._moduleMessages(sortedModules);
  13. this.message = "There are multiple modules with names that only differ in casing.\n" +
  14. "This can lead to unexpected behavior when compiling on a filesystem with other case-semantic.\n" +
  15. `Use equal casing. Compare these module identifiers:\n${modulesList}`;
  16. this.origin = this.module = sortedModules[0];
  17. Error.captureStackTrace(this, this.constructor);
  18. }
  19. _sort(modules) {
  20. return modules.slice().sort((a, b) => {
  21. a = a.identifier();
  22. b = b.identifier();
  23. /* istanbul ignore next */
  24. if(a < b) return -1;
  25. /* istanbul ignore next */
  26. if(a > b) return 1;
  27. /* istanbul ignore next */
  28. return 0;
  29. });
  30. }
  31. _moduleMessages(modules) {
  32. return modules.map((m) => {
  33. let message = `* ${m.identifier()}`;
  34. const validReasons = m.reasons.filter((reason) => reason.module);
  35. if(validReasons.length > 0) {
  36. message += `\n Used by ${validReasons.length} module(s), i. e.`;
  37. message += `\n ${validReasons[0].module.identifier()}`;
  38. }
  39. return message;
  40. }).join("\n");
  41. }
  42. };