'use strict'; const concat = require('../utils').concat; function isRelative (module) { return module.startsWith('./') || module.startsWith('../'); } function formatFileList (files) { const length = files.length; if (!length) return ''; return ` in ${files[0]}${files[1] ? `, ${files[1]}` : ''}${length > 2 ? ` and ${length - 2} other${length === 3 ? '' : 's'}` : ''}`; } function formatGroup (group) { const files = group.errors.map(e => e.file).filter(Boolean); return `* ${group.module}${formatFileList(files)}`; } function forgetToInstall (missingDependencies) { const moduleNames = missingDependencies.map(missingDependency => missingDependency.module); if (missingDependencies.length === 1) { return `To install it, you can run: npm install --save ${moduleNames.join(' ')}`; } return `To install them, you can run: npm install --save ${moduleNames.join(' ')}`; } function dependenciesNotFound (dependencies) { if (dependencies.length === 0) return; return concat( dependencies.length === 1 ? 'This dependency was not found:' : 'These dependencies were not found:', '', dependencies.map(formatGroup), '', forgetToInstall(dependencies) ); } function relativeModulesNotFound (modules) { if (modules.length === 0) return; return concat( modules.length === 1 ? 'This relative module was not found:' : 'These relative modules were not found:', '', modules.map(formatGroup) ); } function groupModules (errors) { const missingModule = new Map(); errors.forEach((error) => { if (!missingModule.has(error.module)) { missingModule.set(error.module, []) } missingModule.get(error.module).push(error); }); return Array.from(missingModule.keys()).map(module => ({ module: module, relative: isRelative(module), errors: missingModule.get(module), })); } function formatErrors (errors) { if (errors.length === 0) { return []; } const groups = groupModules(errors); const dependencies = groups.filter(group => !group.relative); const relativeModules = groups.filter(group => group.relative); return concat( dependenciesNotFound(dependencies), dependencies.length && relativeModules.length ? ['', ''] : null, relativeModulesNotFound(relativeModules) ); } function format (errors) { return formatErrors(errors.filter((e) => ( e.type === 'module-not-found' ))); } module.exports = format;