@expo/cli 55.0.3 → 55.0.5
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/src/api/graphql/client.js +133 -68
- package/build/src/api/graphql/client.js.map +1 -1
- package/build/src/api/graphql/queries/AppQuery.js +21 -25
- package/build/src/api/graphql/queries/AppQuery.js.map +1 -1
- package/build/src/api/graphql/queries/UserQuery.js +45 -38
- package/build/src/api/graphql/queries/UserQuery.js.map +1 -1
- package/build/src/api/rest/cache/FileSystemResponseCache.js.map +1 -1
- package/build/src/api/rest/cache/ResponseCache.js.map +1 -1
- package/build/src/api/rest/cache/wrapFetchWithCache.js +7 -7
- package/build/src/api/rest/cache/wrapFetchWithCache.js.map +1 -1
- package/build/src/api/rest/client.js +3 -7
- package/build/src/api/rest/client.js.map +1 -1
- package/build/src/api/rest/wrapFetchWithProgress.js +1 -8
- package/build/src/api/rest/wrapFetchWithProgress.js.map +1 -1
- package/build/src/api/user/user.js +6 -36
- package/build/src/api/user/user.js.map +1 -1
- package/build/src/prebuild/renameTemplateAppName.js +2 -6
- package/build/src/prebuild/renameTemplateAppName.js.map +1 -1
- package/build/src/prebuild/resolveLocalTemplate.js +2 -4
- package/build/src/prebuild/resolveLocalTemplate.js.map +1 -1
- package/build/src/prebuild/resolveTemplate.js +13 -17
- package/build/src/prebuild/resolveTemplate.js.map +1 -1
- package/build/src/prebuild/updateFromTemplate.js +4 -6
- package/build/src/prebuild/updateFromTemplate.js.map +1 -1
- package/build/src/start/doctor/ngrok/ExternalModule.js +2 -8
- package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
- package/build/src/start/server/metro/DevToolsPluginWebsocketEndpoint.js +1 -9
- package/build/src/start/server/metro/DevToolsPluginWebsocketEndpoint.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +13 -8
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/createServerComponentsMiddleware.js +4 -14
- package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
- package/build/src/start/server/metro/createServerRouteMiddleware.js +17 -0
- package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
- package/build/src/start/server/metro/fetchRouterManifest.js +1 -13
- package/build/src/start/server/metro/fetchRouterManifest.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +1 -3
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +47 -34
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +27 -4
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/type-generation/routes.js +2 -62
- package/build/src/start/server/type-generation/routes.js.map +1 -1
- package/build/src/utils/build-cache-providers/index.js +1 -1
- package/build/src/utils/build-cache-providers/index.js.map +1 -1
- package/build/src/utils/codesigning.js +3 -17
- package/build/src/utils/codesigning.js.map +1 -1
- package/build/src/utils/createFileTransform.js +3 -38
- package/build/src/utils/createFileTransform.js.map +1 -1
- package/build/src/utils/downloadAppAsync.js +1 -12
- package/build/src/utils/downloadAppAsync.js.map +1 -1
- package/build/src/utils/fetch.js +23 -4
- package/build/src/utils/fetch.js.map +1 -1
- package/build/src/utils/freeport.js +21 -5
- package/build/src/utils/freeport.js.map +1 -1
- package/build/src/utils/getOrPromptApplicationId.js +2 -15
- package/build/src/utils/getOrPromptApplicationId.js.map +1 -1
- package/build/src/utils/npm.js +60 -65
- package/build/src/utils/npm.js.map +1 -1
- package/build/src/utils/port.js +4 -4
- package/build/src/utils/port.js.map +1 -1
- package/build/src/utils/resolveGlobal.js +195 -0
- package/build/src/utils/resolveGlobal.js.map +1 -0
- package/build/src/utils/tar.js +138 -69
- package/build/src/utils/tar.js.map +1 -1
- package/build/src/utils/telemetry/clients/FetchClient.js +12 -24
- package/build/src/utils/telemetry/clients/FetchClient.js.map +1 -1
- package/build/src/utils/telemetry/utils/context.js +1 -1
- package/package.json +18 -28
- package/build/src/api/graphql/types/App.js +0 -29
- package/build/src/api/graphql/types/App.js.map +0 -1
- package/build/src/api/rest/wrapFetchWithProxy.js +0 -31
- package/build/src/api/rest/wrapFetchWithProxy.js.map +0 -1
- package/build/src/graphql/generated.js +0 -1196
- package/build/src/graphql/generated.js.map +0 -1
- package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js +0 -85
- package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js.map +0 -1
- package/build/src/utils/multipartMixed.js +0 -56
- package/build/src/utils/multipartMixed.js.map +0 -1
|
@@ -63,7 +63,6 @@ const _filePath = require("../../../utils/filePath");
|
|
|
63
63
|
const _fn = require("../../../utils/fn");
|
|
64
64
|
const _ip = require("../../../utils/ip");
|
|
65
65
|
const _stream = require("../../../utils/stream");
|
|
66
|
-
const _createBuiltinAPIRequestHandler = require("../middleware/createBuiltinAPIRequestHandler");
|
|
67
66
|
const _metroOptions = require("../middleware/metroOptions");
|
|
68
67
|
function _interop_require_default(obj) {
|
|
69
68
|
return obj && obj.__esModule ? obj : {
|
|
@@ -73,7 +72,7 @@ function _interop_require_default(obj) {
|
|
|
73
72
|
const debug = require('debug')('expo:rsc');
|
|
74
73
|
const getMetroServerRootMemo = (0, _fn.memoize)(_paths().getMetroServerRoot);
|
|
75
74
|
function createServerComponentsMiddleware(projectRoot, { rscPath, instanceMetroOptions, ssrLoadModule, ssrLoadModuleArtifacts, useClientRouter, createModuleId, routerOptions }) {
|
|
76
|
-
const routerModule = useClientRouter ? '@expo/router-server/build/rsc/router/noopRouter' : '@expo/router-server/build/rsc/router/expo-definedRouter';
|
|
75
|
+
const routerModule = useClientRouter ? require.resolve('@expo/router-server/build/rsc/router/noopRouter') : require.resolve('@expo/router-server/build/rsc/router/expo-definedRouter');
|
|
77
76
|
const rscMiddleware = (0, _private().getRscMiddleware)({
|
|
78
77
|
config: {},
|
|
79
78
|
// Disabled in development
|
|
@@ -359,7 +358,7 @@ function createServerComponentsMiddleware(projectRoot, { rscPath, instanceMetroO
|
|
|
359
358
|
return rscRendererCache.get(platform);
|
|
360
359
|
}
|
|
361
360
|
// TODO: Extract CSS Modules / Assets from the bundler process
|
|
362
|
-
const renderer = await ssrLoadModule('@expo/router-server/build/rsc/rsc-renderer', {
|
|
361
|
+
const renderer = await ssrLoadModule(require.resolve('@expo/router-server/build/rsc/rsc-renderer'), {
|
|
363
362
|
environment: 'react-server',
|
|
364
363
|
platform
|
|
365
364
|
});
|
|
@@ -416,6 +415,8 @@ function createServerComponentsMiddleware(projectRoot, { rscPath, instanceMetroO
|
|
|
416
415
|
// Get the static client boundaries (no dead code elimination allowed) for the production export.
|
|
417
416
|
getExpoRouterClientReferencesAsync,
|
|
418
417
|
exportServerActionsAsync,
|
|
418
|
+
// Expose the RSC handler directly for use with `createRouteHandlerMiddleware()`
|
|
419
|
+
handler: rscMiddleware,
|
|
419
420
|
async exportRoutesAsync ({ platform, ssrManifest, routerOptions }, files) {
|
|
420
421
|
// TODO: When we add web SSR support, we need to extract CSS Modules / Assets from the bundler process to prevent FLOUC.
|
|
421
422
|
const { getBuildConfig } = (await getExpoRouterRscEntriesGetterAsync({
|
|
@@ -456,10 +457,6 @@ function createServerComponentsMiddleware(projectRoot, { rscPath, instanceMetroO
|
|
|
456
457
|
}
|
|
457
458
|
}));
|
|
458
459
|
},
|
|
459
|
-
middleware: (0, _createBuiltinAPIRequestHandler.createBuiltinAPIRequestHandler)(// Match `/_flight/[platform]/[...path]`
|
|
460
|
-
(req)=>{
|
|
461
|
-
return getFullUrl(req.url).pathname.startsWith(rscPathPrefix);
|
|
462
|
-
}, rscMiddleware),
|
|
463
460
|
onReloadRscEvent: (platform)=>{
|
|
464
461
|
// NOTE: We cannot clear the renderer context because it would break the mounted context state.
|
|
465
462
|
rscRendererCache.delete(platform);
|
|
@@ -467,13 +464,6 @@ function createServerComponentsMiddleware(projectRoot, { rscPath, instanceMetroO
|
|
|
467
464
|
}
|
|
468
465
|
};
|
|
469
466
|
}
|
|
470
|
-
const getFullUrl = (url)=>{
|
|
471
|
-
try {
|
|
472
|
-
return new URL(url);
|
|
473
|
-
} catch {
|
|
474
|
-
return new URL(url, 'http://localhost:0');
|
|
475
|
-
}
|
|
476
|
-
};
|
|
477
467
|
const fileURLToFilePath = (fileURL)=>{
|
|
478
468
|
try {
|
|
479
469
|
return _nodeurl().default.fileURLToPath(fileURL);
|
|
@@ -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 type { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport type { EntriesDev } from '@expo/router-server/build/rsc/server';\nimport assert from 'assert';\nimport { getRscMiddleware } from 'expo-server/private';\nimport path from 'node:path';\nimport url from 'node:url';\n\nimport { IS_METRO_BUNDLE_ERROR_SYMBOL, logMetroError } from './metroErrorInterface';\nimport { isPossiblyUnableToResolveError } from '../../../export/embed/xcodeCompilerLogger';\nimport type { 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 type 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 | null,\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-server/build/rsc/router/noopRouter'\n : '@expo/router-server/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-server/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 | null>;\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<\n string,\n typeof import('@expo/router-server/build/rsc/rsc-renderer')\n >();\n\n let ensurePromise: Promise<unknown> | null = null;\n async function ensureSSRReady() {\n // TODO: Extract CSS Modules / Assets from the bundler process\n await ssrLoadModule(null, {\n environment: 'react-server',\n platform: 'web',\n });\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<\n typeof import('@expo/router-server/build/rsc/rsc-renderer')\n >('@expo/router-server/build/rsc/rsc-renderer', {\n environment: 'react-server',\n platform,\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 | null>;\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 | null>;\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","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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"}
|
|
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 type { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport type { EntriesDev } from '@expo/router-server/build/rsc/server';\nimport assert from 'assert';\nimport { getRscMiddleware } from 'expo-server/private';\nimport path from 'node:path';\nimport url from 'node:url';\n\nimport { IS_METRO_BUNDLE_ERROR_SYMBOL, logMetroError } from './metroErrorInterface';\nimport { isPossiblyUnableToResolveError } from '../../../export/embed/xcodeCompilerLogger';\nimport type { 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 {\n createBundleUrlSearchParams,\n type 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 | null,\n specificOptions?: Partial<ExpoMetroOptions>,\n extras?: { hot?: boolean }\n) => Promise<T>;\n\nconst getMetroServerRootMemo = memoize(getMetroServerRoot);\n\n// TODO(@hassankhan): Rename this to `createRscRenderer()`\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 ? require.resolve('@expo/router-server/build/rsc/router/noopRouter')\n : require.resolve('@expo/router-server/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-server/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 | null>;\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<\n string,\n typeof import('@expo/router-server/build/rsc/rsc-renderer')\n >();\n\n let ensurePromise: Promise<unknown> | null = null;\n async function ensureSSRReady() {\n // TODO: Extract CSS Modules / Assets from the bundler process\n await ssrLoadModule(null, {\n environment: 'react-server',\n platform: 'web',\n });\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<\n typeof import('@expo/router-server/build/rsc/rsc-renderer')\n >(require.resolve('@expo/router-server/build/rsc/rsc-renderer'), {\n environment: 'react-server',\n platform,\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 | null>;\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 // Expose the RSC handler directly for use with `createRouteHandlerMiddleware()`\n handler: rscMiddleware,\n\n async exportRoutesAsync(\n {\n platform,\n ssrManifest,\n routerOptions,\n }: {\n platform: string;\n ssrManifest: Map<string, string | null>;\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 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\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","resolve","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","getRscRendererAsync","renderer","rscRenderContext","getRscRenderContext","input","method","contentType","decodedBody","resolveClientEntry","loadServerModuleRsc","urlFragment","options","getMetroOptionsFromUrl","handler","exportRoutesAsync","getBuildConfig","buildConfig","Promise","all","Array","from","isStatic","destRscFile","encodeInput","pipe","rsc","streamToStringAsync","rscId","onReloadRscEvent","delete","fileURL","url","fileURLToPath","TypeError","cause","str","replace"],"mappings":"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"}
|
|
@@ -63,6 +63,18 @@ function createRouteHandlerMiddleware(projectRoot, options) {
|
|
|
63
63
|
var _exp_extra_router, _exp_extra;
|
|
64
64
|
const manifest = await (0, _fetchRouterManifest.fetchManifest)(projectRoot, options);
|
|
65
65
|
debug('manifest', manifest);
|
|
66
|
+
// TODO(@hassankhan): Invert the conditionals for an early return if no manifest if found
|
|
67
|
+
if (manifest && options.rsc && !manifest.apiRoutes.find((route)=>route.page.startsWith(options.rsc.path))) {
|
|
68
|
+
// Insert the route before any catch-all routes that might match the RSC path.
|
|
69
|
+
manifest.apiRoutes.unshift({
|
|
70
|
+
file: require.resolve('@expo/cli/static/template/[...rsc]+api.ts'),
|
|
71
|
+
page: `${options.rsc.path}/[...rsc]`,
|
|
72
|
+
namedRegex: new RegExp(`^${options.rsc.path}(?:/(?<rsc>.+?))?(?:/)?$`),
|
|
73
|
+
routeKeys: {
|
|
74
|
+
rsc: 'rsc'
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
66
78
|
const { exp } = options.config;
|
|
67
79
|
if (manifest && ((_exp_extra = exp.extra) == null ? void 0 : (_exp_extra_router = _exp_extra.router) == null ? void 0 : _exp_extra_router.unstable_useServerDataLoaders) === true) {
|
|
68
80
|
// In development, set `loader` property on all HTML routes. We can't know which routes
|
|
@@ -144,6 +156,11 @@ function createRouteHandlerMiddleware(projectRoot, options) {
|
|
|
144
156
|
},
|
|
145
157
|
async getApiRoute (route) {
|
|
146
158
|
var _exp_web;
|
|
159
|
+
// We check if RSC is enabled before the warning check, as `web.output` could be set to
|
|
160
|
+
// `single`
|
|
161
|
+
if (options.rsc && route.page.startsWith(options.rsc.path)) {
|
|
162
|
+
return options.rsc.handler;
|
|
163
|
+
}
|
|
147
164
|
const { exp } = options.config;
|
|
148
165
|
if (((_exp_web = exp.web) == null ? void 0 : _exp_web.output) !== 'server') {
|
|
149
166
|
(0, _router.warnInvalidWebOutput)();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/createServerRouteMiddleware.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 */\n\nimport type { ProjectConfig } from '@expo/config';\nimport type { MiddlewareSettings } from 'expo-server';\nimport { createRequestHandler } from 'expo-server/adapter/http';\nimport { ImmutableRequest, type RouteInfo } from 'expo-server/private';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { fetchManifest } from './fetchRouterManifest';\nimport { getErrorOverlayHtmlAsync } from './metroErrorInterface';\nimport {\n warnInvalidWebOutput,\n warnInvalidMiddlewareOutput,\n warnInvalidMiddlewareMatcherSettings,\n} from './router';\nimport { CommandError } from '../../../utils/errors';\n\nconst debug = require('debug')('expo:start:server:metro') as typeof console.log;\n\nexport function createRouteHandlerMiddleware(\n projectRoot: string,\n options: {\n appDir: string;\n routerRoot: string;\n getStaticPageAsync: (\n pathname: string,\n route: RouteInfo<RegExp>,\n request?: ImmutableRequest\n ) => Promise<{ content: string }>;\n bundleApiRoute: (\n functionFilePath: string\n ) => Promise<null | Record<string, Function> | Response>;\n executeLoaderAsync: (\n route: RouteInfo<RegExp>,\n request: ImmutableRequest\n ) => Promise<Response | undefined>;\n config: ProjectConfig;\n headers: Record<string, string | string[]>;\n } & import('@expo/router-server/build/routes-manifest').Options\n) {\n if (!resolveFrom.silent(projectRoot, 'expo-router')) {\n throw new CommandError(\n `static and server rendering requires the expo-router package to be installed in your project. Either install the expo-router package or change 'web.output' to 'single' in your app.json.`\n );\n }\n\n return createRequestHandler(\n { build: '', isDevelopment: true },\n {\n async getRoutesManifest() {\n const manifest = await fetchManifest(projectRoot, options);\n debug('manifest', manifest);\n\n const { exp } = options.config;\n\n if (manifest && exp.extra?.router?.unstable_useServerDataLoaders === true) {\n // In development, set `loader` property on all HTML routes. We can't know which routes\n // have loaders without bundling via Metro to detect exports. In production, this is\n // populated by `exportStaticAsync.ts` after bundling.\n // At runtime, `getLoaderData()` returns a 404 response if no loader exists.\n for (const route of manifest.htmlRoutes) {\n route.loader = `_expo/loaders${route.page}.js`;\n }\n }\n\n // NOTE: no app dir if null\n // TODO: Redirect to 404 page\n return (\n manifest ?? {\n // Support the onboarding screen if there's no manifest\n htmlRoutes: [\n {\n file: 'index.js',\n page: '/index',\n routeKeys: {},\n namedRegex: /^\\/(?:index)?\\/?$/i,\n },\n ],\n apiRoutes: [],\n notFoundRoutes: [],\n redirects: [],\n rewrites: [],\n }\n );\n },\n async getHtml(request, route) {\n try {\n const { exp } = options.config;\n const isSSREnabled =\n exp.web?.output === 'server' && exp.extra?.router?.unstable_useServerRendering === true;\n\n const { content } = await options.getStaticPageAsync(\n request.url,\n route,\n isSSREnabled ? new ImmutableRequest(request) : undefined\n );\n return content;\n } catch (error: any) {\n // Forward the Metro server response as-is. It won't be pretty, but at least it will be accurate.\n\n try {\n return new Response(\n await getErrorOverlayHtmlAsync({\n error,\n projectRoot,\n routerRoot: options.routerRoot,\n }),\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n } catch (staticError: any) {\n debug('Failed to render static error overlay:', staticError);\n // Fallback error for when Expo Router is misconfigured in the project.\n return new Response(\n '<span><h3>Internal Error:</h3><b>Project is not setup correctly for static rendering (check terminal for more info):</b><br/>' +\n error.message +\n '<br/><br/>' +\n staticError.message +\n '</span>',\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n }\n },\n async handleRouteError(error) {\n // NOTE(@kitten): ExpoError is currently not exposed by expo-server just yet\n if (error && typeof error === 'object' && error.name === 'ExpoError') {\n // TODO(@krystofwoldrich): Can we show code snippet of the handler?\n // NOTE(@krystofwoldrich): Removing stack since to avoid confusion. The error is not in the server code.\n delete error.stack;\n }\n\n const htmlServerError = await getErrorOverlayHtmlAsync({\n error,\n projectRoot,\n routerRoot: options.routerRoot!,\n });\n\n return new Response(htmlServerError, {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n });\n },\n async getApiRoute(route) {\n const { exp } = options.config;\n if (exp.web?.output !== 'server') {\n warnInvalidWebOutput();\n }\n\n // TODO(@kitten): Unify with MetroBundlerDevServer#exportExpoRouterApiRoutesAsync\n const resolvedFunctionPath = path.isAbsolute(route.file)\n ? route.file\n : path.join(options.appDir, route.file);\n try {\n debug(`Bundling API route at: ${resolvedFunctionPath}`);\n return await options.bundleApiRoute(resolvedFunctionPath!);\n } catch (error: any) {\n return new Response(\n 'Failed to load API Route: ' + resolvedFunctionPath + '\\n\\n' + error.message,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n },\n async getMiddleware(route) {\n const { exp } = options.config;\n\n if (!options.unstable_useServerMiddleware) {\n return {\n default: () => {\n throw new CommandError(\n 'Server middleware is not enabled. Add unstable_useServerMiddleware: true to your `expo-router` plugin config.'\n );\n },\n };\n }\n\n if (exp.web?.output !== 'server') {\n warnInvalidMiddlewareOutput();\n return {\n default: () => {\n console.warn(\n 'Server middleware is only supported when web.output is set to \"server\" in your app config'\n );\n },\n };\n }\n\n // TODO(@kitten): Unify with MetroBundlerDevServer#exportMiddlewareAsync\n const resolvedFunctionPath = path.isAbsolute(route.file)\n ? route.file\n : path.join(options.appDir, route.file);\n try {\n debug(`Bundling middleware at: ${resolvedFunctionPath}`);\n const middlewareModule = (await options.bundleApiRoute(resolvedFunctionPath!)) as any;\n\n if ((middlewareModule.unstable_settings as MiddlewareSettings)?.matcher) {\n warnInvalidMiddlewareMatcherSettings(middlewareModule.unstable_settings?.matcher);\n }\n\n return middlewareModule;\n } catch (error: any) {\n return new Response(\n 'Failed to load middleware: ' + resolvedFunctionPath + '\\n\\n' + error.message,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n },\n async getLoaderData(request, route) {\n const response = await options.executeLoaderAsync(route, new ImmutableRequest(request));\n return response ?? new Response(null, { status: 404 });\n },\n }\n );\n}\n"],"names":["createRouteHandlerMiddleware","debug","require","projectRoot","options","resolveFrom","silent","CommandError","createRequestHandler","build","isDevelopment","getRoutesManifest","exp","manifest","fetchManifest","config","extra","router","unstable_useServerDataLoaders","route","htmlRoutes","loader","page","file","routeKeys","namedRegex","apiRoutes","notFoundRoutes","redirects","rewrites","getHtml","request","isSSREnabled","web","output","unstable_useServerRendering","content","getStaticPageAsync","url","ImmutableRequest","undefined","error","Response","getErrorOverlayHtmlAsync","routerRoot","status","headers","staticError","message","handleRouteError","name","stack","htmlServerError","getApiRoute","warnInvalidWebOutput","resolvedFunctionPath","path","isAbsolute","join","appDir","bundleApiRoute","getMiddleware","unstable_useServerMiddleware","default","warnInvalidMiddlewareOutput","console","warn","middlewareModule","unstable_settings","matcher","warnInvalidMiddlewareMatcherSettings","getLoaderData","response","executeLoaderAsync"],"mappings":"AAAA;;;;;CAKC;;;;+BAoBeA;;;eAAAA;;;;yBAhBqB;;;;;;;yBACY;;;;;;;gEAChC;;;;;;;gEACO;;;;;;qCAEM;qCACW;wBAKlC;wBACsB;;;;;;AAE7B,MAAMC,QAAQC,QAAQ,SAAS;AAExB,SAASF,6BACdG,WAAmB,EACnBC,OAiB+D;IAE/D,IAAI,CAACC,sBAAW,CAACC,MAAM,CAACH,aAAa,gBAAgB;QACnD,MAAM,IAAII,oBAAY,CACpB,CAAC,yLAAyL,CAAC;IAE/L;IAEA,OAAOC,IAAAA,4BAAoB,EACzB;QAAEC,OAAO;QAAIC,eAAe;IAAK,GACjC;QACE,MAAMC;gBAMYC,mBAAAA;YALhB,MAAMC,WAAW,MAAMC,IAAAA,kCAAa,EAACX,aAAaC;YAClDH,MAAM,YAAYY;YAElB,MAAM,EAAED,GAAG,EAAE,GAAGR,QAAQW,MAAM;YAE9B,IAAIF,YAAYD,EAAAA,aAAAA,IAAII,KAAK,sBAATJ,oBAAAA,WAAWK,MAAM,qBAAjBL,kBAAmBM,6BAA6B,MAAK,MAAM;gBACzE,uFAAuF;gBACvF,oFAAoF;gBACpF,sDAAsD;gBACtD,4EAA4E;gBAC5E,KAAK,MAAMC,SAASN,SAASO,UAAU,CAAE;oBACvCD,MAAME,MAAM,GAAG,CAAC,aAAa,EAAEF,MAAMG,IAAI,CAAC,GAAG,CAAC;gBAChD;YACF;YAEA,2BAA2B;YAC3B,6BAA6B;YAC7B,OACET,YAAY;gBACV,uDAAuD;gBACvDO,YAAY;oBACV;wBACEG,MAAM;wBACND,MAAM;wBACNE,WAAW,CAAC;wBACZC,YAAY;oBACd;iBACD;gBACDC,WAAW,EAAE;gBACbC,gBAAgB,EAAE;gBAClBC,WAAW,EAAE;gBACbC,UAAU,EAAE;YACd;QAEJ;QACA,MAAMC,SAAQC,OAAO,EAAEZ,KAAK;YAC1B,IAAI;oBAGAP,UAAgCA,mBAAAA;gBAFlC,MAAM,EAAEA,GAAG,EAAE,GAAGR,QAAQW,MAAM;gBAC9B,MAAMiB,eACJpB,EAAAA,WAAAA,IAAIqB,GAAG,qBAAPrB,SAASsB,MAAM,MAAK,YAAYtB,EAAAA,aAAAA,IAAII,KAAK,sBAATJ,oBAAAA,WAAWK,MAAM,qBAAjBL,kBAAmBuB,2BAA2B,MAAK;gBAErF,MAAM,EAAEC,OAAO,EAAE,GAAG,MAAMhC,QAAQiC,kBAAkB,CAClDN,QAAQO,GAAG,EACXnB,OACAa,eAAe,IAAIO,CAAAA,UAAe,kBAAC,CAACR,WAAWS;gBAEjD,OAAOJ;YACT,EAAE,OAAOK,OAAY;gBACnB,iGAAiG;gBAEjG,IAAI;oBACF,OAAO,IAAIC,SACT,MAAMC,IAAAA,6CAAwB,EAAC;wBAC7BF;wBACAtC;wBACAyC,YAAYxC,QAAQwC,UAAU;oBAChC,IACA;wBACEC,QAAQ;wBACRC,SAAS;4BACP,gBAAgB;wBAClB;oBACF;gBAEJ,EAAE,OAAOC,aAAkB;oBACzB9C,MAAM,0CAA0C8C;oBAChD,uEAAuE;oBACvE,OAAO,IAAIL,SACT,kIACED,MAAMO,OAAO,GACb,eACAD,YAAYC,OAAO,GACnB,WACF;wBACEH,QAAQ;wBACRC,SAAS;4BACP,gBAAgB;wBAClB;oBACF;gBAEJ;YACF;QACF;QACA,MAAMG,kBAAiBR,KAAK;YAC1B,4EAA4E;YAC5E,IAAIA,SAAS,OAAOA,UAAU,YAAYA,MAAMS,IAAI,KAAK,aAAa;gBACpE,mEAAmE;gBACnE,wGAAwG;gBACxG,OAAOT,MAAMU,KAAK;YACpB;YAEA,MAAMC,kBAAkB,MAAMT,IAAAA,6CAAwB,EAAC;gBACrDF;gBACAtC;gBACAyC,YAAYxC,QAAQwC,UAAU;YAChC;YAEA,OAAO,IAAIF,SAASU,iBAAiB;gBACnCP,QAAQ;gBACRC,SAAS;oBACP,gBAAgB;gBAClB;YACF;QACF;QACA,MAAMO,aAAYlC,KAAK;gBAEjBP;YADJ,MAAM,EAAEA,GAAG,EAAE,GAAGR,QAAQW,MAAM;YAC9B,IAAIH,EAAAA,WAAAA,IAAIqB,GAAG,qBAAPrB,SAASsB,MAAM,MAAK,UAAU;gBAChCoB,IAAAA,4BAAoB;YACtB;YAEA,iFAAiF;YACjF,MAAMC,uBAAuBC,eAAI,CAACC,UAAU,CAACtC,MAAMI,IAAI,IACnDJ,MAAMI,IAAI,GACViC,eAAI,CAACE,IAAI,CAACtD,QAAQuD,MAAM,EAAExC,MAAMI,IAAI;YACxC,IAAI;gBACFtB,MAAM,CAAC,uBAAuB,EAAEsD,sBAAsB;gBACtD,OAAO,MAAMnD,QAAQwD,cAAc,CAACL;YACtC,EAAE,OAAOd,OAAY;gBACnB,OAAO,IAAIC,SACT,+BAA+Ba,uBAAuB,SAASd,MAAMO,OAAO,EAC5E;oBACEH,QAAQ;oBACRC,SAAS;wBACP,gBAAgB;oBAClB;gBACF;YAEJ;QACF;QACA,MAAMe,eAAc1C,KAAK;gBAanBP;YAZJ,MAAM,EAAEA,GAAG,EAAE,GAAGR,QAAQW,MAAM;YAE9B,IAAI,CAACX,QAAQ0D,4BAA4B,EAAE;gBACzC,OAAO;oBACLC,SAAS;wBACP,MAAM,IAAIxD,oBAAY,CACpB;oBAEJ;gBACF;YACF;YAEA,IAAIK,EAAAA,WAAAA,IAAIqB,GAAG,qBAAPrB,SAASsB,MAAM,MAAK,UAAU;gBAChC8B,IAAAA,mCAA2B;gBAC3B,OAAO;oBACLD,SAAS;wBACPE,QAAQC,IAAI,CACV;oBAEJ;gBACF;YACF;YAEA,wEAAwE;YACxE,MAAMX,uBAAuBC,eAAI,CAACC,UAAU,CAACtC,MAAMI,IAAI,IACnDJ,MAAMI,IAAI,GACViC,eAAI,CAACE,IAAI,CAACtD,QAAQuD,MAAM,EAAExC,MAAMI,IAAI;YACxC,IAAI;oBAIG4C;gBAHLlE,MAAM,CAAC,wBAAwB,EAAEsD,sBAAsB;gBACvD,MAAMY,mBAAoB,MAAM/D,QAAQwD,cAAc,CAACL;gBAEvD,KAAKY,sCAAAA,iBAAiBC,iBAAiB,qBAAnC,AAACD,oCAA2DE,OAAO,EAAE;wBAClCF;oBAArCG,IAAAA,4CAAoC,GAACH,uCAAAA,iBAAiBC,iBAAiB,qBAAlCD,qCAAoCE,OAAO;gBAClF;gBAEA,OAAOF;YACT,EAAE,OAAO1B,OAAY;gBACnB,OAAO,IAAIC,SACT,gCAAgCa,uBAAuB,SAASd,MAAMO,OAAO,EAC7E;oBACEH,QAAQ;oBACRC,SAAS;wBACP,gBAAgB;oBAClB;gBACF;YAEJ;QACF;QACA,MAAMyB,eAAcxC,OAAO,EAAEZ,KAAK;YAChC,MAAMqD,WAAW,MAAMpE,QAAQqE,kBAAkB,CAACtD,OAAO,IAAIoB,CAAAA,UAAe,kBAAC,CAACR;YAC9E,OAAOyC,YAAY,IAAI9B,SAAS,MAAM;gBAAEG,QAAQ;YAAI;QACtD;IACF;AAEJ"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/createServerRouteMiddleware.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 */\n\nimport type { ProjectConfig } from '@expo/config';\nimport type { MiddlewareSettings } from 'expo-server';\nimport { createRequestHandler } from 'expo-server/adapter/http';\nimport { ImmutableRequest, type RouteInfo } from 'expo-server/private';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { fetchManifest } from './fetchRouterManifest';\nimport { getErrorOverlayHtmlAsync } from './metroErrorInterface';\nimport {\n warnInvalidWebOutput,\n warnInvalidMiddlewareOutput,\n warnInvalidMiddlewareMatcherSettings,\n} from './router';\nimport { CommandError } from '../../../utils/errors';\n\nconst debug = require('debug')('expo:start:server:metro') as typeof console.log;\n\nexport function createRouteHandlerMiddleware(\n projectRoot: string,\n options: {\n appDir: string;\n routerRoot: string;\n getStaticPageAsync: (\n pathname: string,\n route: RouteInfo<RegExp>,\n request?: ImmutableRequest\n ) => Promise<{ content: string }>;\n bundleApiRoute: (\n functionFilePath: string\n ) => Promise<null | Record<string, Function> | Response>;\n executeLoaderAsync: (\n route: RouteInfo<RegExp>,\n request: ImmutableRequest\n ) => Promise<Response | undefined>;\n config: ProjectConfig;\n headers: Record<string, string | string[]>;\n rsc?: {\n path: string;\n handler: {\n GET: (req: Request) => Promise<Response>;\n POST: (req: Request) => Promise<Response>;\n };\n };\n } & import('@expo/router-server/build/routes-manifest').Options\n) {\n if (!resolveFrom.silent(projectRoot, 'expo-router')) {\n throw new CommandError(\n `static and server rendering requires the expo-router package to be installed in your project. Either install the expo-router package or change 'web.output' to 'single' in your app.json.`\n );\n }\n\n return createRequestHandler(\n { build: '', isDevelopment: true },\n {\n async getRoutesManifest() {\n const manifest = await fetchManifest(projectRoot, options);\n debug('manifest', manifest);\n\n // TODO(@hassankhan): Invert the conditionals for an early return if no manifest if found\n\n if (\n manifest &&\n options.rsc &&\n !manifest.apiRoutes.find((route) => route.page.startsWith(options.rsc!.path))\n ) {\n // Insert the route before any catch-all routes that might match the RSC path.\n manifest.apiRoutes.unshift({\n file: require.resolve('@expo/cli/static/template/[...rsc]+api.ts'),\n page: `${options.rsc.path}/[...rsc]`,\n namedRegex: new RegExp(`^${options.rsc.path}(?:/(?<rsc>.+?))?(?:/)?$`),\n routeKeys: { rsc: 'rsc' },\n });\n }\n\n const { exp } = options.config;\n\n if (manifest && exp.extra?.router?.unstable_useServerDataLoaders === true) {\n // In development, set `loader` property on all HTML routes. We can't know which routes\n // have loaders without bundling via Metro to detect exports. In production, this is\n // populated by `exportStaticAsync.ts` after bundling.\n // At runtime, `getLoaderData()` returns a 404 response if no loader exists.\n for (const route of manifest.htmlRoutes) {\n route.loader = `_expo/loaders${route.page}.js`;\n }\n }\n\n // NOTE: no app dir if null\n // TODO: Redirect to 404 page\n return (\n manifest ?? {\n // Support the onboarding screen if there's no manifest\n htmlRoutes: [\n {\n file: 'index.js',\n page: '/index',\n routeKeys: {},\n namedRegex: /^\\/(?:index)?\\/?$/i,\n },\n ],\n apiRoutes: [],\n notFoundRoutes: [],\n redirects: [],\n rewrites: [],\n }\n );\n },\n async getHtml(request, route) {\n try {\n const { exp } = options.config;\n const isSSREnabled =\n exp.web?.output === 'server' && exp.extra?.router?.unstable_useServerRendering === true;\n\n const { content } = await options.getStaticPageAsync(\n request.url,\n route,\n isSSREnabled ? new ImmutableRequest(request) : undefined\n );\n return content;\n } catch (error: any) {\n // Forward the Metro server response as-is. It won't be pretty, but at least it will be accurate.\n\n try {\n return new Response(\n await getErrorOverlayHtmlAsync({\n error,\n projectRoot,\n routerRoot: options.routerRoot,\n }),\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n } catch (staticError: any) {\n debug('Failed to render static error overlay:', staticError);\n // Fallback error for when Expo Router is misconfigured in the project.\n return new Response(\n '<span><h3>Internal Error:</h3><b>Project is not setup correctly for static rendering (check terminal for more info):</b><br/>' +\n error.message +\n '<br/><br/>' +\n staticError.message +\n '</span>',\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n }\n },\n async handleRouteError(error) {\n // NOTE(@kitten): ExpoError is currently not exposed by expo-server just yet\n if (error && typeof error === 'object' && error.name === 'ExpoError') {\n // TODO(@krystofwoldrich): Can we show code snippet of the handler?\n // NOTE(@krystofwoldrich): Removing stack since to avoid confusion. The error is not in the server code.\n delete error.stack;\n }\n\n const htmlServerError = await getErrorOverlayHtmlAsync({\n error,\n projectRoot,\n routerRoot: options.routerRoot!,\n });\n\n return new Response(htmlServerError, {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n });\n },\n async getApiRoute(route) {\n // We check if RSC is enabled before the warning check, as `web.output` could be set to\n // `single`\n if (options.rsc && route.page.startsWith(options.rsc.path)) {\n return options.rsc.handler;\n }\n\n const { exp } = options.config;\n if (exp.web?.output !== 'server') {\n warnInvalidWebOutput();\n }\n\n // TODO(@kitten): Unify with MetroBundlerDevServer#exportExpoRouterApiRoutesAsync\n const resolvedFunctionPath = path.isAbsolute(route.file)\n ? route.file\n : path.join(options.appDir, route.file);\n try {\n debug(`Bundling API route at: ${resolvedFunctionPath}`);\n return await options.bundleApiRoute(resolvedFunctionPath!);\n } catch (error: any) {\n return new Response(\n 'Failed to load API Route: ' + resolvedFunctionPath + '\\n\\n' + error.message,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n },\n async getMiddleware(route) {\n const { exp } = options.config;\n\n if (!options.unstable_useServerMiddleware) {\n return {\n default: () => {\n throw new CommandError(\n 'Server middleware is not enabled. Add unstable_useServerMiddleware: true to your `expo-router` plugin config.'\n );\n },\n };\n }\n\n if (exp.web?.output !== 'server') {\n warnInvalidMiddlewareOutput();\n return {\n default: () => {\n console.warn(\n 'Server middleware is only supported when web.output is set to \"server\" in your app config'\n );\n },\n };\n }\n\n // TODO(@kitten): Unify with MetroBundlerDevServer#exportMiddlewareAsync\n const resolvedFunctionPath = path.isAbsolute(route.file)\n ? route.file\n : path.join(options.appDir, route.file);\n try {\n debug(`Bundling middleware at: ${resolvedFunctionPath}`);\n const middlewareModule = (await options.bundleApiRoute(resolvedFunctionPath!)) as any;\n\n if ((middlewareModule.unstable_settings as MiddlewareSettings)?.matcher) {\n warnInvalidMiddlewareMatcherSettings(middlewareModule.unstable_settings?.matcher);\n }\n\n return middlewareModule;\n } catch (error: any) {\n return new Response(\n 'Failed to load middleware: ' + resolvedFunctionPath + '\\n\\n' + error.message,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n },\n async getLoaderData(request, route) {\n const response = await options.executeLoaderAsync(route, new ImmutableRequest(request));\n return response ?? new Response(null, { status: 404 });\n },\n }\n );\n}\n"],"names":["createRouteHandlerMiddleware","debug","require","projectRoot","options","resolveFrom","silent","CommandError","createRequestHandler","build","isDevelopment","getRoutesManifest","exp","manifest","fetchManifest","rsc","apiRoutes","find","route","page","startsWith","path","unshift","file","resolve","namedRegex","RegExp","routeKeys","config","extra","router","unstable_useServerDataLoaders","htmlRoutes","loader","notFoundRoutes","redirects","rewrites","getHtml","request","isSSREnabled","web","output","unstable_useServerRendering","content","getStaticPageAsync","url","ImmutableRequest","undefined","error","Response","getErrorOverlayHtmlAsync","routerRoot","status","headers","staticError","message","handleRouteError","name","stack","htmlServerError","getApiRoute","handler","warnInvalidWebOutput","resolvedFunctionPath","isAbsolute","join","appDir","bundleApiRoute","getMiddleware","unstable_useServerMiddleware","default","warnInvalidMiddlewareOutput","console","warn","middlewareModule","unstable_settings","matcher","warnInvalidMiddlewareMatcherSettings","getLoaderData","response","executeLoaderAsync"],"mappings":"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"}
|
|
@@ -21,21 +21,9 @@ _export(exports, {
|
|
|
21
21
|
return inflateManifest;
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
|
-
function _resolvefrom() {
|
|
25
|
-
const data = /*#__PURE__*/ _interop_require_default(require("resolve-from"));
|
|
26
|
-
_resolvefrom = function() {
|
|
27
|
-
return data;
|
|
28
|
-
};
|
|
29
|
-
return data;
|
|
30
|
-
}
|
|
31
24
|
const _router = require("./router");
|
|
32
|
-
function _interop_require_default(obj) {
|
|
33
|
-
return obj && obj.__esModule ? obj : {
|
|
34
|
-
default: obj
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
25
|
function getExpoRouteManifestBuilderAsync(projectRoot) {
|
|
38
|
-
return require(
|
|
26
|
+
return require('@expo/router-server/build/routes-manifest').createRoutesManifest;
|
|
39
27
|
}
|
|
40
28
|
async function fetchManifest(projectRoot, options) {
|
|
41
29
|
const getManifest = getExpoRouteManifestBuilderAsync(projectRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/fetchRouterManifest.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 type { Options as RoutesManifestOptions } from '@expo/router-server/build/routes-manifest';\nimport { type
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/fetchRouterManifest.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 type { Options as RoutesManifestOptions } from '@expo/router-server/build/routes-manifest';\nimport { type RoutesManifest } from 'expo-server/private';\n\nimport { getRoutePaths } from './router';\n\nfunction getExpoRouteManifestBuilderAsync(projectRoot: string) {\n return require('@expo/router-server/build/routes-manifest')\n .createRoutesManifest as typeof import('@expo/router-server/build/routes-manifest').createRoutesManifest;\n}\n\ninterface FetchManifestOptions extends RoutesManifestOptions {\n asJson?: boolean;\n appDir: string;\n}\n\n// TODO: Simplify this now that we use Node.js directly, no need for the Metro bundler caching layer.\nasync function fetchManifest(\n projectRoot: string,\n options: FetchManifestOptions & { asJson: true }\n): Promise<RoutesManifest<string> | null>;\nasync function fetchManifest(\n projectRoot: string,\n options: FetchManifestOptions & { asJson?: false | undefined }\n): Promise<RoutesManifest<RegExp> | null>;\nasync function fetchManifest(\n projectRoot: string,\n options: FetchManifestOptions\n): Promise<RoutesManifest | null> {\n const getManifest = getExpoRouteManifestBuilderAsync(projectRoot);\n const paths = getRoutePaths(options.appDir);\n // Get the serialized manifest\n const jsonManifest = getManifest(paths, options);\n if (!jsonManifest) {\n return null;\n }\n\n if (!jsonManifest.htmlRoutes || !jsonManifest.apiRoutes) {\n throw new Error('Routes manifest is malformed: ' + JSON.stringify(jsonManifest, null, 2));\n }\n\n if (!options.asJson) {\n return inflateManifest(jsonManifest);\n } else {\n return jsonManifest;\n }\n}\n\nexport { fetchManifest };\n\n// Convert the serialized manifest to a usable format\nexport function inflateManifest(json: RoutesManifest<string>): RoutesManifest<RegExp> {\n return {\n ...json,\n middleware: json.middleware,\n htmlRoutes: json.htmlRoutes?.map((value) => {\n return {\n ...value,\n namedRegex: new RegExp(value.namedRegex),\n };\n }),\n apiRoutes: json.apiRoutes?.map((value) => {\n return {\n ...value,\n namedRegex: new RegExp(value.namedRegex),\n };\n }),\n notFoundRoutes: json.notFoundRoutes?.map((value) => {\n return {\n ...value,\n namedRegex: new RegExp(value.namedRegex),\n };\n }),\n redirects: json.redirects?.map((value: any) => {\n return {\n ...value,\n namedRegex: new RegExp(value.namedRegex),\n };\n }),\n rewrites: json.rewrites?.map((value: any) => {\n return {\n ...value,\n namedRegex: new RegExp(value.namedRegex),\n };\n }),\n };\n}\n"],"names":["fetchManifest","inflateManifest","getExpoRouteManifestBuilderAsync","projectRoot","require","createRoutesManifest","options","getManifest","paths","getRoutePaths","appDir","jsonManifest","htmlRoutes","apiRoutes","Error","JSON","stringify","asJson","json","middleware","map","value","namedRegex","RegExp","notFoundRoutes","redirects","rewrites"],"mappings":"AAAA;;;;;CAKC;;;;;;;;;;;IAgDQA,aAAa;eAAbA;;IAGOC,eAAe;eAAfA;;;wBA/Cc;AAE9B,SAASC,iCAAiCC,WAAmB;IAC3D,OAAOC,QAAQ,6CACZC,oBAAoB;AACzB;AAgBA,eAAeL,cACbG,WAAmB,EACnBG,OAA6B;IAE7B,MAAMC,cAAcL,iCAAiCC;IACrD,MAAMK,QAAQC,IAAAA,qBAAa,EAACH,QAAQI,MAAM;IAC1C,8BAA8B;IAC9B,MAAMC,eAAeJ,YAAYC,OAAOF;IACxC,IAAI,CAACK,cAAc;QACjB,OAAO;IACT;IAEA,IAAI,CAACA,aAAaC,UAAU,IAAI,CAACD,aAAaE,SAAS,EAAE;QACvD,MAAM,IAAIC,MAAM,mCAAmCC,KAAKC,SAAS,CAACL,cAAc,MAAM;IACxF;IAEA,IAAI,CAACL,QAAQW,MAAM,EAAE;QACnB,OAAOhB,gBAAgBU;IACzB,OAAO;QACL,OAAOA;IACT;AACF;AAKO,SAASV,gBAAgBiB,IAA4B;QAI5CA,kBAMDA,iBAMKA,sBAMLA,iBAMDA;IA3BZ,OAAO;QACL,GAAGA,IAAI;QACPC,YAAYD,KAAKC,UAAU;QAC3BP,UAAU,GAAEM,mBAAAA,KAAKN,UAAU,qBAAfM,iBAAiBE,GAAG,CAAC,CAACC;YAChC,OAAO;gBACL,GAAGA,KAAK;gBACRC,YAAY,IAAIC,OAAOF,MAAMC,UAAU;YACzC;QACF;QACAT,SAAS,GAAEK,kBAAAA,KAAKL,SAAS,qBAAdK,gBAAgBE,GAAG,CAAC,CAACC;YAC9B,OAAO;gBACL,GAAGA,KAAK;gBACRC,YAAY,IAAIC,OAAOF,MAAMC,UAAU;YACzC;QACF;QACAE,cAAc,GAAEN,uBAAAA,KAAKM,cAAc,qBAAnBN,qBAAqBE,GAAG,CAAC,CAACC;YACxC,OAAO;gBACL,GAAGA,KAAK;gBACRC,YAAY,IAAIC,OAAOF,MAAMC,UAAU;YACzC;QACF;QACAG,SAAS,GAAEP,kBAAAA,KAAKO,SAAS,qBAAdP,gBAAgBE,GAAG,CAAC,CAACC;YAC9B,OAAO;gBACL,GAAGA,KAAK;gBACRC,YAAY,IAAIC,OAAOF,MAAMC,UAAU;YACzC;QACF;QACAI,QAAQ,GAAER,iBAAAA,KAAKQ,QAAQ,qBAAbR,eAAeE,GAAG,CAAC,CAACC;YAC5B,OAAO;gBACL,GAAGA,KAAK;gBACRC,YAAY,IAAIC,OAAOF,MAAMC,UAAU;YACzC;QACF;IACF;AACF"}
|
|
@@ -260,9 +260,7 @@ async function instantiateMetroAsync(metroBundler, options, { isExporting, exp =
|
|
|
260
260
|
}
|
|
261
261
|
return middleware.use(metroMiddleware);
|
|
262
262
|
};
|
|
263
|
-
const devtoolsWebsocketEndpoints = (0, _DevToolsPluginWebsocketEndpoint.createDevToolsPluginWebsocketEndpoint)(
|
|
264
|
-
serverBaseUrl
|
|
265
|
-
});
|
|
263
|
+
const devtoolsWebsocketEndpoints = (0, _DevToolsPluginWebsocketEndpoint.createDevToolsPluginWebsocketEndpoint)();
|
|
266
264
|
Object.assign(websocketEndpoints, devtoolsWebsocketEndpoints);
|
|
267
265
|
}
|
|
268
266
|
// Attach Expo Atlas if enabled
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { type ExpoConfig, getConfig } from '@expo/config';\nimport { getMetroServerRoot } from '@expo/config/paths';\nimport type { Reporter } from '@expo/metro/metro';\nimport type Bundler from '@expo/metro/metro/Bundler';\nimport type { ReadOnlyGraph } from '@expo/metro/metro/DeltaBundler';\nimport type { TransformOptions } from '@expo/metro/metro/DeltaBundler/Worker';\nimport MetroHmrServer, { Client as MetroHmrClient } from '@expo/metro/metro/HmrServer';\nimport RevisionNotFoundError from '@expo/metro/metro/IncrementalBundler/RevisionNotFoundError';\nimport type MetroServer from '@expo/metro/metro/Server';\nimport formatBundlingError from '@expo/metro/metro/lib/formatBundlingError';\nimport { mergeConfig, resolveConfig, type ConfigT } from '@expo/metro/metro-config';\nimport { Terminal } from '@expo/metro/metro-core';\nimport { createStableModuleIdFactory, getDefaultConfig } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport http from 'http';\nimport path from 'path';\n\nimport { createDevToolsPluginWebsocketEndpoint } from './DevToolsPluginWebsocketEndpoint';\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { attachAtlasAsync } from './debugging/attachAtlas';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\nimport { createMetroMiddleware } from './dev-server/createMetroMiddleware';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { Log } from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { createCorsMiddleware } from '../middleware/CorsMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware } from '../middleware/mutations';\nimport { getPlatformBundlers } from '../platformBundlers';\n\n// NOTE(@kitten): We pass a custom createStableModuleIdFactory function into the Metro module ID factory sometimes\ninterface MetroServerWithModuleIdMod extends MetroServer {\n _createModuleId: ReturnType<typeof createStableModuleIdFactory> & ((path: string) => number);\n}\ninterface MetroHmrServerWithModuleIdMod extends MetroHmrServer<MetroHmrClient> {\n _createModuleId: ReturnType<typeof createStableModuleIdFactory> & ((path: string) => number);\n}\n\n// From expo/dev-server but with ability to use custom logger.\ntype MessageSocket = {\n broadcast: (method: string, params?: Record<string, any> | undefined) => void;\n};\n\n// TODO(@kitten): We assign this here to run server-side code bundled by metro\n// It's not isolated into a worker thread yet\n// Check `metro-require/require.ts` for how this setting is used\ndeclare namespace globalThis {\n let __requireCycleIgnorePatterns: readonly RegExp[] | undefined;\n}\n\nfunction asWritable<T>(input: T): { -readonly [K in keyof T]: T[K] } {\n return input;\n}\n\n// Wrap terminal and polyfill console.log so we can log during bundling without breaking the indicator.\nclass LogRespectingTerminal extends Terminal {\n constructor(stream: import('node:net').Socket | import('node:stream').Writable) {\n super(stream, { ttyPrint: true });\n\n const sendLog = (...msg: any[]) => {\n if (!msg.length) {\n this.log('');\n } else {\n const [format, ...args] = msg;\n this.log(format, ...args);\n }\n // Flush the logs to the terminal immediately so logs at the end of the process are not lost.\n this.flush();\n };\n\n console.log = sendLog;\n console.info = sendLog;\n }\n}\n\n// Share one instance of Terminal for all instances of Metro.\nconst terminal = new LogRespectingTerminal(process.stdout);\n\ninterface LoadMetroConfigOptions {\n maxWorkers?: number;\n port?: number;\n reporter?: Reporter;\n resetCache?: boolean;\n}\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadMetroConfigOptions,\n {\n exp,\n isExporting,\n getMetroBundler,\n }: { exp: ExpoConfig; isExporting: boolean; getMetroBundler: () => Bundler }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n\n const autolinkingModuleResolutionEnabled =\n exp.experiments?.autolinkingModuleResolution ?? env.EXPO_USE_STICKY_RESOLVER;\n\n const serverActionsEnabled =\n exp.experiments?.reactServerFunctions ?? env.EXPO_UNSTABLE_SERVER_FUNCTIONS;\n\n if (serverActionsEnabled) {\n process.env.EXPO_UNSTABLE_SERVER_FUNCTIONS = '1';\n }\n\n // NOTE: Enable all the experimental Metro flags when RSC is enabled.\n if (exp.experiments?.reactServerComponentRoutes || serverActionsEnabled) {\n process.env.EXPO_USE_METRO_REQUIRE = '1';\n }\n\n if (exp.experiments?.reactCanary) {\n Log.warn(`React 19 is enabled by default. Remove unused experiments.reactCanary flag.`);\n }\n\n const serverRoot = getMetroServerRoot(projectRoot);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n // NOTE: Allow external tools to override the metro config. This is considered internal and unstable\n const configPath = env.EXPO_OVERRIDE_METRO_CONFIG ?? undefined;\n const resolvedConfig = await resolveConfig(configPath, projectRoot);\n const defaultConfig = getDefaultConfig(projectRoot);\n\n let config: ConfigT = resolvedConfig.isEmpty\n ? defaultConfig\n : await mergeConfig(defaultConfig, resolvedConfig.config);\n\n // Set the watchfolders to include the projectRoot, as Metro assumes this\n // Force-override the reporter\n config = {\n ...config,\n\n // See: `overrideConfigWithArguments` https://github.com/facebook/metro/blob/5059e26/packages/metro-config/src/loadConfig.js#L274-L339\n // Compare to `LoadOptions` type (disregard `reporter` as we don't expose this)\n resetCache: !!options.resetCache,\n maxWorkers: options.maxWorkers ?? config.maxWorkers,\n server: {\n ...config.server,\n port: options.port ?? config.server.port,\n },\n\n watchFolders: !config.watchFolders.includes(config.projectRoot)\n ? [config.projectRoot, ...config.watchFolders]\n : config.watchFolders,\n reporter: {\n update(event) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\n\n globalThis.__requireCycleIgnorePatterns = config.resolver?.requireCycleIgnorePatterns;\n\n if (isExporting) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n asWritable(config.transformer).publicPath = `/assets?export_path=${\n (exp.experiments?.baseUrl ?? '') + '/assets'\n }`;\n } else {\n asWritable(config.transformer).publicPath = '/assets/?unstable_path=.';\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n\n if (exp.experiments?.reactCompiler) {\n Log.log(chalk.gray`React Compiler enabled`);\n }\n\n if (env.EXPO_UNSTABLE_TREE_SHAKING && !env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n throw new CommandError(\n 'EXPO_UNSTABLE_TREE_SHAKING requires EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH to be enabled.'\n );\n }\n\n if (env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n Log.warn(`Experimental bundle optimization is enabled.`);\n }\n if (env.EXPO_UNSTABLE_TREE_SHAKING) {\n Log.warn(`Experimental tree shaking is enabled.`);\n }\n if (env.EXPO_UNSTABLE_LOG_BOX) {\n Log.warn(`Experimental Expo LogBox is enabled.`);\n }\n if (autolinkingModuleResolutionEnabled) {\n Log.warn(`Experimental Expo Autolinking module resolver is enabled.`);\n }\n\n if (serverActionsEnabled) {\n Log.warn(\n `React Server Functions (beta) are enabled. Route rendering mode: ${exp.experiments?.reactServerComponentRoutes ? 'server' : 'client'}`\n );\n }\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n exp,\n platformBundlers,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n isAutolinkingResolverEnabled: autolinkingModuleResolutionEnabled,\n isExporting,\n isNamedRequiresEnabled: env.EXPO_USE_METRO_REQUIRE,\n isReactServerComponentsEnabled: !!exp.experiments?.reactServerComponentRoutes,\n getMetroBundler,\n });\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: LoadMetroConfigOptions,\n {\n isExporting,\n exp = getConfig(metroBundler.projectRoot, {\n skipSDKVersionRequirement: true,\n }).exp,\n }: { isExporting: boolean; exp?: ExpoConfig }\n): Promise<{\n metro: MetroServer;\n hmrServer: MetroHmrServer<MetroHmrClient> | null;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n const {\n config: metroConfig,\n setEventReporter,\n reporter,\n } = await loadMetroConfigAsync(projectRoot, options, {\n exp,\n isExporting,\n getMetroBundler() {\n return metro.getBundler().getBundler();\n },\n });\n\n // Create the core middleware stack for Metro, including websocket listeners\n const { middleware, messagesSocket, eventsSocket, websocketEndpoints } =\n createMetroMiddleware(metroConfig);\n\n // Get local URL to Metro bundler server (typically configured as 127.0.0.1:8081)\n const serverBaseUrl = metroBundler\n .getUrlCreator()\n .constructUrl({ scheme: 'http', hostType: 'localhost' });\n\n if (!isExporting) {\n // Enable correct CORS headers for Expo Router features\n prependMiddleware(middleware, createCorsMiddleware(exp));\n\n // Enable debug middleware for CDP-related debugging\n const { debugMiddleware, debugWebsocketEndpoints } = createDebugMiddleware({\n serverBaseUrl,\n reporter,\n });\n Object.assign(websocketEndpoints, debugWebsocketEndpoints);\n middleware.use(debugMiddleware);\n middleware.use('/_expo/debugger', createJsInspectorMiddleware());\n\n // TODO(cedric): `enhanceMiddleware` is deprecated, but is currently used to unify the middleware stacks\n // See: https://github.com/facebook/metro/commit/22e85fde85ec454792a1b70eba4253747a2587a9\n // See: https://github.com/facebook/metro/commit/d0d554381f119bb80ab09dbd6a1d310b54737e52\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n asWritable(metroConfig.server).enhanceMiddleware = (\n metroMiddleware: any,\n server: MetroServer\n ) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n const devtoolsWebsocketEndpoints = createDevToolsPluginWebsocketEndpoint({ serverBaseUrl });\n Object.assign(websocketEndpoints, devtoolsWebsocketEndpoints);\n }\n\n // Attach Expo Atlas if enabled\n await attachAtlasAsync({\n isExporting,\n exp,\n projectRoot,\n middleware,\n metroConfig,\n // NOTE(cedric): reset the Atlas file once, and reuse it for static exports\n resetAtlasFile: isExporting,\n });\n\n const { server, hmrServer, metro } = await runServer(\n metroBundler,\n metroConfig,\n {\n websocketEndpoints,\n watch: !isExporting && isWatchEnabled(),\n },\n {\n mockServer: isExporting,\n }\n );\n\n // Patch transform file to remove inconvenient customTransformOptions which are only used in single well-known files.\n const originalTransformFile = metro\n .getBundler()\n .getBundler()\n .transformFile.bind(metro.getBundler().getBundler());\n\n metro.getBundler().getBundler().transformFile = async function (\n filePath: string,\n transformOptions: TransformOptions,\n fileBuffer?: Buffer\n ) {\n return originalTransformFile(\n filePath,\n pruneCustomTransformOptions(\n projectRoot,\n filePath,\n // Clone the options so we don't mutate the original.\n {\n ...transformOptions,\n customTransformOptions: {\n __proto__: null,\n ...transformOptions.customTransformOptions,\n },\n }\n ),\n fileBuffer\n );\n };\n\n setEventReporter(eventsSocket.reportMetroEvent);\n\n // This function ensures that modules in source maps are sorted in the same\n // order as in a plain JS bundle.\n metro._getSortedModules = function (this: MetroServerWithModuleIdMod, graph: ReadOnlyGraph) {\n const modules = [...graph.dependencies.values()];\n\n const ctx = {\n // TODO(@kitten): Increase type-safety here\n platform: graph.transformOptions.platform!,\n environment: graph.transformOptions.customTransformOptions?.environment,\n };\n // Assign IDs to modules in a consistent order\n for (const module of modules) {\n this._createModuleId(module.path, ctx);\n }\n // Sort by IDs\n return modules.sort(\n (a, b) => this._createModuleId(a.path, ctx) - this._createModuleId(b.path, ctx)\n );\n };\n\n if (hmrServer) {\n let hmrJSBundle:\n | typeof import('@expo/metro-config/build/serializer/fork/hmrJSBundle').default\n | typeof import('@expo/metro/metro/DeltaBundler/Serializers/hmrJSBundle').default;\n\n try {\n hmrJSBundle = require('@expo/metro-config/build/serializer/fork/hmrJSBundle').default;\n } catch {\n // TODO: Add fallback for monorepo tests up until the fork is merged.\n Log.warn('Failed to load HMR serializer from @expo/metro-config, using fallback version.');\n hmrJSBundle = require('@expo/metro/metro/DeltaBundler/Serializers/hmrJSBundle');\n }\n\n // Patch HMR Server to send more info to the `_createModuleId` function for deterministic module IDs and add support for serializing HMR updates the same as all other bundles.\n hmrServer._prepareMessage = async function (\n this: MetroHmrServerWithModuleIdMod,\n group,\n options,\n changeEvent\n ) {\n // Fork of https://github.com/facebook/metro/blob/3b3e0aaf725cfa6907bf2c8b5fbc0da352d29efe/packages/metro/src/HmrServer.js#L327-L393\n // with patch for `_createModuleId`.\n const logger = !options.isInitialUpdate ? changeEvent?.logger : null;\n try {\n const revPromise = this._bundler.getRevision(group.revisionId);\n if (!revPromise) {\n return {\n type: 'error',\n body: formatBundlingError(new RevisionNotFoundError(group.revisionId)),\n };\n }\n logger?.point('updateGraph_start');\n const { revision, delta } = await this._bundler.updateGraph(await revPromise, false);\n logger?.point('updateGraph_end');\n this._clientGroups.delete(group.revisionId);\n group.revisionId = revision.id;\n for (const client of group.clients) {\n client.revisionIds = client.revisionIds.filter(\n (revisionId) => revisionId !== group.revisionId\n );\n client.revisionIds.push(revision.id);\n }\n this._clientGroups.set(group.revisionId, group);\n logger?.point('serialize_start');\n // NOTE(EvanBacon): This is the patch\n const moduleIdContext = {\n // TODO(@kitten): Increase type-safety here\n platform: revision.graph.transformOptions.platform!,\n environment: revision.graph.transformOptions.customTransformOptions?.environment,\n };\n const hmrUpdate = hmrJSBundle(delta, revision.graph, {\n clientUrl: group.clientUrl,\n // NOTE(EvanBacon): This is also the patch\n createModuleId: (moduleId: string) => {\n return this._createModuleId(moduleId, moduleIdContext);\n },\n includeAsyncPaths: group.graphOptions.lazy,\n projectRoot: this._config.projectRoot,\n serverRoot: this._config.server.unstable_serverRoot ?? this._config.projectRoot,\n });\n logger?.point('serialize_end');\n return {\n type: 'update',\n body: {\n revisionId: revision.id,\n isInitialUpdate: options.isInitialUpdate,\n ...hmrUpdate,\n },\n };\n } catch (error: any) {\n const formattedError = formatBundlingError(error);\n this._config.reporter.update({\n type: 'bundling_error',\n error,\n });\n return {\n type: 'error',\n body: formattedError,\n };\n }\n };\n }\n\n return {\n metro,\n hmrServer,\n server,\n middleware,\n messageSocket: messagesSocket,\n };\n}\n\n// TODO: Fork the entire transform function so we can simply regex the file contents for keywords instead.\nfunction pruneCustomTransformOptions(\n projectRoot: string,\n filePath: string,\n transformOptions: TransformOptions\n): TransformOptions {\n // Normalize the filepath for cross platform checking.\n filePath = filePath.split(path.sep).join('/');\n\n if (\n transformOptions.customTransformOptions?.dom &&\n // The only generated file that needs the dom root is `expo/dom/entry.js`\n !filePath.match(/expo\\/dom\\/entry\\.js$/)\n ) {\n // Clear the dom root option if we aren't transforming the magic entry file, this ensures\n // that cached artifacts from other DOM component bundles can be reused.\n transformOptions.customTransformOptions.dom = 'true';\n }\n\n const routerRoot = transformOptions.customTransformOptions?.routerRoot;\n if (typeof routerRoot === 'string') {\n const isRouterEntry = /\\/expo-router\\/_ctx/.test(filePath);\n // The router root is used all over expo-router (`process.env.EXPO_ROUTER_ABS_APP_ROOT`, `process.env.EXPO_ROUTER_APP_ROOT`) so we'll just ignore the entire package.\n const isRouterModule = /\\/expo-router\\/build\\//.test(filePath);\n // Any page/router inside the expo-router app folder may access the `routerRoot` option to determine whether it's in the app folder\n const resolvedRouterRoot = path.resolve(projectRoot, routerRoot).split(path.sep).join('/');\n const isRouterRoute = path.isAbsolute(filePath) && filePath.startsWith(resolvedRouterRoot);\n\n // In any other file than the above, we enforce that we mustn't use `routerRoot`, and set it to an arbitrary value here (the default)\n // to ensure that the cache never invalidates when this value is changed\n if (!isRouterEntry && !isRouterModule && !isRouterRoute) {\n transformOptions.customTransformOptions!.routerRoot = 'app';\n }\n }\n\n if (\n transformOptions.customTransformOptions?.asyncRoutes &&\n // The async routes settings are also used in `expo-router/_ctx.ios.js` (and other platform variants) via `process.env.EXPO_ROUTER_IMPORT_MODE`\n !(filePath.match(/\\/expo-router\\/_ctx/) || filePath.match(/\\/expo-router\\/build\\//))\n ) {\n delete transformOptions.customTransformOptions.asyncRoutes;\n }\n\n if (\n transformOptions.customTransformOptions?.clientBoundaries &&\n // The client boundaries are only used in `expo/virtual/rsc.js` for production RSC exports.\n !filePath.match(/\\/expo\\/virtual\\/rsc\\.js$/)\n ) {\n delete transformOptions.customTransformOptions.clientBoundaries;\n }\n\n return transformOptions;\n}\n\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["instantiateMetroAsync","isWatchEnabled","loadMetroConfigAsync","asWritable","input","LogRespectingTerminal","Terminal","constructor","stream","ttyPrint","sendLog","msg","length","log","format","args","flush","console","info","terminal","process","stdout","projectRoot","options","exp","isExporting","getMetroBundler","config","reportEvent","autolinkingModuleResolutionEnabled","experiments","autolinkingModuleResolution","env","EXPO_USE_STICKY_RESOLVER","serverActionsEnabled","reactServerFunctions","EXPO_UNSTABLE_SERVER_FUNCTIONS","reactServerComponentRoutes","EXPO_USE_METRO_REQUIRE","reactCanary","Log","warn","serverRoot","getMetroServerRoot","terminalReporter","MetroTerminalReporter","configPath","EXPO_OVERRIDE_METRO_CONFIG","undefined","resolvedConfig","resolveConfig","defaultConfig","getDefaultConfig","isEmpty","mergeConfig","resetCache","maxWorkers","server","port","watchFolders","includes","reporter","update","event","globalThis","__requireCycleIgnorePatterns","resolver","requireCycleIgnorePatterns","transformer","publicPath","baseUrl","platformBundlers","getPlatformBundlers","reactCompiler","chalk","gray","EXPO_UNSTABLE_TREE_SHAKING","EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH","CommandError","EXPO_UNSTABLE_LOG_BOX","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","isAutolinkingResolverEnabled","isNamedRequiresEnabled","isReactServerComponentsEnabled","setEventReporter","logger","metroBundler","getConfig","skipSDKVersionRequirement","metroConfig","metro","getBundler","middleware","messagesSocket","eventsSocket","websocketEndpoints","createMetroMiddleware","serverBaseUrl","getUrlCreator","constructUrl","scheme","hostType","prependMiddleware","createCorsMiddleware","debugMiddleware","debugWebsocketEndpoints","createDebugMiddleware","Object","assign","use","createJsInspectorMiddleware","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","devtoolsWebsocketEndpoints","createDevToolsPluginWebsocketEndpoint","attachAtlasAsync","resetAtlasFile","hmrServer","runServer","watch","mockServer","originalTransformFile","transformFile","bind","filePath","transformOptions","fileBuffer","pruneCustomTransformOptions","customTransformOptions","__proto__","reportMetroEvent","_getSortedModules","graph","modules","dependencies","values","ctx","platform","environment","module","_createModuleId","path","sort","a","b","hmrJSBundle","require","default","_prepareMessage","group","changeEvent","isInitialUpdate","revision","revPromise","_bundler","getRevision","revisionId","type","body","formatBundlingError","RevisionNotFoundError","point","delta","updateGraph","_clientGroups","delete","id","client","clients","revisionIds","filter","push","set","moduleIdContext","hmrUpdate","clientUrl","createModuleId","moduleId","includeAsyncPaths","graphOptions","lazy","_config","unstable_serverRoot","error","formattedError","messageSocket","split","sep","join","dom","match","routerRoot","isRouterEntry","test","isRouterModule","resolvedRouterRoot","resolve","isRouterRoute","isAbsolute","startsWith","asyncRoutes","clientBoundaries","CI"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { type ExpoConfig, getConfig } from '@expo/config';\nimport { getMetroServerRoot } from '@expo/config/paths';\nimport type { Reporter } from '@expo/metro/metro';\nimport type Bundler from '@expo/metro/metro/Bundler';\nimport type { ReadOnlyGraph } from '@expo/metro/metro/DeltaBundler';\nimport type { TransformOptions } from '@expo/metro/metro/DeltaBundler/Worker';\nimport MetroHmrServer, { Client as MetroHmrClient } from '@expo/metro/metro/HmrServer';\nimport RevisionNotFoundError from '@expo/metro/metro/IncrementalBundler/RevisionNotFoundError';\nimport type MetroServer from '@expo/metro/metro/Server';\nimport formatBundlingError from '@expo/metro/metro/lib/formatBundlingError';\nimport { mergeConfig, resolveConfig, type ConfigT } from '@expo/metro/metro-config';\nimport { Terminal } from '@expo/metro/metro-core';\nimport { createStableModuleIdFactory, getDefaultConfig } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport http from 'http';\nimport path from 'path';\n\nimport { createDevToolsPluginWebsocketEndpoint } from './DevToolsPluginWebsocketEndpoint';\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { attachAtlasAsync } from './debugging/attachAtlas';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\nimport { createMetroMiddleware } from './dev-server/createMetroMiddleware';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { Log } from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { createCorsMiddleware } from '../middleware/CorsMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware } from '../middleware/mutations';\nimport { getPlatformBundlers } from '../platformBundlers';\n\n// NOTE(@kitten): We pass a custom createStableModuleIdFactory function into the Metro module ID factory sometimes\ninterface MetroServerWithModuleIdMod extends MetroServer {\n _createModuleId: ReturnType<typeof createStableModuleIdFactory> & ((path: string) => number);\n}\ninterface MetroHmrServerWithModuleIdMod extends MetroHmrServer<MetroHmrClient> {\n _createModuleId: ReturnType<typeof createStableModuleIdFactory> & ((path: string) => number);\n}\n\n// From expo/dev-server but with ability to use custom logger.\ntype MessageSocket = {\n broadcast: (method: string, params?: Record<string, any> | undefined) => void;\n};\n\n// TODO(@kitten): We assign this here to run server-side code bundled by metro\n// It's not isolated into a worker thread yet\n// Check `metro-require/require.ts` for how this setting is used\ndeclare namespace globalThis {\n let __requireCycleIgnorePatterns: readonly RegExp[] | undefined;\n}\n\nfunction asWritable<T>(input: T): { -readonly [K in keyof T]: T[K] } {\n return input;\n}\n\n// Wrap terminal and polyfill console.log so we can log during bundling without breaking the indicator.\nclass LogRespectingTerminal extends Terminal {\n constructor(stream: import('node:net').Socket | import('node:stream').Writable) {\n super(stream, { ttyPrint: true });\n\n const sendLog = (...msg: any[]) => {\n if (!msg.length) {\n this.log('');\n } else {\n const [format, ...args] = msg;\n this.log(format, ...args);\n }\n // Flush the logs to the terminal immediately so logs at the end of the process are not lost.\n this.flush();\n };\n\n console.log = sendLog;\n console.info = sendLog;\n }\n}\n\n// Share one instance of Terminal for all instances of Metro.\nconst terminal = new LogRespectingTerminal(process.stdout);\n\ninterface LoadMetroConfigOptions {\n maxWorkers?: number;\n port?: number;\n reporter?: Reporter;\n resetCache?: boolean;\n}\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadMetroConfigOptions,\n {\n exp,\n isExporting,\n getMetroBundler,\n }: { exp: ExpoConfig; isExporting: boolean; getMetroBundler: () => Bundler }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n\n const autolinkingModuleResolutionEnabled =\n exp.experiments?.autolinkingModuleResolution ?? env.EXPO_USE_STICKY_RESOLVER;\n\n const serverActionsEnabled =\n exp.experiments?.reactServerFunctions ?? env.EXPO_UNSTABLE_SERVER_FUNCTIONS;\n\n if (serverActionsEnabled) {\n process.env.EXPO_UNSTABLE_SERVER_FUNCTIONS = '1';\n }\n\n // NOTE: Enable all the experimental Metro flags when RSC is enabled.\n if (exp.experiments?.reactServerComponentRoutes || serverActionsEnabled) {\n process.env.EXPO_USE_METRO_REQUIRE = '1';\n }\n\n if (exp.experiments?.reactCanary) {\n Log.warn(`React 19 is enabled by default. Remove unused experiments.reactCanary flag.`);\n }\n\n const serverRoot = getMetroServerRoot(projectRoot);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n // NOTE: Allow external tools to override the metro config. This is considered internal and unstable\n const configPath = env.EXPO_OVERRIDE_METRO_CONFIG ?? undefined;\n const resolvedConfig = await resolveConfig(configPath, projectRoot);\n const defaultConfig = getDefaultConfig(projectRoot);\n\n let config: ConfigT = resolvedConfig.isEmpty\n ? defaultConfig\n : await mergeConfig(defaultConfig, resolvedConfig.config);\n\n // Set the watchfolders to include the projectRoot, as Metro assumes this\n // Force-override the reporter\n config = {\n ...config,\n\n // See: `overrideConfigWithArguments` https://github.com/facebook/metro/blob/5059e26/packages/metro-config/src/loadConfig.js#L274-L339\n // Compare to `LoadOptions` type (disregard `reporter` as we don't expose this)\n resetCache: !!options.resetCache,\n maxWorkers: options.maxWorkers ?? config.maxWorkers,\n server: {\n ...config.server,\n port: options.port ?? config.server.port,\n },\n\n watchFolders: !config.watchFolders.includes(config.projectRoot)\n ? [config.projectRoot, ...config.watchFolders]\n : config.watchFolders,\n reporter: {\n update(event) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\n\n globalThis.__requireCycleIgnorePatterns = config.resolver?.requireCycleIgnorePatterns;\n\n if (isExporting) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n asWritable(config.transformer).publicPath = `/assets?export_path=${\n (exp.experiments?.baseUrl ?? '') + '/assets'\n }`;\n } else {\n asWritable(config.transformer).publicPath = '/assets/?unstable_path=.';\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n\n if (exp.experiments?.reactCompiler) {\n Log.log(chalk.gray`React Compiler enabled`);\n }\n\n if (env.EXPO_UNSTABLE_TREE_SHAKING && !env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n throw new CommandError(\n 'EXPO_UNSTABLE_TREE_SHAKING requires EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH to be enabled.'\n );\n }\n\n if (env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n Log.warn(`Experimental bundle optimization is enabled.`);\n }\n if (env.EXPO_UNSTABLE_TREE_SHAKING) {\n Log.warn(`Experimental tree shaking is enabled.`);\n }\n if (env.EXPO_UNSTABLE_LOG_BOX) {\n Log.warn(`Experimental Expo LogBox is enabled.`);\n }\n if (autolinkingModuleResolutionEnabled) {\n Log.warn(`Experimental Expo Autolinking module resolver is enabled.`);\n }\n\n if (serverActionsEnabled) {\n Log.warn(\n `React Server Functions (beta) are enabled. Route rendering mode: ${exp.experiments?.reactServerComponentRoutes ? 'server' : 'client'}`\n );\n }\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n exp,\n platformBundlers,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n isAutolinkingResolverEnabled: autolinkingModuleResolutionEnabled,\n isExporting,\n isNamedRequiresEnabled: env.EXPO_USE_METRO_REQUIRE,\n isReactServerComponentsEnabled: !!exp.experiments?.reactServerComponentRoutes,\n getMetroBundler,\n });\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: LoadMetroConfigOptions,\n {\n isExporting,\n exp = getConfig(metroBundler.projectRoot, {\n skipSDKVersionRequirement: true,\n }).exp,\n }: { isExporting: boolean; exp?: ExpoConfig }\n): Promise<{\n metro: MetroServer;\n hmrServer: MetroHmrServer<MetroHmrClient> | null;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n const {\n config: metroConfig,\n setEventReporter,\n reporter,\n } = await loadMetroConfigAsync(projectRoot, options, {\n exp,\n isExporting,\n getMetroBundler() {\n return metro.getBundler().getBundler();\n },\n });\n\n // Create the core middleware stack for Metro, including websocket listeners\n const { middleware, messagesSocket, eventsSocket, websocketEndpoints } =\n createMetroMiddleware(metroConfig);\n\n // Get local URL to Metro bundler server (typically configured as 127.0.0.1:8081)\n const serverBaseUrl = metroBundler\n .getUrlCreator()\n .constructUrl({ scheme: 'http', hostType: 'localhost' });\n\n if (!isExporting) {\n // Enable correct CORS headers for Expo Router features\n prependMiddleware(middleware, createCorsMiddleware(exp));\n\n // Enable debug middleware for CDP-related debugging\n const { debugMiddleware, debugWebsocketEndpoints } = createDebugMiddleware({\n serverBaseUrl,\n reporter,\n });\n Object.assign(websocketEndpoints, debugWebsocketEndpoints);\n middleware.use(debugMiddleware);\n middleware.use('/_expo/debugger', createJsInspectorMiddleware());\n\n // TODO(cedric): `enhanceMiddleware` is deprecated, but is currently used to unify the middleware stacks\n // See: https://github.com/facebook/metro/commit/22e85fde85ec454792a1b70eba4253747a2587a9\n // See: https://github.com/facebook/metro/commit/d0d554381f119bb80ab09dbd6a1d310b54737e52\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n asWritable(metroConfig.server).enhanceMiddleware = (\n metroMiddleware: any,\n server: MetroServer\n ) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n const devtoolsWebsocketEndpoints = createDevToolsPluginWebsocketEndpoint();\n Object.assign(websocketEndpoints, devtoolsWebsocketEndpoints);\n }\n\n // Attach Expo Atlas if enabled\n await attachAtlasAsync({\n isExporting,\n exp,\n projectRoot,\n middleware,\n metroConfig,\n // NOTE(cedric): reset the Atlas file once, and reuse it for static exports\n resetAtlasFile: isExporting,\n });\n\n const { server, hmrServer, metro } = await runServer(\n metroBundler,\n metroConfig,\n {\n websocketEndpoints,\n watch: !isExporting && isWatchEnabled(),\n },\n {\n mockServer: isExporting,\n }\n );\n\n // Patch transform file to remove inconvenient customTransformOptions which are only used in single well-known files.\n const originalTransformFile = metro\n .getBundler()\n .getBundler()\n .transformFile.bind(metro.getBundler().getBundler());\n\n metro.getBundler().getBundler().transformFile = async function (\n filePath: string,\n transformOptions: TransformOptions,\n fileBuffer?: Buffer\n ) {\n return originalTransformFile(\n filePath,\n pruneCustomTransformOptions(\n projectRoot,\n filePath,\n // Clone the options so we don't mutate the original.\n {\n ...transformOptions,\n customTransformOptions: {\n __proto__: null,\n ...transformOptions.customTransformOptions,\n },\n }\n ),\n fileBuffer\n );\n };\n\n setEventReporter(eventsSocket.reportMetroEvent);\n\n // This function ensures that modules in source maps are sorted in the same\n // order as in a plain JS bundle.\n metro._getSortedModules = function (this: MetroServerWithModuleIdMod, graph: ReadOnlyGraph) {\n const modules = [...graph.dependencies.values()];\n\n const ctx = {\n // TODO(@kitten): Increase type-safety here\n platform: graph.transformOptions.platform!,\n environment: graph.transformOptions.customTransformOptions?.environment,\n };\n // Assign IDs to modules in a consistent order\n for (const module of modules) {\n this._createModuleId(module.path, ctx);\n }\n // Sort by IDs\n return modules.sort(\n (a, b) => this._createModuleId(a.path, ctx) - this._createModuleId(b.path, ctx)\n );\n };\n\n if (hmrServer) {\n let hmrJSBundle:\n | typeof import('@expo/metro-config/build/serializer/fork/hmrJSBundle').default\n | typeof import('@expo/metro/metro/DeltaBundler/Serializers/hmrJSBundle').default;\n\n try {\n hmrJSBundle = require('@expo/metro-config/build/serializer/fork/hmrJSBundle').default;\n } catch {\n // TODO: Add fallback for monorepo tests up until the fork is merged.\n Log.warn('Failed to load HMR serializer from @expo/metro-config, using fallback version.');\n hmrJSBundle = require('@expo/metro/metro/DeltaBundler/Serializers/hmrJSBundle');\n }\n\n // Patch HMR Server to send more info to the `_createModuleId` function for deterministic module IDs and add support for serializing HMR updates the same as all other bundles.\n hmrServer._prepareMessage = async function (\n this: MetroHmrServerWithModuleIdMod,\n group,\n options,\n changeEvent\n ) {\n // Fork of https://github.com/facebook/metro/blob/3b3e0aaf725cfa6907bf2c8b5fbc0da352d29efe/packages/metro/src/HmrServer.js#L327-L393\n // with patch for `_createModuleId`.\n const logger = !options.isInitialUpdate ? changeEvent?.logger : null;\n try {\n const revPromise = this._bundler.getRevision(group.revisionId);\n if (!revPromise) {\n return {\n type: 'error',\n body: formatBundlingError(new RevisionNotFoundError(group.revisionId)),\n };\n }\n logger?.point('updateGraph_start');\n const { revision, delta } = await this._bundler.updateGraph(await revPromise, false);\n logger?.point('updateGraph_end');\n this._clientGroups.delete(group.revisionId);\n group.revisionId = revision.id;\n for (const client of group.clients) {\n client.revisionIds = client.revisionIds.filter(\n (revisionId) => revisionId !== group.revisionId\n );\n client.revisionIds.push(revision.id);\n }\n this._clientGroups.set(group.revisionId, group);\n logger?.point('serialize_start');\n // NOTE(EvanBacon): This is the patch\n const moduleIdContext = {\n // TODO(@kitten): Increase type-safety here\n platform: revision.graph.transformOptions.platform!,\n environment: revision.graph.transformOptions.customTransformOptions?.environment,\n };\n const hmrUpdate = hmrJSBundle(delta, revision.graph, {\n clientUrl: group.clientUrl,\n // NOTE(EvanBacon): This is also the patch\n createModuleId: (moduleId: string) => {\n return this._createModuleId(moduleId, moduleIdContext);\n },\n includeAsyncPaths: group.graphOptions.lazy,\n projectRoot: this._config.projectRoot,\n serverRoot: this._config.server.unstable_serverRoot ?? this._config.projectRoot,\n });\n logger?.point('serialize_end');\n return {\n type: 'update',\n body: {\n revisionId: revision.id,\n isInitialUpdate: options.isInitialUpdate,\n ...hmrUpdate,\n },\n };\n } catch (error: any) {\n const formattedError = formatBundlingError(error);\n this._config.reporter.update({\n type: 'bundling_error',\n error,\n });\n return {\n type: 'error',\n body: formattedError,\n };\n }\n };\n }\n\n return {\n metro,\n hmrServer,\n server,\n middleware,\n messageSocket: messagesSocket,\n };\n}\n\n// TODO: Fork the entire transform function so we can simply regex the file contents for keywords instead.\nfunction pruneCustomTransformOptions(\n projectRoot: string,\n filePath: string,\n transformOptions: TransformOptions\n): TransformOptions {\n // Normalize the filepath for cross platform checking.\n filePath = filePath.split(path.sep).join('/');\n\n if (\n transformOptions.customTransformOptions?.dom &&\n // The only generated file that needs the dom root is `expo/dom/entry.js`\n !filePath.match(/expo\\/dom\\/entry\\.js$/)\n ) {\n // Clear the dom root option if we aren't transforming the magic entry file, this ensures\n // that cached artifacts from other DOM component bundles can be reused.\n transformOptions.customTransformOptions.dom = 'true';\n }\n\n const routerRoot = transformOptions.customTransformOptions?.routerRoot;\n if (typeof routerRoot === 'string') {\n const isRouterEntry = /\\/expo-router\\/_ctx/.test(filePath);\n // The router root is used all over expo-router (`process.env.EXPO_ROUTER_ABS_APP_ROOT`, `process.env.EXPO_ROUTER_APP_ROOT`) so we'll just ignore the entire package.\n const isRouterModule = /\\/expo-router\\/build\\//.test(filePath);\n // Any page/router inside the expo-router app folder may access the `routerRoot` option to determine whether it's in the app folder\n const resolvedRouterRoot = path.resolve(projectRoot, routerRoot).split(path.sep).join('/');\n const isRouterRoute = path.isAbsolute(filePath) && filePath.startsWith(resolvedRouterRoot);\n\n // In any other file than the above, we enforce that we mustn't use `routerRoot`, and set it to an arbitrary value here (the default)\n // to ensure that the cache never invalidates when this value is changed\n if (!isRouterEntry && !isRouterModule && !isRouterRoute) {\n transformOptions.customTransformOptions!.routerRoot = 'app';\n }\n }\n\n if (\n transformOptions.customTransformOptions?.asyncRoutes &&\n // The async routes settings are also used in `expo-router/_ctx.ios.js` (and other platform variants) via `process.env.EXPO_ROUTER_IMPORT_MODE`\n !(filePath.match(/\\/expo-router\\/_ctx/) || filePath.match(/\\/expo-router\\/build\\//))\n ) {\n delete transformOptions.customTransformOptions.asyncRoutes;\n }\n\n if (\n transformOptions.customTransformOptions?.clientBoundaries &&\n // The client boundaries are only used in `expo/virtual/rsc.js` for production RSC exports.\n !filePath.match(/\\/expo\\/virtual\\/rsc\\.js$/)\n ) {\n delete transformOptions.customTransformOptions.clientBoundaries;\n }\n\n return transformOptions;\n}\n\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["instantiateMetroAsync","isWatchEnabled","loadMetroConfigAsync","asWritable","input","LogRespectingTerminal","Terminal","constructor","stream","ttyPrint","sendLog","msg","length","log","format","args","flush","console","info","terminal","process","stdout","projectRoot","options","exp","isExporting","getMetroBundler","config","reportEvent","autolinkingModuleResolutionEnabled","experiments","autolinkingModuleResolution","env","EXPO_USE_STICKY_RESOLVER","serverActionsEnabled","reactServerFunctions","EXPO_UNSTABLE_SERVER_FUNCTIONS","reactServerComponentRoutes","EXPO_USE_METRO_REQUIRE","reactCanary","Log","warn","serverRoot","getMetroServerRoot","terminalReporter","MetroTerminalReporter","configPath","EXPO_OVERRIDE_METRO_CONFIG","undefined","resolvedConfig","resolveConfig","defaultConfig","getDefaultConfig","isEmpty","mergeConfig","resetCache","maxWorkers","server","port","watchFolders","includes","reporter","update","event","globalThis","__requireCycleIgnorePatterns","resolver","requireCycleIgnorePatterns","transformer","publicPath","baseUrl","platformBundlers","getPlatformBundlers","reactCompiler","chalk","gray","EXPO_UNSTABLE_TREE_SHAKING","EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH","CommandError","EXPO_UNSTABLE_LOG_BOX","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","isAutolinkingResolverEnabled","isNamedRequiresEnabled","isReactServerComponentsEnabled","setEventReporter","logger","metroBundler","getConfig","skipSDKVersionRequirement","metroConfig","metro","getBundler","middleware","messagesSocket","eventsSocket","websocketEndpoints","createMetroMiddleware","serverBaseUrl","getUrlCreator","constructUrl","scheme","hostType","prependMiddleware","createCorsMiddleware","debugMiddleware","debugWebsocketEndpoints","createDebugMiddleware","Object","assign","use","createJsInspectorMiddleware","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","devtoolsWebsocketEndpoints","createDevToolsPluginWebsocketEndpoint","attachAtlasAsync","resetAtlasFile","hmrServer","runServer","watch","mockServer","originalTransformFile","transformFile","bind","filePath","transformOptions","fileBuffer","pruneCustomTransformOptions","customTransformOptions","__proto__","reportMetroEvent","_getSortedModules","graph","modules","dependencies","values","ctx","platform","environment","module","_createModuleId","path","sort","a","b","hmrJSBundle","require","default","_prepareMessage","group","changeEvent","isInitialUpdate","revision","revPromise","_bundler","getRevision","revisionId","type","body","formatBundlingError","RevisionNotFoundError","point","delta","updateGraph","_clientGroups","delete","id","client","clients","revisionIds","filter","push","set","moduleIdContext","hmrUpdate","clientUrl","createModuleId","moduleId","includeAsyncPaths","graphOptions","lazy","_config","unstable_serverRoot","error","formattedError","messageSocket","split","sep","join","dom","match","routerRoot","isRouterEntry","test","isRouterModule","resolvedRouterRoot","resolve","isRouterRoute","isAbsolute","startsWith","asyncRoutes","clientBoundaries","CI"],"mappings":";;;;;;;;;;;IA2NsBA,qBAAqB;eAArBA;;IAsSNC,cAAc;eAAdA;;IAzaMC,oBAAoB;eAApBA;;;;yBAxFqB;;;;;;;yBACR;;;;;;;gEAMD;;;;;;;gEAEF;;;;;;;yBACyB;;;;;;;yBAChC;;;;;;;yBACqC;;;;;;;gEAC5C;;;;;;;gEAED;;;;;;iDAEqC;uCAEhB;6BACL;uCACK;uCACA;+BACZ;wCACkB;qBACxB;qBACA;wBACS;gCACQ;6CACO;2BACV;kCACE;;;;;;AAsBpC,SAASC,WAAcC,KAAQ;IAC7B,OAAOA;AACT;AAEA,uGAAuG;AACvG,MAAMC,8BAA8BC,qBAAQ;IAC1CC,YAAYC,MAAkE,CAAE;QAC9E,KAAK,CAACA,QAAQ;YAAEC,UAAU;QAAK;QAE/B,MAAMC,UAAU,CAAC,GAAGC;YAClB,IAAI,CAACA,IAAIC,MAAM,EAAE;gBACf,IAAI,CAACC,GAAG,CAAC;YACX,OAAO;gBACL,MAAM,CAACC,QAAQ,GAAGC,KAAK,GAAGJ;gBAC1B,IAAI,CAACE,GAAG,CAACC,WAAWC;YACtB;YACA,6FAA6F;YAC7F,IAAI,CAACC,KAAK;QACZ;QAEAC,QAAQJ,GAAG,GAAGH;QACdO,QAAQC,IAAI,GAAGR;IACjB;AACF;AAEA,6DAA6D;AAC7D,MAAMS,WAAW,IAAId,sBAAsBe,QAAQC,MAAM;AASlD,eAAenB,qBACpBoB,WAAmB,EACnBC,OAA+B,EAC/B,EACEC,GAAG,EACHC,WAAW,EACXC,eAAe,EAC2D;QAK1EF,kBAGAA,mBAOEA,mBAIAA,mBA2CsCG,kBAatCH,mBAiCsBA,mBAIUA;IA9GpC,IAAII;IAEJ,MAAMC,qCACJL,EAAAA,mBAAAA,IAAIM,WAAW,qBAAfN,iBAAiBO,2BAA2B,KAAIC,QAAG,CAACC,wBAAwB;IAE9E,MAAMC,uBACJV,EAAAA,oBAAAA,IAAIM,WAAW,qBAAfN,kBAAiBW,oBAAoB,KAAIH,QAAG,CAACI,8BAA8B;IAE7E,IAAIF,sBAAsB;QACxBd,QAAQY,GAAG,CAACI,8BAA8B,GAAG;IAC/C;IAEA,qEAAqE;IACrE,IAAIZ,EAAAA,oBAAAA,IAAIM,WAAW,qBAAfN,kBAAiBa,0BAA0B,KAAIH,sBAAsB;QACvEd,QAAQY,GAAG,CAACM,sBAAsB,GAAG;IACvC;IAEA,KAAId,oBAAAA,IAAIM,WAAW,qBAAfN,kBAAiBe,WAAW,EAAE;QAChCC,QAAG,CAACC,IAAI,CAAC,CAAC,2EAA2E,CAAC;IACxF;IAEA,MAAMC,aAAaC,IAAAA,2BAAkB,EAACrB;IACtC,MAAMsB,mBAAmB,IAAIC,4CAAqB,CAACH,YAAYvB;IAE/D,oGAAoG;IACpG,MAAM2B,aAAad,QAAG,CAACe,0BAA0B,IAAIC;IACrD,MAAMC,iBAAiB,MAAMC,IAAAA,4BAAa,EAACJ,YAAYxB;IACvD,MAAM6B,gBAAgBC,IAAAA,gCAAgB,EAAC9B;IAEvC,IAAIK,SAAkBsB,eAAeI,OAAO,GACxCF,gBACA,MAAMG,IAAAA,0BAAW,EAACH,eAAeF,eAAetB,MAAM;IAE1D,yEAAyE;IACzE,8BAA8B;IAC9BA,SAAS;QACP,GAAGA,MAAM;QAET,sIAAsI;QACtI,+EAA+E;QAC/E4B,YAAY,CAAC,CAAChC,QAAQgC,UAAU;QAChCC,YAAYjC,QAAQiC,UAAU,IAAI7B,OAAO6B,UAAU;QACnDC,QAAQ;YACN,GAAG9B,OAAO8B,MAAM;YAChBC,MAAMnC,QAAQmC,IAAI,IAAI/B,OAAO8B,MAAM,CAACC,IAAI;QAC1C;QAEAC,cAAc,CAAChC,OAAOgC,YAAY,CAACC,QAAQ,CAACjC,OAAOL,WAAW,IAC1D;YAACK,OAAOL,WAAW;eAAKK,OAAOgC,YAAY;SAAC,GAC5ChC,OAAOgC,YAAY;QACvBE,UAAU;YACRC,QAAOC,KAAK;gBACVnB,iBAAiBkB,MAAM,CAACC;gBACxB,IAAInC,aAAa;oBACfA,YAAYmC;gBACd;YACF;QACF;IACF;IAEAC,WAAWC,4BAA4B,IAAGtC,mBAAAA,OAAOuC,QAAQ,qBAAfvC,iBAAiBwC,0BAA0B;IAErF,IAAI1C,aAAa;YAGZD;QAFH,iGAAiG;QACjGrB,WAAWwB,OAAOyC,WAAW,EAAEC,UAAU,GAAG,CAAC,oBAAoB,EAC/D,AAAC7C,CAAAA,EAAAA,oBAAAA,IAAIM,WAAW,qBAAfN,kBAAiB8C,OAAO,KAAI,EAAC,IAAK,WACnC;IACJ,OAAO;QACLnE,WAAWwB,OAAOyC,WAAW,EAAEC,UAAU,GAAG;IAC9C;IAEA,MAAME,mBAAmBC,IAAAA,qCAAmB,EAAClD,aAAaE;IAE1D,KAAIA,oBAAAA,IAAIM,WAAW,qBAAfN,kBAAiBiD,aAAa,EAAE;QAClCjC,QAAG,CAAC3B,GAAG,CAAC6D,gBAAK,CAACC,IAAI,CAAC,sBAAsB,CAAC;IAC5C;IAEA,IAAI3C,QAAG,CAAC4C,0BAA0B,IAAI,CAAC5C,QAAG,CAAC6C,kCAAkC,EAAE;QAC7E,MAAM,IAAIC,oBAAY,CACpB;IAEJ;IAEA,IAAI9C,QAAG,CAAC6C,kCAAkC,EAAE;QAC1CrC,QAAG,CAACC,IAAI,CAAC,CAAC,4CAA4C,CAAC;IACzD;IACA,IAAIT,QAAG,CAAC4C,0BAA0B,EAAE;QAClCpC,QAAG,CAACC,IAAI,CAAC,CAAC,qCAAqC,CAAC;IAClD;IACA,IAAIT,QAAG,CAAC+C,qBAAqB,EAAE;QAC7BvC,QAAG,CAACC,IAAI,CAAC,CAAC,oCAAoC,CAAC;IACjD;IACA,IAAIZ,oCAAoC;QACtCW,QAAG,CAACC,IAAI,CAAC,CAAC,yDAAyD,CAAC;IACtE;IAEA,IAAIP,sBAAsB;YAE8CV;QADtEgB,QAAG,CAACC,IAAI,CACN,CAAC,iEAAiE,EAAEjB,EAAAA,oBAAAA,IAAIM,WAAW,qBAAfN,kBAAiBa,0BAA0B,IAAG,WAAW,UAAU;IAE3I;IAEAV,SAAS,MAAMqD,IAAAA,mDAA2B,EAAC1D,aAAa;QACtDK;QACAH;QACA+C;QACAU,wBAAwBzD,EAAAA,oBAAAA,IAAIM,WAAW,qBAAfN,kBAAiB0D,aAAa,KAAI;QAC1DC,8BAA8BtD;QAC9BJ;QACA2D,wBAAwBpD,QAAG,CAACM,sBAAsB;QAClD+C,gCAAgC,CAAC,GAAC7D,oBAAAA,IAAIM,WAAW,qBAAfN,kBAAiBa,0BAA0B;QAC7EX;IACF;IAEA,OAAO;QACLC;QACA2D,kBAAkB,CAACC,SAAkC3D,cAAc2D;QACnE1B,UAAUjB;IACZ;AACF;AAGO,eAAe5C,sBACpBwF,YAAmC,EACnCjE,OAA+B,EAC/B,EACEE,WAAW,EACXD,MAAMiE,IAAAA,mBAAS,EAACD,aAAalE,WAAW,EAAE;IACxCoE,2BAA2B;AAC7B,GAAGlE,GAAG,EACqC;IAQ7C,MAAMF,cAAckE,aAAalE,WAAW;IAE5C,MAAM,EACJK,QAAQgE,WAAW,EACnBL,gBAAgB,EAChBzB,QAAQ,EACT,GAAG,MAAM3D,qBAAqBoB,aAAaC,SAAS;QACnDC;QACAC;QACAC;YACE,OAAOkE,MAAMC,UAAU,GAAGA,UAAU;QACtC;IACF;IAEA,4EAA4E;IAC5E,MAAM,EAAEC,UAAU,EAAEC,cAAc,EAAEC,YAAY,EAAEC,kBAAkB,EAAE,GACpEC,IAAAA,4CAAqB,EAACP;IAExB,iFAAiF;IACjF,MAAMQ,gBAAgBX,aACnBY,aAAa,GACbC,YAAY,CAAC;QAAEC,QAAQ;QAAQC,UAAU;IAAY;IAExD,IAAI,CAAC9E,aAAa;QAChB,uDAAuD;QACvD+E,IAAAA,4BAAiB,EAACV,YAAYW,IAAAA,oCAAoB,EAACjF;QAEnD,oDAAoD;QACpD,MAAM,EAAEkF,eAAe,EAAEC,uBAAuB,EAAE,GAAGC,IAAAA,4CAAqB,EAAC;YACzET;YACAtC;QACF;QACAgD,OAAOC,MAAM,CAACb,oBAAoBU;QAClCb,WAAWiB,GAAG,CAACL;QACfZ,WAAWiB,GAAG,CAAC,mBAAmBC,IAAAA,wDAA2B;QAE7D,wGAAwG;QACxG,yFAAyF;QACzF,yFAAyF;QACzF,MAAMC,0BAA0BtB,YAAYlC,MAAM,CAACyD,iBAAiB;QACpE/G,WAAWwF,YAAYlC,MAAM,EAAEyD,iBAAiB,GAAG,CACjDC,iBACA1D;YAEA,IAAIwD,yBAAyB;gBAC3BE,kBAAkBF,wBAAwBE,iBAAiB1D;YAC7D;YACA,OAAOqC,WAAWiB,GAAG,CAACI;QACxB;QAEA,MAAMC,6BAA6BC,IAAAA,sEAAqC;QACxER,OAAOC,MAAM,CAACb,oBAAoBmB;IACpC;IAEA,+BAA+B;IAC/B,MAAME,IAAAA,6BAAgB,EAAC;QACrB7F;QACAD;QACAF;QACAwE;QACAH;QACA,2EAA2E;QAC3E4B,gBAAgB9F;IAClB;IAEA,MAAM,EAAEgC,MAAM,EAAE+D,SAAS,EAAE5B,KAAK,EAAE,GAAG,MAAM6B,IAAAA,wBAAS,EAClDjC,cACAG,aACA;QACEM;QACAyB,OAAO,CAACjG,eAAexB;IACzB,GACA;QACE0H,YAAYlG;IACd;IAGF,qHAAqH;IACrH,MAAMmG,wBAAwBhC,MAC3BC,UAAU,GACVA,UAAU,GACVgC,aAAa,CAACC,IAAI,CAAClC,MAAMC,UAAU,GAAGA,UAAU;IAEnDD,MAAMC,UAAU,GAAGA,UAAU,GAAGgC,aAAa,GAAG,eAC9CE,QAAgB,EAChBC,gBAAkC,EAClCC,UAAmB;QAEnB,OAAOL,sBACLG,UACAG,4BACE5G,aACAyG,UACA,qDAAqD;QACrD;YACE,GAAGC,gBAAgB;YACnBG,wBAAwB;gBACtBC,WAAW;gBACX,GAAGJ,iBAAiBG,sBAAsB;YAC5C;QACF,IAEFF;IAEJ;IAEA3C,iBAAiBU,aAAaqC,gBAAgB;IAE9C,2EAA2E;IAC3E,iCAAiC;IACjCzC,MAAM0C,iBAAiB,GAAG,SAA4CC,KAAoB;YAMzEA;QALf,MAAMC,UAAU;eAAID,MAAME,YAAY,CAACC,MAAM;SAAG;QAEhD,MAAMC,MAAM;YACV,2CAA2C;YAC3CC,UAAUL,MAAMP,gBAAgB,CAACY,QAAQ;YACzCC,WAAW,GAAEN,iDAAAA,MAAMP,gBAAgB,CAACG,sBAAsB,qBAA7CI,+CAA+CM,WAAW;QACzE;QACA,8CAA8C;QAC9C,KAAK,MAAMC,UAAUN,QAAS;YAC5B,IAAI,CAACO,eAAe,CAACD,OAAOE,IAAI,EAAEL;QACpC;QACA,cAAc;QACd,OAAOH,QAAQS,IAAI,CACjB,CAACC,GAAGC,IAAM,IAAI,CAACJ,eAAe,CAACG,EAAEF,IAAI,EAAEL,OAAO,IAAI,CAACI,eAAe,CAACI,EAAEH,IAAI,EAAEL;IAE/E;IAEA,IAAInB,WAAW;QACb,IAAI4B;QAIJ,IAAI;YACFA,cAAcC,QAAQ,wDAAwDC,OAAO;QACvF,EAAE,OAAM;YACN,qEAAqE;YACrE9G,QAAG,CAACC,IAAI,CAAC;YACT2G,cAAcC,QAAQ;QACxB;QAEA,+KAA+K;QAC/K7B,UAAU+B,eAAe,GAAG,eAE1BC,KAAK,EACLjI,OAAO,EACPkI,WAAW;YAEX,oIAAoI;YACpI,oCAAoC;YACpC,MAAMlE,SAAS,CAAChE,QAAQmI,eAAe,GAAGD,+BAAAA,YAAalE,MAAM,GAAG;YAChE,IAAI;oBAyBaoE;gBAxBf,MAAMC,aAAa,IAAI,CAACC,QAAQ,CAACC,WAAW,CAACN,MAAMO,UAAU;gBAC7D,IAAI,CAACH,YAAY;oBACf,OAAO;wBACLI,MAAM;wBACNC,MAAMC,IAAAA,8BAAmB,EAAC,IAAIC,CAAAA,wBAAoB,SAAC,CAACX,MAAMO,UAAU;oBACtE;gBACF;gBACAxE,0BAAAA,OAAQ6E,KAAK,CAAC;gBACd,MAAM,EAAET,QAAQ,EAAEU,KAAK,EAAE,GAAG,MAAM,IAAI,CAACR,QAAQ,CAACS,WAAW,CAAC,MAAMV,YAAY;gBAC9ErE,0BAAAA,OAAQ6E,KAAK,CAAC;gBACd,IAAI,CAACG,aAAa,CAACC,MAAM,CAAChB,MAAMO,UAAU;gBAC1CP,MAAMO,UAAU,GAAGJ,SAASc,EAAE;gBAC9B,KAAK,MAAMC,UAAUlB,MAAMmB,OAAO,CAAE;oBAClCD,OAAOE,WAAW,GAAGF,OAAOE,WAAW,CAACC,MAAM,CAC5C,CAACd,aAAeA,eAAeP,MAAMO,UAAU;oBAEjDW,OAAOE,WAAW,CAACE,IAAI,CAACnB,SAASc,EAAE;gBACrC;gBACA,IAAI,CAACF,aAAa,CAACQ,GAAG,CAACvB,MAAMO,UAAU,EAAEP;gBACzCjE,0BAAAA,OAAQ6E,KAAK,CAAC;gBACd,qCAAqC;gBACrC,MAAMY,kBAAkB;oBACtB,2CAA2C;oBAC3CpC,UAAUe,SAASpB,KAAK,CAACP,gBAAgB,CAACY,QAAQ;oBAClDC,WAAW,GAAEc,0DAAAA,SAASpB,KAAK,CAACP,gBAAgB,CAACG,sBAAsB,qBAAtDwB,wDAAwDd,WAAW;gBAClF;gBACA,MAAMoC,YAAY7B,YAAYiB,OAAOV,SAASpB,KAAK,EAAE;oBACnD2C,WAAW1B,MAAM0B,SAAS;oBAC1B,0CAA0C;oBAC1CC,gBAAgB,CAACC;wBACf,OAAO,IAAI,CAACrC,eAAe,CAACqC,UAAUJ;oBACxC;oBACAK,mBAAmB7B,MAAM8B,YAAY,CAACC,IAAI;oBAC1CjK,aAAa,IAAI,CAACkK,OAAO,CAAClK,WAAW;oBACrCoB,YAAY,IAAI,CAAC8I,OAAO,CAAC/H,MAAM,CAACgI,mBAAmB,IAAI,IAAI,CAACD,OAAO,CAAClK,WAAW;gBACjF;gBACAiE,0BAAAA,OAAQ6E,KAAK,CAAC;gBACd,OAAO;oBACLJ,MAAM;oBACNC,MAAM;wBACJF,YAAYJ,SAASc,EAAE;wBACvBf,iBAAiBnI,QAAQmI,eAAe;wBACxC,GAAGuB,SAAS;oBACd;gBACF;YACF,EAAE,OAAOS,OAAY;gBACnB,MAAMC,iBAAiBzB,IAAAA,8BAAmB,EAACwB;gBAC3C,IAAI,CAACF,OAAO,CAAC3H,QAAQ,CAACC,MAAM,CAAC;oBAC3BkG,MAAM;oBACN0B;gBACF;gBACA,OAAO;oBACL1B,MAAM;oBACNC,MAAM0B;gBACR;YACF;QACF;IACF;IAEA,OAAO;QACL/F;QACA4B;QACA/D;QACAqC;QACA8F,eAAe7F;IACjB;AACF;AAEA,0GAA0G;AAC1G,SAASmC,4BACP5G,WAAmB,EACnByG,QAAgB,EAChBC,gBAAkC;QAMhCA,0CASiBA,2CAiBjBA,2CAQAA;IAtCF,sDAAsD;IACtDD,WAAWA,SAAS8D,KAAK,CAAC7C,eAAI,CAAC8C,GAAG,EAAEC,IAAI,CAAC;IAEzC,IACE/D,EAAAA,2CAAAA,iBAAiBG,sBAAsB,qBAAvCH,yCAAyCgE,GAAG,KAC5C,yEAAyE;IACzE,CAACjE,SAASkE,KAAK,CAAC,0BAChB;QACA,yFAAyF;QACzF,wEAAwE;QACxEjE,iBAAiBG,sBAAsB,CAAC6D,GAAG,GAAG;IAChD;IAEA,MAAME,cAAalE,4CAAAA,iBAAiBG,sBAAsB,qBAAvCH,0CAAyCkE,UAAU;IACtE,IAAI,OAAOA,eAAe,UAAU;QAClC,MAAMC,gBAAgB,sBAAsBC,IAAI,CAACrE;QACjD,qKAAqK;QACrK,MAAMsE,iBAAiB,yBAAyBD,IAAI,CAACrE;QACrD,mIAAmI;QACnI,MAAMuE,qBAAqBtD,eAAI,CAACuD,OAAO,CAACjL,aAAa4K,YAAYL,KAAK,CAAC7C,eAAI,CAAC8C,GAAG,EAAEC,IAAI,CAAC;QACtF,MAAMS,gBAAgBxD,eAAI,CAACyD,UAAU,CAAC1E,aAAaA,SAAS2E,UAAU,CAACJ;QAEvE,qIAAqI;QACrI,wEAAwE;QACxE,IAAI,CAACH,iBAAiB,CAACE,kBAAkB,CAACG,eAAe;YACvDxE,iBAAiBG,sBAAsB,CAAE+D,UAAU,GAAG;QACxD;IACF;IAEA,IACElE,EAAAA,4CAAAA,iBAAiBG,sBAAsB,qBAAvCH,0CAAyC2E,WAAW,KACpD,+IAA+I;IAC/I,CAAE5E,CAAAA,SAASkE,KAAK,CAAC,0BAA0BlE,SAASkE,KAAK,CAAC,yBAAwB,GAClF;QACA,OAAOjE,iBAAiBG,sBAAsB,CAACwE,WAAW;IAC5D;IAEA,IACE3E,EAAAA,4CAAAA,iBAAiBG,sBAAsB,qBAAvCH,0CAAyC4E,gBAAgB,KACzD,2FAA2F;IAC3F,CAAC7E,SAASkE,KAAK,CAAC,8BAChB;QACA,OAAOjE,iBAAiBG,sBAAsB,CAACyE,gBAAgB;IACjE;IAEA,OAAO5E;AACT;AAMO,SAAS/H;IACd,IAAI+B,QAAG,CAAC6K,EAAE,EAAE;QACVrK,QAAG,CAAC3B,GAAG,CACL6D,IAAAA,gBAAK,CAAA,CAAC,8FAA8F,CAAC;IAEzG;IAEA,OAAO,CAAC1C,QAAG,CAAC6K,EAAE;AAChB"}
|