Spaces:
Sleeping
Sleeping
; | |
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; | |