/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
* @flow
*/
'use strict';
const GraphNotFoundError = require('../IncrementalBundler/GraphNotFoundError');
const ResourceNotFoundError = require('../IncrementalBundler/ResourceNotFoundError');
const RevisionNotFoundError = require('../IncrementalBundler/RevisionNotFoundError');
const serializeError = require('serialize-error');
const {
UnableToResolveError,
} = require('../node-haste/DependencyGraph/ModuleResolution');
const {AmbiguousModuleResolutionError} = require('metro-core');
import type {FormattedError} from './bundle-modules/types.flow';
export type CustomError = Error & {
type?: string,
filename?: string,
lineNumber?: number,
errors?: Array<{
description: string,
filename: string,
lineNumber: number,
}>,
};
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 {
return {
type: 'InternalError',
errors: [],
message:
'Metro Bundler has encountered an internal error, ' +
'please check your terminal error output for more details',
};
}
}
module.exports = formatBundlingError;