/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow strict-local * @format * @oncall react_native */ import type {DuplicatesSet} from '../flow-types'; import H from '../constants'; export class DuplicateHasteCandidatesError extends Error { hasteName: string; platform: string | null; supportsNativePlatform: boolean; duplicatesSet: DuplicatesSet; constructor( name: string, platform: string, supportsNativePlatform: boolean, duplicatesSet: DuplicatesSet, ) { const platformMessage = getPlatformMessage(platform); super( `The name \`${name}\` was looked up in the Haste module map. It ` + 'cannot be resolved, because there exists several different ' + 'files, or packages, that provide a module for ' + `that particular name and platform. ${platformMessage} You must ` + 'delete or exclude files until there remains only one of these:\n\n' + Array.from(duplicatesSet) .map( ([dupFilePath, dupFileType]) => ` * \`${dupFilePath}\` (${getTypeMessage(dupFileType)})\n`, ) .sort() .join(''), ); this.hasteName = name; this.platform = platform; this.supportsNativePlatform = supportsNativePlatform; this.duplicatesSet = duplicatesSet; } } function getPlatformMessage(platform: string) { if (platform === H.GENERIC_PLATFORM) { return 'The platform is generic (no extension).'; } return `The platform extension is \`${platform}\`.`; } function getTypeMessage(type: number) { switch (type) { case H.MODULE: return 'module'; case H.PACKAGE: return 'package'; } return 'unknown'; }