import { AnyRecord } from '@codeleap/types' import { deepMerge } from '@codeleap/utils' import { createPathConfigForStaticNavigation } from '@react-navigation/native' type TreeStack = Parameters[0] /** * Accesses `config.screenOptions` and `group.screenOptions` via `@ts-ignore` because `@react-navigation/native` does not expose these properties in the public `TreeStack` type — they exist at runtime but are considered internal to the static navigation builder. If React Navigation changes this internal shape, the extraction will silently return empty options rather than throwing. */ export function staticNavigationExtractOptions(stack: TreeStack) { const { config } = stack // @ts-ignore const defaultOptions = config.screenOptions let result = {} function extractScreens(screens: TreeStack['config'], groupKey: string | null, groupOptions: AnyRecord) { let screenResults = {} for (const screenKey in screens) { const screen = screens[screenKey] const key = groupKey ? `${groupKey}.${screenKey}` : screenKey const isComponentInstance = typeof screen !== 'object' const defaultScreenOptions = deepMerge(defaultOptions, groupOptions) if (isComponentInstance) { screenResults[key] = defaultScreenOptions continue } const screenOptions = deepMerge(defaultScreenOptions, screen.options) const isNavigationInstance = !!screen?.screen?.config?.screens if (isNavigationInstance) { screenResults = deepMerge( screenResults, extractScreens(screen?.screen?.config?.screens, null, screenOptions) ) continue } screenResults[key] = screenOptions } return screenResults } for (const groupKey in config.groups) { const group = config.groups[groupKey] // @ts-ignore const groupOptions = group.screenOptions result = deepMerge(result, extractScreens(group.screens, null, groupOptions)) } return result }