@expo/cli 0.19.2 → 0.19.4

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/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  </a>
7
7
  </p>
8
8
 
9
- <p align="center">The fastest way to build and run universal React Native apps for iOS, Android, and the web</p>
9
+ <p align="center">The fastest way to build and run universal React Native apps for Android, iOS, and the web</p>
10
10
 
11
11
  <p align="center">
12
12
 
package/build/bin/cli CHANGED
@@ -120,7 +120,7 @@ const args = (0, _arg().default)({
120
120
  });
121
121
  if (args["--version"]) {
122
122
  // Version is added in the build script.
123
- console.log("0.19.2");
123
+ console.log("0.19.4");
124
124
  process.exit(0);
125
125
  }
126
126
  if (args["--non-interactive"]) {
@@ -86,7 +86,7 @@ function createClientMessageHandler(socket, clientId, clients, broadcast) {
86
86
  if (!message) return;
87
87
  // Handle broadcast messages
88
88
  if (messageIsBroadcast(message)) {
89
- return broadcast(null, data);
89
+ return broadcast(null, data.toString());
90
90
  }
91
91
  // Handle incoming requests from clients
92
92
  if (messageIsRequest(message)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/start/server/metro/dev-server/createMessageSocket.ts"],"sourcesContent":["import { parse } from 'node:url';\nimport { type WebSocket, WebSocketServer, type RawData as WebSocketRawData } from 'ws';\n\nimport { createBroadcaster } from './utils/createSocketBroadcaster';\nimport { createSocketMap, type SocketId } from './utils/createSocketMap';\nimport { parseRawMessage, serializeMessage } from './utils/socketMessages';\n\ntype MessageSocketOptions = {\n logger: {\n warn: (message: string) => any;\n };\n};\n\n/**\n * Client \"command\" server that dispatches basic commands to connected clients.\n * This basic client to client communication, reload, or open dev menu cli commands.\n */\nexport function createMessagesSocket(options: MessageSocketOptions) {\n const clients = createSocketMap();\n const broadcast = createBroadcaster(clients.map);\n\n const server = new WebSocketServer({ noServer: true });\n\n server.on('connection', (socket, req) => {\n const client = clients.registerSocket(socket);\n\n // Assign the query parameters to the socket, used for `getpeers` requests\n // NOTE(cedric): this looks like a legacy feature, might be able to drop it\n if (req.url) {\n Object.defineProperty(socket, '_upgradeQuery', {\n value: parse(req.url).query,\n });\n }\n\n // Register disconnect handlers\n socket.on('close', client.terminate);\n socket.on('error', client.terminate);\n // Register message handler\n socket.on('message', createClientMessageHandler(socket, client.id, clients, broadcast));\n });\n\n return {\n endpoint: '/message' as const,\n server,\n broadcast: (method: BroadcastMessage['method'], params?: BroadcastMessage['params']) => {\n if (clients.map.size === 0) {\n return options.logger.warn(\n `No apps connected. Sending \"${method}\" to all React Native apps failed. Make sure your app is running in the simulator or on a phone connected via USB.`\n );\n }\n\n broadcast(null, serializeMessage({ method, params }));\n },\n };\n}\n\nfunction createClientMessageHandler(\n socket: WebSocket,\n clientId: SocketId,\n clients: ReturnType<typeof createSocketMap>,\n broadcast: ReturnType<typeof createBroadcaster>\n) {\n function handleServerRequest(message: RequestMessage) {\n // Ignore messages without identifiers, unable to link responses\n if (!message.id) return;\n\n if (message.method === 'getid') {\n return socket.send(serializeMessage({ id: message.id, result: clientId }));\n }\n\n if (message.method === 'getpeers') {\n const peers: Record<string, any> = {};\n clients.map.forEach((peerSocket, peerSocketId) => {\n if (peerSocketId !== clientId) {\n peers[peerSocketId] = '_upgradeQuery' in peerSocket ? peerSocket._upgradeQuery : {};\n }\n });\n return socket.send(serializeMessage({ id: message.id, result: peers }));\n }\n }\n\n return (data: WebSocketRawData, isBinary: boolean) => {\n const message = parseRawMessage<IncomingMessage>(data, isBinary);\n if (!message) return;\n\n // Handle broadcast messages\n if (messageIsBroadcast(message)) {\n return broadcast(null, data);\n }\n\n // Handle incoming requests from clients\n if (messageIsRequest(message)) {\n if (message.target === 'server') {\n return handleServerRequest(message);\n }\n\n return clients.findSocket(message.target)?.send(\n serializeMessage({\n method: message.method,\n params: message.params,\n id: !message.id\n ? undefined\n : {\n requestId: message.id,\n clientId,\n },\n })\n );\n }\n\n // Handle incoming responses\n if (messageIsResponse(message)) {\n return clients.findSocket(message.id.clientId)?.send(\n serializeMessage({\n id: message.id.requestId,\n result: message.result,\n error: message.error,\n })\n );\n }\n };\n}\n\ntype MessageId = {\n requestId: string;\n clientId: SocketId;\n};\n\ntype IncomingMessage = BroadcastMessage | RequestMessage | ResponseMessage;\n\ntype BroadcastMessage = {\n method: string;\n params?: Record<string, any>;\n};\n\ntype RequestMessage = {\n method: string;\n params?: Record<string, any>;\n target: string;\n id?: string;\n};\n\ntype ResponseMessage = {\n result?: any;\n error?: Error;\n id: MessageId;\n};\n\nfunction messageIsBroadcast(message: IncomingMessage): message is BroadcastMessage {\n return (\n 'method' in message &&\n typeof message.method === 'string' &&\n (!('id' in message) || message.id === undefined) &&\n (!('target' in message) || message.target === undefined)\n );\n}\n\nfunction messageIsRequest(message: IncomingMessage): message is RequestMessage {\n return (\n 'method' in message &&\n typeof message.method === 'string' &&\n 'target' in message &&\n typeof message.target === 'string'\n );\n}\n\nfunction messageIsResponse(message: IncomingMessage): message is ResponseMessage {\n return (\n 'id' in message &&\n typeof message.id === 'object' &&\n typeof message.id.requestId !== 'undefined' &&\n typeof message.id.clientId === 'string' &&\n (('result' in message && !!message.result) || ('error' in message && !!message.error))\n );\n}\n"],"names":["createMessagesSocket","options","clients","createSocketMap","broadcast","createBroadcaster","map","server","WebSocketServer","noServer","on","socket","req","client","registerSocket","url","Object","defineProperty","value","parse","query","terminate","createClientMessageHandler","id","endpoint","method","params","size","logger","warn","serializeMessage","clientId","handleServerRequest","message","send","result","peers","forEach","peerSocket","peerSocketId","_upgradeQuery","data","isBinary","parseRawMessage","messageIsBroadcast","messageIsRequest","target","findSocket","undefined","requestId","messageIsResponse","error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/start/server/metro/dev-server/createMessageSocket.ts"],"sourcesContent":["import { parse } from 'node:url';\nimport { type WebSocket, WebSocketServer, type RawData as WebSocketRawData } from 'ws';\n\nimport { createBroadcaster } from './utils/createSocketBroadcaster';\nimport { createSocketMap, type SocketId } from './utils/createSocketMap';\nimport { parseRawMessage, serializeMessage } from './utils/socketMessages';\n\ntype MessageSocketOptions = {\n logger: {\n warn: (message: string) => any;\n };\n};\n\n/**\n * Client \"command\" server that dispatches basic commands to connected clients.\n * This basic client to client communication, reload, or open dev menu cli commands.\n */\nexport function createMessagesSocket(options: MessageSocketOptions) {\n const clients = createSocketMap();\n const broadcast = createBroadcaster(clients.map);\n\n const server = new WebSocketServer({ noServer: true });\n\n server.on('connection', (socket, req) => {\n const client = clients.registerSocket(socket);\n\n // Assign the query parameters to the socket, used for `getpeers` requests\n // NOTE(cedric): this looks like a legacy feature, might be able to drop it\n if (req.url) {\n Object.defineProperty(socket, '_upgradeQuery', {\n value: parse(req.url).query,\n });\n }\n\n // Register disconnect handlers\n socket.on('close', client.terminate);\n socket.on('error', client.terminate);\n // Register message handler\n socket.on('message', createClientMessageHandler(socket, client.id, clients, broadcast));\n });\n\n return {\n endpoint: '/message' as const,\n server,\n broadcast: (method: BroadcastMessage['method'], params?: BroadcastMessage['params']) => {\n if (clients.map.size === 0) {\n return options.logger.warn(\n `No apps connected. Sending \"${method}\" to all React Native apps failed. Make sure your app is running in the simulator or on a phone connected via USB.`\n );\n }\n\n broadcast(null, serializeMessage({ method, params }));\n },\n };\n}\n\nfunction createClientMessageHandler(\n socket: WebSocket,\n clientId: SocketId,\n clients: ReturnType<typeof createSocketMap>,\n broadcast: ReturnType<typeof createBroadcaster>\n) {\n function handleServerRequest(message: RequestMessage) {\n // Ignore messages without identifiers, unable to link responses\n if (!message.id) return;\n\n if (message.method === 'getid') {\n return socket.send(serializeMessage({ id: message.id, result: clientId }));\n }\n\n if (message.method === 'getpeers') {\n const peers: Record<string, any> = {};\n clients.map.forEach((peerSocket, peerSocketId) => {\n if (peerSocketId !== clientId) {\n peers[peerSocketId] = '_upgradeQuery' in peerSocket ? peerSocket._upgradeQuery : {};\n }\n });\n return socket.send(serializeMessage({ id: message.id, result: peers }));\n }\n }\n\n return (data: WebSocketRawData, isBinary: boolean) => {\n const message = parseRawMessage<IncomingMessage>(data, isBinary);\n if (!message) return;\n\n // Handle broadcast messages\n if (messageIsBroadcast(message)) {\n return broadcast(null, data.toString());\n }\n\n // Handle incoming requests from clients\n if (messageIsRequest(message)) {\n if (message.target === 'server') {\n return handleServerRequest(message);\n }\n\n return clients.findSocket(message.target)?.send(\n serializeMessage({\n method: message.method,\n params: message.params,\n id: !message.id\n ? undefined\n : {\n requestId: message.id,\n clientId,\n },\n })\n );\n }\n\n // Handle incoming responses\n if (messageIsResponse(message)) {\n return clients.findSocket(message.id.clientId)?.send(\n serializeMessage({\n id: message.id.requestId,\n result: message.result,\n error: message.error,\n })\n );\n }\n };\n}\n\ntype MessageId = {\n requestId: string;\n clientId: SocketId;\n};\n\ntype IncomingMessage = BroadcastMessage | RequestMessage | ResponseMessage;\n\ntype BroadcastMessage = {\n method: string;\n params?: Record<string, any>;\n};\n\ntype RequestMessage = {\n method: string;\n params?: Record<string, any>;\n target: string;\n id?: string;\n};\n\ntype ResponseMessage = {\n result?: any;\n error?: Error;\n id: MessageId;\n};\n\nfunction messageIsBroadcast(message: IncomingMessage): message is BroadcastMessage {\n return (\n 'method' in message &&\n typeof message.method === 'string' &&\n (!('id' in message) || message.id === undefined) &&\n (!('target' in message) || message.target === undefined)\n );\n}\n\nfunction messageIsRequest(message: IncomingMessage): message is RequestMessage {\n return (\n 'method' in message &&\n typeof message.method === 'string' &&\n 'target' in message &&\n typeof message.target === 'string'\n );\n}\n\nfunction messageIsResponse(message: IncomingMessage): message is ResponseMessage {\n return (\n 'id' in message &&\n typeof message.id === 'object' &&\n typeof message.id.requestId !== 'undefined' &&\n typeof message.id.clientId === 'string' &&\n (('result' in message && !!message.result) || ('error' in message && !!message.error))\n );\n}\n"],"names":["createMessagesSocket","options","clients","createSocketMap","broadcast","createBroadcaster","map","server","WebSocketServer","noServer","on","socket","req","client","registerSocket","url","Object","defineProperty","value","parse","query","terminate","createClientMessageHandler","id","endpoint","method","params","size","logger","warn","serializeMessage","clientId","handleServerRequest","message","send","result","peers","forEach","peerSocket","peerSocketId","_upgradeQuery","data","isBinary","parseRawMessage","messageIsBroadcast","toString","messageIsRequest","target","findSocket","undefined","requestId","messageIsResponse","error"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/start/server/metro/dev-server/utils/createSocketBroadcaster.ts"],"sourcesContent":["import type { RawData as WebSocketRawData } from 'ws';\n\nimport type { SocketId, SocketMap } from './createSocketMap';\n\nconst debug = require('debug')('expo:metro:dev-server:broadcaster') as typeof console.log;\n\nexport function createBroadcaster(sockets: SocketMap) {\n return function broadcast(senderSocketId: SocketId | null, message: string | WebSocketRawData) {\n // Ignore if there are no connected sockets\n if (!sockets.size) return;\n\n for (const [socketId, socket] of sockets) {\n if (socketId === senderSocketId) continue;\n\n try {\n socket.send(message);\n } catch (error) {\n debug(`Failed to broadcast message to socket \"${socketId}\"`, error);\n }\n }\n };\n}\n"],"names":["createBroadcaster","debug","require","sockets","broadcast","senderSocketId","message","size","socketId","socket","send","error"],"mappings":"AAAA;;;;+BAMgBA,mBAAiB;;aAAjBA,iBAAiB;;AAFjC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,mCAAmC,CAAC,AAAsB,AAAC;AAEnF,SAASF,iBAAiB,CAACG,OAAkB,EAAE;IACpD,OAAO,SAASC,SAAS,CAACC,cAA+B,EAAEC,OAAkC,EAAE;QAC7F,2CAA2C;QAC3C,IAAI,CAACH,OAAO,CAACI,IAAI,EAAE,OAAO;QAE1B,KAAK,MAAM,CAACC,QAAQ,EAAEC,MAAM,CAAC,IAAIN,OAAO,CAAE;YACxC,IAAIK,QAAQ,KAAKH,cAAc,EAAE,SAAS;YAE1C,IAAI;gBACFI,MAAM,CAACC,IAAI,CAACJ,OAAO,CAAC,CAAC;YACvB,EAAE,OAAOK,KAAK,EAAE;gBACdV,KAAK,CAAC,CAAC,uCAAuC,EAAEO,QAAQ,CAAC,CAAC,CAAC,EAAEG,KAAK,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"sources":["../../../../../../../src/start/server/metro/dev-server/utils/createSocketBroadcaster.ts"],"sourcesContent":["import type { SocketId, SocketMap } from './createSocketMap';\n\nconst debug = require('debug')('expo:metro:dev-server:broadcaster') as typeof console.log;\n\nexport function createBroadcaster(sockets: SocketMap) {\n return function broadcast(senderSocketId: SocketId | null, message: string) {\n // Ignore if there are no connected sockets\n if (!sockets.size) return;\n\n for (const [socketId, socket] of sockets) {\n if (socketId === senderSocketId) continue;\n\n try {\n socket.send(message);\n } catch (error) {\n debug(`Failed to broadcast message to socket \"${socketId}\"`, error);\n }\n }\n };\n}\n"],"names":["createBroadcaster","debug","require","sockets","broadcast","senderSocketId","message","size","socketId","socket","send","error"],"mappings":"AAAA;;;;+BAIgBA,mBAAiB;;aAAjBA,iBAAiB;;AAFjC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,mCAAmC,CAAC,AAAsB,AAAC;AAEnF,SAASF,iBAAiB,CAACG,OAAkB,EAAE;IACpD,OAAO,SAASC,SAAS,CAACC,cAA+B,EAAEC,OAAe,EAAE;QAC1E,2CAA2C;QAC3C,IAAI,CAACH,OAAO,CAACI,IAAI,EAAE,OAAO;QAE1B,KAAK,MAAM,CAACC,QAAQ,EAAEC,MAAM,CAAC,IAAIN,OAAO,CAAE;YACxC,IAAIK,QAAQ,KAAKH,cAAc,EAAE,SAAS;YAE1C,IAAI;gBACFI,MAAM,CAACC,IAAI,CAACJ,OAAO,CAAC,CAAC;YACvB,EAAE,OAAOK,KAAK,EAAE;gBACdV,KAAK,CAAC,CAAC,uCAAuC,EAAEO,QAAQ,CAAC,CAAC,CAAC,EAAEG,KAAK,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -255,7 +255,7 @@ function pruneCustomTransformOptions(filePath, transformOptions) {
255
255
  transformOptions.customTransformOptions.routerRoot = "app";
256
256
  }
257
257
  if (((ref2 = transformOptions.customTransformOptions) == null ? void 0 : ref2.asyncRoutes) && // The async routes settings are also used in `expo-router/_ctx.ios.js` (and other platform variants) via `process.env.EXPO_ROUTER_IMPORT_MODE`
258
- !(filePath.match(/\/expo-router\/_ctx\.(ios|android|web)\.js$/) || filePath.match(/\/expo-router\/build\/import-mode\/index\.js$/))) {
258
+ !(filePath.match(/\/expo-router\/_ctx/) || filePath.match(/\/expo-router\/build\//))) {
259
259
  delete transformOptions.customTransformOptions.asyncRoutes;
260
260
  }
261
261
  if (((ref3 = transformOptions.customTransformOptions) == null ? void 0 : ref3.clientBoundaries) && // The client boundaries are only used in `expo-router/virtual-client-boundaries.js` for production RSC exports.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport { getMetroServerRoot } from '@expo/config/paths';\nimport { getDefaultConfig, LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport http from 'http';\nimport type Metro from 'metro';\nimport Bundler from 'metro/src/Bundler';\nimport type { TransformOptions } from 'metro/src/DeltaBundler/Worker';\nimport MetroHmrServer from 'metro/src/HmrServer';\nimport { loadConfig, resolveConfig, ConfigT } from 'metro-config';\nimport { Terminal } from 'metro-core';\nimport util from 'node:util';\n\nimport { createDevToolsPluginWebsocketEndpoint } from './DevToolsPluginWebsocketEndpoint';\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { attachAtlasAsync } from './debugging/attachAtlas';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\nimport { createMetroMiddleware } from './dev-server/createMetroMiddleware';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { Log } from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { createCorsMiddleware } from '../middleware/CorsMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware } from '../middleware/mutations';\nimport { getPlatformBundlers } from '../platformBundlers';\n\n// 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// Wrap terminal and polyfill console.log so we can log during bundling without breaking the indicator.\nclass LogRespectingTerminal extends Terminal {\n constructor(stream: import('node:net').Socket | import('node:stream').Writable) {\n super(stream);\n\n const sendLog = (...args: any[]) => {\n this._logLines.push(\n // format args like console.log\n util.format(...args)\n );\n this._scheduleUpdate();\n\n // Flush the logs to the terminal immediately so logs at the end of the process are not lost.\n this.flush();\n };\n\n console.log = sendLog;\n console.info = sendLog;\n }\n}\n\n// Share one instance of Terminal for all instances of Metro.\nconst terminal = new LogRespectingTerminal(process.stdout);\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp,\n isExporting,\n getMetroBundler,\n }: { exp: ExpoConfig; isExporting: boolean; getMetroBundler: () => Bundler }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n\n // NOTE: Enable all the experimental Metro flags when RSC is enabled.\n if (exp.experiments?.reactServerComponents) {\n process.env.EXPO_USE_METRO_REQUIRE = '1';\n process.env.EXPO_USE_FAST_RESOLVER = '1';\n }\n\n const serverRoot = getMetroServerRoot(projectRoot);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const hasConfig = await resolveConfig(options.config, projectRoot);\n let config: ConfigT = {\n ...(await loadConfig(\n { cwd: projectRoot, projectRoot, ...options },\n // If the project does not have a metro.config.js, then we use the default config.\n hasConfig.isEmpty ? getDefaultConfig(projectRoot) : undefined\n )),\n reporter: {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\n\n // @ts-expect-error: Set the global require cycle ignore patterns for SSR bundles. This won't work with custom global prefixes, but we don't use those.\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 // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = `/assets?export_path=${\n (exp.experiments?.baseUrl ?? '') + '/assets'\n }`;\n } else {\n // @ts-expect-error: typed as readonly\n config.transformer.publicPath = '/assets/?unstable_path=.';\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n\n if (exp.experiments?.reactCompiler) {\n Log.warn(`Experimental React Compiler is enabled.`);\n }\n\n if (env.EXPO_UNSTABLE_TREE_SHAKING && !env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n throw new CommandError(\n 'EXPO_UNSTABLE_TREE_SHAKING requires EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH to be enabled.'\n );\n }\n\n if (env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n Log.warn(`Experimental bundle optimization is enabled.`);\n }\n if (env.EXPO_UNSTABLE_TREE_SHAKING) {\n Log.warn(`Experimental tree shaking is enabled.`);\n }\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n exp,\n platformBundlers,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n isFastResolverEnabled: env.EXPO_USE_FAST_RESOLVER,\n isExporting,\n isReactCanaryEnabled:\n (exp.experiments?.reactServerComponents || exp.experiments?.reactCanary) ?? false,\n isNamedRequiresEnabled: env.EXPO_USE_METRO_REQUIRE,\n isReactServerComponentsEnabled: !!exp.experiments?.reactServerComponents,\n getMetroBundler,\n });\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: Omit<LoadOptions, 'logger'>,\n {\n isExporting,\n exp = getConfig(metroBundler.projectRoot, {\n skipSDKVersionRequirement: true,\n }).exp,\n }: { isExporting: boolean; exp?: ExpoConfig }\n): Promise<{\n metro: Metro.Server;\n hmrServer: MetroHmrServer | null;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n {\n exp,\n isExporting,\n getMetroBundler() {\n return metro.getBundler().getBundler();\n },\n }\n );\n\n // Create the core middleware stack for Metro, including websocket listeners\n const { middleware, messagesSocket, eventsSocket, websocketEndpoints } =\n createMetroMiddleware(metroConfig);\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(metroBundler);\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 // @ts-expect-error: can't mutate readonly config\n metroConfig.server.enhanceMiddleware = (metroMiddleware: any, server: Metro.Server) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n }\n\n // Attach Expo Atlas if enabled\n await attachAtlasAsync({\n isExporting,\n exp,\n projectRoot,\n middleware,\n metroConfig,\n // NOTE(cedric): reset the Atlas file once, and reuse it for static exports\n resetAtlasFile: isExporting,\n });\n\n const { server, hmrServer, metro } = await runServer(\n metroBundler,\n metroConfig,\n {\n websocketEndpoints: {\n ...websocketEndpoints,\n ...createDevToolsPluginWebsocketEndpoint(),\n },\n watch: !isExporting && isWatchEnabled(),\n },\n {\n mockServer: isExporting,\n }\n );\n\n // Patch transform file to remove inconvenient customTransformOptions which are only used in single well-known files.\n const originalTransformFile = metro\n .getBundler()\n .getBundler()\n .transformFile.bind(metro.getBundler().getBundler());\n\n metro.getBundler().getBundler().transformFile = async function (\n filePath: string,\n transformOptions: TransformOptions,\n fileBuffer?: Buffer\n ) {\n return originalTransformFile(\n filePath,\n pruneCustomTransformOptions(\n 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 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 filePath: string,\n transformOptions: TransformOptions\n): TransformOptions {\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 if (\n transformOptions.customTransformOptions?.routerRoot &&\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 !(filePath.match(/\\/expo-router\\/_ctx/) || filePath.match(/\\/expo-router\\/build\\//))\n ) {\n // Set to the default value.\n transformOptions.customTransformOptions.routerRoot = 'app';\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 !(\n filePath.match(/\\/expo-router\\/_ctx\\.(ios|android|web)\\.js$/) ||\n filePath.match(/\\/expo-router\\/build\\/import-mode\\/index\\.js$/)\n )\n ) {\n delete transformOptions.customTransformOptions.asyncRoutes;\n }\n\n if (\n transformOptions.customTransformOptions?.clientBoundaries &&\n // The client boundaries are only used in `expo-router/virtual-client-boundaries.js` for production RSC exports.\n !filePath.match(/\\/expo-router\\/virtual-client-boundaries\\.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":["loadMetroConfigAsync","instantiateMetroAsync","isWatchEnabled","LogRespectingTerminal","Terminal","constructor","stream","sendLog","args","_logLines","push","util","format","_scheduleUpdate","flush","console","log","info","terminal","process","stdout","projectRoot","options","exp","isExporting","getMetroBundler","config","reportEvent","experiments","reactServerComponents","env","EXPO_USE_METRO_REQUIRE","EXPO_USE_FAST_RESOLVER","serverRoot","getMetroServerRoot","terminalReporter","MetroTerminalReporter","hasConfig","resolveConfig","loadConfig","cwd","isEmpty","getDefaultConfig","undefined","reporter","update","event","globalThis","__requireCycleIgnorePatterns","resolver","requireCycleIgnorePatterns","transformer","publicPath","baseUrl","platformBundlers","getPlatformBundlers","reactCompiler","Log","warn","EXPO_UNSTABLE_TREE_SHAKING","EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH","CommandError","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","isFastResolverEnabled","isReactCanaryEnabled","reactCanary","isNamedRequiresEnabled","isReactServerComponentsEnabled","setEventReporter","logger","metroBundler","getConfig","skipSDKVersionRequirement","metroConfig","metro","getBundler","middleware","messagesSocket","eventsSocket","websocketEndpoints","createMetroMiddleware","prependMiddleware","createCorsMiddleware","debugMiddleware","debugWebsocketEndpoints","createDebugMiddleware","Object","assign","use","createJsInspectorMiddleware","customEnhanceMiddleware","server","enhanceMiddleware","metroMiddleware","attachAtlasAsync","resetAtlasFile","hmrServer","runServer","createDevToolsPluginWebsocketEndpoint","watch","mockServer","originalTransformFile","transformFile","bind","filePath","transformOptions","fileBuffer","pruneCustomTransformOptions","customTransformOptions","__proto__","reportMetroEvent","messageSocket","dom","match","routerRoot","asyncRoutes","clientBoundaries","CI","chalk"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport { getMetroServerRoot } from '@expo/config/paths';\nimport { getDefaultConfig, LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport http from 'http';\nimport type Metro from 'metro';\nimport Bundler from 'metro/src/Bundler';\nimport type { TransformOptions } from 'metro/src/DeltaBundler/Worker';\nimport MetroHmrServer from 'metro/src/HmrServer';\nimport { loadConfig, resolveConfig, ConfigT } from 'metro-config';\nimport { Terminal } from 'metro-core';\nimport util from 'node:util';\n\nimport { createDevToolsPluginWebsocketEndpoint } from './DevToolsPluginWebsocketEndpoint';\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { attachAtlasAsync } from './debugging/attachAtlas';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\nimport { createMetroMiddleware } from './dev-server/createMetroMiddleware';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { Log } from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { createCorsMiddleware } from '../middleware/CorsMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware } from '../middleware/mutations';\nimport { getPlatformBundlers } from '../platformBundlers';\n\n// 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// Wrap terminal and polyfill console.log so we can log during bundling without breaking the indicator.\nclass LogRespectingTerminal extends Terminal {\n constructor(stream: import('node:net').Socket | import('node:stream').Writable) {\n super(stream);\n\n const sendLog = (...args: any[]) => {\n this._logLines.push(\n // format args like console.log\n util.format(...args)\n );\n this._scheduleUpdate();\n\n // Flush the logs to the terminal immediately so logs at the end of the process are not lost.\n this.flush();\n };\n\n console.log = sendLog;\n console.info = sendLog;\n }\n}\n\n// Share one instance of Terminal for all instances of Metro.\nconst terminal = new LogRespectingTerminal(process.stdout);\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp,\n isExporting,\n getMetroBundler,\n }: { exp: ExpoConfig; isExporting: boolean; getMetroBundler: () => Bundler }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n\n // NOTE: Enable all the experimental Metro flags when RSC is enabled.\n if (exp.experiments?.reactServerComponents) {\n process.env.EXPO_USE_METRO_REQUIRE = '1';\n process.env.EXPO_USE_FAST_RESOLVER = '1';\n }\n\n const serverRoot = getMetroServerRoot(projectRoot);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const hasConfig = await resolveConfig(options.config, projectRoot);\n let config: ConfigT = {\n ...(await loadConfig(\n { cwd: projectRoot, projectRoot, ...options },\n // If the project does not have a metro.config.js, then we use the default config.\n hasConfig.isEmpty ? getDefaultConfig(projectRoot) : undefined\n )),\n reporter: {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\n\n // @ts-expect-error: Set the global require cycle ignore patterns for SSR bundles. This won't work with custom global prefixes, but we don't use those.\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 // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = `/assets?export_path=${\n (exp.experiments?.baseUrl ?? '') + '/assets'\n }`;\n } else {\n // @ts-expect-error: typed as readonly\n config.transformer.publicPath = '/assets/?unstable_path=.';\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n\n if (exp.experiments?.reactCompiler) {\n Log.warn(`Experimental React Compiler is enabled.`);\n }\n\n if (env.EXPO_UNSTABLE_TREE_SHAKING && !env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n throw new CommandError(\n 'EXPO_UNSTABLE_TREE_SHAKING requires EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH to be enabled.'\n );\n }\n\n if (env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {\n Log.warn(`Experimental bundle optimization is enabled.`);\n }\n if (env.EXPO_UNSTABLE_TREE_SHAKING) {\n Log.warn(`Experimental tree shaking is enabled.`);\n }\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n exp,\n platformBundlers,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n isFastResolverEnabled: env.EXPO_USE_FAST_RESOLVER,\n isExporting,\n isReactCanaryEnabled:\n (exp.experiments?.reactServerComponents || exp.experiments?.reactCanary) ?? false,\n isNamedRequiresEnabled: env.EXPO_USE_METRO_REQUIRE,\n isReactServerComponentsEnabled: !!exp.experiments?.reactServerComponents,\n getMetroBundler,\n });\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: Omit<LoadOptions, 'logger'>,\n {\n isExporting,\n exp = getConfig(metroBundler.projectRoot, {\n skipSDKVersionRequirement: true,\n }).exp,\n }: { isExporting: boolean; exp?: ExpoConfig }\n): Promise<{\n metro: Metro.Server;\n hmrServer: MetroHmrServer | null;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n {\n exp,\n isExporting,\n getMetroBundler() {\n return metro.getBundler().getBundler();\n },\n }\n );\n\n // Create the core middleware stack for Metro, including websocket listeners\n const { middleware, messagesSocket, eventsSocket, websocketEndpoints } =\n createMetroMiddleware(metroConfig);\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(metroBundler);\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 // @ts-expect-error: can't mutate readonly config\n metroConfig.server.enhanceMiddleware = (metroMiddleware: any, server: Metro.Server) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n }\n\n // Attach Expo Atlas if enabled\n await attachAtlasAsync({\n isExporting,\n exp,\n projectRoot,\n middleware,\n metroConfig,\n // NOTE(cedric): reset the Atlas file once, and reuse it for static exports\n resetAtlasFile: isExporting,\n });\n\n const { server, hmrServer, metro } = await runServer(\n metroBundler,\n metroConfig,\n {\n websocketEndpoints: {\n ...websocketEndpoints,\n ...createDevToolsPluginWebsocketEndpoint(),\n },\n watch: !isExporting && isWatchEnabled(),\n },\n {\n mockServer: isExporting,\n }\n );\n\n // Patch transform file to remove inconvenient customTransformOptions which are only used in single well-known files.\n const originalTransformFile = metro\n .getBundler()\n .getBundler()\n .transformFile.bind(metro.getBundler().getBundler());\n\n metro.getBundler().getBundler().transformFile = async function (\n filePath: string,\n transformOptions: TransformOptions,\n fileBuffer?: Buffer\n ) {\n return originalTransformFile(\n filePath,\n pruneCustomTransformOptions(\n 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 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 filePath: string,\n transformOptions: TransformOptions\n): TransformOptions {\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 if (\n transformOptions.customTransformOptions?.routerRoot &&\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 !(filePath.match(/\\/expo-router\\/_ctx/) || filePath.match(/\\/expo-router\\/build\\//))\n ) {\n // Set to the default value.\n transformOptions.customTransformOptions.routerRoot = 'app';\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-router/virtual-client-boundaries.js` for production RSC exports.\n !filePath.match(/\\/expo-router\\/virtual-client-boundaries\\.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":["loadMetroConfigAsync","instantiateMetroAsync","isWatchEnabled","LogRespectingTerminal","Terminal","constructor","stream","sendLog","args","_logLines","push","util","format","_scheduleUpdate","flush","console","log","info","terminal","process","stdout","projectRoot","options","exp","isExporting","getMetroBundler","config","reportEvent","experiments","reactServerComponents","env","EXPO_USE_METRO_REQUIRE","EXPO_USE_FAST_RESOLVER","serverRoot","getMetroServerRoot","terminalReporter","MetroTerminalReporter","hasConfig","resolveConfig","loadConfig","cwd","isEmpty","getDefaultConfig","undefined","reporter","update","event","globalThis","__requireCycleIgnorePatterns","resolver","requireCycleIgnorePatterns","transformer","publicPath","baseUrl","platformBundlers","getPlatformBundlers","reactCompiler","Log","warn","EXPO_UNSTABLE_TREE_SHAKING","EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH","CommandError","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","isFastResolverEnabled","isReactCanaryEnabled","reactCanary","isNamedRequiresEnabled","isReactServerComponentsEnabled","setEventReporter","logger","metroBundler","getConfig","skipSDKVersionRequirement","metroConfig","metro","getBundler","middleware","messagesSocket","eventsSocket","websocketEndpoints","createMetroMiddleware","prependMiddleware","createCorsMiddleware","debugMiddleware","debugWebsocketEndpoints","createDebugMiddleware","Object","assign","use","createJsInspectorMiddleware","customEnhanceMiddleware","server","enhanceMiddleware","metroMiddleware","attachAtlasAsync","resetAtlasFile","hmrServer","runServer","createDevToolsPluginWebsocketEndpoint","watch","mockServer","originalTransformFile","transformFile","bind","filePath","transformOptions","fileBuffer","pruneCustomTransformOptions","customTransformOptions","__proto__","reportMetroEvent","messageSocket","dom","match","routerRoot","asyncRoutes","clientBoundaries","CI","chalk"],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "evaluateJsFromCdpAsync", {
6
+ enumerable: true,
7
+ get: ()=>evaluateJsFromCdpAsync
8
+ });
9
+ function _ws() {
10
+ const data = require("ws");
11
+ _ws = function() {
12
+ return data;
13
+ };
14
+ return data;
15
+ }
16
+ const debug = require("debug")("expo:start:server:middleware:inspector:CdpClient");
17
+ function evaluateJsFromCdpAsync(webSocketDebuggerUrl, source, timeoutMs = 2000) {
18
+ const REQUEST_ID = 0;
19
+ let timeoutHandle;
20
+ return new Promise((resolve, reject)=>{
21
+ let settled = false;
22
+ const ws = new (_ws()).WebSocket(webSocketDebuggerUrl);
23
+ timeoutHandle = setTimeout(()=>{
24
+ debug(`[evaluateJsFromCdpAsync] Request timeout from ${webSocketDebuggerUrl}`);
25
+ reject(new Error("Request timeout"));
26
+ settled = true;
27
+ ws.close();
28
+ }, timeoutMs);
29
+ ws.on("open", ()=>{
30
+ ws.send(JSON.stringify({
31
+ id: REQUEST_ID,
32
+ method: "Runtime.evaluate",
33
+ params: {
34
+ expression: source
35
+ }
36
+ }));
37
+ });
38
+ ws.on("error", (e)=>{
39
+ debug(`[evaluateJsFromCdpAsync] Failed to connect ${webSocketDebuggerUrl}`, e);
40
+ reject(e);
41
+ settled = true;
42
+ clearTimeout(timeoutHandle);
43
+ ws.close();
44
+ });
45
+ ws.on("close", ()=>{
46
+ if (!settled) {
47
+ reject(new Error("WebSocket closed before response was received."));
48
+ clearTimeout(timeoutHandle);
49
+ }
50
+ });
51
+ ws.on("message", (data)=>{
52
+ debug(`[evaluateJsFromCdpAsync] message received from ${webSocketDebuggerUrl}: ${data.toString()}`);
53
+ try {
54
+ const response = JSON.parse(data.toString());
55
+ if (response.id === REQUEST_ID) {
56
+ if (response.error) {
57
+ reject(new Error(response.error.message));
58
+ } else if (response.result.result.type === "string") {
59
+ resolve(response.result.result.value);
60
+ } else {
61
+ resolve(undefined);
62
+ }
63
+ settled = true;
64
+ clearTimeout(timeoutHandle);
65
+ ws.close();
66
+ }
67
+ } catch (e) {
68
+ reject(e);
69
+ settled = true;
70
+ clearTimeout(timeoutHandle);
71
+ ws.close();
72
+ }
73
+ });
74
+ });
75
+ }
76
+
77
+ //# sourceMappingURL=CdpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/CdpClient.ts"],"sourcesContent":["import { WebSocket } from 'ws';\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:inspector:CdpClient'\n) as typeof console.log;\n\nexport function evaluateJsFromCdpAsync(\n webSocketDebuggerUrl: string,\n source: string,\n timeoutMs: number = 2000\n): Promise<string | undefined> {\n const REQUEST_ID = 0;\n let timeoutHandle: NodeJS.Timeout;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n const ws = new WebSocket(webSocketDebuggerUrl);\n\n timeoutHandle = setTimeout(() => {\n debug(`[evaluateJsFromCdpAsync] Request timeout from ${webSocketDebuggerUrl}`);\n reject(new Error('Request timeout'));\n settled = true;\n ws.close();\n }, timeoutMs);\n\n ws.on('open', () => {\n ws.send(\n JSON.stringify({\n id: REQUEST_ID,\n method: 'Runtime.evaluate',\n params: { expression: source },\n })\n );\n });\n\n ws.on('error', (e) => {\n debug(`[evaluateJsFromCdpAsync] Failed to connect ${webSocketDebuggerUrl}`, e);\n reject(e);\n settled = true;\n clearTimeout(timeoutHandle);\n ws.close();\n });\n\n ws.on('close', () => {\n if (!settled) {\n reject(new Error('WebSocket closed before response was received.'));\n clearTimeout(timeoutHandle);\n }\n });\n\n ws.on('message', (data) => {\n debug(\n `[evaluateJsFromCdpAsync] message received from ${webSocketDebuggerUrl}: ${data.toString()}`\n );\n try {\n const response = JSON.parse(data.toString());\n if (response.id === REQUEST_ID) {\n if (response.error) {\n reject(new Error(response.error.message));\n } else if (response.result.result.type === 'string') {\n resolve(response.result.result.value);\n } else {\n resolve(undefined);\n }\n settled = true;\n clearTimeout(timeoutHandle);\n ws.close();\n }\n } catch (e) {\n reject(e);\n settled = true;\n clearTimeout(timeoutHandle);\n ws.close();\n }\n });\n });\n}\n"],"names":["evaluateJsFromCdpAsync","debug","require","webSocketDebuggerUrl","source","timeoutMs","REQUEST_ID","timeoutHandle","Promise","resolve","reject","settled","ws","WebSocket","setTimeout","Error","close","on","send","JSON","stringify","id","method","params","expression","e","clearTimeout","data","toString","response","parse","error","message","result","type","value","undefined"],"mappings":"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"}
@@ -21,6 +21,7 @@ function _chalk() {
21
21
  };
22
22
  return data;
23
23
  }
24
+ const _cdpClient = require("./CdpClient");
24
25
  const _prompts = require("../../../../utils/prompts");
25
26
  const _pageIsSupported = require("../../metro/debugging/pageIsSupported");
26
27
  function _interopRequireDefault(obj) {
@@ -54,8 +55,19 @@ async function queryInspectorAppAsync(metroServerOrigin, appId) {
54
55
  async function queryAllInspectorAppsAsync(metroServerOrigin) {
55
56
  const resp = await fetch(`${metroServerOrigin}/json/list`);
56
57
  const apps = transformApps(await resp.json());
57
- // Only use targets with better reloading support
58
- return apps.filter((app)=>(0, _pageIsSupported.pageIsSupported)(app));
58
+ const results = [];
59
+ for (const app of apps){
60
+ // Only use targets with better reloading support
61
+ if (!(0, _pageIsSupported.pageIsSupported)(app)) {
62
+ continue;
63
+ }
64
+ // Hide targets that are marked as hidden from the inspector, e.g. instances from expo-dev-menu and expo-dev-launcher.
65
+ if (await appShouldBeIgnoredAsync(app)) {
66
+ continue;
67
+ }
68
+ results.push(app);
69
+ }
70
+ return results;
59
71
  }
60
72
  async function promptInspectorAppAsync(apps) {
61
73
  var ref;
@@ -97,5 +109,11 @@ function transformApps(apps) {
97
109
  return app;
98
110
  });
99
111
  }
112
+ const HIDE_FROM_INSPECTOR_ENV = "globalThis.__expo_hide_from_inspector__";
113
+ async function appShouldBeIgnoredAsync(app) {
114
+ const hideFromInspector = await (0, _cdpClient.evaluateJsFromCdpAsync)(app.webSocketDebuggerUrl, HIDE_FROM_INSPECTOR_ENV);
115
+ debug(`[appShouldBeIgnoredAsync] webSocketDebuggerUrl[${app.webSocketDebuggerUrl}] hideFromInspector[${hideFromInspector}]`);
116
+ return hideFromInspector !== undefined;
117
+ }
100
118
 
101
119
  //# sourceMappingURL=JsInspector.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/JsInspector.ts"],"sourcesContent":["import type { CustomMessageHandlerConnection } from '@react-native/dev-middleware';\nimport chalk from 'chalk';\n\nimport { selectAsync } from '../../../../utils/prompts';\nimport { pageIsSupported } from '../../metro/debugging/pageIsSupported';\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:inspector:jsInspector'\n) as typeof console.log;\n\nexport interface MetroInspectorProxyApp {\n /** Unique device ID combined with the page ID */\n id: string;\n /** Information about the underlying CDP implementation, e.g. \"React Native Bridgeless [C++ connection]\" */\n title: string;\n /** The application ID that is currently running on the device, e.g. \"dev.expo.bareexpo\" */\n description: string;\n /** The CDP debugger type, which should always be \"node\" */\n type: 'node';\n /** The internal `devtools://..` URL for the debugger to connect to */\n devtoolsFrontendUrl: string;\n /** The websocket URL for the debugger to connect to */\n webSocketDebuggerUrl: string;\n /**\n * Human-readable device name\n * @since react-native@0.73\n */\n deviceName: string;\n /**\n * React Native specific information, like the unique device ID and native capabilities\n * @since react-native@0.74\n */\n reactNative?: {\n /** The unique device ID */\n logicalDeviceId: string;\n /** All supported native capabilities */\n capabilities: CustomMessageHandlerConnection['page']['capabilities'];\n };\n}\n\n/**\n * Launch the React Native DevTools by executing the `POST /open-debugger` request.\n * This endpoint is handled through `@react-native/dev-middleware`.\n */\nexport async function openJsInspector(metroBaseUrl: string, app: MetroInspectorProxyApp) {\n if (!app.reactNative?.logicalDeviceId) {\n debug('Failed to open React Native DevTools, target is missing device ID');\n return false;\n }\n\n const url = new URL('/open-debugger', metroBaseUrl);\n url.searchParams.set('appId', app.description);\n url.searchParams.set('device', app.reactNative.logicalDeviceId);\n url.searchParams.set('target', app.id);\n\n const response = await fetch(url, { method: 'POST' });\n if (!response.ok) {\n debug('Failed to open React Native DevTools, received response:', response.status);\n }\n\n return response.ok;\n}\n\nexport async function queryInspectorAppAsync(\n metroServerOrigin: string,\n appId: string\n): Promise<MetroInspectorProxyApp | null> {\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n return apps.find((app) => app.description === appId) ?? null;\n}\n\nexport async function queryAllInspectorAppsAsync(\n metroServerOrigin: string\n): Promise<MetroInspectorProxyApp[]> {\n const resp = await fetch(`${metroServerOrigin}/json/list`);\n const apps: MetroInspectorProxyApp[] = transformApps(await resp.json());\n // Only use targets with better reloading support\n return apps.filter((app) => pageIsSupported(app));\n}\n\nexport async function promptInspectorAppAsync(apps: MetroInspectorProxyApp[]) {\n if (apps.length === 1) {\n return apps[0];\n }\n\n // Check if multiple devices are connected with the same device names\n // In this case, append the actual app id (device ID + page number) to the prompt\n const hasDuplicateNames = apps.some(\n (app, index) => index !== apps.findIndex((other) => app.deviceName === other.deviceName)\n );\n\n const choices = apps.map((app) => {\n const name = app.deviceName ?? 'Unknown device';\n return {\n title: hasDuplicateNames ? chalk`${name}{dim - ${app.id}}` : name,\n value: app.id,\n app,\n };\n });\n\n const value = await selectAsync(chalk`Debug target {dim (Hermes only)}`, choices);\n\n return choices.find((item) => item.value === value)?.app;\n}\n\n// The description of `React Native Experimental (Improved Chrome Reloads)` target is `don't use` from metro.\n// This function tries to transform the unmeaningful description to appId\nfunction transformApps(apps: MetroInspectorProxyApp[]): MetroInspectorProxyApp[] {\n const deviceIdToAppId: Record<string, string> = {};\n\n for (const app of apps) {\n if (app.description !== \"don't use\") {\n const deviceId = app.reactNative?.logicalDeviceId ?? app.id.split('-')[0];\n const appId = app.description;\n deviceIdToAppId[deviceId] = appId;\n }\n }\n\n return apps.map((app) => {\n if (app.description === \"don't use\") {\n const deviceId = app.reactNative?.logicalDeviceId ?? app.id.split('-')[0];\n app.description = deviceIdToAppId[deviceId] ?? app.description;\n }\n return app;\n });\n}\n"],"names":["openJsInspector","queryInspectorAppAsync","queryAllInspectorAppsAsync","promptInspectorAppAsync","debug","require","metroBaseUrl","app","reactNative","logicalDeviceId","url","URL","searchParams","set","description","id","response","fetch","method","ok","status","metroServerOrigin","appId","apps","find","resp","transformApps","json","filter","pageIsSupported","choices","length","hasDuplicateNames","some","index","findIndex","other","deviceName","map","name","title","chalk","value","selectAsync","item","deviceIdToAppId","deviceId","split"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/JsInspector.ts"],"sourcesContent":["import type { CustomMessageHandlerConnection } from '@react-native/dev-middleware';\nimport chalk from 'chalk';\n\nimport { evaluateJsFromCdpAsync } from './CdpClient';\nimport { selectAsync } from '../../../../utils/prompts';\nimport { pageIsSupported } from '../../metro/debugging/pageIsSupported';\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:inspector:jsInspector'\n) as typeof console.log;\n\nexport interface MetroInspectorProxyApp {\n /** Unique device ID combined with the page ID */\n id: string;\n /** Information about the underlying CDP implementation, e.g. \"React Native Bridgeless [C++ connection]\" */\n title: string;\n /** The application ID that is currently running on the device, e.g. \"dev.expo.bareexpo\" */\n description: string;\n /** The CDP debugger type, which should always be \"node\" */\n type: 'node';\n /** The internal `devtools://..` URL for the debugger to connect to */\n devtoolsFrontendUrl: string;\n /** The websocket URL for the debugger to connect to */\n webSocketDebuggerUrl: string;\n /**\n * Human-readable device name\n * @since react-native@0.73\n */\n deviceName: string;\n /**\n * React Native specific information, like the unique device ID and native capabilities\n * @since react-native@0.74\n */\n reactNative?: {\n /** The unique device ID */\n logicalDeviceId: string;\n /** All supported native capabilities */\n capabilities: CustomMessageHandlerConnection['page']['capabilities'];\n };\n}\n\n/**\n * Launch the React Native DevTools by executing the `POST /open-debugger` request.\n * This endpoint is handled through `@react-native/dev-middleware`.\n */\nexport async function openJsInspector(metroBaseUrl: string, app: MetroInspectorProxyApp) {\n if (!app.reactNative?.logicalDeviceId) {\n debug('Failed to open React Native DevTools, target is missing device ID');\n return false;\n }\n\n const url = new URL('/open-debugger', metroBaseUrl);\n url.searchParams.set('appId', app.description);\n url.searchParams.set('device', app.reactNative.logicalDeviceId);\n url.searchParams.set('target', app.id);\n\n const response = await fetch(url, { method: 'POST' });\n if (!response.ok) {\n debug('Failed to open React Native DevTools, received response:', response.status);\n }\n\n return response.ok;\n}\n\nexport async function queryInspectorAppAsync(\n metroServerOrigin: string,\n appId: string\n): Promise<MetroInspectorProxyApp | null> {\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n return apps.find((app) => app.description === appId) ?? null;\n}\n\nexport async function queryAllInspectorAppsAsync(\n metroServerOrigin: string\n): Promise<MetroInspectorProxyApp[]> {\n const resp = await fetch(`${metroServerOrigin}/json/list`);\n const apps: MetroInspectorProxyApp[] = transformApps(await resp.json());\n const results: MetroInspectorProxyApp[] = [];\n for (const app of apps) {\n // Only use targets with better reloading support\n if (!pageIsSupported(app)) {\n continue;\n }\n // Hide targets that are marked as hidden from the inspector, e.g. instances from expo-dev-menu and expo-dev-launcher.\n if (await appShouldBeIgnoredAsync(app)) {\n continue;\n }\n results.push(app);\n }\n return results;\n}\n\nexport async function promptInspectorAppAsync(apps: MetroInspectorProxyApp[]) {\n if (apps.length === 1) {\n return apps[0];\n }\n\n // Check if multiple devices are connected with the same device names\n // In this case, append the actual app id (device ID + page number) to the prompt\n const hasDuplicateNames = apps.some(\n (app, index) => index !== apps.findIndex((other) => app.deviceName === other.deviceName)\n );\n\n const choices = apps.map((app) => {\n const name = app.deviceName ?? 'Unknown device';\n return {\n title: hasDuplicateNames ? chalk`${name}{dim - ${app.id}}` : name,\n value: app.id,\n app,\n };\n });\n\n const value = await selectAsync(chalk`Debug target {dim (Hermes only)}`, choices);\n\n return choices.find((item) => item.value === value)?.app;\n}\n\n// The description of `React Native Experimental (Improved Chrome Reloads)` target is `don't use` from metro.\n// This function tries to transform the unmeaningful description to appId\nfunction transformApps(apps: MetroInspectorProxyApp[]): MetroInspectorProxyApp[] {\n const deviceIdToAppId: Record<string, string> = {};\n\n for (const app of apps) {\n if (app.description !== \"don't use\") {\n const deviceId = app.reactNative?.logicalDeviceId ?? app.id.split('-')[0];\n const appId = app.description;\n deviceIdToAppId[deviceId] = appId;\n }\n }\n\n return apps.map((app) => {\n if (app.description === \"don't use\") {\n const deviceId = app.reactNative?.logicalDeviceId ?? app.id.split('-')[0];\n app.description = deviceIdToAppId[deviceId] ?? app.description;\n }\n return app;\n });\n}\n\nconst HIDE_FROM_INSPECTOR_ENV = 'globalThis.__expo_hide_from_inspector__';\n\nasync function appShouldBeIgnoredAsync(app: MetroInspectorProxyApp): Promise<boolean> {\n const hideFromInspector = await evaluateJsFromCdpAsync(\n app.webSocketDebuggerUrl,\n HIDE_FROM_INSPECTOR_ENV\n );\n debug(\n `[appShouldBeIgnoredAsync] webSocketDebuggerUrl[${app.webSocketDebuggerUrl}] hideFromInspector[${hideFromInspector}]`\n );\n return hideFromInspector !== undefined;\n}\n"],"names":["openJsInspector","queryInspectorAppAsync","queryAllInspectorAppsAsync","promptInspectorAppAsync","debug","require","metroBaseUrl","app","reactNative","logicalDeviceId","url","URL","searchParams","set","description","id","response","fetch","method","ok","status","metroServerOrigin","appId","apps","find","resp","transformApps","json","results","pageIsSupported","appShouldBeIgnoredAsync","push","choices","length","hasDuplicateNames","some","index","findIndex","other","deviceName","map","name","title","chalk","value","selectAsync","item","deviceIdToAppId","deviceId","split","HIDE_FROM_INSPECTOR_ENV","hideFromInspector","evaluateJsFromCdpAsync","webSocketDebuggerUrl","undefined"],"mappings":"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"}
@@ -31,7 +31,7 @@ class FetchClient {
31
31
  this.headers = {
32
32
  accept: "application/json",
33
33
  "content-type": "application/json",
34
- "user-agent": `expo-cli/${"0.19.2"}`,
34
+ "user-agent": `expo-cli/${"0.19.4"}`,
35
35
  authorization: "Basic " + _nodeBuffer().Buffer.from(`${target}:`).toString("base64")
36
36
  };
37
37
  }
@@ -79,7 +79,7 @@ function createContext() {
79
79
  cpu: summarizeCpuInfo(),
80
80
  app: {
81
81
  name: "expo/cli",
82
- version: "0.19.2"
82
+ version: "0.19.4"
83
83
  },
84
84
  ci: _ciInfo().isCI ? {
85
85
  name: _ciInfo().name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/cli",
3
- "version": "0.19.2",
3
+ "version": "0.19.4",
4
4
  "description": "The Expo CLI",
5
5
  "main": "build/bin/cli",
6
6
  "bin": {
@@ -41,17 +41,17 @@
41
41
  "dependencies": {
42
42
  "@babel/runtime": "^7.20.0",
43
43
  "@expo/code-signing-certificates": "^0.0.5",
44
- "@expo/config": "~10.0.0",
45
- "@expo/config-plugins": "~9.0.0",
44
+ "@expo/config": "~10.0.2",
45
+ "@expo/config-plugins": "~9.0.3",
46
46
  "@expo/devcert": "^1.1.2",
47
47
  "@expo/env": "~0.4.0",
48
48
  "@expo/image-utils": "^0.6.0",
49
49
  "@expo/json-file": "^9.0.0",
50
- "@expo/metro-config": "~0.19.0-preview.0",
50
+ "@expo/metro-config": "~0.19.0-preview.2",
51
51
  "@expo/osascript": "^2.0.31",
52
52
  "@expo/package-manager": "^1.5.0",
53
53
  "@expo/plist": "^0.2.0",
54
- "@expo/prebuild-config": "^8.0.0",
54
+ "@expo/prebuild-config": "^8.0.3",
55
55
  "@expo/rudder-sdk-node": "^1.1.1",
56
56
  "@expo/spawn-async": "^1.7.2",
57
57
  "@expo/xcpretty": "^4.3.0",
@@ -167,5 +167,5 @@
167
167
  "tree-kill": "^1.2.2",
168
168
  "tsd": "^0.28.1"
169
169
  },
170
- "gitHead": "2e4f18d41da033c5ced0a4a045d91cf5250016b7"
170
+ "gitHead": "8eb885bc2347df4e30fee0437d34396ba0e06fa9"
171
171
  }