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