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});
}