@roots/bud-dashboard
Version:
bud.js core module
68 lines (67 loc) • 2.71 kB
JavaScript
import cleanStack from '@roots/bud-support/clean-stack';
import isString from '@roots/bud-support/isString';
export const makeErrorFormatter = (bud) => (errors) => errors
?.filter(filterInternalErrors)
.map(makePrettifier(bud))
.map(error => {
const unhandledModule = `You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders`;
if (error.message.includes(unhandledModule)) {
error.message = error.message.replace(unhandledModule, ``);
const isUnhandledVueModule = error.moduleName?.match(bud.hooks.filter(`pattern.vue`)) &&
!bud.extensions.has(`@roots/bud-vue`);
if (isUnhandledVueModule) {
error.message = [
error.message,
`You need to install @roots/bud-vue to compile this module.`,
].join(`\n\n`);
}
const isUnhandledSassModule = error.moduleName?.match(bud.hooks.filter(`pattern.sass`)) &&
!bud.extensions.has(`@roots/bud-sass`);
if (isUnhandledSassModule) {
error.message = [
error.message,
`You need to install @roots/bud-sass to compile this module.`,
].join(`\n\n`);
}
const isUnhandledTsModule = error.moduleName?.match(bud.hooks.filter(`pattern.ts`)) &&
!bud.extensions.has(`@roots/bud-typescript`) &&
!bud.extensions.has(`@roots/bud-esbuild`) &&
!bud.extensions.has(`@roots/bud-swc`);
if (isUnhandledTsModule) {
error.message = [
error.message,
`You need to install a TypeScript compatible extension to compile this module.`,
].join(`\n\n`);
}
}
return error;
});
/**
* Filter internal errors
*/
const filterInternalErrors = (error) => error.message && !error.message?.includes(`HookWebpackError`);
/**
* Prettify errors
*/
const makePrettifier = (bud) => (error) => {
let message = error.message ?? error.details;
if (!message || !isString(message))
return error;
const segments = message
.replace(`Module parse failed:`, ``)
.replace(/Module build failed \(.*\):?/, ``)
.replace(/ at .*?\/(webpack|tapable)\/?.*/gm, ``)
.trim()
.split(/\s?.*?Error:\s/);
const lastSegment = segments.pop();
if (!lastSegment)
return error;
const beforeStack = lastSegment.split(` at`).shift();
if (!beforeStack)
return error;
error.message = cleanStack(error.message.trim(), {
basePath: process.cwd(),
pretty: true,
});
return error;
};