const { getDefaultConfig } = require("expo/metro-config"); const { resolve } = require("metro-resolver"); const fs = require("fs"); const path = require("path"); const projectRoot = __dirname; const serverSrcRoot = path.resolve(projectRoot, "../server/src"); const relaySrcRoot = path.resolve(projectRoot, "../relay/src"); const customWebPlatform = (process.env.PASEO_WEB_PLATFORM ?? "") .trim() .replace(/^\./, "") .toLowerCase(); const config = getDefaultConfig(projectRoot); const defaultResolveRequest = config.resolver.resolveRequest ?? resolve; config.transformer.asyncRequireModulePath = require.resolve( "@expo/metro-config/build/async-require" ); function isLocalModuleImport(moduleName) { return ( moduleName.startsWith("./") || moduleName.startsWith("../") || moduleName.startsWith("@/") || path.isAbsolute(moduleName) ); } function resolveWithCustomWebOverlay(context, moduleName, platform) { const shouldResolveCustomWebVariant = platform === "web" && customWebPlatform.length > 0 && customWebPlatform !== "web" && isLocalModuleImport(moduleName); if (shouldResolveCustomWebVariant) { const overlayContext = { ...context, // Resolve only "." variants in overlay mode. sourceExts: context.sourceExts.map((ext) => `${customWebPlatform}.${ext}`), preferNativePlatform: false, }; try { return defaultResolveRequest(overlayContext, moduleName, null); } catch { // Ignore overlay misses and continue with normal web resolution. } } return defaultResolveRequest(context, moduleName, platform); } config.resolver.resolveRequest = (context, moduleName, platform) => { const origin = context.originModulePath; if ( origin && (origin.startsWith(serverSrcRoot) || origin.startsWith(relaySrcRoot)) && moduleName.endsWith(".js") ) { const tsModuleName = moduleName.replace(/\.js$/, ".ts"); const candidatePath = path.resolve(path.dirname(origin), tsModuleName); if (fs.existsSync(candidatePath)) { return resolveWithCustomWebOverlay(context, tsModuleName, platform); } } return resolveWithCustomWebOverlay(context, moduleName, platform); }; module.exports = config;