@nuxt/friendly-errors-webpack-plugin
Version:
Recognizes certain classes of webpack errors and cleans, aggregates and prioritizes them to provide a better Developer Experience
92 lines (72 loc) • 2.41 kB
JavaScript
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