CodeVetter · Repo Unpack · Behavior traces
react/react-native
Three flows were traced end-to-end: (A) JS environment init -> app registration -> first render; (B) `react-native start` dev-server boot from the bin shim through Metro.runServer; (C) a TurboModule/native call plus codegen generation. Ordered function calls are named in each claim.
- Startup A1: Metro bundle -> serializer.getModulesRunBeforeMainModule() returns ['react-native/setup-env'] -> setup-env.js calls setUpDefaultReactNativeEnvironment() once (idempotent via `initialized` flag).
- Startup A2 (ordered): setUpGlobals -> setUpDOM -> setUpPerformance -> polyfillPromise -> setUpTimers -> [__DEV__] setUpReactDevTools -> setUpErrorHandling -> setUpRegeneratorRuntime -> setUpXHR -> setUpAlert -> setUpNavigator -> setUpBatchedBridge -> setUpSegmentFetcher -> [__DEV__] checkNativeVersion, setUpDeveloperTools, LogBox.install() -> require(AppRegistry) -> flag-gated setUpIntersectionObserver/setUpMutationObserver/setUpResizeObserver.
- Startup A3: AppRegistry module load registers the 'LogBox' surface component, sets global.RN$AppRegistry, and registerCallableModule('AppRegistry', AppRegistry) so native can invoke runApplication over the bridge; user code's registerComponent(appKey, provider) stores runnables[appKey] = (appParameters, displayMode) => renderApplication({...}).
- Startup A4: native calls runApplication -> runnable fires renderApplication -> invariant(rootTag) -> builds <AppContainer rootTag WrapperComponent rootViewStyle initialProps internal_excludeLogBox><RootComponent .../></AppContainer> -> optional DEV debugName wrapper via getCachedComponentWithDebugName -> optional React.unstable_Activity wrapper when useOffscreen -> Renderer.renderElement({element, rootTag: createRootTag(rootTag)}).
- Startup A5 (platform): Android ReactActivityDelegate resolves ReactHost (bridgeless) -> ReactHostImpl lazily creates the ReactInstance guarded by Bolts Tasks; the deprecated path builds ReactInstanceManager via ReactNativeHost.getBaseReactInstanceManagerBuilder().setJSMainModulePath(...).addPackage(each getPackages()).build(). iOS: RCTReactNativeFactory.initWithDelegate:releaseLevel: -> _setUpFeatureFlags -> applyDefaultColorSpace -> createRCTRootViewFactory -> startReactNativeWithModuleName:inWindow:.packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java#L87-100packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.kt#L79-121packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.kt#L86-120packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.mm#L76-100
- Dev server B1: `react-native` bin -> cli.js -> findCommunityCli() resolves '@react-native-community/cli' from process.cwd() (supports pnpm-style isolated node_modules) -> cli.run('react-native'); when required as a library, a missing community CLI is silently tolerated.
- Dev server B2: community CLI loads react-native.config.js which pushes bundleCommand, startCommand, codegenCommand, spmCommand from @react-native/community-cli-plugin and dynamically resolves @react-native-community/cli-platform-{android,ios} for platform project/dependency config.
- Dev server B3 (ordered inside runDevServer): loadMetroConfig(cliConfig, {...flags}) -> isDevServerRunning(devServerUrl, projectRoot) returning 'matched_server_running'|'port_taken' -> build TerminalReporter (or --custom-log-reporter-path) -> loadCommunityMiddleware().createCommunityMiddleware({host, port, watchFolders}) -> createDevMiddleware({serverBaseUrl, logger}) -> Metro.runServer(metroConfig, {host, secure, secureCert, secureKey, unstable_extraMiddleware: [communityMiddleware, middleware], websocketEndpoints: merged}) -> eventsSocketEndpoint.reportEvent wired into the reporter -> version.logIfUpdateAvailable.
- Dev server B4 (key handlers): when interactive, 'initialize_done' triggers attachKeyHandlers({devServerUrl, messageSocket, reporter}) so pressing keys (e.g. open debugger via OpenDebuggerKeyboardHandler) talks to the dev middleware over the message socket.
- Native call C1: a spec module like NativeDevSettings re-exports the typed interface from src/private/specs_DEPRECATED/modules; callers do TurboModuleRegistry.getEnforcing('DevSettings') -> global.__turboModuleProxy('DevSettings') (JSI-installed proxy) -> fallback NativeModules['DevSettings'] -> invariant throw 'Verify that a module by this name is registered in the native binary.'
- Codegen C2 (ordered): `react-native codegen` -> require.resolve('react-native/scripts/codegen/generate-artifacts-executor/index') -> .execute(path, platform, outputPath, source) -> parsers produce schemas (combine-js-to-schema-cli merges per-library schemas) -> RNCodegen.generate validates each schema via SchemaValidator.validate then fans out to the requested LIBRARY_GENERATORS -> checkOrWriteFiles writes output dirs or diffs in test mode.
- Bundle flow (release): `react-native bundle` -> buildBundle (unstable_buildBundleWithConfig exported for embedders) -> Metro bundle build -> saveAssets writes resolved asset files per platform (getAssetDestPathAndroid / getAssetDestPathIOS / assetCatalogIOS / filterPlatformAssetScales); Metro's transformer.assetRegistryPath is 'react-native/asset-registry' so asset requires become registry calls.packages/community-cli-plugin/src/commands/bundle/index.js#L26-60packages/community-cli-plugin/src/commands/bundle/buildBundle.jspackages/community-cli-plugin/src/commands/bundle/saveAssets.jspackages/community-cli-plugin/src/commands/bundle/assetCatalogIOS.jspackages/metro-config/src/index.flow.js#L85-89