@expo/cli 54.1.0-canary-20251023-4c86f95 → 54.1.0-canary-20260119-17896bf

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 (186) hide show
  1. package/add-module.js +4 -1
  2. package/build/bin/cli +3 -1
  3. package/build/bin/cli.map +1 -1
  4. package/build/src/export/embed/exportEmbedAsync.js +1 -2
  5. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  6. package/build/src/install/applyPlugins.js +2 -1
  7. package/build/src/install/applyPlugins.js.map +1 -1
  8. package/build/src/install/fixPackages.js +1 -1
  9. package/build/src/install/fixPackages.js.map +1 -1
  10. package/build/src/install/installAsync.js +1 -1
  11. package/build/src/install/installAsync.js.map +1 -1
  12. package/build/src/install/utils/parsePackageSpecifier.js +24 -0
  13. package/build/src/install/utils/parsePackageSpecifier.js.map +1 -0
  14. package/build/src/run/ios/runIosAsync.js +8 -0
  15. package/build/src/run/ios/runIosAsync.js.map +1 -1
  16. package/build/src/start/interface/commandsTable.js.map +1 -1
  17. package/build/src/start/interface/interactiveActions.js +14 -9
  18. package/build/src/start/interface/interactiveActions.js.map +1 -1
  19. package/build/src/start/interface/startInterface.js +3 -0
  20. package/build/src/start/interface/startInterface.js.map +1 -1
  21. package/build/src/start/platforms/android/adb.js +1 -1
  22. package/build/src/start/platforms/android/adb.js.map +1 -1
  23. package/build/src/start/server/DevToolsPluginManager.js +8 -4
  24. package/build/src/start/server/DevToolsPluginManager.js.map +1 -1
  25. package/build/src/start/server/MCP.js +28 -5
  26. package/build/src/start/server/MCP.js.map +1 -1
  27. package/build/src/start/server/UrlCreator.js +1 -1
  28. package/build/src/start/server/UrlCreator.js.map +1 -1
  29. package/build/src/start/server/metro/DevToolsPluginWebsocketEndpoint.js +10 -2
  30. package/build/src/start/server/metro/DevToolsPluginWebsocketEndpoint.js.map +1 -1
  31. package/build/src/start/server/metro/MetroBundlerDevServer.js +29 -155
  32. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  33. package/build/src/start/server/metro/MetroTerminalReporter.js +151 -33
  34. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  35. package/build/src/start/server/metro/createExpoAutolinkingResolver.js +1 -3
  36. package/build/src/start/server/metro/createExpoAutolinkingResolver.js.map +1 -1
  37. package/build/src/start/server/metro/createExpoFallbackResolver.js +1 -3
  38. package/build/src/start/server/metro/createExpoFallbackResolver.js.map +1 -1
  39. package/build/src/start/server/metro/createServerComponentsMiddleware.js +1 -2
  40. package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
  41. package/build/src/start/server/metro/createServerRouteMiddleware.js +2 -2
  42. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  43. package/build/src/start/server/metro/debugging/createDebugMiddleware.js +23 -9
  44. package/build/src/start/server/metro/debugging/createDebugMiddleware.js.map +1 -1
  45. package/build/src/start/server/metro/dev-server/compression.js +45 -0
  46. package/build/src/start/server/metro/dev-server/compression.js.map +1 -0
  47. package/build/src/start/server/metro/dev-server/createMetroMiddleware.js +2 -2
  48. package/build/src/start/server/metro/dev-server/createMetroMiddleware.js.map +1 -1
  49. package/build/src/start/server/metro/externals.js +11 -0
  50. package/build/src/start/server/metro/externals.js.map +1 -1
  51. package/build/src/start/server/metro/fetchRouterManifest.js +1 -1
  52. package/build/src/start/server/metro/fetchRouterManifest.js.map +1 -1
  53. package/build/src/start/server/metro/instantiateMetro.js +98 -27
  54. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  55. package/build/src/start/server/metro/log-box/LogBoxLog.js +7 -11
  56. package/build/src/start/server/metro/log-box/LogBoxLog.js.map +1 -1
  57. package/build/src/start/server/metro/log-box/LogBoxSymbolication.js.map +1 -1
  58. package/build/src/start/server/metro/metroErrorInterface.js +43 -14
  59. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
  60. package/build/src/start/server/metro/withMetroMultiPlatform.js +74 -57
  61. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  62. package/build/src/start/server/middleware/CorsMiddleware.js +43 -12
  63. package/build/src/start/server/middleware/CorsMiddleware.js.map +1 -1
  64. package/build/src/start/server/middleware/CreateFileMiddleware.js +63 -24
  65. package/build/src/start/server/middleware/CreateFileMiddleware.js.map +1 -1
  66. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +3 -1
  67. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  68. package/build/src/start/server/middleware/ManifestMiddleware.js +14 -9
  69. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  70. package/build/src/start/startAsync.js +12 -9
  71. package/build/src/start/startAsync.js.map +1 -1
  72. package/build/src/utils/env.js +36 -2
  73. package/build/src/utils/env.js.map +1 -1
  74. package/build/src/utils/interactive.js +1 -1
  75. package/build/src/utils/interactive.js.map +1 -1
  76. package/build/src/utils/jsonl.js +243 -0
  77. package/build/src/utils/jsonl.js.map +1 -0
  78. package/build/src/utils/net.js +43 -0
  79. package/build/src/utils/net.js.map +1 -0
  80. package/build/src/utils/progress.js +5 -0
  81. package/build/src/utils/progress.js.map +1 -1
  82. package/build/src/utils/telemetry/clients/FetchClient.js +1 -1
  83. package/build/src/utils/telemetry/utils/context.js +1 -1
  84. package/build/src/utils/url.js +4 -8
  85. package/build/src/utils/url.js.map +1 -1
  86. package/package.json +25 -28
  87. package/static/canary/react-is/cjs/react-is.development.js +133 -0
  88. package/static/canary/react-is/cjs/react-is.production.js +130 -0
  89. package/static/canary/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js +16820 -0
  90. package/static/canary/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js +10552 -0
  91. package/static/canary/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js +11255 -0
  92. package/static/canary/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +17064 -0
  93. package/static/canary/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +10742 -0
  94. package/static/canary/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +11450 -0
  95. package/static/canary/scheduler/cjs/scheduler-unstable_mock.development.js +414 -0
  96. package/static/canary/scheduler/cjs/scheduler-unstable_mock.production.js +406 -0
  97. package/static/canary/scheduler/cjs/scheduler-unstable_post_task.development.js +150 -0
  98. package/static/canary/scheduler/cjs/scheduler-unstable_post_task.production.js +140 -0
  99. package/static/canary/scheduler/cjs/scheduler.development.js +364 -0
  100. package/static/canary/scheduler/cjs/scheduler.native.development.js +350 -0
  101. package/static/canary/scheduler/cjs/scheduler.native.production.js +330 -0
  102. package/static/canary/scheduler/cjs/scheduler.production.js +340 -0
  103. package/static/canary-full/node_modules/react/LICENSE +21 -0
  104. package/static/canary-full/node_modules/react/README.md +37 -0
  105. package/static/canary-full/node_modules/react/cjs/react-compiler-runtime.development.js +24 -0
  106. package/static/canary-full/node_modules/react/cjs/react-compiler-runtime.production.js +16 -0
  107. package/static/canary-full/node_modules/react/cjs/react-compiler-runtime.profiling.js +16 -0
  108. package/static/canary-full/node_modules/react/cjs/react-jsx-dev-runtime.development.js +349 -0
  109. package/static/canary-full/node_modules/react/cjs/react-jsx-dev-runtime.production.js +14 -0
  110. package/static/canary-full/node_modules/react/cjs/react-jsx-dev-runtime.profiling.js +14 -0
  111. package/static/canary-full/node_modules/react/cjs/react-jsx-dev-runtime.react-server.development.js +385 -0
  112. package/static/canary-full/node_modules/react/cjs/react-jsx-dev-runtime.react-server.production.js +40 -0
  113. package/static/canary-full/node_modules/react/cjs/react-jsx-runtime.development.js +358 -0
  114. package/static/canary-full/node_modules/react/cjs/react-jsx-runtime.production.js +34 -0
  115. package/static/canary-full/node_modules/react/cjs/react-jsx-runtime.profiling.js +34 -0
  116. package/static/canary-full/node_modules/react/cjs/react-jsx-runtime.react-server.development.js +385 -0
  117. package/static/canary-full/node_modules/react/cjs/react-jsx-runtime.react-server.production.js +40 -0
  118. package/static/canary-full/node_modules/react/cjs/react.development.js +1250 -0
  119. package/static/canary-full/node_modules/react/cjs/react.production.js +544 -0
  120. package/static/canary-full/node_modules/react/cjs/react.react-server.development.js +815 -0
  121. package/static/canary-full/node_modules/react/cjs/react.react-server.production.js +429 -0
  122. package/static/canary-full/node_modules/react/compiler-runtime.js +14 -0
  123. package/static/canary-full/node_modules/react/index.js +7 -0
  124. package/static/canary-full/node_modules/react/jsx-dev-runtime.js +7 -0
  125. package/static/canary-full/node_modules/react/jsx-dev-runtime.react-server.js +7 -0
  126. package/static/canary-full/node_modules/react/jsx-runtime.js +7 -0
  127. package/static/canary-full/node_modules/react/jsx-runtime.react-server.js +7 -0
  128. package/static/canary-full/node_modules/react/package.json +51 -0
  129. package/static/canary-full/node_modules/react/react.react-server.js +7 -0
  130. package/static/canary-full/node_modules/react-dom/LICENSE +21 -0
  131. package/static/canary-full/node_modules/react-dom/README.md +60 -0
  132. package/static/canary-full/node_modules/react-dom/cjs/react-dom-client.development.js +25089 -0
  133. package/static/canary-full/node_modules/react-dom/cjs/react-dom-client.production.js +15426 -0
  134. package/static/canary-full/node_modules/react-dom/cjs/react-dom-profiling.development.js +25476 -0
  135. package/static/canary-full/node_modules/react-dom/cjs/react-dom-profiling.profiling.js +16296 -0
  136. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js +9035 -0
  137. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +5892 -0
  138. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server-legacy.node.development.js +9035 -0
  139. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +5972 -0
  140. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server.browser.development.js +9424 -0
  141. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server.browser.production.js +6384 -0
  142. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server.bun.development.js +8739 -0
  143. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server.bun.production.js +5967 -0
  144. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server.edge.development.js +9443 -0
  145. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server.edge.production.js +6477 -0
  146. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server.node.development.js +9317 -0
  147. package/static/canary-full/node_modules/react-dom/cjs/react-dom-server.node.production.js +6372 -0
  148. package/static/canary-full/node_modules/react-dom/cjs/react-dom-test-utils.development.js +24 -0
  149. package/static/canary-full/node_modules/react-dom/cjs/react-dom-test-utils.production.js +21 -0
  150. package/static/canary-full/node_modules/react-dom/cjs/react-dom.development.js +424 -0
  151. package/static/canary-full/node_modules/react-dom/cjs/react-dom.production.js +210 -0
  152. package/static/canary-full/node_modules/react-dom/cjs/react-dom.react-server.development.js +340 -0
  153. package/static/canary-full/node_modules/react-dom/cjs/react-dom.react-server.production.js +152 -0
  154. package/static/canary-full/node_modules/react-dom/client.js +38 -0
  155. package/static/canary-full/node_modules/react-dom/client.react-server.js +5 -0
  156. package/static/canary-full/node_modules/react-dom/index.js +38 -0
  157. package/static/canary-full/node_modules/react-dom/package.json +117 -0
  158. package/static/canary-full/node_modules/react-dom/profiling.js +38 -0
  159. package/static/canary-full/node_modules/react-dom/profiling.react-server.js +5 -0
  160. package/static/canary-full/node_modules/react-dom/react-dom.react-server.js +7 -0
  161. package/static/canary-full/node_modules/react-dom/server.browser.js +18 -0
  162. package/static/canary-full/node_modules/react-dom/server.bun.js +19 -0
  163. package/static/canary-full/node_modules/react-dom/server.edge.js +19 -0
  164. package/static/canary-full/node_modules/react-dom/server.js +3 -0
  165. package/static/canary-full/node_modules/react-dom/server.node.js +18 -0
  166. package/static/canary-full/node_modules/react-dom/server.react-server.js +5 -0
  167. package/static/canary-full/node_modules/react-dom/static.browser.js +12 -0
  168. package/static/canary-full/node_modules/react-dom/static.edge.js +12 -0
  169. package/static/canary-full/node_modules/react-dom/static.js +3 -0
  170. package/static/canary-full/node_modules/react-dom/static.node.js +12 -0
  171. package/static/canary-full/node_modules/react-dom/static.react-server.js +5 -0
  172. package/static/canary-full/node_modules/react-dom/test-utils.js +7 -0
  173. package/build/src/start/interface/cliExtensionMenuItemHandler.js +0 -173
  174. package/build/src/start/interface/cliExtensionMenuItemHandler.js.map +0 -1
  175. package/build/src/start/interface/createDevToolsMenuItems.js +0 -159
  176. package/build/src/start/interface/createDevToolsMenuItems.js.map +0 -1
  177. package/build/src/start/server/DevToolsPlugin.js +0 -60
  178. package/build/src/start/server/DevToolsPlugin.js.map +0 -1
  179. package/build/src/start/server/DevToolsPlugin.schema.js +0 -79
  180. package/build/src/start/server/DevToolsPlugin.schema.js.map +0 -1
  181. package/build/src/start/server/DevToolsPluginCliExtensionExecutor.js +0 -119
  182. package/build/src/start/server/DevToolsPluginCliExtensionExecutor.js.map +0 -1
  183. package/build/src/start/server/DevToolsPluginCliExtensionResults.js +0 -61
  184. package/build/src/start/server/DevToolsPluginCliExtensionResults.js.map +0 -1
  185. package/build/src/start/server/middleware/DataLoaderModuleMiddleware.js +0 -75
  186. package/build/src/start/server/middleware/DataLoaderModuleMiddleware.js.map +0 -1
@@ -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 { getMetroServerRoot } from '@expo/config/paths';\nimport { parseWebBuildErrors } from '@expo/log-box/utils';\nimport chalk from 'chalk';\nimport { stripVTControlCharacters } from 'node:util';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport { parse, StackFrame } from 'stacktrace-parser';\nimport terminalLink from 'terminal-link';\n\nimport { LogBoxLog, LogBoxLogData } from './log-box/LogBoxLog';\nimport type { CodeFrame, StackFrame as MetroStackFrame } from './log-box/LogBoxSymbolication';\nimport { getStackFormattedLocation } from './log-box/formatProjectFilePath';\nimport { Log } from '../../../log';\nimport { stripAnsi } from '../../../utils/ansi';\nimport { env } from '../../../utils/env';\nimport { CommandError, SilentError } from '../../../utils/errors';\nimport { createMetroEndpointAsync } from '../getStaticRenderFunctions';\n\nconst isDebug = require('debug').enabled('expo:start:server:metro');\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 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 Log.log(\n getStackAsFormattedLog(projectRoot, { stack, codeFrame, error, showCollapsedFrames: true })\n .stack\n );\n}\n\nexport function getStackAsFormattedLog(\n projectRoot: string,\n {\n stack,\n codeFrame,\n error,\n showCollapsedFrames = env.EXPO_DEBUG,\n }: {\n stack: MetroStackFrame[];\n codeFrame?: CodeFrame;\n error?: Error;\n showCollapsedFrames?: boolean;\n }\n): {\n isFallback: boolean;\n stack: string;\n} {\n const logs: string[] = [];\n const containsCodeFrame = likelyContainsCodeFrame(error?.message);\n\n if (containsCodeFrame) {\n // Some transformation errors will have a code frame embedded in the error message\n // from Babel and we should not duplicate it as message is already printed before this call.\n } else if (codeFrame) {\n const maxWarningLineLength = Math.max(800, process.stdout.columns);\n\n const lineText = codeFrame.content;\n const lines = codeFrame.content.split('\\n');\n\n // ---- index.tsx ------------------------------------------------------\n // 32 | This is example code which will be under the title.\n const title = path.basename(codeFrame.fileName);\n logs.push(chalk.bold`Code: ${title}`);\n\n const isPreviewTooLong = lines.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 logs.push(formattedPath, '', previewLine, cursorLine, chalk.dim('(error truncated)'));\n }\n } else {\n logs.push(codeFrame.content);\n }\n }\n\n let isFallback = false;\n if (stack?.length) {\n const stackProps = stack.map((frame) => {\n return {\n title: frame.methodName,\n subtitle: getStackFormattedLocation(projectRoot, frame),\n collapse: frame.collapse || isInternalBytecode(frame),\n };\n });\n\n const stackLines: string[] = [];\n const backupStackLines: string[] = [];\n\n stackProps.forEach((frame) => {\n const shouldShow = !frame.collapse || showCollapsedFrames;\n\n const position = terminalLink.isSupported\n ? terminalLink(frame.subtitle, frame.subtitle)\n : frame.subtitle;\n let lineItem = chalk.gray(` ${frame.title} (${position})`);\n\n if (frame.collapse) {\n lineItem = chalk.dim(lineItem);\n }\n // Never show the internal module system.\n const isMetroRuntime =\n /\\/metro-runtime\\/src\\/polyfills\\/require\\.js/.test(frame.subtitle) ||\n /\\/metro-require\\/require\\.js/.test(frame.subtitle);\n if (!isMetroRuntime) {\n if (shouldShow) {\n stackLines.push(lineItem);\n }\n backupStackLines.push(lineItem);\n }\n });\n\n logs.push(chalk.bold`Call Stack`);\n\n if (!backupStackLines.length) {\n logs.push(chalk.gray(' No stack trace available.'));\n } else {\n isFallback = stackLines.length === 0;\n // If there are not stack lines then it means the error likely happened in the node modules, in this case we should fallback to showing all the\n // the stacks to give the user whatever help we can.\n const displayStack = stackLines.length ? stackLines : backupStackLines;\n logs.push(displayStack.join('\\n'));\n }\n } else if (error && error.stack) {\n logs.push(chalk.gray(` ${error.stack}`));\n }\n\n return {\n isFallback,\n stack: logs.join('\\n'),\n };\n}\n\nexport const IS_METRO_BUNDLE_ERROR_SYMBOL = Symbol('_isMetroBundleError');\nconst HAS_LOGGED_SYMBOL = Symbol('_hasLoggedInCLI');\n\nexport async function logMetroError(\n projectRoot: string,\n {\n error,\n }: {\n error: Error & {\n [HAS_LOGGED_SYMBOL]?: boolean;\n };\n }\n) {\n if (error instanceof SilentError || error[HAS_LOGGED_SYMBOL]) {\n return;\n }\n error[HAS_LOGGED_SYMBOL] = true;\n\n const stack = parseErrorStack(projectRoot, 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 }): LogBoxLog {\n const data = parseWebBuildErrors({\n error,\n projectRoot,\n parseErrorStack,\n });\n return new LogBoxLog(data as LogBoxLogData);\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 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%;background-color:black}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 // TODO: We could reuse the pre-built DOM Log Box from @expo/log-box\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 optimize: false,\n usedExports: 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\nfunction parseErrorStack(\n projectRoot: string,\n stack?: string\n): (StackFrame & { collapse?: boolean })[] {\n if (stack == null) {\n return [];\n }\n if (Array.isArray(stack)) {\n return stack;\n }\n\n const serverRoot = getMetroServerRoot(projectRoot);\n\n return parse(stack)\n .map((frame) => {\n // frame.file will mostly look like `http://localhost:8081/index.bundle?platform=web&dev=true&hot=false`\n\n if (frame.file) {\n // SSR will sometimes have absolute paths followed by `.bundle?...`, we need to try and make them relative paths and append a dev server URL.\n if (frame.file.startsWith('/') && frame.file.includes('bundle?') && !canParse(frame.file)) {\n // Malformed stack file from SSR. Attempt to repair.\n frame.file = 'https://localhost:8081/' + path.relative(serverRoot, frame.file);\n }\n }\n\n return {\n ...frame,\n column: frame.column != null ? frame.column - 1 : null,\n };\n })\n .filter((frame) => frame.file && !frame.file.includes('node_modules'));\n}\n\nfunction canParse(url: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function dropStackIfContainsCodeFrame(err: unknown) {\n if (!(err instanceof Error)) return;\n\n if (likelyContainsCodeFrame(err.message)) {\n // If the error message contains a code frame, we should drop the stack to avoid cluttering the output.\n delete err.stack;\n }\n}\n\n/**\n * Tests given string on presence of ` [num] |` at the start of any line.\n * Returns `false` for undefined or empty strings.\n */\nexport function likelyContainsCodeFrame(message: string | undefined): boolean {\n if (!message) return false;\n\n const clean = stripVTControlCharacters(message);\n if (!clean) return false;\n\n return /^\\s*\\d+\\s+\\|/m.test(clean);\n}\n\n/**\n * Walks thru the error cause chain and attaches the import stack to the root error message.\n * Removes the error stack for import and syntax errors.\n */\nexport const attachImportStackToRootMessage = (err: unknown) => {\n if (!(err instanceof Error)) return;\n\n // Space out build failures.\n const nearestImportStackValue = nearestImportStack(err);\n if (nearestImportStackValue) {\n err.message += '\\n\\n' + nearestImportStackValue;\n\n if (!isDebug) {\n // When not debugging remove the stack to avoid cluttering the output and confusing users,\n // the import stack is the guide to fixing the error.\n delete err.stack;\n }\n }\n};\n\n/**\n * Walks thru the error cause chain and returns the nearest import stack.\n * If the import stack is not found, it returns `undefined`.\n */\nexport const nearestImportStack = (err: unknown, root: unknown = err): string | undefined => {\n if (!(err instanceof Error) || !(root instanceof Error)) return undefined;\n\n if ('_expoImportStack' in err && typeof err._expoImportStack === 'string') {\n // Space out build failures.\n return err._expoImportStack;\n } else {\n return nearestImportStack(err.cause, root);\n }\n};\n\nfunction isInternalBytecode(frame: StackFrame): boolean {\n return frame.file?.includes('InternalBytecode.js') ?? false;\n}\n"],"names":["IS_METRO_BUNDLE_ERROR_SYMBOL","attachImportStackToRootMessage","dropStackIfContainsCodeFrame","getErrorOverlayHtmlAsync","getStackAsFormattedLog","likelyContainsCodeFrame","logMetroError","logMetroErrorAsync","logMetroErrorWithStack","nearestImportStack","isDebug","require","enabled","fill","width","Array","join","formatPaths","config","filePath","chalk","reset","dim","line","col","filter","Boolean","projectRoot","stack","codeFrame","error","SilentError","Log","log","red","message","CommandError","showCollapsedFrames","env","EXPO_DEBUG","logs","containsCodeFrame","maxWarningLineLength","Math","max","process","stdout","columns","lineText","content","lines","split","title","path","basename","fileName","push","bold","isPreviewTooLong","some","length","column","location","previewLine","cursorLine","formattedPath","row","rangeWindow","round","minBounds","maxBounds","min","slice","isFallback","stackProps","map","frame","methodName","subtitle","getStackFormattedLocation","collapse","isInternalBytecode","stackLines","backupStackLines","forEach","shouldShow","position","terminalLink","isSupported","lineItem","gray","isMetroRuntime","test","displayStack","Symbol","HAS_LOGGED_SYMBOL","parseErrorStack","LogBoxLog","level","substitutions","isComponentError","category","componentStack","Promise","res","symbolicate","symbolicated","logFromError","data","parseWebBuildErrors","routerRoot","stripAnsi","logBoxContext","selectedLogIndex","isDisabled","html","JSON","stringify","errorOverlayEntry","createMetroEndpointAsync","resolveFrom","mode","platform","minify","optimize","usedExports","baseUrl","isExporting","reactCompiler","htmlWithJs","replace","isArray","serverRoot","getMetroServerRoot","parse","file","startsWith","includes","canParse","relative","url","URL","err","Error","clean","stripVTControlCharacters","nearestImportStackValue","root","undefined","_expoImportStack","cause"],"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 { getMetroServerRoot } from '@expo/config/paths';\nimport chalk from 'chalk';\nimport { stripVTControlCharacters } from 'node:util';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport { parse, StackFrame } from 'stacktrace-parser';\nimport terminalLink from 'terminal-link';\n\nimport { LogBoxLog } from './log-box/LogBoxLog';\nimport type { CodeFrame, StackFrame as MetroStackFrame } from './log-box/LogBoxSymbolication';\nimport { getStackFormattedLocation } from './log-box/formatProjectFilePath';\nimport { Log } from '../../../log';\nimport { stripAnsi } from '../../../utils/ansi';\nimport { env } from '../../../utils/env';\nimport { CommandError, SilentError } from '../../../utils/errors';\nimport { createMetroEndpointAsync } from '../getStaticRenderFunctions';\n\nconst isDebug = require('debug').enabled('expo:start:server:metro');\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 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 Log.log(\n getStackAsFormattedLog(projectRoot, { stack, codeFrame, error, showCollapsedFrames: true })\n .stack\n );\n}\n\nexport function getStackAsFormattedLog(\n projectRoot: string,\n {\n stack,\n codeFrame,\n error,\n showCollapsedFrames = env.EXPO_DEBUG,\n }: {\n stack: MetroStackFrame[];\n codeFrame?: CodeFrame;\n error?: Error;\n showCollapsedFrames?: boolean;\n }\n): {\n isFallback: boolean;\n stack: string;\n} {\n const logs: string[] = [];\n const containsCodeFrame = likelyContainsCodeFrame(error?.message);\n\n if (containsCodeFrame) {\n // Some transformation errors will have a code frame embedded in the error message\n // from Babel and we should not duplicate it as message is already printed before this call.\n } else if (codeFrame) {\n const maxWarningLineLength = Math.max(800, process.stdout.columns);\n\n const lineText = codeFrame.content;\n const lines = codeFrame.content.split('\\n');\n\n // ---- index.tsx ------------------------------------------------------\n // 32 | This is example code which will be under the title.\n const title = path.basename(codeFrame.fileName);\n logs.push(chalk.bold`Code: ${title}`);\n\n const isPreviewTooLong = lines.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 logs.push(formattedPath, '', previewLine, cursorLine, chalk.dim('(error truncated)'));\n }\n } else {\n logs.push(codeFrame.content);\n }\n }\n\n let isFallback = false;\n if (stack?.length) {\n const stackProps = stack.map((frame) => {\n return {\n title: frame.methodName,\n subtitle: getStackFormattedLocation(projectRoot, frame),\n collapse: frame.collapse || isInternalBytecode(frame),\n };\n });\n\n const stackLines: string[] = [];\n const backupStackLines: string[] = [];\n\n stackProps.forEach((frame) => {\n const shouldShow = !frame.collapse || showCollapsedFrames;\n\n const position = terminalLink.isSupported\n ? terminalLink(frame.subtitle, frame.subtitle)\n : frame.subtitle;\n let lineItem = chalk.gray(` ${frame.title} (${position})`);\n\n if (frame.collapse) {\n lineItem = chalk.dim(lineItem);\n }\n // Never show the internal module system.\n const isMetroRuntime =\n /\\/metro-runtime\\/src\\/polyfills\\/require\\.js/.test(frame.subtitle) ||\n /\\/metro-require\\/require\\.js/.test(frame.subtitle);\n if (!isMetroRuntime) {\n if (shouldShow) {\n stackLines.push(lineItem);\n }\n backupStackLines.push(lineItem);\n }\n });\n\n logs.push(chalk.bold`Call Stack`);\n\n if (!backupStackLines.length) {\n logs.push(chalk.gray(' No stack trace available.'));\n } else {\n isFallback = stackLines.length === 0;\n // If there are not stack lines then it means the error likely happened in the node modules, in this case we should fallback to showing all the\n // the stacks to give the user whatever help we can.\n const displayStack = stackLines.length ? stackLines : backupStackLines;\n logs.push(displayStack.join('\\n'));\n }\n } else if (error && error.stack) {\n logs.push(chalk.gray(` ${error.stack}`));\n }\n\n return {\n isFallback,\n stack: logs.join('\\n'),\n };\n}\n\nexport const IS_METRO_BUNDLE_ERROR_SYMBOL = Symbol('_isMetroBundleError');\nconst HAS_LOGGED_SYMBOL = Symbol('_hasLoggedInCLI');\n\nexport async function logMetroError(\n projectRoot: string,\n {\n error,\n }: {\n error: Error & {\n [HAS_LOGGED_SYMBOL]?: boolean;\n };\n }\n) {\n if (error instanceof SilentError || error[HAS_LOGGED_SYMBOL]) {\n return;\n }\n error[HAS_LOGGED_SYMBOL] = true;\n\n const stack = parseErrorStack(projectRoot, 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 // Remap direct Metro Node.js errors to a format that will appear more client-friendly in the logbox UI.\n let stack: MetroStackFrame[] | undefined;\n if (isTransformError(error) && error.filename) {\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 && typeof error.originModulePath === 'string') {\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(projectRoot, 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 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 optimize: false,\n usedExports: 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\nfunction parseErrorStack(\n projectRoot: string,\n stack?: string\n): (StackFrame & { collapse?: boolean })[] {\n if (stack == null) {\n return [];\n }\n if (Array.isArray(stack)) {\n return stack;\n }\n\n const serverRoot = getMetroServerRoot(projectRoot);\n\n return parse(stack)\n .map((frame) => {\n // frame.file will mostly look like `http://localhost:8081/index.bundle?platform=web&dev=true&hot=false`\n\n if (frame.file) {\n // SSR will sometimes have absolute paths followed by `.bundle?...`, we need to try and make them relative paths and append a dev server URL.\n if (frame.file.startsWith('/') && frame.file.includes('bundle?') && !canParse(frame.file)) {\n // Malformed stack file from SSR. Attempt to repair.\n frame.file = 'https://localhost:8081/' + path.relative(serverRoot, frame.file);\n }\n }\n\n return {\n ...frame,\n column: frame.column != null ? frame.column - 1 : null,\n };\n })\n .filter((frame) => frame.file && !frame.file.includes('node_modules'));\n}\n\nfunction canParse(url: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function dropStackIfContainsCodeFrame(err: unknown) {\n if (!(err instanceof Error)) return;\n\n if (likelyContainsCodeFrame(err.message)) {\n // If the error message contains a code frame, we should drop the stack to avoid cluttering the output.\n delete err.stack;\n }\n}\n\n/**\n * Tests given string on presence of ` [num] |` at the start of any line.\n * Returns `false` for undefined or empty strings.\n */\nexport function likelyContainsCodeFrame(message: string | undefined): boolean {\n if (!message) return false;\n\n const clean = stripVTControlCharacters(message);\n if (!clean) return false;\n\n return /^\\s*\\d+\\s+\\|/m.test(clean);\n}\n\n/**\n * Walks thru the error cause chain and attaches the import stack to the root error message.\n * Removes the error stack for import and syntax errors.\n */\nexport const attachImportStackToRootMessage = (err: unknown) => {\n if (!(err instanceof Error)) return;\n\n // Space out build failures.\n const nearestImportStackValue = nearestImportStack(err);\n if (nearestImportStackValue) {\n err.message += '\\n\\n' + nearestImportStackValue;\n\n if (!isDebug) {\n // When not debugging remove the stack to avoid cluttering the output and confusing users,\n // the import stack is the guide to fixing the error.\n delete err.stack;\n }\n }\n};\n\n/**\n * Walks thru the error cause chain and returns the nearest import stack.\n * If the import stack is not found, it returns `undefined`.\n */\nexport const nearestImportStack = (err: unknown, root: unknown = err): string | undefined => {\n if (!(err instanceof Error) || !(root instanceof Error)) return undefined;\n\n if ('_expoImportStack' in err && typeof err._expoImportStack === 'string') {\n // Space out build failures.\n return err._expoImportStack;\n } else {\n return nearestImportStack(err.cause, root);\n }\n};\n\nfunction isInternalBytecode(frame: StackFrame): boolean {\n return frame.file?.includes('InternalBytecode.js') ?? false;\n}\n"],"names":["IS_METRO_BUNDLE_ERROR_SYMBOL","attachImportStackToRootMessage","dropStackIfContainsCodeFrame","getErrorOverlayHtmlAsync","getStackAsFormattedLog","likelyContainsCodeFrame","logMetroError","logMetroErrorAsync","logMetroErrorWithStack","nearestImportStack","isDebug","require","enabled","fill","width","Array","join","formatPaths","config","filePath","chalk","reset","dim","line","col","filter","Boolean","projectRoot","stack","codeFrame","error","SilentError","Log","log","red","message","CommandError","showCollapsedFrames","env","EXPO_DEBUG","logs","containsCodeFrame","maxWarningLineLength","Math","max","process","stdout","columns","lineText","content","lines","split","title","path","basename","fileName","push","bold","isPreviewTooLong","some","length","column","location","previewLine","cursorLine","formattedPath","row","rangeWindow","round","minBounds","maxBounds","min","slice","isFallback","stackProps","map","frame","methodName","subtitle","getStackFormattedLocation","collapse","isInternalBytecode","stackLines","backupStackLines","forEach","shouldShow","position","terminalLink","isSupported","lineItem","gray","isMetroRuntime","test","displayStack","Symbol","HAS_LOGGED_SYMBOL","parseErrorStack","LogBoxLog","level","substitutions","isComponentError","category","componentStack","Promise","res","symbolicate","symbolicated","isTransformError","type","logFromError","filename","file","arguments","lineNumber","originModulePath","routerRoot","stripAnsi","logBoxContext","selectedLogIndex","isDisabled","html","JSON","stringify","errorOverlayEntry","createMetroEndpointAsync","resolveFrom","mode","platform","minify","optimize","usedExports","baseUrl","isExporting","reactCompiler","htmlWithJs","replace","isArray","serverRoot","getMetroServerRoot","parse","startsWith","includes","canParse","relative","url","URL","err","Error","clean","stripVTControlCharacters","nearestImportStackValue","root","undefined","_expoImportStack","cause"],"mappings":"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"}
@@ -96,7 +96,10 @@ function withWebPolyfills(config, { getMetroBundler }) {
96
96
  const virtualModuleId = `\0polyfill:external-require`;
97
97
  (0, _metroVirtualModules.getMetroBundlerWithVirtualModules)(getMetroBundler()).setVirtualModule(virtualModuleId, (()=>{
98
98
  if (ctx.platform === 'web') {
99
- return `global.$$require_external = typeof require !== "undefined" ? require : () => null;`;
99
+ // NOTE(@hassankhan): We need to wrap require in an arrow function rather than assigning
100
+ // it directly because `workerd` loses its `this` context when `require` is dereferenced
101
+ // and called later.
102
+ return `global.$$require_external = typeof require !== "undefined" ? (m) => require(m) : () => null;`;
100
103
  } else {
101
104
  // Wrap in try/catch to support Android.
102
105
  return 'try { global.$$require_external = typeof expo === "undefined" ? require : (moduleId) => { throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);} } catch { global.$$require_external = (moduleId) => { throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);} }';
@@ -160,11 +163,14 @@ function getNodejsExtensions(srcExts) {
160
163
  nodejsSourceExtensions.splice(jsIndex + 1, 0, ...mjsExts);
161
164
  return nodejsSourceExtensions;
162
165
  }
163
- function withExtendedResolver(config, { tsconfig, autolinkingModuleResolverInput, isTsconfigPathsEnabled, isFastResolverEnabled, isExporting, isReactServerComponentsEnabled, getMetroBundler }) {
166
+ function withExtendedResolver(config, { tsconfig, autolinkingModuleResolverInput, isTsconfigPathsEnabled, isFastResolverEnabled, isExporting, isReactCanaryEnabled, isReactServerComponentsEnabled, getMetroBundler }) {
164
167
  var _config_resolver, _config_resolver1, _config_resolver2, _config_resolver3, _config_serializer_createModuleIdFactory, _config_serializer;
165
168
  if (isReactServerComponentsEnabled) {
166
169
  _log.Log.warn(`React Server Components (beta) is enabled.`);
167
170
  }
171
+ if (isReactCanaryEnabled) {
172
+ _log.Log.warn(`Experimental React 19 canary is enabled.`);
173
+ }
168
174
  if (isFastResolverEnabled) {
169
175
  _log.Log.log(_chalk().default.dim`Fast resolver is enabled.`);
170
176
  }
@@ -182,6 +188,10 @@ function withExtendedResolver(config, { tsconfig, autolinkingModuleResolverInput
182
188
  'react-native/Libraries/Image/resolveAssetSource': 'expo-asset/build/resolveAssetSource'
183
189
  }
184
190
  };
191
+ // The vendored canary modules live inside /static/canary-full/node_modules
192
+ // Adding the `index.js` allows us to add this path as `originModulePath` to
193
+ // resolve the nested `node_modules` folder properly.
194
+ const canaryModulesPath = _path().default.join(require.resolve('@expo/cli/package.json'), '../static/canary-full/index.js');
185
195
  let _universalAliases;
186
196
  function getUniversalAliases() {
187
197
  if (_universalAliases) {
@@ -287,6 +297,19 @@ function withExtendedResolver(config, { tsconfig, autolinkingModuleResolverInput
287
297
  }
288
298
  // TODO: This is a hack to get resolveWeak working.
289
299
  const idFactory = ((_config_serializer = config.serializer) == null ? void 0 : (_config_serializer_createModuleIdFactory = _config_serializer.createModuleIdFactory) == null ? void 0 : _config_serializer_createModuleIdFactory.call(_config_serializer)) ?? ((id, context)=>id);
300
+ // We're manually resolving the `asyncRequireModulePath` since it's a module request
301
+ // However, in isolated installations it might not resolve from all paths, so we're resolving
302
+ // it from the project root manually
303
+ let _asyncRequireModuleResolvedPath;
304
+ const getAsyncRequireModule = ()=>{
305
+ if (_asyncRequireModuleResolvedPath === undefined) {
306
+ _asyncRequireModuleResolvedPath = _resolvefrom().default.silent(config.projectRoot, config.transformer.asyncRequireModulePath) ?? null;
307
+ }
308
+ return _asyncRequireModuleResolvedPath ? {
309
+ type: 'sourceFile',
310
+ filePath: _asyncRequireModuleResolvedPath
311
+ } : null;
312
+ };
290
313
  const getAssetRegistryModule = ()=>{
291
314
  const virtualModuleId = `\0polyfill:assets-registry`;
292
315
  (0, _metroVirtualModules.getMetroBundlerWithVirtualModules)(getMetroBundler()).setVirtualModule(virtualModuleId, ASSET_REGISTRY_SRC);
@@ -487,8 +510,12 @@ function withExtendedResolver(config, { tsconfig, autolinkingModuleResolverInput
487
510
  }
488
511
  return null;
489
512
  },
490
- // Polyfill for asset registry
491
- function requestStableAssetRegistry(context, moduleName, platform) {
513
+ // Polyfill for asset registry (assetRegistryPath) and async require module (asyncRequireModulePath)
514
+ function requestStableConfigModules(context, moduleName, platform) {
515
+ if (moduleName === config.transformer.asyncRequireModulePath) {
516
+ return getAsyncRequireModule();
517
+ }
518
+ // TODO(@kitten): Compare against `config.transformer.assetRegistryPath`
492
519
  if (/^@react-native\/assets-registry\/registry(\.js)?$/.test(moduleName)) {
493
520
  return getAssetRegistryModule();
494
521
  }
@@ -509,20 +536,19 @@ function withExtendedResolver(config, { tsconfig, autolinkingModuleResolverInput
509
536
  return result;
510
537
  }
511
538
  const normalizedPath = normalizeSlashes(result.filePath);
512
- const doReplace = (from, to, options)=>doReplaceHelper(from, to, {
513
- normalizedPath,
514
- doResolve,
515
- ...options
516
- });
517
- const doReplaceStrict = (from, to)=>doReplace(from, to, {
518
- throws: true
519
- });
520
- if (_env.env.EXPO_UNSTABLE_WEB_MODAL) {
521
- const webModalModule = doReplace('expo-router/build/layouts/_web-modal.js', 'expo-router/build/layouts/ExperimentalModalStack.js');
522
- if (webModalModule) {
523
- debug('Using `_unstable-web-modal` implementation.');
524
- return webModalModule;
539
+ if (normalizedPath.endsWith('expo-router/build/layouts/_web-modal.js')) {
540
+ if (_env.env.EXPO_UNSTABLE_WEB_MODAL) {
541
+ try {
542
+ const webModal = doResolve('expo-router/build/layouts/ExperimentalModalStack.js');
543
+ if (webModal.type === 'sourceFile') {
544
+ debug('Using `_unstable-web-modal` implementation.');
545
+ return webModal;
546
+ }
547
+ } catch (error) {
548
+ // Fallback to react-navigation web modal implementation.
549
+ }
525
550
  }
551
+ debug("Using React Navigation's web modal implementation.");
526
552
  }
527
553
  if (platform === 'web') {
528
554
  if (result.filePath.includes('node_modules')) {
@@ -557,19 +583,26 @@ function withExtendedResolver(config, { tsconfig, autolinkingModuleResolverInput
557
583
  const isServer = ((_context_customResolverOptions = context.customResolverOptions) == null ? void 0 : _context_customResolverOptions.environment) === 'node' || ((_context_customResolverOptions1 = context.customResolverOptions) == null ? void 0 : _context_customResolverOptions1.environment) === 'react-server';
558
584
  // Shim out React Native native runtime globals in server mode for native.
559
585
  if (isServer) {
560
- const emptyModule = doReplace('react-native/Libraries/Core/InitializeCore.js', undefined);
561
- if (emptyModule) {
586
+ if (normalizedPath.endsWith('react-native/Libraries/Core/InitializeCore.js')) {
562
587
  debug('Shimming out InitializeCore for React Native in native SSR bundle');
563
- return emptyModule;
588
+ return {
589
+ type: 'empty'
590
+ };
564
591
  }
565
592
  }
566
- const hmrModule = doReplaceStrict('react-native/Libraries/Utilities/HMRClient.js', 'expo/src/async-require/hmr.ts');
567
- if (hmrModule) return hmrModule;
568
- if (_env.env.EXPO_UNSTABLE_LOG_BOX) {
569
- const logBoxModule = doReplace('react-native/Libraries/LogBox/LogBoxInspectorContainer.js', '@expo/log-box/swap-rn-logbox.js');
570
- if (logBoxModule) return logBoxModule;
571
- const logBoxParserModule = doReplace('react-native/Libraries/LogBox/Data/parseLogBoxLog.js', '@expo/log-box/swap-rn-logbox-parser.js');
572
- if (logBoxParserModule) return logBoxParserModule;
593
+ // When server components are enabled, redirect React Native's renderer to the canary build
594
+ // this will enable the use hook and other requisite features from React 19.
595
+ if (isReactCanaryEnabled && result.filePath.includes('node_modules')) {
596
+ const normalName = normalizeSlashes(result.filePath)// Drop everything up until the `node_modules` folder.
597
+ .replace(/.*node_modules\//, '');
598
+ const canaryFile = (0, _externals.shouldCreateVirtualCanary)(normalName);
599
+ if (canaryFile) {
600
+ debug(`Redirecting React Native module "${result.filePath}" to canary build`);
601
+ return {
602
+ ...result,
603
+ filePath: canaryFile
604
+ };
605
+ }
573
606
  }
574
607
  }
575
608
  return result;
@@ -592,6 +625,14 @@ function withExtendedResolver(config, { tsconfig, autolinkingModuleResolverInput
592
625
  ...immutableContext,
593
626
  preferNativePlatform: platform !== 'web'
594
627
  };
628
+ // TODO: Remove this when we have React 19 in the expo/expo monorepo.
629
+ if (isReactCanaryEnabled && // Change the node modules path for react and react-dom to use the vendor in Expo CLI.
630
+ /^(react|react\/.*|react-dom|react-dom\/.*)$/.test(moduleName)) {
631
+ // Modifying the origin module path changes the starting Node module resolution path to this folder
632
+ context.originModulePath = canaryModulesPath;
633
+ // Hierarchical lookup has to be enabled for this to work
634
+ context.disableHierarchicalLookup = false;
635
+ }
595
636
  if ((0, _metroOptions.isServerEnvironment)((_context_customResolverOptions = context.customResolverOptions) == null ? void 0 : _context_customResolverOptions.environment)) {
596
637
  var _context_customResolverOptions1, _context_customResolverOptions2;
597
638
  // Adjust nodejs source extensions to sort mjs after js, including platform variants.
@@ -659,44 +700,15 @@ function withExtendedResolver(config, { tsconfig, autolinkingModuleResolverInput
659
700
  });
660
701
  return (0, _withMetroErrorReportingResolver.withMetroErrorReportingResolver)((0, _withMetroSupervisingTransformWorker.withMetroSupervisingTransformWorker)(metroConfigWithCustomContext));
661
702
  }
662
- function doReplaceHelper(from, to, { throws = false, normalizedPath, doResolve }) {
663
- if (!normalizedPath.endsWith(from)) {
664
- return undefined;
665
- }
666
- if (to === undefined) {
667
- return {
668
- type: 'empty'
669
- };
670
- }
671
- try {
672
- const hmrModule = doResolve(to);
673
- if (hmrModule.type === 'sourceFile') {
674
- debug(`Using \`${to}\` implementation.`);
675
- return hmrModule;
676
- }
677
- } catch (resolutionError) {
678
- if (throws) {
679
- throw new Error(`Failed to replace ${from} with ${to}. Resolution of ${to} failed.`, {
680
- cause: resolutionError
681
- });
682
- }
683
- debug(`Failed to resolve ${to} when swapping from ${from}: ${resolutionError}`);
684
- }
685
- return undefined;
686
- }
687
703
  function shouldAliasModule(input, alias) {
688
704
  var _input_result, _input_result1;
689
705
  return input.platform === alias.platform && ((_input_result = input.result) == null ? void 0 : _input_result.type) === 'sourceFile' && typeof ((_input_result1 = input.result) == null ? void 0 : _input_result1.filePath) === 'string' && normalizeSlashes(input.result.filePath).endsWith(alias.output);
690
706
  }
691
- async function withMetroMultiPlatformAsync(projectRoot, { config, exp, platformBundlers, isTsconfigPathsEnabled, isAutolinkingResolverEnabled, isFastResolverEnabled, isExporting, isReactServerComponentsEnabled, getMetroBundler }) {
707
+ async function withMetroMultiPlatformAsync(projectRoot, { config, exp, platformBundlers, isTsconfigPathsEnabled, isAutolinkingResolverEnabled, isFastResolverEnabled, isExporting, isReactCanaryEnabled, isReactServerComponentsEnabled, getMetroBundler }) {
692
708
  // Change the default metro-runtime to a custom one that supports bundle splitting.
693
709
  // NOTE(@kitten): This is now always active and EXPO_USE_METRO_REQUIRE / isNamedRequiresEnabled is disregarded
694
710
  const metroDefaults = require('@expo/metro/metro-config/defaults/defaults');
695
711
  metroDefaults.moduleSystem = require.resolve('@expo/cli/build/metro-require/require');
696
- if (!config.projectRoot) {
697
- // @ts-expect-error: read-only types
698
- config.projectRoot = projectRoot;
699
- }
700
712
  // Required for @expo/metro-runtime to format paths in the web LogBox.
701
713
  process.env.EXPO_PUBLIC_PROJECT_ROOT = process.env.EXPO_PUBLIC_PROJECT_ROOT ?? projectRoot;
702
714
  // This is used for running Expo CLI in development against projects outside the monorepo.
@@ -711,6 +723,10 @@ async function withMetroMultiPlatformAsync(projectRoot, { config, exp, platformB
711
723
  // @ts-expect-error: watchFolders is readonly
712
724
  config.watchFolders.push(_path().default.join(require.resolve('@expo/metro-config/package.json'), '../..'), // For virtual modules
713
725
  _path().default.join(require.resolve('expo/package.json'), '..'));
726
+ if (isReactCanaryEnabled) {
727
+ // @ts-expect-error: watchFolders is readonly
728
+ config.watchFolders.push(_path().default.join(require.resolve('@expo/cli/package.json'), '..'));
729
+ }
714
730
  }
715
731
  let tsconfig = null;
716
732
  if (isTsconfigPathsEnabled) {
@@ -743,6 +759,7 @@ async function withMetroMultiPlatformAsync(projectRoot, { config, exp, platformB
743
759
  isExporting,
744
760
  isTsconfigPathsEnabled,
745
761
  isFastResolverEnabled,
762
+ isReactCanaryEnabled,
746
763
  isReactServerComponentsEnabled,
747
764
  getMetroBundler
748
765
  });