'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
|