@expo/cli 0.12.0 → 0.13.0

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.
Files changed (90) hide show
  1. package/build/bin/cli +2 -2
  2. package/build/src/export/createBundles.js +0 -30
  3. package/build/src/export/createBundles.js.map +1 -1
  4. package/build/src/export/embed/exportEmbedAsync.js +2 -0
  5. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  6. package/build/src/export/exportApp.js +28 -10
  7. package/build/src/export/exportApp.js.map +1 -1
  8. package/build/src/export/exportAssets.js +2 -2
  9. package/build/src/export/exportAssets.js.map +1 -1
  10. package/build/src/export/exportHermes.js +204 -0
  11. package/build/src/export/exportHermes.js.map +1 -0
  12. package/build/src/export/exportStaticAsync.js +7 -3
  13. package/build/src/export/exportStaticAsync.js.map +1 -1
  14. package/build/src/export/favicon.js +7 -7
  15. package/build/src/export/favicon.js.map +1 -1
  16. package/build/src/export/fork-bundleAsync.js +9 -11
  17. package/build/src/export/fork-bundleAsync.js.map +1 -1
  18. package/build/src/export/persistMetroAssets.js +118 -0
  19. package/build/src/export/persistMetroAssets.js.map +1 -0
  20. package/build/src/export/saveAssets.js.map +1 -1
  21. package/build/src/install/index.js +1 -0
  22. package/build/src/install/index.js.map +1 -1
  23. package/build/src/install/installAsync.js +1 -0
  24. package/build/src/install/installAsync.js.map +1 -1
  25. package/build/src/install/resolveOptions.js +7 -4
  26. package/build/src/install/resolveOptions.js.map +1 -1
  27. package/build/src/prebuild/index.js +2 -0
  28. package/build/src/prebuild/index.js.map +1 -1
  29. package/build/src/prebuild/prebuildAsync.js +2 -1
  30. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  31. package/build/src/prebuild/resolveOptions.js +4 -2
  32. package/build/src/prebuild/resolveOptions.js.map +1 -1
  33. package/build/src/run/android/runAndroidAsync.js +5 -0
  34. package/build/src/run/android/runAndroidAsync.js.map +1 -1
  35. package/build/src/run/ios/runIosAsync.js +5 -0
  36. package/build/src/run/ios/runIosAsync.js.map +1 -1
  37. package/build/src/start/interface/interactiveActions.js +3 -3
  38. package/build/src/start/interface/interactiveActions.js.map +1 -1
  39. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  40. package/build/src/start/server/getStaticRenderFunctions.js +1 -10
  41. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
  42. package/build/src/start/server/metro/MetroBundlerDevServer.js +15 -11
  43. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  44. package/build/src/start/server/metro/MetroTerminalReporter.js +1 -1
  45. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  46. package/build/src/start/server/metro/instantiateMetro.js +29 -9
  47. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  48. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
  49. package/build/src/start/server/metro/resolveFromProject.js +13 -0
  50. package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
  51. package/build/src/start/server/metro/withMetroMultiPlatform.js +14 -0
  52. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  53. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +1 -1
  54. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  55. package/build/src/start/server/middleware/InterstitialPageMiddleware.js +3 -3
  56. package/build/src/start/server/middleware/InterstitialPageMiddleware.js.map +1 -1
  57. package/build/src/start/server/middleware/inspector/JsInspector.js +69 -0
  58. package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -0
  59. package/build/src/start/server/middleware/inspector/LaunchBrowser.js +57 -0
  60. package/build/src/start/server/middleware/inspector/LaunchBrowser.js.map +1 -0
  61. package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js +13 -0
  62. package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js.map +1 -0
  63. package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js +79 -0
  64. package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js.map +1 -0
  65. package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js +78 -0
  66. package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js.map +1 -0
  67. package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js +121 -0
  68. package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js.map +1 -0
  69. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js +64 -0
  70. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js.map +1 -0
  71. package/build/src/start/server/middleware/inspector/middlwareMutations.js +19 -0
  72. package/build/src/start/server/middleware/inspector/middlwareMutations.js.map +1 -0
  73. package/build/src/start/server/middleware/mutations.js +19 -0
  74. package/build/src/start/server/middleware/mutations.js.map +1 -0
  75. package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js +31 -0
  76. package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js.map +1 -0
  77. package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js +17 -0
  78. package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js.map +1 -0
  79. package/build/src/start/server/middleware/resolveAssets.js.map +1 -1
  80. package/build/src/start/server/middleware/suppressErrorMiddleware.js +16 -0
  81. package/build/src/start/server/middleware/suppressErrorMiddleware.js.map +1 -0
  82. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +9 -82
  83. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  84. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  85. package/build/src/utils/codesigning.js.map +1 -1
  86. package/build/src/utils/port.js +45 -17
  87. package/build/src/utils/port.js.map +1 -1
  88. package/package.json +13 -10
  89. package/build/src/start/server/middleware/createDevServerMiddleware.js +0 -24
  90. package/build/src/start/server/middleware/createDevServerMiddleware.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport { MetroDevServerOptions, prependMiddleware } from '@expo/dev-server';\nimport type { LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport http from 'http';\nimport type Metro from 'metro';\nimport { Terminal } from 'metro-core';\nimport semver from 'semver';\nimport { URL } from 'url';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { importExpoMetroConfig } from './resolveFromProject';\nimport { getRouterDirectory } from './router';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { Log } from '../../../log';\nimport { getMetroProperties } from '../../../utils/analytics/getMetroProperties';\nimport { createDebuggerTelemetryMiddleware } from '../../../utils/analytics/metroDebuggerMiddleware';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { env } from '../../../utils/env';\nimport { getMetroServerRoot } from '../middleware/ManifestMiddleware';\nimport { createDevServerMiddleware } from '../middleware/createDevServerMiddleware';\nimport { ServerNext, ServerRequest, ServerResponse } from '../middleware/server.types';\nimport { getPlatformBundlers } from '../platformBundlers';\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\nfunction gteSdkVersion(exp: Pick<ExpoConfig, 'sdkVersion'>, sdkVersion: string): boolean {\n if (!exp.sdkVersion) {\n return false;\n }\n\n if (exp.sdkVersion === 'UNVERSIONED') {\n return true;\n }\n\n try {\n return semver.gte(exp.sdkVersion, sdkVersion);\n } catch {\n throw new Error(`${exp.sdkVersion} is not a valid version. Must be in the form of x.y.z`);\n }\n}\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp = getConfig(projectRoot, { skipSDKVersionRequirement: true, skipPlugins: true }).exp,\n isExporting,\n }: { exp?: ExpoConfig; isExporting: boolean }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n const serverRoot = getMetroServerRoot(projectRoot);\n\n const terminal = new Terminal(process.stdout);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const reporter = {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n };\n\n const ExpoMetroConfig = importExpoMetroConfig(projectRoot);\n let config = await ExpoMetroConfig.loadAsync(projectRoot, { reporter, ...options });\n\n if (\n // Requires SDK 50 for expo-assets hashAssetPlugin change.\n !exp.sdkVersion ||\n gteSdkVersion(exp, '50.0.0')\n ) {\n // TODO: Handle asset prefix.\n if (isExporting) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = '/assets?export_path=/assets';\n } else {\n // @ts-expect-error: typed as readonly\n config.transformer.publicPath = '/assets/?unstable_path=.';\n }\n }\n\n const platformBundlers = getPlatformBundlers(exp);\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n routerDirectory: exp.extra?.router?.unstable_src ?? getRouterDirectory(projectRoot),\n config,\n platformBundlers,\n isTsconfigPathsEnabled: !!exp.experiments?.tsconfigPaths,\n webOutput: exp.web?.output ?? 'single',\n });\n\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, config));\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: Omit<MetroDevServerOptions, 'logger'>,\n { isExporting }: { isExporting: boolean }\n): Promise<{\n metro: Metro.Server;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n // TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.\n const { exp } = getConfig(projectRoot, {\n skipSDKVersionRequirement: true,\n skipPlugins: true,\n });\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n { exp, isExporting }\n );\n\n const { middleware, websocketEndpoints, eventsSocketEndpoint, messageSocketEndpoint } =\n createDevServerMiddleware(projectRoot, {\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n // @ts-expect-error: can't mutate readonly config\n metroConfig.server.enhanceMiddleware = (metroMiddleware: any, server: Metro.Server) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n middleware.use(createDebuggerTelemetryMiddleware(projectRoot, exp));\n\n const { server, metro } = await runServer(metroBundler, metroConfig, {\n hmrEnabled: true,\n // @ts-expect-error: Inconsistent `websocketEndpoints` type between metro and @react-native-community/cli-server-api\n websocketEndpoints,\n watch: isWatchEnabled(),\n });\n\n prependMiddleware(middleware, (req: ServerRequest, res: ServerResponse, next: ServerNext) => {\n // If the URL is a Metro asset request, then we need to skip all other middleware to prevent\n // the community CLI's serve-static from hosting `/assets/index.html` in place of all assets if it exists.\n // /assets/?unstable_path=.\n if (req.url) {\n const url = new URL(req.url!, 'http://localhost:8000');\n if (url.pathname.match(/^\\/assets\\/?/) && url.searchParams.get('unstable_path') != null) {\n return metro.processRequest(req, res, next);\n }\n }\n return next();\n });\n\n setEventReporter(eventsSocketEndpoint.reportEvent);\n\n return {\n metro,\n server,\n middleware,\n messageSocket: messageSocketEndpoint,\n };\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":["loadMetroConfigAsync","instantiateMetroAsync","isWatchEnabled","gteSdkVersion","exp","sdkVersion","semver","gte","Error","projectRoot","options","getConfig","skipSDKVersionRequirement","skipPlugins","isExporting","reportEvent","serverRoot","getMetroServerRoot","terminal","Terminal","process","stdout","terminalReporter","MetroTerminalReporter","reporter","update","event","ExpoMetroConfig","importExpoMetroConfig","config","loadAsync","transformer","publicPath","platformBundlers","getPlatformBundlers","withMetroMultiPlatformAsync","routerDirectory","extra","router","unstable_src","getRouterDirectory","isTsconfigPathsEnabled","experiments","tsconfigPaths","webOutput","web","output","logEventAsync","getMetroProperties","setEventReporter","logger","metroBundler","metroConfig","middleware","websocketEndpoints","eventsSocketEndpoint","messageSocketEndpoint","createDevServerMiddleware","port","server","watchFolders","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","createDebuggerTelemetryMiddleware","metro","runServer","hmrEnabled","watch","prependMiddleware","req","res","next","url","URL","pathname","match","searchParams","get","processRequest","messageSocket","env","CI","Log","log","chalk"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport type { LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport { Server as ConnectServer } from 'connect';\nimport http from 'http';\nimport type Metro from 'metro';\nimport { Terminal } from 'metro-core';\nimport semver from 'semver';\nimport { URL } from 'url';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { importCliServerApiFromProject, importExpoMetroConfig } from './resolveFromProject';\nimport { getRouterDirectory } from './router';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { MetroDevServerOptions } from '../../../export/fork-bundleAsync';\nimport { Log } from '../../../log';\nimport { getMetroProperties } from '../../../utils/analytics/getMetroProperties';\nimport { createDebuggerTelemetryMiddleware } from '../../../utils/analytics/metroDebuggerMiddleware';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { env } from '../../../utils/env';\nimport { getMetroServerRoot } from '../middleware/ManifestMiddleware';\nimport createJsInspectorMiddleware from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware, replaceMiddlewareWith } from '../middleware/mutations';\nimport { remoteDevtoolsCorsMiddleware } from '../middleware/remoteDevtoolsCorsMiddleware';\nimport { remoteDevtoolsSecurityHeadersMiddleware } from '../middleware/remoteDevtoolsSecurityHeadersMiddleware';\nimport { ServerNext, ServerRequest, ServerResponse } from '../middleware/server.types';\nimport { suppressRemoteDebuggingErrorMiddleware } from '../middleware/suppressErrorMiddleware';\nimport { getPlatformBundlers } from '../platformBundlers';\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\nfunction gteSdkVersion(exp: Pick<ExpoConfig, 'sdkVersion'>, sdkVersion: string): boolean {\n if (!exp.sdkVersion) {\n return false;\n }\n\n if (exp.sdkVersion === 'UNVERSIONED') {\n return true;\n }\n\n try {\n return semver.gte(exp.sdkVersion, sdkVersion);\n } catch {\n throw new Error(`${exp.sdkVersion} is not a valid version. Must be in the form of x.y.z`);\n }\n}\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp = getConfig(projectRoot, { skipSDKVersionRequirement: true, skipPlugins: true }).exp,\n isExporting,\n }: { exp?: ExpoConfig; isExporting: boolean }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n const serverRoot = getMetroServerRoot(projectRoot);\n\n const terminal = new Terminal(process.stdout);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const reporter = {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n };\n\n const ExpoMetroConfig = importExpoMetroConfig(projectRoot);\n let config = await ExpoMetroConfig.loadAsync(projectRoot, { reporter, ...options });\n\n if (\n // Requires SDK 50 for expo-assets hashAssetPlugin change.\n !exp.sdkVersion ||\n gteSdkVersion(exp, '50.0.0')\n ) {\n if (isExporting) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = `/assets?export_path=${\n (exp.experiments?.basePath ?? '') + '/assets'\n }`;\n } else {\n // @ts-expect-error: typed as readonly\n config.transformer.publicPath = '/assets/?unstable_path=.';\n }\n } else {\n if (isExporting && exp.experiments?.basePath) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = exp.experiments?.basePath;\n }\n }\n\n const platformBundlers = getPlatformBundlers(exp);\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n routerDirectory: exp.extra?.router?.unstable_src ?? getRouterDirectory(projectRoot),\n config,\n platformBundlers,\n isTsconfigPathsEnabled: !!exp.experiments?.tsconfigPaths,\n webOutput: exp.web?.output ?? 'single',\n });\n\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, config));\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: Omit<MetroDevServerOptions, 'logger'>,\n { isExporting }: { isExporting: boolean }\n): Promise<{\n metro: Metro.Server;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n // TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.\n const { exp } = getConfig(projectRoot, {\n skipSDKVersionRequirement: true,\n skipPlugins: true,\n });\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n { exp, isExporting }\n );\n\n const { createDevServerMiddleware, securityHeadersMiddleware } =\n importCliServerApiFromProject(projectRoot);\n\n const { middleware, messageSocketEndpoint, eventsSocketEndpoint, websocketEndpoints } =\n createDevServerMiddleware({\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n // securityHeadersMiddleware does not support cross-origin requests for remote devtools to get the sourcemap.\n // We replace with the enhanced version.\n replaceMiddlewareWith(\n middleware as ConnectServer,\n securityHeadersMiddleware,\n remoteDevtoolsSecurityHeadersMiddleware\n );\n\n middleware.use(remoteDevtoolsCorsMiddleware);\n\n prependMiddleware(middleware, suppressRemoteDebuggingErrorMiddleware);\n\n middleware.use('/inspector', createJsInspectorMiddleware());\n\n // TODO: We can probably drop this now.\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n // @ts-expect-error: can't mutate readonly config\n metroConfig.server.enhanceMiddleware = (metroMiddleware: any, server: Metro.Server) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n middleware.use(createDebuggerTelemetryMiddleware(projectRoot, exp));\n\n const { server, metro } = await runServer(metroBundler, metroConfig, {\n hmrEnabled: true,\n // @ts-expect-error: Inconsistent `websocketEndpoints` type between metro and @react-native-community/cli-server-api\n websocketEndpoints,\n watch: isWatchEnabled(),\n });\n\n prependMiddleware(middleware, (req: ServerRequest, res: ServerResponse, next: ServerNext) => {\n // If the URL is a Metro asset request, then we need to skip all other middleware to prevent\n // the community CLI's serve-static from hosting `/assets/index.html` in place of all assets if it exists.\n // /assets/?unstable_path=.\n if (req.url) {\n const url = new URL(req.url!, 'http://localhost:8000');\n if (url.pathname.match(/^\\/assets\\/?/) && url.searchParams.get('unstable_path') != null) {\n return metro.processRequest(req, res, next);\n }\n }\n return next();\n });\n\n setEventReporter(eventsSocketEndpoint.reportEvent);\n\n return {\n metro,\n server,\n middleware,\n messageSocket: messageSocketEndpoint,\n };\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":["loadMetroConfigAsync","instantiateMetroAsync","isWatchEnabled","gteSdkVersion","exp","sdkVersion","semver","gte","Error","projectRoot","options","getConfig","skipSDKVersionRequirement","skipPlugins","isExporting","reportEvent","serverRoot","getMetroServerRoot","terminal","Terminal","process","stdout","terminalReporter","MetroTerminalReporter","reporter","update","event","ExpoMetroConfig","importExpoMetroConfig","config","loadAsync","transformer","publicPath","experiments","basePath","platformBundlers","getPlatformBundlers","withMetroMultiPlatformAsync","routerDirectory","extra","router","unstable_src","getRouterDirectory","isTsconfigPathsEnabled","tsconfigPaths","webOutput","web","output","logEventAsync","getMetroProperties","setEventReporter","logger","metroBundler","metroConfig","createDevServerMiddleware","securityHeadersMiddleware","importCliServerApiFromProject","middleware","messageSocketEndpoint","eventsSocketEndpoint","websocketEndpoints","port","server","watchFolders","replaceMiddlewareWith","remoteDevtoolsSecurityHeadersMiddleware","use","remoteDevtoolsCorsMiddleware","prependMiddleware","suppressRemoteDebuggingErrorMiddleware","createJsInspectorMiddleware","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","createDebuggerTelemetryMiddleware","metro","runServer","hmrEnabled","watch","req","res","next","url","URL","pathname","match","searchParams","get","processRequest","messageSocket","env","CI","Log","log","chalk"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/metroErrorInterface.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 chalk from 'chalk';\nimport resolveFrom from 'resolve-from';\nimport { StackFrame } from 'stacktrace-parser';\nimport terminalLink from 'terminal-link';\n\nimport { Log } from '../../../log';\nimport { createMetroEndpointAsync } from '../getStaticRenderFunctions';\n// import type { CodeFrame, MetroStackFrame } from '@expo/metro-runtime/symbolicate';\n\ntype CodeFrame = {\n content: string;\n location?: {\n row: number;\n column: number;\n [key: string]: any;\n };\n fileName: string;\n};\n\ntype MetroStackFrame = StackFrame & { collapse?: boolean };\n\nexport async function logMetroErrorWithStack(\n projectRoot: string,\n {\n stack,\n codeFrame,\n error,\n }: {\n stack: MetroStackFrame[];\n codeFrame: CodeFrame;\n error: Error;\n }\n) {\n const { getStackFormattedLocation } = require(resolveFrom(\n projectRoot,\n '@expo/metro-runtime/symbolicate'\n ));\n\n Log.log();\n Log.log(chalk.red('Metro error: ') + error.message);\n Log.log();\n\n if (codeFrame) {\n Log.log(codeFrame.content);\n }\n\n if (stack?.length) {\n Log.log();\n Log.log(chalk.bold`Call Stack`);\n\n const stackProps = stack.map((frame) => {\n return {\n title: frame.methodName,\n subtitle: getStackFormattedLocation(projectRoot, frame),\n collapse: frame.collapse,\n };\n });\n\n stackProps.forEach((frame) => {\n const position = terminalLink.isSupported\n ? terminalLink(frame.subtitle, frame.subtitle)\n : frame.subtitle;\n let lineItem = chalk.gray(` ${frame.title} (${position})`);\n if (frame.collapse) {\n lineItem = chalk.dim(lineItem);\n }\n Log.log(lineItem);\n });\n } else {\n Log.log(chalk.gray(` ${error.stack}`));\n }\n}\n\nexport async function logMetroError(projectRoot: string, { error }: { error: Error }) {\n const { LogBoxLog, parseErrorStack } = require(resolveFrom(\n projectRoot,\n '@expo/metro-runtime/symbolicate'\n ));\n\n const stack = parseErrorStack(error.stack);\n\n const log = new LogBoxLog({\n level: 'static',\n message: {\n content: error.message,\n substitutions: [],\n },\n isComponentError: false,\n stack,\n category: 'static',\n componentStack: [],\n });\n\n await new Promise((res) => log.symbolicate('stack', res));\n\n logMetroErrorWithStack(projectRoot, {\n stack: log.symbolicated?.stack?.stack ?? [],\n codeFrame: log.codeFrame,\n error,\n });\n}\n\n/** @returns the html required to render the static metro error as an SPA. */\nexport function logFromError({ error, projectRoot }: { error: Error; projectRoot: string }): {\n symbolicated: any;\n symbolicate: (type: string, callback: () => void) => void;\n codeFrame: CodeFrame;\n} {\n const { LogBoxLog, parseErrorStack } = require(resolveFrom(\n projectRoot,\n '@expo/metro-runtime/symbolicate'\n ));\n\n const stack = parseErrorStack(error.stack);\n\n return new LogBoxLog({\n level: 'static',\n message: {\n content: error.message,\n substitutions: [],\n },\n isComponentError: false,\n stack,\n category: 'static',\n componentStack: [],\n });\n}\n\n/** @returns the html required to render the static metro error as an SPA. */\nexport async function logMetroErrorAsync({\n error,\n projectRoot,\n}: {\n error: Error;\n projectRoot: string;\n}) {\n const log = logFromError({ projectRoot, error });\n\n await new Promise<void>((res) => log.symbolicate('stack', res));\n\n logMetroErrorWithStack(projectRoot, {\n stack: log.symbolicated?.stack?.stack ?? [],\n codeFrame: log.codeFrame,\n error,\n });\n}\n\n/** @returns the html required to render the static metro error as an SPA. */\nexport async function getErrorOverlayHtmlAsync({\n error,\n projectRoot,\n}: {\n error: Error;\n projectRoot: string;\n}) {\n const log = logFromError({ projectRoot, error });\n\n await new Promise<void>((res) => log.symbolicate('stack', res));\n\n logMetroErrorWithStack(projectRoot, {\n stack: log.symbolicated?.stack?.stack ?? [],\n codeFrame: log.codeFrame,\n error,\n });\n\n const logBoxContext = {\n selectedLogIndex: 0,\n isDisabled: false,\n logs: [log],\n };\n const html = `<html><head><style>#root,body,html{height:100%}body{overflow:hidden}#root{display:flex}</style></head><body><div id=\"root\"></div><script id=\"_expo-static-error\" type=\"application/json\">${JSON.stringify(\n logBoxContext\n )}</script></body></html>`;\n\n const errorOverlayEntry = await createMetroEndpointAsync(\n projectRoot,\n // Keep the URL relative\n '',\n resolveFrom(projectRoot, 'expo-router/_error'),\n {\n dev: true,\n platform: 'web',\n minify: false,\n environment: 'node',\n }\n );\n\n const htmlWithJs = html.replace('</body>', `<script src=${errorOverlayEntry}></script></body>`);\n return htmlWithJs;\n}\n"],"names":["logMetroErrorWithStack","logMetroError","logFromError","logMetroErrorAsync","getErrorOverlayHtmlAsync","projectRoot","stack","codeFrame","error","getStackFormattedLocation","require","resolveFrom","Log","log","chalk","red","message","content","length","bold","stackProps","map","frame","title","methodName","subtitle","collapse","forEach","position","terminalLink","isSupported","lineItem","gray","dim","LogBoxLog","parseErrorStack","level","substitutions","isComponentError","category","componentStack","Promise","res","symbolicate","symbolicated","logBoxContext","selectedLogIndex","isDisabled","logs","html","JSON","stringify","errorOverlayEntry","createMetroEndpointAsync","dev","platform","minify","environment","htmlWithJs","replace"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/metroErrorInterface.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 chalk from 'chalk';\nimport resolveFrom from 'resolve-from';\nimport { StackFrame } from 'stacktrace-parser';\nimport terminalLink from 'terminal-link';\n\nimport { Log } from '../../../log';\nimport { createMetroEndpointAsync } from '../getStaticRenderFunctions';\n// import type { CodeFrame, MetroStackFrame } from '@expo/metro-runtime/symbolicate';\n\ntype CodeFrame = {\n content: string;\n location?: {\n row: number;\n column: number;\n [key: string]: any;\n };\n fileName: string;\n};\n\ntype MetroStackFrame = StackFrame & { collapse?: boolean };\n\nexport async function logMetroErrorWithStack(\n projectRoot: string,\n {\n stack,\n codeFrame,\n error,\n }: {\n stack: MetroStackFrame[];\n codeFrame: CodeFrame;\n error: Error;\n }\n) {\n const { getStackFormattedLocation } = require(\n resolveFrom(projectRoot, '@expo/metro-runtime/symbolicate')\n );\n\n Log.log();\n Log.log(chalk.red('Metro error: ') + error.message);\n Log.log();\n\n if (codeFrame) {\n Log.log(codeFrame.content);\n }\n\n if (stack?.length) {\n Log.log();\n Log.log(chalk.bold`Call Stack`);\n\n const stackProps = stack.map((frame) => {\n return {\n title: frame.methodName,\n subtitle: getStackFormattedLocation(projectRoot, frame),\n collapse: frame.collapse,\n };\n });\n\n stackProps.forEach((frame) => {\n const position = terminalLink.isSupported\n ? terminalLink(frame.subtitle, frame.subtitle)\n : frame.subtitle;\n let lineItem = chalk.gray(` ${frame.title} (${position})`);\n if (frame.collapse) {\n lineItem = chalk.dim(lineItem);\n }\n Log.log(lineItem);\n });\n } else {\n Log.log(chalk.gray(` ${error.stack}`));\n }\n}\n\nexport async function logMetroError(projectRoot: string, { error }: { error: Error }) {\n const { LogBoxLog, parseErrorStack } = require(\n resolveFrom(projectRoot, '@expo/metro-runtime/symbolicate')\n );\n\n const stack = parseErrorStack(error.stack);\n\n const log = new LogBoxLog({\n level: 'static',\n message: {\n content: error.message,\n substitutions: [],\n },\n isComponentError: false,\n stack,\n category: 'static',\n componentStack: [],\n });\n\n await new Promise((res) => log.symbolicate('stack', res));\n\n logMetroErrorWithStack(projectRoot, {\n stack: log.symbolicated?.stack?.stack ?? [],\n codeFrame: log.codeFrame,\n error,\n });\n}\n\n/** @returns the html required to render the static metro error as an SPA. */\nexport function logFromError({ error, projectRoot }: { error: Error; projectRoot: string }): {\n symbolicated: any;\n symbolicate: (type: string, callback: () => void) => void;\n codeFrame: CodeFrame;\n} {\n const { LogBoxLog, parseErrorStack } = require(\n resolveFrom(projectRoot, '@expo/metro-runtime/symbolicate')\n );\n\n const stack = parseErrorStack(error.stack);\n\n return new LogBoxLog({\n level: 'static',\n message: {\n content: error.message,\n substitutions: [],\n },\n isComponentError: false,\n stack,\n category: 'static',\n componentStack: [],\n });\n}\n\n/** @returns the html required to render the static metro error as an SPA. */\nexport async function logMetroErrorAsync({\n error,\n projectRoot,\n}: {\n error: Error;\n projectRoot: string;\n}) {\n const log = logFromError({ projectRoot, error });\n\n await new Promise<void>((res) => log.symbolicate('stack', res));\n\n logMetroErrorWithStack(projectRoot, {\n stack: log.symbolicated?.stack?.stack ?? [],\n codeFrame: log.codeFrame,\n error,\n });\n}\n\n/** @returns the html required to render the static metro error as an SPA. */\nexport async function getErrorOverlayHtmlAsync({\n error,\n projectRoot,\n}: {\n error: Error;\n projectRoot: string;\n}) {\n const log = logFromError({ projectRoot, error });\n\n await new Promise<void>((res) => log.symbolicate('stack', res));\n\n logMetroErrorWithStack(projectRoot, {\n stack: log.symbolicated?.stack?.stack ?? [],\n codeFrame: log.codeFrame,\n error,\n });\n\n const logBoxContext = {\n selectedLogIndex: 0,\n isDisabled: false,\n logs: [log],\n };\n const html = `<html><head><style>#root,body,html{height:100%}body{overflow:hidden}#root{display:flex}</style></head><body><div id=\"root\"></div><script id=\"_expo-static-error\" type=\"application/json\">${JSON.stringify(\n logBoxContext\n )}</script></body></html>`;\n\n const errorOverlayEntry = await createMetroEndpointAsync(\n projectRoot,\n // Keep the URL relative\n '',\n resolveFrom(projectRoot, 'expo-router/_error'),\n {\n dev: true,\n platform: 'web',\n minify: false,\n environment: 'node',\n }\n );\n\n const htmlWithJs = html.replace('</body>', `<script src=${errorOverlayEntry}></script></body>`);\n return htmlWithJs;\n}\n"],"names":["logMetroErrorWithStack","logMetroError","logFromError","logMetroErrorAsync","getErrorOverlayHtmlAsync","projectRoot","stack","codeFrame","error","getStackFormattedLocation","require","resolveFrom","Log","log","chalk","red","message","content","length","bold","stackProps","map","frame","title","methodName","subtitle","collapse","forEach","position","terminalLink","isSupported","lineItem","gray","dim","LogBoxLog","parseErrorStack","level","substitutions","isComponentError","category","componentStack","Promise","res","symbolicate","symbolicated","logBoxContext","selectedLogIndex","isDisabled","logs","html","JSON","stringify","errorOverlayEntry","createMetroEndpointAsync","dev","platform","minify","environment","htmlWithJs","replace"],"mappings":"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"}
@@ -2,7 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
+ exports.importCliServerApiFromProject = importCliServerApiFromProject;
6
+ exports.importMetroSourceMapComposeSourceMapsFromProject = importMetroSourceMapComposeSourceMapsFromProject;
7
+ exports.resolveFromProject = resolveFromProject;
5
8
  exports.importMetroFromProject = importMetroFromProject;
9
+ exports.importMetroServerFromProject = importMetroServerFromProject;
6
10
  exports.importMetroCreateWebsocketServerFromProject = importMetroCreateWebsocketServerFromProject;
7
11
  exports.importMetroHmrServerFromProject = importMetroHmrServerFromProject;
8
12
  exports.importExpoMetroConfig = importExpoMetroConfig;
@@ -27,6 +31,12 @@ class MetroImportError extends Error {
27
31
  super(`Missing package "${moduleId}" in the project at: ${projectRoot}\n` + 'This usually means "react-native" is not installed. ' + 'Please verify that dependencies in package.json include "react-native" ' + "and run `yarn` or `npm install`.");
28
32
  }
29
33
  }
34
+ function importCliServerApiFromProject(projectRoot) {
35
+ return importFromProject(projectRoot, "@react-native-community/cli-server-api");
36
+ }
37
+ function importMetroSourceMapComposeSourceMapsFromProject(projectRoot) {
38
+ return importFromProject(projectRoot, "metro-source-map/src/composeSourceMaps");
39
+ }
30
40
  function resolveFromProject(projectRoot, moduleId) {
31
41
  const resolvedPath = _resolveFrom.default.silent(projectRoot, moduleId);
32
42
  if (!resolvedPath) {
@@ -40,6 +50,9 @@ function importFromProject(projectRoot, moduleId) {
40
50
  function importMetroFromProject(projectRoot) {
41
51
  return importFromProject(projectRoot, "metro");
42
52
  }
53
+ function importMetroServerFromProject(projectRoot) {
54
+ return importFromProject(projectRoot, "metro/src/Server");
55
+ }
43
56
  function importMetroCreateWebsocketServerFromProject(projectRoot) {
44
57
  return importFromProject(projectRoot, "metro/src/lib/createWebsocketServer");
45
58
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/resolveFromProject.ts"],"sourcesContent":["import resolveFrom from 'resolve-from';\n\nconst debug = require('debug')('expo:metro:import');\n\n// These resolvers enable us to test the CLI in older projects.\n// We may be able to get rid of this in the future.\n// TODO: Maybe combine with AsyncResolver?\nclass MetroImportError extends Error {\n constructor(projectRoot: string, moduleId: string) {\n super(\n `Missing package \"${moduleId}\" in the project at: ${projectRoot}\\n` +\n 'This usually means \"react-native\" is not installed. ' +\n 'Please verify that dependencies in package.json include \"react-native\" ' +\n 'and run `yarn` or `npm install`.'\n );\n }\n}\n\nfunction resolveFromProject(projectRoot: string, moduleId: string) {\n const resolvedPath = resolveFrom.silent(projectRoot, moduleId);\n if (!resolvedPath) {\n throw new MetroImportError(projectRoot, moduleId);\n }\n return resolvedPath;\n}\n\nfunction importFromProject(projectRoot: string, moduleId: string) {\n return require(resolveFromProject(projectRoot, moduleId));\n}\n\n/** Import `metro` from the project. */\nexport function importMetroFromProject(projectRoot: string): typeof import('metro') {\n return importFromProject(projectRoot, 'metro');\n}\nexport function importMetroCreateWebsocketServerFromProject(\n projectRoot: string\n): typeof import('metro/src/lib/createWebsocketServer').createWebsocketServer {\n return importFromProject(projectRoot, 'metro/src/lib/createWebsocketServer');\n}\nexport function importMetroHmrServerFromProject(\n projectRoot: string\n): typeof import('metro/src/HmrServer').MetroHmrServer {\n return importFromProject(projectRoot, 'metro/src/HmrServer');\n}\n\nexport function importExpoMetroConfig(projectRoot: string) {\n return importFromProjectOrFallback<typeof import('@expo/metro-config')>(\n projectRoot,\n '@expo/metro-config'\n );\n}\n\n/**\n * Attempt to use the local version of a module or fallback on the CLI version.\n * This should only ever happen when testing Expo CLI in development.\n */\nexport function importFromProjectOrFallback<TModule>(\n projectRoot: string,\n moduleId: string\n): TModule {\n const resolvedPath = resolveFrom.silent(projectRoot, moduleId);\n if (!resolvedPath) {\n debug(`requiring \"${moduleId}\" relative to the CLI`);\n return require(require.resolve(moduleId));\n }\n debug(`requiring \"${moduleId}\" from the project:`, resolvedPath);\n return require(resolvedPath);\n}\n\n/** Import `metro-resolver` from the project. */\nexport function importMetroResolverFromProject(\n projectRoot: string\n): typeof import('metro-resolver') {\n return importFromProject(projectRoot, 'metro-resolver');\n}\n\n/** Import `metro-inspector-proxy` from the project. */\nexport function importMetroInspectorProxyFromProject(\n projectRoot: string\n): typeof import('metro-inspector-proxy') {\n return importFromProject(projectRoot, 'metro-inspector-proxy');\n}\n\n/** Import `metro-inspector-proxy/src/Device` from the project. */\nexport function importMetroInspectorDeviceFromProject(\n projectRoot: string\n): typeof import('metro-inspector-proxy/src/Device') {\n return importFromProject(projectRoot, 'metro-inspector-proxy/src/Device');\n}\n\n/**\n * Import the internal `saveAssets()` function from `react-native` for the purpose\n * of saving production assets as-is instead of converting them to a hash.\n */\nexport function importCliSaveAssetsFromProject(\n projectRoot: string\n): typeof import('@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets').default {\n return importFromProject(\n projectRoot,\n '@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets'\n ).default;\n}\n\n/** Resolve the installed Metro version from project */\nexport function resolveMetroVersionFromProject(projectRoot: string): string {\n return importFromProject(projectRoot, 'metro/package.json').version;\n}\n"],"names":["importMetroFromProject","importMetroCreateWebsocketServerFromProject","importMetroHmrServerFromProject","importExpoMetroConfig","importFromProjectOrFallback","importMetroResolverFromProject","importMetroInspectorProxyFromProject","importMetroInspectorDeviceFromProject","importCliSaveAssetsFromProject","resolveMetroVersionFromProject","debug","require","MetroImportError","Error","constructor","projectRoot","moduleId","resolveFromProject","resolvedPath","resolveFrom","silent","importFromProject","resolve","default","version"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/resolveFromProject.ts"],"sourcesContent":["import resolveFrom from 'resolve-from';\n\nconst debug = require('debug')('expo:metro:import');\n\n// These resolvers enable us to test the CLI in older projects.\n// We may be able to get rid of this in the future.\n// TODO: Maybe combine with AsyncResolver?\nclass MetroImportError extends Error {\n constructor(projectRoot: string, moduleId: string) {\n super(\n `Missing package \"${moduleId}\" in the project at: ${projectRoot}\\n` +\n 'This usually means \"react-native\" is not installed. ' +\n 'Please verify that dependencies in package.json include \"react-native\" ' +\n 'and run `yarn` or `npm install`.'\n );\n }\n}\n\nexport function importCliServerApiFromProject(\n projectRoot: string\n): typeof import('@react-native-community/cli-server-api') {\n return importFromProject(projectRoot, '@react-native-community/cli-server-api');\n}\n\nexport function importMetroSourceMapComposeSourceMapsFromProject(\n projectRoot: string\n): typeof import('metro-source-map').composeSourceMaps {\n return importFromProject(projectRoot, 'metro-source-map/src/composeSourceMaps');\n}\n\nexport function resolveFromProject(projectRoot: string, moduleId: string) {\n const resolvedPath = resolveFrom.silent(projectRoot, moduleId);\n if (!resolvedPath) {\n throw new MetroImportError(projectRoot, moduleId);\n }\n return resolvedPath;\n}\n\nfunction importFromProject(projectRoot: string, moduleId: string) {\n return require(resolveFromProject(projectRoot, moduleId));\n}\n\n/** Import `metro` from the project. */\nexport function importMetroFromProject(projectRoot: string): typeof import('metro') {\n return importFromProject(projectRoot, 'metro');\n}\nexport function importMetroServerFromProject(projectRoot: string): typeof import('metro').Server {\n return importFromProject(projectRoot, 'metro/src/Server');\n}\nexport function importMetroCreateWebsocketServerFromProject(\n projectRoot: string\n): typeof import('metro/src/lib/createWebsocketServer').createWebsocketServer {\n return importFromProject(projectRoot, 'metro/src/lib/createWebsocketServer');\n}\nexport function importMetroHmrServerFromProject(\n projectRoot: string\n): typeof import('metro/src/HmrServer').MetroHmrServer {\n return importFromProject(projectRoot, 'metro/src/HmrServer');\n}\n\nexport function importExpoMetroConfig(projectRoot: string) {\n return importFromProjectOrFallback<typeof import('@expo/metro-config')>(\n projectRoot,\n '@expo/metro-config'\n );\n}\n\n/**\n * Attempt to use the local version of a module or fallback on the CLI version.\n * This should only ever happen when testing Expo CLI in development.\n */\nexport function importFromProjectOrFallback<TModule>(\n projectRoot: string,\n moduleId: string\n): TModule {\n const resolvedPath = resolveFrom.silent(projectRoot, moduleId);\n if (!resolvedPath) {\n debug(`requiring \"${moduleId}\" relative to the CLI`);\n return require(require.resolve(moduleId));\n }\n debug(`requiring \"${moduleId}\" from the project:`, resolvedPath);\n return require(resolvedPath);\n}\n\n/** Import `metro-resolver` from the project. */\nexport function importMetroResolverFromProject(\n projectRoot: string\n): typeof import('metro-resolver') {\n return importFromProject(projectRoot, 'metro-resolver');\n}\n\n/** Import `metro-inspector-proxy` from the project. */\nexport function importMetroInspectorProxyFromProject(\n projectRoot: string\n): typeof import('metro-inspector-proxy') {\n return importFromProject(projectRoot, 'metro-inspector-proxy');\n}\n\n/** Import `metro-inspector-proxy/src/Device` from the project. */\nexport function importMetroInspectorDeviceFromProject(\n projectRoot: string\n): typeof import('metro-inspector-proxy/src/Device') {\n return importFromProject(projectRoot, 'metro-inspector-proxy/src/Device');\n}\n\n/**\n * Import the internal `saveAssets()` function from `react-native` for the purpose\n * of saving production assets as-is instead of converting them to a hash.\n */\nexport function importCliSaveAssetsFromProject(\n projectRoot: string\n): typeof import('@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets').default {\n return importFromProject(\n projectRoot,\n '@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets'\n ).default;\n}\n\n/** Resolve the installed Metro version from project */\nexport function resolveMetroVersionFromProject(projectRoot: string): string {\n return importFromProject(projectRoot, 'metro/package.json').version;\n}\n"],"names":["importCliServerApiFromProject","importMetroSourceMapComposeSourceMapsFromProject","resolveFromProject","importMetroFromProject","importMetroServerFromProject","importMetroCreateWebsocketServerFromProject","importMetroHmrServerFromProject","importExpoMetroConfig","importFromProjectOrFallback","importMetroResolverFromProject","importMetroInspectorProxyFromProject","importMetroInspectorDeviceFromProject","importCliSaveAssetsFromProject","resolveMetroVersionFromProject","debug","require","MetroImportError","Error","constructor","projectRoot","moduleId","importFromProject","resolvedPath","resolveFrom","silent","resolve","default","version"],"mappings":"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"}
@@ -249,6 +249,20 @@ function withExtendedResolver(config, { projectRoot , tsconfig , platforms , isT
249
249
  moduleName: moduleName1
250
250
  }, optionalResolve);
251
251
  }
252
+ if (// is web
253
+ platform === "web" && // Not server runtime
254
+ !isNode && // Is Node.js built-in
255
+ (0, _externals).isNodeExternal(moduleName1)) {
256
+ // Perform optional resolve first. If the module doesn't exist (no module in the node_modules)
257
+ // then we can mock the file to use an empty module.
258
+ result != null ? result : result = optionalResolve(moduleName1);
259
+ if (!result) {
260
+ // In this case, mock the file to use an empty module.
261
+ return {
262
+ type: "empty"
263
+ };
264
+ }
265
+ }
252
266
  result != null ? result : result = doResolve(moduleName1);
253
267
  if (result) {
254
268
  // Replace the web resolver with the original one.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/withMetroMultiPlatform.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport { ConfigT } from 'metro-config';\nimport { Resolution, ResolutionContext } from 'metro-resolver';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport {\n EXTERNAL_REQUIRE_NATIVE_POLYFILL,\n EXTERNAL_REQUIRE_POLYFILL,\n getNodeExternalModuleId,\n isNodeExternal,\n setupNodeExternals,\n} from './externals';\nimport { isFailedToResolveNameError, isFailedToResolvePathError } from './metroErrors';\nimport { importMetroResolverFromProject } from './resolveFromProject';\nimport { getAppRouterRelativeEntryPath } from './router';\nimport { withMetroResolvers } from './withMetroResolvers';\nimport { Log } from '../../../log';\nimport { FileNotifier } from '../../../utils/FileNotifier';\nimport { env } from '../../../utils/env';\nimport { installExitHooks } from '../../../utils/exit';\nimport { isInteractive } from '../../../utils/interactive';\nimport { learnMore } from '../../../utils/link';\nimport { loadTsConfigPathsAsync, TsConfigPaths } from '../../../utils/tsconfig/loadTsConfigPaths';\nimport { resolveWithTsConfigPaths } from '../../../utils/tsconfig/resolveWithTsConfigPaths';\nimport { WebSupportProjectPrerequisite } from '../../doctor/web/WebSupportProjectPrerequisite';\nimport { PlatformBundlers } from '../platformBundlers';\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\nconst debug = require('debug')('expo:start:server:metro:multi-platform') as typeof console.log;\n\nfunction withWebPolyfills(config: ConfigT, projectRoot: string): ConfigT {\n const originalGetPolyfills = config.serializer.getPolyfills\n ? config.serializer.getPolyfills.bind(config.serializer)\n : () => [];\n\n const getPolyfills = (ctx: { platform: string | null }): readonly string[] => {\n if (ctx.platform === 'web') {\n return [\n // NOTE: We might need this for all platforms\n path.join(projectRoot, EXTERNAL_REQUIRE_POLYFILL),\n // TODO: runtime polyfills, i.e. Fast Refresh, error overlay, React Dev Tools...\n ];\n }\n // Generally uses `rn-get-polyfills`\n const polyfills = originalGetPolyfills(ctx);\n\n return [...polyfills, EXTERNAL_REQUIRE_NATIVE_POLYFILL];\n };\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n getPolyfills,\n },\n };\n}\n\nfunction normalizeSlashes(p: string) {\n return p.replace(/\\\\/g, '/');\n}\n\nexport function getNodejsExtensions(srcExts: readonly string[]): string[] {\n const mjsExts = srcExts.filter((ext) => /mjs$/.test(ext));\n const nodejsSourceExtensions = srcExts.filter((ext) => !/mjs$/.test(ext));\n // find index of last `*.js` extension\n const jsIndex = nodejsSourceExtensions.reduce((index, ext, i) => {\n return /jsx?$/.test(ext) ? i : index;\n }, -1);\n\n // insert `*.mjs` extensions after `*.js` extensions\n nodejsSourceExtensions.splice(jsIndex + 1, 0, ...mjsExts);\n\n return nodejsSourceExtensions;\n}\n\n/**\n * Apply custom resolvers to do the following:\n * - Disable `.native.js` extensions on web.\n * - Alias `react-native` to `react-native-web` on web.\n * - Redirect `react-native-web/dist/modules/AssetRegistry/index.js` to `@react-native/assets/registry.js` on web.\n * - Add support for `tsconfig.json`/`jsconfig.json` aliases via `compilerOptions.paths`.\n */\nexport function withExtendedResolver(\n config: ConfigT,\n {\n projectRoot,\n tsconfig,\n platforms,\n isTsconfigPathsEnabled,\n }: {\n projectRoot: string;\n tsconfig: TsConfigPaths | null;\n platforms: string[];\n isTsconfigPathsEnabled?: boolean;\n }\n) {\n // Get the `transformer.assetRegistryPath`\n // this needs to be unified since you can't dynamically\n // swap out the transformer based on platform.\n const assetRegistryPath = fs.realpathSync(\n // This is the native asset registry alias for native.\n path.resolve(resolveFrom(projectRoot, 'react-native/Libraries/Image/AssetRegistry'))\n // NOTE(EvanBacon): This is the newer import but it doesn't work in the expo/expo monorepo.\n // path.resolve(resolveFrom(projectRoot, '@react-native/assets/registry.js'))\n );\n\n let reactNativeWebAppContainer: string | null = null;\n try {\n reactNativeWebAppContainer = fs.realpathSync(\n // This is the native asset registry alias for native.\n path.resolve(resolveFrom(projectRoot, 'expo-router/build/fork/react-native-web-container'))\n // NOTE(EvanBacon): This is the newer import but it doesn't work in the expo/expo monorepo.\n // path.resolve(resolveFrom(projectRoot, '@react-native/assets/registry.js'))\n );\n } catch {}\n\n const isWebEnabled = platforms.includes('web');\n\n const { resolve } = importMetroResolverFromProject(projectRoot);\n\n const extraNodeModules: { [key: string]: Record<string, string> } = {};\n\n const aliases: { [key: string]: Record<string, string> } = {\n web: {\n 'react-native': 'react-native-web',\n 'react-native/index': 'react-native-web',\n },\n };\n\n if (isWebEnabled) {\n // Allow `react-native-web` to be optional when web is not enabled but path aliases is.\n extraNodeModules['web'] = {\n 'react-native': path.resolve(require.resolve('react-native-web/package.json'), '..'),\n };\n }\n\n const preferredMainFields: { [key: string]: string[] } = {\n // Defaults from Expo Webpack. Most packages using `react-native` don't support web\n // in the `react-native` field, so we should prefer the `browser` field.\n // https://github.com/expo/router/issues/37\n web: ['browser', 'module', 'main'],\n };\n\n let tsConfigResolve = tsconfig?.paths\n ? resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsconfig.paths ?? {},\n baseUrl: tsconfig.baseUrl,\n })\n : null;\n\n if (isTsconfigPathsEnabled && isInteractive()) {\n // TODO: We should track all the files that used imports and invalidate them\n // currently the user will need to save all the files that use imports to\n // use the new aliases.\n const configWatcher = new FileNotifier(projectRoot, ['./tsconfig.json', './jsconfig.json']);\n configWatcher.startObserving(() => {\n debug('Reloading tsconfig.json');\n loadTsConfigPathsAsync(projectRoot).then((tsConfigPaths) => {\n if (tsConfigPaths?.paths && !!Object.keys(tsConfigPaths.paths).length) {\n debug('Enabling tsconfig.json paths support');\n tsConfigResolve = resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsConfigPaths.paths ?? {},\n baseUrl: tsConfigPaths.baseUrl,\n });\n } else {\n debug('Disabling tsconfig.json paths support');\n tsConfigResolve = null;\n }\n });\n });\n\n // TODO: This probably prevents the process from exiting.\n installExitHooks(() => {\n configWatcher.stopObserving();\n });\n } else {\n debug('Skipping tsconfig.json paths support');\n }\n\n let nodejsSourceExtensions: string[] | null = null;\n\n return withMetroResolvers(config, projectRoot, [\n // Add a resolver to alias the web asset resolver.\n (immutableContext: ResolutionContext, moduleName: string, platform: string | null) => {\n let context = {\n ...immutableContext,\n } as Mutable<ResolutionContext> & {\n mainFields: string[];\n customResolverOptions?: Record<string, string>;\n };\n\n const environment = context.customResolverOptions?.environment;\n const isNode = environment === 'node';\n\n // TODO: We need to prevent the require.context from including API routes as these use externals.\n // Should be fine after async routes lands.\n if (isNode) {\n const moduleId = isNodeExternal(moduleName);\n if (moduleId) {\n moduleName = getNodeExternalModuleId(context.originModulePath, moduleId);\n debug(`Redirecting Node.js external \"${moduleId}\" to \"${moduleName}\"`);\n }\n\n // Adjust nodejs source extensions to sort mjs after js, including platform variants.\n if (nodejsSourceExtensions === null) {\n nodejsSourceExtensions = getNodejsExtensions(context.sourceExts);\n }\n context.sourceExts = nodejsSourceExtensions;\n }\n\n // Conditionally remap `react-native` to `react-native-web` on web in\n // a way that doesn't require Babel to resolve the alias.\n if (platform && platform in aliases && aliases[platform][moduleName]) {\n moduleName = aliases[platform][moduleName];\n }\n\n // TODO: We may be able to remove this in the future, it's doing no harm\n // by staying here.\n // Conditionally remap `react-native` to `react-native-web`\n if (platform && platform in extraNodeModules) {\n context.extraNodeModules = {\n ...extraNodeModules[platform],\n ...context.extraNodeModules,\n };\n }\n\n if (tsconfig?.baseUrl && isTsconfigPathsEnabled) {\n context = {\n ...context,\n nodeModulesPaths: [\n ...immutableContext.nodeModulesPaths,\n // add last to ensure node modules are resolved first\n tsconfig.baseUrl,\n ],\n };\n }\n\n let mainFields: string[] = context.mainFields;\n\n if (isNode) {\n // Node.js runtimes should only be importing main at the moment.\n // This is a temporary fix until we can support the package.json exports.\n mainFields = ['main', 'module'];\n } else if (env.EXPO_METRO_NO_MAIN_FIELD_OVERRIDE) {\n mainFields = context.mainFields;\n } else if (platform && platform in preferredMainFields) {\n mainFields = preferredMainFields[platform];\n }\n function doResolve(moduleName: string): Resolution | null {\n return resolve(\n {\n ...context,\n resolveRequest: undefined,\n mainFields,\n\n // Passing `mainFields` directly won't be considered (in certain version of Metro)\n // we need to extend the `getPackageMainPath` directly to\n // use platform specific `mainFields`.\n // @ts-ignore\n getPackageMainPath(packageJsonPath) {\n // @ts-expect-error: mainFields is not on type\n const package_ = context.moduleCache.getPackage(packageJsonPath);\n return package_.getMain(mainFields);\n },\n },\n moduleName,\n platform\n );\n }\n\n function optionalResolve(moduleName: string): Resolution | null {\n try {\n return doResolve(moduleName);\n } catch (error) {\n // If the error is directly related to a resolver not being able to resolve a module, then\n // we can ignore the error and try the next resolver. Otherwise, we should throw the error.\n const isResolutionError =\n isFailedToResolveNameError(error) || isFailedToResolvePathError(error);\n if (!isResolutionError) {\n throw error;\n }\n }\n return null;\n }\n\n let result: Resolution | null = null;\n\n // React Native uses `event-target-shim` incorrectly and this causes the native runtime\n // to fail to load. This is a temporary workaround until we can fix this upstream.\n // https://github.com/facebook/react-native/pull/38628\n if (\n moduleName.includes('event-target-shim') &&\n context.originModulePath.includes(path.sep + 'react-native' + path.sep)\n ) {\n context.sourceExts = context.sourceExts.filter((f) => !f.includes('mjs'));\n debug('Skip mjs support for event-target-shim in:', context.originModulePath);\n }\n\n if (tsConfigResolve) {\n result = tsConfigResolve(\n {\n originModulePath: context.originModulePath,\n moduleName,\n },\n optionalResolve\n );\n }\n\n result ??= doResolve(moduleName);\n\n if (result) {\n // Replace the web resolver with the original one.\n // This is basically an alias for web-only.\n if (shouldAliasAssetRegistryForWeb(platform, result)) {\n // @ts-expect-error: `readonly` for some reason.\n result.filePath = assetRegistryPath;\n }\n\n // React Native Web adds a couple extra divs for no reason, these\n // make static rendering much harder as we expect the root element to be `<html>`.\n // This resolution will alias to a simple in-out component to avoid React Native web.\n if (\n // Only apply the transform if expo-router is present.\n reactNativeWebAppContainer &&\n shouldAliasModule(\n {\n platform,\n result,\n },\n {\n platform: 'web',\n output: 'react-native-web/dist/exports/AppRegistry/AppContainer.js',\n }\n )\n ) {\n // @ts-expect-error: `readonly` for some reason.\n result.filePath = reactNativeWebAppContainer;\n }\n }\n return result;\n },\n ]);\n}\n\n/** @returns `true` if the incoming resolution should be swapped on web. */\nexport function shouldAliasAssetRegistryForWeb(\n platform: string | null,\n result: Resolution\n): boolean {\n return (\n platform === 'web' &&\n result?.type === 'sourceFile' &&\n typeof result?.filePath === 'string' &&\n normalizeSlashes(result.filePath).endsWith(\n 'react-native-web/dist/modules/AssetRegistry/index.js'\n )\n );\n}\n/** @returns `true` if the incoming resolution should be swapped. */\nexport function shouldAliasModule(\n input: {\n platform: string | null;\n result: Resolution;\n },\n alias: { platform: string; output: string }\n): boolean {\n return (\n input.platform === alias.platform &&\n input.result?.type === 'sourceFile' &&\n typeof input.result?.filePath === 'string' &&\n normalizeSlashes(input.result.filePath).endsWith(alias.output)\n );\n}\n\n/** Add support for `react-native-web` and the Web platform. */\nexport async function withMetroMultiPlatformAsync(\n projectRoot: string,\n {\n config,\n platformBundlers,\n isTsconfigPathsEnabled,\n webOutput,\n routerDirectory,\n }: {\n config: ConfigT;\n isTsconfigPathsEnabled: boolean;\n platformBundlers: PlatformBundlers;\n webOutput?: 'single' | 'static';\n routerDirectory: string;\n }\n) {\n // Auto pick app entry for router.\n process.env.EXPO_ROUTER_APP_ROOT = getAppRouterRelativeEntryPath(projectRoot, routerDirectory);\n\n // Required for @expo/metro-runtime to format paths in the web LogBox.\n process.env.EXPO_PUBLIC_PROJECT_ROOT = process.env.EXPO_PUBLIC_PROJECT_ROOT ?? projectRoot;\n\n if (webOutput === 'static') {\n // Enable static rendering in runtime space.\n process.env.EXPO_PUBLIC_USE_STATIC = '1';\n }\n\n // Ensure the cache is invalidated if these values change.\n // @ts-expect-error\n config.transformer._expoRouterRootDirectory = process.env.EXPO_ROUTER_APP_ROOT;\n // @ts-expect-error\n config.transformer._expoRouterWebRendering = webOutput;\n // TODO: import mode\n\n if (platformBundlers.web === 'metro') {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n }\n\n let tsconfig: null | TsConfigPaths = null;\n\n if (isTsconfigPathsEnabled) {\n Log.warn(\n chalk.yellow`Experimental path aliases feature is enabled. ` +\n learnMore('https://docs.expo.dev/guides/typescript/#path-aliases')\n );\n tsconfig = await loadTsConfigPathsAsync(projectRoot);\n }\n\n await setupNodeExternals(projectRoot);\n\n return withMetroMultiPlatform(projectRoot, {\n config,\n platformBundlers,\n tsconfig,\n isTsconfigPathsEnabled,\n });\n}\n\nfunction withMetroMultiPlatform(\n projectRoot: string,\n {\n config,\n platformBundlers,\n isTsconfigPathsEnabled,\n tsconfig,\n }: {\n config: ConfigT;\n isTsconfigPathsEnabled: boolean;\n platformBundlers: PlatformBundlers;\n tsconfig: TsConfigPaths | null;\n }\n) {\n let expoConfigPlatforms = Object.entries(platformBundlers)\n .filter(([, bundler]) => bundler === 'metro')\n .map(([platform]) => platform);\n\n if (Array.isArray(config.resolver.platforms)) {\n expoConfigPlatforms = [...new Set(expoConfigPlatforms.concat(config.resolver.platforms))];\n }\n\n // @ts-expect-error: typed as `readonly`.\n config.resolver.platforms = expoConfigPlatforms;\n\n if (expoConfigPlatforms.includes('web')) {\n config = withWebPolyfills(config, projectRoot);\n }\n\n return withExtendedResolver(config, {\n projectRoot,\n tsconfig,\n isTsconfigPathsEnabled,\n platforms: expoConfigPlatforms,\n });\n}\n"],"names":["getNodejsExtensions","withExtendedResolver","shouldAliasAssetRegistryForWeb","shouldAliasModule","withMetroMultiPlatformAsync","debug","require","withWebPolyfills","config","projectRoot","originalGetPolyfills","serializer","getPolyfills","bind","ctx","platform","path","join","EXTERNAL_REQUIRE_POLYFILL","polyfills","EXTERNAL_REQUIRE_NATIVE_POLYFILL","normalizeSlashes","p","replace","srcExts","mjsExts","filter","ext","test","nodejsSourceExtensions","jsIndex","reduce","index","i","splice","tsconfig","platforms","isTsconfigPathsEnabled","assetRegistryPath","fs","realpathSync","resolve","resolveFrom","reactNativeWebAppContainer","isWebEnabled","includes","importMetroResolverFromProject","extraNodeModules","aliases","web","preferredMainFields","tsConfigResolve","paths","resolveWithTsConfigPaths","baseUrl","isInteractive","configWatcher","FileNotifier","startObserving","loadTsConfigPathsAsync","then","tsConfigPaths","Object","keys","length","installExitHooks","stopObserving","withMetroResolvers","immutableContext","moduleName","context","environment","customResolverOptions","isNode","moduleId","isNodeExternal","getNodeExternalModuleId","originModulePath","sourceExts","nodeModulesPaths","mainFields","env","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","doResolve","resolveRequest","undefined","getPackageMainPath","packageJsonPath","package_","moduleCache","getPackage","getMain","optionalResolve","error","isResolutionError","isFailedToResolveNameError","isFailedToResolvePathError","result","sep","f","filePath","output","type","endsWith","input","alias","platformBundlers","webOutput","routerDirectory","process","EXPO_ROUTER_APP_ROOT","getAppRouterRelativeEntryPath","EXPO_PUBLIC_PROJECT_ROOT","EXPO_PUBLIC_USE_STATIC","transformer","_expoRouterRootDirectory","_expoRouterWebRendering","WebSupportProjectPrerequisite","assertAsync","Log","warn","chalk","yellow","learnMore","setupNodeExternals","withMetroMultiPlatform","expoConfigPlatforms","entries","bundler","map","Array","isArray","resolver","Set","concat"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/withMetroMultiPlatform.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport { ConfigT } from 'metro-config';\nimport { Resolution, ResolutionContext } from 'metro-resolver';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport {\n EXTERNAL_REQUIRE_NATIVE_POLYFILL,\n EXTERNAL_REQUIRE_POLYFILL,\n getNodeExternalModuleId,\n isNodeExternal,\n setupNodeExternals,\n} from './externals';\nimport { isFailedToResolveNameError, isFailedToResolvePathError } from './metroErrors';\nimport { importMetroResolverFromProject } from './resolveFromProject';\nimport { getAppRouterRelativeEntryPath } from './router';\nimport { withMetroResolvers } from './withMetroResolvers';\nimport { Log } from '../../../log';\nimport { FileNotifier } from '../../../utils/FileNotifier';\nimport { env } from '../../../utils/env';\nimport { installExitHooks } from '../../../utils/exit';\nimport { isInteractive } from '../../../utils/interactive';\nimport { learnMore } from '../../../utils/link';\nimport { loadTsConfigPathsAsync, TsConfigPaths } from '../../../utils/tsconfig/loadTsConfigPaths';\nimport { resolveWithTsConfigPaths } from '../../../utils/tsconfig/resolveWithTsConfigPaths';\nimport { WebSupportProjectPrerequisite } from '../../doctor/web/WebSupportProjectPrerequisite';\nimport { PlatformBundlers } from '../platformBundlers';\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\nconst debug = require('debug')('expo:start:server:metro:multi-platform') as typeof console.log;\n\nfunction withWebPolyfills(config: ConfigT, projectRoot: string): ConfigT {\n const originalGetPolyfills = config.serializer.getPolyfills\n ? config.serializer.getPolyfills.bind(config.serializer)\n : () => [];\n\n const getPolyfills = (ctx: { platform: string | null }): readonly string[] => {\n if (ctx.platform === 'web') {\n return [\n // NOTE: We might need this for all platforms\n path.join(projectRoot, EXTERNAL_REQUIRE_POLYFILL),\n // TODO: runtime polyfills, i.e. Fast Refresh, error overlay, React Dev Tools...\n ];\n }\n // Generally uses `rn-get-polyfills`\n const polyfills = originalGetPolyfills(ctx);\n\n return [...polyfills, EXTERNAL_REQUIRE_NATIVE_POLYFILL];\n };\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n getPolyfills,\n },\n };\n}\n\nfunction normalizeSlashes(p: string) {\n return p.replace(/\\\\/g, '/');\n}\n\nexport function getNodejsExtensions(srcExts: readonly string[]): string[] {\n const mjsExts = srcExts.filter((ext) => /mjs$/.test(ext));\n const nodejsSourceExtensions = srcExts.filter((ext) => !/mjs$/.test(ext));\n // find index of last `*.js` extension\n const jsIndex = nodejsSourceExtensions.reduce((index, ext, i) => {\n return /jsx?$/.test(ext) ? i : index;\n }, -1);\n\n // insert `*.mjs` extensions after `*.js` extensions\n nodejsSourceExtensions.splice(jsIndex + 1, 0, ...mjsExts);\n\n return nodejsSourceExtensions;\n}\n\n/**\n * Apply custom resolvers to do the following:\n * - Disable `.native.js` extensions on web.\n * - Alias `react-native` to `react-native-web` on web.\n * - Redirect `react-native-web/dist/modules/AssetRegistry/index.js` to `@react-native/assets/registry.js` on web.\n * - Add support for `tsconfig.json`/`jsconfig.json` aliases via `compilerOptions.paths`.\n */\nexport function withExtendedResolver(\n config: ConfigT,\n {\n projectRoot,\n tsconfig,\n platforms,\n isTsconfigPathsEnabled,\n }: {\n projectRoot: string;\n tsconfig: TsConfigPaths | null;\n platforms: string[];\n isTsconfigPathsEnabled?: boolean;\n }\n) {\n // Get the `transformer.assetRegistryPath`\n // this needs to be unified since you can't dynamically\n // swap out the transformer based on platform.\n const assetRegistryPath = fs.realpathSync(\n // This is the native asset registry alias for native.\n path.resolve(resolveFrom(projectRoot, 'react-native/Libraries/Image/AssetRegistry'))\n // NOTE(EvanBacon): This is the newer import but it doesn't work in the expo/expo monorepo.\n // path.resolve(resolveFrom(projectRoot, '@react-native/assets/registry.js'))\n );\n\n let reactNativeWebAppContainer: string | null = null;\n try {\n reactNativeWebAppContainer = fs.realpathSync(\n // This is the native asset registry alias for native.\n path.resolve(resolveFrom(projectRoot, 'expo-router/build/fork/react-native-web-container'))\n // NOTE(EvanBacon): This is the newer import but it doesn't work in the expo/expo monorepo.\n // path.resolve(resolveFrom(projectRoot, '@react-native/assets/registry.js'))\n );\n } catch {}\n\n const isWebEnabled = platforms.includes('web');\n\n const { resolve } = importMetroResolverFromProject(projectRoot);\n\n const extraNodeModules: { [key: string]: Record<string, string> } = {};\n\n const aliases: { [key: string]: Record<string, string> } = {\n web: {\n 'react-native': 'react-native-web',\n 'react-native/index': 'react-native-web',\n },\n };\n\n if (isWebEnabled) {\n // Allow `react-native-web` to be optional when web is not enabled but path aliases is.\n extraNodeModules['web'] = {\n 'react-native': path.resolve(require.resolve('react-native-web/package.json'), '..'),\n };\n }\n\n const preferredMainFields: { [key: string]: string[] } = {\n // Defaults from Expo Webpack. Most packages using `react-native` don't support web\n // in the `react-native` field, so we should prefer the `browser` field.\n // https://github.com/expo/router/issues/37\n web: ['browser', 'module', 'main'],\n };\n\n let tsConfigResolve = tsconfig?.paths\n ? resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsconfig.paths ?? {},\n baseUrl: tsconfig.baseUrl,\n })\n : null;\n\n if (isTsconfigPathsEnabled && isInteractive()) {\n // TODO: We should track all the files that used imports and invalidate them\n // currently the user will need to save all the files that use imports to\n // use the new aliases.\n const configWatcher = new FileNotifier(projectRoot, ['./tsconfig.json', './jsconfig.json']);\n configWatcher.startObserving(() => {\n debug('Reloading tsconfig.json');\n loadTsConfigPathsAsync(projectRoot).then((tsConfigPaths) => {\n if (tsConfigPaths?.paths && !!Object.keys(tsConfigPaths.paths).length) {\n debug('Enabling tsconfig.json paths support');\n tsConfigResolve = resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsConfigPaths.paths ?? {},\n baseUrl: tsConfigPaths.baseUrl,\n });\n } else {\n debug('Disabling tsconfig.json paths support');\n tsConfigResolve = null;\n }\n });\n });\n\n // TODO: This probably prevents the process from exiting.\n installExitHooks(() => {\n configWatcher.stopObserving();\n });\n } else {\n debug('Skipping tsconfig.json paths support');\n }\n\n let nodejsSourceExtensions: string[] | null = null;\n\n return withMetroResolvers(config, projectRoot, [\n // Add a resolver to alias the web asset resolver.\n (immutableContext: ResolutionContext, moduleName: string, platform: string | null) => {\n let context = {\n ...immutableContext,\n } as Mutable<ResolutionContext> & {\n mainFields: string[];\n customResolverOptions?: Record<string, string>;\n };\n\n const environment = context.customResolverOptions?.environment;\n const isNode = environment === 'node';\n\n // TODO: We need to prevent the require.context from including API routes as these use externals.\n // Should be fine after async routes lands.\n if (isNode) {\n const moduleId = isNodeExternal(moduleName);\n if (moduleId) {\n moduleName = getNodeExternalModuleId(context.originModulePath, moduleId);\n debug(`Redirecting Node.js external \"${moduleId}\" to \"${moduleName}\"`);\n }\n\n // Adjust nodejs source extensions to sort mjs after js, including platform variants.\n if (nodejsSourceExtensions === null) {\n nodejsSourceExtensions = getNodejsExtensions(context.sourceExts);\n }\n context.sourceExts = nodejsSourceExtensions;\n }\n\n // Conditionally remap `react-native` to `react-native-web` on web in\n // a way that doesn't require Babel to resolve the alias.\n if (platform && platform in aliases && aliases[platform][moduleName]) {\n moduleName = aliases[platform][moduleName];\n }\n\n // TODO: We may be able to remove this in the future, it's doing no harm\n // by staying here.\n // Conditionally remap `react-native` to `react-native-web`\n if (platform && platform in extraNodeModules) {\n context.extraNodeModules = {\n ...extraNodeModules[platform],\n ...context.extraNodeModules,\n };\n }\n\n if (tsconfig?.baseUrl && isTsconfigPathsEnabled) {\n context = {\n ...context,\n nodeModulesPaths: [\n ...immutableContext.nodeModulesPaths,\n // add last to ensure node modules are resolved first\n tsconfig.baseUrl,\n ],\n };\n }\n\n let mainFields: string[] = context.mainFields;\n\n if (isNode) {\n // Node.js runtimes should only be importing main at the moment.\n // This is a temporary fix until we can support the package.json exports.\n mainFields = ['main', 'module'];\n } else if (env.EXPO_METRO_NO_MAIN_FIELD_OVERRIDE) {\n mainFields = context.mainFields;\n } else if (platform && platform in preferredMainFields) {\n mainFields = preferredMainFields[platform];\n }\n function doResolve(moduleName: string): Resolution | null {\n return resolve(\n {\n ...context,\n resolveRequest: undefined,\n mainFields,\n\n // Passing `mainFields` directly won't be considered (in certain version of Metro)\n // we need to extend the `getPackageMainPath` directly to\n // use platform specific `mainFields`.\n // @ts-ignore\n getPackageMainPath(packageJsonPath) {\n // @ts-expect-error: mainFields is not on type\n const package_ = context.moduleCache.getPackage(packageJsonPath);\n return package_.getMain(mainFields);\n },\n },\n moduleName,\n platform\n );\n }\n\n function optionalResolve(moduleName: string): Resolution | null {\n try {\n return doResolve(moduleName);\n } catch (error) {\n // If the error is directly related to a resolver not being able to resolve a module, then\n // we can ignore the error and try the next resolver. Otherwise, we should throw the error.\n const isResolutionError =\n isFailedToResolveNameError(error) || isFailedToResolvePathError(error);\n if (!isResolutionError) {\n throw error;\n }\n }\n return null;\n }\n\n let result: Resolution | null = null;\n\n // React Native uses `event-target-shim` incorrectly and this causes the native runtime\n // to fail to load. This is a temporary workaround until we can fix this upstream.\n // https://github.com/facebook/react-native/pull/38628\n if (\n moduleName.includes('event-target-shim') &&\n context.originModulePath.includes(path.sep + 'react-native' + path.sep)\n ) {\n context.sourceExts = context.sourceExts.filter((f) => !f.includes('mjs'));\n debug('Skip mjs support for event-target-shim in:', context.originModulePath);\n }\n\n if (tsConfigResolve) {\n result = tsConfigResolve(\n {\n originModulePath: context.originModulePath,\n moduleName,\n },\n optionalResolve\n );\n }\n\n if (\n // is web\n platform === 'web' &&\n // Not server runtime\n !isNode &&\n // Is Node.js built-in\n isNodeExternal(moduleName)\n ) {\n // Perform optional resolve first. If the module doesn't exist (no module in the node_modules)\n // then we can mock the file to use an empty module.\n result ??= optionalResolve(moduleName);\n\n if (!result) {\n // In this case, mock the file to use an empty module.\n return {\n type: 'empty',\n };\n }\n }\n\n result ??= doResolve(moduleName);\n\n if (result) {\n // Replace the web resolver with the original one.\n // This is basically an alias for web-only.\n if (shouldAliasAssetRegistryForWeb(platform, result)) {\n // @ts-expect-error: `readonly` for some reason.\n result.filePath = assetRegistryPath;\n }\n\n // React Native Web adds a couple extra divs for no reason, these\n // make static rendering much harder as we expect the root element to be `<html>`.\n // This resolution will alias to a simple in-out component to avoid React Native web.\n if (\n // Only apply the transform if expo-router is present.\n reactNativeWebAppContainer &&\n shouldAliasModule(\n {\n platform,\n result,\n },\n {\n platform: 'web',\n output: 'react-native-web/dist/exports/AppRegistry/AppContainer.js',\n }\n )\n ) {\n // @ts-expect-error: `readonly` for some reason.\n result.filePath = reactNativeWebAppContainer;\n }\n }\n return result;\n },\n ]);\n}\n\n/** @returns `true` if the incoming resolution should be swapped on web. */\nexport function shouldAliasAssetRegistryForWeb(\n platform: string | null,\n result: Resolution\n): boolean {\n return (\n platform === 'web' &&\n result?.type === 'sourceFile' &&\n typeof result?.filePath === 'string' &&\n normalizeSlashes(result.filePath).endsWith(\n 'react-native-web/dist/modules/AssetRegistry/index.js'\n )\n );\n}\n/** @returns `true` if the incoming resolution should be swapped. */\nexport function shouldAliasModule(\n input: {\n platform: string | null;\n result: Resolution;\n },\n alias: { platform: string; output: string }\n): boolean {\n return (\n input.platform === alias.platform &&\n input.result?.type === 'sourceFile' &&\n typeof input.result?.filePath === 'string' &&\n normalizeSlashes(input.result.filePath).endsWith(alias.output)\n );\n}\n\n/** Add support for `react-native-web` and the Web platform. */\nexport async function withMetroMultiPlatformAsync(\n projectRoot: string,\n {\n config,\n platformBundlers,\n isTsconfigPathsEnabled,\n webOutput,\n routerDirectory,\n }: {\n config: ConfigT;\n isTsconfigPathsEnabled: boolean;\n platformBundlers: PlatformBundlers;\n webOutput?: 'single' | 'static';\n routerDirectory: string;\n }\n) {\n // Auto pick app entry for router.\n process.env.EXPO_ROUTER_APP_ROOT = getAppRouterRelativeEntryPath(projectRoot, routerDirectory);\n\n // Required for @expo/metro-runtime to format paths in the web LogBox.\n process.env.EXPO_PUBLIC_PROJECT_ROOT = process.env.EXPO_PUBLIC_PROJECT_ROOT ?? projectRoot;\n\n if (webOutput === 'static') {\n // Enable static rendering in runtime space.\n process.env.EXPO_PUBLIC_USE_STATIC = '1';\n }\n\n // Ensure the cache is invalidated if these values change.\n // @ts-expect-error\n config.transformer._expoRouterRootDirectory = process.env.EXPO_ROUTER_APP_ROOT;\n // @ts-expect-error\n config.transformer._expoRouterWebRendering = webOutput;\n // TODO: import mode\n\n if (platformBundlers.web === 'metro') {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n }\n\n let tsconfig: null | TsConfigPaths = null;\n\n if (isTsconfigPathsEnabled) {\n Log.warn(\n chalk.yellow`Experimental path aliases feature is enabled. ` +\n learnMore('https://docs.expo.dev/guides/typescript/#path-aliases')\n );\n tsconfig = await loadTsConfigPathsAsync(projectRoot);\n }\n\n await setupNodeExternals(projectRoot);\n\n return withMetroMultiPlatform(projectRoot, {\n config,\n platformBundlers,\n tsconfig,\n isTsconfigPathsEnabled,\n });\n}\n\nfunction withMetroMultiPlatform(\n projectRoot: string,\n {\n config,\n platformBundlers,\n isTsconfigPathsEnabled,\n tsconfig,\n }: {\n config: ConfigT;\n isTsconfigPathsEnabled: boolean;\n platformBundlers: PlatformBundlers;\n tsconfig: TsConfigPaths | null;\n }\n) {\n let expoConfigPlatforms = Object.entries(platformBundlers)\n .filter(([, bundler]) => bundler === 'metro')\n .map(([platform]) => platform);\n\n if (Array.isArray(config.resolver.platforms)) {\n expoConfigPlatforms = [...new Set(expoConfigPlatforms.concat(config.resolver.platforms))];\n }\n\n // @ts-expect-error: typed as `readonly`.\n config.resolver.platforms = expoConfigPlatforms;\n\n if (expoConfigPlatforms.includes('web')) {\n config = withWebPolyfills(config, projectRoot);\n }\n\n return withExtendedResolver(config, {\n projectRoot,\n tsconfig,\n isTsconfigPathsEnabled,\n platforms: expoConfigPlatforms,\n });\n}\n"],"names":["getNodejsExtensions","withExtendedResolver","shouldAliasAssetRegistryForWeb","shouldAliasModule","withMetroMultiPlatformAsync","debug","require","withWebPolyfills","config","projectRoot","originalGetPolyfills","serializer","getPolyfills","bind","ctx","platform","path","join","EXTERNAL_REQUIRE_POLYFILL","polyfills","EXTERNAL_REQUIRE_NATIVE_POLYFILL","normalizeSlashes","p","replace","srcExts","mjsExts","filter","ext","test","nodejsSourceExtensions","jsIndex","reduce","index","i","splice","tsconfig","platforms","isTsconfigPathsEnabled","assetRegistryPath","fs","realpathSync","resolve","resolveFrom","reactNativeWebAppContainer","isWebEnabled","includes","importMetroResolverFromProject","extraNodeModules","aliases","web","preferredMainFields","tsConfigResolve","paths","resolveWithTsConfigPaths","baseUrl","isInteractive","configWatcher","FileNotifier","startObserving","loadTsConfigPathsAsync","then","tsConfigPaths","Object","keys","length","installExitHooks","stopObserving","withMetroResolvers","immutableContext","moduleName","context","environment","customResolverOptions","isNode","moduleId","isNodeExternal","getNodeExternalModuleId","originModulePath","sourceExts","nodeModulesPaths","mainFields","env","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","doResolve","resolveRequest","undefined","getPackageMainPath","packageJsonPath","package_","moduleCache","getPackage","getMain","optionalResolve","error","isResolutionError","isFailedToResolveNameError","isFailedToResolvePathError","result","sep","f","type","filePath","output","endsWith","input","alias","platformBundlers","webOutput","routerDirectory","process","EXPO_ROUTER_APP_ROOT","getAppRouterRelativeEntryPath","EXPO_PUBLIC_PROJECT_ROOT","EXPO_PUBLIC_USE_STATIC","transformer","_expoRouterRootDirectory","_expoRouterWebRendering","WebSupportProjectPrerequisite","assertAsync","Log","warn","chalk","yellow","learnMore","setupNodeExternals","withMetroMultiPlatform","expoConfigPlatforms","entries","bundler","map","Array","isArray","resolver","Set","concat"],"mappings":"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"}
@@ -85,7 +85,7 @@ class ExpoGoManifestHandlerMiddleware extends _manifestMiddleware.ManifestMiddle
85
85
  var ref, ref1;
86
86
  const { exp , hostUri , expoGoConfig , bundleUrl } = await this._resolveProjectSettingsAsync(requestOptions);
87
87
  var _runtimeVersion;
88
- const runtimeVersion = _configPlugins.Updates.getRuntimeVersion({
88
+ const runtimeVersion = await _configPlugins.Updates.getRuntimeVersionAsync(this.projectRoot, {
89
89
  ...exp,
90
90
  runtimeVersion: (_runtimeVersion = exp.runtimeVersion) != null ? _runtimeVersion : {
91
91
  policy: "sdkVersion"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/ExpoGoManifestHandlerMiddleware.ts"],"sourcesContent":["import { ExpoUpdatesManifest } from '@expo/config';\nimport { Updates } from '@expo/config-plugins';\nimport accepts from 'accepts';\nimport crypto from 'crypto';\nimport FormData from 'form-data';\nimport { serializeDictionary, Dictionary } from 'structured-headers';\n\nimport { ManifestMiddleware, ManifestRequestInfo } from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME } from '../../../api/user/user';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport {\n CodeSigningInfo,\n getCodeSigningInfoAsync,\n signManifestString,\n} from '../../../utils/codesigning';\nimport { CommandError } from '../../../utils/errors';\nimport { stripPort } from '../../../utils/url';\n\nconst debug = require('debug')('expo:start:server:middleware:ExpoGoManifestHandlerMiddleware');\n\nexport enum ResponseContentType {\n TEXT_PLAIN,\n APPLICATION_JSON,\n APPLICATION_EXPO_JSON,\n MULTIPART_MIXED,\n}\n\ninterface ExpoGoManifestRequestInfo extends ManifestRequestInfo {\n responseContentType: ResponseContentType;\n expectSignature: string | null;\n}\n\nexport class ExpoGoManifestHandlerMiddleware extends ManifestMiddleware<ExpoGoManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ExpoGoManifestRequestInfo {\n let platform = parsePlatformHeader(req);\n\n if (!platform) {\n debug(\n `No \"expo-platform\" header or \"platform\" query parameter specified. Falling back to \"ios\".`\n );\n platform = 'ios';\n }\n\n assertRuntimePlatform(platform);\n\n // Expo Updates clients explicitly accept \"multipart/mixed\" responses while browsers implicitly\n // accept them with \"accept: */*\". To make it easier to debug manifest responses by visiting their\n // URLs in a browser, we denote the response as \"text/plain\" if the user agent appears not to be\n // an Expo Updates client.\n const accept = accepts(req);\n const acceptedType = accept.types([\n 'unknown/unknown',\n 'multipart/mixed',\n 'application/json',\n 'application/expo+json',\n 'text/plain',\n ]);\n\n let responseContentType;\n switch (acceptedType) {\n case 'multipart/mixed':\n responseContentType = ResponseContentType.MULTIPART_MIXED;\n break;\n case 'application/json':\n responseContentType = ResponseContentType.APPLICATION_JSON;\n break;\n case 'application/expo+json':\n responseContentType = ResponseContentType.APPLICATION_EXPO_JSON;\n break;\n default:\n responseContentType = ResponseContentType.TEXT_PLAIN;\n break;\n }\n\n const expectSignature = req.headers['expo-expect-signature'];\n\n return {\n responseContentType,\n platform,\n expectSignature: expectSignature ? String(expectSignature) : null,\n hostname: stripPort(req.headers['host']),\n };\n }\n\n private getDefaultResponseHeaders(): ServerHeaders {\n const headers = new Map<string, number | string | readonly string[]>();\n // set required headers for Expo Updates manifest specification\n headers.set('expo-protocol-version', 0);\n headers.set('expo-sfv-version', 0);\n headers.set('cache-control', 'private, max-age=0');\n return headers;\n }\n\n public async _getManifestResponseAsync(requestOptions: ExpoGoManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const runtimeVersion = Updates.getRuntimeVersion(\n { ...exp, runtimeVersion: exp.runtimeVersion ?? { policy: 'sdkVersion' } },\n requestOptions.platform\n );\n if (!runtimeVersion) {\n throw new CommandError(\n 'MANIFEST_MIDDLEWARE',\n `Unable to determine runtime version for platform '${requestOptions.platform}'`\n );\n }\n\n const codeSigningInfo = await getCodeSigningInfoAsync(\n exp,\n requestOptions.expectSignature,\n this.options.privateKeyPath\n );\n\n const easProjectId = exp.extra?.eas?.projectId as string | undefined | null;\n const scopeKey = await ExpoGoManifestHandlerMiddleware.getScopeKeyAsync({\n slug: exp.slug,\n codeSigningInfo,\n });\n\n const expoUpdatesManifest: ExpoUpdatesManifest = {\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n runtimeVersion,\n launchAsset: {\n key: 'bundle',\n contentType: 'application/javascript',\n url: bundleUrl,\n },\n assets: [], // assets are not used in development\n metadata: {}, // required for the client to detect that this is an expo-updates manifest\n extra: {\n eas: {\n projectId: easProjectId ?? undefined,\n },\n expoClient: {\n ...exp,\n hostUri,\n },\n expoGo: expoGoConfig,\n scopeKey,\n },\n };\n\n const stringifiedManifest = JSON.stringify(expoUpdatesManifest);\n\n let manifestPartHeaders: { 'expo-signature': string } | null = null;\n let certificateChainBody: string | null = null;\n if (codeSigningInfo) {\n const signature = signManifestString(stringifiedManifest, codeSigningInfo);\n manifestPartHeaders = {\n 'expo-signature': serializeDictionary(\n convertToDictionaryItemsRepresentation({\n keyid: codeSigningInfo.keyId,\n sig: signature,\n alg: 'rsa-v1_5-sha256',\n })\n ),\n };\n certificateChainBody = codeSigningInfo.certificateChainForResponse.join('\\n');\n }\n\n const headers = this.getDefaultResponseHeaders();\n\n switch (requestOptions.responseContentType) {\n case ResponseContentType.MULTIPART_MIXED: {\n const form = this.getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n });\n headers.set('content-type', `multipart/mixed; boundary=${form.getBoundary()}`);\n return {\n body: form.getBuffer().toString(),\n version: runtimeVersion,\n headers,\n };\n }\n case ResponseContentType.APPLICATION_EXPO_JSON:\n case ResponseContentType.APPLICATION_JSON:\n case ResponseContentType.TEXT_PLAIN: {\n headers.set(\n 'content-type',\n ExpoGoManifestHandlerMiddleware.getContentTypeForResponseContentType(\n requestOptions.responseContentType\n )\n );\n if (manifestPartHeaders) {\n Object.entries(manifestPartHeaders).forEach(([key, value]) => {\n headers.set(key, value);\n });\n }\n\n return {\n body: stringifiedManifest,\n version: runtimeVersion,\n headers,\n };\n }\n }\n }\n\n private static getContentTypeForResponseContentType(\n responseContentType: ResponseContentType\n ): string {\n switch (responseContentType) {\n case ResponseContentType.MULTIPART_MIXED:\n return 'multipart/mixed';\n case ResponseContentType.APPLICATION_EXPO_JSON:\n return 'application/expo+json';\n case ResponseContentType.APPLICATION_JSON:\n return 'application/json';\n case ResponseContentType.TEXT_PLAIN:\n return 'text/plain';\n }\n }\n\n private getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n }: {\n stringifiedManifest: string;\n manifestPartHeaders: { 'expo-signature': string } | null;\n certificateChainBody: string | null;\n }): FormData {\n const form = new FormData();\n form.append('manifest', stringifiedManifest, {\n contentType: 'application/json',\n header: {\n ...manifestPartHeaders,\n },\n });\n if (certificateChainBody && certificateChainBody.length > 0) {\n form.append('certificate_chain', certificateChainBody, {\n contentType: 'application/x-pem-file',\n });\n }\n return form;\n }\n\n protected trackManifest(version?: string) {\n logEventAsync('Serve Expo Updates Manifest', {\n runtimeVersion: version,\n });\n }\n\n private static async getScopeKeyAsync({\n slug,\n codeSigningInfo,\n }: {\n slug: string;\n codeSigningInfo: CodeSigningInfo | null;\n }): Promise<string> {\n const scopeKeyFromCodeSigningInfo = codeSigningInfo?.scopeKey;\n if (scopeKeyFromCodeSigningInfo) {\n return scopeKeyFromCodeSigningInfo;\n }\n\n // Log.warn(\n // env.EXPO_OFFLINE\n // ? 'Using anonymous scope key in manifest for offline mode.'\n // : 'Using anonymous scope key in manifest.'\n // );\n return await getAnonymousScopeKeyAsync(slug);\n }\n}\n\nasync function getAnonymousScopeKeyAsync(slug: string): Promise<string> {\n const userAnonymousIdentifier = await UserSettings.getAnonymousIdentifierAsync();\n return `@${ANONYMOUS_USERNAME}/${slug}-${userAnonymousIdentifier}`;\n}\n\nfunction convertToDictionaryItemsRepresentation(obj: { [key: string]: string }): Dictionary {\n return new Map(\n Object.entries(obj).map(([k, v]) => {\n return [k, [v, new Map()]];\n })\n );\n}\n"],"names":["debug","require","ResponseContentType","TEXT_PLAIN","APPLICATION_JSON","APPLICATION_EXPO_JSON","MULTIPART_MIXED","ExpoGoManifestHandlerMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","accept","accepts","acceptedType","types","responseContentType","expectSignature","headers","String","hostname","stripPort","getDefaultResponseHeaders","Map","set","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","runtimeVersion","Updates","getRuntimeVersion","policy","CommandError","codeSigningInfo","getCodeSigningInfoAsync","options","privateKeyPath","easProjectId","extra","eas","projectId","scopeKey","getScopeKeyAsync","slug","expoUpdatesManifest","id","crypto","randomUUID","createdAt","Date","toISOString","launchAsset","key","contentType","url","assets","metadata","undefined","expoClient","expoGo","stringifiedManifest","JSON","stringify","manifestPartHeaders","certificateChainBody","signature","signManifestString","serializeDictionary","convertToDictionaryItemsRepresentation","keyid","keyId","sig","alg","certificateChainForResponse","join","form","getFormData","getBoundary","body","getBuffer","toString","version","getContentTypeForResponseContentType","Object","entries","forEach","value","FormData","append","header","length","trackManifest","logEventAsync","scopeKeyFromCodeSigningInfo","getAnonymousScopeKeyAsync","userAnonymousIdentifier","UserSettings","getAnonymousIdentifierAsync","ANONYMOUS_USERNAME","obj","map","k","v"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/ExpoGoManifestHandlerMiddleware.ts"],"sourcesContent":["import { ExpoUpdatesManifest } from '@expo/config';\nimport { Updates } from '@expo/config-plugins';\nimport accepts from 'accepts';\nimport crypto from 'crypto';\nimport FormData from 'form-data';\nimport { serializeDictionary, Dictionary } from 'structured-headers';\n\nimport { ManifestMiddleware, ManifestRequestInfo } from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME } from '../../../api/user/user';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport {\n CodeSigningInfo,\n getCodeSigningInfoAsync,\n signManifestString,\n} from '../../../utils/codesigning';\nimport { CommandError } from '../../../utils/errors';\nimport { stripPort } from '../../../utils/url';\n\nconst debug = require('debug')('expo:start:server:middleware:ExpoGoManifestHandlerMiddleware');\n\nexport enum ResponseContentType {\n TEXT_PLAIN,\n APPLICATION_JSON,\n APPLICATION_EXPO_JSON,\n MULTIPART_MIXED,\n}\n\ninterface ExpoGoManifestRequestInfo extends ManifestRequestInfo {\n responseContentType: ResponseContentType;\n expectSignature: string | null;\n}\n\nexport class ExpoGoManifestHandlerMiddleware extends ManifestMiddleware<ExpoGoManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ExpoGoManifestRequestInfo {\n let platform = parsePlatformHeader(req);\n\n if (!platform) {\n debug(\n `No \"expo-platform\" header or \"platform\" query parameter specified. Falling back to \"ios\".`\n );\n platform = 'ios';\n }\n\n assertRuntimePlatform(platform);\n\n // Expo Updates clients explicitly accept \"multipart/mixed\" responses while browsers implicitly\n // accept them with \"accept: */*\". To make it easier to debug manifest responses by visiting their\n // URLs in a browser, we denote the response as \"text/plain\" if the user agent appears not to be\n // an Expo Updates client.\n const accept = accepts(req);\n const acceptedType = accept.types([\n 'unknown/unknown',\n 'multipart/mixed',\n 'application/json',\n 'application/expo+json',\n 'text/plain',\n ]);\n\n let responseContentType;\n switch (acceptedType) {\n case 'multipart/mixed':\n responseContentType = ResponseContentType.MULTIPART_MIXED;\n break;\n case 'application/json':\n responseContentType = ResponseContentType.APPLICATION_JSON;\n break;\n case 'application/expo+json':\n responseContentType = ResponseContentType.APPLICATION_EXPO_JSON;\n break;\n default:\n responseContentType = ResponseContentType.TEXT_PLAIN;\n break;\n }\n\n const expectSignature = req.headers['expo-expect-signature'];\n\n return {\n responseContentType,\n platform,\n expectSignature: expectSignature ? String(expectSignature) : null,\n hostname: stripPort(req.headers['host']),\n };\n }\n\n private getDefaultResponseHeaders(): ServerHeaders {\n const headers = new Map<string, number | string | readonly string[]>();\n // set required headers for Expo Updates manifest specification\n headers.set('expo-protocol-version', 0);\n headers.set('expo-sfv-version', 0);\n headers.set('cache-control', 'private, max-age=0');\n return headers;\n }\n\n public async _getManifestResponseAsync(requestOptions: ExpoGoManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } =\n await this._resolveProjectSettingsAsync(requestOptions);\n\n const runtimeVersion = await Updates.getRuntimeVersionAsync(\n this.projectRoot,\n { ...exp, runtimeVersion: exp.runtimeVersion ?? { policy: 'sdkVersion' } },\n requestOptions.platform\n );\n if (!runtimeVersion) {\n throw new CommandError(\n 'MANIFEST_MIDDLEWARE',\n `Unable to determine runtime version for platform '${requestOptions.platform}'`\n );\n }\n\n const codeSigningInfo = await getCodeSigningInfoAsync(\n exp,\n requestOptions.expectSignature,\n this.options.privateKeyPath\n );\n\n const easProjectId = exp.extra?.eas?.projectId as string | undefined | null;\n const scopeKey = await ExpoGoManifestHandlerMiddleware.getScopeKeyAsync({\n slug: exp.slug,\n codeSigningInfo,\n });\n\n const expoUpdatesManifest: ExpoUpdatesManifest = {\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n runtimeVersion,\n launchAsset: {\n key: 'bundle',\n contentType: 'application/javascript',\n url: bundleUrl,\n },\n assets: [], // assets are not used in development\n metadata: {}, // required for the client to detect that this is an expo-updates manifest\n extra: {\n eas: {\n projectId: easProjectId ?? undefined,\n },\n expoClient: {\n ...exp,\n hostUri,\n },\n expoGo: expoGoConfig,\n scopeKey,\n },\n };\n\n const stringifiedManifest = JSON.stringify(expoUpdatesManifest);\n\n let manifestPartHeaders: { 'expo-signature': string } | null = null;\n let certificateChainBody: string | null = null;\n if (codeSigningInfo) {\n const signature = signManifestString(stringifiedManifest, codeSigningInfo);\n manifestPartHeaders = {\n 'expo-signature': serializeDictionary(\n convertToDictionaryItemsRepresentation({\n keyid: codeSigningInfo.keyId,\n sig: signature,\n alg: 'rsa-v1_5-sha256',\n })\n ),\n };\n certificateChainBody = codeSigningInfo.certificateChainForResponse.join('\\n');\n }\n\n const headers = this.getDefaultResponseHeaders();\n\n switch (requestOptions.responseContentType) {\n case ResponseContentType.MULTIPART_MIXED: {\n const form = this.getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n });\n headers.set('content-type', `multipart/mixed; boundary=${form.getBoundary()}`);\n return {\n body: form.getBuffer().toString(),\n version: runtimeVersion,\n headers,\n };\n }\n case ResponseContentType.APPLICATION_EXPO_JSON:\n case ResponseContentType.APPLICATION_JSON:\n case ResponseContentType.TEXT_PLAIN: {\n headers.set(\n 'content-type',\n ExpoGoManifestHandlerMiddleware.getContentTypeForResponseContentType(\n requestOptions.responseContentType\n )\n );\n if (manifestPartHeaders) {\n Object.entries(manifestPartHeaders).forEach(([key, value]) => {\n headers.set(key, value);\n });\n }\n\n return {\n body: stringifiedManifest,\n version: runtimeVersion,\n headers,\n };\n }\n }\n }\n\n private static getContentTypeForResponseContentType(\n responseContentType: ResponseContentType\n ): string {\n switch (responseContentType) {\n case ResponseContentType.MULTIPART_MIXED:\n return 'multipart/mixed';\n case ResponseContentType.APPLICATION_EXPO_JSON:\n return 'application/expo+json';\n case ResponseContentType.APPLICATION_JSON:\n return 'application/json';\n case ResponseContentType.TEXT_PLAIN:\n return 'text/plain';\n }\n }\n\n private getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n }: {\n stringifiedManifest: string;\n manifestPartHeaders: { 'expo-signature': string } | null;\n certificateChainBody: string | null;\n }): FormData {\n const form = new FormData();\n form.append('manifest', stringifiedManifest, {\n contentType: 'application/json',\n header: {\n ...manifestPartHeaders,\n },\n });\n if (certificateChainBody && certificateChainBody.length > 0) {\n form.append('certificate_chain', certificateChainBody, {\n contentType: 'application/x-pem-file',\n });\n }\n return form;\n }\n\n protected trackManifest(version?: string) {\n logEventAsync('Serve Expo Updates Manifest', {\n runtimeVersion: version,\n });\n }\n\n private static async getScopeKeyAsync({\n slug,\n codeSigningInfo,\n }: {\n slug: string;\n codeSigningInfo: CodeSigningInfo | null;\n }): Promise<string> {\n const scopeKeyFromCodeSigningInfo = codeSigningInfo?.scopeKey;\n if (scopeKeyFromCodeSigningInfo) {\n return scopeKeyFromCodeSigningInfo;\n }\n\n // Log.warn(\n // env.EXPO_OFFLINE\n // ? 'Using anonymous scope key in manifest for offline mode.'\n // : 'Using anonymous scope key in manifest.'\n // );\n return await getAnonymousScopeKeyAsync(slug);\n }\n}\n\nasync function getAnonymousScopeKeyAsync(slug: string): Promise<string> {\n const userAnonymousIdentifier = await UserSettings.getAnonymousIdentifierAsync();\n return `@${ANONYMOUS_USERNAME}/${slug}-${userAnonymousIdentifier}`;\n}\n\nfunction convertToDictionaryItemsRepresentation(obj: { [key: string]: string }): Dictionary {\n return new Map(\n Object.entries(obj).map(([k, v]) => {\n return [k, [v, new Map()]];\n })\n );\n}\n"],"names":["debug","require","ResponseContentType","TEXT_PLAIN","APPLICATION_JSON","APPLICATION_EXPO_JSON","MULTIPART_MIXED","ExpoGoManifestHandlerMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","accept","accepts","acceptedType","types","responseContentType","expectSignature","headers","String","hostname","stripPort","getDefaultResponseHeaders","Map","set","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","runtimeVersion","Updates","getRuntimeVersionAsync","projectRoot","policy","CommandError","codeSigningInfo","getCodeSigningInfoAsync","options","privateKeyPath","easProjectId","extra","eas","projectId","scopeKey","getScopeKeyAsync","slug","expoUpdatesManifest","id","crypto","randomUUID","createdAt","Date","toISOString","launchAsset","key","contentType","url","assets","metadata","undefined","expoClient","expoGo","stringifiedManifest","JSON","stringify","manifestPartHeaders","certificateChainBody","signature","signManifestString","serializeDictionary","convertToDictionaryItemsRepresentation","keyid","keyId","sig","alg","certificateChainForResponse","join","form","getFormData","getBoundary","body","getBuffer","toString","version","getContentTypeForResponseContentType","Object","entries","forEach","value","FormData","append","header","length","trackManifest","logEventAsync","scopeKeyFromCodeSigningInfo","getAnonymousScopeKeyAsync","userAnonymousIdentifier","UserSettings","getAnonymousIdentifierAsync","ANONYMOUS_USERNAME","obj","map","k","v"],"mappings":"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"}
@@ -42,11 +42,11 @@ class InterstitialPageMiddleware extends _expoMiddleware.ExpoMiddleware {
42
42
  content = content.replace(/{{\s*ProjectVersion\s*}}/, (_version = projectVersion.version) != null ? _version : "Undetected");
43
43
  return content;
44
44
  }
45
- /** Get settings for the page from the project config. */ _getProjectOptions(platform) {
45
+ /** Get settings for the page from the project config. */ async _getProjectOptionsAsync(platform) {
46
46
  (0, _resolvePlatform).assertRuntimePlatform(platform);
47
47
  const { exp } = (0, _config).getConfig(this.projectRoot);
48
48
  const { appName } = (0, _config).getNameFromConfig(exp);
49
- const runtimeVersion = (0, _updates).getRuntimeVersionNullable(exp, platform);
49
+ const runtimeVersion = await (0, _updates).getRuntimeVersionNullableAsync(this.projectRoot, exp, platform);
50
50
  var _sdkVersion;
51
51
  const sdkVersion = (_sdkVersion = exp.sdkVersion) != null ? _sdkVersion : null;
52
52
  return {
@@ -67,7 +67,7 @@ class InterstitialPageMiddleware extends _expoMiddleware.ExpoMiddleware {
67
67
  const platform = (ref = (0, _resolvePlatform).parsePlatformHeader(req)) != null ? ref : (0, _resolvePlatform).resolvePlatformFromUserAgentHeader(req);
68
68
  (0, _resolvePlatform).assertMissingRuntimePlatform(platform);
69
69
  (0, _resolvePlatform).assertRuntimePlatform(platform);
70
- const { appName , projectVersion } = this._getProjectOptions(platform);
70
+ const { appName , projectVersion } = await this._getProjectOptionsAsync(platform);
71
71
  debug(`Create loading page. (platform: ${platform}, appName: ${appName}, projectVersion: ${projectVersion.version}, type: ${projectVersion.type})`);
72
72
  const content = await this._getPageAsync({
73
73
  appName,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/InterstitialPageMiddleware.ts"],"sourcesContent":["import { getConfig, getNameFromConfig } from '@expo/config';\nimport { getRuntimeVersionNullable } from '@expo/config-plugins/build/utils/Updates';\nimport { readFile } from 'fs/promises';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { disableResponseCache, ExpoMiddleware } from './ExpoMiddleware';\nimport {\n assertMissingRuntimePlatform,\n assertRuntimePlatform,\n parsePlatformHeader,\n resolvePlatformFromUserAgentHeader,\n RuntimePlatform,\n} from './resolvePlatform';\nimport { ServerRequest, ServerResponse } from './server.types';\n\ntype ProjectVersion = {\n type: 'sdk' | 'runtime';\n version: string | null;\n};\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:interstitialPage'\n) as typeof console.log;\n\nexport const LoadingEndpoint = '/_expo/loading';\n\nexport class InterstitialPageMiddleware extends ExpoMiddleware {\n constructor(\n projectRoot: string,\n protected options: { scheme: string | null } = { scheme: null }\n ) {\n super(projectRoot, [LoadingEndpoint]);\n }\n\n /** Get the template HTML page and inject values. */\n async _getPageAsync({\n appName,\n projectVersion,\n }: {\n appName: string;\n projectVersion: ProjectVersion;\n }): Promise<string> {\n const templatePath =\n // Production: This will resolve when installed in the project.\n resolveFrom.silent(this.projectRoot, 'expo/static/loading-page/index.html') ??\n // Development: This will resolve when testing locally.\n path.resolve(__dirname, '../../../../../static/loading-page/index.html');\n let content = (await readFile(templatePath)).toString('utf-8');\n\n content = content.replace(/{{\\s*AppName\\s*}}/, appName);\n content = content.replace(/{{\\s*Path\\s*}}/, this.projectRoot);\n content = content.replace(/{{\\s*Scheme\\s*}}/, this.options.scheme ?? 'Unknown');\n content = content.replace(\n /{{\\s*ProjectVersionType\\s*}}/,\n `${projectVersion.type === 'sdk' ? 'SDK' : 'Runtime'} version`\n );\n content = content.replace(/{{\\s*ProjectVersion\\s*}}/, projectVersion.version ?? 'Undetected');\n\n return content;\n }\n\n /** Get settings for the page from the project config. */\n _getProjectOptions(platform: RuntimePlatform): {\n appName: string;\n projectVersion: ProjectVersion;\n } {\n assertRuntimePlatform(platform);\n\n const { exp } = getConfig(this.projectRoot);\n const { appName } = getNameFromConfig(exp);\n const runtimeVersion = getRuntimeVersionNullable(exp, platform);\n const sdkVersion = exp.sdkVersion ?? null;\n\n return {\n appName: appName ?? 'App',\n projectVersion:\n sdkVersion && !runtimeVersion\n ? { type: 'sdk', version: sdkVersion }\n : { type: 'runtime', version: runtimeVersion },\n };\n }\n\n async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {\n res = disableResponseCache(res);\n res.setHeader('Content-Type', 'text/html');\n\n const platform = parsePlatformHeader(req) ?? resolvePlatformFromUserAgentHeader(req);\n assertMissingRuntimePlatform(platform);\n assertRuntimePlatform(platform);\n\n const { appName, projectVersion } = this._getProjectOptions(platform);\n debug(\n `Create loading page. (platform: ${platform}, appName: ${appName}, projectVersion: ${projectVersion.version}, type: ${projectVersion.type})`\n );\n const content = await this._getPageAsync({ appName, projectVersion });\n res.end(content);\n }\n}\n"],"names":["debug","require","LoadingEndpoint","InterstitialPageMiddleware","ExpoMiddleware","constructor","projectRoot","options","scheme","_getPageAsync","appName","projectVersion","resolveFrom","templatePath","silent","path","resolve","__dirname","content","readFile","toString","replace","type","version","_getProjectOptions","platform","assertRuntimePlatform","exp","getConfig","getNameFromConfig","runtimeVersion","getRuntimeVersionNullable","sdkVersion","handleRequestAsync","req","res","disableResponseCache","setHeader","parsePlatformHeader","resolvePlatformFromUserAgentHeader","assertMissingRuntimePlatform","end"],"mappings":"AAAA;;;;;AAA6C,IAAA,OAAc,WAAd,cAAc,CAAA;AACjB,IAAA,QAA0C,WAA1C,0CAA0C,CAAA;AAC3D,IAAA,SAAa,WAAb,aAAa,CAAA;AACrB,IAAA,KAAM,kCAAN,MAAM,EAAA;AACC,IAAA,YAAc,kCAAd,cAAc,EAAA;AAEe,IAAA,eAAkB,WAAlB,kBAAkB,CAAA;AAOhE,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;;;;;;AAQ1B,MAAMA,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAC5B,+CAA+C,CAChD,AAAsB,AAAC;AAEjB,MAAMC,eAAe,GAAG,gBAAgB,AAAC;QAAnCA,eAAe,GAAfA,eAAe;AAErB,MAAMC,0BAA0B,SAASC,eAAc,eAAA;IAC5DC,YACEC,WAAmB,EACTC,OAAkC,GAAG;QAAEC,MAAM,EAAE,IAAI;KAAE,CAC/D;QACA,KAAK,CAACF,WAAW,EAAE;YAACJ,eAAe;SAAC,CAAC,CAAC;aAF5BK,OAAkC,GAAlCA,OAAkC;KAG7C;IAED,oDAAoD,CACpD,MAAME,aAAa,CAAC,EAClBC,OAAO,CAAA,EACPC,cAAc,CAAA,EAIf,EAAmB;YAEhB,+DAA+D;QAC/DC,GAA2E;QAF7E,MAAMC,YAAY,GAEhBD,CAAAA,GAA2E,GAA3EA,YAAW,QAAA,CAACE,MAAM,CAAC,IAAI,CAACR,WAAW,EAAE,qCAAqC,CAAC,YAA3EM,GAA2E,GAC3E,uDAAuD;QACvDG,KAAI,QAAA,CAACC,OAAO,CAACC,SAAS,EAAE,+CAA+C,CAAC,AAAC;QAC3E,IAAIC,OAAO,GAAG,CAAC,MAAMC,CAAAA,GAAAA,SAAQ,AAAc,CAAA,SAAd,CAACN,YAAY,CAAC,CAAC,CAACO,QAAQ,CAAC,OAAO,CAAC,AAAC;QAE/DF,OAAO,GAAGA,OAAO,CAACG,OAAO,sBAAsBX,OAAO,CAAC,CAAC;QACxDQ,OAAO,GAAGA,OAAO,CAACG,OAAO,mBAAmB,IAAI,CAACf,WAAW,CAAC,CAAC;YAChB,OAAmB;QAAjEY,OAAO,GAAGA,OAAO,CAACG,OAAO,qBAAqB,CAAA,OAAmB,GAAnB,IAAI,CAACd,OAAO,CAACC,MAAM,YAAnB,OAAmB,GAAI,SAAS,CAAC,CAAC;QAChFU,OAAO,GAAGA,OAAO,CAACG,OAAO,iCAEvB,CAAC,EAAEV,cAAc,CAACW,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAC/D,CAAC;YACoDX,QAAsB;QAA5EO,OAAO,GAAGA,OAAO,CAACG,OAAO,6BAA6BV,CAAAA,QAAsB,GAAtBA,cAAc,CAACY,OAAO,YAAtBZ,QAAsB,GAAI,YAAY,CAAC,CAAC;QAE9F,OAAOO,OAAO,CAAC;KAChB;IAED,yDAAyD,CACzDM,kBAAkB,CAACC,QAAyB,EAG1C;QACAC,CAAAA,GAAAA,gBAAqB,AAAU,CAAA,sBAAV,CAACD,QAAQ,CAAC,CAAC;QAEhC,MAAM,EAAEE,GAAG,CAAA,EAAE,GAAGC,CAAAA,GAAAA,OAAS,AAAkB,CAAA,UAAlB,CAAC,IAAI,CAACtB,WAAW,CAAC,AAAC;QAC5C,MAAM,EAAEI,OAAO,CAAA,EAAE,GAAGmB,CAAAA,GAAAA,OAAiB,AAAK,CAAA,kBAAL,CAACF,GAAG,CAAC,AAAC;QAC3C,MAAMG,cAAc,GAAGC,CAAAA,GAAAA,QAAyB,AAAe,CAAA,0BAAf,CAACJ,GAAG,EAAEF,QAAQ,CAAC,AAAC;YAC7CE,WAAc;QAAjC,MAAMK,UAAU,GAAGL,CAAAA,WAAc,GAAdA,GAAG,CAACK,UAAU,YAAdL,WAAc,GAAI,IAAI,AAAC;QAE1C,OAAO;YACLjB,OAAO,EAAEA,OAAO,WAAPA,OAAO,GAAI,KAAK;YACzBC,cAAc,EACZqB,UAAU,IAAI,CAACF,cAAc,GACzB;gBAAER,IAAI,EAAE,KAAK;gBAAEC,OAAO,EAAES,UAAU;aAAE,GACpC;gBAAEV,IAAI,EAAE,SAAS;gBAAEC,OAAO,EAAEO,cAAc;aAAE;SACnD,CAAC;KACH;IAED,MAAMG,kBAAkB,CAACC,GAAkB,EAAEC,GAAmB,EAAiB;QAC/EA,GAAG,GAAGC,CAAAA,GAAAA,eAAoB,AAAK,CAAA,qBAAL,CAACD,GAAG,CAAC,CAAC;QAChCA,GAAG,CAACE,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAE1BC,GAAwB;QAAzC,MAAMb,QAAQ,GAAGa,CAAAA,GAAwB,GAAxBA,CAAAA,GAAAA,gBAAmB,AAAK,CAAA,oBAAL,CAACJ,GAAG,CAAC,YAAxBI,GAAwB,GAAIC,CAAAA,GAAAA,gBAAkC,AAAK,CAAA,mCAAL,CAACL,GAAG,CAAC,AAAC;QACrFM,CAAAA,GAAAA,gBAA4B,AAAU,CAAA,6BAAV,CAACf,QAAQ,CAAC,CAAC;QACvCC,CAAAA,GAAAA,gBAAqB,AAAU,CAAA,sBAAV,CAACD,QAAQ,CAAC,CAAC;QAEhC,MAAM,EAAEf,OAAO,CAAA,EAAEC,cAAc,CAAA,EAAE,GAAG,IAAI,CAACa,kBAAkB,CAACC,QAAQ,CAAC,AAAC;QACtEzB,KAAK,CACH,CAAC,gCAAgC,EAAEyB,QAAQ,CAAC,WAAW,EAAEf,OAAO,CAAC,kBAAkB,EAAEC,cAAc,CAACY,OAAO,CAAC,QAAQ,EAAEZ,cAAc,CAACW,IAAI,CAAC,CAAC,CAAC,CAC7I,CAAC;QACF,MAAMJ,OAAO,GAAG,MAAM,IAAI,CAACT,aAAa,CAAC;YAAEC,OAAO;YAAEC,cAAc;SAAE,CAAC,AAAC;QACtEwB,GAAG,CAACM,GAAG,CAACvB,OAAO,CAAC,CAAC;KAClB;CACF;QAvEYf,0BAA0B,GAA1BA,0BAA0B"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/InterstitialPageMiddleware.ts"],"sourcesContent":["import { getConfig, getNameFromConfig } from '@expo/config';\nimport { getRuntimeVersionNullableAsync } from '@expo/config-plugins/build/utils/Updates';\nimport { readFile } from 'fs/promises';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { disableResponseCache, ExpoMiddleware } from './ExpoMiddleware';\nimport {\n assertMissingRuntimePlatform,\n assertRuntimePlatform,\n parsePlatformHeader,\n resolvePlatformFromUserAgentHeader,\n RuntimePlatform,\n} from './resolvePlatform';\nimport { ServerRequest, ServerResponse } from './server.types';\n\ntype ProjectVersion = {\n type: 'sdk' | 'runtime';\n version: string | null;\n};\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:interstitialPage'\n) as typeof console.log;\n\nexport const LoadingEndpoint = '/_expo/loading';\n\nexport class InterstitialPageMiddleware extends ExpoMiddleware {\n constructor(\n projectRoot: string,\n protected options: { scheme: string | null } = { scheme: null }\n ) {\n super(projectRoot, [LoadingEndpoint]);\n }\n\n /** Get the template HTML page and inject values. */\n async _getPageAsync({\n appName,\n projectVersion,\n }: {\n appName: string;\n projectVersion: ProjectVersion;\n }): Promise<string> {\n const templatePath =\n // Production: This will resolve when installed in the project.\n resolveFrom.silent(this.projectRoot, 'expo/static/loading-page/index.html') ??\n // Development: This will resolve when testing locally.\n path.resolve(__dirname, '../../../../../static/loading-page/index.html');\n let content = (await readFile(templatePath)).toString('utf-8');\n\n content = content.replace(/{{\\s*AppName\\s*}}/, appName);\n content = content.replace(/{{\\s*Path\\s*}}/, this.projectRoot);\n content = content.replace(/{{\\s*Scheme\\s*}}/, this.options.scheme ?? 'Unknown');\n content = content.replace(\n /{{\\s*ProjectVersionType\\s*}}/,\n `${projectVersion.type === 'sdk' ? 'SDK' : 'Runtime'} version`\n );\n content = content.replace(/{{\\s*ProjectVersion\\s*}}/, projectVersion.version ?? 'Undetected');\n\n return content;\n }\n\n /** Get settings for the page from the project config. */\n async _getProjectOptionsAsync(platform: RuntimePlatform): Promise<{\n appName: string;\n projectVersion: ProjectVersion;\n }> {\n assertRuntimePlatform(platform);\n\n const { exp } = getConfig(this.projectRoot);\n const { appName } = getNameFromConfig(exp);\n const runtimeVersion = await getRuntimeVersionNullableAsync(this.projectRoot, exp, platform);\n const sdkVersion = exp.sdkVersion ?? null;\n\n return {\n appName: appName ?? 'App',\n projectVersion:\n sdkVersion && !runtimeVersion\n ? { type: 'sdk', version: sdkVersion }\n : { type: 'runtime', version: runtimeVersion },\n };\n }\n\n async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {\n res = disableResponseCache(res);\n res.setHeader('Content-Type', 'text/html');\n\n const platform = parsePlatformHeader(req) ?? resolvePlatformFromUserAgentHeader(req);\n assertMissingRuntimePlatform(platform);\n assertRuntimePlatform(platform);\n\n const { appName, projectVersion } = await this._getProjectOptionsAsync(platform);\n debug(\n `Create loading page. (platform: ${platform}, appName: ${appName}, projectVersion: ${projectVersion.version}, type: ${projectVersion.type})`\n );\n const content = await this._getPageAsync({ appName, projectVersion });\n res.end(content);\n }\n}\n"],"names":["debug","require","LoadingEndpoint","InterstitialPageMiddleware","ExpoMiddleware","constructor","projectRoot","options","scheme","_getPageAsync","appName","projectVersion","resolveFrom","templatePath","silent","path","resolve","__dirname","content","readFile","toString","replace","type","version","_getProjectOptionsAsync","platform","assertRuntimePlatform","exp","getConfig","getNameFromConfig","runtimeVersion","getRuntimeVersionNullableAsync","sdkVersion","handleRequestAsync","req","res","disableResponseCache","setHeader","parsePlatformHeader","resolvePlatformFromUserAgentHeader","assertMissingRuntimePlatform","end"],"mappings":"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"}