@expo/cli 55.0.31 → 55.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bin/cli +1 -1
- package/build/src/api/rest/client.js +27 -12
- package/build/src/api/rest/client.js.map +1 -1
- package/build/src/api/user/UserSettings.js +4 -2
- package/build/src/api/user/UserSettings.js.map +1 -1
- package/build/src/events/index.js +1 -1
- package/build/src/export/embed/exportEmbedAsync.js +2 -2
- package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
- package/build/src/prebuild/resolveTemplate.js +10 -5
- package/build/src/prebuild/resolveTemplate.js.map +1 -1
- package/build/src/start/platforms/android/adb.js +16 -15
- package/build/src/start/platforms/android/adb.js.map +1 -1
- package/build/src/start/server/getStaticRenderFunctions.js +2 -1
- package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
- package/build/src/start/server/metro/debugging/createDebugMiddleware.js +6 -5
- package/build/src/start/server/metro/debugging/createDebugMiddleware.js.map +1 -1
- package/build/src/start/server/metro/debugging/messageHandlers/NetworkResponse.js +17 -1
- package/build/src/start/server/metro/debugging/messageHandlers/NetworkResponse.js.map +1 -1
- package/build/src/start/server/metro/dev-server/createMetroMiddleware.js +7 -1
- package/build/src/start/server/metro/dev-server/createMetroMiddleware.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +3 -1
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/metroErrorInterface.js +5 -2
- package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
- package/build/src/start/server/middleware/InterstitialPageMiddleware.js +7 -4
- package/build/src/start/server/middleware/InterstitialPageMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js +14 -24
- package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js.map +1 -1
- package/build/src/utils/codesigning.js +6 -0
- package/build/src/utils/codesigning.js.map +1 -1
- package/build/src/utils/net.js +13 -0
- package/build/src/utils/net.js.map +1 -1
- package/build/src/utils/telemetry/clients/FetchClient.js +1 -1
- package/build/src/utils/telemetry/utils/context.js +1 -1
- package/build/src/utils/url.js +0 -12
- package/build/src/utils/url.js.map +1 -1
- package/package.json +9 -9
- package/static/loading-page/index.html +10 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { type ExpoConfig, getConfig } from '@expo/config';\nimport { getMetroServerRoot } from '@expo/config/paths';\nimport type { Reporter } from '@expo/metro/metro';\nimport type Bundler from '@expo/metro/metro/Bundler';\nimport type { ReadOnlyGraph } from '@expo/metro/metro/DeltaBundler';\nimport type { TransformOptions } from '@expo/metro/metro/DeltaBundler/Worker';\nimport MetroHmrServer, { Client as MetroHmrClient } from '@expo/metro/metro/HmrServer';\nimport RevisionNotFoundError from '@expo/metro/metro/IncrementalBundler/RevisionNotFoundError';\nimport type MetroServer from '@expo/metro/metro/Server';\nimport formatBundlingError from '@expo/metro/metro/lib/formatBundlingError';\nimport { mergeConfig, resolveConfig, type ConfigT } from '@expo/metro/metro-config';\nimport { Terminal } from '@expo/metro/metro-core';\nimport { createStableModuleIdFactory, getDefaultConfig } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport http from 'http';\nimport path from 'path';\n\nimport { createDevToolsPluginWebsocketEndpoint } from './DevToolsPluginWebsocketEndpoint';\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { attachAtlasAsync } from './debugging/attachAtlas';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\nimport { createMetroMiddleware } from './dev-server/createMetroMiddleware';\nimport { runServer, type SecureServerOptions } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { events, shouldReduceLogs } from '../../../events';\nimport { Log } from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { createCorsMiddleware } from '../middleware/CorsMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware } from '../middleware/mutations';\nimport { getPlatformBundlers } from '../platformBundlers';\n\n// prettier-ignore\nexport const event = events('metro', (t) => [\n t.event<'config', {\n serverRoot: string;\n projectRoot: string;\n exporting: boolean;\n flags: {\n autolinkingModuleResolution: boolean;\n serverActions: boolean;\n serverComponents: boolean;\n reactCompiler: boolean;\n optimizeGraph?: boolean;\n treeshaking?: boolean;\n logbox?: boolean;\n };\n }>(),\n t.event<'instantiate', {\n atlas: boolean;\n workers: number | null;\n host: string | null;\n port: number | null;\n }>(),\n]);\n\n// NOTE(@kitten): We pass a custom createStableModuleIdFactory function into the Metro module ID factory sometimes\ninterface MetroServerWithModuleIdMod extends MetroServer {\n _createModuleId: ReturnType<typeof createStableModuleIdFactory> & ((path: string) => number);\n}\ninterface MetroHmrServerWithModuleIdMod extends MetroHmrServer<MetroHmrClient> {\n _createModuleId: ReturnType<typeof createStableModuleIdFactory> & ((path: string) => number);\n}\n\n// From expo/dev-server but with ability to use custom logger.\ntype MessageSocket = {\n broadcast: (method: string, params?: Record<string, any> | undefined) => void;\n};\n\n// TODO(@kitten): We assign this here to run server-side code bundled by metro\n// It's not isolated into a worker thread yet\n// Check `metro-require/require.ts` for how this setting is used\ndeclare namespace globalThis {\n let __requireCycleIgnorePatterns: readonly RegExp[] | undefined;\n}\n\nfunction asWritable<T>(input: T): { -readonly [K in keyof T]: T[K] } {\n return input;\n}\n\n// Wrap terminal and polyfill console.log so we can log during bundling without breaking the indicator.\nclass LogRespectingTerminal extends Terminal {\n constructor(stream: import('node:net').Socket | import('node:stream').Writable) {\n super(stream, { ttyPrint: true });\n\n const sendLog = (...msg: any[]) => {\n if (!msg.length) {\n this.log('');\n } else {\n const [format, ...args] = msg;\n this.log(format, ...args);\n }\n // Flush the logs to the terminal immediately so logs at the end of the process are not lost.\n this.flush();\n };\n\n console.log = sendLog;\n console.info = sendLog;\n }\n}\n\n// Share one instance of Terminal for all instances of Metro.\nconst terminal = new LogRespectingTerminal(process.stdout);\n\ninterface LoadMetroConfigOptions {\n maxWorkers?: number;\n port?: number;\n reporter?: Reporter;\n resetCache?: boolean;\n}\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadMetroConfigOptions,\n {\n exp,\n isExporting,\n getMetroBundler,\n }: { exp: ExpoConfig; isExporting: boolean; getMetroBundler: () => Bundler }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n\n // We're resolving a monorepo root, higher up than the `projectRoot`. If this\n // folder is different (presumably a parent) we're in a monorepo\n const serverRoot = getMetroServerRoot(projectRoot);\n const isWorkspace = serverRoot !== projectRoot;\n\n // Autolinking Module Resolution will be enabled by default when we're in a monorepo\n const autolinkingModuleResolutionEnabled =\n exp.experiments?.autolinkingModuleResolution ?? isWorkspace;\n\n const serverActionsEnabled =\n exp.experiments?.reactServerFunctions ?? env.EXPO_UNSTABLE_SERVER_FUNCTIONS;\n const serverComponentsEnabled = !!exp.experiments?.reactServerComponentRoutes;\n if (serverActionsEnabled) {\n process.env.EXPO_UNSTABLE_SERVER_FUNCTIONS = '1';\n }\n\n // NOTE: Enable all the experimental Metro flags when RSC is enabled.\n if (serverComponentsEnabled || serverActionsEnabled) {\n process.env.EXPO_USE_METRO_REQUIRE = '1';\n }\n\n if (exp.experiments?.reactCanary) {\n Log.warn(`React 19 is enabled by default. Remove unused experiments.reactCanary flag.`);\n }\n\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n // NOTE: Allow external tools to override the metro config. This is considered internal and unstable\n const configPath = env.EXPO_OVERRIDE_METRO_CONFIG ?? undefined;\n const resolvedConfig = await resolveConfig(configPath, projectRoot);\n const defaultConfig = getDefaultConfig(projectRoot);\n\n let config: ConfigT = resolvedConfig.isEmpty\n ? defaultConfig\n : await mergeConfig(defaultConfig, resolvedConfig.config);\n\n // Set the watchfolders to include the projectRoot, as Metro assumes this\n // Force-override the reporter\n config = {\n ...config,\n\n // See: `overrideConfigWithArguments` https://github.com/facebook/metro/blob/5059e26/packages/metro-config/src/loadConfig.js#L274-L339\n // Compare to `LoadOptions` type (disregard `reporter` as we don't expose this)\n resetCache: !!options.resetCache,\n maxWorkers: options.maxWorkers ?? config.maxWorkers,\n server: {\n ...config.server,\n port: options.port ?? config.server.port,\n },\n\n watchFolders: !config.watchFolders.includes(config.projectRoot)\n ? [config.projectRoot, ...config.watchFolders]\n : config.watchFolders,\n reporter: {\n update(event) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\n\n // NOTE(@kitten): `useWatchman` is currently enabled by default, but it also disables `forceNodeFilesystemAPI`.\n // If we instead set it to the special value `null`, it gets enables but also bypasses the \"native find\" codepath,\n // which is slower than just using the Node filesystem API\n // See: https://github.com/facebook/metro/blob/b9c243f/packages/metro-file-map/src/index.js#L326\n // See: https://github.com/facebook/metro/blob/b9c243f/packages/metro/src/node-haste/DependencyGraph/createFileMap.js#L109\n if (config.resolver.useWatchman === true) {\n asWritable(config.resolver).useWatchman = null as any;\n }\n\n globalThis.__requireCycleIgnorePatterns = config.resolver?.requireCycleIgnorePatterns;\n\n if (isExporting) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n asWritable(config.transformer).publicPath = `/assets?export_path=${\n (exp.experiments?.baseUrl ?? '') + '/assets'\n }`;\n } else {\n asWritable(config.transformer).publicPath = '/assets/?unstable_path=.';\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n const reduceLogs = shouldReduceLogs();\n\n const reactCompilerEnabled = !!exp.experiments?.reactCompiler;\n if (!reduceLogs && reactCompilerEnabled) {\n Log.log(chalk.gray`React Compiler enabled`);\n }\n\n if (!reduceLogs && autolinkingModuleResolutionEnabled) {\n Log.log(chalk.gray`Expo Autolinking module resolution enabled`);\n }\n\n if (env.EXPO_UNSTABLE_TREE_SHAKING && !env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n throw new CommandError(\n 'EXPO_UNSTABLE_TREE_SHAKING requires EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH to be enabled.'\n );\n }\n\n if (!reduceLogs && env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n Log.warn(`Experimental bundle optimization is enabled.`);\n }\n if (!reduceLogs && env.EXPO_UNSTABLE_TREE_SHAKING) {\n Log.warn(`Experimental tree shaking is enabled.`);\n }\n if (!reduceLogs && env.EXPO_UNSTABLE_LOG_BOX) {\n Log.warn(`Experimental Expo LogBox is enabled.`);\n }\n\n if (!reduceLogs && serverActionsEnabled) {\n Log.warn(\n `React Server Functions (beta) are enabled. Route rendering mode: ${exp.experiments?.reactServerComponentRoutes ? 'server' : 'client'}`\n );\n }\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n exp,\n platformBundlers,\n serverRoot,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n isAutolinkingResolverEnabled: autolinkingModuleResolutionEnabled,\n isExporting,\n isNamedRequiresEnabled: env.EXPO_USE_METRO_REQUIRE,\n isReactServerComponentsEnabled: serverComponentsEnabled,\n getMetroBundler,\n });\n\n event('config', {\n serverRoot: event.path(serverRoot),\n projectRoot: event.path(projectRoot),\n exporting: isExporting,\n flags: {\n autolinkingModuleResolution: autolinkingModuleResolutionEnabled,\n serverActions: serverActionsEnabled,\n serverComponents: serverComponentsEnabled,\n reactCompiler: reactCompilerEnabled,\n optimizeGraph: env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH,\n treeshaking: env.EXPO_UNSTABLE_TREE_SHAKING,\n logbox: env.EXPO_UNSTABLE_LOG_BOX,\n },\n });\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\ninterface InstantiateMetroConfigOptions extends LoadMetroConfigOptions {\n host?: string;\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: InstantiateMetroConfigOptions,\n {\n isExporting,\n exp = getConfig(metroBundler.projectRoot, {\n skipSDKVersionRequirement: true,\n }).exp,\n }: { isExporting: boolean; exp?: ExpoConfig }\n): Promise<{\n metro: MetroServer;\n hmrServer: MetroHmrServer<MetroHmrClient> | null;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n const getMetroBundler = () => metro.getBundler().getBundler();\n\n const {\n config: metroConfig,\n setEventReporter,\n reporter,\n } = await loadMetroConfigAsync(projectRoot, options, {\n exp,\n isExporting,\n getMetroBundler,\n });\n\n // Get local URL to Metro bundler server (typically configured as 127.0.0.1:8081)\n const serverBaseUrl = metroBundler\n .getUrlCreator()\n .constructUrl({ scheme: 'http', hostType: 'localhost' });\n\n // Create the core middleware stack for Metro, including websocket listeners\n const { middleware, messagesSocket, eventsSocket, websocketEndpoints } = createMetroMiddleware(\n metroConfig,\n { getMetroBundler, serverBaseUrl }\n );\n\n if (!isExporting) {\n // Enable correct CORS headers for Expo Router features\n prependMiddleware(middleware, createCorsMiddleware(exp));\n\n // Enable debug middleware for CDP-related debugging\n const { debugMiddleware, debugWebsocketEndpoints } = createDebugMiddleware({\n serverBaseUrl,\n reporter,\n });\n Object.assign(websocketEndpoints, debugWebsocketEndpoints);\n middleware.use(debugMiddleware);\n middleware.use('/_expo/debugger', createJsInspectorMiddleware());\n\n // TODO(cedric): `enhanceMiddleware` is deprecated, but is currently used to unify the middleware stacks\n // See: https://github.com/facebook/metro/commit/22e85fde85ec454792a1b70eba4253747a2587a9\n // See: https://github.com/facebook/metro/commit/d0d554381f119bb80ab09dbd6a1d310b54737e52\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n asWritable(metroConfig.server).enhanceMiddleware = (\n metroMiddleware: any,\n server: MetroServer\n ) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n const devtoolsWebsocketEndpoints = createDevToolsPluginWebsocketEndpoint();\n Object.assign(websocketEndpoints, devtoolsWebsocketEndpoints);\n }\n\n // Attach Expo Atlas if enabled\n await attachAtlasAsync({\n isExporting,\n exp,\n projectRoot,\n middleware,\n metroConfig,\n // NOTE(cedric): reset the Atlas file once, and reuse it for static exports\n resetAtlasFile: isExporting,\n });\n\n // Support HTTPS based on the metro's tls server config\n // TODO(@kitten): Remove cast once `@expo/metro` is updated to a Metro version that supports the tls config\n const tls = (metroConfig.server as typeof metroConfig.server & { tls?: SecureServerOptions })\n ?.tls;\n const secureServerOptions = tls\n ? {\n key: tls.key,\n cert: tls.cert,\n ca: tls.ca,\n requestCert: tls.requestCert,\n }\n : undefined;\n\n const { address, server, hmrServer, metro } = await runServer(\n metroBundler,\n metroConfig,\n {\n host: options.host,\n websocketEndpoints,\n watch: !isExporting && isWatchEnabled(),\n secureServerOptions,\n },\n {\n mockServer: isExporting,\n }\n );\n\n event('instantiate', {\n atlas: env.EXPO_ATLAS,\n workers: metroConfig.maxWorkers ?? null,\n host: address?.address ?? null,\n port: address?.port ?? null,\n });\n\n // Patch transform file to remove inconvenient customTransformOptions which are only used in single well-known files.\n const originalTransformFile = metro\n .getBundler()\n .getBundler()\n .transformFile.bind(metro.getBundler().getBundler());\n\n metro.getBundler().getBundler().transformFile = async function (\n filePath: string,\n transformOptions: TransformOptions,\n fileBuffer?: Buffer\n ) {\n return originalTransformFile(\n filePath,\n pruneCustomTransformOptions(\n projectRoot,\n filePath,\n // Clone the options so we don't mutate the original.\n {\n ...transformOptions,\n customTransformOptions: {\n __proto__: null,\n ...transformOptions.customTransformOptions,\n },\n }\n ),\n fileBuffer\n );\n };\n\n setEventReporter(eventsSocket.reportMetroEvent);\n\n // This function ensures that modules in source maps are sorted in the same\n // order as in a plain JS bundle.\n metro._getSortedModules = function (this: MetroServerWithModuleIdMod, graph: ReadOnlyGraph) {\n const modules = [...graph.dependencies.values()];\n\n const ctx = {\n // TODO(@kitten): Increase type-safety here\n platform: graph.transformOptions.platform!,\n environment: graph.transformOptions.customTransformOptions?.environment,\n };\n // Assign IDs to modules in a consistent order\n for (const module of modules) {\n this._createModuleId(module.path, ctx);\n }\n // Sort by IDs\n return modules.sort(\n (a, b) => this._createModuleId(a.path, ctx) - this._createModuleId(b.path, ctx)\n );\n };\n\n if (hmrServer) {\n let hmrJSBundle:\n | typeof import('@expo/metro-config/build/serializer/fork/hmrJSBundle').default\n | typeof import('@expo/metro/metro/DeltaBundler/Serializers/hmrJSBundle').default;\n\n try {\n hmrJSBundle = require('@expo/metro-config/build/serializer/fork/hmrJSBundle').default;\n } catch {\n // TODO: Add fallback for monorepo tests up until the fork is merged.\n Log.warn('Failed to load HMR serializer from @expo/metro-config, using fallback version.');\n hmrJSBundle = require('@expo/metro/metro/DeltaBundler/Serializers/hmrJSBundle');\n }\n\n // Patch HMR Server to send more info to the `_createModuleId` function for deterministic module IDs and add support for serializing HMR updates the same as all other bundles.\n hmrServer._prepareMessage = async function (\n this: MetroHmrServerWithModuleIdMod,\n group,\n options,\n changeEvent\n ) {\n // Fork of https://github.com/facebook/metro/blob/3b3e0aaf725cfa6907bf2c8b5fbc0da352d29efe/packages/metro/src/HmrServer.js#L327-L393\n // with patch for `_createModuleId`.\n const logger = !options.isInitialUpdate ? changeEvent?.logger : null;\n try {\n const revPromise = this._bundler.getRevision(group.revisionId);\n if (!revPromise) {\n return {\n type: 'error',\n body: formatBundlingError(new RevisionNotFoundError(group.revisionId)),\n };\n }\n logger?.point('updateGraph_start');\n const { revision, delta } = await this._bundler.updateGraph(await revPromise, false);\n logger?.point('updateGraph_end');\n this._clientGroups.delete(group.revisionId);\n group.revisionId = revision.id;\n for (const client of group.clients) {\n client.revisionIds = client.revisionIds.filter(\n (revisionId) => revisionId !== group.revisionId\n );\n client.revisionIds.push(revision.id);\n }\n this._clientGroups.set(group.revisionId, group);\n logger?.point('serialize_start');\n // NOTE(EvanBacon): This is the patch\n const moduleIdContext = {\n // TODO(@kitten): Increase type-safety here\n platform: revision.graph.transformOptions.platform!,\n environment: revision.graph.transformOptions.customTransformOptions?.environment,\n };\n const hmrUpdate = hmrJSBundle(delta, revision.graph, {\n clientUrl: group.clientUrl,\n // NOTE(EvanBacon): This is also the patch\n createModuleId: (moduleId: string) => {\n return this._createModuleId(moduleId, moduleIdContext);\n },\n includeAsyncPaths: group.graphOptions.lazy,\n projectRoot: this._config.projectRoot,\n serverRoot: this._config.server.unstable_serverRoot ?? this._config.projectRoot,\n });\n logger?.point('serialize_end');\n return {\n type: 'update',\n body: {\n revisionId: revision.id,\n isInitialUpdate: options.isInitialUpdate,\n ...hmrUpdate,\n },\n };\n } catch (error: any) {\n const formattedError = formatBundlingError(error);\n this._config.reporter.update({\n type: 'bundling_error',\n error,\n });\n return {\n type: 'error',\n body: formattedError,\n };\n }\n };\n }\n\n return {\n metro,\n hmrServer,\n server,\n middleware,\n messageSocket: messagesSocket,\n };\n}\n\n// TODO: Fork the entire transform function so we can simply regex the file contents for keywords instead.\nfunction pruneCustomTransformOptions(\n projectRoot: string,\n filePath: string,\n transformOptions: TransformOptions\n): TransformOptions {\n // Normalize the filepath for cross platform checking.\n filePath = filePath.split(path.sep).join('/');\n\n if (\n transformOptions.customTransformOptions?.dom &&\n // The only generated file that needs the dom root is `expo/dom/entry.js`\n !filePath.match(/expo\\/dom\\/entry\\.js$/)\n ) {\n // Clear the dom root option if we aren't transforming the magic entry file, this ensures\n // that cached artifacts from other DOM component bundles can be reused.\n transformOptions.customTransformOptions.dom = 'true';\n }\n\n const routerRoot = transformOptions.customTransformOptions?.routerRoot;\n if (typeof routerRoot === 'string') {\n const isRouterEntry = /\\/expo-router\\/_ctx/.test(filePath);\n // The router root is used all over expo-router (`process.env.EXPO_ROUTER_ABS_APP_ROOT`, `process.env.EXPO_ROUTER_APP_ROOT`) so we'll just ignore the entire package.\n const isRouterModule = /\\/expo-router\\/build\\//.test(filePath);\n // Any page/router inside the expo-router app folder may access the `routerRoot` option to determine whether it's in the app folder\n const resolvedRouterRoot = path.resolve(projectRoot, routerRoot).split(path.sep).join('/');\n const isRouterRoute = path.isAbsolute(filePath) && filePath.startsWith(resolvedRouterRoot);\n\n // In any other file than the above, we enforce that we mustn't use `routerRoot`, and set it to an arbitrary value here (the default)\n // to ensure that the cache never invalidates when this value is changed\n if (!isRouterEntry && !isRouterModule && !isRouterRoute) {\n transformOptions.customTransformOptions!.routerRoot = 'app';\n }\n }\n\n if (\n transformOptions.customTransformOptions?.asyncRoutes &&\n // The async routes settings are also used in `expo-router/_ctx.ios.js` (and other platform variants) via `process.env.EXPO_ROUTER_IMPORT_MODE`\n !(filePath.match(/\\/expo-router\\/_ctx/) || filePath.match(/\\/expo-router\\/build\\//))\n ) {\n delete transformOptions.customTransformOptions.asyncRoutes;\n }\n\n if (\n transformOptions.customTransformOptions?.clientBoundaries &&\n // The client boundaries are only used in `expo/virtual/rsc.js` for production RSC exports.\n !filePath.match(/\\/expo\\/virtual\\/rsc\\.js$/)\n ) {\n delete transformOptions.customTransformOptions.clientBoundaries;\n }\n\n return transformOptions;\n}\n\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["event","instantiateMetroAsync","isWatchEnabled","loadMetroConfigAsync","events","t","asWritable","input","LogRespectingTerminal","Terminal","constructor","stream","ttyPrint","sendLog","msg","length","log","format","args","flush","console","info","terminal","process","stdout","projectRoot","options","exp","isExporting","getMetroBundler","config","reportEvent","serverRoot","getMetroServerRoot","isWorkspace","autolinkingModuleResolutionEnabled","experiments","autolinkingModuleResolution","serverActionsEnabled","reactServerFunctions","env","EXPO_UNSTABLE_SERVER_FUNCTIONS","serverComponentsEnabled","reactServerComponentRoutes","EXPO_USE_METRO_REQUIRE","reactCanary","Log","warn","terminalReporter","MetroTerminalReporter","configPath","EXPO_OVERRIDE_METRO_CONFIG","undefined","resolvedConfig","resolveConfig","defaultConfig","getDefaultConfig","isEmpty","mergeConfig","resetCache","maxWorkers","server","port","watchFolders","includes","reporter","update","resolver","useWatchman","globalThis","__requireCycleIgnorePatterns","requireCycleIgnorePatterns","transformer","publicPath","baseUrl","platformBundlers","getPlatformBundlers","reduceLogs","shouldReduceLogs","reactCompilerEnabled","reactCompiler","chalk","gray","EXPO_UNSTABLE_TREE_SHAKING","EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH","CommandError","EXPO_UNSTABLE_LOG_BOX","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","isAutolinkingResolverEnabled","isNamedRequiresEnabled","isReactServerComponentsEnabled","path","exporting","flags","serverActions","serverComponents","optimizeGraph","treeshaking","logbox","setEventReporter","logger","metroBundler","getConfig","skipSDKVersionRequirement","metroConfig","metro","getBundler","serverBaseUrl","getUrlCreator","constructUrl","scheme","hostType","middleware","messagesSocket","eventsSocket","websocketEndpoints","createMetroMiddleware","prependMiddleware","createCorsMiddleware","debugMiddleware","debugWebsocketEndpoints","createDebugMiddleware","Object","assign","use","createJsInspectorMiddleware","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","devtoolsWebsocketEndpoints","createDevToolsPluginWebsocketEndpoint","attachAtlasAsync","resetAtlasFile","tls","secureServerOptions","key","cert","ca","requestCert","address","hmrServer","runServer","host","watch","mockServer","atlas","EXPO_ATLAS","workers","originalTransformFile","transformFile","bind","filePath","transformOptions","fileBuffer","pruneCustomTransformOptions","customTransformOptions","__proto__","reportMetroEvent","_getSortedModules","graph","modules","dependencies","values","ctx","platform","environment","module","_createModuleId","sort","a","b","hmrJSBundle","require","default","_prepareMessage","group","changeEvent","isInitialUpdate","revision","revPromise","_bundler","getRevision","revisionId","type","body","formatBundlingError","RevisionNotFoundError","point","delta","updateGraph","_clientGroups","delete","id","client","clients","revisionIds","filter","push","set","moduleIdContext","hmrUpdate","clientUrl","createModuleId","moduleId","includeAsyncPaths","graphOptions","lazy","_config","unstable_serverRoot","error","formattedError","messageSocket","split","sep","join","dom","match","routerRoot","isRouterEntry","test","isRouterModule","resolvedRouterRoot","resolve","isRouterRoute","isAbsolute","startsWith","asyncRoutes","clientBoundaries","CI"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { type ExpoConfig, getConfig } from '@expo/config';\nimport { getMetroServerRoot } from '@expo/config/paths';\nimport type { Reporter } from '@expo/metro/metro';\nimport type Bundler from '@expo/metro/metro/Bundler';\nimport type { ReadOnlyGraph } from '@expo/metro/metro/DeltaBundler';\nimport type { TransformOptions } from '@expo/metro/metro/DeltaBundler/Worker';\nimport MetroHmrServer, { Client as MetroHmrClient } from '@expo/metro/metro/HmrServer';\nimport RevisionNotFoundError from '@expo/metro/metro/IncrementalBundler/RevisionNotFoundError';\nimport type MetroServer from '@expo/metro/metro/Server';\nimport formatBundlingError from '@expo/metro/metro/lib/formatBundlingError';\nimport { mergeConfig, resolveConfig, type ConfigT } from '@expo/metro/metro-config';\nimport { Terminal } from '@expo/metro/metro-core';\nimport { createStableModuleIdFactory, getDefaultConfig } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport http from 'http';\nimport path from 'path';\n\nimport { createDevToolsPluginWebsocketEndpoint } from './DevToolsPluginWebsocketEndpoint';\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { attachAtlasAsync } from './debugging/attachAtlas';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\nimport { createMetroMiddleware } from './dev-server/createMetroMiddleware';\nimport { runServer, type SecureServerOptions } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { events, shouldReduceLogs } from '../../../events';\nimport { Log } from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { createCorsMiddleware } from '../middleware/CorsMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware } from '../middleware/mutations';\nimport { getPlatformBundlers } from '../platformBundlers';\n\n// prettier-ignore\nexport const event = events('metro', (t) => [\n t.event<'config', {\n serverRoot: string;\n projectRoot: string;\n exporting: boolean;\n flags: {\n autolinkingModuleResolution: boolean;\n serverActions: boolean;\n serverComponents: boolean;\n reactCompiler: boolean;\n optimizeGraph?: boolean;\n treeshaking?: boolean;\n logbox?: boolean;\n };\n }>(),\n t.event<'instantiate', {\n atlas: boolean;\n workers: number | null;\n host: string | null;\n port: number | null;\n }>(),\n]);\n\n// NOTE(@kitten): We pass a custom createStableModuleIdFactory function into the Metro module ID factory sometimes\ninterface MetroServerWithModuleIdMod extends MetroServer {\n _createModuleId: ReturnType<typeof createStableModuleIdFactory> & ((path: string) => number);\n}\ninterface MetroHmrServerWithModuleIdMod extends MetroHmrServer<MetroHmrClient> {\n _createModuleId: ReturnType<typeof createStableModuleIdFactory> & ((path: string) => number);\n}\n\n// From expo/dev-server but with ability to use custom logger.\ntype MessageSocket = {\n broadcast: (method: string, params?: Record<string, any> | undefined) => void;\n};\n\n// TODO(@kitten): We assign this here to run server-side code bundled by metro\n// It's not isolated into a worker thread yet\n// Check `metro-require/require.ts` for how this setting is used\ndeclare namespace globalThis {\n let __requireCycleIgnorePatterns: readonly RegExp[] | undefined;\n}\n\nfunction asWritable<T>(input: T): { -readonly [K in keyof T]: T[K] } {\n return input;\n}\n\n// Wrap terminal and polyfill console.log so we can log during bundling without breaking the indicator.\nclass LogRespectingTerminal extends Terminal {\n constructor(stream: import('node:net').Socket | import('node:stream').Writable) {\n super(stream, { ttyPrint: true });\n\n const sendLog = (...msg: any[]) => {\n if (!msg.length) {\n this.log('');\n } else {\n const [format, ...args] = msg;\n this.log(format, ...args);\n }\n // Flush the logs to the terminal immediately so logs at the end of the process are not lost.\n this.flush();\n };\n\n console.log = sendLog;\n console.info = sendLog;\n }\n}\n\n// Share one instance of Terminal for all instances of Metro.\nconst terminal = new LogRespectingTerminal(process.stdout);\n\ninterface LoadMetroConfigOptions {\n maxWorkers?: number;\n port?: number;\n reporter?: Reporter;\n resetCache?: boolean;\n}\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadMetroConfigOptions,\n {\n exp,\n isExporting,\n getMetroBundler,\n }: { exp: ExpoConfig; isExporting: boolean; getMetroBundler: () => Bundler }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n\n // We're resolving a monorepo root, higher up than the `projectRoot`. If this\n // folder is different (presumably a parent) we're in a monorepo\n const serverRoot = getMetroServerRoot(projectRoot);\n const isWorkspace = serverRoot !== projectRoot;\n\n // Autolinking Module Resolution will be enabled by default when we're in a monorepo\n const autolinkingModuleResolutionEnabled =\n exp.experiments?.autolinkingModuleResolution ?? isWorkspace;\n\n const serverActionsEnabled =\n exp.experiments?.reactServerFunctions ?? env.EXPO_UNSTABLE_SERVER_FUNCTIONS;\n const serverComponentsEnabled = !!exp.experiments?.reactServerComponentRoutes;\n if (serverActionsEnabled) {\n process.env.EXPO_UNSTABLE_SERVER_FUNCTIONS = '1';\n }\n\n // NOTE: Enable all the experimental Metro flags when RSC is enabled.\n if (serverComponentsEnabled || serverActionsEnabled) {\n process.env.EXPO_USE_METRO_REQUIRE = '1';\n }\n\n if (exp.experiments?.reactCanary) {\n Log.warn(`React 19 is enabled by default. Remove unused experiments.reactCanary flag.`);\n }\n\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n // NOTE: Allow external tools to override the metro config. This is considered internal and unstable\n const configPath = env.EXPO_OVERRIDE_METRO_CONFIG ?? undefined;\n const resolvedConfig = await resolveConfig(configPath, projectRoot);\n const defaultConfig = getDefaultConfig(projectRoot);\n\n let config: ConfigT = resolvedConfig.isEmpty\n ? defaultConfig\n : await mergeConfig(defaultConfig, resolvedConfig.config);\n\n // Set the watchfolders to include the projectRoot, as Metro assumes this\n // Force-override the reporter\n config = {\n ...config,\n\n // See: `overrideConfigWithArguments` https://github.com/facebook/metro/blob/5059e26/packages/metro-config/src/loadConfig.js#L274-L339\n // Compare to `LoadOptions` type (disregard `reporter` as we don't expose this)\n resetCache: !!options.resetCache,\n maxWorkers: options.maxWorkers ?? config.maxWorkers,\n server: {\n ...config.server,\n port: options.port ?? config.server.port,\n },\n\n watchFolders: !config.watchFolders.includes(config.projectRoot)\n ? [config.projectRoot, ...config.watchFolders]\n : config.watchFolders,\n reporter: {\n update(event) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\n\n // NOTE(@kitten): `useWatchman` is currently enabled by default, but it also disables `forceNodeFilesystemAPI`.\n // If we instead set it to the special value `null`, it gets enables but also bypasses the \"native find\" codepath,\n // which is slower than just using the Node filesystem API\n // See: https://github.com/facebook/metro/blob/b9c243f/packages/metro-file-map/src/index.js#L326\n // See: https://github.com/facebook/metro/blob/b9c243f/packages/metro/src/node-haste/DependencyGraph/createFileMap.js#L109\n if (config.resolver.useWatchman === true) {\n asWritable(config.resolver).useWatchman = null as any;\n }\n\n globalThis.__requireCycleIgnorePatterns = config.resolver?.requireCycleIgnorePatterns;\n\n if (isExporting) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n asWritable(config.transformer).publicPath = `/assets?export_path=${\n (exp.experiments?.baseUrl ?? '') + '/assets'\n }`;\n } else {\n asWritable(config.transformer).publicPath = '/assets/?unstable_path=.';\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n const reduceLogs = shouldReduceLogs();\n\n const reactCompilerEnabled = !!exp.experiments?.reactCompiler;\n if (!reduceLogs && reactCompilerEnabled) {\n Log.log(chalk.gray`React Compiler enabled`);\n }\n\n if (!reduceLogs && autolinkingModuleResolutionEnabled) {\n Log.log(chalk.gray`Expo Autolinking module resolution enabled`);\n }\n\n if (env.EXPO_UNSTABLE_TREE_SHAKING && !env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n throw new CommandError(\n 'EXPO_UNSTABLE_TREE_SHAKING requires EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH to be enabled.'\n );\n }\n\n if (!reduceLogs && env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n Log.warn(`Experimental bundle optimization is enabled.`);\n }\n if (!reduceLogs && env.EXPO_UNSTABLE_TREE_SHAKING) {\n Log.warn(`Experimental tree shaking is enabled.`);\n }\n if (!reduceLogs && env.EXPO_UNSTABLE_LOG_BOX) {\n Log.warn(`Experimental Expo LogBox is enabled.`);\n }\n\n if (!reduceLogs && serverActionsEnabled) {\n Log.warn(\n `React Server Functions (beta) are enabled. Route rendering mode: ${exp.experiments?.reactServerComponentRoutes ? 'server' : 'client'}`\n );\n }\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n exp,\n platformBundlers,\n serverRoot,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n isAutolinkingResolverEnabled: autolinkingModuleResolutionEnabled,\n isExporting,\n isNamedRequiresEnabled: env.EXPO_USE_METRO_REQUIRE,\n isReactServerComponentsEnabled: serverComponentsEnabled,\n getMetroBundler,\n });\n\n event('config', {\n serverRoot: event.path(serverRoot),\n projectRoot: event.path(projectRoot),\n exporting: isExporting,\n flags: {\n autolinkingModuleResolution: autolinkingModuleResolutionEnabled,\n serverActions: serverActionsEnabled,\n serverComponents: serverComponentsEnabled,\n reactCompiler: reactCompilerEnabled,\n optimizeGraph: env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH,\n treeshaking: env.EXPO_UNSTABLE_TREE_SHAKING,\n logbox: env.EXPO_UNSTABLE_LOG_BOX,\n },\n });\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\ninterface InstantiateMetroConfigOptions extends LoadMetroConfigOptions {\n host?: string;\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: InstantiateMetroConfigOptions,\n {\n isExporting,\n exp = getConfig(metroBundler.projectRoot, {\n skipSDKVersionRequirement: true,\n }).exp,\n }: { isExporting: boolean; exp?: ExpoConfig }\n): Promise<{\n metro: MetroServer;\n hmrServer: MetroHmrServer<MetroHmrClient> | null;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n const getMetroBundler = () => metro.getBundler().getBundler();\n\n const {\n config: metroConfig,\n setEventReporter,\n reporter,\n } = await loadMetroConfigAsync(projectRoot, options, {\n exp,\n isExporting,\n getMetroBundler,\n });\n\n // Get local URL to Metro bundler server (typically configured as 127.0.0.1:8081)\n const serverBaseUrl = metroBundler\n .getUrlCreator()\n .constructUrl({ scheme: 'http', hostType: 'localhost' });\n\n // Create the core middleware stack for Metro, including websocket listeners\n const { middleware, messagesSocket, eventsSocket, websocketEndpoints } = createMetroMiddleware(\n metroConfig,\n { getMetroBundler, serverBaseUrl }\n );\n\n if (!isExporting) {\n // Enable correct CORS headers for Expo Router features\n prependMiddleware(middleware, createCorsMiddleware(exp));\n\n // Enable debug middleware for CDP-related debugging\n const { debugMiddleware, debugWebsocketEndpoints } = createDebugMiddleware({\n serverBaseUrl,\n reporter,\n });\n Object.assign(websocketEndpoints, debugWebsocketEndpoints);\n middleware.use(debugMiddleware);\n middleware.use('/_expo/debugger', createJsInspectorMiddleware({ serverBaseUrl }));\n\n // TODO(cedric): `enhanceMiddleware` is deprecated, but is currently used to unify the middleware stacks\n // See: https://github.com/facebook/metro/commit/22e85fde85ec454792a1b70eba4253747a2587a9\n // See: https://github.com/facebook/metro/commit/d0d554381f119bb80ab09dbd6a1d310b54737e52\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n asWritable(metroConfig.server).enhanceMiddleware = (\n metroMiddleware: any,\n server: MetroServer\n ) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n const devtoolsWebsocketEndpoints = createDevToolsPluginWebsocketEndpoint();\n Object.assign(websocketEndpoints, devtoolsWebsocketEndpoints);\n }\n\n // Attach Expo Atlas if enabled\n await attachAtlasAsync({\n isExporting,\n exp,\n projectRoot,\n middleware,\n metroConfig,\n // NOTE(cedric): reset the Atlas file once, and reuse it for static exports\n resetAtlasFile: isExporting,\n });\n\n // Support HTTPS based on the metro's tls server config\n // TODO(@kitten): Remove cast once `@expo/metro` is updated to a Metro version that supports the tls config\n const tls = (metroConfig.server as typeof metroConfig.server & { tls?: SecureServerOptions })\n ?.tls;\n const secureServerOptions = tls\n ? {\n key: tls.key,\n cert: tls.cert,\n ca: tls.ca,\n requestCert: tls.requestCert,\n }\n : undefined;\n\n const { address, server, hmrServer, metro } = await runServer(\n metroBundler,\n metroConfig,\n {\n host: options.host,\n websocketEndpoints,\n watch: !isExporting && isWatchEnabled(),\n secureServerOptions,\n },\n {\n mockServer: isExporting,\n }\n );\n\n event('instantiate', {\n atlas: env.EXPO_ATLAS,\n workers: metroConfig.maxWorkers ?? null,\n host: address?.address ?? null,\n port: address?.port ?? null,\n });\n\n // Patch transform file to remove inconvenient customTransformOptions which are only used in single well-known files.\n const originalTransformFile = metro\n .getBundler()\n .getBundler()\n .transformFile.bind(metro.getBundler().getBundler());\n\n metro.getBundler().getBundler().transformFile = async function (\n filePath: string,\n transformOptions: TransformOptions,\n fileBuffer?: Buffer\n ) {\n return originalTransformFile(\n filePath,\n pruneCustomTransformOptions(\n projectRoot,\n filePath,\n // Clone the options so we don't mutate the original.\n {\n ...transformOptions,\n customTransformOptions: {\n __proto__: null,\n ...transformOptions.customTransformOptions,\n },\n }\n ),\n fileBuffer\n );\n };\n\n setEventReporter(eventsSocket.reportMetroEvent);\n\n // This function ensures that modules in source maps are sorted in the same\n // order as in a plain JS bundle.\n metro._getSortedModules = function (this: MetroServerWithModuleIdMod, graph: ReadOnlyGraph) {\n const modules = [...graph.dependencies.values()];\n\n const ctx = {\n // TODO(@kitten): Increase type-safety here\n platform: graph.transformOptions.platform!,\n environment: graph.transformOptions.customTransformOptions?.environment,\n };\n // Assign IDs to modules in a consistent order\n for (const module of modules) {\n this._createModuleId(module.path, ctx);\n }\n // Sort by IDs\n return modules.sort(\n (a, b) => this._createModuleId(a.path, ctx) - this._createModuleId(b.path, ctx)\n );\n };\n\n if (hmrServer) {\n let hmrJSBundle:\n | typeof import('@expo/metro-config/build/serializer/fork/hmrJSBundle').default\n | typeof import('@expo/metro/metro/DeltaBundler/Serializers/hmrJSBundle').default;\n\n try {\n hmrJSBundle = require('@expo/metro-config/build/serializer/fork/hmrJSBundle').default;\n } catch {\n // TODO: Add fallback for monorepo tests up until the fork is merged.\n Log.warn('Failed to load HMR serializer from @expo/metro-config, using fallback version.');\n hmrJSBundle = require('@expo/metro/metro/DeltaBundler/Serializers/hmrJSBundle');\n }\n\n // Patch HMR Server to send more info to the `_createModuleId` function for deterministic module IDs and add support for serializing HMR updates the same as all other bundles.\n hmrServer._prepareMessage = async function (\n this: MetroHmrServerWithModuleIdMod,\n group,\n options,\n changeEvent\n ) {\n // Fork of https://github.com/facebook/metro/blob/3b3e0aaf725cfa6907bf2c8b5fbc0da352d29efe/packages/metro/src/HmrServer.js#L327-L393\n // with patch for `_createModuleId`.\n const logger = !options.isInitialUpdate ? changeEvent?.logger : null;\n try {\n const revPromise = this._bundler.getRevision(group.revisionId);\n if (!revPromise) {\n return {\n type: 'error',\n body: formatBundlingError(new RevisionNotFoundError(group.revisionId)),\n };\n }\n logger?.point('updateGraph_start');\n const { revision, delta } = await this._bundler.updateGraph(await revPromise, false);\n logger?.point('updateGraph_end');\n this._clientGroups.delete(group.revisionId);\n group.revisionId = revision.id;\n for (const client of group.clients) {\n client.revisionIds = client.revisionIds.filter(\n (revisionId) => revisionId !== group.revisionId\n );\n client.revisionIds.push(revision.id);\n }\n this._clientGroups.set(group.revisionId, group);\n logger?.point('serialize_start');\n // NOTE(EvanBacon): This is the patch\n const moduleIdContext = {\n // TODO(@kitten): Increase type-safety here\n platform: revision.graph.transformOptions.platform!,\n environment: revision.graph.transformOptions.customTransformOptions?.environment,\n };\n const hmrUpdate = hmrJSBundle(delta, revision.graph, {\n clientUrl: group.clientUrl,\n // NOTE(EvanBacon): This is also the patch\n createModuleId: (moduleId: string) => {\n return this._createModuleId(moduleId, moduleIdContext);\n },\n includeAsyncPaths: group.graphOptions.lazy,\n projectRoot: this._config.projectRoot,\n serverRoot: this._config.server.unstable_serverRoot ?? this._config.projectRoot,\n });\n logger?.point('serialize_end');\n return {\n type: 'update',\n body: {\n revisionId: revision.id,\n isInitialUpdate: options.isInitialUpdate,\n ...hmrUpdate,\n },\n };\n } catch (error: any) {\n const formattedError = formatBundlingError(error);\n this._config.reporter.update({\n type: 'bundling_error',\n error,\n });\n return {\n type: 'error',\n body: formattedError,\n };\n }\n };\n }\n\n return {\n metro,\n hmrServer,\n server,\n middleware,\n messageSocket: messagesSocket,\n };\n}\n\n// TODO: Fork the entire transform function so we can simply regex the file contents for keywords instead.\nfunction pruneCustomTransformOptions(\n projectRoot: string,\n filePath: string,\n transformOptions: TransformOptions\n): TransformOptions {\n // Normalize the filepath for cross platform checking.\n filePath = filePath.split(path.sep).join('/');\n\n if (\n transformOptions.customTransformOptions?.dom &&\n // The only generated file that needs the dom root is `expo/dom/entry.js`\n !filePath.match(/expo\\/dom\\/entry\\.js$/)\n ) {\n // Clear the dom root option if we aren't transforming the magic entry file, this ensures\n // that cached artifacts from other DOM component bundles can be reused.\n transformOptions.customTransformOptions.dom = 'true';\n }\n\n const routerRoot = transformOptions.customTransformOptions?.routerRoot;\n if (typeof routerRoot === 'string') {\n const isRouterEntry = /\\/expo-router\\/_ctx/.test(filePath);\n // The router root is used all over expo-router (`process.env.EXPO_ROUTER_ABS_APP_ROOT`, `process.env.EXPO_ROUTER_APP_ROOT`) so we'll just ignore the entire package.\n const isRouterModule = /\\/expo-router\\/build\\//.test(filePath);\n // Any page/router inside the expo-router app folder may access the `routerRoot` option to determine whether it's in the app folder\n const resolvedRouterRoot = path.resolve(projectRoot, routerRoot).split(path.sep).join('/');\n const isRouterRoute = path.isAbsolute(filePath) && filePath.startsWith(resolvedRouterRoot);\n\n // In any other file than the above, we enforce that we mustn't use `routerRoot`, and set it to an arbitrary value here (the default)\n // to ensure that the cache never invalidates when this value is changed\n if (!isRouterEntry && !isRouterModule && !isRouterRoute) {\n transformOptions.customTransformOptions!.routerRoot = 'app';\n }\n }\n\n if (\n transformOptions.customTransformOptions?.asyncRoutes &&\n // The async routes settings are also used in `expo-router/_ctx.ios.js` (and other platform variants) via `process.env.EXPO_ROUTER_IMPORT_MODE`\n !(filePath.match(/\\/expo-router\\/_ctx/) || filePath.match(/\\/expo-router\\/build\\//))\n ) {\n delete transformOptions.customTransformOptions.asyncRoutes;\n }\n\n if (\n transformOptions.customTransformOptions?.clientBoundaries &&\n // The client boundaries are only used in `expo/virtual/rsc.js` for production RSC exports.\n !filePath.match(/\\/expo\\/virtual\\/rsc\\.js$/)\n ) {\n delete transformOptions.customTransformOptions.clientBoundaries;\n }\n\n return transformOptions;\n}\n\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["event","instantiateMetroAsync","isWatchEnabled","loadMetroConfigAsync","events","t","asWritable","input","LogRespectingTerminal","Terminal","constructor","stream","ttyPrint","sendLog","msg","length","log","format","args","flush","console","info","terminal","process","stdout","projectRoot","options","exp","isExporting","getMetroBundler","config","reportEvent","serverRoot","getMetroServerRoot","isWorkspace","autolinkingModuleResolutionEnabled","experiments","autolinkingModuleResolution","serverActionsEnabled","reactServerFunctions","env","EXPO_UNSTABLE_SERVER_FUNCTIONS","serverComponentsEnabled","reactServerComponentRoutes","EXPO_USE_METRO_REQUIRE","reactCanary","Log","warn","terminalReporter","MetroTerminalReporter","configPath","EXPO_OVERRIDE_METRO_CONFIG","undefined","resolvedConfig","resolveConfig","defaultConfig","getDefaultConfig","isEmpty","mergeConfig","resetCache","maxWorkers","server","port","watchFolders","includes","reporter","update","resolver","useWatchman","globalThis","__requireCycleIgnorePatterns","requireCycleIgnorePatterns","transformer","publicPath","baseUrl","platformBundlers","getPlatformBundlers","reduceLogs","shouldReduceLogs","reactCompilerEnabled","reactCompiler","chalk","gray","EXPO_UNSTABLE_TREE_SHAKING","EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH","CommandError","EXPO_UNSTABLE_LOG_BOX","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","isAutolinkingResolverEnabled","isNamedRequiresEnabled","isReactServerComponentsEnabled","path","exporting","flags","serverActions","serverComponents","optimizeGraph","treeshaking","logbox","setEventReporter","logger","metroBundler","getConfig","skipSDKVersionRequirement","metroConfig","metro","getBundler","serverBaseUrl","getUrlCreator","constructUrl","scheme","hostType","middleware","messagesSocket","eventsSocket","websocketEndpoints","createMetroMiddleware","prependMiddleware","createCorsMiddleware","debugMiddleware","debugWebsocketEndpoints","createDebugMiddleware","Object","assign","use","createJsInspectorMiddleware","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","devtoolsWebsocketEndpoints","createDevToolsPluginWebsocketEndpoint","attachAtlasAsync","resetAtlasFile","tls","secureServerOptions","key","cert","ca","requestCert","address","hmrServer","runServer","host","watch","mockServer","atlas","EXPO_ATLAS","workers","originalTransformFile","transformFile","bind","filePath","transformOptions","fileBuffer","pruneCustomTransformOptions","customTransformOptions","__proto__","reportMetroEvent","_getSortedModules","graph","modules","dependencies","values","ctx","platform","environment","module","_createModuleId","sort","a","b","hmrJSBundle","require","default","_prepareMessage","group","changeEvent","isInitialUpdate","revision","revPromise","_bundler","getRevision","revisionId","type","body","formatBundlingError","RevisionNotFoundError","point","delta","updateGraph","_clientGroups","delete","id","client","clients","revisionIds","filter","push","set","moduleIdContext","hmrUpdate","clientUrl","createModuleId","moduleId","includeAsyncPaths","graphOptions","lazy","_config","unstable_serverRoot","error","formattedError","messageSocket","split","sep","join","dom","match","routerRoot","isRouterEntry","test","isRouterModule","resolvedRouterRoot","resolve","isRouterRoute","isAbsolute","startsWith","asyncRoutes","clientBoundaries","CI"],"mappings":"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"}
|
|
@@ -313,7 +313,9 @@ async function getErrorOverlayHtmlAsync({ error, projectRoot, routerRoot }) {
|
|
|
313
313
|
log
|
|
314
314
|
]
|
|
315
315
|
};
|
|
316
|
-
|
|
316
|
+
// Escape `<` so error contents like `</script>` cannot break out of the embedded JSON block.
|
|
317
|
+
const serializedLogBox = JSON.stringify(logBoxContext).replace(/</g, '\\u003c');
|
|
318
|
+
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">${serializedLogBox}</script></body></html>`;
|
|
317
319
|
// TODO: We could reuse the pre-built DOM Log Box from @expo/log-box
|
|
318
320
|
const errorOverlayEntry = await (0, _getStaticRenderFunctions.createMetroEndpointAsync)(projectRoot, // Keep the URL relative
|
|
319
321
|
'', (0, _resolvefrom().default)(projectRoot, 'expo-router/_error'), {
|
|
@@ -327,7 +329,8 @@ async function getErrorOverlayHtmlAsync({ error, projectRoot, routerRoot }) {
|
|
|
327
329
|
isExporting: false,
|
|
328
330
|
reactCompiler: false
|
|
329
331
|
});
|
|
330
|
-
const
|
|
332
|
+
const escapedSrc = errorOverlayEntry.replace(/&/g, '&').replace(/"/g, '"');
|
|
333
|
+
const htmlWithJs = html.replace('</body>', `<script src="${escapedSrc}"></script></body>`);
|
|
331
334
|
return htmlWithJs;
|
|
332
335
|
}
|
|
333
336
|
function parseErrorStack(projectRoot, stack) {
|
|
@@ -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 = (\n err: unknown,\n importStack = nearestImportStack(err)\n) => {\n // Space out build failures.\n if (err instanceof Error && importStack) {\n err.message += '\\n\\n' + importStack;\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","importStack","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 { 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 // Escape `<` so error contents like `</script>` cannot break out of the embedded JSON block.\n const serializedLogBox = JSON.stringify(logBoxContext).replace(/</g, '\\\\u003c');\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\">${serializedLogBox}</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 escapedSrc = errorOverlayEntry.replace(/&/g, '&').replace(/\"/g, '"');\n const htmlWithJs = html.replace('</body>', `<script src=\"${escapedSrc}\"></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 = (\n err: unknown,\n importStack = nearestImportStack(err)\n) => {\n // Space out build failures.\n if (err instanceof Error && importStack) {\n err.message += '\\n\\n' + importStack;\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","serializedLogBox","JSON","stringify","replace","html","errorOverlayEntry","createMetroEndpointAsync","resolveFrom","mode","platform","minify","optimize","usedExports","baseUrl","isExporting","reactCompiler","escapedSrc","htmlWithJs","isArray","serverRoot","getMetroServerRoot","parse","file","startsWith","includes","canParse","relative","url","URL","err","Error","clean","stripVTControlCharacters","importStack","root","undefined","_expoImportStack","cause"],"mappings":"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"}
|
|
@@ -59,6 +59,9 @@ function _interop_require_default(obj) {
|
|
|
59
59
|
};
|
|
60
60
|
}
|
|
61
61
|
const debug = require('debug')('expo:start:server:middleware:interstitialPage');
|
|
62
|
+
function escapeHtml(value) {
|
|
63
|
+
return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
|
|
64
|
+
}
|
|
62
65
|
const LoadingEndpoint = '/_expo/loading';
|
|
63
66
|
class InterstitialPageMiddleware extends _ExpoMiddleware.ExpoMiddleware {
|
|
64
67
|
constructor(projectRoot, options = {
|
|
@@ -73,11 +76,11 @@ class InterstitialPageMiddleware extends _ExpoMiddleware.ExpoMiddleware {
|
|
|
73
76
|
_resolvefrom().default.silent(this.projectRoot, 'expo/static/loading-page/index.html') ?? // Development: This will resolve when testing locally.
|
|
74
77
|
_path().default.resolve(__dirname, '../../../../../static/loading-page/index.html');
|
|
75
78
|
let content = (await (0, _promises().readFile)(templatePath)).toString('utf-8');
|
|
76
|
-
content = content.replace(/{{\s*AppName\s*}}/, appName);
|
|
77
|
-
content = content.replace(/{{\s*Path\s*}}/, this.projectRoot);
|
|
78
|
-
content = content.replace(/{{\s*Scheme\s*}}/, this.options.scheme ?? 'Unknown');
|
|
79
|
+
content = content.replace(/{{\s*AppName\s*}}/, escapeHtml(appName));
|
|
80
|
+
content = content.replace(/{{\s*Path\s*}}/, escapeHtml(this.projectRoot));
|
|
81
|
+
content = content.replace(/{{\s*Scheme\s*}}/, escapeHtml(this.options.scheme ?? 'Unknown'));
|
|
79
82
|
content = content.replace(/{{\s*ProjectVersionType\s*}}/, `${projectVersion.type === 'sdk' ? 'SDK' : 'Runtime'} version`);
|
|
80
|
-
content = content.replace(/{{\s*ProjectVersion\s*}}/, projectVersion.version ?? 'Undetected');
|
|
83
|
+
content = content.replace(/{{\s*ProjectVersion\s*}}/, escapeHtml(projectVersion.version ?? 'Undetected'));
|
|
81
84
|
return content;
|
|
82
85
|
}
|
|
83
86
|
/** Get settings for the page from the project config. */ async _getProjectOptionsAsync(platform) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/InterstitialPageMiddleware.ts"],"sourcesContent":["import { getConfig, getNameFromConfig } from '@expo/config';\nimport { getRuntimeVersionNullableAsync } from '@expo/config-plugins/build/utils/Updates';\nimport { readFile } from 'fs/promises';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { disableResponseCache, ExpoMiddleware } from './ExpoMiddleware';\nimport {\n assertMissingRuntimePlatform,\n assertRuntimePlatform,\n parsePlatformHeader,\n resolvePlatformFromUserAgentHeader,\n RuntimePlatform,\n} from './resolvePlatform';\nimport { ServerRequest, ServerResponse } from './server.types';\n\ntype ProjectVersion = {\n type: 'sdk' | 'runtime';\n version: string | null;\n};\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:interstitialPage'\n) as typeof console.log;\n\nexport const LoadingEndpoint = '/_expo/loading';\n\nexport class InterstitialPageMiddleware extends ExpoMiddleware {\n constructor(\n projectRoot: string,\n protected options: { scheme: string | null } = { scheme: null }\n ) {\n super(projectRoot, [LoadingEndpoint]);\n }\n\n /** Get the template HTML page and inject values. */\n async _getPageAsync({\n appName,\n projectVersion,\n }: {\n appName: string;\n projectVersion: ProjectVersion;\n }): Promise<string> {\n const templatePath =\n // Production: This will resolve when installed in the project.\n resolveFrom.silent(this.projectRoot, 'expo/static/loading-page/index.html') ??\n // Development: This will resolve when testing locally.\n path.resolve(__dirname, '../../../../../static/loading-page/index.html');\n let content = (await readFile(templatePath)).toString('utf-8');\n\n content = content.replace(/{{\\s*AppName\\s*}}/, appName);\n content = content.replace(/{{\\s*Path\\s*}}/, this.projectRoot);\n content = content.replace(/{{\\s*Scheme\\s*}}/, this.options.scheme ?? 'Unknown');\n content = content.replace(\n /{{\\s*ProjectVersionType\\s*}}/,\n `${projectVersion.type === 'sdk' ? 'SDK' : 'Runtime'} version`\n );\n content = content.replace(/{{\\s*ProjectVersion\\s*}}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/middleware/InterstitialPageMiddleware.ts"],"sourcesContent":["import { getConfig, getNameFromConfig } from '@expo/config';\nimport { getRuntimeVersionNullableAsync } from '@expo/config-plugins/build/utils/Updates';\nimport { readFile } from 'fs/promises';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { disableResponseCache, ExpoMiddleware } from './ExpoMiddleware';\nimport {\n assertMissingRuntimePlatform,\n assertRuntimePlatform,\n parsePlatformHeader,\n resolvePlatformFromUserAgentHeader,\n RuntimePlatform,\n} from './resolvePlatform';\nimport { ServerRequest, ServerResponse } from './server.types';\n\ntype ProjectVersion = {\n type: 'sdk' | 'runtime';\n version: string | null;\n};\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:interstitialPage'\n) as typeof console.log;\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport const LoadingEndpoint = '/_expo/loading';\n\nexport class InterstitialPageMiddleware extends ExpoMiddleware {\n constructor(\n projectRoot: string,\n protected options: { scheme: string | null } = { scheme: null }\n ) {\n super(projectRoot, [LoadingEndpoint]);\n }\n\n /** Get the template HTML page and inject values. */\n async _getPageAsync({\n appName,\n projectVersion,\n }: {\n appName: string;\n projectVersion: ProjectVersion;\n }): Promise<string> {\n const templatePath =\n // Production: This will resolve when installed in the project.\n resolveFrom.silent(this.projectRoot, 'expo/static/loading-page/index.html') ??\n // Development: This will resolve when testing locally.\n path.resolve(__dirname, '../../../../../static/loading-page/index.html');\n let content = (await readFile(templatePath)).toString('utf-8');\n\n content = content.replace(/{{\\s*AppName\\s*}}/, escapeHtml(appName));\n content = content.replace(/{{\\s*Path\\s*}}/, escapeHtml(this.projectRoot));\n content = content.replace(/{{\\s*Scheme\\s*}}/, escapeHtml(this.options.scheme ?? 'Unknown'));\n content = content.replace(\n /{{\\s*ProjectVersionType\\s*}}/,\n `${projectVersion.type === 'sdk' ? 'SDK' : 'Runtime'} version`\n );\n content = content.replace(\n /{{\\s*ProjectVersion\\s*}}/,\n escapeHtml(projectVersion.version ?? 'Undetected')\n );\n\n return content;\n }\n\n /** Get settings for the page from the project config. */\n async _getProjectOptionsAsync(platform: RuntimePlatform): Promise<{\n appName: string;\n projectVersion: ProjectVersion;\n }> {\n assertRuntimePlatform(platform);\n\n const { exp } = getConfig(this.projectRoot);\n const { appName } = getNameFromConfig(exp);\n const runtimeVersion = await getRuntimeVersionNullableAsync(this.projectRoot, exp, platform);\n const sdkVersion = exp.sdkVersion ?? null;\n\n return {\n appName: appName ?? 'App',\n projectVersion:\n sdkVersion && !runtimeVersion\n ? { type: 'sdk', version: sdkVersion }\n : { type: 'runtime', version: runtimeVersion },\n };\n }\n\n async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {\n res = disableResponseCache(res);\n res.setHeader('Content-Type', 'text/html');\n\n const platform = parsePlatformHeader(req) ?? resolvePlatformFromUserAgentHeader(req);\n assertMissingRuntimePlatform(platform);\n assertRuntimePlatform(platform);\n\n const { appName, projectVersion } = await this._getProjectOptionsAsync(platform);\n debug(\n `Create loading page. (platform: ${platform}, appName: ${appName}, projectVersion: ${projectVersion.version}, type: ${projectVersion.type})`\n );\n const content = await this._getPageAsync({ appName, projectVersion });\n res.end(content);\n }\n}\n"],"names":["InterstitialPageMiddleware","LoadingEndpoint","debug","require","escapeHtml","value","replace","ExpoMiddleware","constructor","projectRoot","options","scheme","_getPageAsync","appName","projectVersion","templatePath","resolveFrom","silent","path","resolve","__dirname","content","readFile","toString","type","version","_getProjectOptionsAsync","platform","assertRuntimePlatform","exp","getConfig","getNameFromConfig","runtimeVersion","getRuntimeVersionNullableAsync","sdkVersion","handleRequestAsync","req","res","disableResponseCache","setHeader","parsePlatformHeader","resolvePlatformFromUserAgentHeader","assertMissingRuntimePlatform","end"],"mappings":";;;;;;;;;;;IAoCaA,0BAA0B;eAA1BA;;IAFAC,eAAe;eAAfA;;;;yBAlCgC;;;;;;;yBACE;;;;;;;yBACtB;;;;;;;gEACR;;;;;;;gEACO;;;;;;gCAE6B;iCAO9C;;;;;;AAQP,MAAMC,QAAQC,QAAQ,SACpB;AAGF,SAASC,WAAWC,KAAa;IAC/B,OAAOA,MACJC,OAAO,CAAC,MAAM,SACdA,OAAO,CAAC,MAAM,QACdA,OAAO,CAAC,MAAM,QACdA,OAAO,CAAC,MAAM,UACdA,OAAO,CAAC,MAAM;AACnB;AAEO,MAAML,kBAAkB;AAExB,MAAMD,mCAAmCO,8BAAc;IAC5DC,YACEC,WAAmB,EACnB,AAAUC,UAAqC;QAAEC,QAAQ;IAAK,CAAC,CAC/D;QACA,KAAK,CAACF,aAAa;YAACR;SAAgB,QAF1BS,UAAAA;IAGZ;IAEA,kDAAkD,GAClD,MAAME,cAAc,EAClBC,OAAO,EACPC,cAAc,EAIf,EAAmB;QAClB,MAAMC,eACJ,+DAA+D;QAC/DC,sBAAW,CAACC,MAAM,CAAC,IAAI,CAACR,WAAW,EAAE,0CACrC,uDAAuD;QACvDS,eAAI,CAACC,OAAO,CAACC,WAAW;QAC1B,IAAIC,UAAU,AAAC,CAAA,MAAMC,IAAAA,oBAAQ,EAACP,aAAY,EAAGQ,QAAQ,CAAC;QAEtDF,UAAUA,QAAQf,OAAO,CAAC,qBAAqBF,WAAWS;QAC1DQ,UAAUA,QAAQf,OAAO,CAAC,kBAAkBF,WAAW,IAAI,CAACK,WAAW;QACvEY,UAAUA,QAAQf,OAAO,CAAC,oBAAoBF,WAAW,IAAI,CAACM,OAAO,CAACC,MAAM,IAAI;QAChFU,UAAUA,QAAQf,OAAO,CACvB,gCACA,GAAGQ,eAAeU,IAAI,KAAK,QAAQ,QAAQ,UAAU,QAAQ,CAAC;QAEhEH,UAAUA,QAAQf,OAAO,CACvB,4BACAF,WAAWU,eAAeW,OAAO,IAAI;QAGvC,OAAOJ;IACT;IAEA,uDAAuD,GACvD,MAAMK,wBAAwBC,QAAyB,EAGpD;QACDC,IAAAA,sCAAqB,EAACD;QAEtB,MAAM,EAAEE,GAAG,EAAE,GAAGC,IAAAA,mBAAS,EAAC,IAAI,CAACrB,WAAW;QAC1C,MAAM,EAAEI,OAAO,EAAE,GAAGkB,IAAAA,2BAAiB,EAACF;QACtC,MAAMG,iBAAiB,MAAMC,IAAAA,yCAA8B,EAAC,IAAI,CAACxB,WAAW,EAAEoB,KAAKF;QACnF,MAAMO,aAAaL,IAAIK,UAAU,IAAI;QAErC,OAAO;YACLrB,SAASA,WAAW;YACpBC,gBACEoB,cAAc,CAACF,iBACX;gBAAER,MAAM;gBAAOC,SAASS;YAAW,IACnC;gBAAEV,MAAM;gBAAWC,SAASO;YAAe;QACnD;IACF;IAEA,MAAMG,mBAAmBC,GAAkB,EAAEC,GAAmB,EAAiB;QAC/EA,MAAMC,IAAAA,oCAAoB,EAACD;QAC3BA,IAAIE,SAAS,CAAC,gBAAgB;QAE9B,MAAMZ,WAAWa,IAAAA,oCAAmB,EAACJ,QAAQK,IAAAA,mDAAkC,EAACL;QAChFM,IAAAA,6CAA4B,EAACf;QAC7BC,IAAAA,sCAAqB,EAACD;QAEtB,MAAM,EAAEd,OAAO,EAAEC,cAAc,EAAE,GAAG,MAAM,IAAI,CAACY,uBAAuB,CAACC;QACvEzB,MACE,CAAC,gCAAgC,EAAEyB,SAAS,WAAW,EAAEd,QAAQ,kBAAkB,EAAEC,eAAeW,OAAO,CAAC,QAAQ,EAAEX,eAAeU,IAAI,CAAC,CAAC,CAAC;QAE9I,MAAMH,UAAU,MAAM,IAAI,CAACT,aAAa,CAAC;YAAEC;YAASC;QAAe;QACnEuB,IAAIM,GAAG,CAACtB;IACV;AACF"}
|
|
@@ -15,20 +15,6 @@ function _chalk() {
|
|
|
15
15
|
};
|
|
16
16
|
return data;
|
|
17
17
|
}
|
|
18
|
-
function _net() {
|
|
19
|
-
const data = /*#__PURE__*/ _interop_require_default(require("net"));
|
|
20
|
-
_net = function() {
|
|
21
|
-
return data;
|
|
22
|
-
};
|
|
23
|
-
return data;
|
|
24
|
-
}
|
|
25
|
-
function _tls() {
|
|
26
|
-
const data = require("tls");
|
|
27
|
-
_tls = function() {
|
|
28
|
-
return data;
|
|
29
|
-
};
|
|
30
|
-
return data;
|
|
31
|
-
}
|
|
32
18
|
function _url() {
|
|
33
19
|
const data = require("url");
|
|
34
20
|
_url = function() {
|
|
@@ -37,20 +23,26 @@ function _url() {
|
|
|
37
23
|
return data;
|
|
38
24
|
}
|
|
39
25
|
const _JsInspector = require("./JsInspector");
|
|
26
|
+
const _net = require("../../../../utils/net");
|
|
40
27
|
function _interop_require_default(obj) {
|
|
41
28
|
return obj && obj.__esModule ? obj : {
|
|
42
29
|
default: obj
|
|
43
30
|
};
|
|
44
31
|
}
|
|
45
|
-
function createJsInspectorMiddleware() {
|
|
32
|
+
function createJsInspectorMiddleware({ serverBaseUrl }) {
|
|
46
33
|
return async function(req, res, next) {
|
|
47
|
-
|
|
34
|
+
if (!(0, _net.isMatchingOrigin)(req, serverBaseUrl)) {
|
|
35
|
+
res.writeHead(403).end();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// `req.url` may be absolute-form (HTTP/1.1) — only take search params from it.
|
|
39
|
+
const { searchParams } = new (_url()).URL(req.url ?? '/', serverBaseUrl);
|
|
48
40
|
const appId = searchParams.get('appId') || searchParams.get('applicationId');
|
|
49
41
|
if (!appId) {
|
|
50
42
|
res.writeHead(400).end('Missing application identifier ("?appId=...")');
|
|
51
43
|
return;
|
|
52
44
|
}
|
|
53
|
-
const app = await (0, _JsInspector.queryInspectorAppAsync)(
|
|
45
|
+
const app = await (0, _JsInspector.queryInspectorAppAsync)(serverBaseUrl, appId);
|
|
54
46
|
if (!app) {
|
|
55
47
|
res.writeHead(404).end('Unable to find inspector target from @react-native/dev-middleware');
|
|
56
48
|
console.warn(_chalk().default.yellow('No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine.'));
|
|
@@ -65,8 +57,12 @@ function createJsInspectorMiddleware() {
|
|
|
65
57
|
});
|
|
66
58
|
res.end(data);
|
|
67
59
|
} else if (req.method === 'POST' || req.method === 'PUT') {
|
|
60
|
+
if ((0, _net.shouldThrottleRemoteDevCall)()) {
|
|
61
|
+
res.writeHead(429).end();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
68
64
|
try {
|
|
69
|
-
await (0, _JsInspector.openJsInspector)(
|
|
65
|
+
await (0, _JsInspector.openJsInspector)(serverBaseUrl, app);
|
|
70
66
|
} catch (error) {
|
|
71
67
|
// abort(Error: Command failed: osascript -e POSIX path of (path to application "google chrome")
|
|
72
68
|
// 15:50: execution error: Google Chrome got an error: Application isn’t running. (-600)
|
|
@@ -81,11 +77,5 @@ function createJsInspectorMiddleware() {
|
|
|
81
77
|
}
|
|
82
78
|
};
|
|
83
79
|
}
|
|
84
|
-
function getServerBase(req) {
|
|
85
|
-
const scheme = req.socket instanceof _tls().TLSSocket && req.socket.encrypted === true ? 'https' : 'http';
|
|
86
|
-
const { localAddress, localPort } = req.socket;
|
|
87
|
-
const address = localAddress && _net().default.isIPv6(localAddress) ? `[${localAddress}]` : localAddress;
|
|
88
|
-
return `${scheme}:${address}:${localPort}`;
|
|
89
|
-
}
|
|
90
80
|
|
|
91
81
|
//# sourceMappingURL=createJsInspectorMiddleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/createJsInspectorMiddleware.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { NextHandleFunction } from 'connect';\nimport type { IncomingMessage, ServerResponse } from 'http';\nimport
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/createJsInspectorMiddleware.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { NextHandleFunction } from 'connect';\nimport type { IncomingMessage, ServerResponse } from 'http';\nimport { URL } from 'url';\n\nimport { openJsInspector, queryInspectorAppAsync } from './JsInspector';\nimport { isMatchingOrigin, shouldThrottleRemoteDevCall } from '../../../../utils/net';\n\ninterface JsInspectorMiddlewareOptions {\n serverBaseUrl: string;\n}\n\n/**\n * Create a middleware that handles new requests to open the debugger from the dev menu.\n * @todo(cedric): delete this middleware once we fully swap over to the new React Native JS Inspector.\n */\nexport function createJsInspectorMiddleware({\n serverBaseUrl,\n}: JsInspectorMiddlewareOptions): NextHandleFunction {\n return async function (req: IncomingMessage, res: ServerResponse, next: (err?: Error) => void) {\n if (!isMatchingOrigin(req, serverBaseUrl)) {\n res.writeHead(403).end();\n return;\n }\n\n // `req.url` may be absolute-form (HTTP/1.1) — only take search params from it.\n const { searchParams } = new URL(req.url ?? '/', serverBaseUrl);\n const appId = searchParams.get('appId') || searchParams.get('applicationId');\n if (!appId) {\n res.writeHead(400).end('Missing application identifier (\"?appId=...\")');\n return;\n }\n\n const app = await queryInspectorAppAsync(serverBaseUrl, appId);\n if (!app) {\n res.writeHead(404).end('Unable to find inspector target from @react-native/dev-middleware');\n console.warn(\n chalk.yellow(\n 'No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine.'\n )\n );\n return;\n }\n\n if (req.method === 'GET') {\n const data = JSON.stringify(app);\n res.writeHead(200, {\n 'Content-Type': 'application/json; charset=UTF-8',\n 'Cache-Control': 'no-cache',\n 'Content-Length': data.length.toString(),\n });\n res.end(data);\n } else if (req.method === 'POST' || req.method === 'PUT') {\n if (shouldThrottleRemoteDevCall()) {\n res.writeHead(429).end();\n return;\n }\n try {\n await openJsInspector(serverBaseUrl, app);\n } catch (error: any) {\n // abort(Error: Command failed: osascript -e POSIX path of (path to application \"google chrome\")\n // 15:50: execution error: Google Chrome got an error: Application isn’t running. (-600)\n\n console.error(\n chalk.red('Error launching JS inspector: ' + (error?.message ?? 'Unknown error occurred'))\n );\n res.writeHead(500);\n res.end();\n return;\n }\n res.end();\n } else {\n res.writeHead(405);\n }\n };\n}\n"],"names":["createJsInspectorMiddleware","serverBaseUrl","req","res","next","isMatchingOrigin","writeHead","end","searchParams","URL","url","appId","get","app","queryInspectorAppAsync","console","warn","chalk","yellow","method","data","JSON","stringify","length","toString","shouldThrottleRemoteDevCall","openJsInspector","error","red","message"],"mappings":";;;;+BAgBgBA;;;eAAAA;;;;gEAhBE;;;;;;;yBAGE;;;;;;6BAEoC;qBACM;;;;;;AAUvD,SAASA,4BAA4B,EAC1CC,aAAa,EACgB;IAC7B,OAAO,eAAgBC,GAAoB,EAAEC,GAAmB,EAAEC,IAA2B;QAC3F,IAAI,CAACC,IAAAA,qBAAgB,EAACH,KAAKD,gBAAgB;YACzCE,IAAIG,SAAS,CAAC,KAAKC,GAAG;YACtB;QACF;QAEA,+EAA+E;QAC/E,MAAM,EAAEC,YAAY,EAAE,GAAG,IAAIC,CAAAA,MAAE,KAAC,CAACP,IAAIQ,GAAG,IAAI,KAAKT;QACjD,MAAMU,QAAQH,aAAaI,GAAG,CAAC,YAAYJ,aAAaI,GAAG,CAAC;QAC5D,IAAI,CAACD,OAAO;YACVR,IAAIG,SAAS,CAAC,KAAKC,GAAG,CAAC;YACvB;QACF;QAEA,MAAMM,MAAM,MAAMC,IAAAA,mCAAsB,EAACb,eAAeU;QACxD,IAAI,CAACE,KAAK;YACRV,IAAIG,SAAS,CAAC,KAAKC,GAAG,CAAC;YACvBQ,QAAQC,IAAI,CACVC,gBAAK,CAACC,MAAM,CACV;YAGJ;QACF;QAEA,IAAIhB,IAAIiB,MAAM,KAAK,OAAO;YACxB,MAAMC,OAAOC,KAAKC,SAAS,CAACT;YAC5BV,IAAIG,SAAS,CAAC,KAAK;gBACjB,gBAAgB;gBAChB,iBAAiB;gBACjB,kBAAkBc,KAAKG,MAAM,CAACC,QAAQ;YACxC;YACArB,IAAII,GAAG,CAACa;QACV,OAAO,IAAIlB,IAAIiB,MAAM,KAAK,UAAUjB,IAAIiB,MAAM,KAAK,OAAO;YACxD,IAAIM,IAAAA,gCAA2B,KAAI;gBACjCtB,IAAIG,SAAS,CAAC,KAAKC,GAAG;gBACtB;YACF;YACA,IAAI;gBACF,MAAMmB,IAAAA,4BAAe,EAACzB,eAAeY;YACvC,EAAE,OAAOc,OAAY;gBACnB,gGAAgG;gBAChG,wFAAwF;gBAExFZ,QAAQY,KAAK,CACXV,gBAAK,CAACW,GAAG,CAAC,mCAAoCD,CAAAA,CAAAA,yBAAAA,MAAOE,OAAO,KAAI,wBAAuB;gBAEzF1B,IAAIG,SAAS,CAAC;gBACdH,IAAII,GAAG;gBACP;YACF;YACAJ,IAAII,GAAG;QACT,OAAO;YACLJ,IAAIG,SAAS,CAAC;QAChB;IACF;AACF"}
|
|
@@ -118,8 +118,14 @@ const DEVELOPMENT_CODE_SIGNING_SETTINGS_FILE_NAME = 'development-code-signing-se
|
|
|
118
118
|
function getDevelopmentCodeSigningDirectory() {
|
|
119
119
|
return _path().default.join((0, _UserSettings.getExpoHomeDirectory)(), 'codesigning');
|
|
120
120
|
}
|
|
121
|
+
function assertBasenameValue(input) {
|
|
122
|
+
if (!input || input === '.' || input === '..' || input !== _path().default.basename(input)) {
|
|
123
|
+
throw new _errors.CommandError('Invalid EAS project ID for development code signing cache');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
121
126
|
function getProjectDevelopmentCodeSigningInfoFile(defaults) {
|
|
122
127
|
function getFile(easProjectId) {
|
|
128
|
+
assertBasenameValue(easProjectId);
|
|
123
129
|
const filePath = _path().default.join(getDevelopmentCodeSigningDirectory(), easProjectId, DEVELOPMENT_CODE_SIGNING_SETTINGS_FILE_NAME);
|
|
124
130
|
return new (_jsonfile()).default(filePath);
|
|
125
131
|
}
|