@expo/cli 0.24.13 → 0.24.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bin/cli +1 -1
- package/build/metro-require/require.js +6 -4
- package/build/src/export/exportHermes.js +2 -2
- package/build/src/export/exportHermes.js.map +1 -1
- package/build/src/prebuild/resolveTemplate.js +4 -4
- package/build/src/prebuild/resolveTemplate.js.map +1 -1
- package/build/src/run/ios/XcodeBuild.js +3 -3
- package/build/src/run/ios/XcodeBuild.js.map +1 -1
- package/build/src/start/doctor/SecurityBinPrerequisite.js +1 -1
- package/build/src/start/doctor/SecurityBinPrerequisite.js.map +1 -1
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +1 -1
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
- package/build/src/start/doctor/dependencies/resolvePackages.js +1 -1
- package/build/src/start/doctor/dependencies/resolvePackages.js.map +1 -1
- package/build/src/start/doctor/ngrok/ExternalModule.js +1 -1
- package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
- package/build/src/start/platforms/PlatformManager.js +1 -1
- package/build/src/start/platforms/PlatformManager.js.map +1 -1
- package/build/src/start/platforms/android/AndroidPlatformManager.js +1 -1
- package/build/src/start/platforms/android/AndroidPlatformManager.js.map +1 -1
- package/build/src/start/platforms/android/getDevices.js +1 -1
- package/build/src/start/platforms/android/getDevices.js.map +1 -1
- package/build/src/start/platforms/ios/AppleDeviceManager.js +1 -1
- package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
- package/build/src/start/platforms/ios/xcrun.js +1 -1
- package/build/src/start/platforms/ios/xcrun.js.map +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/createJResolver.js +2 -2
- package/build/src/start/server/metro/createJResolver.js.map +1 -1
- package/build/src/start/server/metro/createServerComponentsMiddleware.js +0 -1
- package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
- package/build/src/start/server/metro/runServer-fork.js +1 -1
- package/build/src/start/server/metro/runServer-fork.js.map +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/middleware/CorsMiddleware.js +1 -1
- package/build/src/start/server/middleware/CorsMiddleware.js.map +1 -1
- package/build/src/utils/modifyConfigAsync.js +1 -1
- package/build/src/utils/modifyConfigAsync.js.map +1 -1
- package/build/src/utils/scheme.js +1 -1
- package/build/src/utils/scheme.js.map +1 -1
- package/build/src/utils/telemetry/clients/FetchClient.js +1 -1
- package/build/src/utils/telemetry/utils/context.js +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/createServerComponentsMiddleware.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { getMetroServerRoot } from '@expo/config/paths';\nimport { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport { getRscMiddleware } from '@expo/server/build/middleware/rsc';\nimport assert from 'assert';\nimport { EntriesDev } from 'expo-router/build/rsc/server';\nimport path from 'path';\nimport url from 'url';\n\nimport { IS_METRO_BUNDLE_ERROR_SYMBOL, logMetroError } from './metroErrorInterface';\nimport { isPossiblyUnableToResolveError } from '../../../export/embed/xcodeCompilerLogger';\nimport { ExportAssetMap } from '../../../export/saveAssets';\nimport { stripAnsi } from '../../../utils/ansi';\nimport { toPosixPath } from '../../../utils/filePath';\nimport { memoize } from '../../../utils/fn';\nimport { getIpAddress } from '../../../utils/ip';\nimport { streamToStringAsync } from '../../../utils/stream';\nimport { createBuiltinAPIRequestHandler } from '../middleware/createBuiltinAPIRequestHandler';\nimport {\n createBundleUrlSearchParams,\n ExpoMetroOptions,\n getMetroOptionsFromUrl,\n} from '../middleware/metroOptions';\n\nconst debug = require('debug')('expo:rsc') as typeof console.log;\n\ntype SSRLoadModuleArtifactsFunc = (\n filePath: string,\n specificOptions?: Partial<ExpoMetroOptions>\n) => Promise<{ artifacts: SerialAsset[]; src: string }>;\n\ntype SSRLoadModuleFunc = <T extends Record<string, any>>(\n filePath: string,\n specificOptions?: Partial<ExpoMetroOptions>,\n extras?: { hot?: boolean }\n) => Promise<T>;\n\nconst getMetroServerRootMemo = memoize(getMetroServerRoot);\n\nexport function createServerComponentsMiddleware(\n projectRoot: string,\n {\n rscPath,\n instanceMetroOptions,\n ssrLoadModule,\n ssrLoadModuleArtifacts,\n useClientRouter,\n createModuleId,\n routerOptions,\n }: {\n rscPath: string;\n instanceMetroOptions: Partial<ExpoMetroOptions>;\n ssrLoadModule: SSRLoadModuleFunc;\n ssrLoadModuleArtifacts: SSRLoadModuleArtifactsFunc;\n useClientRouter: boolean;\n createModuleId: (\n filePath: string,\n context: { platform: string; environment: string }\n ) => string | number;\n routerOptions: Record<string, any>;\n }\n) {\n const routerModule = useClientRouter\n ? 'expo-router/build/rsc/router/noopRouter'\n : 'expo-router/build/rsc/router/expo-definedRouter';\n\n const rscMiddleware = getRscMiddleware({\n config: {},\n // Disabled in development\n baseUrl: '',\n rscPath,\n onError: console.error,\n renderRsc: async (args) => {\n // In development we should add simulated versions of common production headers.\n if (args.headers['x-real-ip'] == null) {\n args.headers['x-real-ip'] = getIpAddress();\n }\n if (args.headers['x-forwarded-for'] == null) {\n args.headers['x-forwarded-for'] = args.headers['x-real-ip'];\n }\n if (args.headers['x-forwarded-proto'] == null) {\n args.headers['x-forwarded-proto'] = 'http';\n }\n\n // Dev server-only implementation.\n try {\n return await renderRscToReadableStream({\n ...args,\n headers: new Headers(args.headers),\n body: args.body!,\n routerOptions,\n });\n } catch (error: any) {\n // If you get a codeFrame error during SSR like when using a Class component in React Server Components, then this\n // will throw with:\n // {\n // rawObject: {\n // type: 'TransformError',\n // lineNumber: 0,\n // errors: [ [Object] ],\n // name: 'SyntaxError',\n // message: '...',\n // }\n // }\n\n // TODO: Revisit all error handling now that we do direct metro bundling...\n await logMetroError(projectRoot, { error });\n\n if (error[IS_METRO_BUNDLE_ERROR_SYMBOL]) {\n throw new Response(JSON.stringify(error), {\n status: isPossiblyUnableToResolveError(error) ? 404 : 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n }\n\n const sanitizedServerMessage = stripAnsi(error.message) ?? error.message;\n throw new Response(sanitizedServerMessage, {\n status: 500,\n headers: {\n 'Content-Type': 'text/plain',\n },\n });\n }\n },\n });\n\n let rscPathPrefix = rscPath;\n if (rscPathPrefix !== '/') {\n rscPathPrefix += '/';\n }\n\n async function exportServerActionsAsync(\n {\n platform,\n entryPoints,\n domRoot,\n }: { platform: string; entryPoints: string[]; domRoot?: string },\n files: ExportAssetMap\n ): Promise<{\n clientBoundaries: string[];\n manifest: Record<string, [string, string]>;\n }> {\n const uniqueEntryPoints = [...new Set(entryPoints)];\n // TODO: Support multiple entry points in a single split server bundle...\n const manifest: Record<string, [string, string]> = {};\n const nestedClientBoundaries: string[] = [];\n const nestedServerBoundaries: string[] = [];\n const processedEntryPoints = new Set<string>();\n async function processEntryPoint(entryPoint: string) {\n processedEntryPoints.add(entryPoint);\n\n const contents = await ssrLoadModuleArtifacts(entryPoint, {\n environment: 'react-server',\n platform,\n // Ignore the metro runtime to avoid overwriting the original in the API route.\n modulesOnly: true,\n // Required\n runModule: true,\n // Required to ensure assets load as client boundaries.\n domRoot,\n });\n\n const reactClientReferences = contents.artifacts\n .filter((a) => a.type === 'js')[0]\n .metadata.reactClientReferences?.map((ref) => fileURLToFilePath(ref));\n\n if (reactClientReferences) {\n nestedClientBoundaries.push(...reactClientReferences!);\n }\n const reactServerReferences = contents.artifacts\n .filter((a) => a.type === 'js')[0]\n .metadata.reactServerReferences?.map((ref) => fileURLToFilePath(ref));\n\n if (reactServerReferences) {\n nestedServerBoundaries.push(...reactServerReferences!);\n }\n\n // Naive check to ensure the module runtime is not included in the server action bundle.\n if (contents.src.includes('The experimental Metro feature')) {\n throw new Error(\n 'Internal error: module runtime should not be included in server action bundles: ' +\n entryPoint\n );\n }\n\n const relativeName = createModuleId(entryPoint, {\n platform,\n environment: 'react-server',\n });\n const safeName = path.basename(contents.artifacts.find((a) => a.type === 'js')!.filename!);\n\n const outputName = `_expo/rsc/${platform}/${safeName}`;\n // While we're here, export the router for the server to dynamically render RSC.\n files.set(outputName, {\n targetDomain: 'server',\n contents: wrapBundle(contents.src),\n });\n\n // Match babel plugin.\n const publicModuleId = './' + toPosixPath(path.relative(projectRoot, entryPoint));\n\n // Import relative to `dist/server/_expo/rsc/web/router.js`\n manifest[publicModuleId] = [String(relativeName), outputName];\n }\n\n async function processEntryPoints(entryPoints: string[], recursions = 0) {\n // Arbitrary recursion limit to prevent infinite loops.\n if (recursions > 10) {\n throw new Error('Recursion limit exceeded while processing server boundaries');\n }\n\n for (const entryPoint of entryPoints) {\n await processEntryPoint(entryPoint);\n }\n\n // When a server action has other server actions inside of it, we need to process those as well to ensure all entry points are in the manifest and accounted for.\n let uniqueNestedServerBoundaries = [...new Set(nestedServerBoundaries)];\n // Filter out values that have already been processed.\n uniqueNestedServerBoundaries = uniqueNestedServerBoundaries.filter(\n (value) => !processedEntryPoints.has(value)\n );\n if (uniqueNestedServerBoundaries.length) {\n debug('bundling nested server action boundaries', uniqueNestedServerBoundaries);\n return processEntryPoints(uniqueNestedServerBoundaries, recursions + 1);\n }\n }\n\n await processEntryPoints(uniqueEntryPoints);\n\n // Save the SSR manifest so we can perform more replacements in the server renderer and with server actions.\n files.set(`_expo/rsc/${platform}/action-manifest.js`, {\n targetDomain: 'server',\n contents: 'module.exports = ' + JSON.stringify(manifest),\n });\n\n return { manifest, clientBoundaries: nestedClientBoundaries };\n }\n\n async function getExpoRouterClientReferencesAsync(\n { platform, domRoot }: { platform: string; domRoot?: string },\n files: ExportAssetMap\n ): Promise<{\n reactClientReferences: string[];\n reactServerReferences: string[];\n cssModules: SerialAsset[];\n }> {\n const contents = await ssrLoadModuleArtifacts(routerModule, {\n environment: 'react-server',\n platform,\n modulesOnly: true,\n domRoot,\n });\n\n // Extract the global CSS modules that are imported from the router.\n // These will be injected in the head of the HTML document for the website.\n const cssModules = contents.artifacts.filter((a) => a.type.startsWith('css'));\n\n const reactServerReferences = contents.artifacts\n .filter((a) => a.type === 'js')[0]\n .metadata.reactServerReferences?.map((ref) => fileURLToFilePath(ref));\n\n if (!reactServerReferences) {\n throw new Error(\n 'Static server action references were not returned from the Metro SSR bundle for definedRouter'\n );\n }\n debug('React client boundaries:', reactServerReferences);\n\n const reactClientReferences = contents.artifacts\n .filter((a) => a.type === 'js')[0]\n .metadata.reactClientReferences?.map((ref) => fileURLToFilePath(ref));\n\n if (!reactClientReferences) {\n throw new Error(\n 'Static client references were not returned from the Metro SSR bundle for definedRouter'\n );\n }\n debug('React client boundaries:', reactClientReferences);\n\n // While we're here, export the router for the server to dynamically render RSC.\n files.set(`_expo/rsc/${platform}/router.js`, {\n targetDomain: 'server',\n contents: wrapBundle(contents.src),\n });\n\n return { reactClientReferences, reactServerReferences, cssModules };\n }\n\n const routerCache = new Map<string, EntriesDev>();\n\n async function getExpoRouterRscEntriesGetterAsync({\n platform,\n routerOptions,\n }: {\n platform: string;\n routerOptions: Record<string, any>;\n }) {\n await ensureMemo();\n // We can only cache this if we're using the client router since it doesn't change or use HMR\n if (routerCache.has(platform) && useClientRouter) {\n return routerCache.get(platform)!;\n }\n\n const router = await ssrLoadModule<\n typeof import('expo-router/build/rsc/router/expo-definedRouter')\n >(\n routerModule,\n {\n environment: 'react-server',\n modulesOnly: true,\n platform,\n },\n {\n hot: !useClientRouter,\n }\n );\n\n const entries = router.default({\n redirects: routerOptions?.redirects,\n rewrites: routerOptions?.rewrites,\n });\n\n routerCache.set(platform, entries);\n return entries;\n }\n\n function getResolveClientEntry(context: {\n platform: string;\n engine?: 'hermes' | null;\n ssrManifest?: Map<string, string>;\n }): (\n file: string,\n isServer: boolean\n ) => {\n id: string;\n chunks: string[];\n } {\n const serverRoot = getMetroServerRootMemo(projectRoot);\n\n const {\n mode,\n minify = false,\n isExporting,\n baseUrl,\n routerRoot,\n asyncRoutes,\n preserveEnvVars,\n reactCompiler,\n lazy,\n } = instanceMetroOptions;\n\n assert(\n isExporting != null &&\n baseUrl != null &&\n mode != null &&\n routerRoot != null &&\n asyncRoutes != null,\n `The server must be started. (isExporting: ${isExporting}, baseUrl: ${baseUrl}, mode: ${mode}, routerRoot: ${routerRoot}, asyncRoutes: ${asyncRoutes})`\n );\n\n return (file: string, isServer: boolean) => {\n const filePath = path.join(\n projectRoot,\n file.startsWith('file://') ? fileURLToFilePath(file) : file\n );\n\n if (isExporting) {\n assert(context.ssrManifest, 'SSR manifest must exist when exporting');\n\n const relativeFilePath = toPosixPath(path.relative(serverRoot, filePath));\n\n assert(\n context.ssrManifest.has(relativeFilePath),\n `SSR manifest is missing client boundary \"${relativeFilePath}\"`\n );\n\n const chunk = context.ssrManifest.get(relativeFilePath);\n\n return {\n id: String(\n createModuleId(filePath, { platform: context.platform, environment: 'client' })\n ),\n chunks: chunk != null ? [chunk] : [],\n };\n }\n\n const environment = isServer ? 'react-server' : 'client';\n const searchParams = createBundleUrlSearchParams({\n mainModuleName: '',\n platform: context.platform,\n mode,\n minify,\n lazy,\n preserveEnvVars,\n asyncRoutes,\n baseUrl,\n routerRoot,\n isExporting,\n reactCompiler: !!reactCompiler,\n engine: context.engine ?? undefined,\n bytecode: false,\n clientBoundaries: [],\n inlineSourceMap: false,\n environment,\n modulesOnly: true,\n runModule: false,\n });\n\n searchParams.set('resolver.clientboundary', String(true));\n\n const clientReferenceUrl = new URL('http://a');\n\n // TICKLE: Handshake 1\n searchParams.set('xRSC', '1');\n\n clientReferenceUrl.search = searchParams.toString();\n\n const relativeFilePath = path.relative(serverRoot, filePath);\n\n clientReferenceUrl.pathname = relativeFilePath;\n\n // Ensure url.pathname ends with '.bundle'\n if (!clientReferenceUrl.pathname.endsWith('.bundle')) {\n clientReferenceUrl.pathname += '.bundle';\n }\n\n // Return relative URLs to help Android fetch from wherever it was loaded from since it doesn't support localhost.\n const chunkName = clientReferenceUrl.pathname + clientReferenceUrl.search;\n\n return {\n id: String(createModuleId(filePath, { platform: context.platform, environment })),\n chunks: [chunkName],\n };\n };\n }\n\n const rscRendererCache = new Map<string, typeof import('expo-router/build/rsc/rsc-renderer')>();\n\n let ensurePromise: Promise<any> | null = null;\n async function ensureSSRReady() {\n // TODO: Extract CSS Modules / Assets from the bundler process\n const runtime = await ssrLoadModule<typeof import('expo-router/build/rsc/rsc-renderer')>(\n 'metro-runtime/src/modules/empty-module.js',\n {\n environment: 'react-server',\n platform: 'web',\n }\n );\n return runtime;\n }\n const ensureMemo = () => {\n ensurePromise ??= ensureSSRReady();\n return ensurePromise;\n };\n\n async function getRscRendererAsync(platform: string) {\n await ensureMemo();\n // NOTE(EvanBacon): We memoize this now that there's a persistent server storage cache for Server Actions.\n if (rscRendererCache.has(platform)) {\n return rscRendererCache.get(platform)!;\n }\n\n // TODO: Extract CSS Modules / Assets from the bundler process\n const renderer = await ssrLoadModule<typeof import('expo-router/build/rsc/rsc-renderer')>(\n 'expo-router/build/rsc/rsc-renderer',\n {\n environment: 'react-server',\n platform,\n }\n );\n\n rscRendererCache.set(platform, renderer);\n return renderer;\n }\n\n const rscRenderContext = new Map<string, any>();\n\n function getRscRenderContext(platform: string) {\n // NOTE(EvanBacon): We memoize this now that there's a persistent server storage cache for Server Actions.\n if (rscRenderContext.has(platform)) {\n return rscRenderContext.get(platform)!;\n }\n\n const context = {};\n\n rscRenderContext.set(platform, context);\n return context;\n }\n\n async function renderRscToReadableStream(\n {\n input,\n headers,\n method,\n platform,\n body,\n engine,\n contentType,\n ssrManifest,\n decodedBody,\n routerOptions,\n }: {\n input: string;\n headers: Headers;\n method: 'POST' | 'GET';\n platform: string;\n body?: ReadableStream<Uint8Array>;\n engine?: 'hermes' | null;\n contentType?: string;\n ssrManifest?: Map<string, string>;\n decodedBody?: unknown;\n routerOptions: Record<string, any>;\n },\n isExporting: boolean | undefined = instanceMetroOptions.isExporting\n ) {\n assert(\n isExporting != null,\n 'The server must be started before calling renderRscToReadableStream.'\n );\n\n if (method === 'POST') {\n assert(body, 'Server request must be provided when method is POST (server actions)');\n }\n\n const context = getRscRenderContext(platform);\n\n context['__expo_requestHeaders'] = headers;\n\n const { renderRsc } = await getRscRendererAsync(platform);\n\n return renderRsc(\n {\n body,\n decodedBody,\n context,\n config: {},\n input,\n contentType,\n },\n {\n isExporting,\n entries: await getExpoRouterRscEntriesGetterAsync({ platform, routerOptions }),\n resolveClientEntry: getResolveClientEntry({ platform, engine, ssrManifest }),\n async loadServerModuleRsc(urlFragment) {\n const serverRoot = getMetroServerRootMemo(projectRoot);\n\n debug('[SSR] loadServerModuleRsc:', urlFragment);\n\n const options = getMetroOptionsFromUrl(urlFragment);\n\n console.log('loadServerModuleRsc:', serverRoot, options.mainModuleName);\n return ssrLoadModule(\n path.join(serverRoot, options.mainModuleName),\n\n options,\n {\n hot: true,\n }\n );\n },\n }\n );\n }\n\n return {\n // Get the static client boundaries (no dead code elimination allowed) for the production export.\n getExpoRouterClientReferencesAsync,\n exportServerActionsAsync,\n\n async exportRoutesAsync(\n {\n platform,\n ssrManifest,\n routerOptions,\n }: {\n platform: string;\n ssrManifest: Map<string, string>;\n routerOptions: Record<string, any>;\n },\n files: ExportAssetMap\n ) {\n // TODO: When we add web SSR support, we need to extract CSS Modules / Assets from the bundler process to prevent FLOUC.\n const { getBuildConfig } = (\n await getExpoRouterRscEntriesGetterAsync({ platform, routerOptions })\n ).default;\n\n // Get all the routes to render.\n const buildConfig = await getBuildConfig!(async () =>\n // TODO: Rework prefetching code to use Metro runtime.\n []\n );\n\n await Promise.all(\n Array.from(buildConfig).map(async ({ entries }) => {\n for (const { input, isStatic } of entries || []) {\n if (!isStatic) {\n debug('Skipping static export for route', { input });\n continue;\n }\n const destRscFile = path.join('_flight', platform, encodeInput(input));\n\n const pipe = await renderRscToReadableStream(\n {\n input,\n method: 'GET',\n platform,\n headers: new Headers(),\n ssrManifest,\n routerOptions,\n },\n true\n );\n\n const rsc = await streamToStringAsync(pipe);\n debug('RSC Payload', { platform, input, rsc });\n\n files.set(destRscFile, {\n contents: rsc,\n targetDomain: 'client',\n rscId: input,\n });\n }\n })\n );\n },\n\n middleware: createBuiltinAPIRequestHandler(\n // Match `/_flight/[platform]/[...path]`\n (req) => {\n return getFullUrl(req.url).pathname.startsWith(rscPathPrefix);\n },\n rscMiddleware\n ),\n onReloadRscEvent: (platform: string) => {\n // NOTE: We cannot clear the renderer context because it would break the mounted context state.\n\n rscRendererCache.delete(platform);\n routerCache.delete(platform);\n },\n };\n}\n\nconst getFullUrl = (url: string) => {\n try {\n return new URL(url);\n } catch {\n return new URL(url, 'http://localhost:0');\n }\n};\n\nexport const fileURLToFilePath = (fileURL: string) => {\n try {\n return url.fileURLToPath(fileURL);\n } catch (error) {\n if (error instanceof TypeError) {\n throw Error(`Invalid URL: ${fileURL}`, { cause: error });\n }\n throw error;\n }\n};\n\nconst encodeInput = (input: string) => {\n if (input === '') {\n return 'index.txt';\n }\n if (input === 'index') {\n throw new Error('Input should not be `index`');\n }\n if (input.startsWith('/')) {\n throw new Error('Input should not start with `/`');\n }\n if (input.endsWith('/')) {\n throw new Error('Input should not end with `/`');\n }\n return input + '.txt';\n};\n\nfunction wrapBundle(str: string) {\n // Skip the metro runtime so debugging is a bit easier.\n // Replace the __r() call with an export statement.\n // Use gm to apply to the last require line. This is needed when the bundle has side-effects.\n return str.replace(/^(__r\\(.*\\);)$/gm, 'module.exports = $1');\n}\n"],"names":["createServerComponentsMiddleware","fileURLToFilePath","debug","require","getMetroServerRootMemo","memoize","getMetroServerRoot","projectRoot","rscPath","instanceMetroOptions","ssrLoadModule","ssrLoadModuleArtifacts","useClientRouter","createModuleId","routerOptions","routerModule","rscMiddleware","getRscMiddleware","config","baseUrl","onError","console","error","renderRsc","args","headers","getIpAddress","renderRscToReadableStream","Headers","body","logMetroError","IS_METRO_BUNDLE_ERROR_SYMBOL","Response","JSON","stringify","status","isPossiblyUnableToResolveError","sanitizedServerMessage","stripAnsi","message","rscPathPrefix","exportServerActionsAsync","platform","entryPoints","domRoot","files","uniqueEntryPoints","Set","manifest","nestedClientBoundaries","nestedServerBoundaries","processedEntryPoints","processEntryPoint","entryPoint","contents","add","environment","modulesOnly","runModule","reactClientReferences","artifacts","filter","a","type","metadata","map","ref","push","reactServerReferences","src","includes","Error","relativeName","safeName","path","basename","find","filename","outputName","set","targetDomain","wrapBundle","publicModuleId","toPosixPath","relative","String","processEntryPoints","recursions","uniqueNestedServerBoundaries","value","has","length","clientBoundaries","getExpoRouterClientReferencesAsync","cssModules","startsWith","routerCache","Map","getExpoRouterRscEntriesGetterAsync","ensureMemo","get","router","hot","entries","default","redirects","rewrites","getResolveClientEntry","context","serverRoot","mode","minify","isExporting","routerRoot","asyncRoutes","preserveEnvVars","reactCompiler","lazy","assert","file","isServer","filePath","join","ssrManifest","relativeFilePath","chunk","id","chunks","searchParams","createBundleUrlSearchParams","mainModuleName","engine","undefined","bytecode","inlineSourceMap","clientReferenceUrl","URL","search","toString","pathname","endsWith","chunkName","rscRendererCache","ensurePromise","ensureSSRReady","runtime","getRscRendererAsync","renderer","rscRenderContext","getRscRenderContext","input","method","contentType","decodedBody","resolveClientEntry","loadServerModuleRsc","urlFragment","options","getMetroOptionsFromUrl","log","exportRoutesAsync","getBuildConfig","buildConfig","Promise","all","Array","from","isStatic","destRscFile","encodeInput","pipe","rsc","streamToStringAsync","rscId","middleware","createBuiltinAPIRequestHandler","req","getFullUrl","url","onReloadRscEvent","delete","fileURL","fileURLToPath","TypeError","cause","str","replace"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/createServerComponentsMiddleware.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { getMetroServerRoot } from '@expo/config/paths';\nimport { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport { getRscMiddleware } from '@expo/server/build/middleware/rsc';\nimport assert from 'assert';\nimport { EntriesDev } from 'expo-router/build/rsc/server';\nimport path from 'path';\nimport url from 'url';\n\nimport { IS_METRO_BUNDLE_ERROR_SYMBOL, logMetroError } from './metroErrorInterface';\nimport { isPossiblyUnableToResolveError } from '../../../export/embed/xcodeCompilerLogger';\nimport { ExportAssetMap } from '../../../export/saveAssets';\nimport { stripAnsi } from '../../../utils/ansi';\nimport { toPosixPath } from '../../../utils/filePath';\nimport { memoize } from '../../../utils/fn';\nimport { getIpAddress } from '../../../utils/ip';\nimport { streamToStringAsync } from '../../../utils/stream';\nimport { createBuiltinAPIRequestHandler } from '../middleware/createBuiltinAPIRequestHandler';\nimport {\n createBundleUrlSearchParams,\n ExpoMetroOptions,\n getMetroOptionsFromUrl,\n} from '../middleware/metroOptions';\n\nconst debug = require('debug')('expo:rsc') as typeof console.log;\n\ntype SSRLoadModuleArtifactsFunc = (\n filePath: string,\n specificOptions?: Partial<ExpoMetroOptions>\n) => Promise<{ artifacts: SerialAsset[]; src: string }>;\n\ntype SSRLoadModuleFunc = <T extends Record<string, any>>(\n filePath: string,\n specificOptions?: Partial<ExpoMetroOptions>,\n extras?: { hot?: boolean }\n) => Promise<T>;\n\nconst getMetroServerRootMemo = memoize(getMetroServerRoot);\n\nexport function createServerComponentsMiddleware(\n projectRoot: string,\n {\n rscPath,\n instanceMetroOptions,\n ssrLoadModule,\n ssrLoadModuleArtifacts,\n useClientRouter,\n createModuleId,\n routerOptions,\n }: {\n rscPath: string;\n instanceMetroOptions: Partial<ExpoMetroOptions>;\n ssrLoadModule: SSRLoadModuleFunc;\n ssrLoadModuleArtifacts: SSRLoadModuleArtifactsFunc;\n useClientRouter: boolean;\n createModuleId: (\n filePath: string,\n context: { platform: string; environment: string }\n ) => string | number;\n routerOptions: Record<string, any>;\n }\n) {\n const routerModule = useClientRouter\n ? 'expo-router/build/rsc/router/noopRouter'\n : 'expo-router/build/rsc/router/expo-definedRouter';\n\n const rscMiddleware = getRscMiddleware({\n config: {},\n // Disabled in development\n baseUrl: '',\n rscPath,\n onError: console.error,\n renderRsc: async (args) => {\n // In development we should add simulated versions of common production headers.\n if (args.headers['x-real-ip'] == null) {\n args.headers['x-real-ip'] = getIpAddress();\n }\n if (args.headers['x-forwarded-for'] == null) {\n args.headers['x-forwarded-for'] = args.headers['x-real-ip'];\n }\n if (args.headers['x-forwarded-proto'] == null) {\n args.headers['x-forwarded-proto'] = 'http';\n }\n\n // Dev server-only implementation.\n try {\n return await renderRscToReadableStream({\n ...args,\n headers: new Headers(args.headers),\n body: args.body!,\n routerOptions,\n });\n } catch (error: any) {\n // If you get a codeFrame error during SSR like when using a Class component in React Server Components, then this\n // will throw with:\n // {\n // rawObject: {\n // type: 'TransformError',\n // lineNumber: 0,\n // errors: [ [Object] ],\n // name: 'SyntaxError',\n // message: '...',\n // }\n // }\n\n // TODO: Revisit all error handling now that we do direct metro bundling...\n await logMetroError(projectRoot, { error });\n\n if (error[IS_METRO_BUNDLE_ERROR_SYMBOL]) {\n throw new Response(JSON.stringify(error), {\n status: isPossiblyUnableToResolveError(error) ? 404 : 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n }\n\n const sanitizedServerMessage = stripAnsi(error.message) ?? error.message;\n throw new Response(sanitizedServerMessage, {\n status: 500,\n headers: {\n 'Content-Type': 'text/plain',\n },\n });\n }\n },\n });\n\n let rscPathPrefix = rscPath;\n if (rscPathPrefix !== '/') {\n rscPathPrefix += '/';\n }\n\n async function exportServerActionsAsync(\n {\n platform,\n entryPoints,\n domRoot,\n }: { platform: string; entryPoints: string[]; domRoot?: string },\n files: ExportAssetMap\n ): Promise<{\n clientBoundaries: string[];\n manifest: Record<string, [string, string]>;\n }> {\n const uniqueEntryPoints = [...new Set(entryPoints)];\n // TODO: Support multiple entry points in a single split server bundle...\n const manifest: Record<string, [string, string]> = {};\n const nestedClientBoundaries: string[] = [];\n const nestedServerBoundaries: string[] = [];\n const processedEntryPoints = new Set<string>();\n async function processEntryPoint(entryPoint: string) {\n processedEntryPoints.add(entryPoint);\n\n const contents = await ssrLoadModuleArtifacts(entryPoint, {\n environment: 'react-server',\n platform,\n // Ignore the metro runtime to avoid overwriting the original in the API route.\n modulesOnly: true,\n // Required\n runModule: true,\n // Required to ensure assets load as client boundaries.\n domRoot,\n });\n\n const reactClientReferences = contents.artifacts\n .filter((a) => a.type === 'js')[0]\n .metadata.reactClientReferences?.map((ref) => fileURLToFilePath(ref));\n\n if (reactClientReferences) {\n nestedClientBoundaries.push(...reactClientReferences!);\n }\n const reactServerReferences = contents.artifacts\n .filter((a) => a.type === 'js')[0]\n .metadata.reactServerReferences?.map((ref) => fileURLToFilePath(ref));\n\n if (reactServerReferences) {\n nestedServerBoundaries.push(...reactServerReferences!);\n }\n\n // Naive check to ensure the module runtime is not included in the server action bundle.\n if (contents.src.includes('The experimental Metro feature')) {\n throw new Error(\n 'Internal error: module runtime should not be included in server action bundles: ' +\n entryPoint\n );\n }\n\n const relativeName = createModuleId(entryPoint, {\n platform,\n environment: 'react-server',\n });\n const safeName = path.basename(contents.artifacts.find((a) => a.type === 'js')!.filename!);\n\n const outputName = `_expo/rsc/${platform}/${safeName}`;\n // While we're here, export the router for the server to dynamically render RSC.\n files.set(outputName, {\n targetDomain: 'server',\n contents: wrapBundle(contents.src),\n });\n\n // Match babel plugin.\n const publicModuleId = './' + toPosixPath(path.relative(projectRoot, entryPoint));\n\n // Import relative to `dist/server/_expo/rsc/web/router.js`\n manifest[publicModuleId] = [String(relativeName), outputName];\n }\n\n async function processEntryPoints(entryPoints: string[], recursions = 0) {\n // Arbitrary recursion limit to prevent infinite loops.\n if (recursions > 10) {\n throw new Error('Recursion limit exceeded while processing server boundaries');\n }\n\n for (const entryPoint of entryPoints) {\n await processEntryPoint(entryPoint);\n }\n\n // When a server action has other server actions inside of it, we need to process those as well to ensure all entry points are in the manifest and accounted for.\n let uniqueNestedServerBoundaries = [...new Set(nestedServerBoundaries)];\n // Filter out values that have already been processed.\n uniqueNestedServerBoundaries = uniqueNestedServerBoundaries.filter(\n (value) => !processedEntryPoints.has(value)\n );\n if (uniqueNestedServerBoundaries.length) {\n debug('bundling nested server action boundaries', uniqueNestedServerBoundaries);\n return processEntryPoints(uniqueNestedServerBoundaries, recursions + 1);\n }\n }\n\n await processEntryPoints(uniqueEntryPoints);\n\n // Save the SSR manifest so we can perform more replacements in the server renderer and with server actions.\n files.set(`_expo/rsc/${platform}/action-manifest.js`, {\n targetDomain: 'server',\n contents: 'module.exports = ' + JSON.stringify(manifest),\n });\n\n return { manifest, clientBoundaries: nestedClientBoundaries };\n }\n\n async function getExpoRouterClientReferencesAsync(\n { platform, domRoot }: { platform: string; domRoot?: string },\n files: ExportAssetMap\n ): Promise<{\n reactClientReferences: string[];\n reactServerReferences: string[];\n cssModules: SerialAsset[];\n }> {\n const contents = await ssrLoadModuleArtifacts(routerModule, {\n environment: 'react-server',\n platform,\n modulesOnly: true,\n domRoot,\n });\n\n // Extract the global CSS modules that are imported from the router.\n // These will be injected in the head of the HTML document for the website.\n const cssModules = contents.artifacts.filter((a) => a.type.startsWith('css'));\n\n const reactServerReferences = contents.artifacts\n .filter((a) => a.type === 'js')[0]\n .metadata.reactServerReferences?.map((ref) => fileURLToFilePath(ref));\n\n if (!reactServerReferences) {\n throw new Error(\n 'Static server action references were not returned from the Metro SSR bundle for definedRouter'\n );\n }\n debug('React client boundaries:', reactServerReferences);\n\n const reactClientReferences = contents.artifacts\n .filter((a) => a.type === 'js')[0]\n .metadata.reactClientReferences?.map((ref) => fileURLToFilePath(ref));\n\n if (!reactClientReferences) {\n throw new Error(\n 'Static client references were not returned from the Metro SSR bundle for definedRouter'\n );\n }\n debug('React client boundaries:', reactClientReferences);\n\n // While we're here, export the router for the server to dynamically render RSC.\n files.set(`_expo/rsc/${platform}/router.js`, {\n targetDomain: 'server',\n contents: wrapBundle(contents.src),\n });\n\n return { reactClientReferences, reactServerReferences, cssModules };\n }\n\n const routerCache = new Map<string, EntriesDev>();\n\n async function getExpoRouterRscEntriesGetterAsync({\n platform,\n routerOptions,\n }: {\n platform: string;\n routerOptions: Record<string, any>;\n }) {\n await ensureMemo();\n // We can only cache this if we're using the client router since it doesn't change or use HMR\n if (routerCache.has(platform) && useClientRouter) {\n return routerCache.get(platform)!;\n }\n\n const router = await ssrLoadModule<\n typeof import('expo-router/build/rsc/router/expo-definedRouter')\n >(\n routerModule,\n {\n environment: 'react-server',\n modulesOnly: true,\n platform,\n },\n {\n hot: !useClientRouter,\n }\n );\n\n const entries = router.default({\n redirects: routerOptions?.redirects,\n rewrites: routerOptions?.rewrites,\n });\n\n routerCache.set(platform, entries);\n return entries;\n }\n\n function getResolveClientEntry(context: {\n platform: string;\n engine?: 'hermes' | null;\n ssrManifest?: Map<string, string>;\n }): (\n file: string,\n isServer: boolean\n ) => {\n id: string;\n chunks: string[];\n } {\n const serverRoot = getMetroServerRootMemo(projectRoot);\n\n const {\n mode,\n minify = false,\n isExporting,\n baseUrl,\n routerRoot,\n asyncRoutes,\n preserveEnvVars,\n reactCompiler,\n lazy,\n } = instanceMetroOptions;\n\n assert(\n isExporting != null &&\n baseUrl != null &&\n mode != null &&\n routerRoot != null &&\n asyncRoutes != null,\n `The server must be started. (isExporting: ${isExporting}, baseUrl: ${baseUrl}, mode: ${mode}, routerRoot: ${routerRoot}, asyncRoutes: ${asyncRoutes})`\n );\n\n return (file: string, isServer: boolean) => {\n const filePath = path.join(\n projectRoot,\n file.startsWith('file://') ? fileURLToFilePath(file) : file\n );\n\n if (isExporting) {\n assert(context.ssrManifest, 'SSR manifest must exist when exporting');\n\n const relativeFilePath = toPosixPath(path.relative(serverRoot, filePath));\n\n assert(\n context.ssrManifest.has(relativeFilePath),\n `SSR manifest is missing client boundary \"${relativeFilePath}\"`\n );\n\n const chunk = context.ssrManifest.get(relativeFilePath);\n\n return {\n id: String(\n createModuleId(filePath, { platform: context.platform, environment: 'client' })\n ),\n chunks: chunk != null ? [chunk] : [],\n };\n }\n\n const environment = isServer ? 'react-server' : 'client';\n const searchParams = createBundleUrlSearchParams({\n mainModuleName: '',\n platform: context.platform,\n mode,\n minify,\n lazy,\n preserveEnvVars,\n asyncRoutes,\n baseUrl,\n routerRoot,\n isExporting,\n reactCompiler: !!reactCompiler,\n engine: context.engine ?? undefined,\n bytecode: false,\n clientBoundaries: [],\n inlineSourceMap: false,\n environment,\n modulesOnly: true,\n runModule: false,\n });\n\n searchParams.set('resolver.clientboundary', String(true));\n\n const clientReferenceUrl = new URL('http://a');\n\n // TICKLE: Handshake 1\n searchParams.set('xRSC', '1');\n\n clientReferenceUrl.search = searchParams.toString();\n\n const relativeFilePath = path.relative(serverRoot, filePath);\n\n clientReferenceUrl.pathname = relativeFilePath;\n\n // Ensure url.pathname ends with '.bundle'\n if (!clientReferenceUrl.pathname.endsWith('.bundle')) {\n clientReferenceUrl.pathname += '.bundle';\n }\n\n // Return relative URLs to help Android fetch from wherever it was loaded from since it doesn't support localhost.\n const chunkName = clientReferenceUrl.pathname + clientReferenceUrl.search;\n\n return {\n id: String(createModuleId(filePath, { platform: context.platform, environment })),\n chunks: [chunkName],\n };\n };\n }\n\n const rscRendererCache = new Map<string, typeof import('expo-router/build/rsc/rsc-renderer')>();\n\n let ensurePromise: Promise<any> | null = null;\n async function ensureSSRReady() {\n // TODO: Extract CSS Modules / Assets from the bundler process\n const runtime = await ssrLoadModule<typeof import('expo-router/build/rsc/rsc-renderer')>(\n 'metro-runtime/src/modules/empty-module.js',\n {\n environment: 'react-server',\n platform: 'web',\n }\n );\n return runtime;\n }\n const ensureMemo = () => {\n ensurePromise ??= ensureSSRReady();\n return ensurePromise;\n };\n\n async function getRscRendererAsync(platform: string) {\n await ensureMemo();\n // NOTE(EvanBacon): We memoize this now that there's a persistent server storage cache for Server Actions.\n if (rscRendererCache.has(platform)) {\n return rscRendererCache.get(platform)!;\n }\n\n // TODO: Extract CSS Modules / Assets from the bundler process\n const renderer = await ssrLoadModule<typeof import('expo-router/build/rsc/rsc-renderer')>(\n 'expo-router/build/rsc/rsc-renderer',\n {\n environment: 'react-server',\n platform,\n }\n );\n\n rscRendererCache.set(platform, renderer);\n return renderer;\n }\n\n const rscRenderContext = new Map<string, any>();\n\n function getRscRenderContext(platform: string) {\n // NOTE(EvanBacon): We memoize this now that there's a persistent server storage cache for Server Actions.\n if (rscRenderContext.has(platform)) {\n return rscRenderContext.get(platform)!;\n }\n\n const context = {};\n\n rscRenderContext.set(platform, context);\n return context;\n }\n\n async function renderRscToReadableStream(\n {\n input,\n headers,\n method,\n platform,\n body,\n engine,\n contentType,\n ssrManifest,\n decodedBody,\n routerOptions,\n }: {\n input: string;\n headers: Headers;\n method: 'POST' | 'GET';\n platform: string;\n body?: ReadableStream<Uint8Array>;\n engine?: 'hermes' | null;\n contentType?: string;\n ssrManifest?: Map<string, string>;\n decodedBody?: unknown;\n routerOptions: Record<string, any>;\n },\n isExporting: boolean | undefined = instanceMetroOptions.isExporting\n ) {\n assert(\n isExporting != null,\n 'The server must be started before calling renderRscToReadableStream.'\n );\n\n if (method === 'POST') {\n assert(body, 'Server request must be provided when method is POST (server actions)');\n }\n\n const context = getRscRenderContext(platform);\n\n context['__expo_requestHeaders'] = headers;\n\n const { renderRsc } = await getRscRendererAsync(platform);\n\n return renderRsc(\n {\n body,\n decodedBody,\n context,\n config: {},\n input,\n contentType,\n },\n {\n isExporting,\n entries: await getExpoRouterRscEntriesGetterAsync({ platform, routerOptions }),\n resolveClientEntry: getResolveClientEntry({ platform, engine, ssrManifest }),\n async loadServerModuleRsc(urlFragment) {\n const serverRoot = getMetroServerRootMemo(projectRoot);\n\n debug('[SSR] loadServerModuleRsc:', urlFragment);\n\n const options = getMetroOptionsFromUrl(urlFragment);\n\n return ssrLoadModule(\n path.join(serverRoot, options.mainModuleName),\n\n options,\n {\n hot: true,\n }\n );\n },\n }\n );\n }\n\n return {\n // Get the static client boundaries (no dead code elimination allowed) for the production export.\n getExpoRouterClientReferencesAsync,\n exportServerActionsAsync,\n\n async exportRoutesAsync(\n {\n platform,\n ssrManifest,\n routerOptions,\n }: {\n platform: string;\n ssrManifest: Map<string, string>;\n routerOptions: Record<string, any>;\n },\n files: ExportAssetMap\n ) {\n // TODO: When we add web SSR support, we need to extract CSS Modules / Assets from the bundler process to prevent FLOUC.\n const { getBuildConfig } = (\n await getExpoRouterRscEntriesGetterAsync({ platform, routerOptions })\n ).default;\n\n // Get all the routes to render.\n const buildConfig = await getBuildConfig!(async () =>\n // TODO: Rework prefetching code to use Metro runtime.\n []\n );\n\n await Promise.all(\n Array.from(buildConfig).map(async ({ entries }) => {\n for (const { input, isStatic } of entries || []) {\n if (!isStatic) {\n debug('Skipping static export for route', { input });\n continue;\n }\n const destRscFile = path.join('_flight', platform, encodeInput(input));\n\n const pipe = await renderRscToReadableStream(\n {\n input,\n method: 'GET',\n platform,\n headers: new Headers(),\n ssrManifest,\n routerOptions,\n },\n true\n );\n\n const rsc = await streamToStringAsync(pipe);\n debug('RSC Payload', { platform, input, rsc });\n\n files.set(destRscFile, {\n contents: rsc,\n targetDomain: 'client',\n rscId: input,\n });\n }\n })\n );\n },\n\n middleware: createBuiltinAPIRequestHandler(\n // Match `/_flight/[platform]/[...path]`\n (req) => {\n return getFullUrl(req.url).pathname.startsWith(rscPathPrefix);\n },\n rscMiddleware\n ),\n onReloadRscEvent: (platform: string) => {\n // NOTE: We cannot clear the renderer context because it would break the mounted context state.\n\n rscRendererCache.delete(platform);\n routerCache.delete(platform);\n },\n };\n}\n\nconst getFullUrl = (url: string) => {\n try {\n return new URL(url);\n } catch {\n return new URL(url, 'http://localhost:0');\n }\n};\n\nexport const fileURLToFilePath = (fileURL: string) => {\n try {\n return url.fileURLToPath(fileURL);\n } catch (error) {\n if (error instanceof TypeError) {\n throw Error(`Invalid URL: ${fileURL}`, { cause: error });\n }\n throw error;\n }\n};\n\nconst encodeInput = (input: string) => {\n if (input === '') {\n return 'index.txt';\n }\n if (input === 'index') {\n throw new Error('Input should not be `index`');\n }\n if (input.startsWith('/')) {\n throw new Error('Input should not start with `/`');\n }\n if (input.endsWith('/')) {\n throw new Error('Input should not end with `/`');\n }\n return input + '.txt';\n};\n\nfunction wrapBundle(str: string) {\n // Skip the metro runtime so debugging is a bit easier.\n // Replace the __r() call with an export statement.\n // Use gm to apply to the last require line. This is needed when the bundle has side-effects.\n return str.replace(/^(__r\\(.*\\);)$/gm, 'module.exports = $1');\n}\n"],"names":["createServerComponentsMiddleware","fileURLToFilePath","debug","require","getMetroServerRootMemo","memoize","getMetroServerRoot","projectRoot","rscPath","instanceMetroOptions","ssrLoadModule","ssrLoadModuleArtifacts","useClientRouter","createModuleId","routerOptions","routerModule","rscMiddleware","getRscMiddleware","config","baseUrl","onError","console","error","renderRsc","args","headers","getIpAddress","renderRscToReadableStream","Headers","body","logMetroError","IS_METRO_BUNDLE_ERROR_SYMBOL","Response","JSON","stringify","status","isPossiblyUnableToResolveError","sanitizedServerMessage","stripAnsi","message","rscPathPrefix","exportServerActionsAsync","platform","entryPoints","domRoot","files","uniqueEntryPoints","Set","manifest","nestedClientBoundaries","nestedServerBoundaries","processedEntryPoints","processEntryPoint","entryPoint","contents","add","environment","modulesOnly","runModule","reactClientReferences","artifacts","filter","a","type","metadata","map","ref","push","reactServerReferences","src","includes","Error","relativeName","safeName","path","basename","find","filename","outputName","set","targetDomain","wrapBundle","publicModuleId","toPosixPath","relative","String","processEntryPoints","recursions","uniqueNestedServerBoundaries","value","has","length","clientBoundaries","getExpoRouterClientReferencesAsync","cssModules","startsWith","routerCache","Map","getExpoRouterRscEntriesGetterAsync","ensureMemo","get","router","hot","entries","default","redirects","rewrites","getResolveClientEntry","context","serverRoot","mode","minify","isExporting","routerRoot","asyncRoutes","preserveEnvVars","reactCompiler","lazy","assert","file","isServer","filePath","join","ssrManifest","relativeFilePath","chunk","id","chunks","searchParams","createBundleUrlSearchParams","mainModuleName","engine","undefined","bytecode","inlineSourceMap","clientReferenceUrl","URL","search","toString","pathname","endsWith","chunkName","rscRendererCache","ensurePromise","ensureSSRReady","runtime","getRscRendererAsync","renderer","rscRenderContext","getRscRenderContext","input","method","contentType","decodedBody","resolveClientEntry","loadServerModuleRsc","urlFragment","options","getMetroOptionsFromUrl","exportRoutesAsync","getBuildConfig","buildConfig","Promise","all","Array","from","isStatic","destRscFile","encodeInput","pipe","rsc","streamToStringAsync","rscId","middleware","createBuiltinAPIRequestHandler","req","getFullUrl","url","onReloadRscEvent","delete","fileURL","fileURLToPath","TypeError","cause","str","replace"],"mappings":"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"}
|
|
@@ -76,7 +76,7 @@ const runServer = async (metroBundler, config, { hasReducedPerformance = false,
|
|
|
76
76
|
// console.warn(
|
|
77
77
|
// chalk.inverse.yellow.bold(' DEPRECATED '),
|
|
78
78
|
// 'The `secure`, `secureCert`, and `secureKey` options are now deprecated. ' +
|
|
79
|
-
// '
|
|
79
|
+
// 'Use the `secureServerOptions` object instead to pass options to ' +
|
|
80
80
|
// "Metro's https development server.",
|
|
81
81
|
// );
|
|
82
82
|
// }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/runServer-fork.ts"],"sourcesContent":["// Copyright © 2023 650 Industries.\n// Copyright (c) Meta Platforms, Inc. and affiliates.\n//\n// Forks https://github.com/facebook/metro/blob/b80d9a0f638ee9fb82ff69cd3c8d9f4309ca1da2/packages/metro/src/index.flow.js#L57\n// and adds the ability to access the bundler instance.\nimport assert from 'assert';\nimport http from 'http';\nimport https from 'https';\nimport Metro, { RunServerOptions, Server } from 'metro';\nimport MetroHmrServer from 'metro/src/HmrServer';\nimport createWebsocketServer from 'metro/src/lib/createWebsocketServer';\nimport { ConfigT } from 'metro-config';\nimport { parse } from 'url';\nimport type { WebSocketServer } from 'ws';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { Log } from '../../../log';\nimport { getRunningProcess } from '../../../utils/getRunningProcess';\nimport type { ConnectAppType } from '../middleware/server.types';\n\nexport const runServer = async (\n metroBundler: MetroBundlerDevServer,\n config: ConfigT,\n {\n hasReducedPerformance = false,\n host,\n onError,\n onReady,\n secureServerOptions,\n waitForBundler = false,\n websocketEndpoints = {},\n watch,\n }: RunServerOptions,\n {\n mockServer,\n }: {\n // Use a mock server object instead of creating a real server, this is used in export cases where we want to reuse codepaths but not actually start a server.\n mockServer: boolean;\n }\n): Promise<{\n server: http.Server | https.Server;\n hmrServer: MetroHmrServer | null;\n metro: Server;\n}> => {\n // await earlyPortCheck(host, config.server.port);\n\n // if (secure != null || secureCert != null || secureKey != null) {\n // // eslint-disable-next-line no-console\n // console.warn(\n // chalk.inverse.yellow.bold(' DEPRECATED '),\n // 'The `secure`, `secureCert`, and `secureKey` options are now deprecated. ' +\n // '
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/runServer-fork.ts"],"sourcesContent":["// Copyright © 2023 650 Industries.\n// Copyright (c) Meta Platforms, Inc. and affiliates.\n//\n// Forks https://github.com/facebook/metro/blob/b80d9a0f638ee9fb82ff69cd3c8d9f4309ca1da2/packages/metro/src/index.flow.js#L57\n// and adds the ability to access the bundler instance.\nimport assert from 'assert';\nimport http from 'http';\nimport https from 'https';\nimport Metro, { RunServerOptions, Server } from 'metro';\nimport MetroHmrServer from 'metro/src/HmrServer';\nimport createWebsocketServer from 'metro/src/lib/createWebsocketServer';\nimport { ConfigT } from 'metro-config';\nimport { parse } from 'url';\nimport type { WebSocketServer } from 'ws';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { Log } from '../../../log';\nimport { getRunningProcess } from '../../../utils/getRunningProcess';\nimport type { ConnectAppType } from '../middleware/server.types';\n\nexport const runServer = async (\n metroBundler: MetroBundlerDevServer,\n config: ConfigT,\n {\n hasReducedPerformance = false,\n host,\n onError,\n onReady,\n secureServerOptions,\n waitForBundler = false,\n websocketEndpoints = {},\n watch,\n }: RunServerOptions,\n {\n mockServer,\n }: {\n // Use a mock server object instead of creating a real server, this is used in export cases where we want to reuse codepaths but not actually start a server.\n mockServer: boolean;\n }\n): Promise<{\n server: http.Server | https.Server;\n hmrServer: MetroHmrServer | null;\n metro: Server;\n}> => {\n // await earlyPortCheck(host, config.server.port);\n\n // if (secure != null || secureCert != null || secureKey != null) {\n // // eslint-disable-next-line no-console\n // console.warn(\n // chalk.inverse.yellow.bold(' DEPRECATED '),\n // 'The `secure`, `secureCert`, and `secureKey` options are now deprecated. ' +\n // 'Use the `secureServerOptions` object instead to pass options to ' +\n // \"Metro's https development server.\",\n // );\n // }\n\n const { middleware, end, metroServer } = await Metro.createConnectMiddleware(config, {\n hasReducedPerformance,\n waitForBundler,\n watch,\n });\n\n if (!mockServer) {\n assert(typeof (middleware as any).use === 'function');\n }\n const serverApp = middleware as ConnectAppType;\n\n let httpServer: http.Server | https.Server;\n\n if (secureServerOptions != null) {\n httpServer = https.createServer(secureServerOptions, serverApp);\n } else {\n httpServer = http.createServer(serverApp);\n }\n\n httpServer.on('error', (error) => {\n if ('code' in error && error.code === 'EADDRINUSE') {\n // If `Error: listen EADDRINUSE: address already in use :::8081` then print additional info\n // about the process before throwing.\n const info = getRunningProcess(config.server.port);\n if (info) {\n Log.error(\n `Port ${config.server.port} is busy running ${info.command} in: ${info.directory}`\n );\n }\n }\n\n if (onError) {\n onError(error);\n }\n end();\n });\n\n // Disable any kind of automatic timeout behavior for incoming\n // requests in case it takes the packager more than the default\n // timeout of 120 seconds to respond to a request.\n httpServer.timeout = 0;\n\n httpServer.on('close', () => {\n end();\n });\n\n // Extend the close method to ensure all websocket servers are closed, and connections are terminated\n const originalClose = httpServer.close.bind(httpServer);\n\n httpServer.close = function closeHttpServer(callback) {\n originalClose(callback);\n\n // Close all websocket servers, including possible client connections (see: https://github.com/websockets/ws/issues/2137#issuecomment-1507469375)\n for (const endpoint of Object.values(websocketEndpoints) as WebSocketServer[]) {\n endpoint.close();\n endpoint.clients.forEach((client) => client.terminate());\n }\n\n // Forcibly close active connections\n this.closeAllConnections();\n return this;\n };\n\n if (mockServer) {\n return { server: httpServer, hmrServer: null, metro: metroServer };\n }\n\n return new Promise<{\n server: http.Server | https.Server;\n hmrServer: MetroHmrServer;\n metro: Server;\n }>((resolve, reject) => {\n httpServer.on('error', (error) => {\n reject(error);\n });\n\n httpServer.listen(config.server.port, host, () => {\n if (onReady) {\n onReady(httpServer);\n }\n\n const hmrServer = new MetroHmrServer(\n metroServer.getBundler(),\n metroServer.getCreateModuleId(),\n config\n );\n\n Object.assign(websocketEndpoints, {\n '/hot': createWebsocketServer({\n websocketServer: hmrServer,\n }),\n });\n\n httpServer.on('upgrade', (request, socket, head) => {\n const { pathname } = parse(request.url!);\n if (pathname != null && websocketEndpoints[pathname]) {\n websocketEndpoints[pathname].handleUpgrade(request, socket, head, (ws) => {\n websocketEndpoints[pathname].emit('connection', ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n\n resolve({ server: httpServer, hmrServer, metro: metroServer });\n });\n });\n};\n"],"names":["runServer","metroBundler","config","hasReducedPerformance","host","onError","onReady","secureServerOptions","waitForBundler","websocketEndpoints","watch","mockServer","middleware","end","metroServer","Metro","createConnectMiddleware","assert","use","serverApp","httpServer","https","createServer","http","on","error","code","info","getRunningProcess","server","port","Log","command","directory","timeout","originalClose","close","bind","closeHttpServer","callback","endpoint","Object","values","clients","forEach","client","terminate","closeAllConnections","hmrServer","metro","Promise","resolve","reject","listen","MetroHmrServer","getBundler","getCreateModuleId","assign","createWebsocketServer","websocketServer","request","socket","head","pathname","parse","url","handleUpgrade","ws","emit","destroy"],"mappings":"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"}
|
|
@@ -135,7 +135,7 @@ function withWebPolyfills(config, { getMetroBundler }) {
|
|
|
135
135
|
const virtualModuleId = `\0polyfill:external-require`;
|
|
136
136
|
(0, _metroVirtualModules.getMetroBundlerWithVirtualModules)(getMetroBundler()).setVirtualModule(virtualModuleId, (()=>{
|
|
137
137
|
if (ctx.platform === 'web') {
|
|
138
|
-
return `global.$$require_external = typeof
|
|
138
|
+
return `global.$$require_external = typeof require !== "undefined" ? require : () => null;`;
|
|
139
139
|
} else {
|
|
140
140
|
// Wrap in try/catch to support Android.
|
|
141
141
|
return 'try { global.$$require_external = typeof expo === "undefined" ? require : (moduleId) => { throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);} } catch { global.$$require_external = (moduleId) => { throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);} }';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/withMetroMultiPlatform.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { ExpoConfig, Platform } from '@expo/config';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport Bundler from 'metro/src/Bundler';\nimport { ConfigT } from 'metro-config';\nimport { Resolution, ResolutionContext, CustomResolutionContext } from 'metro-resolver';\nimport * as metroResolver from 'metro-resolver';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { createFallbackModuleResolver } from './createExpoFallbackResolver';\nimport { createFastResolver, FailedToResolvePathError } from './createExpoMetroResolver';\nimport { isNodeExternal, shouldCreateVirtualCanary, shouldCreateVirtualShim } from './externals';\nimport { isFailedToResolveNameError, isFailedToResolvePathError } from './metroErrors';\nimport { getMetroBundlerWithVirtualModules } from './metroVirtualModules';\nimport {\n withMetroErrorReportingResolver,\n withMetroMutatedResolverContext,\n withMetroResolvers,\n} from './withMetroResolvers';\nimport { Log } from '../../../log';\nimport { FileNotifier } from '../../../utils/FileNotifier';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\nimport { isInteractive } from '../../../utils/interactive';\nimport { loadTsConfigPathsAsync, TsConfigPaths } from '../../../utils/tsconfig/loadTsConfigPaths';\nimport { resolveWithTsConfigPaths } from '../../../utils/tsconfig/resolveWithTsConfigPaths';\nimport { isServerEnvironment } from '../middleware/metroOptions';\nimport { PlatformBundlers } from '../platformBundlers';\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\nexport type StrictResolver = (moduleName: string) => Resolution;\nexport type StrictResolverFactory = (\n context: ResolutionContext,\n platform: string | null\n) => StrictResolver;\n\nconst ASSET_REGISTRY_SRC = `const assets=[];module.exports={registerAsset:s=>assets.push(s),getAssetByID:s=>assets[s-1]};`;\n\nconst debug = require('debug')('expo:start:server:metro:multi-platform') as typeof console.log;\n\nfunction withWebPolyfills(\n config: ConfigT,\n {\n getMetroBundler,\n }: {\n getMetroBundler: () => Bundler;\n }\n): ConfigT {\n const originalGetPolyfills = config.serializer.getPolyfills\n ? config.serializer.getPolyfills.bind(config.serializer)\n : () => [];\n\n const getPolyfills = (ctx: { platform?: string | null }): readonly string[] => {\n const virtualEnvVarId = `\\0polyfill:environment-variables`;\n\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualEnvVarId,\n (() => {\n return `//`;\n })()\n );\n\n const virtualModuleId = `\\0polyfill:external-require`;\n\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualModuleId,\n (() => {\n if (ctx.platform === 'web') {\n return `global.$$require_external = typeof window === \"undefined\" ? require : () => null;`;\n } else {\n // Wrap in try/catch to support Android.\n return 'try { global.$$require_external = typeof expo === \"undefined\" ? require : (moduleId) => { throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);} } catch { global.$$require_external = (moduleId) => { throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);} }';\n }\n })()\n );\n\n if (ctx.platform === 'web') {\n return [\n virtualModuleId,\n virtualEnvVarId,\n // Ensure that the error-guard polyfill is included in the web polyfills to\n // make metro-runtime work correctly.\n // TODO: This module is pretty big for a function that simply re-throws an error that doesn't need to be caught.\n require.resolve('@react-native/js-polyfills/error-guard'),\n ];\n }\n\n // Generally uses `rn-get-polyfills`\n const polyfills = originalGetPolyfills(ctx);\n return [\n ...polyfills,\n virtualModuleId,\n virtualEnvVarId,\n // Removed on server platforms during the transform.\n require.resolve('expo/virtual/streams.js'),\n ];\n };\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n getPolyfills,\n },\n };\n}\n\nfunction normalizeSlashes(p: string) {\n return p.replace(/\\\\/g, '/');\n}\n\nexport function getNodejsExtensions(srcExts: readonly string[]): string[] {\n const mjsExts = srcExts.filter((ext) => /mjs$/.test(ext));\n const nodejsSourceExtensions = srcExts.filter((ext) => !/mjs$/.test(ext));\n // find index of last `*.js` extension\n const jsIndex = nodejsSourceExtensions.reduce((index, ext, i) => {\n return /jsx?$/.test(ext) ? i : index;\n }, -1);\n\n // insert `*.mjs` extensions after `*.js` extensions\n nodejsSourceExtensions.splice(jsIndex + 1, 0, ...mjsExts);\n\n return nodejsSourceExtensions;\n}\n\n/**\n * Apply custom resolvers to do the following:\n * - Disable `.native.js` extensions on web.\n * - Alias `react-native` to `react-native-web` on web.\n * - Redirect `react-native-web/dist/modules/AssetRegistry/index.js` to `@react-native/assets/registry.js` on web.\n * - Add support for `tsconfig.json`/`jsconfig.json` aliases via `compilerOptions.paths`.\n * - Alias react-native renderer code to a vendored React canary build on native.\n */\nexport function withExtendedResolver(\n config: ConfigT,\n {\n tsconfig,\n isTsconfigPathsEnabled,\n isFastResolverEnabled,\n isExporting,\n isReactCanaryEnabled,\n isReactServerComponentsEnabled,\n getMetroBundler,\n }: {\n tsconfig: TsConfigPaths | null;\n isTsconfigPathsEnabled?: boolean;\n isFastResolverEnabled?: boolean;\n isExporting?: boolean;\n isReactCanaryEnabled?: boolean;\n isReactServerComponentsEnabled?: boolean;\n getMetroBundler: () => Bundler;\n }\n) {\n if (isReactServerComponentsEnabled) {\n Log.warn(`React Server Components (beta) is enabled.`);\n }\n if (isReactCanaryEnabled) {\n Log.warn(`Experimental React 19 canary is enabled.`);\n }\n if (isFastResolverEnabled) {\n Log.log(chalk.dim`Fast resolver is enabled.`);\n }\n\n const defaultResolver = metroResolver.resolve;\n const resolver = isFastResolverEnabled\n ? createFastResolver({\n preserveSymlinks: true,\n blockList: !config.resolver?.blockList\n ? []\n : Array.isArray(config.resolver?.blockList)\n ? config.resolver?.blockList\n : [config.resolver?.blockList],\n })\n : defaultResolver;\n\n const aliases: { [key: string]: Record<string, string> } = {\n web: {\n 'react-native': 'react-native-web',\n 'react-native/index': 'react-native-web',\n 'react-native/Libraries/Image/resolveAssetSource': 'expo-asset/build/resolveAssetSource',\n },\n };\n\n let _universalAliases: [RegExp, string][] | null;\n\n function getUniversalAliases() {\n if (_universalAliases) {\n return _universalAliases;\n }\n\n _universalAliases = [];\n\n // This package is currently always installed as it is included in the `expo` package.\n if (resolveFrom.silent(config.projectRoot, '@expo/vector-icons')) {\n debug('Enabling alias: react-native-vector-icons -> @expo/vector-icons');\n _universalAliases.push([/^react-native-vector-icons(\\/.*)?/, '@expo/vector-icons$1']);\n }\n if (isReactServerComponentsEnabled) {\n if (resolveFrom.silent(config.projectRoot, 'expo-router/rsc')) {\n debug('Enabling bridge alias: expo-router -> expo-router/rsc');\n _universalAliases.push([/^expo-router$/, 'expo-router/rsc']);\n // Bridge the internal entry point which is a standalone import to ensure package.json resolution works as expected.\n _universalAliases.push([/^expo-router\\/entry-classic$/, 'expo-router/rsc/entry']);\n }\n }\n return _universalAliases;\n }\n\n const preferredMainFields: { [key: string]: string[] } = {\n // Defaults from Expo Webpack. Most packages using `react-native` don't support web\n // in the `react-native` field, so we should prefer the `browser` field.\n // https://github.com/expo/router/issues/37\n web: ['browser', 'module', 'main'],\n };\n\n let tsConfigResolve =\n isTsconfigPathsEnabled && (tsconfig?.paths || tsconfig?.baseUrl != null)\n ? resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsconfig.paths ?? {},\n baseUrl: tsconfig.baseUrl ?? config.projectRoot,\n hasBaseUrl: !!tsconfig.baseUrl,\n })\n : null;\n\n // TODO: Move this to be a transform key for invalidation.\n if (!isExporting && isInteractive()) {\n if (isTsconfigPathsEnabled) {\n // TODO: We should track all the files that used imports and invalidate them\n // currently the user will need to save all the files that use imports to\n // use the new aliases.\n const configWatcher = new FileNotifier(config.projectRoot, [\n './tsconfig.json',\n './jsconfig.json',\n ]);\n configWatcher.startObserving(() => {\n debug('Reloading tsconfig.json');\n loadTsConfigPathsAsync(config.projectRoot).then((tsConfigPaths) => {\n if (tsConfigPaths?.paths && !!Object.keys(tsConfigPaths.paths).length) {\n debug('Enabling tsconfig.json paths support');\n tsConfigResolve = resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsConfigPaths.paths ?? {},\n baseUrl: tsConfigPaths.baseUrl ?? config.projectRoot,\n hasBaseUrl: !!tsConfigPaths.baseUrl,\n });\n } else {\n debug('Disabling tsconfig.json paths support');\n tsConfigResolve = null;\n }\n });\n });\n\n // TODO: This probably prevents the process from exiting.\n installExitHooks(() => {\n configWatcher.stopObserving();\n });\n } else {\n debug('Skipping tsconfig.json paths support');\n }\n }\n\n let nodejsSourceExtensions: string[] | null = null;\n\n const getStrictResolver: StrictResolverFactory = (\n { resolveRequest, ...context },\n platform\n ): StrictResolver => {\n return function doResolve(moduleName: string): Resolution {\n return resolver(context, moduleName, platform);\n };\n };\n\n function getOptionalResolver(context: ResolutionContext, platform: string | null) {\n const doResolve = getStrictResolver(context, platform);\n return function optionalResolve(moduleName: string): Resolution | null {\n try {\n return doResolve(moduleName);\n } catch (error) {\n // If the error is directly related to a resolver not being able to resolve a module, then\n // we can ignore the error and try the next resolver. Otherwise, we should throw the error.\n const isResolutionError =\n isFailedToResolveNameError(error) || isFailedToResolvePathError(error);\n if (!isResolutionError) {\n throw error;\n }\n }\n return null;\n };\n }\n\n // TODO: This is a hack to get resolveWeak working.\n const idFactory = (config.serializer?.createModuleIdFactory?.() ??\n ((id: number | string, context: { platform: string; environment?: string }): number | string =>\n id)) as (\n id: number | string,\n context: { platform: string; environment?: string }\n ) => number | string;\n\n const getAssetRegistryModule = () => {\n const virtualModuleId = `\\0polyfill:assets-registry`;\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualModuleId,\n ASSET_REGISTRY_SRC\n );\n return {\n type: 'sourceFile',\n filePath: virtualModuleId,\n } as const;\n };\n\n // If Node.js pass-through, then remap to a module like `module.exports = $$require_external(<module>)`.\n // If module should be shimmed, remap to an empty module.\n const externals: {\n match: (context: ResolutionContext, moduleName: string, platform: string | null) => boolean;\n replace: 'empty' | 'node' | 'weak';\n }[] = [\n {\n match: (context: ResolutionContext, moduleName: string) => {\n if (\n // Disable internal externals when exporting for production.\n context.customResolverOptions.exporting ||\n // These externals are only for Node.js environments.\n !isServerEnvironment(context.customResolverOptions?.environment)\n ) {\n return false;\n }\n\n if (context.customResolverOptions?.environment === 'react-server') {\n // Ensure these non-react-server modules are excluded when bundling for React Server Components in development.\n return /^(source-map-support(\\/.*)?|@babel\\/runtime\\/.+|debug|metro-runtime\\/src\\/modules\\/HMRClient|metro|acorn-loose|acorn|chalk|ws|ansi-styles|supports-color|color-convert|has-flag|utf-8-validate|color-name|react-refresh\\/runtime|@remix-run\\/node\\/.+)$/.test(\n moduleName\n );\n }\n\n // TODO: Windows doesn't support externals somehow.\n if (process.platform === 'win32') {\n return /^(source-map-support(\\/.*)?)$/.test(moduleName);\n }\n\n // Extern these modules in standard Node.js environments in development to prevent API routes side-effects\n // from leaking into the dev server process.\n return /^(source-map-support(\\/.*)?|react|@radix-ui\\/.+|@babel\\/runtime\\/.+|react-dom(\\/.+)?|debug|acorn-loose|acorn|css-in-js-utils\\/lib\\/.+|hyphenate-style-name|color|color-string|color-convert|color-name|fontfaceobserver|fast-deep-equal|query-string|escape-string-regexp|invariant|postcss-value-parser|memoize-one|nullthrows|strict-uri-encode|decode-uri-component|split-on-first|filter-obj|warn-once|simple-swizzle|is-arrayish|inline-style-prefixer\\/.+)$/.test(\n moduleName\n );\n },\n replace: 'node',\n },\n // Externals to speed up async split chunks by extern-ing common packages that appear in the root client chunk.\n {\n match: (context: ResolutionContext, moduleName: string, platform: string | null) => {\n if (\n // Disable internal externals when exporting for production.\n context.customResolverOptions.exporting ||\n // These externals are only for client environments.\n isServerEnvironment(context.customResolverOptions?.environment) ||\n // Only enable for client boundaries\n !context.customResolverOptions.clientboundary\n ) {\n return false;\n }\n\n // We don't support this in the resolver at the moment.\n if (moduleName.endsWith('/package.json')) {\n return false;\n }\n\n const isExternal = // Extern these modules in standard Node.js environments.\n /^(deprecated-react-native-prop-types|react|react\\/jsx-dev-runtime|scheduler|react-native|react-dom(\\/.+)?|metro-runtime(\\/.+)?)$/.test(\n moduleName\n ) ||\n // TODO: Add more\n /^@babel\\/runtime\\/helpers\\/(wrapNativeSuper)$/.test(moduleName);\n\n return isExternal;\n },\n replace: 'weak',\n },\n ];\n\n const metroConfigWithCustomResolver = withMetroResolvers(config, [\n // Mock out production react imports in development.\n function requestDevMockProdReact(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n // This resolution is dev-only to prevent bundling the production React packages in development.\n if (!context.dev) return null;\n\n if (\n // Match react-native renderers.\n (platform !== 'web' &&\n context.originModulePath.match(/[\\\\/]node_modules[\\\\/]react-native[\\\\/]/) &&\n moduleName.match(/([\\\\/]ReactFabric|ReactNativeRenderer)-prod/)) ||\n // Match react production imports.\n (moduleName.match(/\\.production(\\.min)?\\.js$/) &&\n // Match if the import originated from a react package.\n context.originModulePath.match(/[\\\\/]node_modules[\\\\/](react[-\\\\/]|scheduler[\\\\/])/))\n ) {\n debug(`Skipping production module: ${moduleName}`);\n // /Users/path/to/expo/node_modules/react/index.js ./cjs/react.production.min.js\n // /Users/path/to/expo/node_modules/react/jsx-dev-runtime.js ./cjs/react-jsx-dev-runtime.production.min.js\n // /Users/path/to/expo/node_modules/react-is/index.js ./cjs/react-is.production.min.js\n // /Users/path/to/expo/node_modules/react-refresh/runtime.js ./cjs/react-refresh-runtime.production.min.js\n // /Users/path/to/expo/node_modules/react-native/node_modules/scheduler/index.native.js ./cjs/scheduler.native.production.min.js\n // /Users/path/to/expo/node_modules/react-native/node_modules/react-is/index.js ./cjs/react-is.production.min.js\n return {\n type: 'empty',\n };\n }\n return null;\n },\n // tsconfig paths\n function requestTsconfigPaths(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n return (\n tsConfigResolve?.(\n {\n originModulePath: context.originModulePath,\n moduleName,\n },\n getOptionalResolver(context, platform)\n ) ?? null\n );\n },\n\n // Node.js externals support\n function requestNodeExternals(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n const isServer =\n context.customResolverOptions?.environment === 'node' ||\n context.customResolverOptions?.environment === 'react-server';\n\n const moduleId = isNodeExternal(moduleName);\n if (!moduleId) {\n return null;\n }\n\n if (\n // In browser runtimes, we want to either resolve a local node module by the same name, or shim the module to\n // prevent crashing when Node.js built-ins are imported.\n !isServer\n ) {\n // Perform optional resolve first. If the module doesn't exist (no module in the node_modules)\n // then we can mock the file to use an empty module.\n const result = getOptionalResolver(context, platform)(moduleName);\n\n if (!result && platform !== 'web') {\n // Preserve previous behavior where native throws an error on node.js internals.\n return null;\n }\n\n return (\n result ?? {\n // In this case, mock the file to use an empty module.\n type: 'empty',\n }\n );\n }\n const contents = `module.exports=$$require_external('node:${moduleId}');`;\n debug(`Virtualizing Node.js \"${moduleId}\"`);\n const virtualModuleId = `\\0node:${moduleId}`;\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualModuleId,\n contents\n );\n return {\n type: 'sourceFile',\n filePath: virtualModuleId,\n };\n },\n\n // Custom externals support\n function requestCustomExternals(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n // We don't support this in the resolver at the moment.\n if (moduleName.endsWith('/package.json')) {\n return null;\n }\n // Skip applying JS externals for CSS files.\n if (/\\.(s?css|sass)$/.test(context.originModulePath)) {\n return null;\n }\n\n const environment = context.customResolverOptions?.environment;\n\n const strictResolve = getStrictResolver(context, platform);\n\n for (const external of externals) {\n if (external.match(context, moduleName, platform)) {\n if (external.replace === 'empty') {\n debug(`Redirecting external \"${moduleName}\" to \"${external.replace}\"`);\n return {\n type: external.replace,\n };\n } else if (external.replace === 'weak') {\n // TODO: Make this use require.resolveWeak again. Previously this was just resolving to the same path.\n const realModule = strictResolve(moduleName);\n const realPath = realModule.type === 'sourceFile' ? realModule.filePath : moduleName;\n const opaqueId = idFactory(realPath, {\n platform: platform!,\n environment,\n });\n\n const contents =\n typeof opaqueId === 'number'\n ? `module.exports=/*${moduleName}*/__r(${opaqueId})`\n : `module.exports=/*${moduleName}*/__r(${JSON.stringify(opaqueId)})`;\n // const contents = `module.exports=/*${moduleName}*/__r(require.resolveWeak('${moduleName}'))`;\n // const generatedModuleId = fastHashMemoized(contents);\n const virtualModuleId = `\\0weak:${opaqueId}`;\n debug('Virtualizing module:', moduleName, '->', virtualModuleId);\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualModuleId,\n contents\n );\n return {\n type: 'sourceFile',\n filePath: virtualModuleId,\n };\n } else if (external.replace === 'node') {\n const contents = `module.exports=$$require_external('${moduleName}')`;\n const virtualModuleId = `\\0node:${moduleName}`;\n debug('Virtualizing Node.js (custom):', moduleName, '->', virtualModuleId);\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualModuleId,\n contents\n );\n return {\n type: 'sourceFile',\n filePath: virtualModuleId,\n };\n } else {\n throw new CommandError(\n `Invalid external alias type: \"${external.replace}\" for module \"${moduleName}\" (platform: ${platform}, originModulePath: ${context.originModulePath})`\n );\n }\n }\n }\n return null;\n },\n\n // Basic moduleId aliases\n function requestAlias(context: ResolutionContext, moduleName: string, platform: string | null) {\n // Conditionally remap `react-native` to `react-native-web` on web in\n // a way that doesn't require Babel to resolve the alias.\n if (platform && platform in aliases && aliases[platform][moduleName]) {\n const redirectedModuleName = aliases[platform][moduleName];\n return getStrictResolver(context, platform)(redirectedModuleName);\n }\n\n for (const [matcher, alias] of getUniversalAliases()) {\n const match = moduleName.match(matcher);\n if (match) {\n const aliasedModule = alias.replace(\n /\\$(\\d+)/g,\n (_, index) => match[parseInt(index, 10)] ?? ''\n );\n const doResolve = getStrictResolver(context, platform);\n debug(`Alias \"${moduleName}\" to \"${aliasedModule}\"`);\n return doResolve(aliasedModule);\n }\n }\n\n return null;\n },\n\n // Polyfill for asset registry\n function requestStableAssetRegistry(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n if (/^@react-native\\/assets-registry\\/registry(\\.js)?$/.test(moduleName)) {\n return getAssetRegistryModule();\n }\n\n if (\n platform === 'web' &&\n context.originModulePath.match(/node_modules[\\\\/]react-native-web[\\\\/]/) &&\n moduleName.includes('/modules/AssetRegistry')\n ) {\n return getAssetRegistryModule();\n }\n\n return null;\n },\n\n // TODO: Reduce these as much as possible in the future.\n // Complex post-resolution rewrites.\n function requestPostRewrites(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n const doResolve = getStrictResolver(context, platform);\n\n const result = doResolve(moduleName);\n\n if (result.type !== 'sourceFile') {\n return result;\n }\n\n if (platform === 'web') {\n if (result.filePath.includes('node_modules')) {\n // // Disallow importing confusing native modules on web\n if (moduleName.includes('react-native/Libraries/Utilities/codegenNativeCommands')) {\n throw new FailedToResolvePathError(\n `Importing native-only module \"${moduleName}\" on web from: ${context.originModulePath}`\n );\n }\n\n // Replace with static shims\n\n const normalName = normalizeSlashes(result.filePath)\n // Drop everything up until the `node_modules` folder.\n .replace(/.*node_modules\\//, '');\n\n const shimFile = shouldCreateVirtualShim(normalName);\n if (shimFile) {\n const virtualId = `\\0shim:${normalName}`;\n const bundler = getMetroBundlerWithVirtualModules(getMetroBundler());\n if (!bundler.hasVirtualModule(virtualId)) {\n bundler.setVirtualModule(virtualId, fs.readFileSync(shimFile, 'utf8'));\n }\n debug(`Redirecting module \"${result.filePath}\" to shim`);\n\n return {\n ...result,\n filePath: virtualId,\n };\n }\n }\n } else {\n const isServer =\n context.customResolverOptions?.environment === 'node' ||\n context.customResolverOptions?.environment === 'react-server';\n\n // react-native/Libraries/Core/InitializeCore\n const normal = normalizeSlashes(result.filePath);\n\n // Shim out React Native native runtime globals in server mode for native.\n if (isServer) {\n if (normal.endsWith('react-native/Libraries/Core/InitializeCore.js')) {\n debug('Shimming out InitializeCore for React Native in native SSR bundle');\n return {\n type: 'empty',\n };\n }\n }\n\n // When server components are enabled, redirect React Native's renderer to the canary build\n // this will enable the use hook and other requisite features from React 19.\n if (isReactCanaryEnabled && result.filePath.includes('node_modules')) {\n const normalName = normalizeSlashes(result.filePath)\n // Drop everything up until the `node_modules` folder.\n .replace(/.*node_modules\\//, '');\n\n const canaryFile = shouldCreateVirtualCanary(normalName);\n if (canaryFile) {\n debug(`Redirecting React Native module \"${result.filePath}\" to canary build`);\n return {\n ...result,\n filePath: canaryFile,\n };\n }\n }\n }\n\n return result;\n },\n\n // If at this point, we haven't resolved a module yet, if it's a module specifier for a known dependency\n // of either `expo` or `expo-router`, attempt to resolve it from these origin modules instead\n createFallbackModuleResolver({\n projectRoot: config.projectRoot,\n originModuleNames: ['expo', 'expo-router'],\n getStrictResolver,\n }),\n ]);\n\n // Ensure we mutate the resolution context to include the custom resolver options for server and web.\n const metroConfigWithCustomContext = withMetroMutatedResolverContext(\n metroConfigWithCustomResolver,\n (\n immutableContext: CustomResolutionContext,\n moduleName: string,\n platform: string | null\n ): CustomResolutionContext => {\n const context: Mutable<CustomResolutionContext> = {\n ...immutableContext,\n preferNativePlatform: platform !== 'web',\n };\n\n // TODO: Remove this when we have React 19 in the expo/expo monorepo.\n if (\n isReactCanaryEnabled &&\n // Change the node modules path for react and react-dom to use the vendor in Expo CLI.\n /^(react|react\\/.*|react-dom|react-dom\\/.*)$/.test(moduleName)\n ) {\n context.nodeModulesPaths = [\n path.join(require.resolve('@expo/cli/package.json'), '../static/canary-full'),\n ];\n }\n\n if (isServerEnvironment(context.customResolverOptions?.environment)) {\n // Adjust nodejs source extensions to sort mjs after js, including platform variants.\n if (nodejsSourceExtensions === null) {\n nodejsSourceExtensions = getNodejsExtensions(context.sourceExts);\n }\n context.sourceExts = nodejsSourceExtensions;\n\n context.unstable_enablePackageExports = true;\n context.unstable_conditionsByPlatform = {};\n\n const isReactServerComponents =\n context.customResolverOptions?.environment === 'react-server';\n\n if (isReactServerComponents) {\n // NOTE: Align the behavior across server and client. This is a breaking change so we'll just roll it out with React Server Components.\n // This ensures that react-server and client code both resolve `module` and `main` in the same order.\n if (platform === 'web') {\n // Node.js runtimes should only be importing main at the moment.\n // This is a temporary fix until we can support the package.json exports.\n context.mainFields = ['module', 'main'];\n } else {\n // In Node.js + native, use the standard main fields.\n context.mainFields = ['react-native', 'module', 'main'];\n }\n } else {\n if (platform === 'web') {\n // Node.js runtimes should only be importing main at the moment.\n // This is a temporary fix until we can support the package.json exports.\n context.mainFields = ['main', 'module'];\n } else {\n // In Node.js + native, use the standard main fields.\n context.mainFields = ['react-native', 'main', 'module'];\n }\n }\n\n // Enable react-server import conditions.\n if (context.customResolverOptions?.environment === 'react-server') {\n context.unstable_conditionNames = ['node', 'react-server', 'workerd'];\n } else {\n context.unstable_conditionNames = ['node'];\n }\n } else {\n // Non-server changes\n\n if (!env.EXPO_METRO_NO_MAIN_FIELD_OVERRIDE && platform && platform in preferredMainFields) {\n context.mainFields = preferredMainFields[platform];\n }\n }\n\n return context;\n }\n );\n\n return withMetroErrorReportingResolver(metroConfigWithCustomContext);\n}\n\n/** @returns `true` if the incoming resolution should be swapped. */\nexport function shouldAliasModule(\n input: {\n platform: string | null;\n result: Resolution;\n },\n alias: { platform: string; output: string }\n): boolean {\n return (\n input.platform === alias.platform &&\n input.result?.type === 'sourceFile' &&\n typeof input.result?.filePath === 'string' &&\n normalizeSlashes(input.result.filePath).endsWith(alias.output)\n );\n}\n\n/** Add support for `react-native-web` and the Web platform. */\nexport async function withMetroMultiPlatformAsync(\n projectRoot: string,\n {\n config,\n exp,\n platformBundlers,\n isTsconfigPathsEnabled,\n isFastResolverEnabled,\n isExporting,\n isReactCanaryEnabled,\n isNamedRequiresEnabled,\n isReactServerComponentsEnabled,\n getMetroBundler,\n }: {\n config: ConfigT;\n exp: ExpoConfig;\n isTsconfigPathsEnabled: boolean;\n platformBundlers: PlatformBundlers;\n isFastResolverEnabled?: boolean;\n isExporting?: boolean;\n isReactCanaryEnabled: boolean;\n isReactServerComponentsEnabled: boolean;\n isNamedRequiresEnabled: boolean;\n getMetroBundler: () => Bundler;\n }\n) {\n if (isNamedRequiresEnabled) {\n debug('Using Expo metro require runtime.');\n // Change the default metro-runtime to a custom one that supports bundle splitting.\n require('metro-config/src/defaults/defaults').moduleSystem = require.resolve(\n '@expo/cli/build/metro-require/require'\n );\n }\n\n if (!config.projectRoot) {\n // @ts-expect-error: read-only types\n config.projectRoot = projectRoot;\n }\n\n // Required for @expo/metro-runtime to format paths in the web LogBox.\n process.env.EXPO_PUBLIC_PROJECT_ROOT = process.env.EXPO_PUBLIC_PROJECT_ROOT ?? projectRoot;\n\n // This is used for running Expo CLI in development against projects outside the monorepo.\n if (!isDirectoryIn(__dirname, projectRoot)) {\n if (!config.watchFolders) {\n // @ts-expect-error: watchFolders is readonly\n config.watchFolders = [];\n }\n // @ts-expect-error: watchFolders is readonly\n config.watchFolders.push(path.join(require.resolve('metro-runtime/package.json'), '../..'));\n // @ts-expect-error: watchFolders is readonly\n config.watchFolders.push(\n path.join(require.resolve('@expo/metro-config/package.json'), '../..'),\n // For virtual modules\n path.join(require.resolve('expo/package.json'), '..')\n );\n if (isReactCanaryEnabled) {\n // @ts-expect-error: watchFolders is readonly\n config.watchFolders.push(path.join(require.resolve('@expo/cli/package.json'), '..'));\n }\n }\n\n // TODO: Remove this\n // @ts-expect-error: Invalidate the cache when the location of expo-router changes on-disk.\n config.transformer._expoRouterPath = resolveFrom.silent(projectRoot, 'expo-router');\n\n let tsconfig: null | TsConfigPaths = null;\n\n if (isTsconfigPathsEnabled) {\n tsconfig = await loadTsConfigPathsAsync(projectRoot);\n }\n\n let expoConfigPlatforms = Object.entries(platformBundlers)\n .filter(\n ([platform, bundler]) => bundler === 'metro' && exp.platforms?.includes(platform as Platform)\n )\n .map(([platform]) => platform);\n\n if (Array.isArray(config.resolver.platforms)) {\n expoConfigPlatforms = [...new Set(expoConfigPlatforms.concat(config.resolver.platforms))];\n }\n\n // @ts-expect-error: typed as `readonly`.\n config.resolver.platforms = expoConfigPlatforms;\n\n config = withWebPolyfills(config, { getMetroBundler });\n\n return withExtendedResolver(config, {\n tsconfig,\n isExporting,\n isTsconfigPathsEnabled,\n isFastResolverEnabled,\n isReactCanaryEnabled,\n isReactServerComponentsEnabled,\n getMetroBundler,\n });\n}\n\nfunction isDirectoryIn(targetPath: string, rootPath: string) {\n return targetPath.startsWith(rootPath) && targetPath.length >= rootPath.length;\n}\n"],"names":["getNodejsExtensions","shouldAliasModule","withExtendedResolver","withMetroMultiPlatformAsync","ASSET_REGISTRY_SRC","debug","require","withWebPolyfills","config","getMetroBundler","originalGetPolyfills","serializer","getPolyfills","bind","ctx","virtualEnvVarId","getMetroBundlerWithVirtualModules","setVirtualModule","virtualModuleId","platform","resolve","polyfills","normalizeSlashes","p","replace","srcExts","mjsExts","filter","ext","test","nodejsSourceExtensions","jsIndex","reduce","index","i","splice","tsconfig","isTsconfigPathsEnabled","isFastResolverEnabled","isExporting","isReactCanaryEnabled","isReactServerComponentsEnabled","Log","warn","log","chalk","dim","defaultResolver","metroResolver","resolver","createFastResolver","preserveSymlinks","blockList","Array","isArray","aliases","web","_universalAliases","getUniversalAliases","resolveFrom","silent","projectRoot","push","preferredMainFields","tsConfigResolve","paths","baseUrl","resolveWithTsConfigPaths","hasBaseUrl","isInteractive","configWatcher","FileNotifier","startObserving","loadTsConfigPathsAsync","then","tsConfigPaths","Object","keys","length","installExitHooks","stopObserving","getStrictResolver","resolveRequest","context","doResolve","moduleName","getOptionalResolver","optionalResolve","error","isResolutionError","isFailedToResolveNameError","isFailedToResolvePathError","idFactory","createModuleIdFactory","id","getAssetRegistryModule","type","filePath","externals","match","customResolverOptions","exporting","isServerEnvironment","environment","process","clientboundary","endsWith","isExternal","metroConfigWithCustomResolver","withMetroResolvers","requestDevMockProdReact","dev","originModulePath","requestTsconfigPaths","requestNodeExternals","isServer","moduleId","isNodeExternal","result","contents","requestCustomExternals","strictResolve","external","realModule","realPath","opaqueId","JSON","stringify","CommandError","requestAlias","redirectedModuleName","matcher","alias","aliasedModule","_","parseInt","requestStableAssetRegistry","includes","requestPostRewrites","FailedToResolvePathError","normalName","shimFile","shouldCreateVirtualShim","virtualId","bundler","hasVirtualModule","fs","readFileSync","normal","canaryFile","shouldCreateVirtualCanary","createFallbackModuleResolver","originModuleNames","metroConfigWithCustomContext","withMetroMutatedResolverContext","immutableContext","preferNativePlatform","nodeModulesPaths","path","join","sourceExts","unstable_enablePackageExports","unstable_conditionsByPlatform","isReactServerComponents","mainFields","unstable_conditionNames","env","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","withMetroErrorReportingResolver","input","output","exp","platformBundlers","isNamedRequiresEnabled","moduleSystem","EXPO_PUBLIC_PROJECT_ROOT","isDirectoryIn","__dirname","watchFolders","transformer","_expoRouterPath","expoConfigPlatforms","entries","platforms","map","Set","concat","targetPath","rootPath","startsWith"],"mappings":"AAAA;;;;;CAKC;;;;;;;;;;;IAmHeA,mBAAmB;eAAnBA;;IAmpBAC,iBAAiB;eAAjBA;;IA7nBAC,oBAAoB;eAApBA;;IA6oBMC,2BAA2B;eAA3BA;;;;gEApxBJ;;;;;;;gEACH;;;;;;;iEAIgB;;;;;;;gEACd;;;;;;;gEACO;;;;;;4CAEqB;yCACgB;2BACsB;6BACZ;qCACrB;oCAK3C;qBACa;8BACS;qBACT;wBACS;sBACI;6BACH;mCACwB;0CACb;8BACL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWpC,MAAMC,qBAAqB,CAAC,6FAA6F,CAAC;AAE1H,MAAMC,QAAQC,QAAQ,SAAS;AAE/B,SAASC,iBACPC,MAAe,EACf,EACEC,eAAe,EAGhB;IAED,MAAMC,uBAAuBF,OAAOG,UAAU,CAACC,YAAY,GACvDJ,OAAOG,UAAU,CAACC,YAAY,CAACC,IAAI,CAACL,OAAOG,UAAU,IACrD,IAAM,EAAE;IAEZ,MAAMC,eAAe,CAACE;QACpB,MAAMC,kBAAkB,CAAC,gCAAgC,CAAC;QAE1DC,IAAAA,sDAAiC,EAACP,mBAAmBQ,gBAAgB,CACnEF,iBACA,AAAC,CAAA;YACC,OAAO,CAAC,EAAE,CAAC;QACb,CAAA;QAGF,MAAMG,kBAAkB,CAAC,2BAA2B,CAAC;QAErDF,IAAAA,sDAAiC,EAACP,mBAAmBQ,gBAAgB,CACnEC,iBACA,AAAC,CAAA;YACC,IAAIJ,IAAIK,QAAQ,KAAK,OAAO;gBAC1B,OAAO,CAAC,iFAAiF,CAAC;YAC5F,OAAO;gBACL,wCAAwC;gBACxC,OAAO;YACT;QACF,CAAA;QAGF,IAAIL,IAAIK,QAAQ,KAAK,OAAO;YAC1B,OAAO;gBACLD;gBACAH;gBACA,2EAA2E;gBAC3E,qCAAqC;gBACrC,gHAAgH;gBAChHT,QAAQc,OAAO,CAAC;aACjB;QACH;QAEA,oCAAoC;QACpC,MAAMC,YAAYX,qBAAqBI;QACvC,OAAO;eACFO;YACHH;YACAH;YACA,oDAAoD;YACpDT,QAAQc,OAAO,CAAC;SACjB;IACH;IAEA,OAAO;QACL,GAAGZ,MAAM;QACTG,YAAY;YACV,GAAGH,OAAOG,UAAU;YACpBC;QACF;IACF;AACF;AAEA,SAASU,iBAAiBC,CAAS;IACjC,OAAOA,EAAEC,OAAO,CAAC,OAAO;AAC1B;AAEO,SAASxB,oBAAoByB,OAA0B;IAC5D,MAAMC,UAAUD,QAAQE,MAAM,CAAC,CAACC,MAAQ,OAAOC,IAAI,CAACD;IACpD,MAAME,yBAAyBL,QAAQE,MAAM,CAAC,CAACC,MAAQ,CAAC,OAAOC,IAAI,CAACD;IACpE,sCAAsC;IACtC,MAAMG,UAAUD,uBAAuBE,MAAM,CAAC,CAACC,OAAOL,KAAKM;QACzD,OAAO,QAAQL,IAAI,CAACD,OAAOM,IAAID;IACjC,GAAG,CAAC;IAEJ,oDAAoD;IACpDH,uBAAuBK,MAAM,CAACJ,UAAU,GAAG,MAAML;IAEjD,OAAOI;AACT;AAUO,SAAS5B,qBACdM,MAAe,EACf,EACE4B,QAAQ,EACRC,sBAAsB,EACtBC,qBAAqB,EACrBC,WAAW,EACXC,oBAAoB,EACpBC,8BAA8B,EAC9BhC,eAAe,EAShB;QAgBiBD,kBAEMA,mBACZA,mBACCA,mBAuHMA,0CAAAA;IAzInB,IAAIiC,gCAAgC;QAClCC,QAAG,CAACC,IAAI,CAAC,CAAC,0CAA0C,CAAC;IACvD;IACA,IAAIH,sBAAsB;QACxBE,QAAG,CAACC,IAAI,CAAC,CAAC,wCAAwC,CAAC;IACrD;IACA,IAAIL,uBAAuB;QACzBI,QAAG,CAACE,GAAG,CAACC,gBAAK,CAACC,GAAG,CAAC,yBAAyB,CAAC;IAC9C;IAEA,MAAMC,kBAAkBC,iBAAc5B,OAAO;IAC7C,MAAM6B,WAAWX,wBACbY,IAAAA,2CAAkB,EAAC;QACjBC,kBAAkB;QAClBC,WAAW,GAAC5C,mBAAAA,OAAOyC,QAAQ,qBAAfzC,iBAAiB4C,SAAS,IAClC,EAAE,GACFC,MAAMC,OAAO,EAAC9C,oBAAAA,OAAOyC,QAAQ,qBAAfzC,kBAAiB4C,SAAS,KACtC5C,oBAAAA,OAAOyC,QAAQ,qBAAfzC,kBAAiB4C,SAAS,GAC1B;aAAC5C,oBAAAA,OAAOyC,QAAQ,qBAAfzC,kBAAiB4C,SAAS;SAAC;IACpC,KACAL;IAEJ,MAAMQ,UAAqD;QACzDC,KAAK;YACH,gBAAgB;YAChB,sBAAsB;YACtB,mDAAmD;QACrD;IACF;IAEA,IAAIC;IAEJ,SAASC;QACP,IAAID,mBAAmB;YACrB,OAAOA;QACT;QAEAA,oBAAoB,EAAE;QAEtB,sFAAsF;QACtF,IAAIE,sBAAW,CAACC,MAAM,CAACpD,OAAOqD,WAAW,EAAE,uBAAuB;YAChExD,MAAM;YACNoD,kBAAkBK,IAAI,CAAC;gBAAC;gBAAqC;aAAuB;QACtF;QACA,IAAIrB,gCAAgC;YAClC,IAAIkB,sBAAW,CAACC,MAAM,CAACpD,OAAOqD,WAAW,EAAE,oBAAoB;gBAC7DxD,MAAM;gBACNoD,kBAAkBK,IAAI,CAAC;oBAAC;oBAAiB;iBAAkB;gBAC3D,oHAAoH;gBACpHL,kBAAkBK,IAAI,CAAC;oBAAC;oBAAgC;iBAAwB;YAClF;QACF;QACA,OAAOL;IACT;IAEA,MAAMM,sBAAmD;QACvD,mFAAmF;QACnF,wEAAwE;QACxE,2CAA2C;QAC3CP,KAAK;YAAC;YAAW;YAAU;SAAO;IACpC;IAEA,IAAIQ,kBACF3B,0BAA2BD,CAAAA,CAAAA,4BAAAA,SAAU6B,KAAK,KAAI7B,CAAAA,4BAAAA,SAAU8B,OAAO,KAAI,IAAG,IAClEC,kDAAwB,CAACtD,IAAI,CAACsD,kDAAwB,EAAE;QACtDF,OAAO7B,SAAS6B,KAAK,IAAI,CAAC;QAC1BC,SAAS9B,SAAS8B,OAAO,IAAI1D,OAAOqD,WAAW;QAC/CO,YAAY,CAAC,CAAChC,SAAS8B,OAAO;IAChC,KACA;IAEN,0DAA0D;IAC1D,IAAI,CAAC3B,eAAe8B,IAAAA,0BAAa,KAAI;QACnC,IAAIhC,wBAAwB;YAC1B,4EAA4E;YAC5E,yEAAyE;YACzE,uBAAuB;YACvB,MAAMiC,gBAAgB,IAAIC,0BAAY,CAAC/D,OAAOqD,WAAW,EAAE;gBACzD;gBACA;aACD;YACDS,cAAcE,cAAc,CAAC;gBAC3BnE,MAAM;gBACNoE,IAAAA,yCAAsB,EAACjE,OAAOqD,WAAW,EAAEa,IAAI,CAAC,CAACC;oBAC/C,IAAIA,CAAAA,iCAAAA,cAAeV,KAAK,KAAI,CAAC,CAACW,OAAOC,IAAI,CAACF,cAAcV,KAAK,EAAEa,MAAM,EAAE;wBACrEzE,MAAM;wBACN2D,kBAAkBG,kDAAwB,CAACtD,IAAI,CAACsD,kDAAwB,EAAE;4BACxEF,OAAOU,cAAcV,KAAK,IAAI,CAAC;4BAC/BC,SAASS,cAAcT,OAAO,IAAI1D,OAAOqD,WAAW;4BACpDO,YAAY,CAAC,CAACO,cAAcT,OAAO;wBACrC;oBACF,OAAO;wBACL7D,MAAM;wBACN2D,kBAAkB;oBACpB;gBACF;YACF;YAEA,yDAAyD;YACzDe,IAAAA,sBAAgB,EAAC;gBACfT,cAAcU,aAAa;YAC7B;QACF,OAAO;YACL3E,MAAM;QACR;IACF;IAEA,IAAIyB,yBAA0C;IAE9C,MAAMmD,oBAA2C,CAC/C,EAAEC,cAAc,EAAE,GAAGC,SAAS,EAC9BhE;QAEA,OAAO,SAASiE,UAAUC,UAAkB;YAC1C,OAAOpC,SAASkC,SAASE,YAAYlE;QACvC;IACF;IAEA,SAASmE,oBAAoBH,OAA0B,EAAEhE,QAAuB;QAC9E,MAAMiE,YAAYH,kBAAkBE,SAAShE;QAC7C,OAAO,SAASoE,gBAAgBF,UAAkB;YAChD,IAAI;gBACF,OAAOD,UAAUC;YACnB,EAAE,OAAOG,OAAO;gBACd,0FAA0F;gBAC1F,2FAA2F;gBAC3F,MAAMC,oBACJC,IAAAA,uCAA0B,EAACF,UAAUG,IAAAA,uCAA0B,EAACH;gBAClE,IAAI,CAACC,mBAAmB;oBACtB,MAAMD;gBACR;YACF;YACA,OAAO;QACT;IACF;IAEA,mDAAmD;IACnD,MAAMI,YAAapF,EAAAA,qBAAAA,OAAOG,UAAU,sBAAjBH,2CAAAA,mBAAmBqF,qBAAqB,qBAAxCrF,8CAAAA,wBAChB,CAAA,CAACsF,IAAqBX,UACrBW,EAAC;IAKL,MAAMC,yBAAyB;QAC7B,MAAM7E,kBAAkB,CAAC,0BAA0B,CAAC;QACpDF,IAAAA,sDAAiC,EAACP,mBAAmBQ,gBAAgB,CACnEC,iBACAd;QAEF,OAAO;YACL4F,MAAM;YACNC,UAAU/E;QACZ;IACF;IAEA,wGAAwG;IACxG,yDAAyD;IACzD,MAAMgF,YAGA;QACJ;YACEC,OAAO,CAAChB,SAA4BE;oBAKXF,gCAKnBA;gBATJ,IACE,4DAA4D;gBAC5DA,QAAQiB,qBAAqB,CAACC,SAAS,IACvC,qDAAqD;gBACrD,CAACC,IAAAA,iCAAmB,GAACnB,iCAAAA,QAAQiB,qBAAqB,qBAA7BjB,+BAA+BoB,WAAW,GAC/D;oBACA,OAAO;gBACT;gBAEA,IAAIpB,EAAAA,kCAAAA,QAAQiB,qBAAqB,qBAA7BjB,gCAA+BoB,WAAW,MAAK,gBAAgB;oBACjE,+GAA+G;oBAC/G,OAAO,0PAA0P1E,IAAI,CACnQwD;gBAEJ;gBAEA,mDAAmD;gBACnD,IAAImB,QAAQrF,QAAQ,KAAK,SAAS;oBAChC,OAAO,gCAAgCU,IAAI,CAACwD;gBAC9C;gBAEA,0GAA0G;gBAC1G,4CAA4C;gBAC5C,OAAO,ocAAocxD,IAAI,CAC7cwD;YAEJ;YACA7D,SAAS;QACX;QACA,+GAA+G;QAC/G;YACE2E,OAAO,CAAChB,SAA4BE,YAAoBlE;oBAKhCgE;gBAJtB,IACE,4DAA4D;gBAC5DA,QAAQiB,qBAAqB,CAACC,SAAS,IACvC,oDAAoD;gBACpDC,IAAAA,iCAAmB,GAACnB,iCAAAA,QAAQiB,qBAAqB,qBAA7BjB,+BAA+BoB,WAAW,KAC9D,oCAAoC;gBACpC,CAACpB,QAAQiB,qBAAqB,CAACK,cAAc,EAC7C;oBACA,OAAO;gBACT;gBAEA,uDAAuD;gBACvD,IAAIpB,WAAWqB,QAAQ,CAAC,kBAAkB;oBACxC,OAAO;gBACT;gBAEA,MAAMC,aACJ,mIAAmI9E,IAAI,CACrIwD,eAEF,iBAAiB;gBACjB,gDAAgDxD,IAAI,CAACwD;gBAEvD,OAAOsB;YACT;YACAnF,SAAS;QACX;KACD;IAED,MAAMoF,gCAAgCC,IAAAA,sCAAkB,EAACrG,QAAQ;QAC/D,oDAAoD;QACpD,SAASsG,wBACP3B,OAA0B,EAC1BE,UAAkB,EAClBlE,QAAuB;YAEvB,gGAAgG;YAChG,IAAI,CAACgE,QAAQ4B,GAAG,EAAE,OAAO;YAEzB,IAEE,AADA,gCAAgC;YAC/B5F,aAAa,SACZgE,QAAQ6B,gBAAgB,CAACb,KAAK,CAAC,8CAC/Bd,WAAWc,KAAK,CAAC,kDACnB,kCAAkC;YACjCd,WAAWc,KAAK,CAAC,gCAChB,uDAAuD;YACvDhB,QAAQ6B,gBAAgB,CAACb,KAAK,CAAC,uDACjC;gBACA9F,MAAM,CAAC,4BAA4B,EAAEgF,YAAY;gBACjD,gFAAgF;gBAChF,0GAA0G;gBAC1G,sFAAsF;gBACtF,0GAA0G;gBAC1G,gIAAgI;gBAChI,gHAAgH;gBAChH,OAAO;oBACLW,MAAM;gBACR;YACF;YACA,OAAO;QACT;QACA,iBAAiB;QACjB,SAASiB,qBACP9B,OAA0B,EAC1BE,UAAkB,EAClBlE,QAAuB;YAEvB,OACE6C,CAAAA,mCAAAA,gBACE;gBACEgD,kBAAkB7B,QAAQ6B,gBAAgB;gBAC1C3B;YACF,GACAC,oBAAoBH,SAAShE,eAC1B;QAET;QAEA,4BAA4B;QAC5B,SAAS+F,qBACP/B,OAA0B,EAC1BE,UAAkB,EAClBlE,QAAuB;gBAGrBgE,gCACAA;YAFF,MAAMgC,WACJhC,EAAAA,iCAAAA,QAAQiB,qBAAqB,qBAA7BjB,+BAA+BoB,WAAW,MAAK,UAC/CpB,EAAAA,kCAAAA,QAAQiB,qBAAqB,qBAA7BjB,gCAA+BoB,WAAW,MAAK;YAEjD,MAAMa,WAAWC,IAAAA,yBAAc,EAAChC;YAChC,IAAI,CAAC+B,UAAU;gBACb,OAAO;YACT;YAEA,IACE,6GAA6G;YAC7G,wDAAwD;YACxD,CAACD,UACD;gBACA,8FAA8F;gBAC9F,oDAAoD;gBACpD,MAAMG,SAAShC,oBAAoBH,SAAShE,UAAUkE;gBAEtD,IAAI,CAACiC,UAAUnG,aAAa,OAAO;oBACjC,gFAAgF;oBAChF,OAAO;gBACT;gBAEA,OACEmG,UAAU;oBACR,sDAAsD;oBACtDtB,MAAM;gBACR;YAEJ;YACA,MAAMuB,WAAW,CAAC,wCAAwC,EAAEH,SAAS,GAAG,CAAC;YACzE/G,MAAM,CAAC,sBAAsB,EAAE+G,SAAS,CAAC,CAAC;YAC1C,MAAMlG,kBAAkB,CAAC,OAAO,EAAEkG,UAAU;YAC5CpG,IAAAA,sDAAiC,EAACP,mBAAmBQ,gBAAgB,CACnEC,iBACAqG;YAEF,OAAO;gBACLvB,MAAM;gBACNC,UAAU/E;YACZ;QACF;QAEA,2BAA2B;QAC3B,SAASsG,uBACPrC,OAA0B,EAC1BE,UAAkB,EAClBlE,QAAuB;gBAWHgE;YATpB,uDAAuD;YACvD,IAAIE,WAAWqB,QAAQ,CAAC,kBAAkB;gBACxC,OAAO;YACT;YACA,4CAA4C;YAC5C,IAAI,kBAAkB7E,IAAI,CAACsD,QAAQ6B,gBAAgB,GAAG;gBACpD,OAAO;YACT;YAEA,MAAMT,eAAcpB,iCAAAA,QAAQiB,qBAAqB,qBAA7BjB,+BAA+BoB,WAAW;YAE9D,MAAMkB,gBAAgBxC,kBAAkBE,SAAShE;YAEjD,KAAK,MAAMuG,YAAYxB,UAAW;gBAChC,IAAIwB,SAASvB,KAAK,CAAChB,SAASE,YAAYlE,WAAW;oBACjD,IAAIuG,SAASlG,OAAO,KAAK,SAAS;wBAChCnB,MAAM,CAAC,sBAAsB,EAAEgF,WAAW,MAAM,EAAEqC,SAASlG,OAAO,CAAC,CAAC,CAAC;wBACrE,OAAO;4BACLwE,MAAM0B,SAASlG,OAAO;wBACxB;oBACF,OAAO,IAAIkG,SAASlG,OAAO,KAAK,QAAQ;wBACtC,sGAAsG;wBACtG,MAAMmG,aAAaF,cAAcpC;wBACjC,MAAMuC,WAAWD,WAAW3B,IAAI,KAAK,eAAe2B,WAAW1B,QAAQ,GAAGZ;wBAC1E,MAAMwC,WAAWjC,UAAUgC,UAAU;4BACnCzG,UAAUA;4BACVoF;wBACF;wBAEA,MAAMgB,WACJ,OAAOM,aAAa,WAChB,CAAC,iBAAiB,EAAExC,WAAW,MAAM,EAAEwC,SAAS,CAAC,CAAC,GAClD,CAAC,iBAAiB,EAAExC,WAAW,MAAM,EAAEyC,KAAKC,SAAS,CAACF,UAAU,CAAC,CAAC;wBACxE,gGAAgG;wBAChG,wDAAwD;wBACxD,MAAM3G,kBAAkB,CAAC,OAAO,EAAE2G,UAAU;wBAC5CxH,MAAM,wBAAwBgF,YAAY,MAAMnE;wBAChDF,IAAAA,sDAAiC,EAACP,mBAAmBQ,gBAAgB,CACnEC,iBACAqG;wBAEF,OAAO;4BACLvB,MAAM;4BACNC,UAAU/E;wBACZ;oBACF,OAAO,IAAIwG,SAASlG,OAAO,KAAK,QAAQ;wBACtC,MAAM+F,WAAW,CAAC,mCAAmC,EAAElC,WAAW,EAAE,CAAC;wBACrE,MAAMnE,kBAAkB,CAAC,OAAO,EAAEmE,YAAY;wBAC9ChF,MAAM,kCAAkCgF,YAAY,MAAMnE;wBAC1DF,IAAAA,sDAAiC,EAACP,mBAAmBQ,gBAAgB,CACnEC,iBACAqG;wBAEF,OAAO;4BACLvB,MAAM;4BACNC,UAAU/E;wBACZ;oBACF,OAAO;wBACL,MAAM,IAAI8G,oBAAY,CACpB,CAAC,8BAA8B,EAAEN,SAASlG,OAAO,CAAC,cAAc,EAAE6D,WAAW,aAAa,EAAElE,SAAS,oBAAoB,EAAEgE,QAAQ6B,gBAAgB,CAAC,CAAC,CAAC;oBAE1J;gBACF;YACF;YACA,OAAO;QACT;QAEA,yBAAyB;QACzB,SAASiB,aAAa9C,OAA0B,EAAEE,UAAkB,EAAElE,QAAuB;YAC3F,qEAAqE;YACrE,yDAAyD;YACzD,IAAIA,YAAYA,YAAYoC,WAAWA,OAAO,CAACpC,SAAS,CAACkE,WAAW,EAAE;gBACpE,MAAM6C,uBAAuB3E,OAAO,CAACpC,SAAS,CAACkE,WAAW;gBAC1D,OAAOJ,kBAAkBE,SAAShE,UAAU+G;YAC9C;YAEA,KAAK,MAAM,CAACC,SAASC,MAAM,IAAI1E,sBAAuB;gBACpD,MAAMyC,QAAQd,WAAWc,KAAK,CAACgC;gBAC/B,IAAIhC,OAAO;oBACT,MAAMkC,gBAAgBD,MAAM5G,OAAO,CACjC,YACA,CAAC8G,GAAGrG,QAAUkE,KAAK,CAACoC,SAAStG,OAAO,IAAI,IAAI;oBAE9C,MAAMmD,YAAYH,kBAAkBE,SAAShE;oBAC7Cd,MAAM,CAAC,OAAO,EAAEgF,WAAW,MAAM,EAAEgD,cAAc,CAAC,CAAC;oBACnD,OAAOjD,UAAUiD;gBACnB;YACF;YAEA,OAAO;QACT;QAEA,8BAA8B;QAC9B,SAASG,2BACPrD,OAA0B,EAC1BE,UAAkB,EAClBlE,QAAuB;YAEvB,IAAI,oDAAoDU,IAAI,CAACwD,aAAa;gBACxE,OAAOU;YACT;YAEA,IACE5E,aAAa,SACbgE,QAAQ6B,gBAAgB,CAACb,KAAK,CAAC,6CAC/Bd,WAAWoD,QAAQ,CAAC,2BACpB;gBACA,OAAO1C;YACT;YAEA,OAAO;QACT;QAEA,wDAAwD;QACxD,oCAAoC;QACpC,SAAS2C,oBACPvD,OAA0B,EAC1BE,UAAkB,EAClBlE,QAAuB;YAEvB,MAAMiE,YAAYH,kBAAkBE,SAAShE;YAE7C,MAAMmG,SAASlC,UAAUC;YAEzB,IAAIiC,OAAOtB,IAAI,KAAK,cAAc;gBAChC,OAAOsB;YACT;YAEA,IAAInG,aAAa,OAAO;gBACtB,IAAImG,OAAOrB,QAAQ,CAACwC,QAAQ,CAAC,iBAAiB;oBAC5C,wDAAwD;oBACxD,IAAIpD,WAAWoD,QAAQ,CAAC,2DAA2D;wBACjF,MAAM,IAAIE,iDAAwB,CAChC,CAAC,8BAA8B,EAAEtD,WAAW,eAAe,EAAEF,QAAQ6B,gBAAgB,EAAE;oBAE3F;oBAEA,4BAA4B;oBAE5B,MAAM4B,aAAatH,iBAAiBgG,OAAOrB,QAAQ,CACjD,sDAAsD;qBACrDzE,OAAO,CAAC,oBAAoB;oBAE/B,MAAMqH,WAAWC,IAAAA,kCAAuB,EAACF;oBACzC,IAAIC,UAAU;wBACZ,MAAME,YAAY,CAAC,OAAO,EAAEH,YAAY;wBACxC,MAAMI,UAAUhI,IAAAA,sDAAiC,EAACP;wBAClD,IAAI,CAACuI,QAAQC,gBAAgB,CAACF,YAAY;4BACxCC,QAAQ/H,gBAAgB,CAAC8H,WAAWG,aAAE,CAACC,YAAY,CAACN,UAAU;wBAChE;wBACAxI,MAAM,CAAC,oBAAoB,EAAEiH,OAAOrB,QAAQ,CAAC,SAAS,CAAC;wBAEvD,OAAO;4BACL,GAAGqB,MAAM;4BACTrB,UAAU8C;wBACZ;oBACF;gBACF;YACF,OAAO;oBAEH5D,gCACAA;gBAFF,MAAMgC,WACJhC,EAAAA,iCAAAA,QAAQiB,qBAAqB,qBAA7BjB,+BAA+BoB,WAAW,MAAK,UAC/CpB,EAAAA,kCAAAA,QAAQiB,qBAAqB,qBAA7BjB,gCAA+BoB,WAAW,MAAK;gBAEjD,6CAA6C;gBAC7C,MAAM6C,SAAS9H,iBAAiBgG,OAAOrB,QAAQ;gBAE/C,0EAA0E;gBAC1E,IAAIkB,UAAU;oBACZ,IAAIiC,OAAO1C,QAAQ,CAAC,kDAAkD;wBACpErG,MAAM;wBACN,OAAO;4BACL2F,MAAM;wBACR;oBACF;gBACF;gBAEA,2FAA2F;gBAC3F,4EAA4E;gBAC5E,IAAIxD,wBAAwB8E,OAAOrB,QAAQ,CAACwC,QAAQ,CAAC,iBAAiB;oBACpE,MAAMG,aAAatH,iBAAiBgG,OAAOrB,QAAQ,CACjD,sDAAsD;qBACrDzE,OAAO,CAAC,oBAAoB;oBAE/B,MAAM6H,aAAaC,IAAAA,oCAAyB,EAACV;oBAC7C,IAAIS,YAAY;wBACdhJ,MAAM,CAAC,iCAAiC,EAAEiH,OAAOrB,QAAQ,CAAC,iBAAiB,CAAC;wBAC5E,OAAO;4BACL,GAAGqB,MAAM;4BACTrB,UAAUoD;wBACZ;oBACF;gBACF;YACF;YAEA,OAAO/B;QACT;QAEA,wGAAwG;QACxG,6FAA6F;QAC7FiC,IAAAA,wDAA4B,EAAC;YAC3B1F,aAAarD,OAAOqD,WAAW;YAC/B2F,mBAAmB;gBAAC;gBAAQ;aAAc;YAC1CvE;QACF;KACD;IAED,qGAAqG;IACrG,MAAMwE,+BAA+BC,IAAAA,mDAA+B,EAClE9C,+BACA,CACE+C,kBACAtE,YACAlE;YAkBwBgE;QAhBxB,MAAMA,UAA4C;YAChD,GAAGwE,gBAAgB;YACnBC,sBAAsBzI,aAAa;QACrC;QAEA,qEAAqE;QACrE,IACEqB,wBACA,sFAAsF;QACtF,8CAA8CX,IAAI,CAACwD,aACnD;YACAF,QAAQ0E,gBAAgB,GAAG;gBACzBC,eAAI,CAACC,IAAI,CAACzJ,QAAQc,OAAO,CAAC,2BAA2B;aACtD;QACH;QAEA,IAAIkF,IAAAA,iCAAmB,GAACnB,iCAAAA,QAAQiB,qBAAqB,qBAA7BjB,+BAA+BoB,WAAW,GAAG;gBAWjEpB,iCAyBEA;YAnCJ,qFAAqF;YACrF,IAAIrD,2BAA2B,MAAM;gBACnCA,yBAAyB9B,oBAAoBmF,QAAQ6E,UAAU;YACjE;YACA7E,QAAQ6E,UAAU,GAAGlI;YAErBqD,QAAQ8E,6BAA6B,GAAG;YACxC9E,QAAQ+E,6BAA6B,GAAG,CAAC;YAEzC,MAAMC,0BACJhF,EAAAA,kCAAAA,QAAQiB,qBAAqB,qBAA7BjB,gCAA+BoB,WAAW,MAAK;YAEjD,IAAI4D,yBAAyB;gBAC3B,uIAAuI;gBACvI,qGAAqG;gBACrG,IAAIhJ,aAAa,OAAO;oBACtB,gEAAgE;oBAChE,yEAAyE;oBACzEgE,QAAQiF,UAAU,GAAG;wBAAC;wBAAU;qBAAO;gBACzC,OAAO;oBACL,qDAAqD;oBACrDjF,QAAQiF,UAAU,GAAG;wBAAC;wBAAgB;wBAAU;qBAAO;gBACzD;YACF,OAAO;gBACL,IAAIjJ,aAAa,OAAO;oBACtB,gEAAgE;oBAChE,yEAAyE;oBACzEgE,QAAQiF,UAAU,GAAG;wBAAC;wBAAQ;qBAAS;gBACzC,OAAO;oBACL,qDAAqD;oBACrDjF,QAAQiF,UAAU,GAAG;wBAAC;wBAAgB;wBAAQ;qBAAS;gBACzD;YACF;YAEA,yCAAyC;YACzC,IAAIjF,EAAAA,kCAAAA,QAAQiB,qBAAqB,qBAA7BjB,gCAA+BoB,WAAW,MAAK,gBAAgB;gBACjEpB,QAAQkF,uBAAuB,GAAG;oBAAC;oBAAQ;oBAAgB;iBAAU;YACvE,OAAO;gBACLlF,QAAQkF,uBAAuB,GAAG;oBAAC;iBAAO;YAC5C;QACF,OAAO;YACL,qBAAqB;YAErB,IAAI,CAACC,QAAG,CAACC,iCAAiC,IAAIpJ,YAAYA,YAAY4C,qBAAqB;gBACzFoB,QAAQiF,UAAU,GAAGrG,mBAAmB,CAAC5C,SAAS;YACpD;QACF;QAEA,OAAOgE;IACT;IAGF,OAAOqF,IAAAA,mDAA+B,EAACf;AACzC;AAGO,SAASxJ,kBACdwK,KAGC,EACDrC,KAA2C;QAIzCqC,eACOA;IAHT,OACEA,MAAMtJ,QAAQ,KAAKiH,MAAMjH,QAAQ,IACjCsJ,EAAAA,gBAAAA,MAAMnD,MAAM,qBAAZmD,cAAczE,IAAI,MAAK,gBACvB,SAAOyE,iBAAAA,MAAMnD,MAAM,qBAAZmD,eAAcxE,QAAQ,MAAK,YAClC3E,iBAAiBmJ,MAAMnD,MAAM,CAACrB,QAAQ,EAAES,QAAQ,CAAC0B,MAAMsC,MAAM;AAEjE;AAGO,eAAevK,4BACpB0D,WAAmB,EACnB,EACErD,MAAM,EACNmK,GAAG,EACHC,gBAAgB,EAChBvI,sBAAsB,EACtBC,qBAAqB,EACrBC,WAAW,EACXC,oBAAoB,EACpBqI,sBAAsB,EACtBpI,8BAA8B,EAC9BhC,eAAe,EAYhB;IAED,IAAIoK,wBAAwB;QAC1BxK,MAAM;QACN,mFAAmF;QACnFC,QAAQ,sCAAsCwK,YAAY,GAAGxK,QAAQc,OAAO,CAC1E;IAEJ;IAEA,IAAI,CAACZ,OAAOqD,WAAW,EAAE;QACvB,oCAAoC;QACpCrD,OAAOqD,WAAW,GAAGA;IACvB;IAEA,sEAAsE;IACtE2C,QAAQ8D,GAAG,CAACS,wBAAwB,GAAGvE,QAAQ8D,GAAG,CAACS,wBAAwB,IAAIlH;IAE/E,0FAA0F;IAC1F,IAAI,CAACmH,cAAcC,WAAWpH,cAAc;QAC1C,IAAI,CAACrD,OAAO0K,YAAY,EAAE;YACxB,6CAA6C;YAC7C1K,OAAO0K,YAAY,GAAG,EAAE;QAC1B;QACA,6CAA6C;QAC7C1K,OAAO0K,YAAY,CAACpH,IAAI,CAACgG,eAAI,CAACC,IAAI,CAACzJ,QAAQc,OAAO,CAAC,+BAA+B;QAClF,6CAA6C;QAC7CZ,OAAO0K,YAAY,CAACpH,IAAI,CACtBgG,eAAI,CAACC,IAAI,CAACzJ,QAAQc,OAAO,CAAC,oCAAoC,UAC9D,sBAAsB;QACtB0I,eAAI,CAACC,IAAI,CAACzJ,QAAQc,OAAO,CAAC,sBAAsB;QAElD,IAAIoB,sBAAsB;YACxB,6CAA6C;YAC7ChC,OAAO0K,YAAY,CAACpH,IAAI,CAACgG,eAAI,CAACC,IAAI,CAACzJ,QAAQc,OAAO,CAAC,2BAA2B;QAChF;IACF;IAEA,oBAAoB;IACpB,2FAA2F;IAC3FZ,OAAO2K,WAAW,CAACC,eAAe,GAAGzH,sBAAW,CAACC,MAAM,CAACC,aAAa;IAErE,IAAIzB,WAAiC;IAErC,IAAIC,wBAAwB;QAC1BD,WAAW,MAAMqC,IAAAA,yCAAsB,EAACZ;IAC1C;IAEA,IAAIwH,sBAAsBzG,OAAO0G,OAAO,CAACV,kBACtCjJ,MAAM,CACL,CAAC,CAACR,UAAU6H,QAAQ;YAA4B2B;eAAvB3B,YAAY,aAAW2B,iBAAAA,IAAIY,SAAS,qBAAbZ,eAAelC,QAAQ,CAACtH;OAEzEqK,GAAG,CAAC,CAAC,CAACrK,SAAS,GAAKA;IAEvB,IAAIkC,MAAMC,OAAO,CAAC9C,OAAOyC,QAAQ,CAACsI,SAAS,GAAG;QAC5CF,sBAAsB;eAAI,IAAII,IAAIJ,oBAAoBK,MAAM,CAAClL,OAAOyC,QAAQ,CAACsI,SAAS;SAAG;IAC3F;IAEA,yCAAyC;IACzC/K,OAAOyC,QAAQ,CAACsI,SAAS,GAAGF;IAE5B7K,SAASD,iBAAiBC,QAAQ;QAAEC;IAAgB;IAEpD,OAAOP,qBAAqBM,QAAQ;QAClC4B;QACAG;QACAF;QACAC;QACAE;QACAC;QACAhC;IACF;AACF;AAEA,SAASuK,cAAcW,UAAkB,EAAEC,QAAgB;IACzD,OAAOD,WAAWE,UAAU,CAACD,aAAaD,WAAW7G,MAAM,IAAI8G,SAAS9G,MAAM;AAChF"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/withMetroMultiPlatform.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { ExpoConfig, Platform } from '@expo/config';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport Bundler from 'metro/src/Bundler';\nimport { ConfigT } from 'metro-config';\nimport { Resolution, ResolutionContext, CustomResolutionContext } from 'metro-resolver';\nimport * as metroResolver from 'metro-resolver';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { createFallbackModuleResolver } from './createExpoFallbackResolver';\nimport { createFastResolver, FailedToResolvePathError } from './createExpoMetroResolver';\nimport { isNodeExternal, shouldCreateVirtualCanary, shouldCreateVirtualShim } from './externals';\nimport { isFailedToResolveNameError, isFailedToResolvePathError } from './metroErrors';\nimport { getMetroBundlerWithVirtualModules } from './metroVirtualModules';\nimport {\n withMetroErrorReportingResolver,\n withMetroMutatedResolverContext,\n withMetroResolvers,\n} from './withMetroResolvers';\nimport { Log } from '../../../log';\nimport { FileNotifier } from '../../../utils/FileNotifier';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\nimport { isInteractive } from '../../../utils/interactive';\nimport { loadTsConfigPathsAsync, TsConfigPaths } from '../../../utils/tsconfig/loadTsConfigPaths';\nimport { resolveWithTsConfigPaths } from '../../../utils/tsconfig/resolveWithTsConfigPaths';\nimport { isServerEnvironment } from '../middleware/metroOptions';\nimport { PlatformBundlers } from '../platformBundlers';\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\nexport type StrictResolver = (moduleName: string) => Resolution;\nexport type StrictResolverFactory = (\n context: ResolutionContext,\n platform: string | null\n) => StrictResolver;\n\nconst ASSET_REGISTRY_SRC = `const assets=[];module.exports={registerAsset:s=>assets.push(s),getAssetByID:s=>assets[s-1]};`;\n\nconst debug = require('debug')('expo:start:server:metro:multi-platform') as typeof console.log;\n\nfunction withWebPolyfills(\n config: ConfigT,\n {\n getMetroBundler,\n }: {\n getMetroBundler: () => Bundler;\n }\n): ConfigT {\n const originalGetPolyfills = config.serializer.getPolyfills\n ? config.serializer.getPolyfills.bind(config.serializer)\n : () => [];\n\n const getPolyfills = (ctx: { platform?: string | null }): readonly string[] => {\n const virtualEnvVarId = `\\0polyfill:environment-variables`;\n\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualEnvVarId,\n (() => {\n return `//`;\n })()\n );\n\n const virtualModuleId = `\\0polyfill:external-require`;\n\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualModuleId,\n (() => {\n if (ctx.platform === 'web') {\n return `global.$$require_external = typeof require !== \"undefined\" ? require : () => null;`;\n } else {\n // Wrap in try/catch to support Android.\n return 'try { global.$$require_external = typeof expo === \"undefined\" ? require : (moduleId) => { throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);} } catch { global.$$require_external = (moduleId) => { throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);} }';\n }\n })()\n );\n\n if (ctx.platform === 'web') {\n return [\n virtualModuleId,\n virtualEnvVarId,\n // Ensure that the error-guard polyfill is included in the web polyfills to\n // make metro-runtime work correctly.\n // TODO: This module is pretty big for a function that simply re-throws an error that doesn't need to be caught.\n require.resolve('@react-native/js-polyfills/error-guard'),\n ];\n }\n\n // Generally uses `rn-get-polyfills`\n const polyfills = originalGetPolyfills(ctx);\n return [\n ...polyfills,\n virtualModuleId,\n virtualEnvVarId,\n // Removed on server platforms during the transform.\n require.resolve('expo/virtual/streams.js'),\n ];\n };\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n getPolyfills,\n },\n };\n}\n\nfunction normalizeSlashes(p: string) {\n return p.replace(/\\\\/g, '/');\n}\n\nexport function getNodejsExtensions(srcExts: readonly string[]): string[] {\n const mjsExts = srcExts.filter((ext) => /mjs$/.test(ext));\n const nodejsSourceExtensions = srcExts.filter((ext) => !/mjs$/.test(ext));\n // find index of last `*.js` extension\n const jsIndex = nodejsSourceExtensions.reduce((index, ext, i) => {\n return /jsx?$/.test(ext) ? i : index;\n }, -1);\n\n // insert `*.mjs` extensions after `*.js` extensions\n nodejsSourceExtensions.splice(jsIndex + 1, 0, ...mjsExts);\n\n return nodejsSourceExtensions;\n}\n\n/**\n * Apply custom resolvers to do the following:\n * - Disable `.native.js` extensions on web.\n * - Alias `react-native` to `react-native-web` on web.\n * - Redirect `react-native-web/dist/modules/AssetRegistry/index.js` to `@react-native/assets/registry.js` on web.\n * - Add support for `tsconfig.json`/`jsconfig.json` aliases via `compilerOptions.paths`.\n * - Alias react-native renderer code to a vendored React canary build on native.\n */\nexport function withExtendedResolver(\n config: ConfigT,\n {\n tsconfig,\n isTsconfigPathsEnabled,\n isFastResolverEnabled,\n isExporting,\n isReactCanaryEnabled,\n isReactServerComponentsEnabled,\n getMetroBundler,\n }: {\n tsconfig: TsConfigPaths | null;\n isTsconfigPathsEnabled?: boolean;\n isFastResolverEnabled?: boolean;\n isExporting?: boolean;\n isReactCanaryEnabled?: boolean;\n isReactServerComponentsEnabled?: boolean;\n getMetroBundler: () => Bundler;\n }\n) {\n if (isReactServerComponentsEnabled) {\n Log.warn(`React Server Components (beta) is enabled.`);\n }\n if (isReactCanaryEnabled) {\n Log.warn(`Experimental React 19 canary is enabled.`);\n }\n if (isFastResolverEnabled) {\n Log.log(chalk.dim`Fast resolver is enabled.`);\n }\n\n const defaultResolver = metroResolver.resolve;\n const resolver = isFastResolverEnabled\n ? createFastResolver({\n preserveSymlinks: true,\n blockList: !config.resolver?.blockList\n ? []\n : Array.isArray(config.resolver?.blockList)\n ? config.resolver?.blockList\n : [config.resolver?.blockList],\n })\n : defaultResolver;\n\n const aliases: { [key: string]: Record<string, string> } = {\n web: {\n 'react-native': 'react-native-web',\n 'react-native/index': 'react-native-web',\n 'react-native/Libraries/Image/resolveAssetSource': 'expo-asset/build/resolveAssetSource',\n },\n };\n\n let _universalAliases: [RegExp, string][] | null;\n\n function getUniversalAliases() {\n if (_universalAliases) {\n return _universalAliases;\n }\n\n _universalAliases = [];\n\n // This package is currently always installed as it is included in the `expo` package.\n if (resolveFrom.silent(config.projectRoot, '@expo/vector-icons')) {\n debug('Enabling alias: react-native-vector-icons -> @expo/vector-icons');\n _universalAliases.push([/^react-native-vector-icons(\\/.*)?/, '@expo/vector-icons$1']);\n }\n if (isReactServerComponentsEnabled) {\n if (resolveFrom.silent(config.projectRoot, 'expo-router/rsc')) {\n debug('Enabling bridge alias: expo-router -> expo-router/rsc');\n _universalAliases.push([/^expo-router$/, 'expo-router/rsc']);\n // Bridge the internal entry point which is a standalone import to ensure package.json resolution works as expected.\n _universalAliases.push([/^expo-router\\/entry-classic$/, 'expo-router/rsc/entry']);\n }\n }\n return _universalAliases;\n }\n\n const preferredMainFields: { [key: string]: string[] } = {\n // Defaults from Expo Webpack. Most packages using `react-native` don't support web\n // in the `react-native` field, so we should prefer the `browser` field.\n // https://github.com/expo/router/issues/37\n web: ['browser', 'module', 'main'],\n };\n\n let tsConfigResolve =\n isTsconfigPathsEnabled && (tsconfig?.paths || tsconfig?.baseUrl != null)\n ? resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsconfig.paths ?? {},\n baseUrl: tsconfig.baseUrl ?? config.projectRoot,\n hasBaseUrl: !!tsconfig.baseUrl,\n })\n : null;\n\n // TODO: Move this to be a transform key for invalidation.\n if (!isExporting && isInteractive()) {\n if (isTsconfigPathsEnabled) {\n // TODO: We should track all the files that used imports and invalidate them\n // currently the user will need to save all the files that use imports to\n // use the new aliases.\n const configWatcher = new FileNotifier(config.projectRoot, [\n './tsconfig.json',\n './jsconfig.json',\n ]);\n configWatcher.startObserving(() => {\n debug('Reloading tsconfig.json');\n loadTsConfigPathsAsync(config.projectRoot).then((tsConfigPaths) => {\n if (tsConfigPaths?.paths && !!Object.keys(tsConfigPaths.paths).length) {\n debug('Enabling tsconfig.json paths support');\n tsConfigResolve = resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsConfigPaths.paths ?? {},\n baseUrl: tsConfigPaths.baseUrl ?? config.projectRoot,\n hasBaseUrl: !!tsConfigPaths.baseUrl,\n });\n } else {\n debug('Disabling tsconfig.json paths support');\n tsConfigResolve = null;\n }\n });\n });\n\n // TODO: This probably prevents the process from exiting.\n installExitHooks(() => {\n configWatcher.stopObserving();\n });\n } else {\n debug('Skipping tsconfig.json paths support');\n }\n }\n\n let nodejsSourceExtensions: string[] | null = null;\n\n const getStrictResolver: StrictResolverFactory = (\n { resolveRequest, ...context },\n platform\n ): StrictResolver => {\n return function doResolve(moduleName: string): Resolution {\n return resolver(context, moduleName, platform);\n };\n };\n\n function getOptionalResolver(context: ResolutionContext, platform: string | null) {\n const doResolve = getStrictResolver(context, platform);\n return function optionalResolve(moduleName: string): Resolution | null {\n try {\n return doResolve(moduleName);\n } catch (error) {\n // If the error is directly related to a resolver not being able to resolve a module, then\n // we can ignore the error and try the next resolver. Otherwise, we should throw the error.\n const isResolutionError =\n isFailedToResolveNameError(error) || isFailedToResolvePathError(error);\n if (!isResolutionError) {\n throw error;\n }\n }\n return null;\n };\n }\n\n // TODO: This is a hack to get resolveWeak working.\n const idFactory = (config.serializer?.createModuleIdFactory?.() ??\n ((id: number | string, context: { platform: string; environment?: string }): number | string =>\n id)) as (\n id: number | string,\n context: { platform: string; environment?: string }\n ) => number | string;\n\n const getAssetRegistryModule = () => {\n const virtualModuleId = `\\0polyfill:assets-registry`;\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualModuleId,\n ASSET_REGISTRY_SRC\n );\n return {\n type: 'sourceFile',\n filePath: virtualModuleId,\n } as const;\n };\n\n // If Node.js pass-through, then remap to a module like `module.exports = $$require_external(<module>)`.\n // If module should be shimmed, remap to an empty module.\n const externals: {\n match: (context: ResolutionContext, moduleName: string, platform: string | null) => boolean;\n replace: 'empty' | 'node' | 'weak';\n }[] = [\n {\n match: (context: ResolutionContext, moduleName: string) => {\n if (\n // Disable internal externals when exporting for production.\n context.customResolverOptions.exporting ||\n // These externals are only for Node.js environments.\n !isServerEnvironment(context.customResolverOptions?.environment)\n ) {\n return false;\n }\n\n if (context.customResolverOptions?.environment === 'react-server') {\n // Ensure these non-react-server modules are excluded when bundling for React Server Components in development.\n return /^(source-map-support(\\/.*)?|@babel\\/runtime\\/.+|debug|metro-runtime\\/src\\/modules\\/HMRClient|metro|acorn-loose|acorn|chalk|ws|ansi-styles|supports-color|color-convert|has-flag|utf-8-validate|color-name|react-refresh\\/runtime|@remix-run\\/node\\/.+)$/.test(\n moduleName\n );\n }\n\n // TODO: Windows doesn't support externals somehow.\n if (process.platform === 'win32') {\n return /^(source-map-support(\\/.*)?)$/.test(moduleName);\n }\n\n // Extern these modules in standard Node.js environments in development to prevent API routes side-effects\n // from leaking into the dev server process.\n return /^(source-map-support(\\/.*)?|react|@radix-ui\\/.+|@babel\\/runtime\\/.+|react-dom(\\/.+)?|debug|acorn-loose|acorn|css-in-js-utils\\/lib\\/.+|hyphenate-style-name|color|color-string|color-convert|color-name|fontfaceobserver|fast-deep-equal|query-string|escape-string-regexp|invariant|postcss-value-parser|memoize-one|nullthrows|strict-uri-encode|decode-uri-component|split-on-first|filter-obj|warn-once|simple-swizzle|is-arrayish|inline-style-prefixer\\/.+)$/.test(\n moduleName\n );\n },\n replace: 'node',\n },\n // Externals to speed up async split chunks by extern-ing common packages that appear in the root client chunk.\n {\n match: (context: ResolutionContext, moduleName: string, platform: string | null) => {\n if (\n // Disable internal externals when exporting for production.\n context.customResolverOptions.exporting ||\n // These externals are only for client environments.\n isServerEnvironment(context.customResolverOptions?.environment) ||\n // Only enable for client boundaries\n !context.customResolverOptions.clientboundary\n ) {\n return false;\n }\n\n // We don't support this in the resolver at the moment.\n if (moduleName.endsWith('/package.json')) {\n return false;\n }\n\n const isExternal = // Extern these modules in standard Node.js environments.\n /^(deprecated-react-native-prop-types|react|react\\/jsx-dev-runtime|scheduler|react-native|react-dom(\\/.+)?|metro-runtime(\\/.+)?)$/.test(\n moduleName\n ) ||\n // TODO: Add more\n /^@babel\\/runtime\\/helpers\\/(wrapNativeSuper)$/.test(moduleName);\n\n return isExternal;\n },\n replace: 'weak',\n },\n ];\n\n const metroConfigWithCustomResolver = withMetroResolvers(config, [\n // Mock out production react imports in development.\n function requestDevMockProdReact(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n // This resolution is dev-only to prevent bundling the production React packages in development.\n if (!context.dev) return null;\n\n if (\n // Match react-native renderers.\n (platform !== 'web' &&\n context.originModulePath.match(/[\\\\/]node_modules[\\\\/]react-native[\\\\/]/) &&\n moduleName.match(/([\\\\/]ReactFabric|ReactNativeRenderer)-prod/)) ||\n // Match react production imports.\n (moduleName.match(/\\.production(\\.min)?\\.js$/) &&\n // Match if the import originated from a react package.\n context.originModulePath.match(/[\\\\/]node_modules[\\\\/](react[-\\\\/]|scheduler[\\\\/])/))\n ) {\n debug(`Skipping production module: ${moduleName}`);\n // /Users/path/to/expo/node_modules/react/index.js ./cjs/react.production.min.js\n // /Users/path/to/expo/node_modules/react/jsx-dev-runtime.js ./cjs/react-jsx-dev-runtime.production.min.js\n // /Users/path/to/expo/node_modules/react-is/index.js ./cjs/react-is.production.min.js\n // /Users/path/to/expo/node_modules/react-refresh/runtime.js ./cjs/react-refresh-runtime.production.min.js\n // /Users/path/to/expo/node_modules/react-native/node_modules/scheduler/index.native.js ./cjs/scheduler.native.production.min.js\n // /Users/path/to/expo/node_modules/react-native/node_modules/react-is/index.js ./cjs/react-is.production.min.js\n return {\n type: 'empty',\n };\n }\n return null;\n },\n // tsconfig paths\n function requestTsconfigPaths(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n return (\n tsConfigResolve?.(\n {\n originModulePath: context.originModulePath,\n moduleName,\n },\n getOptionalResolver(context, platform)\n ) ?? null\n );\n },\n\n // Node.js externals support\n function requestNodeExternals(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n const isServer =\n context.customResolverOptions?.environment === 'node' ||\n context.customResolverOptions?.environment === 'react-server';\n\n const moduleId = isNodeExternal(moduleName);\n if (!moduleId) {\n return null;\n }\n\n if (\n // In browser runtimes, we want to either resolve a local node module by the same name, or shim the module to\n // prevent crashing when Node.js built-ins are imported.\n !isServer\n ) {\n // Perform optional resolve first. If the module doesn't exist (no module in the node_modules)\n // then we can mock the file to use an empty module.\n const result = getOptionalResolver(context, platform)(moduleName);\n\n if (!result && platform !== 'web') {\n // Preserve previous behavior where native throws an error on node.js internals.\n return null;\n }\n\n return (\n result ?? {\n // In this case, mock the file to use an empty module.\n type: 'empty',\n }\n );\n }\n const contents = `module.exports=$$require_external('node:${moduleId}');`;\n debug(`Virtualizing Node.js \"${moduleId}\"`);\n const virtualModuleId = `\\0node:${moduleId}`;\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualModuleId,\n contents\n );\n return {\n type: 'sourceFile',\n filePath: virtualModuleId,\n };\n },\n\n // Custom externals support\n function requestCustomExternals(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n // We don't support this in the resolver at the moment.\n if (moduleName.endsWith('/package.json')) {\n return null;\n }\n // Skip applying JS externals for CSS files.\n if (/\\.(s?css|sass)$/.test(context.originModulePath)) {\n return null;\n }\n\n const environment = context.customResolverOptions?.environment;\n\n const strictResolve = getStrictResolver(context, platform);\n\n for (const external of externals) {\n if (external.match(context, moduleName, platform)) {\n if (external.replace === 'empty') {\n debug(`Redirecting external \"${moduleName}\" to \"${external.replace}\"`);\n return {\n type: external.replace,\n };\n } else if (external.replace === 'weak') {\n // TODO: Make this use require.resolveWeak again. Previously this was just resolving to the same path.\n const realModule = strictResolve(moduleName);\n const realPath = realModule.type === 'sourceFile' ? realModule.filePath : moduleName;\n const opaqueId = idFactory(realPath, {\n platform: platform!,\n environment,\n });\n\n const contents =\n typeof opaqueId === 'number'\n ? `module.exports=/*${moduleName}*/__r(${opaqueId})`\n : `module.exports=/*${moduleName}*/__r(${JSON.stringify(opaqueId)})`;\n // const contents = `module.exports=/*${moduleName}*/__r(require.resolveWeak('${moduleName}'))`;\n // const generatedModuleId = fastHashMemoized(contents);\n const virtualModuleId = `\\0weak:${opaqueId}`;\n debug('Virtualizing module:', moduleName, '->', virtualModuleId);\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualModuleId,\n contents\n );\n return {\n type: 'sourceFile',\n filePath: virtualModuleId,\n };\n } else if (external.replace === 'node') {\n const contents = `module.exports=$$require_external('${moduleName}')`;\n const virtualModuleId = `\\0node:${moduleName}`;\n debug('Virtualizing Node.js (custom):', moduleName, '->', virtualModuleId);\n getMetroBundlerWithVirtualModules(getMetroBundler()).setVirtualModule(\n virtualModuleId,\n contents\n );\n return {\n type: 'sourceFile',\n filePath: virtualModuleId,\n };\n } else {\n throw new CommandError(\n `Invalid external alias type: \"${external.replace}\" for module \"${moduleName}\" (platform: ${platform}, originModulePath: ${context.originModulePath})`\n );\n }\n }\n }\n return null;\n },\n\n // Basic moduleId aliases\n function requestAlias(context: ResolutionContext, moduleName: string, platform: string | null) {\n // Conditionally remap `react-native` to `react-native-web` on web in\n // a way that doesn't require Babel to resolve the alias.\n if (platform && platform in aliases && aliases[platform][moduleName]) {\n const redirectedModuleName = aliases[platform][moduleName];\n return getStrictResolver(context, platform)(redirectedModuleName);\n }\n\n for (const [matcher, alias] of getUniversalAliases()) {\n const match = moduleName.match(matcher);\n if (match) {\n const aliasedModule = alias.replace(\n /\\$(\\d+)/g,\n (_, index) => match[parseInt(index, 10)] ?? ''\n );\n const doResolve = getStrictResolver(context, platform);\n debug(`Alias \"${moduleName}\" to \"${aliasedModule}\"`);\n return doResolve(aliasedModule);\n }\n }\n\n return null;\n },\n\n // Polyfill for asset registry\n function requestStableAssetRegistry(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n if (/^@react-native\\/assets-registry\\/registry(\\.js)?$/.test(moduleName)) {\n return getAssetRegistryModule();\n }\n\n if (\n platform === 'web' &&\n context.originModulePath.match(/node_modules[\\\\/]react-native-web[\\\\/]/) &&\n moduleName.includes('/modules/AssetRegistry')\n ) {\n return getAssetRegistryModule();\n }\n\n return null;\n },\n\n // TODO: Reduce these as much as possible in the future.\n // Complex post-resolution rewrites.\n function requestPostRewrites(\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n const doResolve = getStrictResolver(context, platform);\n\n const result = doResolve(moduleName);\n\n if (result.type !== 'sourceFile') {\n return result;\n }\n\n if (platform === 'web') {\n if (result.filePath.includes('node_modules')) {\n // // Disallow importing confusing native modules on web\n if (moduleName.includes('react-native/Libraries/Utilities/codegenNativeCommands')) {\n throw new FailedToResolvePathError(\n `Importing native-only module \"${moduleName}\" on web from: ${context.originModulePath}`\n );\n }\n\n // Replace with static shims\n\n const normalName = normalizeSlashes(result.filePath)\n // Drop everything up until the `node_modules` folder.\n .replace(/.*node_modules\\//, '');\n\n const shimFile = shouldCreateVirtualShim(normalName);\n if (shimFile) {\n const virtualId = `\\0shim:${normalName}`;\n const bundler = getMetroBundlerWithVirtualModules(getMetroBundler());\n if (!bundler.hasVirtualModule(virtualId)) {\n bundler.setVirtualModule(virtualId, fs.readFileSync(shimFile, 'utf8'));\n }\n debug(`Redirecting module \"${result.filePath}\" to shim`);\n\n return {\n ...result,\n filePath: virtualId,\n };\n }\n }\n } else {\n const isServer =\n context.customResolverOptions?.environment === 'node' ||\n context.customResolverOptions?.environment === 'react-server';\n\n // react-native/Libraries/Core/InitializeCore\n const normal = normalizeSlashes(result.filePath);\n\n // Shim out React Native native runtime globals in server mode for native.\n if (isServer) {\n if (normal.endsWith('react-native/Libraries/Core/InitializeCore.js')) {\n debug('Shimming out InitializeCore for React Native in native SSR bundle');\n return {\n type: 'empty',\n };\n }\n }\n\n // When server components are enabled, redirect React Native's renderer to the canary build\n // this will enable the use hook and other requisite features from React 19.\n if (isReactCanaryEnabled && result.filePath.includes('node_modules')) {\n const normalName = normalizeSlashes(result.filePath)\n // Drop everything up until the `node_modules` folder.\n .replace(/.*node_modules\\//, '');\n\n const canaryFile = shouldCreateVirtualCanary(normalName);\n if (canaryFile) {\n debug(`Redirecting React Native module \"${result.filePath}\" to canary build`);\n return {\n ...result,\n filePath: canaryFile,\n };\n }\n }\n }\n\n return result;\n },\n\n // If at this point, we haven't resolved a module yet, if it's a module specifier for a known dependency\n // of either `expo` or `expo-router`, attempt to resolve it from these origin modules instead\n createFallbackModuleResolver({\n projectRoot: config.projectRoot,\n originModuleNames: ['expo', 'expo-router'],\n getStrictResolver,\n }),\n ]);\n\n // Ensure we mutate the resolution context to include the custom resolver options for server and web.\n const metroConfigWithCustomContext = withMetroMutatedResolverContext(\n metroConfigWithCustomResolver,\n (\n immutableContext: CustomResolutionContext,\n moduleName: string,\n platform: string | null\n ): CustomResolutionContext => {\n const context: Mutable<CustomResolutionContext> = {\n ...immutableContext,\n preferNativePlatform: platform !== 'web',\n };\n\n // TODO: Remove this when we have React 19 in the expo/expo monorepo.\n if (\n isReactCanaryEnabled &&\n // Change the node modules path for react and react-dom to use the vendor in Expo CLI.\n /^(react|react\\/.*|react-dom|react-dom\\/.*)$/.test(moduleName)\n ) {\n context.nodeModulesPaths = [\n path.join(require.resolve('@expo/cli/package.json'), '../static/canary-full'),\n ];\n }\n\n if (isServerEnvironment(context.customResolverOptions?.environment)) {\n // Adjust nodejs source extensions to sort mjs after js, including platform variants.\n if (nodejsSourceExtensions === null) {\n nodejsSourceExtensions = getNodejsExtensions(context.sourceExts);\n }\n context.sourceExts = nodejsSourceExtensions;\n\n context.unstable_enablePackageExports = true;\n context.unstable_conditionsByPlatform = {};\n\n const isReactServerComponents =\n context.customResolverOptions?.environment === 'react-server';\n\n if (isReactServerComponents) {\n // NOTE: Align the behavior across server and client. This is a breaking change so we'll just roll it out with React Server Components.\n // This ensures that react-server and client code both resolve `module` and `main` in the same order.\n if (platform === 'web') {\n // Node.js runtimes should only be importing main at the moment.\n // This is a temporary fix until we can support the package.json exports.\n context.mainFields = ['module', 'main'];\n } else {\n // In Node.js + native, use the standard main fields.\n context.mainFields = ['react-native', 'module', 'main'];\n }\n } else {\n if (platform === 'web') {\n // Node.js runtimes should only be importing main at the moment.\n // This is a temporary fix until we can support the package.json exports.\n context.mainFields = ['main', 'module'];\n } else {\n // In Node.js + native, use the standard main fields.\n context.mainFields = ['react-native', 'main', 'module'];\n }\n }\n\n // Enable react-server import conditions.\n if (context.customResolverOptions?.environment === 'react-server') {\n context.unstable_conditionNames = ['node', 'react-server', 'workerd'];\n } else {\n context.unstable_conditionNames = ['node'];\n }\n } else {\n // Non-server changes\n\n if (!env.EXPO_METRO_NO_MAIN_FIELD_OVERRIDE && platform && platform in preferredMainFields) {\n context.mainFields = preferredMainFields[platform];\n }\n }\n\n return context;\n }\n );\n\n return withMetroErrorReportingResolver(metroConfigWithCustomContext);\n}\n\n/** @returns `true` if the incoming resolution should be swapped. */\nexport function shouldAliasModule(\n input: {\n platform: string | null;\n result: Resolution;\n },\n alias: { platform: string; output: string }\n): boolean {\n return (\n input.platform === alias.platform &&\n input.result?.type === 'sourceFile' &&\n typeof input.result?.filePath === 'string' &&\n normalizeSlashes(input.result.filePath).endsWith(alias.output)\n );\n}\n\n/** Add support for `react-native-web` and the Web platform. */\nexport async function withMetroMultiPlatformAsync(\n projectRoot: string,\n {\n config,\n exp,\n platformBundlers,\n isTsconfigPathsEnabled,\n isFastResolverEnabled,\n isExporting,\n isReactCanaryEnabled,\n isNamedRequiresEnabled,\n isReactServerComponentsEnabled,\n getMetroBundler,\n }: {\n config: ConfigT;\n exp: ExpoConfig;\n isTsconfigPathsEnabled: boolean;\n platformBundlers: PlatformBundlers;\n isFastResolverEnabled?: boolean;\n isExporting?: boolean;\n isReactCanaryEnabled: boolean;\n isReactServerComponentsEnabled: boolean;\n isNamedRequiresEnabled: boolean;\n getMetroBundler: () => Bundler;\n }\n) {\n if (isNamedRequiresEnabled) {\n debug('Using Expo metro require runtime.');\n // Change the default metro-runtime to a custom one that supports bundle splitting.\n require('metro-config/src/defaults/defaults').moduleSystem = require.resolve(\n '@expo/cli/build/metro-require/require'\n );\n }\n\n if (!config.projectRoot) {\n // @ts-expect-error: read-only types\n config.projectRoot = projectRoot;\n }\n\n // Required for @expo/metro-runtime to format paths in the web LogBox.\n process.env.EXPO_PUBLIC_PROJECT_ROOT = process.env.EXPO_PUBLIC_PROJECT_ROOT ?? projectRoot;\n\n // This is used for running Expo CLI in development against projects outside the monorepo.\n if (!isDirectoryIn(__dirname, projectRoot)) {\n if (!config.watchFolders) {\n // @ts-expect-error: watchFolders is readonly\n config.watchFolders = [];\n }\n // @ts-expect-error: watchFolders is readonly\n config.watchFolders.push(path.join(require.resolve('metro-runtime/package.json'), '../..'));\n // @ts-expect-error: watchFolders is readonly\n config.watchFolders.push(\n path.join(require.resolve('@expo/metro-config/package.json'), '../..'),\n // For virtual modules\n path.join(require.resolve('expo/package.json'), '..')\n );\n if (isReactCanaryEnabled) {\n // @ts-expect-error: watchFolders is readonly\n config.watchFolders.push(path.join(require.resolve('@expo/cli/package.json'), '..'));\n }\n }\n\n // TODO: Remove this\n // @ts-expect-error: Invalidate the cache when the location of expo-router changes on-disk.\n config.transformer._expoRouterPath = resolveFrom.silent(projectRoot, 'expo-router');\n\n let tsconfig: null | TsConfigPaths = null;\n\n if (isTsconfigPathsEnabled) {\n tsconfig = await loadTsConfigPathsAsync(projectRoot);\n }\n\n let expoConfigPlatforms = Object.entries(platformBundlers)\n .filter(\n ([platform, bundler]) => bundler === 'metro' && exp.platforms?.includes(platform as Platform)\n )\n .map(([platform]) => platform);\n\n if (Array.isArray(config.resolver.platforms)) {\n expoConfigPlatforms = [...new Set(expoConfigPlatforms.concat(config.resolver.platforms))];\n }\n\n // @ts-expect-error: typed as `readonly`.\n config.resolver.platforms = expoConfigPlatforms;\n\n config = withWebPolyfills(config, { getMetroBundler });\n\n return withExtendedResolver(config, {\n tsconfig,\n isExporting,\n isTsconfigPathsEnabled,\n isFastResolverEnabled,\n isReactCanaryEnabled,\n isReactServerComponentsEnabled,\n getMetroBundler,\n });\n}\n\nfunction isDirectoryIn(targetPath: string, rootPath: string) {\n return targetPath.startsWith(rootPath) && targetPath.length >= rootPath.length;\n}\n"],"names":["getNodejsExtensions","shouldAliasModule","withExtendedResolver","withMetroMultiPlatformAsync","ASSET_REGISTRY_SRC","debug","require","withWebPolyfills","config","getMetroBundler","originalGetPolyfills","serializer","getPolyfills","bind","ctx","virtualEnvVarId","getMetroBundlerWithVirtualModules","setVirtualModule","virtualModuleId","platform","resolve","polyfills","normalizeSlashes","p","replace","srcExts","mjsExts","filter","ext","test","nodejsSourceExtensions","jsIndex","reduce","index","i","splice","tsconfig","isTsconfigPathsEnabled","isFastResolverEnabled","isExporting","isReactCanaryEnabled","isReactServerComponentsEnabled","Log","warn","log","chalk","dim","defaultResolver","metroResolver","resolver","createFastResolver","preserveSymlinks","blockList","Array","isArray","aliases","web","_universalAliases","getUniversalAliases","resolveFrom","silent","projectRoot","push","preferredMainFields","tsConfigResolve","paths","baseUrl","resolveWithTsConfigPaths","hasBaseUrl","isInteractive","configWatcher","FileNotifier","startObserving","loadTsConfigPathsAsync","then","tsConfigPaths","Object","keys","length","installExitHooks","stopObserving","getStrictResolver","resolveRequest","context","doResolve","moduleName","getOptionalResolver","optionalResolve","error","isResolutionError","isFailedToResolveNameError","isFailedToResolvePathError","idFactory","createModuleIdFactory","id","getAssetRegistryModule","type","filePath","externals","match","customResolverOptions","exporting","isServerEnvironment","environment","process","clientboundary","endsWith","isExternal","metroConfigWithCustomResolver","withMetroResolvers","requestDevMockProdReact","dev","originModulePath","requestTsconfigPaths","requestNodeExternals","isServer","moduleId","isNodeExternal","result","contents","requestCustomExternals","strictResolve","external","realModule","realPath","opaqueId","JSON","stringify","CommandError","requestAlias","redirectedModuleName","matcher","alias","aliasedModule","_","parseInt","requestStableAssetRegistry","includes","requestPostRewrites","FailedToResolvePathError","normalName","shimFile","shouldCreateVirtualShim","virtualId","bundler","hasVirtualModule","fs","readFileSync","normal","canaryFile","shouldCreateVirtualCanary","createFallbackModuleResolver","originModuleNames","metroConfigWithCustomContext","withMetroMutatedResolverContext","immutableContext","preferNativePlatform","nodeModulesPaths","path","join","sourceExts","unstable_enablePackageExports","unstable_conditionsByPlatform","isReactServerComponents","mainFields","unstable_conditionNames","env","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","withMetroErrorReportingResolver","input","output","exp","platformBundlers","isNamedRequiresEnabled","moduleSystem","EXPO_PUBLIC_PROJECT_ROOT","isDirectoryIn","__dirname","watchFolders","transformer","_expoRouterPath","expoConfigPlatforms","entries","platforms","map","Set","concat","targetPath","rootPath","startsWith"],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ function createCorsMiddleware(exp) {
|
|
|
30
30
|
const { host, hostname } = new URL(req.headers.origin);
|
|
31
31
|
const isSameOrigin = host === req.headers.host;
|
|
32
32
|
if (!isSameOrigin && !allowedHostnames.includes(hostname)) {
|
|
33
|
-
next(new Error(`Unauthorized request from ${req.headers.origin}. ` + 'This may happen because of a conflicting browser extension to intercept HTTP requests. ' + '
|
|
33
|
+
next(new Error(`Unauthorized request from ${req.headers.origin}. ` + 'This may happen because of a conflicting browser extension to intercept HTTP requests. ' + 'Disable browser extensions or use incognito mode and try again.'));
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
36
|
res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/CorsMiddleware.ts"],"sourcesContent":["import type { ExpoConfig } from '@expo/config';\n\nimport type { ServerRequest, ServerResponse } from './server.types';\n\nconst DEFAULT_ALLOWED_CORS_HOSTNAMES = [\n 'localhost',\n 'chrome-devtools-frontend.appspot.com', // Support remote Chrome DevTools frontend\n 'devtools', // Support local Chrome DevTools `devtools://devtools`\n];\n\nexport function createCorsMiddleware(exp: ExpoConfig) {\n const allowedHostnames = [...DEFAULT_ALLOWED_CORS_HOSTNAMES];\n // Support for expo-router API routes\n if (exp.extra?.router?.headOrigin) {\n allowedHostnames.push(new URL(exp.extra.router.headOrigin).hostname);\n }\n if (exp.extra?.router?.origin) {\n allowedHostnames.push(new URL(exp.extra.router.origin).hostname);\n }\n\n return (req: ServerRequest, res: ServerResponse, next: (err?: Error) => void) => {\n if (typeof req.headers.origin === 'string') {\n const { host, hostname } = new URL(req.headers.origin);\n const isSameOrigin = host === req.headers.host;\n if (!isSameOrigin && !allowedHostnames.includes(hostname)) {\n next(\n new Error(\n `Unauthorized request from ${req.headers.origin}. ` +\n 'This may happen because of a conflicting browser extension to intercept HTTP requests. ' +\n '
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/middleware/CorsMiddleware.ts"],"sourcesContent":["import type { ExpoConfig } from '@expo/config';\n\nimport type { ServerRequest, ServerResponse } from './server.types';\n\nconst DEFAULT_ALLOWED_CORS_HOSTNAMES = [\n 'localhost',\n 'chrome-devtools-frontend.appspot.com', // Support remote Chrome DevTools frontend\n 'devtools', // Support local Chrome DevTools `devtools://devtools`\n];\n\nexport function createCorsMiddleware(exp: ExpoConfig) {\n const allowedHostnames = [...DEFAULT_ALLOWED_CORS_HOSTNAMES];\n // Support for expo-router API routes\n if (exp.extra?.router?.headOrigin) {\n allowedHostnames.push(new URL(exp.extra.router.headOrigin).hostname);\n }\n if (exp.extra?.router?.origin) {\n allowedHostnames.push(new URL(exp.extra.router.origin).hostname);\n }\n\n return (req: ServerRequest, res: ServerResponse, next: (err?: Error) => void) => {\n if (typeof req.headers.origin === 'string') {\n const { host, hostname } = new URL(req.headers.origin);\n const isSameOrigin = host === req.headers.host;\n if (!isSameOrigin && !allowedHostnames.includes(hostname)) {\n next(\n new Error(\n `Unauthorized request from ${req.headers.origin}. ` +\n 'This may happen because of a conflicting browser extension to intercept HTTP requests. ' +\n 'Disable browser extensions or use incognito mode and try again.'\n )\n );\n return;\n }\n\n res.setHeader('Access-Control-Allow-Origin', req.headers.origin);\n maybePreventMetroResetCorsHeader(req, res);\n }\n\n // Block MIME-type sniffing.\n res.setHeader('X-Content-Type-Options', 'nosniff');\n\n next();\n };\n}\n\n// When accessing source maps,\n// metro will overwrite the `Access-Control-Allow-Origin` header with hardcoded `devtools://devtools` value.\n// https://github.com/facebook/metro/blob/a7f8955e6d2424b0d5f73d4bcdaf22560e1d5f27/packages/metro/src/Server.js#L540\n// This is a workaround to prevent this behavior.\nfunction maybePreventMetroResetCorsHeader(req: ServerRequest, res: ServerResponse) {\n const pathname = req.url ? new URL(req.url, `http://${req.headers.host}`).pathname : '';\n if (pathname.endsWith('.map')) {\n const setHeader = res.setHeader.bind(res);\n res.setHeader = (key, ...args) => {\n if (key !== 'Access-Control-Allow-Origin') {\n setHeader(key, ...args);\n }\n return res;\n };\n }\n}\n"],"names":["createCorsMiddleware","DEFAULT_ALLOWED_CORS_HOSTNAMES","exp","allowedHostnames","extra","router","headOrigin","push","URL","hostname","origin","req","res","next","headers","host","isSameOrigin","includes","Error","setHeader","maybePreventMetroResetCorsHeader","pathname","url","endsWith","bind","key","args"],"mappings":";;;;+BAUgBA;;;eAAAA;;;AANhB,MAAMC,iCAAiC;IACrC;IACA;IACA;CACD;AAEM,SAASD,qBAAqBE,GAAe;QAG9CA,mBAAAA,YAGAA,oBAAAA;IALJ,MAAMC,mBAAmB;WAAIF;KAA+B;IAC5D,qCAAqC;IACrC,KAAIC,aAAAA,IAAIE,KAAK,sBAATF,oBAAAA,WAAWG,MAAM,qBAAjBH,kBAAmBI,UAAU,EAAE;QACjCH,iBAAiBI,IAAI,CAAC,IAAIC,IAAIN,IAAIE,KAAK,CAACC,MAAM,CAACC,UAAU,EAAEG,QAAQ;IACrE;IACA,KAAIP,cAAAA,IAAIE,KAAK,sBAATF,qBAAAA,YAAWG,MAAM,qBAAjBH,mBAAmBQ,MAAM,EAAE;QAC7BP,iBAAiBI,IAAI,CAAC,IAAIC,IAAIN,IAAIE,KAAK,CAACC,MAAM,CAACK,MAAM,EAAED,QAAQ;IACjE;IAEA,OAAO,CAACE,KAAoBC,KAAqBC;QAC/C,IAAI,OAAOF,IAAIG,OAAO,CAACJ,MAAM,KAAK,UAAU;YAC1C,MAAM,EAAEK,IAAI,EAAEN,QAAQ,EAAE,GAAG,IAAID,IAAIG,IAAIG,OAAO,CAACJ,MAAM;YACrD,MAAMM,eAAeD,SAASJ,IAAIG,OAAO,CAACC,IAAI;YAC9C,IAAI,CAACC,gBAAgB,CAACb,iBAAiBc,QAAQ,CAACR,WAAW;gBACzDI,KACE,IAAIK,MACF,CAAC,0BAA0B,EAAEP,IAAIG,OAAO,CAACJ,MAAM,CAAC,EAAE,CAAC,GACjD,4FACA;gBAGN;YACF;YAEAE,IAAIO,SAAS,CAAC,+BAA+BR,IAAIG,OAAO,CAACJ,MAAM;YAC/DU,iCAAiCT,KAAKC;QACxC;QAEA,4BAA4B;QAC5BA,IAAIO,SAAS,CAAC,0BAA0B;QAExCN;IACF;AACF;AAEA,8BAA8B;AAC9B,4GAA4G;AAC5G,oHAAoH;AACpH,iDAAiD;AACjD,SAASO,iCAAiCT,GAAkB,EAAEC,GAAmB;IAC/E,MAAMS,WAAWV,IAAIW,GAAG,GAAG,IAAId,IAAIG,IAAIW,GAAG,EAAE,CAAC,OAAO,EAAEX,IAAIG,OAAO,CAACC,IAAI,EAAE,EAAEM,QAAQ,GAAG;IACrF,IAAIA,SAASE,QAAQ,CAAC,SAAS;QAC7B,MAAMJ,YAAYP,IAAIO,SAAS,CAACK,IAAI,CAACZ;QACrCA,IAAIO,SAAS,GAAG,CAACM,KAAK,GAAGC;YACvB,IAAID,QAAQ,+BAA+B;gBACzCN,UAAUM,QAAQC;YACpB;YACA,OAAOd;QACT;IACF;AACF"}
|
|
@@ -97,7 +97,7 @@ function warnAboutConfigAndThrow(type, message, edits) {
|
|
|
97
97
|
throw new _errors.SilentError();
|
|
98
98
|
}
|
|
99
99
|
function notifyAboutManualConfigEdits(edits) {
|
|
100
|
-
_log.log(_chalk().default.cyan(`
|
|
100
|
+
_log.log(_chalk().default.cyan(`Add the following to your Expo config`));
|
|
101
101
|
_log.log();
|
|
102
102
|
_log.log(JSON.stringify(edits, null, 2));
|
|
103
103
|
_log.log();
|