in packages/metro/src/lib/formatBundlingError.js [40:116]
function formatBundlingError(error: CustomError): FormattedError {
if (error instanceof AmbiguousModuleResolutionError) {
const he = error.hasteError;
const message =
"Ambiguous resolution: module '" +
`${error.fromModulePath}\' tries to require \'${he.hasteName}\', but ` +
'there are several files providing this module. You can delete or ' +
'fix them: \n\n' +
Object.keys(he.duplicatesSet)
.sort()
.map(dupFilePath => `${dupFilePath}`)
.join('\n\n');
return {
type: 'AmbiguousModuleResolutionError',
message,
errors: [{description: message}],
};
}
if (
error instanceof UnableToResolveError ||
(error instanceof Error &&
(error.type === 'TransformError' || error.type === 'NotFoundError'))
) {
error.errors = [
{
description: error.message,
filename: error.filename,
lineNumber: error.lineNumber,
},
];
return serializeError(error);
} else if (error instanceof ResourceNotFoundError) {
return {
type: 'ResourceNotFoundError',
errors: [],
message: error.message,
};
} else if (error instanceof GraphNotFoundError) {
return {
type: 'GraphNotFoundError',
errors: [],
message: error.message,
};
} else if (error instanceof RevisionNotFoundError) {
return {
type: 'RevisionNotFoundError',
errors: [],
message: error.message,
};
} else {
const stack = ErrorStackParser.parse(error);
const fileName = stack[0].fileName;
const column = stack[0].columnNumber;
const line = stack[0].lineNumber;
let codeFrame = '';
try {
codeFrame = codeFrameColumns(
// If the error was thrown in a node.js builtin module, this call will fail and mask the real error.
fs.readFileSync(fileName, 'utf8'),
{
start: {column, line},
},
{forceColor: true},
);
} catch {}
return {
type: 'InternalError',
errors: [],
message: `Metro has encountered an error: ${error.message}: ${fileName} (${line}:${column})\n\n${codeFrame}`,
};
}
}