const path = require("node:path"); const { getDefaultConfig } = require("expo/metro-config"); const projectRoot = __dirname; const workspaceRoot = path.resolve(projectRoot, "../.."); const config = getDefaultConfig(projectRoot); config.watchFolders = [...(config.watchFolders ?? []), workspaceRoot]; config.resolver.nodeModulesPaths = [ path.resolve(projectRoot, "node_modules"), path.resolve(workspaceRoot, "node_modules"), ]; // `decode-uri-component@0.2.2` (pulled in by @react-navigation/core → query-string) // ships without a `main` field. Metro's resolver doesn't fall back to `index.js` // for this case and fails bundling — redirect it explicitly. const decodeUriComponentEntry = require.resolve("decode-uri-component/index.js", { paths: [ path.resolve(projectRoot, "node_modules"), path.resolve(workspaceRoot, "node_modules"), ], }); const defaultResolveRequest = config.resolver.resolveRequest; config.resolver.resolveRequest = (context, moduleName, platform) => { if (moduleName === "decode-uri-component") { return { type: "sourceFile", filePath: decodeUriComponentEntry }; } if (defaultResolveRequest) { return defaultResolveRequest(context, moduleName, platform); } return context.resolveRequest(context, moduleName, platform); }; module.exports = config;