@expo/cli 1.0.0-canary-20250404-87e2506 → 1.0.0-canary-20250630-547cd82
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 +33 -24
- package/build/bin/cli +1 -1
- package/build/metro-require/require.js +6 -4
- package/build/src/api/user/actions.js +25 -11
- package/build/src/api/user/actions.js.map +1 -1
- package/build/src/customize/templates.js +15 -1
- package/build/src/customize/templates.js.map +1 -1
- package/build/src/export/exportApp.js +26 -14
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/exportAsync.js +6 -0
- package/build/src/export/exportAsync.js.map +1 -1
- package/build/src/export/exportHermes.js +2 -2
- package/build/src/export/exportHermes.js.map +1 -1
- package/build/src/export/persistMetroAssets.js.map +1 -1
- package/build/src/install/checkPackages.js +22 -4
- package/build/src/install/checkPackages.js.map +1 -1
- package/build/src/install/index.js +3 -1
- package/build/src/install/index.js.map +1 -1
- package/build/src/install/resolveOptions.js +7 -2
- package/build/src/install/resolveOptions.js.map +1 -1
- package/build/src/install/utils/checkPackagesCompatibility.js +1 -1
- package/build/src/install/utils/checkPackagesCompatibility.js.map +1 -1
- package/build/src/lint/ESlintPrerequisite.js +32 -48
- package/build/src/lint/ESlintPrerequisite.js.map +1 -1
- package/build/src/lint/index.js +45 -47
- package/build/src/lint/index.js.map +1 -1
- package/build/src/lint/lintAsync.js +150 -4
- package/build/src/lint/lintAsync.js.map +1 -1
- package/build/src/lint/resolveOptions.js +115 -0
- package/build/src/lint/resolveOptions.js.map +1 -0
- package/build/src/prebuild/renameTemplateAppName.js +4 -1
- package/build/src/prebuild/renameTemplateAppName.js.map +1 -1
- package/build/src/prebuild/resolveTemplate.js +4 -4
- package/build/src/prebuild/resolveTemplate.js.map +1 -1
- package/build/src/prebuild/updatePackageJson.js +19 -9
- package/build/src/prebuild/updatePackageJson.js.map +1 -1
- package/build/src/run/android/resolveOptions.js +13 -1
- package/build/src/run/android/resolveOptions.js.map +1 -1
- package/build/src/run/android/runAndroidAsync.js +39 -17
- package/build/src/run/android/runAndroidAsync.js.map +1 -1
- package/build/src/run/ios/XcodeBuild.js +3 -3
- package/build/src/run/ios/XcodeBuild.js.map +1 -1
- package/build/src/run/ios/options/resolveOptions.js +13 -1
- package/build/src/run/ios/options/resolveOptions.js.map +1 -1
- package/build/src/run/ios/runIosAsync.js +38 -7
- package/build/src/run/ios/runIosAsync.js.map +1 -1
- package/build/src/start/doctor/SecurityBinPrerequisite.js +1 -1
- package/build/src/start/doctor/SecurityBinPrerequisite.js.map +1 -1
- package/build/src/start/doctor/apple/XcodePrerequisite.js +1 -1
- package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -1
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +1 -1
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
- package/build/src/start/doctor/dependencies/resolvePackages.js +1 -1
- package/build/src/start/doctor/dependencies/resolvePackages.js.map +1 -1
- package/build/src/start/doctor/ngrok/ExternalModule.js +1 -1
- package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
- package/build/src/start/index.js +1 -1
- package/build/src/start/index.js.map +1 -1
- package/build/src/start/platforms/PlatformManager.js +1 -1
- package/build/src/start/platforms/PlatformManager.js.map +1 -1
- package/build/src/start/platforms/android/AndroidPlatformManager.js +1 -1
- package/build/src/start/platforms/android/AndroidPlatformManager.js.map +1 -1
- package/build/src/start/platforms/android/getDevices.js +1 -1
- package/build/src/start/platforms/android/getDevices.js.map +1 -1
- package/build/src/start/platforms/ios/AppleDeviceManager.js +1 -1
- package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
- package/build/src/start/platforms/ios/xcrun.js +1 -1
- package/build/src/start/platforms/ios/xcrun.js.map +1 -1
- package/build/src/start/project/dotExpo.js +5 -0
- package/build/src/start/project/dotExpo.js.map +1 -1
- package/build/src/start/resolveOptions.js +3 -0
- package/build/src/start/resolveOptions.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +38 -26
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js +29 -2
- package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/createExpoFallbackResolver.js +6 -4
- package/build/src/start/server/metro/createExpoFallbackResolver.js.map +1 -1
- package/build/src/start/server/metro/createJResolver.js +2 -2
- package/build/src/start/server/metro/createJResolver.js.map +1 -1
- package/build/src/start/server/metro/createServerComponentsMiddleware.js +16 -5
- package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
- package/build/src/start/server/metro/debugging/createDebugMiddleware.js +19 -19
- package/build/src/start/server/metro/debugging/createDebugMiddleware.js.map +1 -1
- package/build/src/start/server/metro/externals.js +1 -1
- package/build/src/start/server/metro/externals.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +13 -8
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/log-box/LogBoxSymbolication.js +21 -2
- package/build/src/start/server/metro/log-box/LogBoxSymbolication.js.map +1 -1
- package/build/src/start/server/metro/log-box/formatProjectFilePath.js +15 -12
- package/build/src/start/server/metro/log-box/formatProjectFilePath.js.map +1 -1
- package/build/src/start/server/metro/metroErrorInterface.js +19 -8
- package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
- package/build/src/start/server/metro/runServer-fork.js +1 -1
- package/build/src/start/server/metro/runServer-fork.js.map +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js +8 -2
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/middleware/CorsMiddleware.js +1 -1
- package/build/src/start/server/middleware/CorsMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +4 -8
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/inspector/JsInspector.js +2 -25
- package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -1
- package/build/src/start/server/middleware/metroOptions.js +2 -26
- package/build/src/start/server/middleware/metroOptions.js.map +1 -1
- package/build/src/utils/build-cache-providers/helpers.js +61 -0
- package/build/src/utils/build-cache-providers/helpers.js.map +1 -0
- package/build/src/utils/build-cache-providers/index.js +283 -0
- package/build/src/utils/build-cache-providers/index.js.map +1 -0
- package/build/src/utils/codesigning.js +14 -2
- package/build/src/utils/codesigning.js.map +1 -1
- package/build/src/utils/exit.js +0 -1
- package/build/src/utils/exit.js.map +1 -1
- package/build/src/utils/ip.js +7 -104
- package/build/src/utils/ip.js.map +1 -1
- package/build/src/utils/modifyConfigAsync.js +1 -1
- package/build/src/utils/modifyConfigAsync.js.map +1 -1
- package/build/src/utils/resolveArgs.js +8 -0
- package/build/src/utils/resolveArgs.js.map +1 -1
- package/build/src/utils/scheme.js +1 -1
- package/build/src/utils/scheme.js.map +1 -1
- package/build/src/utils/telemetry/clients/FetchClient.js +2 -2
- package/build/src/utils/telemetry/clients/FetchClient.js.map +1 -1
- package/build/src/utils/telemetry/utils/context.js +1 -1
- package/build/src/utils/tsconfig/evaluateTsConfig.js +7 -2
- package/build/src/utils/tsconfig/evaluateTsConfig.js.map +1 -1
- package/build/src/utils/variadic.js +63 -6
- package/build/src/utils/variadic.js.map +1 -1
- package/package.json +20 -20
- package/static/canary/react-is/cjs/react-is.development.js +118 -185
- package/static/canary/react-is/cjs/react-is.production.js +2 -2
- package/static/canary/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js +16582 -26565
- package/static/canary/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js +3495 -3357
- package/static/canary/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js +3929 -3801
- package/static/canary/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +16869 -27032
- package/static/canary/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +3535 -3428
- package/static/canary/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +4198 -4095
- package/static/canary/scheduler/cjs/scheduler-unstable_mock.development.js +387 -684
- package/static/canary/scheduler/cjs/scheduler-unstable_mock.production.js +0 -9
- package/static/canary/scheduler/cjs/scheduler-unstable_post_task.development.js +137 -195
- package/static/canary/scheduler/cjs/scheduler-unstable_post_task.production.js +0 -5
- package/static/canary/scheduler/cjs/scheduler.development.js +339 -600
- package/static/canary/scheduler/cjs/scheduler.native.development.js +324 -512
- package/static/canary/scheduler/cjs/scheduler.native.production.js +6 -5
- package/static/canary/scheduler/cjs/scheduler.production.js +16 -17
- package/static/canary-full/react/cjs/react-compiler-runtime.development.js +13 -68
- package/static/canary-full/react/cjs/react-jsx-dev-runtime.development.js +317 -1251
- package/static/canary-full/react/cjs/react-jsx-dev-runtime.react-server.development.js +353 -1286
- package/static/canary-full/react/cjs/react-jsx-runtime.development.js +326 -1279
- package/static/canary-full/react/cjs/react-jsx-runtime.react-server.development.js +353 -1286
- package/static/canary-full/react/cjs/react.development.js +1204 -2771
- package/static/canary-full/react/cjs/react.production.js +25 -20
- package/static/canary-full/react/cjs/react.react-server.development.js +783 -2162
- package/static/canary-full/react/cjs/react.react-server.production.js +13 -63
- package/static/canary-full/react/package.json +1 -1
- package/static/canary-full/react-dom/cjs/react-dom-client.development.js +24847 -37099
- package/static/canary-full/react-dom/cjs/react-dom-client.production.js +8261 -7475
- package/static/canary-full/react-dom/cjs/react-dom-profiling.development.js +25252 -37571
- package/static/canary-full/react-dom/cjs/react-dom-profiling.profiling.js +9442 -8662
- package/static/canary-full/react-dom/cjs/react-dom-server-legacy.browser.development.js +8944 -11568
- package/static/canary-full/react-dom/cjs/react-dom-server-legacy.browser.production.js +1378 -944
- package/static/canary-full/react-dom/cjs/react-dom-server-legacy.node.development.js +8944 -11568
- package/static/canary-full/react-dom/cjs/react-dom-server-legacy.node.production.js +1386 -954
- package/static/canary-full/react-dom/cjs/react-dom-server.browser.development.js +9344 -11600
- package/static/canary-full/react-dom/cjs/react-dom-server.browser.production.js +1545 -954
- package/static/canary-full/react-dom/cjs/react-dom-server.bun.development.js +8286 -11064
- package/static/canary-full/react-dom/cjs/react-dom-server.bun.production.js +1437 -976
- package/static/canary-full/react-dom/cjs/react-dom-server.edge.development.js +9356 -11609
- package/static/canary-full/react-dom/cjs/react-dom-server.edge.production.js +1542 -970
- package/static/canary-full/react-dom/cjs/react-dom-server.node.development.js +9227 -11571
- package/static/canary-full/react-dom/cjs/react-dom-server.node.production.js +1787 -1183
- package/static/canary-full/react-dom/cjs/react-dom-test-utils.development.js +13 -59
- package/static/canary-full/react-dom/cjs/react-dom.development.js +402 -604
- package/static/canary-full/react-dom/cjs/react-dom.production.js +4 -3
- package/static/canary-full/react-dom/cjs/react-dom.react-server.development.js +322 -382
- package/static/canary-full/react-dom/cjs/react-dom.react-server.production.js +6 -7
- package/static/canary-full/react-dom/package.json +5 -5
- package/static/canary-full/react-dom/static.browser.js +1 -0
- package/static/canary-full/react-dom/static.edge.js +1 -0
- package/static/canary-full/react-dom/static.node.js +1 -0
- package/static/template/eslint.config.js +10 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/start/server/metro/debugging/createDebugMiddleware.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/metro/debugging/createDebugMiddleware.ts"],"sourcesContent":["import { WebSocketServer } from 'ws';\n\nimport { createHandlersFactory } from './createHandlersFactory';\nimport { env } from '../../../../utils/env';\nimport { type MetroBundlerDevServer } from '../MetroBundlerDevServer';\nimport { TerminalReporter } from '../TerminalReporter';\nimport { NETWORK_RESPONSE_STORAGE } from './messageHandlers/NetworkResponse';\n\nconst debug = require('debug')('expo:metro:debugging:middleware') as typeof console.log;\n\nexport function createDebugMiddleware(\n metroBundler: MetroBundlerDevServer,\n reporter: TerminalReporter\n) {\n // Load the React Native debugging tools from project\n // TODO: check if this works with isolated modules\n const { createDevMiddleware } =\n require('@react-native/dev-middleware') as typeof import('@react-native/dev-middleware');\n\n const { middleware, websocketEndpoints } = createDevMiddleware({\n projectRoot: metroBundler.projectRoot,\n serverBaseUrl: metroBundler\n .getUrlCreator()\n .constructUrl({ scheme: 'http', hostType: 'localhost' }),\n logger: createLogger(reporter),\n unstable_customInspectorMessageHandler: createHandlersFactory(),\n // TODO: Forward all events to the shared Metro log reporter. Do this when we have opinions on how all logs should be presented.\n // unstable_eventReporter: {\n // logEvent(event) {\n // reporter.update(event);\n // },\n // },\n unstable_experiments: {\n // Enable the Network tab in React Native DevTools\n enableNetworkInspector: true,\n // Only enable opening the browser version of React Native DevTools when debugging.\n // This is useful when debugging the React Native DevTools by going to `/open-debugger` in the browser.\n enableOpenDebuggerRedirect: env.EXPO_DEBUG,\n },\n });\n\n // NOTE(cedric): add a temporary websocket to handle Network-related CDP events\n websocketEndpoints['/inspector/network'] = createNetworkWebsocket(\n websocketEndpoints['/inspector/debug']\n );\n\n return {\n debugMiddleware: middleware,\n debugWebsocketEndpoints: websocketEndpoints,\n };\n}\n\nfunction createLogger(\n reporter: TerminalReporter\n): Parameters<typeof import('@react-native/dev-middleware').createDevMiddleware>[0]['logger'] {\n return {\n info: makeLogger(reporter, 'info'),\n warn: makeLogger(reporter, 'warn'),\n error: makeLogger(reporter, 'error'),\n };\n}\n\nfunction makeLogger(reporter: TerminalReporter, level: 'info' | 'warn' | 'error') {\n return (...data: any[]) =>\n reporter.update({\n type: 'unstable_server_log',\n level,\n data,\n });\n}\n\n/**\n * This adds a dedicated websocket connection that handles Network-related CDP events.\n * It's a temporary solution until Fusebox either implements the Network CDP domain,\n * or allows external domain agents that can send messages over the CDP socket to the debugger.\n * The Network websocket rebroadcasts events on the debugger CDP connections.\n */\nfunction createNetworkWebsocket(debuggerWebsocket: WebSocketServer) {\n const wss = new WebSocketServer({\n noServer: true,\n perMessageDeflate: true,\n // Don't crash on exceptionally large messages - assume the device is\n // well-behaved and the debugger is prepared to handle large messages.\n maxPayload: 0,\n });\n\n wss.on('connection', (networkSocket) => {\n networkSocket.on('message', (data) => {\n try {\n // Parse the network message, to determine how the message should be handled\n const message = JSON.parse(data.toString());\n\n if (message.method === 'Expo(Network.receivedResponseBody)' && message.params) {\n // If its a response body, write it to the global storage\n const { requestId, ...requestInfo } = message.params;\n NETWORK_RESPONSE_STORAGE.set(requestId, requestInfo);\n } else {\n // Otherwise, directly re-broadcast the Network events to all connected debuggers\n debuggerWebsocket.clients.forEach((debuggerSocket) => {\n if (debuggerSocket.readyState === debuggerSocket.OPEN) {\n debuggerSocket.send(data.toString());\n }\n });\n }\n } catch (error) {\n debug('Failed to handle Network CDP event', error);\n }\n });\n });\n\n return wss;\n}\n"],"names":["createDebugMiddleware","debug","require","metroBundler","reporter","createDevMiddleware","middleware","websocketEndpoints","projectRoot","serverBaseUrl","getUrlCreator","constructUrl","scheme","hostType","logger","createLogger","unstable_customInspectorMessageHandler","createHandlersFactory","unstable_experiments","enableNetworkInspector","enableOpenDebuggerRedirect","env","EXPO_DEBUG","createNetworkWebsocket","debugMiddleware","debugWebsocketEndpoints","info","makeLogger","warn","error","level","data","update","type","debuggerWebsocket","wss","WebSocketServer","noServer","perMessageDeflate","maxPayload","on","networkSocket","message","JSON","parse","toString","method","params","requestId","requestInfo","NETWORK_RESPONSE_STORAGE","set","clients","forEach","debuggerSocket","readyState","OPEN","send"],"mappings":";;;;+BAUgBA;;;eAAAA;;;;yBAVgB;;;;;;uCAEM;qBAClB;iCAGqB;AAEzC,MAAMC,QAAQC,QAAQ,SAAS;AAExB,SAASF,sBACdG,YAAmC,EACnCC,QAA0B;IAE1B,qDAAqD;IACrD,kDAAkD;IAClD,MAAM,EAAEC,mBAAmB,EAAE,GAC3BH,QAAQ;IAEV,MAAM,EAAEI,UAAU,EAAEC,kBAAkB,EAAE,GAAGF,oBAAoB;QAC7DG,aAAaL,aAAaK,WAAW;QACrCC,eAAeN,aACZO,aAAa,GACbC,YAAY,CAAC;YAAEC,QAAQ;YAAQC,UAAU;QAAY;QACxDC,QAAQC,aAAaX;QACrBY,wCAAwCC,IAAAA,4CAAqB;QAC7D,gIAAgI;QAChI,4BAA4B;QAC5B,sBAAsB;QACtB,8BAA8B;QAC9B,OAAO;QACP,KAAK;QACLC,sBAAsB;YACpB,kDAAkD;YAClDC,wBAAwB;YACxB,mFAAmF;YACnF,uGAAuG;YACvGC,4BAA4BC,QAAG,CAACC,UAAU;QAC5C;IACF;IAEA,+EAA+E;IAC/Ef,kBAAkB,CAAC,qBAAqB,GAAGgB,uBACzChB,kBAAkB,CAAC,mBAAmB;IAGxC,OAAO;QACLiB,iBAAiBlB;QACjBmB,yBAAyBlB;IAC3B;AACF;AAEA,SAASQ,aACPX,QAA0B;IAE1B,OAAO;QACLsB,MAAMC,WAAWvB,UAAU;QAC3BwB,MAAMD,WAAWvB,UAAU;QAC3ByB,OAAOF,WAAWvB,UAAU;IAC9B;AACF;AAEA,SAASuB,WAAWvB,QAA0B,EAAE0B,KAAgC;IAC9E,OAAO,CAAC,GAAGC,OACT3B,SAAS4B,MAAM,CAAC;YACdC,MAAM;YACNH;YACAC;QACF;AACJ;AAEA;;;;;CAKC,GACD,SAASR,uBAAuBW,iBAAkC;IAChE,MAAMC,MAAM,IAAIC,CAAAA,KAAc,iBAAC,CAAC;QAC9BC,UAAU;QACVC,mBAAmB;QACnB,qEAAqE;QACrE,sEAAsE;QACtEC,YAAY;IACd;IAEAJ,IAAIK,EAAE,CAAC,cAAc,CAACC;QACpBA,cAAcD,EAAE,CAAC,WAAW,CAACT;YAC3B,IAAI;gBACF,4EAA4E;gBAC5E,MAAMW,UAAUC,KAAKC,KAAK,CAACb,KAAKc,QAAQ;gBAExC,IAAIH,QAAQI,MAAM,KAAK,wCAAwCJ,QAAQK,MAAM,EAAE;oBAC7E,yDAAyD;oBACzD,MAAM,EAAEC,SAAS,EAAE,GAAGC,aAAa,GAAGP,QAAQK,MAAM;oBACpDG,yCAAwB,CAACC,GAAG,CAACH,WAAWC;gBAC1C,OAAO;oBACL,iFAAiF;oBACjFf,kBAAkBkB,OAAO,CAACC,OAAO,CAAC,CAACC;wBACjC,IAAIA,eAAeC,UAAU,KAAKD,eAAeE,IAAI,EAAE;4BACrDF,eAAeG,IAAI,CAAC1B,KAAKc,QAAQ;wBACnC;oBACF;gBACF;YACF,EAAE,OAAOhB,OAAO;gBACd5B,MAAM,sCAAsC4B;YAC9C;QACF;IACF;IAEA,OAAOM;AACT"}
|
|
@@ -69,7 +69,7 @@ const NODE_STDLIB_MODULES = [
|
|
|
69
69
|
'util/types',
|
|
70
70
|
// Collect all builtin modules...
|
|
71
71
|
...(_module().builtinModules || // @ts-expect-error
|
|
72
|
-
(process.binding ? Object.keys(process.binding('natives')) : []) || []).filter((x)=>!/^
|
|
72
|
+
(process.binding ? Object.keys(process.binding('natives')) : []) || []).filter((x)=>!/^(internal|v8|node-inspect)\/|\//.test(x) && ![
|
|
73
73
|
'sys'
|
|
74
74
|
].includes(x))
|
|
75
75
|
].sort();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/externals.ts"],"sourcesContent":["/**\n * Copyright © 2023 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 fs from 'fs';\nimport { builtinModules } from 'module';\nimport path from 'path';\n\n// A list of the Node.js standard library modules that are currently\n// available,\nexport const NODE_STDLIB_MODULES: string[] = [\n // Add all nested imports...\n 'assert/strict',\n 'dns/promises',\n 'inspector/promises',\n 'fs/promises',\n 'stream/web',\n 'stream/promises',\n 'path/posix',\n 'path/win32',\n 'readline/promises',\n 'stream/consumers',\n 'timers/promises',\n 'util/types',\n // Collect all builtin modules...\n ...(\n builtinModules ||\n // @ts-expect-error\n (process.binding ? Object.keys(process.binding('natives')) : []) ||\n []\n ).filter((x) => !/^
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/externals.ts"],"sourcesContent":["/**\n * Copyright © 2023 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 fs from 'fs';\nimport { builtinModules } from 'module';\nimport path from 'path';\n\n// A list of the Node.js standard library modules that are currently\n// available,\nexport const NODE_STDLIB_MODULES: string[] = [\n // Add all nested imports...\n 'assert/strict',\n 'dns/promises',\n 'inspector/promises',\n 'fs/promises',\n 'stream/web',\n 'stream/promises',\n 'path/posix',\n 'path/win32',\n 'readline/promises',\n 'stream/consumers',\n 'timers/promises',\n 'util/types',\n\n // Collect all builtin modules...\n ...(\n builtinModules ||\n // @ts-expect-error\n (process.binding ? Object.keys(process.binding('natives')) : []) ||\n []\n ).filter((x) => !/^(internal|v8|node-inspect)\\/|\\//.test(x) && !['sys'].includes(x)),\n].sort();\n\nconst shimsFolder = path.join(require.resolve('@expo/cli/package.json'), '../static/shims');\nconst canaryFolder = path.join(require.resolve('@expo/cli/package.json'), '../static/canary');\n\nexport function shouldCreateVirtualShim(normalName: string) {\n const shimPath = path.join(shimsFolder, normalName);\n if (fs.existsSync(shimPath)) {\n return shimPath;\n }\n return null;\n}\nexport function shouldCreateVirtualCanary(normalName: string): string | null {\n const canaryPath = path.join(canaryFolder, normalName);\n if (fs.existsSync(canaryPath)) {\n return canaryPath;\n }\n return null;\n}\n\nexport function isNodeExternal(moduleName: string): string | null {\n const moduleId = moduleName.replace(/^node:/, '');\n if (NODE_STDLIB_MODULES.includes(moduleId)) {\n return moduleId;\n }\n return null;\n}\n"],"names":["NODE_STDLIB_MODULES","isNodeExternal","shouldCreateVirtualCanary","shouldCreateVirtualShim","builtinModules","process","binding","Object","keys","filter","x","test","includes","sort","shimsFolder","path","join","require","resolve","canaryFolder","normalName","shimPath","fs","existsSync","canaryPath","moduleName","moduleId","replace"],"mappings":"AAAA;;;;;CAKC;;;;;;;;;;;IAOYA,mBAAmB;eAAnBA;;IA0CGC,cAAc;eAAdA;;IARAC,yBAAyB;eAAzBA;;IAPAC,uBAAuB;eAAvBA;;;;gEAjCD;;;;;;;yBACgB;;;;;;;gEACd;;;;;;;;;;;AAIV,MAAMH,sBAAgC;IAC3C,4BAA4B;IAC5B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA,iCAAiC;OAC9B,AACDI,CAAAA,wBAAc,IACd,mBAAmB;IAClBC,CAAAA,QAAQC,OAAO,GAAGC,OAAOC,IAAI,CAACH,QAAQC,OAAO,CAAC,cAAc,EAAE,AAAD,KAC9D,EAAE,AAAD,EACDG,MAAM,CAAC,CAACC,IAAM,CAAC,mCAAmCC,IAAI,CAACD,MAAM,CAAC;YAAC;SAAM,CAACE,QAAQ,CAACF;CAClF,CAACG,IAAI;AAEN,MAAMC,cAAcC,eAAI,CAACC,IAAI,CAACC,QAAQC,OAAO,CAAC,2BAA2B;AACzE,MAAMC,eAAeJ,eAAI,CAACC,IAAI,CAACC,QAAQC,OAAO,CAAC,2BAA2B;AAEnE,SAASf,wBAAwBiB,UAAkB;IACxD,MAAMC,WAAWN,eAAI,CAACC,IAAI,CAACF,aAAaM;IACxC,IAAIE,aAAE,CAACC,UAAU,CAACF,WAAW;QAC3B,OAAOA;IACT;IACA,OAAO;AACT;AACO,SAASnB,0BAA0BkB,UAAkB;IAC1D,MAAMI,aAAaT,eAAI,CAACC,IAAI,CAACG,cAAcC;IAC3C,IAAIE,aAAE,CAACC,UAAU,CAACC,aAAa;QAC7B,OAAOA;IACT;IACA,OAAO;AACT;AAEO,SAASvB,eAAewB,UAAkB;IAC/C,MAAMC,WAAWD,WAAWE,OAAO,CAAC,UAAU;IAC9C,IAAI3B,oBAAoBY,QAAQ,CAACc,WAAW;QAC1C,OAAOA;IACT;IACA,OAAO;AACT"}
|
|
@@ -126,7 +126,7 @@ class LogRespectingTerminal extends _metrocore().Terminal {
|
|
|
126
126
|
// Share one instance of Terminal for all instances of Metro.
|
|
127
127
|
const terminal = new LogRespectingTerminal(process.stdout);
|
|
128
128
|
async function loadMetroConfigAsync(projectRoot, options, { exp, isExporting, getMetroBundler }) {
|
|
129
|
-
var _exp_experiments, _exp_experiments1,
|
|
129
|
+
var _exp_experiments, _exp_experiments1, _exp_experiments2, _exp_experiments3, _config_resolver, _exp_experiments4, _exp_experiments5, _exp_experiments6;
|
|
130
130
|
let reportEvent;
|
|
131
131
|
const serverActionsEnabled = ((_exp_experiments = exp.experiments) == null ? void 0 : _exp_experiments.reactServerFunctions) ?? _env.env.EXPO_UNSTABLE_SERVER_FUNCTIONS;
|
|
132
132
|
if (serverActionsEnabled) {
|
|
@@ -137,6 +137,11 @@ async function loadMetroConfigAsync(projectRoot, options, { exp, isExporting, ge
|
|
|
137
137
|
process.env.EXPO_USE_METRO_REQUIRE = '1';
|
|
138
138
|
process.env.EXPO_USE_FAST_RESOLVER = '1';
|
|
139
139
|
}
|
|
140
|
+
const isReactCanaryEnabled = (((_exp_experiments2 = exp.experiments) == null ? void 0 : _exp_experiments2.reactServerComponentRoutes) || serverActionsEnabled || ((_exp_experiments3 = exp.experiments) == null ? void 0 : _exp_experiments3.reactCanary)) ?? false;
|
|
141
|
+
if (isReactCanaryEnabled) {
|
|
142
|
+
// The fast resolver is required for React canary to work as it can switch the node_modules location for react imports.
|
|
143
|
+
process.env.EXPO_USE_FAST_RESOLVER = '1';
|
|
144
|
+
}
|
|
140
145
|
const serverRoot = (0, _paths().getMetroServerRoot)(projectRoot);
|
|
141
146
|
const terminalReporter = new _MetroTerminalReporter.MetroTerminalReporter(serverRoot, terminal);
|
|
142
147
|
const hasConfig = await (0, _metroconfig1().resolveConfig)(options.config, projectRoot);
|
|
@@ -168,7 +173,7 @@ async function loadMetroConfigAsync(projectRoot, options, { exp, isExporting, ge
|
|
|
168
173
|
config.transformer.publicPath = '/assets/?unstable_path=.';
|
|
169
174
|
}
|
|
170
175
|
const platformBundlers = (0, _platformBundlers.getPlatformBundlers)(projectRoot, exp);
|
|
171
|
-
if ((
|
|
176
|
+
if ((_exp_experiments4 = exp.experiments) == null ? void 0 : _exp_experiments4.reactCompiler) {
|
|
172
177
|
_log.Log.warn(`Experimental React Compiler is enabled.`);
|
|
173
178
|
}
|
|
174
179
|
if (_env.env.EXPO_UNSTABLE_TREE_SHAKING && !_env.env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH) {
|
|
@@ -188,10 +193,10 @@ async function loadMetroConfigAsync(projectRoot, options, { exp, isExporting, ge
|
|
|
188
193
|
config,
|
|
189
194
|
exp,
|
|
190
195
|
platformBundlers,
|
|
191
|
-
isTsconfigPathsEnabled: ((
|
|
196
|
+
isTsconfigPathsEnabled: ((_exp_experiments5 = exp.experiments) == null ? void 0 : _exp_experiments5.tsconfigPaths) ?? true,
|
|
192
197
|
isFastResolverEnabled: _env.env.EXPO_USE_FAST_RESOLVER,
|
|
193
198
|
isExporting,
|
|
194
|
-
isReactCanaryEnabled
|
|
199
|
+
isReactCanaryEnabled,
|
|
195
200
|
isNamedRequiresEnabled: _env.env.EXPO_USE_METRO_REQUIRE,
|
|
196
201
|
isReactServerComponentsEnabled: !!((_exp_experiments6 = exp.experiments) == null ? void 0 : _exp_experiments6.reactServerComponentRoutes),
|
|
197
202
|
getMetroBundler
|
|
@@ -206,7 +211,7 @@ async function instantiateMetroAsync(metroBundler, options, { isExporting, exp =
|
|
|
206
211
|
skipSDKVersionRequirement: true
|
|
207
212
|
}).exp }) {
|
|
208
213
|
const projectRoot = metroBundler.projectRoot;
|
|
209
|
-
const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(projectRoot, options, {
|
|
214
|
+
const { config: metroConfig, setEventReporter, reporter } = await loadMetroConfigAsync(projectRoot, options, {
|
|
210
215
|
exp,
|
|
211
216
|
isExporting,
|
|
212
217
|
getMetroBundler () {
|
|
@@ -219,7 +224,7 @@ async function instantiateMetroAsync(metroBundler, options, { isExporting, exp =
|
|
|
219
224
|
// Enable correct CORS headers for Expo Router features
|
|
220
225
|
(0, _mutations.prependMiddleware)(middleware, (0, _CorsMiddleware.createCorsMiddleware)(exp));
|
|
221
226
|
// Enable debug middleware for CDP-related debugging
|
|
222
|
-
const { debugMiddleware, debugWebsocketEndpoints } = (0, _createDebugMiddleware.createDebugMiddleware)(metroBundler);
|
|
227
|
+
const { debugMiddleware, debugWebsocketEndpoints } = (0, _createDebugMiddleware.createDebugMiddleware)(metroBundler, reporter);
|
|
223
228
|
Object.assign(websocketEndpoints, debugWebsocketEndpoints);
|
|
224
229
|
middleware.use(debugMiddleware);
|
|
225
230
|
middleware.use('/_expo/debugger', (0, _createJsInspectorMiddleware.createJsInspectorMiddleware)());
|
|
@@ -387,8 +392,8 @@ function pruneCustomTransformOptions(filePath, transformOptions) {
|
|
|
387
392
|
!(filePath.match(/\/expo-router\/_ctx/) || filePath.match(/\/expo-router\/build\//))) {
|
|
388
393
|
delete transformOptions.customTransformOptions.asyncRoutes;
|
|
389
394
|
}
|
|
390
|
-
if (((_transformOptions_customTransformOptions3 = transformOptions.customTransformOptions) == null ? void 0 : _transformOptions_customTransformOptions3.clientBoundaries) && // The client boundaries are only used in
|
|
391
|
-
!filePath.match(
|
|
395
|
+
if (((_transformOptions_customTransformOptions3 = transformOptions.customTransformOptions) == null ? void 0 : _transformOptions_customTransformOptions3.clientBoundaries) && // The client boundaries are only used in `expo/virtual/rsc.js` for production RSC exports.
|
|
396
|
+
!filePath.match(/\/expo\/virtual\/rsc\.js$/)) {
|
|
392
397
|
delete transformOptions.customTransformOptions.clientBoundaries;
|
|
393
398
|
}
|
|
394
399
|
return transformOptions;
|
|
@@ -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 { ReadOnlyGraph } from 'metro';\nimport Bundler from 'metro/src/Bundler';\nimport type { TransformOptions } from 'metro/src/DeltaBundler/Worker';\nimport MetroHmrServer from 'metro/src/HmrServer';\nimport RevisionNotFoundError from 'metro/src/IncrementalBundler/RevisionNotFoundError';\nimport formatBundlingError from 'metro/src/lib/formatBundlingError';\nimport { loadConfig, resolveConfig, ConfigT } from 'metro-config';\nimport { Terminal } from 'metro-core';\nimport util from 'node:util';\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 } 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 const serverActionsEnabled =\n exp.experiments?.reactServerFunctions ?? env.EXPO_UNSTABLE_SERVER_FUNCTIONS;\n\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 (exp.experiments?.reactServerComponentRoutes || serverActionsEnabled) {\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 if (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 isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n isFastResolverEnabled: env.EXPO_USE_FAST_RESOLVER,\n isExporting,\n isReactCanaryEnabled:\n (exp.experiments?.reactServerComponentRoutes ||\n serverActionsEnabled ||\n exp.experiments?.reactCanary) ??\n false,\n isNamedRequiresEnabled: env.EXPO_USE_METRO_REQUIRE,\n isReactServerComponentsEnabled: !!exp.experiments?.reactServerComponentRoutes,\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 // 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: Metro.Server, graph: ReadOnlyGraph) {\n const modules = [...graph.dependencies.values()];\n\n const ctx = {\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 // @ts-expect-error\n this._createModuleId(module.path, ctx);\n }\n // Sort by IDs\n return modules.sort(\n // @ts-expect-error\n (a, b) => this._createModuleId(a.path, ctx) - this._createModuleId(b.path, ctx)\n );\n };\n\n if (hmrServer) {\n let hmrJSBundle: typeof import('@expo/metro-config/build/serializer/fork/hmrJSBundle').default;\n\n try {\n hmrJSBundle = require('@expo/metro-config/build/serializer/fork/hmrJSBundle').default;\n } catch {\n // 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('metro/src/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 (this: MetroHmrServer, group, options, changeEvent) {\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 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 // @ts-expect-error\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 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 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/metro-runtime/src/virtual.js` for production RSC exports.\n !filePath.match(/\\/@expo\\/metro-runtime\\/rsc\\/virtual\\.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":["instantiateMetroAsync","isWatchEnabled","loadMetroConfigAsync","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","serverActionsEnabled","experiments","reactServerFunctions","env","EXPO_UNSTABLE_SERVER_FUNCTIONS","reactServerComponentRoutes","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","_getSortedModules","graph","modules","dependencies","values","ctx","platform","environment","module","_createModuleId","path","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","set","moduleIdContext","hmrUpdate","clientUrl","createModuleId","moduleId","includeAsyncPaths","graphOptions","lazy","_config","unstable_serverRoot","error","formattedError","messageSocket","split","sep","join","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 { ReadOnlyGraph } from 'metro';\nimport Bundler from 'metro/src/Bundler';\nimport type { TransformOptions } from 'metro/src/DeltaBundler/Worker';\nimport MetroHmrServer from 'metro/src/HmrServer';\nimport RevisionNotFoundError from 'metro/src/IncrementalBundler/RevisionNotFoundError';\nimport formatBundlingError from 'metro/src/lib/formatBundlingError';\nimport { loadConfig, resolveConfig, ConfigT } from 'metro-config';\nimport { Terminal } from 'metro-core';\nimport util from 'node:util';\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 } 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 const serverActionsEnabled =\n exp.experiments?.reactServerFunctions ?? env.EXPO_UNSTABLE_SERVER_FUNCTIONS;\n\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 (exp.experiments?.reactServerComponentRoutes || serverActionsEnabled) {\n process.env.EXPO_USE_METRO_REQUIRE = '1';\n process.env.EXPO_USE_FAST_RESOLVER = '1';\n }\n\n const isReactCanaryEnabled =\n (exp.experiments?.reactServerComponentRoutes ||\n serverActionsEnabled ||\n exp.experiments?.reactCanary) ??\n false;\n\n if (isReactCanaryEnabled) {\n // The fast resolver is required for React canary to work as it can switch the node_modules location for react imports.\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 if (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 isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n isFastResolverEnabled: env.EXPO_USE_FAST_RESOLVER,\n isExporting,\n isReactCanaryEnabled,\n isNamedRequiresEnabled: env.EXPO_USE_METRO_REQUIRE,\n isReactServerComponentsEnabled: !!exp.experiments?.reactServerComponentRoutes,\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 {\n config: metroConfig,\n setEventReporter,\n reporter,\n } = await loadMetroConfigAsync(projectRoot, options, {\n exp,\n isExporting,\n getMetroBundler() {\n return metro.getBundler().getBundler();\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(\n metroBundler,\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 // @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 // 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: Metro.Server, graph: ReadOnlyGraph) {\n const modules = [...graph.dependencies.values()];\n\n const ctx = {\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 // @ts-expect-error\n this._createModuleId(module.path, ctx);\n }\n // Sort by IDs\n return modules.sort(\n // @ts-expect-error\n (a, b) => this._createModuleId(a.path, ctx) - this._createModuleId(b.path, ctx)\n );\n };\n\n if (hmrServer) {\n let hmrJSBundle: typeof import('@expo/metro-config/build/serializer/fork/hmrJSBundle').default;\n\n try {\n hmrJSBundle = require('@expo/metro-config/build/serializer/fork/hmrJSBundle').default;\n } catch {\n // 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('metro/src/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 (this: MetroHmrServer, group, options, changeEvent) {\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 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 // @ts-expect-error\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 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 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/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":["instantiateMetroAsync","isWatchEnabled","loadMetroConfigAsync","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","serverActionsEnabled","experiments","reactServerFunctions","env","EXPO_UNSTABLE_SERVER_FUNCTIONS","reactServerComponentRoutes","EXPO_USE_METRO_REQUIRE","EXPO_USE_FAST_RESOLVER","isReactCanaryEnabled","reactCanary","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","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","_getSortedModules","graph","modules","dependencies","values","ctx","platform","environment","module","_createModuleId","path","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","set","moduleIdContext","hmrUpdate","clientUrl","createModuleId","moduleId","includeAsyncPaths","graphOptions","lazy","_config","unstable_serverRoot","error","formattedError","messageSocket","split","sep","join","dom","match","routerRoot","asyncRoutes","clientBoundaries","CI","chalk"],"mappings":"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"}
|
|
@@ -34,13 +34,14 @@ function _stacktraceparser() {
|
|
|
34
34
|
}
|
|
35
35
|
const cache = new Map();
|
|
36
36
|
/**
|
|
37
|
-
* Sanitize because sometimes
|
|
37
|
+
* Sanitize because sometimes `symbolicateStackTrace` gives us invalid values.
|
|
38
38
|
*/ const sanitize = ({ stack: maybeStack, codeFrame })=>{
|
|
39
39
|
if (!Array.isArray(maybeStack)) {
|
|
40
40
|
throw new Error('Expected stack to be an array.');
|
|
41
41
|
}
|
|
42
42
|
const stack = [];
|
|
43
43
|
for (const maybeFrame of maybeStack){
|
|
44
|
+
var _maybeFrame_arguments;
|
|
44
45
|
let collapse = false;
|
|
45
46
|
if ('collapse' in maybeFrame) {
|
|
46
47
|
if (typeof maybeFrame.collapse !== 'boolean') {
|
|
@@ -49,7 +50,7 @@ const cache = new Map();
|
|
|
49
50
|
collapse = maybeFrame.collapse;
|
|
50
51
|
}
|
|
51
52
|
stack.push({
|
|
52
|
-
arguments: [],
|
|
53
|
+
arguments: ((_maybeFrame_arguments = maybeFrame.arguments) == null ? void 0 : _maybeFrame_arguments.map((arg)=>String(arg))) ?? [],
|
|
53
54
|
column: maybeFrame.column,
|
|
54
55
|
file: maybeFrame.file,
|
|
55
56
|
lineNumber: maybeFrame.lineNumber,
|
|
@@ -90,6 +91,24 @@ function parseErrorStack(stack) {
|
|
|
90
91
|
return stack;
|
|
91
92
|
}
|
|
92
93
|
return (0, _stacktraceparser().parse)(stack).map((frame)=>{
|
|
94
|
+
var _frame_arguments;
|
|
95
|
+
// Add back support for Hermes native calls:
|
|
96
|
+
// ` at apply (native)`
|
|
97
|
+
// Which are parsed to:
|
|
98
|
+
// {
|
|
99
|
+
// "file": null,
|
|
100
|
+
// "methodName": "apply",
|
|
101
|
+
// "arguments": ["native"],
|
|
102
|
+
// "lineNumber": null,
|
|
103
|
+
// "column": null,
|
|
104
|
+
// "collapse": false
|
|
105
|
+
// },
|
|
106
|
+
// https://github.com/facebook/react-native/blob/f0ad39446404bb6e027d0c486b579c312f35180a/packages/react-native/Libraries/Core/Devtools/parseHermesStack.js#L70
|
|
107
|
+
if (frame.file == null && ((_frame_arguments = frame.arguments) == null ? void 0 : _frame_arguments.length) === 1 && frame.arguments[0] === 'native') {
|
|
108
|
+
// Use `<native>` to match the `<anonymous>` and `<unknown>` used by other runtimes.
|
|
109
|
+
frame.file = '<native>';
|
|
110
|
+
frame.arguments = [];
|
|
111
|
+
}
|
|
93
112
|
// frame.file will mostly look like `http://localhost:8081/index.bundle?platform=web&dev=true&hot=false`
|
|
94
113
|
return {
|
|
95
114
|
...frame,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/start/server/metro/log-box/LogBoxSymbolication.ts"],"sourcesContent":["/**\n * Copyright (c) 650 Industries.\n * Copyright (c) Meta Platforms, Inc. and affiliates.\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 { parse, StackFrame as UpstreamStackFrame } from 'stacktrace-parser';\n\nexport type CodeFrame = {\n content: string;\n location?: {\n row: number;\n column: number;\n [key: string]: any;\n } | null;\n fileName: string;\n\n // TODO: When React switched to using call stack frames,\n // we gained the ability to use the collapse flag, but\n // it is not integrated into the LogBox UI.\n collapse?: boolean;\n};\n\nexport type SymbolicatedStackTrace = {\n stack: UpstreamStackFrame[];\n codeFrame?: CodeFrame;\n};\n\nexport type StackFrame = UpstreamStackFrame & { collapse?: boolean };\n\nconst cache: Map<StackFrame[], Promise<SymbolicatedStackTrace>> = new Map();\n\n/**\n * Sanitize because sometimes
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/metro/log-box/LogBoxSymbolication.ts"],"sourcesContent":["/**\n * Copyright (c) 650 Industries.\n * Copyright (c) Meta Platforms, Inc. and affiliates.\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 { parse, StackFrame as UpstreamStackFrame } from 'stacktrace-parser';\n\nexport type CodeFrame = {\n content: string;\n location?: {\n row: number;\n column: number;\n [key: string]: any;\n } | null;\n fileName: string;\n\n // TODO: When React switched to using call stack frames,\n // we gained the ability to use the collapse flag, but\n // it is not integrated into the LogBox UI.\n collapse?: boolean;\n};\n\nexport type SymbolicatedStackTrace = {\n stack: UpstreamStackFrame[];\n codeFrame?: CodeFrame;\n};\n\nexport type StackFrame = UpstreamStackFrame & { collapse?: boolean };\n\nconst cache: Map<StackFrame[], Promise<SymbolicatedStackTrace>> = new Map();\n\n/**\n * Sanitize because sometimes `symbolicateStackTrace` gives us invalid values.\n */\nconst sanitize = ({\n stack: maybeStack,\n codeFrame,\n}: SymbolicatedStackTrace): SymbolicatedStackTrace => {\n if (!Array.isArray(maybeStack)) {\n throw new Error('Expected stack to be an array.');\n }\n const stack: StackFrame[] = [];\n for (const maybeFrame of maybeStack) {\n let collapse = false;\n if ('collapse' in maybeFrame) {\n if (typeof maybeFrame.collapse !== 'boolean') {\n throw new Error('Expected stack frame `collapse` to be a boolean.');\n }\n collapse = maybeFrame.collapse;\n }\n stack.push({\n arguments: maybeFrame.arguments?.map((arg) => String(arg)) ?? [],\n column: maybeFrame.column,\n file: maybeFrame.file,\n lineNumber: maybeFrame.lineNumber,\n methodName: maybeFrame.methodName,\n collapse,\n });\n }\n return { stack, codeFrame };\n};\n\nexport function deleteStack(stack: StackFrame[]): void {\n cache.delete(stack);\n}\n\nexport function symbolicate(stack: StackFrame[]): Promise<SymbolicatedStackTrace> {\n let promise = cache.get(stack);\n if (promise == null) {\n promise = symbolicateStackTrace(stack).then(sanitize);\n cache.set(stack, promise);\n }\n\n return promise;\n}\n\nasync function symbolicateStackTrace(stack: UpstreamStackFrame[]): Promise<SymbolicatedStackTrace> {\n const baseUrl =\n typeof window === 'undefined'\n ? process.env.EXPO_DEV_SERVER_ORIGIN\n : window.location.protocol + '//' + window.location.host;\n\n return fetch(baseUrl + '/symbolicate', {\n method: 'POST',\n body: JSON.stringify({ stack }),\n }).then((res) => res.json());\n}\n\nexport function parseErrorStack(stack?: string): (UpstreamStackFrame & { collapse?: boolean })[] {\n if (stack == null) {\n return [];\n }\n if (Array.isArray(stack)) {\n return stack;\n }\n\n return parse(stack).map((frame) => {\n // Add back support for Hermes native calls:\n // ` at apply (native)`\n // Which are parsed to:\n // {\n // \"file\": null,\n // \"methodName\": \"apply\",\n // \"arguments\": [\"native\"],\n // \"lineNumber\": null,\n // \"column\": null,\n // \"collapse\": false\n // },\n // https://github.com/facebook/react-native/blob/f0ad39446404bb6e027d0c486b579c312f35180a/packages/react-native/Libraries/Core/Devtools/parseHermesStack.js#L70\n if (frame.file == null && frame.arguments?.length === 1 && frame.arguments[0] === 'native') {\n // Use `<native>` to match the `<anonymous>` and `<unknown>` used by other runtimes.\n frame.file = '<native>';\n frame.arguments = [];\n }\n\n // frame.file will mostly look like `http://localhost:8081/index.bundle?platform=web&dev=true&hot=false`\n return {\n ...frame,\n column: frame.column != null ? frame.column - 1 : null,\n };\n });\n}\n"],"names":["deleteStack","parseErrorStack","symbolicate","cache","Map","sanitize","stack","maybeStack","codeFrame","Array","isArray","Error","maybeFrame","collapse","push","arguments","map","arg","String","column","file","lineNumber","methodName","delete","promise","get","symbolicateStackTrace","then","set","baseUrl","window","process","env","EXPO_DEV_SERVER_ORIGIN","location","protocol","host","fetch","method","body","JSON","stringify","res","json","parse","frame","length"],"mappings":"AAAA;;;;;;CAMC;;;;;;;;;;;IA0DeA,WAAW;eAAXA;;IA0BAC,eAAe;eAAfA;;IAtBAC,WAAW;eAAXA;;;;yBA7DwC;;;;;;AAwBxD,MAAMC,QAA4D,IAAIC;AAEtE;;CAEC,GACD,MAAMC,WAAW,CAAC,EAChBC,OAAOC,UAAU,EACjBC,SAAS,EACc;IACvB,IAAI,CAACC,MAAMC,OAAO,CAACH,aAAa;QAC9B,MAAM,IAAII,MAAM;IAClB;IACA,MAAML,QAAsB,EAAE;IAC9B,KAAK,MAAMM,cAAcL,WAAY;YAStBK;QARb,IAAIC,WAAW;QACf,IAAI,cAAcD,YAAY;YAC5B,IAAI,OAAOA,WAAWC,QAAQ,KAAK,WAAW;gBAC5C,MAAM,IAAIF,MAAM;YAClB;YACAE,WAAWD,WAAWC,QAAQ;QAChC;QACAP,MAAMQ,IAAI,CAAC;YACTC,WAAWH,EAAAA,wBAAAA,WAAWG,SAAS,qBAApBH,sBAAsBI,GAAG,CAAC,CAACC,MAAQC,OAAOD,UAAS,EAAE;YAChEE,QAAQP,WAAWO,MAAM;YACzBC,MAAMR,WAAWQ,IAAI;YACrBC,YAAYT,WAAWS,UAAU;YACjCC,YAAYV,WAAWU,UAAU;YACjCT;QACF;IACF;IACA,OAAO;QAAEP;QAAOE;IAAU;AAC5B;AAEO,SAASR,YAAYM,KAAmB;IAC7CH,MAAMoB,MAAM,CAACjB;AACf;AAEO,SAASJ,YAAYI,KAAmB;IAC7C,IAAIkB,UAAUrB,MAAMsB,GAAG,CAACnB;IACxB,IAAIkB,WAAW,MAAM;QACnBA,UAAUE,sBAAsBpB,OAAOqB,IAAI,CAACtB;QAC5CF,MAAMyB,GAAG,CAACtB,OAAOkB;IACnB;IAEA,OAAOA;AACT;AAEA,eAAeE,sBAAsBpB,KAA2B;IAC9D,MAAMuB,UACJ,OAAOC,WAAW,cACdC,QAAQC,GAAG,CAACC,sBAAsB,GAClCH,OAAOI,QAAQ,CAACC,QAAQ,GAAG,OAAOL,OAAOI,QAAQ,CAACE,IAAI;IAE5D,OAAOC,MAAMR,UAAU,gBAAgB;QACrCS,QAAQ;QACRC,MAAMC,KAAKC,SAAS,CAAC;YAAEnC;QAAM;IAC/B,GAAGqB,IAAI,CAAC,CAACe,MAAQA,IAAIC,IAAI;AAC3B;AAEO,SAAS1C,gBAAgBK,KAAc;IAC5C,IAAIA,SAAS,MAAM;QACjB,OAAO,EAAE;IACX;IACA,IAAIG,MAAMC,OAAO,CAACJ,QAAQ;QACxB,OAAOA;IACT;IAEA,OAAOsC,IAAAA,yBAAK,EAACtC,OAAOU,GAAG,CAAC,CAAC6B;YAaGA;QAZ1B,4CAA4C;QAC5C,0BAA0B;QAC1B,uBAAuB;QACvB,IAAI;QACJ,kBAAkB;QAClB,2BAA2B;QAC3B,6BAA6B;QAC7B,wBAAwB;QACxB,oBAAoB;QACpB,sBAAsB;QACtB,KAAK;QACL,+JAA+J;QAC/J,IAAIA,MAAMzB,IAAI,IAAI,QAAQyB,EAAAA,mBAAAA,MAAM9B,SAAS,qBAAf8B,iBAAiBC,MAAM,MAAK,KAAKD,MAAM9B,SAAS,CAAC,EAAE,KAAK,UAAU;YAC1F,oFAAoF;YACpF8B,MAAMzB,IAAI,GAAG;YACbyB,MAAM9B,SAAS,GAAG,EAAE;QACtB;QAEA,wGAAwG;QACxG,OAAO;YACL,GAAG8B,KAAK;YACR1B,QAAQ0B,MAAM1B,MAAM,IAAI,OAAO0B,MAAM1B,MAAM,GAAG,IAAI;QACpD;IACF;AACF"}
|
|
@@ -16,23 +16,26 @@ _export(exports, {
|
|
|
16
16
|
return getStackFormattedLocation;
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
|
+
function _nodepath() {
|
|
20
|
+
const data = /*#__PURE__*/ _interop_require_default(require("node:path"));
|
|
21
|
+
_nodepath = function() {
|
|
22
|
+
return data;
|
|
23
|
+
};
|
|
24
|
+
return data;
|
|
25
|
+
}
|
|
26
|
+
function _interop_require_default(obj) {
|
|
27
|
+
return obj && obj.__esModule ? obj : {
|
|
28
|
+
default: obj
|
|
29
|
+
};
|
|
30
|
+
}
|
|
19
31
|
function formatProjectFilePath(projectRoot, file) {
|
|
20
32
|
if (file == null) {
|
|
21
33
|
return '<unknown>';
|
|
22
34
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
function pathRelativeToPath(path, relativeTo, sep = '/') {
|
|
26
|
-
const relativeToParts = relativeTo.split(sep);
|
|
27
|
-
const pathParts = path.split(sep);
|
|
28
|
-
let i = 0;
|
|
29
|
-
while(i < relativeToParts.length && i < pathParts.length){
|
|
30
|
-
if (relativeToParts[i] !== pathParts[i]) {
|
|
31
|
-
break;
|
|
32
|
-
}
|
|
33
|
-
i++;
|
|
35
|
+
if (file === '<anonymous>') {
|
|
36
|
+
return file;
|
|
34
37
|
}
|
|
35
|
-
return
|
|
38
|
+
return _nodepath().default.relative(projectRoot.replace(/\\/g, '/'), file.replace(/\\/g, '/')).replace(/\?.*$/, '');
|
|
36
39
|
}
|
|
37
40
|
function getStackFormattedLocation(projectRoot, frame) {
|
|
38
41
|
const column = frame.column != null && parseInt(String(frame.column), 10);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/start/server/metro/log-box/formatProjectFilePath.ts"],"sourcesContent":["import type { StackFrame } from 'stacktrace-parser';\n\nexport type MetroStackFrame = StackFrame & { collapse?: boolean };\n\nexport function formatProjectFilePath(projectRoot: string, file?: string | null): string {\n if (file == null) {\n return '<unknown>';\n }\n\n return
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/metro/log-box/formatProjectFilePath.ts"],"sourcesContent":["import path from 'node:path';\nimport type { StackFrame } from 'stacktrace-parser';\n\nexport type MetroStackFrame = StackFrame & { collapse?: boolean };\n\nexport function formatProjectFilePath(projectRoot: string, file?: string | null): string {\n if (file == null) {\n return '<unknown>';\n }\n if (file === '<anonymous>') {\n return file;\n }\n\n return path\n .relative(projectRoot.replace(/\\\\/g, '/'), file.replace(/\\\\/g, '/'))\n .replace(/\\?.*$/, '');\n}\n\nexport function getStackFormattedLocation(projectRoot: string, frame: MetroStackFrame) {\n const column = frame.column != null && parseInt(String(frame.column), 10);\n const location =\n formatProjectFilePath(projectRoot, frame.file) +\n (frame.lineNumber != null\n ? ':' + frame.lineNumber + (column && !isNaN(column) ? ':' + (column + 1) : '')\n : '');\n\n return location;\n}\n"],"names":["formatProjectFilePath","getStackFormattedLocation","projectRoot","file","path","relative","replace","frame","column","parseInt","String","location","lineNumber","isNaN"],"mappings":";;;;;;;;;;;IAKgBA,qBAAqB;eAArBA;;IAaAC,yBAAyB;eAAzBA;;;;gEAlBC;;;;;;;;;;;AAKV,SAASD,sBAAsBE,WAAmB,EAAEC,IAAoB;IAC7E,IAAIA,QAAQ,MAAM;QAChB,OAAO;IACT;IACA,IAAIA,SAAS,eAAe;QAC1B,OAAOA;IACT;IAEA,OAAOC,mBAAI,CACRC,QAAQ,CAACH,YAAYI,OAAO,CAAC,OAAO,MAAMH,KAAKG,OAAO,CAAC,OAAO,MAC9DA,OAAO,CAAC,SAAS;AACtB;AAEO,SAASL,0BAA0BC,WAAmB,EAAEK,KAAsB;IACnF,MAAMC,SAASD,MAAMC,MAAM,IAAI,QAAQC,SAASC,OAAOH,MAAMC,MAAM,GAAG;IACtE,MAAMG,WACJX,sBAAsBE,aAAaK,MAAMJ,IAAI,IAC5CI,CAAAA,MAAMK,UAAU,IAAI,OACjB,MAAML,MAAMK,UAAU,GAAIJ,CAAAA,UAAU,CAACK,MAAML,UAAU,MAAOA,CAAAA,SAAS,CAAA,IAAK,EAAC,IAC3E,EAAC;IAEP,OAAOG;AACT"}
|
|
@@ -118,6 +118,7 @@ async function logMetroErrorWithStack(projectRoot, { stack, codeFrame, error })
|
|
|
118
118
|
}
|
|
119
119
|
function getStackAsFormattedLog(projectRoot, { stack, codeFrame, error, showCollapsedFrames = _env.env.EXPO_DEBUG }) {
|
|
120
120
|
const logs = [];
|
|
121
|
+
let hasCodeFramePresented = false;
|
|
121
122
|
if (codeFrame) {
|
|
122
123
|
var _codeFrame_location;
|
|
123
124
|
const maxWarningLineLength = Math.max(800, process.stdout.columns);
|
|
@@ -157,9 +158,11 @@ function getStackAsFormattedLog(projectRoot, { stack, codeFrame, error, showColl
|
|
|
157
158
|
// If the column property could be found, then use that to fix the cursor location which is often broken in regex.
|
|
158
159
|
cursorLine = (column == null ? '' : fill(column) + _chalk().default.reset('^')).slice(minBounds);
|
|
159
160
|
logs.push(formattedPath, '', previewLine, cursorLine, _chalk().default.dim('(error truncated)'));
|
|
161
|
+
hasCodeFramePresented = true;
|
|
160
162
|
}
|
|
161
163
|
} else {
|
|
162
164
|
logs.push(codeFrame.content);
|
|
165
|
+
hasCodeFramePresented = true;
|
|
163
166
|
}
|
|
164
167
|
}
|
|
165
168
|
if (stack == null ? void 0 : stack.length) {
|
|
@@ -171,26 +174,34 @@ function getStackAsFormattedLog(projectRoot, { stack, codeFrame, error, showColl
|
|
|
171
174
|
};
|
|
172
175
|
});
|
|
173
176
|
const stackLines = [];
|
|
177
|
+
const backupStackLines = [];
|
|
174
178
|
stackProps.forEach((frame)=>{
|
|
175
|
-
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
179
|
+
const shouldShow = !frame.collapse || showCollapsedFrames;
|
|
178
180
|
const position = _terminallink().default.isSupported ? (0, _terminallink().default)(frame.subtitle, frame.subtitle) : frame.subtitle;
|
|
179
181
|
let lineItem = _chalk().default.gray(` ${frame.title} (${position})`);
|
|
180
182
|
if (frame.collapse) {
|
|
181
183
|
lineItem = _chalk().default.dim(lineItem);
|
|
182
184
|
}
|
|
183
185
|
// Never show the internal module system.
|
|
184
|
-
|
|
185
|
-
|
|
186
|
+
const isMetroRuntime = /\/metro-runtime\/src\/polyfills\/require\.js/.test(frame.subtitle) || /\/metro-require\/require\.js/.test(frame.subtitle);
|
|
187
|
+
if (!isMetroRuntime) {
|
|
188
|
+
if (shouldShow) {
|
|
189
|
+
stackLines.push(lineItem);
|
|
190
|
+
}
|
|
191
|
+
backupStackLines.push(lineItem);
|
|
186
192
|
}
|
|
187
193
|
});
|
|
188
|
-
|
|
194
|
+
if (hasCodeFramePresented) {
|
|
195
|
+
logs.push('');
|
|
196
|
+
}
|
|
189
197
|
logs.push(_chalk().default.bold`Call Stack`);
|
|
190
|
-
if (!
|
|
198
|
+
if (!backupStackLines.length) {
|
|
191
199
|
logs.push(_chalk().default.gray(' No stack trace available.'));
|
|
192
200
|
} else {
|
|
193
|
-
|
|
201
|
+
// 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
|
|
202
|
+
// the stacks to give the user whatever help we can.
|
|
203
|
+
const displayStack = stackLines.length ? stackLines : backupStackLines;
|
|
204
|
+
logs.push(displayStack.join('\n'));
|
|
194
205
|
}
|
|
195
206
|
} else if (error) {
|
|
196
207
|
logs.push(_chalk().default.gray(` ${error.stack}`));
|