@expo/cli 0.18.19 → 0.18.21

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 (49) hide show
  1. package/build/bin/cli +1 -1
  2. package/build/src/export/createMetadataJson.js.map +1 -1
  3. package/build/src/export/embed/exportEmbedAsync.js +110 -41
  4. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  5. package/build/src/export/embed/resolveOptions.js +0 -1
  6. package/build/src/export/embed/resolveOptions.js.map +1 -1
  7. package/build/src/export/exportApp.js +133 -92
  8. package/build/src/export/exportApp.js.map +1 -1
  9. package/build/src/export/exportAssets.js.map +1 -1
  10. package/build/src/export/exportHermes.js +15 -0
  11. package/build/src/export/exportHermes.js.map +1 -1
  12. package/build/src/export/exportStaticAsync.js +5 -49
  13. package/build/src/export/exportStaticAsync.js.map +1 -1
  14. package/build/src/export/favicon.js +5 -4
  15. package/build/src/export/favicon.js.map +1 -1
  16. package/build/src/export/saveAssets.js.map +1 -1
  17. package/build/src/run/startBundler.js +1 -8
  18. package/build/src/run/startBundler.js.map +1 -1
  19. package/build/src/start/server/BundlerDevServer.js +10 -3
  20. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  21. package/build/src/start/server/DevServerManager.js +19 -4
  22. package/build/src/start/server/DevServerManager.js.map +1 -1
  23. package/build/src/start/server/DevelopmentSession.js +21 -11
  24. package/build/src/start/server/DevelopmentSession.js.map +1 -1
  25. package/build/src/start/server/getStaticRenderFunctions.js +9 -123
  26. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
  27. package/build/src/start/server/metro/MetroBundlerDevServer.js +469 -177
  28. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  29. package/build/src/start/server/metro/createServerRouteMiddleware.js +0 -9
  30. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  31. package/build/src/start/server/metro/instantiateMetro.js +44 -37
  32. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  33. package/build/src/start/server/metro/metroErrorInterface.js +49 -2
  34. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
  35. package/build/src/start/server/metro/metroPrivateServer.js +26 -0
  36. package/build/src/start/server/metro/metroPrivateServer.js.map +1 -0
  37. package/build/src/start/server/metro/runServer-fork.js +44 -21
  38. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  39. package/build/src/start/server/metro/withMetroMultiPlatform.js +9 -1
  40. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  41. package/build/src/start/server/middleware/ManifestMiddleware.js +7 -4
  42. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  43. package/build/src/start/server/middleware/metroOptions.js +16 -4
  44. package/build/src/start/server/middleware/metroOptions.js.map +1 -1
  45. package/build/src/start/server/middleware/resolveAssets.js.map +1 -1
  46. package/build/src/utils/telemetry/getContext.js +1 -1
  47. package/package.json +3 -3
  48. package/build/src/export/fork-bundleAsync.js +0 -284
  49. package/build/src/export/fork-bundleAsync.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport { getDefaultConfig, 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 Bundler from 'metro/src/Bundler';\nimport { loadConfig, resolveConfig, ConfigT } from 'metro-config';\nimport { Terminal } from 'metro-core';\nimport util from 'node:util';\nimport semver from 'semver';\nimport { URL } from 'url';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { attachAtlasAsync } from './debugging/attachAtlas';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\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 { env } from '../../../utils/env';\nimport { logEventAsync } from '../../../utils/telemetry';\nimport { createCorsMiddleware } from '../middleware/CorsMiddleware';\nimport { getMetroServerRoot } from '../middleware/ManifestMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware, replaceMiddlewareWith } from '../middleware/mutations';\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\n// Wrap terminal and polyfill console.log so we can log during bundling without breaking the indicator.\nclass LogRespectingTerminal extends Terminal {\n constructor(stream: import('node:net').Socket | import('node:stream').Writable) {\n super(stream);\n\n const sendLog = (...args: any[]) => {\n // @ts-expect-error\n this._logLines.push(\n // format args like console.log\n util.format(...args)\n );\n // @ts-expect-error\n this._scheduleUpdate();\n\n // Flush the logs to the terminal immediately so logs at the end of the process are not lost.\n this.flush();\n };\n\n console.log = sendLog;\n console.info = sendLog;\n }\n}\n\n// Share one instance of Terminal for all instances of Metro.\nconst terminal = new LogRespectingTerminal(process.stdout);\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp = getConfig(projectRoot, { skipSDKVersionRequirement: true }).exp,\n isExporting,\n getMetroBundler,\n }: { exp?: ExpoConfig; isExporting: boolean; getMetroBundler: () => Bundler }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n const serverRoot = getMetroServerRoot(projectRoot);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const hasConfig = await resolveConfig(options.config, projectRoot);\n let config: ConfigT = {\n ...(await loadConfig(\n { cwd: projectRoot, projectRoot, ...options },\n // If the project does not have a metro.config.js, then we use the default config.\n hasConfig.isEmpty ? getDefaultConfig(projectRoot) : undefined\n )),\n reporter: {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\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?.baseUrl ?? '') + '/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?.baseUrl) {\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?.baseUrl;\n }\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n exp,\n platformBundlers,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n webOutput: exp.web?.output ?? 'single',\n isFastResolverEnabled: env.EXPO_USE_FAST_RESOLVER,\n isExporting,\n isReactCanaryEnabled: exp.experiments?.reactCanary ?? false,\n getMetroBundler,\n });\n\n if (process.env.NODE_ENV !== 'test') {\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, config));\n }\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: 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 });\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n {\n exp,\n isExporting,\n getMetroBundler() {\n return metro.getBundler().getBundler();\n },\n }\n );\n\n const { createDevServerMiddleware, securityHeadersMiddleware } =\n require('@react-native-community/cli-server-api') as typeof import('@react-native-community/cli-server-api');\n\n const { middleware, messageSocketEndpoint, eventsSocketEndpoint, websocketEndpoints } =\n createDevServerMiddleware({\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n // The `securityHeadersMiddleware` does not support cross-origin requests, we replace with the enhanced version.\n replaceMiddlewareWith(\n middleware as ConnectServer,\n securityHeadersMiddleware,\n createCorsMiddleware(exp)\n );\n\n prependMiddleware(middleware, suppressRemoteDebuggingErrorMiddleware);\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 // Initialize all React Native debug features\n const { debugMiddleware, debugWebsocketEndpoints } = createDebugMiddleware(metroBundler);\n prependMiddleware(middleware, debugMiddleware);\n middleware.use('/_expo/debugger', createJsInspectorMiddleware());\n\n // Attach Expo Atlas if enabled\n const atlas = await attachAtlasAsync({ isExporting, exp, projectRoot, middleware, metroConfig });\n\n const { server, metro } = await runServer(metroBundler, metroConfig, {\n // @ts-expect-error: Inconsistent `websocketEndpoints` type between metro and @react-native-community/cli-server-api\n websocketEndpoints: {\n ...websocketEndpoints,\n ...debugWebsocketEndpoints,\n },\n watch: !isExporting && isWatchEnabled(),\n });\n\n // If Atlas is enabled, and can register to Metro, attach it to listen for changes\n atlas?.registerMetro(metro);\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","LogRespectingTerminal","Terminal","constructor","stream","sendLog","args","_logLines","push","util","format","_scheduleUpdate","flush","console","log","info","terminal","process","stdout","projectRoot","options","getConfig","skipSDKVersionRequirement","isExporting","getMetroBundler","reportEvent","serverRoot","getMetroServerRoot","terminalReporter","MetroTerminalReporter","hasConfig","resolveConfig","config","loadConfig","cwd","isEmpty","getDefaultConfig","undefined","reporter","update","event","transformer","publicPath","experiments","baseUrl","platformBundlers","getPlatformBundlers","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","webOutput","web","output","isFastResolverEnabled","env","EXPO_USE_FAST_RESOLVER","isReactCanaryEnabled","reactCanary","NODE_ENV","logEventAsync","getMetroProperties","setEventReporter","logger","metroBundler","metroConfig","metro","getBundler","createDevServerMiddleware","securityHeadersMiddleware","require","middleware","messageSocketEndpoint","eventsSocketEndpoint","websocketEndpoints","port","server","watchFolders","replaceMiddlewareWith","createCorsMiddleware","prependMiddleware","suppressRemoteDebuggingErrorMiddleware","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","createDebuggerTelemetryMiddleware","debugMiddleware","debugWebsocketEndpoints","createDebugMiddleware","createJsInspectorMiddleware","atlas","attachAtlasAsync","runServer","watch","registerMetro","req","res","next","url","URL","pathname","match","searchParams","get","processRequest","messageSocket","CI","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 { getDefaultConfig, 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 Bundler from 'metro/src/Bundler';\nimport { loadConfig, resolveConfig, ConfigT } from 'metro-config';\nimport { Terminal } from 'metro-core';\nimport util from 'node:util';\nimport semver from 'semver';\nimport { URL } from 'url';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { attachAtlasAsync } from './debugging/attachAtlas';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\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 { env } from '../../../utils/env';\nimport { logEventAsync } from '../../../utils/telemetry';\nimport { createCorsMiddleware } from '../middleware/CorsMiddleware';\nimport { getMetroServerRoot } from '../middleware/ManifestMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware, replaceMiddlewareWith } from '../middleware/mutations';\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\n// Wrap terminal and polyfill console.log so we can log during bundling without breaking the indicator.\nclass LogRespectingTerminal extends Terminal {\n constructor(stream: import('node:net').Socket | import('node:stream').Writable) {\n super(stream);\n\n const sendLog = (...args: any[]) => {\n // @ts-expect-error\n this._logLines.push(\n // format args like console.log\n util.format(...args)\n );\n // @ts-expect-error\n this._scheduleUpdate();\n\n // Flush the logs to the terminal immediately so logs at the end of the process are not lost.\n this.flush();\n };\n\n console.log = sendLog;\n console.info = sendLog;\n }\n}\n\n// Share one instance of Terminal for all instances of Metro.\nconst terminal = new LogRespectingTerminal(process.stdout);\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp,\n isExporting,\n getMetroBundler,\n }: { exp: ExpoConfig; isExporting: boolean; getMetroBundler: () => Bundler }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n const serverRoot = getMetroServerRoot(projectRoot);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const hasConfig = await resolveConfig(options.config, projectRoot);\n let config: ConfigT = {\n ...(await loadConfig(\n { cwd: projectRoot, projectRoot, ...options },\n // If the project does not have a metro.config.js, then we use the default config.\n hasConfig.isEmpty ? getDefaultConfig(projectRoot) : undefined\n )),\n reporter: {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\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?.baseUrl ?? '') + '/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?.baseUrl) {\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?.baseUrl;\n }\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n\n if (exp.experiments?.reactCompiler) {\n Log.warn(`Experimental React Compiler is enabled.`);\n }\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n exp,\n platformBundlers,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n webOutput: exp.web?.output ?? 'single',\n isFastResolverEnabled: env.EXPO_USE_FAST_RESOLVER,\n isExporting,\n isReactCanaryEnabled: exp.experiments?.reactCanary ?? false,\n getMetroBundler,\n });\n\n if (process.env.NODE_ENV !== 'test') {\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, config));\n }\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: Omit<LoadOptions, 'logger'>,\n {\n isExporting,\n exp = getConfig(metroBundler.projectRoot, {\n skipSDKVersionRequirement: true,\n }).exp,\n }: { isExporting: boolean; exp?: ExpoConfig }\n): Promise<{\n metro: Metro.Server;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n {\n exp,\n isExporting,\n getMetroBundler() {\n return metro.getBundler().getBundler();\n },\n }\n );\n\n const { createDevServerMiddleware, securityHeadersMiddleware } =\n require('@react-native-community/cli-server-api') as typeof import('@react-native-community/cli-server-api');\n\n const { middleware, messageSocketEndpoint, eventsSocketEndpoint, websocketEndpoints } =\n createDevServerMiddleware({\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n let debugWebsocketEndpoints: {\n [path: string]: import('ws').WebSocketServer;\n } = {};\n\n if (!isExporting) {\n // The `securityHeadersMiddleware` does not support cross-origin requests, we replace with the enhanced version.\n replaceMiddlewareWith(\n middleware as ConnectServer,\n securityHeadersMiddleware,\n createCorsMiddleware(exp)\n );\n\n prependMiddleware(middleware, suppressRemoteDebuggingErrorMiddleware);\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 // Initialize all React Native debug features\n const { debugMiddleware, ...options } = createDebugMiddleware(metroBundler);\n debugWebsocketEndpoints = options.debugWebsocketEndpoints;\n prependMiddleware(middleware, debugMiddleware);\n middleware.use('/_expo/debugger', createJsInspectorMiddleware());\n }\n\n // Attach Expo Atlas if enabled\n const atlas = await attachAtlasAsync({\n isExporting,\n exp,\n projectRoot,\n middleware,\n metroConfig,\n // NOTE(cedric): reset the Atlas file once, and reuse it for static exports\n resetAtlasFile: isExporting,\n });\n\n const { server, metro } = await runServer(\n metroBundler,\n metroConfig,\n {\n // @ts-expect-error: Inconsistent `websocketEndpoints` type between metro and @react-native-community/cli-server-api\n websocketEndpoints: {\n ...websocketEndpoints,\n ...debugWebsocketEndpoints,\n },\n watch: !isExporting && isWatchEnabled(),\n },\n {\n mockServer: isExporting,\n }\n );\n\n // If Atlas is enabled, and can register to Metro, attach it to listen for changes\n atlas?.registerMetro(metro);\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","LogRespectingTerminal","Terminal","constructor","stream","sendLog","args","_logLines","push","util","format","_scheduleUpdate","flush","console","log","info","terminal","process","stdout","projectRoot","options","isExporting","getMetroBundler","reportEvent","serverRoot","getMetroServerRoot","terminalReporter","MetroTerminalReporter","hasConfig","resolveConfig","config","loadConfig","cwd","isEmpty","getDefaultConfig","undefined","reporter","update","event","transformer","publicPath","experiments","baseUrl","platformBundlers","getPlatformBundlers","reactCompiler","Log","warn","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","webOutput","web","output","isFastResolverEnabled","env","EXPO_USE_FAST_RESOLVER","isReactCanaryEnabled","reactCanary","NODE_ENV","logEventAsync","getMetroProperties","setEventReporter","logger","metroBundler","getConfig","skipSDKVersionRequirement","metroConfig","metro","getBundler","createDevServerMiddleware","securityHeadersMiddleware","require","middleware","messageSocketEndpoint","eventsSocketEndpoint","websocketEndpoints","port","server","watchFolders","debugWebsocketEndpoints","replaceMiddlewareWith","createCorsMiddleware","prependMiddleware","suppressRemoteDebuggingErrorMiddleware","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","createDebuggerTelemetryMiddleware","debugMiddleware","createDebugMiddleware","createJsInspectorMiddleware","atlas","attachAtlasAsync","resetAtlasFile","runServer","watch","mockServer","registerMetro","req","res","next","url","URL","pathname","match","searchParams","get","processRequest","messageSocket","CI","chalk"],"mappings":"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"}
@@ -26,6 +26,13 @@ function _chalk() {
26
26
  };
27
27
  return data;
28
28
  }
29
+ function _path() {
30
+ const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
31
+ _path = function() {
32
+ return data;
33
+ };
34
+ return data;
35
+ }
29
36
  function _resolveFrom() {
30
37
  const data = /*#__PURE__*/ _interopRequireDefault(require("resolve-from"));
31
38
  _resolveFrom = function() {
@@ -41,6 +48,7 @@ function _terminalLink() {
41
48
  return data;
42
49
  }
43
50
  const _log = require("../../../log");
51
+ const _ansi = require("../../../utils/ansi");
44
52
  const _errors = require("../../../utils/errors");
45
53
  const _getStaticRenderFunctions = require("../getStaticRenderFunctions");
46
54
  function _interopRequireDefault(obj) {
@@ -68,6 +76,9 @@ async function logMetroErrorWithStack(projectRoot, { stack , codeFrame , error
68
76
  _log.Log.log();
69
77
  _log.Log.log(_chalk().default.red("Metro error: ") + error.message);
70
78
  _log.Log.log();
79
+ if (error instanceof _errors.CommandError) {
80
+ return;
81
+ }
71
82
  if (codeFrame) {
72
83
  var ref;
73
84
  const maxWarningLineLength = Math.max(200, process.stdout.columns);
@@ -167,9 +178,40 @@ async function logMetroError(projectRoot, { error }) {
167
178
  error
168
179
  });
169
180
  }
181
+ function isTransformError(error) {
182
+ return error.type === "TransformError";
183
+ }
170
184
  /** @returns the html required to render the static metro error as an SPA. */ function logFromError({ error , projectRoot }) {
171
185
  const { LogBoxLog , parseErrorStack } = require((0, _resolveFrom().default)(projectRoot, "@expo/metro-runtime/symbolicate"));
172
- const stack = parseErrorStack(error.stack);
186
+ // Remap direct Metro Node.js errors to a format that will appear more client-friendly in the logbox UI.
187
+ let stack;
188
+ if (isTransformError(error)) {
189
+ // Syntax errors in static rendering.
190
+ stack = [
191
+ {
192
+ file: _path().default.join(projectRoot, error.filename),
193
+ methodName: "<unknown>",
194
+ arguments: [],
195
+ // TODO: Import stack
196
+ lineNumber: error.lineNumber,
197
+ column: error.column
198
+ },
199
+ ];
200
+ } else if ("originModulePath" in error) {
201
+ // TODO: Use import stack here when the error is resolution based.
202
+ stack = [
203
+ {
204
+ file: error.originModulePath,
205
+ methodName: "<unknown>",
206
+ arguments: [],
207
+ // TODO: Import stack
208
+ lineNumber: 0,
209
+ column: 0
210
+ },
211
+ ];
212
+ } else {
213
+ stack = parseErrorStack(error.stack);
214
+ }
173
215
  return new LogBoxLog({
174
216
  level: "static",
175
217
  message: {
@@ -209,6 +251,10 @@ async function getErrorOverlayHtmlAsync({ error , projectRoot , routerRoot }) {
209
251
  codeFrame: log.codeFrame,
210
252
  error
211
253
  });
254
+ // @ts-expect-error
255
+ if ("message" in log && "content" in log.message && typeof log.message.content === "string") {
256
+ log.message.content = (0, _ansi.stripAnsi)(log.message.content);
257
+ }
212
258
  const logBoxContext = {
213
259
  selectedLogIndex: 0,
214
260
  isDisabled: false,
@@ -224,7 +270,8 @@ async function getErrorOverlayHtmlAsync({ error , projectRoot , routerRoot }) {
224
270
  minify: false,
225
271
  baseUrl: "",
226
272
  routerRoot,
227
- isExporting: false
273
+ isExporting: false,
274
+ reactCompiler: false
228
275
  });
229
276
  const htmlWithJs = html.replace("</body>", `<script src=${errorOverlayEntry}></script></body>`);
230
277
  return htmlWithJs;
@@ -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 { SilentError } from '../../../utils/errors';\nimport { createMetroEndpointAsync } from '../getStaticRenderFunctions';\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\nfunction fill(width: number): string {\n return Array(width).join(' ');\n}\n\nfunction formatPaths(config: { filePath: string | null; line?: number; col?: number }) {\n const filePath = chalk.reset(config.filePath);\n return (\n chalk.dim('(') +\n filePath +\n chalk.dim(`:${[config.line, config.col].filter(Boolean).join(':')})`)\n );\n}\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 if (error instanceof SilentError) {\n return;\n }\n\n // process.stdout.write('\\u001b[0m'); // Reset attributes\n // process.stdout.write('\\u001bc'); // Reset the terminal\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 const maxWarningLineLength = Math.max(200, process.stdout.columns);\n\n const lineText = codeFrame.content;\n const isPreviewTooLong = codeFrame.content\n .split('\\n')\n .some((line) => line.length > maxWarningLineLength);\n const column = codeFrame.location?.column;\n // When the preview is too long, we skip reading the file and attempting to apply\n // code coloring, this is because it can get very slow.\n if (isPreviewTooLong) {\n let previewLine = '';\n let cursorLine = '';\n\n const formattedPath = formatPaths({\n filePath: codeFrame.fileName,\n line: codeFrame.location?.row,\n col: codeFrame.location?.column,\n });\n // Create a curtailed preview line like:\n // `...transition:'fade'},k._updatePropsStack=function(){clearImmediate(k._updateImmediate),k._updateImmediate...`\n // If there is no text preview or column number, we can't do anything.\n if (lineText && column != null) {\n const rangeWindow = Math.round(\n Math.max(codeFrame.fileName?.length ?? 0, Math.max(80, process.stdout.columns)) / 2\n );\n let minBounds = Math.max(0, column - rangeWindow);\n const maxBounds = Math.min(minBounds + rangeWindow * 2, lineText.length);\n previewLine = lineText.slice(minBounds, maxBounds);\n\n // If we splice content off the start, then we should append `...`.\n // This is unlikely to happen since we limit the activation size.\n if (minBounds > 0) {\n // Adjust the min bounds so the cursor is aligned after we add the \"...\"\n minBounds -= 3;\n previewLine = chalk.dim('...') + previewLine;\n }\n if (maxBounds < lineText.length) {\n previewLine += chalk.dim('...');\n }\n\n // If the column property could be found, then use that to fix the cursor location which is often broken in regex.\n cursorLine = (column == null ? '' : fill(column) + chalk.reset('^')).slice(minBounds);\n\n Log.log(\n [formattedPath, '', previewLine, cursorLine, chalk.dim('(error truncated)')].join('\\n')\n );\n }\n } else {\n Log.log(codeFrame.content);\n }\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 if (error instanceof SilentError) {\n return;\n }\n\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. */\nfunction 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 routerRoot,\n}: {\n error: Error;\n projectRoot: string;\n routerRoot: 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 mode: 'development',\n platform: 'web',\n minify: false,\n baseUrl: '',\n routerRoot,\n isExporting: false,\n }\n );\n\n const htmlWithJs = html.replace('</body>', `<script src=${errorOverlayEntry}></script></body>`);\n return htmlWithJs;\n}\n"],"names":["logMetroErrorWithStack","logMetroError","logMetroErrorAsync","getErrorOverlayHtmlAsync","fill","width","Array","join","formatPaths","config","filePath","chalk","reset","dim","line","col","filter","Boolean","projectRoot","stack","codeFrame","error","SilentError","getStackFormattedLocation","require","resolveFrom","Log","log","red","message","maxWarningLineLength","Math","max","process","stdout","columns","lineText","content","isPreviewTooLong","split","some","length","column","location","previewLine","cursorLine","formattedPath","fileName","row","rangeWindow","round","minBounds","maxBounds","min","slice","bold","stackProps","map","frame","title","methodName","subtitle","collapse","forEach","position","terminalLink","isSupported","lineItem","gray","LogBoxLog","parseErrorStack","level","substitutions","isComponentError","category","componentStack","Promise","res","symbolicate","symbolicated","logFromError","routerRoot","logBoxContext","selectedLogIndex","isDisabled","logs","html","JSON","stringify","errorOverlayEntry","createMetroEndpointAsync","mode","platform","minify","baseUrl","isExporting","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 path from 'path';\nimport resolveFrom from 'resolve-from';\nimport { StackFrame } from 'stacktrace-parser';\nimport terminalLink from 'terminal-link';\n\nimport { Log } from '../../../log';\nimport { stripAnsi } from '../../../utils/ansi';\nimport { CommandError, SilentError } from '../../../utils/errors';\nimport { createMetroEndpointAsync } from '../getStaticRenderFunctions';\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\nfunction fill(width: number): string {\n return Array(width).join(' ');\n}\n\nfunction formatPaths(config: { filePath: string | null; line?: number; col?: number }) {\n const filePath = chalk.reset(config.filePath);\n return (\n chalk.dim('(') +\n filePath +\n chalk.dim(`:${[config.line, config.col].filter(Boolean).join(':')})`)\n );\n}\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 if (error instanceof SilentError) {\n return;\n }\n\n // process.stdout.write('\\u001b[0m'); // Reset attributes\n // process.stdout.write('\\u001bc'); // Reset the terminal\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 (error instanceof CommandError) {\n return;\n }\n\n if (codeFrame) {\n const maxWarningLineLength = Math.max(200, process.stdout.columns);\n\n const lineText = codeFrame.content;\n const isPreviewTooLong = codeFrame.content\n .split('\\n')\n .some((line) => line.length > maxWarningLineLength);\n const column = codeFrame.location?.column;\n // When the preview is too long, we skip reading the file and attempting to apply\n // code coloring, this is because it can get very slow.\n if (isPreviewTooLong) {\n let previewLine = '';\n let cursorLine = '';\n\n const formattedPath = formatPaths({\n filePath: codeFrame.fileName,\n line: codeFrame.location?.row,\n col: codeFrame.location?.column,\n });\n // Create a curtailed preview line like:\n // `...transition:'fade'},k._updatePropsStack=function(){clearImmediate(k._updateImmediate),k._updateImmediate...`\n // If there is no text preview or column number, we can't do anything.\n if (lineText && column != null) {\n const rangeWindow = Math.round(\n Math.max(codeFrame.fileName?.length ?? 0, Math.max(80, process.stdout.columns)) / 2\n );\n let minBounds = Math.max(0, column - rangeWindow);\n const maxBounds = Math.min(minBounds + rangeWindow * 2, lineText.length);\n previewLine = lineText.slice(minBounds, maxBounds);\n\n // If we splice content off the start, then we should append `...`.\n // This is unlikely to happen since we limit the activation size.\n if (minBounds > 0) {\n // Adjust the min bounds so the cursor is aligned after we add the \"...\"\n minBounds -= 3;\n previewLine = chalk.dim('...') + previewLine;\n }\n if (maxBounds < lineText.length) {\n previewLine += chalk.dim('...');\n }\n\n // If the column property could be found, then use that to fix the cursor location which is often broken in regex.\n cursorLine = (column == null ? '' : fill(column) + chalk.reset('^')).slice(minBounds);\n\n Log.log(\n [formattedPath, '', previewLine, cursorLine, chalk.dim('(error truncated)')].join('\\n')\n );\n }\n } else {\n Log.log(codeFrame.content);\n }\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 if (error instanceof SilentError) {\n return;\n }\n\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\nfunction isTransformError(\n error: any\n): error is { type: 'TransformError'; filename: string; lineNumber: number; column: number } {\n return error.type === 'TransformError';\n}\n\n/** @returns the html required to render the static metro error as an SPA. */\nfunction 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 // Remap direct Metro Node.js errors to a format that will appear more client-friendly in the logbox UI.\n let stack;\n if (isTransformError(error)) {\n // Syntax errors in static rendering.\n stack = [\n {\n file: path.join(projectRoot, error.filename),\n methodName: '<unknown>',\n arguments: [],\n // TODO: Import stack\n lineNumber: error.lineNumber,\n column: error.column,\n },\n ];\n } else if ('originModulePath' in error) {\n // TODO: Use import stack here when the error is resolution based.\n stack = [\n {\n file: error.originModulePath,\n methodName: '<unknown>',\n arguments: [],\n // TODO: Import stack\n lineNumber: 0,\n column: 0,\n },\n ];\n } else {\n stack = parseErrorStack(error.stack);\n }\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 routerRoot,\n}: {\n error: Error;\n projectRoot: string;\n routerRoot: 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 // @ts-expect-error\n if ('message' in log && 'content' in log.message && typeof log.message.content === 'string') {\n log.message.content = stripAnsi(log.message.content);\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 mode: 'development',\n platform: 'web',\n minify: false,\n baseUrl: '',\n routerRoot,\n isExporting: false,\n reactCompiler: false,\n }\n );\n\n const htmlWithJs = html.replace('</body>', `<script src=${errorOverlayEntry}></script></body>`);\n return htmlWithJs;\n}\n"],"names":["logMetroErrorWithStack","logMetroError","logMetroErrorAsync","getErrorOverlayHtmlAsync","fill","width","Array","join","formatPaths","config","filePath","chalk","reset","dim","line","col","filter","Boolean","projectRoot","stack","codeFrame","error","SilentError","getStackFormattedLocation","require","resolveFrom","Log","log","red","message","CommandError","maxWarningLineLength","Math","max","process","stdout","columns","lineText","content","isPreviewTooLong","split","some","length","column","location","previewLine","cursorLine","formattedPath","fileName","row","rangeWindow","round","minBounds","maxBounds","min","slice","bold","stackProps","map","frame","title","methodName","subtitle","collapse","forEach","position","terminalLink","isSupported","lineItem","gray","LogBoxLog","parseErrorStack","level","substitutions","isComponentError","category","componentStack","Promise","res","symbolicate","symbolicated","isTransformError","type","logFromError","file","path","filename","arguments","lineNumber","originModulePath","routerRoot","stripAnsi","logBoxContext","selectedLogIndex","isDisabled","logs","html","JSON","stringify","errorOverlayEntry","createMetroEndpointAsync","mode","platform","minify","baseUrl","isExporting","reactCompiler","htmlWithJs","replace"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "assertMetroPrivateServer", {
6
+ enumerable: true,
7
+ get: ()=>assertMetroPrivateServer
8
+ });
9
+ function _nodeAssert() {
10
+ const data = /*#__PURE__*/ _interopRequireDefault(require("node:assert"));
11
+ _nodeAssert = function() {
12
+ return data;
13
+ };
14
+ return data;
15
+ }
16
+ function _interopRequireDefault(obj) {
17
+ return obj && obj.__esModule ? obj : {
18
+ default: obj
19
+ };
20
+ }
21
+ function assertMetroPrivateServer(metro) {
22
+ (0, _nodeAssert().default)(metro, "Metro server undefined.");
23
+ (0, _nodeAssert().default)("_config" in metro && "_bundler" in metro, "Metro server is missing expected properties (_config, _bundler). This could be due to a version mismatch or change in the Metro API.");
24
+ }
25
+
26
+ //# sourceMappingURL=metroPrivateServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/metroPrivateServer.ts"],"sourcesContent":["import { TransformInputOptions } from 'metro';\nimport type Metro from 'metro';\nimport { ConfigT } from 'metro-config';\nimport assert from 'node:assert';\n\nexport type MetroPrivateServer = import('metro').Server & {\n _bundler: import('metro/src/IncrementalBundler').default;\n _config: ConfigT;\n _createModuleId: (path: string) => number;\n _isEnded: boolean;\n _nextBundleBuildNumber: number;\n _platforms: Set<string>;\n _reporter: import('metro/src/lib/reporting').Reporter;\n _serverOptions: import('metro').ServerOptions | void;\n\n getNewBuildNumber(): number;\n _getSortedModules(\n graph: import('metro/src/IncrementalBundler').OutputGraph\n ): import('metro/src/DeltaBundler/types').Module[];\n\n _resolveRelativePath(\n filePath: string,\n {\n relativeTo,\n resolverOptions,\n transformOptions,\n }: {\n relativeTo: 'project' | 'server';\n resolverOptions: import('metro/src/shared/types').ResolverInputOptions;\n transformOptions: TransformInputOptions;\n }\n ): Promise<string>;\n\n _shouldAddModuleToIgnoreList(module: import('metro/src/DeltaBundler/types').Module<any>): boolean;\n};\n\nexport function assertMetroPrivateServer(metro: Metro.Server): asserts metro is MetroPrivateServer {\n assert(metro, 'Metro server undefined.');\n assert(\n '_config' in metro && '_bundler' in metro,\n 'Metro server is missing expected properties (_config, _bundler). This could be due to a version mismatch or change in the Metro API.'\n );\n}\n"],"names":["assertMetroPrivateServer","metro","assert"],"mappings":"AAAA;;;;+BAoCgBA,0BAAwB;;aAAxBA,wBAAwB;;;8DAjCrB,aAAa;;;;;;;;;;;AAiCzB,SAASA,wBAAwB,CAACC,KAAmB,EAAuC;IACjGC,IAAAA,WAAM,EAAA,QAAA,EAACD,KAAK,EAAE,yBAAyB,CAAC,CAAC;IACzCC,IAAAA,WAAM,EAAA,QAAA,EACJ,SAAS,IAAID,KAAK,IAAI,UAAU,IAAIA,KAAK,EACzC,sIAAsI,CACvI,CAAC;AACJ,CAAC"}
@@ -67,7 +67,7 @@ function _interopRequireDefault(obj) {
67
67
  default: obj
68
68
  };
69
69
  }
70
- const runServer = async (metroBundler, config, { hasReducedPerformance =false , host , onError , onReady , secureServerOptions , waitForBundler =false , websocketEndpoints ={} , watch })=>{
70
+ const runServer = async (metroBundler, config, { hasReducedPerformance =false , host , onError , onReady , secureServerOptions , waitForBundler =false , websocketEndpoints ={} , watch }, { mockServer })=>{
71
71
  // await earlyPortCheck(host, config.server.port);
72
72
  // if (secure != null || secureCert != null || secureKey != null) {
73
73
  // // eslint-disable-next-line no-console
@@ -83,7 +83,9 @@ const runServer = async (metroBundler, config, { hasReducedPerformance =false ,
83
83
  waitForBundler,
84
84
  watch
85
85
  });
86
- (0, _assert().default)(typeof middleware.use === "function");
86
+ if (!mockServer) {
87
+ (0, _assert().default)(typeof middleware.use === "function");
88
+ }
87
89
  const serverApp = middleware;
88
90
  let httpServer;
89
91
  if (secureServerOptions != null) {
@@ -91,21 +93,49 @@ const runServer = async (metroBundler, config, { hasReducedPerformance =false ,
91
93
  } else {
92
94
  httpServer = _http().default.createServer(serverApp);
93
95
  }
96
+ httpServer.on("error", (error)=>{
97
+ if ("code" in error && error.code === "EADDRINUSE") {
98
+ // If `Error: listen EADDRINUSE: address already in use :::8081` then print additional info
99
+ // about the process before throwing.
100
+ const info = (0, _getRunningProcess.getRunningProcess)(config.server.port);
101
+ if (info) {
102
+ _log.Log.error(`Port ${config.server.port} is busy running ${info.command} in: ${info.directory}`);
103
+ }
104
+ }
105
+ if (onError) {
106
+ onError(error);
107
+ }
108
+ end();
109
+ });
110
+ // Disable any kind of automatic timeout behavior for incoming
111
+ // requests in case it takes the packager more than the default
112
+ // timeout of 120 seconds to respond to a request.
113
+ httpServer.timeout = 0;
114
+ httpServer.on("close", ()=>{
115
+ end();
116
+ });
117
+ // Extend the close method to ensure all websocket servers are closed, and connections are terminated
118
+ const originalClose = httpServer.close.bind(httpServer);
119
+ httpServer.close = function closeHttpServer(callback) {
120
+ originalClose(callback);
121
+ // Close all websocket servers, including possible client connections (see: https://github.com/websockets/ws/issues/2137#issuecomment-1507469375)
122
+ for (const endpoint of Object.values(websocketEndpoints)){
123
+ endpoint.close();
124
+ endpoint.clients.forEach((client)=>client.terminate());
125
+ }
126
+ // Forcibly close active connections
127
+ this.closeAllConnections();
128
+ return this;
129
+ };
130
+ if (mockServer) {
131
+ return {
132
+ server: httpServer,
133
+ metro: metroServer
134
+ };
135
+ }
94
136
  return new Promise((resolve, reject)=>{
95
137
  httpServer.on("error", (error)=>{
96
- if ("code" in error && error.code === "EADDRINUSE") {
97
- // If `Error: listen EADDRINUSE: address already in use :::8081` then print additional info
98
- // about the process before throwing.
99
- const info = (0, _getRunningProcess.getRunningProcess)(config.server.port);
100
- if (info) {
101
- _log.Log.error(`Port ${config.server.port} is busy running ${info.command} in: ${info.directory}`);
102
- }
103
- }
104
- if (onError) {
105
- onError(error);
106
- }
107
138
  reject(error);
108
- end();
109
139
  });
110
140
  httpServer.listen(config.server.port, host, ()=>{
111
141
  if (onReady) {
@@ -132,13 +162,6 @@ const runServer = async (metroBundler, config, { hasReducedPerformance =false ,
132
162
  metro: metroServer
133
163
  });
134
164
  });
135
- // Disable any kind of automatic timeout behavior for incoming
136
- // requests in case it takes the packager more than the default
137
- // timeout of 120 seconds to respond to a request.
138
- httpServer.timeout = 0;
139
- httpServer.on("close", ()=>{
140
- end();
141
- });
142
165
  });
143
166
  };
144
167
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/runServer-fork.ts"],"sourcesContent":["// Copyright © 2023 650 Industries.\n// Copyright (c) Meta Platforms, Inc. and affiliates.\n//\n// Forks https://github.com/facebook/metro/blob/b80d9a0f638ee9fb82ff69cd3c8d9f4309ca1da2/packages/metro/src/index.flow.js#L57\n// and adds the ability to access the bundler instance.\nimport assert from 'assert';\nimport http from 'http';\nimport https from 'https';\nimport Metro, { RunServerOptions, Server } from 'metro';\nimport MetroHmrServer from 'metro/src/HmrServer';\nimport createWebsocketServer from 'metro/src/lib/createWebsocketServer';\nimport { ConfigT } from 'metro-config';\nimport { parse } from 'url';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { Log } from '../../../log';\nimport { getRunningProcess } from '../../../utils/getRunningProcess';\nimport type { ConnectAppType } from '../middleware/server.types';\n\nexport const runServer = async (\n metroBundler: MetroBundlerDevServer,\n config: ConfigT,\n {\n hasReducedPerformance = false,\n host,\n onError,\n onReady,\n secureServerOptions,\n waitForBundler = false,\n websocketEndpoints = {},\n watch,\n }: RunServerOptions\n): Promise<{ server: http.Server | https.Server; metro: Server }> => {\n // await earlyPortCheck(host, config.server.port);\n\n // if (secure != null || secureCert != null || secureKey != null) {\n // // eslint-disable-next-line no-console\n // console.warn(\n // chalk.inverse.yellow.bold(' DEPRECATED '),\n // 'The `secure`, `secureCert`, and `secureKey` options are now deprecated. ' +\n // 'Please use the `secureServerOptions` object instead to pass options to ' +\n // \"Metro's https development server.\",\n // );\n // }\n\n const { middleware, end, metroServer } = await Metro.createConnectMiddleware(config, {\n hasReducedPerformance,\n waitForBundler,\n watch,\n });\n\n assert(typeof (middleware as any).use === 'function');\n const serverApp = middleware as ConnectAppType;\n\n let httpServer: http.Server | https.Server;\n\n if (secureServerOptions != null) {\n httpServer = https.createServer(secureServerOptions, serverApp);\n } else {\n httpServer = http.createServer(serverApp);\n }\n return new Promise<{ server: http.Server | https.Server; metro: Server }>((resolve, reject) => {\n httpServer.on('error', (error) => {\n if ('code' in error && error.code === 'EADDRINUSE') {\n // If `Error: listen EADDRINUSE: address already in use :::8081` then print additional info\n // about the process before throwing.\n const info = getRunningProcess(config.server.port);\n if (info) {\n Log.error(\n `Port ${config.server.port} is busy running ${info.command} in: ${info.directory}`\n );\n }\n }\n\n if (onError) {\n onError(error);\n }\n reject(error);\n end();\n });\n\n httpServer.listen(config.server.port, host, () => {\n if (onReady) {\n onReady(httpServer);\n }\n\n Object.assign(websocketEndpoints, {\n // @ts-expect-error: incorrect types\n '/hot': createWebsocketServer({\n websocketServer: new MetroHmrServer(\n metroServer.getBundler(),\n metroServer.getCreateModuleId(),\n config\n ),\n }),\n });\n\n httpServer.on('upgrade', (request, socket, head) => {\n const { pathname } = parse(request.url!);\n if (pathname != null && websocketEndpoints[pathname]) {\n websocketEndpoints[pathname].handleUpgrade(request, socket, head, (ws) => {\n websocketEndpoints[pathname].emit('connection', ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n\n resolve({ server: httpServer, metro: metroServer });\n });\n\n // Disable any kind of automatic timeout behavior for incoming\n // requests in case it takes the packager more than the default\n // timeout of 120 seconds to respond to a request.\n httpServer.timeout = 0;\n\n httpServer.on('close', () => {\n end();\n });\n });\n};\n"],"names":["runServer","metroBundler","config","hasReducedPerformance","host","onError","onReady","secureServerOptions","waitForBundler","websocketEndpoints","watch","middleware","end","metroServer","Metro","createConnectMiddleware","assert","use","serverApp","httpServer","https","createServer","http","Promise","resolve","reject","on","error","code","info","getRunningProcess","server","port","Log","command","directory","listen","Object","assign","createWebsocketServer","websocketServer","MetroHmrServer","getBundler","getCreateModuleId","request","socket","head","pathname","parse","url","handleUpgrade","ws","emit","destroy","metro","timeout"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/runServer-fork.ts"],"sourcesContent":["// Copyright © 2023 650 Industries.\n// Copyright (c) Meta Platforms, Inc. and affiliates.\n//\n// Forks https://github.com/facebook/metro/blob/b80d9a0f638ee9fb82ff69cd3c8d9f4309ca1da2/packages/metro/src/index.flow.js#L57\n// and adds the ability to access the bundler instance.\nimport assert from 'assert';\nimport http from 'http';\nimport https from 'https';\nimport Metro, { RunServerOptions, Server } from 'metro';\nimport MetroHmrServer from 'metro/src/HmrServer';\nimport createWebsocketServer from 'metro/src/lib/createWebsocketServer';\nimport { ConfigT } from 'metro-config';\nimport { parse } from 'url';\nimport type { WebSocketServer } from 'ws';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { Log } from '../../../log';\nimport { getRunningProcess } from '../../../utils/getRunningProcess';\nimport type { ConnectAppType } from '../middleware/server.types';\n\nexport const runServer = async (\n metroBundler: MetroBundlerDevServer,\n config: ConfigT,\n {\n hasReducedPerformance = false,\n host,\n onError,\n onReady,\n secureServerOptions,\n waitForBundler = false,\n websocketEndpoints = {},\n watch,\n }: RunServerOptions,\n {\n mockServer,\n }: {\n // Use a mock server object instead of creating a real server, this is used in export cases where we want to reuse codepaths but not actually start a server.\n mockServer: boolean;\n }\n): Promise<{ server: http.Server | https.Server; metro: Server }> => {\n // await earlyPortCheck(host, config.server.port);\n\n // if (secure != null || secureCert != null || secureKey != null) {\n // // eslint-disable-next-line no-console\n // console.warn(\n // chalk.inverse.yellow.bold(' DEPRECATED '),\n // 'The `secure`, `secureCert`, and `secureKey` options are now deprecated. ' +\n // 'Please use the `secureServerOptions` object instead to pass options to ' +\n // \"Metro's https development server.\",\n // );\n // }\n\n const { middleware, end, metroServer } = await Metro.createConnectMiddleware(config, {\n hasReducedPerformance,\n waitForBundler,\n watch,\n });\n\n if (!mockServer) {\n assert(typeof (middleware as any).use === 'function');\n }\n const serverApp = middleware as ConnectAppType;\n\n let httpServer: http.Server | https.Server;\n\n if (secureServerOptions != null) {\n httpServer = https.createServer(secureServerOptions, serverApp);\n } else {\n httpServer = http.createServer(serverApp);\n }\n\n httpServer.on('error', (error) => {\n if ('code' in error && error.code === 'EADDRINUSE') {\n // If `Error: listen EADDRINUSE: address already in use :::8081` then print additional info\n // about the process before throwing.\n const info = getRunningProcess(config.server.port);\n if (info) {\n Log.error(\n `Port ${config.server.port} is busy running ${info.command} in: ${info.directory}`\n );\n }\n }\n\n if (onError) {\n onError(error);\n }\n end();\n });\n\n // Disable any kind of automatic timeout behavior for incoming\n // requests in case it takes the packager more than the default\n // timeout of 120 seconds to respond to a request.\n httpServer.timeout = 0;\n\n httpServer.on('close', () => {\n end();\n });\n\n // Extend the close method to ensure all websocket servers are closed, and connections are terminated\n const originalClose = httpServer.close.bind(httpServer);\n\n httpServer.close = function closeHttpServer(callback) {\n originalClose(callback);\n\n // Close all websocket servers, including possible client connections (see: https://github.com/websockets/ws/issues/2137#issuecomment-1507469375)\n for (const endpoint of Object.values(websocketEndpoints) as WebSocketServer[]) {\n endpoint.close();\n endpoint.clients.forEach((client) => client.terminate());\n }\n\n // Forcibly close active connections\n this.closeAllConnections();\n return this;\n };\n\n if (mockServer) {\n return { server: httpServer, metro: metroServer };\n }\n\n return new Promise<{ server: http.Server | https.Server; metro: Server }>((resolve, reject) => {\n httpServer.on('error', (error) => {\n reject(error);\n });\n\n httpServer.listen(config.server.port, host, () => {\n if (onReady) {\n onReady(httpServer);\n }\n\n Object.assign(websocketEndpoints, {\n // @ts-expect-error: incorrect types\n '/hot': createWebsocketServer({\n websocketServer: new MetroHmrServer(\n metroServer.getBundler(),\n metroServer.getCreateModuleId(),\n config\n ),\n }),\n });\n\n httpServer.on('upgrade', (request, socket, head) => {\n const { pathname } = parse(request.url!);\n if (pathname != null && websocketEndpoints[pathname]) {\n websocketEndpoints[pathname].handleUpgrade(request, socket, head, (ws) => {\n websocketEndpoints[pathname].emit('connection', ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n\n resolve({ server: httpServer, metro: metroServer });\n });\n });\n};\n"],"names":["runServer","metroBundler","config","hasReducedPerformance","host","onError","onReady","secureServerOptions","waitForBundler","websocketEndpoints","watch","mockServer","middleware","end","metroServer","Metro","createConnectMiddleware","assert","use","serverApp","httpServer","https","createServer","http","on","error","code","info","getRunningProcess","server","port","Log","command","directory","timeout","originalClose","close","bind","closeHttpServer","callback","endpoint","Object","values","clients","forEach","client","terminate","closeAllConnections","metro","Promise","resolve","reject","listen","assign","createWebsocketServer","websocketServer","MetroHmrServer","getBundler","getCreateModuleId","request","socket","head","pathname","parse","url","handleUpgrade","ws","emit","destroy"],"mappings":"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"}
@@ -125,7 +125,11 @@ function withWebPolyfills(config, { getMetroBundler }) {
125
125
  if (ctx.platform === "web") {
126
126
  return [
127
127
  virtualModuleId,
128
- virtualEnvVarId
128
+ virtualEnvVarId,
129
+ // Ensure that the error-guard polyfill is included in the web polyfills to
130
+ // make metro-runtime work correctly.
131
+ // TODO: This module is pretty big for a function that simply re-throws an error that doesn't need to be caught.
132
+ require.resolve("@react-native/js-polyfills/error-guard"),
129
133
  ];
130
134
  }
131
135
  // Generally uses `rn-get-polyfills`
@@ -478,6 +482,10 @@ async function withMetroMultiPlatformAsync(projectRoot, { config , exp , platfor
478
482
  }
479
483
  // @ts-expect-error: watchFolders is readonly
480
484
  config.watchFolders.push(_path().default.join(require.resolve("metro-runtime/package.json"), "../.."));
485
+ if (isReactCanaryEnabled) {
486
+ // @ts-expect-error: watchFolders is readonly
487
+ config.watchFolders.push(_path().default.join(require.resolve("@expo/cli/package.json"), ".."));
488
+ }
481
489
  }
482
490
  // @ts-expect-error
483
491
  config.transformer._expoRouterWebRendering = webOutput;