function resolveFile()

in packages/metro-resolver/src/resolve.js [309:347]


function resolveFile(
  context: FileContext,
  dirPath: string,
  fileName: string,
  platform: string | null,
): Result<Resolution, FileCandidates> {
  const {isAssetFile, resolveAsset} = context;
  if (isAssetFile(fileName)) {
    const extension = path.extname(fileName);
    const basename = path.basename(fileName, extension);
    if (!/@\d+(?:\.\d+)?x$/.test(basename)) {
      try {
        const assets = resolveAsset(dirPath, basename, extension);
        if (assets != null) {
          return mapResult(resolvedAs(assets), filePaths => ({
            type: 'assetFiles',
            filePaths,
          }));
        }
      } catch (err) {
        if (err.code === 'ENOENT') {
          return failedFor({type: 'asset', name: fileName});
        }
      }
    }
    return failedFor({type: 'asset', name: fileName});
  }
  const candidateExts = [];
  const filePathPrefix = path.join(dirPath, fileName);
  const sfContext = {...context, candidateExts, filePathPrefix};
  const sourceFileResolution = resolveSourceFile(sfContext, platform);
  if (sourceFileResolution != null) {
    if (typeof sourceFileResolution === 'string') {
      return resolvedAs({type: 'sourceFile', filePath: sourceFileResolution});
    }
    return resolvedAs(sourceFileResolution);
  }
  return failedFor({type: 'sourceFile', filePathPrefix, candidateExts});
}