6f01152a98531d684e1c040a6a3fd468fdbe442cc7cdb574937622154cfcf0aa869e808c94ef268cb86557e83ffdb90b4204262a36e576e7c5188db203b489 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. 'use strict';
  2. const concat = require('../utils').concat;
  3. function isRelative (module) {
  4. return module.startsWith('./') || module.startsWith('../');
  5. }
  6. function formatFileList (files) {
  7. const length = files.length;
  8. if (!length) return '';
  9. return ` in ${files[0]}${files[1] ? `, ${files[1]}` : ''}${length > 2 ? ` and ${length - 2} other${length === 3 ? '' : 's'}` : ''}`;
  10. }
  11. function formatGroup (group) {
  12. const files = group.errors.map(e => e.file).filter(Boolean);
  13. return `* ${group.module}${formatFileList(files)}`;
  14. }
  15. function forgetToInstall (missingDependencies) {
  16. const moduleNames = missingDependencies.map(missingDependency => missingDependency.module);
  17. if (missingDependencies.length === 1) {
  18. return `To install it, you can run: npm install --save ${moduleNames.join(' ')}`;
  19. }
  20. return `To install them, you can run: npm install --save ${moduleNames.join(' ')}`;
  21. }
  22. function dependenciesNotFound (dependencies) {
  23. if (dependencies.length === 0) return;
  24. return concat(
  25. dependencies.length === 1 ? 'This dependency was not found:' : 'These dependencies were not found:',
  26. '',
  27. dependencies.map(formatGroup),
  28. '',
  29. forgetToInstall(dependencies)
  30. );
  31. }
  32. function relativeModulesNotFound (modules) {
  33. if (modules.length === 0) return;
  34. return concat(
  35. modules.length === 1 ? 'This relative module was not found:' : 'These relative modules were not found:',
  36. '',
  37. modules.map(formatGroup)
  38. );
  39. }
  40. function groupModules (errors) {
  41. const missingModule = new Map();
  42. errors.forEach((error) => {
  43. if (!missingModule.has(error.module)) {
  44. missingModule.set(error.module, [])
  45. }
  46. missingModule.get(error.module).push(error);
  47. });
  48. return Array.from(missingModule.keys()).map(module => ({
  49. module: module,
  50. relative: isRelative(module),
  51. errors: missingModule.get(module),
  52. }));
  53. }
  54. function formatErrors (errors) {
  55. if (errors.length === 0) {
  56. return [];
  57. }
  58. const groups = groupModules(errors);
  59. const dependencies = groups.filter(group => !group.relative);
  60. const relativeModules = groups.filter(group => group.relative);
  61. return concat(
  62. dependenciesNotFound(dependencies),
  63. dependencies.length && relativeModules.length ? ['', ''] : null,
  64. relativeModulesNotFound(relativeModules)
  65. );
  66. }
  67. function format (errors) {
  68. return formatErrors(errors.filter((e) => (
  69. e.type === 'module-not-found'
  70. )));
  71. }
  72. module.exports = format;