1// Used to cast a type to metro errors without depending on specific versions of metro. 2 3export type FileAndDirCandidates = { 4 dir: FileCandidates; 5 file: FileCandidates; 6}; 7 8/** 9 * This is a way to describe what files we tried to look for when resolving 10 * a module name as file. This is mainly used for error reporting, so that 11 * we can explain why we cannot resolve a module. 12 */ 13export type FileCandidates = 14 // We only tried to resolve a specific asset. 15 | { type: 'asset'; name: string } 16 // We attempted to resolve a name as being a source file (ex. JavaScript, 17 // JSON...), in which case there can be several extensions we tried, for 18 // example `/js/foo.ios.js`, `/js/foo.js`, etc. for a single prefix '/js/foo'. 19 | { 20 type: 'sourceFile'; 21 filePathPrefix: string; 22 candidateExts: readonly string[]; 23 }; 24 25type FailedToResolveNameError = Error & { 26 dirPaths: string[]; 27 extraPaths: string[]; 28}; 29 30type FailedToResolvePathError = Error & { 31 candidates: FileAndDirCandidates; 32}; 33 34export function isFailedToResolveNameError(error: any): error is FailedToResolveNameError { 35 return !!error && 'extraPaths' in error && error.constructor.name === 'FailedToResolveNameError'; 36} 37 38export function isFailedToResolvePathError(error: any): error is FailedToResolvePathError { 39 return !!error && 'candidates' in error && error.constructor.name === 'FailedToResolvePathError'; 40} 41