@react-navigation/core 6.0.1 → 6.1.1
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/lib/commonjs/BaseNavigationContainer.js +17 -12
- package/lib/commonjs/BaseNavigationContainer.js.map +1 -1
- package/lib/commonjs/CurrentRenderContext.js.map +1 -1
- package/lib/commonjs/EnsureSingleNavigator.js +5 -4
- package/lib/commonjs/EnsureSingleNavigator.js.map +1 -1
- package/lib/commonjs/NavigationContainerRefContext.js.map +1 -1
- package/lib/commonjs/NavigationContext.js.map +1 -1
- package/lib/commonjs/NavigationHelpersContext.js.map +1 -1
- package/lib/commonjs/NavigationRouteContext.js.map +1 -1
- package/lib/commonjs/SceneView.js +11 -10
- package/lib/commonjs/SceneView.js.map +1 -1
- package/lib/commonjs/UnhandledActionContext.js.map +1 -1
- package/lib/commonjs/createNavigationContainerRef.js +64 -16
- package/lib/commonjs/createNavigationContainerRef.js.map +1 -1
- package/lib/commonjs/createNavigatorFactory.js +1 -1
- package/lib/commonjs/createNavigatorFactory.js.map +1 -1
- package/lib/commonjs/fromEntries.js +3 -1
- package/lib/commonjs/fromEntries.js.map +1 -1
- package/lib/commonjs/getActionFromState.js +2 -1
- package/lib/commonjs/getActionFromState.js.map +1 -1
- package/lib/commonjs/getPathFromState.js +13 -3
- package/lib/commonjs/getPathFromState.js.map +1 -1
- package/lib/commonjs/getStateFromPath.js +12 -2
- package/lib/commonjs/getStateFromPath.js.map +1 -1
- package/lib/commonjs/index.js +24 -24
- package/lib/commonjs/isArrayEqual.js +9 -1
- package/lib/commonjs/isArrayEqual.js.map +1 -1
- package/lib/commonjs/isRecordEqual.js +25 -0
- package/lib/commonjs/isRecordEqual.js.map +1 -0
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/useChildListeners.js.map +1 -1
- package/lib/commonjs/useCurrentRender.js +6 -5
- package/lib/commonjs/useCurrentRender.js.map +1 -1
- package/lib/commonjs/useDescriptors.js +18 -17
- package/lib/commonjs/useDescriptors.js.map +1 -1
- package/lib/commonjs/useEventEmitter.js +7 -6
- package/lib/commonjs/useEventEmitter.js.map +1 -1
- package/lib/commonjs/useFocusEvents.js +5 -4
- package/lib/commonjs/useFocusEvents.js.map +1 -1
- package/lib/commonjs/useFocusedListenersChildrenAdapter.js +5 -4
- package/lib/commonjs/useFocusedListenersChildrenAdapter.js.map +1 -1
- package/lib/commonjs/useKeyedChildListeners.js.map +1 -1
- package/lib/commonjs/useNavigationBuilder.js +51 -20
- package/lib/commonjs/useNavigationBuilder.js.map +1 -1
- package/lib/commonjs/useNavigationCache.js +17 -10
- package/lib/commonjs/useNavigationCache.js.map +1 -1
- package/lib/commonjs/useNavigationHelpers.js +10 -7
- package/lib/commonjs/useNavigationHelpers.js.map +1 -1
- package/lib/commonjs/useOnAction.js +13 -11
- package/lib/commonjs/useOnAction.js.map +1 -1
- package/lib/commonjs/useOnGetState.js +5 -4
- package/lib/commonjs/useOnGetState.js.map +1 -1
- package/lib/commonjs/useOnPreventRemove.js +6 -5
- package/lib/commonjs/useOnPreventRemove.js.map +1 -1
- package/lib/commonjs/useOnRouteFocus.js +7 -6
- package/lib/commonjs/useOnRouteFocus.js.map +1 -1
- package/lib/commonjs/useOptionsGetters.js +6 -5
- package/lib/commonjs/useOptionsGetters.js.map +1 -1
- package/lib/commonjs/useRegisterNavigator.js +1 -1
- package/lib/commonjs/useRegisterNavigator.js.map +1 -1
- package/lib/commonjs/useRouteCache.js +1 -1
- package/lib/commonjs/useScheduleUpdate.js +1 -1
- package/lib/commonjs/validatePathConfig.js +5 -2
- package/lib/commonjs/validatePathConfig.js.map +1 -1
- package/lib/module/BaseNavigationContainer.js +17 -12
- package/lib/module/BaseNavigationContainer.js.map +1 -1
- package/lib/module/CurrentRenderContext.js.map +1 -1
- package/lib/module/EnsureSingleNavigator.js +4 -3
- package/lib/module/EnsureSingleNavigator.js.map +1 -1
- package/lib/module/NavigationContainerRefContext.js.map +1 -1
- package/lib/module/NavigationContext.js.map +1 -1
- package/lib/module/NavigationHelpersContext.js.map +1 -1
- package/lib/module/NavigationRouteContext.js.map +1 -1
- package/lib/module/SceneView.js +11 -10
- package/lib/module/SceneView.js.map +1 -1
- package/lib/module/UnhandledActionContext.js.map +1 -1
- package/lib/module/createNavigationContainerRef.js +63 -15
- package/lib/module/createNavigationContainerRef.js.map +1 -1
- package/lib/module/createNavigatorFactory.js +1 -1
- package/lib/module/createNavigatorFactory.js.map +1 -1
- package/lib/module/fromEntries.js +3 -1
- package/lib/module/fromEntries.js.map +1 -1
- package/lib/module/getActionFromState.js +2 -1
- package/lib/module/getActionFromState.js.map +1 -1
- package/lib/module/getPathFromState.js +13 -3
- package/lib/module/getPathFromState.js.map +1 -1
- package/lib/module/getStateFromPath.js +12 -2
- package/lib/module/getStateFromPath.js.map +1 -1
- package/lib/module/isArrayEqual.js +9 -1
- package/lib/module/isArrayEqual.js.map +1 -1
- package/lib/module/isRecordEqual.js +18 -0
- package/lib/module/isRecordEqual.js.map +1 -0
- package/lib/module/types.js.map +1 -1
- package/lib/module/useChildListeners.js.map +1 -1
- package/lib/module/useCurrentRender.js +6 -5
- package/lib/module/useCurrentRender.js.map +1 -1
- package/lib/module/useDescriptors.js +18 -17
- package/lib/module/useDescriptors.js.map +1 -1
- package/lib/module/useEventEmitter.js +7 -6
- package/lib/module/useEventEmitter.js.map +1 -1
- package/lib/module/useFocusEvents.js +5 -4
- package/lib/module/useFocusEvents.js.map +1 -1
- package/lib/module/useFocusedListenersChildrenAdapter.js +5 -4
- package/lib/module/useFocusedListenersChildrenAdapter.js.map +1 -1
- package/lib/module/useKeyedChildListeners.js.map +1 -1
- package/lib/module/useNavigationBuilder.js +50 -20
- package/lib/module/useNavigationBuilder.js.map +1 -1
- package/lib/module/useNavigationCache.js +17 -10
- package/lib/module/useNavigationCache.js.map +1 -1
- package/lib/module/useNavigationHelpers.js +10 -7
- package/lib/module/useNavigationHelpers.js.map +1 -1
- package/lib/module/useOnAction.js +13 -11
- package/lib/module/useOnAction.js.map +1 -1
- package/lib/module/useOnGetState.js +5 -4
- package/lib/module/useOnGetState.js.map +1 -1
- package/lib/module/useOnPreventRemove.js +6 -5
- package/lib/module/useOnPreventRemove.js.map +1 -1
- package/lib/module/useOnRouteFocus.js +7 -6
- package/lib/module/useOnRouteFocus.js.map +1 -1
- package/lib/module/useOptionsGetters.js +6 -5
- package/lib/module/useOptionsGetters.js.map +1 -1
- package/lib/module/useRegisterNavigator.js +1 -1
- package/lib/module/useRegisterNavigator.js.map +1 -1
- package/lib/module/validatePathConfig.js +5 -2
- package/lib/module/validatePathConfig.js.map +1 -1
- package/lib/typescript/src/isRecordEqual.d.ts +4 -0
- package/lib/typescript/src/types.d.ts +11 -0
- package/lib/typescript/src/useDescriptors.d.ts +5 -4
- package/package.json +5 -5
- package/src/BaseNavigationContainer.tsx +4 -3
- package/src/CurrentRenderContext.tsx +3 -2
- package/src/EnsureSingleNavigator.tsx +7 -8
- package/src/NavigationContainerRefContext.tsx +3 -4
- package/src/NavigationContext.tsx +3 -2
- package/src/NavigationHelpersContext.tsx +3 -2
- package/src/NavigationRouteContext.tsx +3 -2
- package/src/UnhandledActionContext.tsx +3 -4
- package/src/createNavigationContainerRef.tsx +63 -12
- package/src/createNavigatorFactory.tsx +1 -1
- package/src/isArrayEqual.tsx +9 -1
- package/src/isRecordEqual.tsx +20 -0
- package/src/types.tsx +19 -6
- package/src/useChildListeners.tsx +3 -5
- package/src/useDescriptors.tsx +8 -7
- package/src/useKeyedChildListeners.tsx +6 -8
- package/src/useNavigationBuilder.tsx +89 -27
- package/src/useRegisterNavigator.tsx +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["getPathFromState.tsx"],"names":["getActiveRoute","state","route","index","routes","length","getPathFromState","options","Error","configs","screens","createNormalizedConfigs","path","current","allParams","pattern","focusedParams","focusedRoute","currentOptions","nestedRouteNames","hasNext","name","push","params","stringify","currentParams","Object","entries","map","key","value","String","assign","split","filter","p","startsWith","forEach","getParamName","undefined","nextRoute","nestedConfig","join","endsWith","encodeURIComponent","param","query","queryString","sort","replace","joinPaths","paths","concat","Boolean","createConfigItem","config","parentPattern","exact","c","result"],"mappings":"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","sourcesContent":["import type {\n NavigationState,\n PartialState,\n Route,\n} from '@react-navigation/routers';\nimport * as queryString from 'query-string';\n\nimport fromEntries from './fromEntries';\nimport type { PathConfig, PathConfigMap } from './types';\nimport validatePathConfig from './validatePathConfig';\n\ntype Options<ParamList> = {\n initialRouteName?: string;\n screens: PathConfigMap<ParamList>;\n};\n\ntype State = NavigationState | Omit<PartialState<NavigationState>, 'stale'>;\n\ntype StringifyConfig = Record<string, (value: any) => string>;\n\ntype ConfigItem = {\n pattern?: string;\n stringify?: StringifyConfig;\n screens?: Record<string, ConfigItem>;\n};\n\nconst getActiveRoute = (state: State): { name: string; params?: object } => {\n const route =\n typeof state.index === 'number'\n ? state.routes[state.index]\n : state.routes[state.routes.length - 1];\n\n if (route.state) {\n return getActiveRoute(route.state);\n }\n\n return route;\n};\n\n/**\n * Utility to serialize a navigation state object to a path string.\n *\n * @example\n * ```js\n * getPathFromState(\n * {\n * routes: [\n * {\n * name: 'Chat',\n * params: { author: 'Jane', id: 42 },\n * },\n * ],\n * },\n * {\n * screens: {\n * Chat: {\n * path: 'chat/:author/:id',\n * stringify: { author: author => author.toLowerCase() }\n * }\n * }\n * }\n * )\n * ```\n *\n * @param state Navigation state to serialize.\n * @param options Extra options to fine-tune how to serialize the path.\n * @returns Path representing the state, e.g. /foo/bar?count=42.\n */\nexport default function getPathFromState<ParamList extends {}>(\n state: State,\n options?: Options<ParamList>\n): string {\n if (state == null) {\n throw Error(\n \"Got 'undefined' for the navigation state. You must pass a valid state object.\"\n );\n }\n\n if (options) {\n validatePathConfig(options);\n }\n\n // Create a normalized configs object which will be easier to use\n const configs: Record<string, ConfigItem> = options?.screens\n ? createNormalizedConfigs(options?.screens)\n : {};\n\n let path = '/';\n let current: State | undefined = state;\n\n const allParams: Record<string, any> = {};\n\n while (current) {\n let index = typeof current.index === 'number' ? current.index : 0;\n let route = current.routes[index] as Route<string> & {\n state?: State;\n };\n\n let pattern: string | undefined;\n\n let focusedParams: Record<string, any> | undefined;\n let focusedRoute = getActiveRoute(state);\n let currentOptions = configs;\n\n // Keep all the route names that appeared during going deeper in config in case the pattern is resolved to undefined\n let nestedRouteNames = [];\n\n let hasNext = true;\n\n while (route.name in currentOptions && hasNext) {\n pattern = currentOptions[route.name].pattern;\n\n nestedRouteNames.push(route.name);\n\n if (route.params) {\n const stringify = currentOptions[route.name]?.stringify;\n\n const currentParams = fromEntries(\n Object.entries(route.params).map(([key, value]) => [\n key,\n stringify?.[key] ? stringify[key](value) : String(value),\n ])\n );\n\n if (pattern) {\n Object.assign(allParams, currentParams);\n }\n\n if (focusedRoute === route) {\n // If this is the focused route, keep the params for later use\n // We save it here since it's been stringified already\n focusedParams = { ...currentParams };\n\n pattern\n ?.split('/')\n .filter((p) => p.startsWith(':'))\n // eslint-disable-next-line no-loop-func\n .forEach((p) => {\n const name = getParamName(p);\n\n // Remove the params present in the pattern since we'll only use the rest for query string\n if (focusedParams) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete focusedParams[name];\n }\n });\n }\n }\n\n // If there is no `screens` property or no nested state, we return pattern\n if (!currentOptions[route.name].screens || route.state === undefined) {\n hasNext = false;\n } else {\n index =\n typeof route.state.index === 'number'\n ? route.state.index\n : route.state.routes.length - 1;\n\n const nextRoute = route.state.routes[index];\n const nestedConfig = currentOptions[route.name].screens;\n\n // if there is config for next route name, we go deeper\n if (nestedConfig && nextRoute.name in nestedConfig) {\n route = nextRoute as Route<string> & { state?: State };\n currentOptions = nestedConfig;\n } else {\n // If not, there is no sense in going deeper in config\n hasNext = false;\n }\n }\n }\n\n if (pattern === undefined) {\n pattern = nestedRouteNames.join('/');\n }\n\n if (currentOptions[route.name] !== undefined) {\n path += pattern\n .split('/')\n .map((p) => {\n const name = getParamName(p);\n\n // We don't know what to show for wildcard patterns\n // Showing the route name seems ok, though whatever we show here will be incorrect\n // Since the page doesn't actually exist\n if (p === '*') {\n return route.name;\n }\n\n // If the path has a pattern for a param, put the param in the path\n if (p.startsWith(':')) {\n const value = allParams[name];\n\n if (value === undefined && p.endsWith('?')) {\n // Optional params without value assigned in route.params should be ignored\n return '';\n }\n\n return encodeURIComponent(value);\n }\n\n return encodeURIComponent(p);\n })\n .join('/');\n } else {\n path += encodeURIComponent(route.name);\n }\n\n if (!focusedParams) {\n focusedParams = focusedRoute.params;\n }\n\n if (route.state) {\n path += '/';\n } else if (focusedParams) {\n for (let param in focusedParams) {\n if (focusedParams[param] === 'undefined') {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete focusedParams[param];\n }\n }\n\n const query = queryString.stringify(focusedParams, { sort: false });\n\n if (query) {\n path += `?${query}`;\n }\n }\n\n current = route.state;\n }\n\n // Remove multiple as well as trailing slashes\n path = path.replace(/\\/+/g, '/');\n path = path.length > 1 ? path.replace(/\\/$/, '') : path;\n\n return path;\n}\n\nconst getParamName = (pattern: string) =>\n pattern.replace(/^:/, '').replace(/\\?$/, '');\n\nconst joinPaths = (...paths: string[]): string =>\n ([] as string[])\n .concat(...paths.map((p) => p.split('/')))\n .filter(Boolean)\n .join('/');\n\nconst createConfigItem = (\n config: PathConfig<object> | string,\n parentPattern?: string\n): ConfigItem => {\n if (typeof config === 'string') {\n // If a string is specified as the value of the key(e.g. Foo: '/path'), use it as the pattern\n const pattern = parentPattern ? joinPaths(parentPattern, config) : config;\n\n return { pattern };\n }\n\n // If an object is specified as the value (e.g. Foo: { ... }),\n // It can have `path` property and `screens` prop which has nested configs\n let pattern: string | undefined;\n\n if (config.exact && config.path === undefined) {\n throw new Error(\n \"A 'path' needs to be specified when specifying 'exact: true'. If you don't want this screen in the URL, specify it as empty string, e.g. `path: ''`.\"\n );\n }\n\n pattern =\n config.exact !== true\n ? joinPaths(parentPattern || '', config.path || '')\n : config.path || '';\n\n const screens = config.screens\n ? createNormalizedConfigs(config.screens, pattern)\n : undefined;\n\n return {\n // Normalize pattern to remove any leading, trailing slashes, duplicate slashes etc.\n pattern: pattern?.split('/').filter(Boolean).join('/'),\n stringify: config.stringify,\n screens,\n };\n};\n\nconst createNormalizedConfigs = (\n options: PathConfigMap<object>,\n pattern?: string\n): Record<string, ConfigItem> =>\n fromEntries(\n Object.entries(options).map(([name, c]) => {\n const result = createConfigItem(c, pattern);\n\n return [name, result];\n })\n );\n"]}
|
|
1
|
+
{"version":3,"sources":["getPathFromState.tsx"],"names":["getActiveRoute","state","route","index","routes","length","getPathFromState","options","Error","configs","screens","createNormalizedConfigs","path","current","allParams","pattern","focusedParams","focusedRoute","currentOptions","nestedRouteNames","hasNext","name","push","params","stringify","currentParams","Object","entries","map","key","value","String","assign","split","filter","p","startsWith","forEach","getParamName","undefined","nextRoute","nestedConfig","join","endsWith","encodeURIComponent","param","query","queryString","sort","replace","joinPaths","paths","concat","Boolean","createConfigItem","config","parentPattern","exact","c","result"],"mappings":";;;;;;;AAKA;;AAEA;;AAEA;;;;;;;;AAiBA,MAAMA,cAAc,GAAIC,KAAD,IAAqD;AAC1E,QAAMC,KAAK,GACT,OAAOD,KAAK,CAACE,KAAb,KAAuB,QAAvB,GACIF,KAAK,CAACG,MAAN,CAAaH,KAAK,CAACE,KAAnB,CADJ,GAEIF,KAAK,CAACG,MAAN,CAAaH,KAAK,CAACG,MAAN,CAAaC,MAAb,GAAsB,CAAnC,CAHN;;AAKA,MAAIH,KAAK,CAACD,KAAV,EAAiB;AACf,WAAOD,cAAc,CAACE,KAAK,CAACD,KAAP,CAArB;AACD;;AAED,SAAOC,KAAP;AACD,CAXD;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACe,SAASI,gBAAT,CACbL,KADa,EAEbM,OAFa,EAGL;AACR,MAAIN,KAAK,IAAI,IAAb,EAAmB;AACjB,UAAMO,KAAK,CACT,+EADS,CAAX;AAGD;;AAED,MAAID,OAAJ,EAAa;AACX,qCAAmBA,OAAnB;AACD,GATO,CAWR;;;AACA,QAAME,OAAmC,GAAGF,OAAO,SAAP,IAAAA,OAAO,WAAP,IAAAA,OAAO,CAAEG,OAAT,GACxCC,uBAAuB,CAACJ,OAAD,aAACA,OAAD,uBAACA,OAAO,CAAEG,OAAV,CADiB,GAExC,EAFJ;AAIA,MAAIE,IAAI,GAAG,GAAX;AACA,MAAIC,OAA0B,GAAGZ,KAAjC;AAEA,QAAMa,SAA8B,GAAG,EAAvC;;AAEA,SAAOD,OAAP,EAAgB;AACd,QAAIV,KAAK,GAAG,OAAOU,OAAO,CAACV,KAAf,KAAyB,QAAzB,GAAoCU,OAAO,CAACV,KAA5C,GAAoD,CAAhE;AACA,QAAID,KAAK,GAAGW,OAAO,CAACT,MAAR,CAAeD,KAAf,CAAZ;AAIA,QAAIY,OAAJ;AAEA,QAAIC,aAAJ;AACA,QAAIC,YAAY,GAAGjB,cAAc,CAACC,KAAD,CAAjC;AACA,QAAIiB,cAAc,GAAGT,OAArB,CAVc,CAYd;;AACA,QAAIU,gBAAgB,GAAG,EAAvB;AAEA,QAAIC,OAAO,GAAG,IAAd;;AAEA,WAAOlB,KAAK,CAACmB,IAAN,IAAcH,cAAd,IAAgCE,OAAvC,EAAgD;AAC9CL,MAAAA,OAAO,GAAGG,cAAc,CAAChB,KAAK,CAACmB,IAAP,CAAd,CAA2BN,OAArC;AAEAI,MAAAA,gBAAgB,CAACG,IAAjB,CAAsBpB,KAAK,CAACmB,IAA5B;;AAEA,UAAInB,KAAK,CAACqB,MAAV,EAAkB;AAAA;;AAChB,cAAMC,SAAS,4BAAGN,cAAc,CAAChB,KAAK,CAACmB,IAAP,CAAjB,0DAAG,sBAA4BG,SAA9C;AAEA,cAAMC,aAAa,GAAG,0BACpBC,MAAM,CAACC,OAAP,CAAezB,KAAK,CAACqB,MAArB,EAA6BK,GAA7B,CAAiC;AAAA,cAAC,CAACC,GAAD,EAAMC,KAAN,CAAD;AAAA,iBAAkB,CACjDD,GADiD,EAEjDL,SAAS,SAAT,IAAAA,SAAS,WAAT,IAAAA,SAAS,CAAGK,GAAH,CAAT,GAAmBL,SAAS,CAACK,GAAD,CAAT,CAAeC,KAAf,CAAnB,GAA2CC,MAAM,CAACD,KAAD,CAFA,CAAlB;AAAA,SAAjC,CADoB,CAAtB;;AAOA,YAAIf,OAAJ,EAAa;AACXW,UAAAA,MAAM,CAACM,MAAP,CAAclB,SAAd,EAAyBW,aAAzB;AACD;;AAED,YAAIR,YAAY,KAAKf,KAArB,EAA4B;AAAA;;AAC1B;AACA;AACAc,UAAAA,aAAa,GAAG,EAAE,GAAGS;AAAL,WAAhB;AAEA,sBAAAV,OAAO,UAAP,4CACIkB,KADJ,CACU,GADV,EAEGC,MAFH,CAEWC,CAAD,IAAOA,CAAC,CAACC,UAAF,CAAa,GAAb,CAFjB,EAGE;AAHF,WAIGC,OAJH,CAIYF,CAAD,IAAO;AACd,kBAAMd,IAAI,GAAGiB,YAAY,CAACH,CAAD,CAAzB,CADc,CAGd;;AACA,gBAAInB,aAAJ,EAAmB;AACjB;AACA,qBAAOA,aAAa,CAACK,IAAD,CAApB;AACD;AACF,WAZH;AAaD;AACF,OAtC6C,CAwC9C;;;AACA,UAAI,CAACH,cAAc,CAAChB,KAAK,CAACmB,IAAP,CAAd,CAA2BX,OAA5B,IAAuCR,KAAK,CAACD,KAAN,KAAgBsC,SAA3D,EAAsE;AACpEnB,QAAAA,OAAO,GAAG,KAAV;AACD,OAFD,MAEO;AACLjB,QAAAA,KAAK,GACH,OAAOD,KAAK,CAACD,KAAN,CAAYE,KAAnB,KAA6B,QAA7B,GACID,KAAK,CAACD,KAAN,CAAYE,KADhB,GAEID,KAAK,CAACD,KAAN,CAAYG,MAAZ,CAAmBC,MAAnB,GAA4B,CAHlC;AAKA,cAAMmC,SAAS,GAAGtC,KAAK,CAACD,KAAN,CAAYG,MAAZ,CAAmBD,KAAnB,CAAlB;AACA,cAAMsC,YAAY,GAAGvB,cAAc,CAAChB,KAAK,CAACmB,IAAP,CAAd,CAA2BX,OAAhD,CAPK,CASL;;AACA,YAAI+B,YAAY,IAAID,SAAS,CAACnB,IAAV,IAAkBoB,YAAtC,EAAoD;AAClDvC,UAAAA,KAAK,GAAGsC,SAAR;AACAtB,UAAAA,cAAc,GAAGuB,YAAjB;AACD,SAHD,MAGO;AACL;AACArB,UAAAA,OAAO,GAAG,KAAV;AACD;AACF;AACF;;AAED,QAAIL,OAAO,KAAKwB,SAAhB,EAA2B;AACzBxB,MAAAA,OAAO,GAAGI,gBAAgB,CAACuB,IAAjB,CAAsB,GAAtB,CAAV;AACD;;AAED,QAAIxB,cAAc,CAAChB,KAAK,CAACmB,IAAP,CAAd,KAA+BkB,SAAnC,EAA8C;AAC5C3B,MAAAA,IAAI,IAAIG,OAAO,CACZkB,KADK,CACC,GADD,EAELL,GAFK,CAEAO,CAAD,IAAO;AACV,cAAMd,IAAI,GAAGiB,YAAY,CAACH,CAAD,CAAzB,CADU,CAGV;AACA;AACA;;AACA,YAAIA,CAAC,KAAK,GAAV,EAAe;AACb,iBAAOjC,KAAK,CAACmB,IAAb;AACD,SARS,CAUV;;;AACA,YAAIc,CAAC,CAACC,UAAF,CAAa,GAAb,CAAJ,EAAuB;AACrB,gBAAMN,KAAK,GAAGhB,SAAS,CAACO,IAAD,CAAvB;;AAEA,cAAIS,KAAK,KAAKS,SAAV,IAAuBJ,CAAC,CAACQ,QAAF,CAAW,GAAX,CAA3B,EAA4C;AAC1C;AACA,mBAAO,EAAP;AACD;;AAED,iBAAOC,kBAAkB,CAACd,KAAD,CAAzB;AACD;;AAED,eAAOc,kBAAkB,CAACT,CAAD,CAAzB;AACD,OAzBK,EA0BLO,IA1BK,CA0BA,GA1BA,CAAR;AA2BD,KA5BD,MA4BO;AACL9B,MAAAA,IAAI,IAAIgC,kBAAkB,CAAC1C,KAAK,CAACmB,IAAP,CAA1B;AACD;;AAED,QAAI,CAACL,aAAL,EAAoB;AAClBA,MAAAA,aAAa,GAAGC,YAAY,CAACM,MAA7B;AACD;;AAED,QAAIrB,KAAK,CAACD,KAAV,EAAiB;AACfW,MAAAA,IAAI,IAAI,GAAR;AACD,KAFD,MAEO,IAAII,aAAJ,EAAmB;AACxB,WAAK,IAAI6B,KAAT,IAAkB7B,aAAlB,EAAiC;AAC/B,YAAIA,aAAa,CAAC6B,KAAD,CAAb,KAAyB,WAA7B,EAA0C;AACxC;AACA,iBAAO7B,aAAa,CAAC6B,KAAD,CAApB;AACD;AACF;;AAED,YAAMC,KAAK,GAAGC,WAAW,CAACvB,SAAZ,CAAsBR,aAAtB,EAAqC;AAAEgC,QAAAA,IAAI,EAAE;AAAR,OAArC,CAAd;;AAEA,UAAIF,KAAJ,EAAW;AACTlC,QAAAA,IAAI,IAAK,IAAGkC,KAAM,EAAlB;AACD;AACF;;AAEDjC,IAAAA,OAAO,GAAGX,KAAK,CAACD,KAAhB;AACD,GA/JO,CAiKR;;;AACAW,EAAAA,IAAI,GAAGA,IAAI,CAACqC,OAAL,CAAa,MAAb,EAAqB,GAArB,CAAP;AACArC,EAAAA,IAAI,GAAGA,IAAI,CAACP,MAAL,GAAc,CAAd,GAAkBO,IAAI,CAACqC,OAAL,CAAa,KAAb,EAAoB,EAApB,CAAlB,GAA4CrC,IAAnD;AAEA,SAAOA,IAAP;AACD;;AAED,MAAM0B,YAAY,GAAIvB,OAAD,IACnBA,OAAO,CAACkC,OAAR,CAAgB,IAAhB,EAAsB,EAAtB,EAA0BA,OAA1B,CAAkC,KAAlC,EAAyC,EAAzC,CADF;;AAGA,MAAMC,SAAS,GAAG;AAAA,oCAAIC,KAAJ;AAAIA,IAAAA,KAAJ;AAAA;;AAAA,SACf,EAAD,CACGC,MADH,CACU,GAAGD,KAAK,CAACvB,GAAN,CAAWO,CAAD,IAAOA,CAAC,CAACF,KAAF,CAAQ,GAAR,CAAjB,CADb,EAEGC,MAFH,CAEUmB,OAFV,EAGGX,IAHH,CAGQ,GAHR,CADgB;AAAA,CAAlB;;AAMA,MAAMY,gBAAgB,GAAG,CACvBC,MADuB,EAEvBC,aAFuB,KAGR;AAAA;;AACf,MAAI,OAAOD,MAAP,KAAkB,QAAtB,EAAgC;AAC9B;AACA,UAAMxC,OAAO,GAAGyC,aAAa,GAAGN,SAAS,CAACM,aAAD,EAAgBD,MAAhB,CAAZ,GAAsCA,MAAnE;AAEA,WAAO;AAAExC,MAAAA;AAAF,KAAP;AACD,GANc,CAQf;AACA;;;AACA,MAAIA,OAAJ;;AAEA,MAAIwC,MAAM,CAACE,KAAP,IAAgBF,MAAM,CAAC3C,IAAP,KAAgB2B,SAApC,EAA+C;AAC7C,UAAM,IAAI/B,KAAJ,CACJ,sJADI,CAAN;AAGD;;AAEDO,EAAAA,OAAO,GACLwC,MAAM,CAACE,KAAP,KAAiB,IAAjB,GACIP,SAAS,CAACM,aAAa,IAAI,EAAlB,EAAsBD,MAAM,CAAC3C,IAAP,IAAe,EAArC,CADb,GAEI2C,MAAM,CAAC3C,IAAP,IAAe,EAHrB;AAKA,QAAMF,OAAO,GAAG6C,MAAM,CAAC7C,OAAP,GACZC,uBAAuB,CAAC4C,MAAM,CAAC7C,OAAR,EAAiBK,OAAjB,CADX,GAEZwB,SAFJ;AAIA,SAAO;AACL;AACAxB,IAAAA,OAAO,eAAEA,OAAF,8CAAE,UAASkB,KAAT,CAAe,GAAf,EAAoBC,MAApB,CAA2BmB,OAA3B,EAAoCX,IAApC,CAAyC,GAAzC,CAFJ;AAGLlB,IAAAA,SAAS,EAAE+B,MAAM,CAAC/B,SAHb;AAILd,IAAAA;AAJK,GAAP;AAMD,CApCD;;AAsCA,MAAMC,uBAAuB,GAAG,CAC9BJ,OAD8B,EAE9BQ,OAF8B,KAI9B,0BACEW,MAAM,CAACC,OAAP,CAAepB,OAAf,EAAwBqB,GAAxB,CAA4B,SAAe;AAAA,MAAd,CAACP,IAAD,EAAOqC,CAAP,CAAc;AACzC,QAAMC,MAAM,GAAGL,gBAAgB,CAACI,CAAD,EAAI3C,OAAJ,CAA/B;AAEA,SAAO,CAACM,IAAD,EAAOsC,MAAP,CAAP;AACD,CAJD,CADF,CAJF","sourcesContent":["import type {\n NavigationState,\n PartialState,\n Route,\n} from '@react-navigation/routers';\nimport * as queryString from 'query-string';\n\nimport fromEntries from './fromEntries';\nimport type { PathConfig, PathConfigMap } from './types';\nimport validatePathConfig from './validatePathConfig';\n\ntype Options<ParamList> = {\n initialRouteName?: string;\n screens: PathConfigMap<ParamList>;\n};\n\ntype State = NavigationState | Omit<PartialState<NavigationState>, 'stale'>;\n\ntype StringifyConfig = Record<string, (value: any) => string>;\n\ntype ConfigItem = {\n pattern?: string;\n stringify?: StringifyConfig;\n screens?: Record<string, ConfigItem>;\n};\n\nconst getActiveRoute = (state: State): { name: string; params?: object } => {\n const route =\n typeof state.index === 'number'\n ? state.routes[state.index]\n : state.routes[state.routes.length - 1];\n\n if (route.state) {\n return getActiveRoute(route.state);\n }\n\n return route;\n};\n\n/**\n * Utility to serialize a navigation state object to a path string.\n *\n * @example\n * ```js\n * getPathFromState(\n * {\n * routes: [\n * {\n * name: 'Chat',\n * params: { author: 'Jane', id: 42 },\n * },\n * ],\n * },\n * {\n * screens: {\n * Chat: {\n * path: 'chat/:author/:id',\n * stringify: { author: author => author.toLowerCase() }\n * }\n * }\n * }\n * )\n * ```\n *\n * @param state Navigation state to serialize.\n * @param options Extra options to fine-tune how to serialize the path.\n * @returns Path representing the state, e.g. /foo/bar?count=42.\n */\nexport default function getPathFromState<ParamList extends {}>(\n state: State,\n options?: Options<ParamList>\n): string {\n if (state == null) {\n throw Error(\n \"Got 'undefined' for the navigation state. You must pass a valid state object.\"\n );\n }\n\n if (options) {\n validatePathConfig(options);\n }\n\n // Create a normalized configs object which will be easier to use\n const configs: Record<string, ConfigItem> = options?.screens\n ? createNormalizedConfigs(options?.screens)\n : {};\n\n let path = '/';\n let current: State | undefined = state;\n\n const allParams: Record<string, any> = {};\n\n while (current) {\n let index = typeof current.index === 'number' ? current.index : 0;\n let route = current.routes[index] as Route<string> & {\n state?: State;\n };\n\n let pattern: string | undefined;\n\n let focusedParams: Record<string, any> | undefined;\n let focusedRoute = getActiveRoute(state);\n let currentOptions = configs;\n\n // Keep all the route names that appeared during going deeper in config in case the pattern is resolved to undefined\n let nestedRouteNames = [];\n\n let hasNext = true;\n\n while (route.name in currentOptions && hasNext) {\n pattern = currentOptions[route.name].pattern;\n\n nestedRouteNames.push(route.name);\n\n if (route.params) {\n const stringify = currentOptions[route.name]?.stringify;\n\n const currentParams = fromEntries(\n Object.entries(route.params).map(([key, value]) => [\n key,\n stringify?.[key] ? stringify[key](value) : String(value),\n ])\n );\n\n if (pattern) {\n Object.assign(allParams, currentParams);\n }\n\n if (focusedRoute === route) {\n // If this is the focused route, keep the params for later use\n // We save it here since it's been stringified already\n focusedParams = { ...currentParams };\n\n pattern\n ?.split('/')\n .filter((p) => p.startsWith(':'))\n // eslint-disable-next-line no-loop-func\n .forEach((p) => {\n const name = getParamName(p);\n\n // Remove the params present in the pattern since we'll only use the rest for query string\n if (focusedParams) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete focusedParams[name];\n }\n });\n }\n }\n\n // If there is no `screens` property or no nested state, we return pattern\n if (!currentOptions[route.name].screens || route.state === undefined) {\n hasNext = false;\n } else {\n index =\n typeof route.state.index === 'number'\n ? route.state.index\n : route.state.routes.length - 1;\n\n const nextRoute = route.state.routes[index];\n const nestedConfig = currentOptions[route.name].screens;\n\n // if there is config for next route name, we go deeper\n if (nestedConfig && nextRoute.name in nestedConfig) {\n route = nextRoute as Route<string> & { state?: State };\n currentOptions = nestedConfig;\n } else {\n // If not, there is no sense in going deeper in config\n hasNext = false;\n }\n }\n }\n\n if (pattern === undefined) {\n pattern = nestedRouteNames.join('/');\n }\n\n if (currentOptions[route.name] !== undefined) {\n path += pattern\n .split('/')\n .map((p) => {\n const name = getParamName(p);\n\n // We don't know what to show for wildcard patterns\n // Showing the route name seems ok, though whatever we show here will be incorrect\n // Since the page doesn't actually exist\n if (p === '*') {\n return route.name;\n }\n\n // If the path has a pattern for a param, put the param in the path\n if (p.startsWith(':')) {\n const value = allParams[name];\n\n if (value === undefined && p.endsWith('?')) {\n // Optional params without value assigned in route.params should be ignored\n return '';\n }\n\n return encodeURIComponent(value);\n }\n\n return encodeURIComponent(p);\n })\n .join('/');\n } else {\n path += encodeURIComponent(route.name);\n }\n\n if (!focusedParams) {\n focusedParams = focusedRoute.params;\n }\n\n if (route.state) {\n path += '/';\n } else if (focusedParams) {\n for (let param in focusedParams) {\n if (focusedParams[param] === 'undefined') {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete focusedParams[param];\n }\n }\n\n const query = queryString.stringify(focusedParams, { sort: false });\n\n if (query) {\n path += `?${query}`;\n }\n }\n\n current = route.state;\n }\n\n // Remove multiple as well as trailing slashes\n path = path.replace(/\\/+/g, '/');\n path = path.length > 1 ? path.replace(/\\/$/, '') : path;\n\n return path;\n}\n\nconst getParamName = (pattern: string) =>\n pattern.replace(/^:/, '').replace(/\\?$/, '');\n\nconst joinPaths = (...paths: string[]): string =>\n ([] as string[])\n .concat(...paths.map((p) => p.split('/')))\n .filter(Boolean)\n .join('/');\n\nconst createConfigItem = (\n config: PathConfig<object> | string,\n parentPattern?: string\n): ConfigItem => {\n if (typeof config === 'string') {\n // If a string is specified as the value of the key(e.g. Foo: '/path'), use it as the pattern\n const pattern = parentPattern ? joinPaths(parentPattern, config) : config;\n\n return { pattern };\n }\n\n // If an object is specified as the value (e.g. Foo: { ... }),\n // It can have `path` property and `screens` prop which has nested configs\n let pattern: string | undefined;\n\n if (config.exact && config.path === undefined) {\n throw new Error(\n \"A 'path' needs to be specified when specifying 'exact: true'. If you don't want this screen in the URL, specify it as empty string, e.g. `path: ''`.\"\n );\n }\n\n pattern =\n config.exact !== true\n ? joinPaths(parentPattern || '', config.path || '')\n : config.path || '';\n\n const screens = config.screens\n ? createNormalizedConfigs(config.screens, pattern)\n : undefined;\n\n return {\n // Normalize pattern to remove any leading, trailing slashes, duplicate slashes etc.\n pattern: pattern?.split('/').filter(Boolean).join('/'),\n stringify: config.stringify,\n screens,\n };\n};\n\nconst createNormalizedConfigs = (\n options: PathConfigMap<object>,\n pattern?: string\n): Record<string, ConfigItem> =>\n fromEntries(\n Object.entries(options).map(([name, c]) => {\n const result = createConfigItem(c, pattern);\n\n return [name, result];\n })\n );\n"]}
|
|
@@ -197,7 +197,13 @@ function getStateFromPath(path, options) {
|
|
|
197
197
|
return result;
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
const joinPaths = (
|
|
200
|
+
const joinPaths = function () {
|
|
201
|
+
for (var _len = arguments.length, paths = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
202
|
+
paths[_key] = arguments[_key];
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return [].concat(...paths.map(p => p.split('/'))).filter(Boolean).join('/');
|
|
206
|
+
};
|
|
201
207
|
|
|
202
208
|
const matchAgainstConfigs = (remaining, configs) => {
|
|
203
209
|
let routes;
|
|
@@ -256,7 +262,11 @@ const matchAgainstConfigs = (remaining, configs) => {
|
|
|
256
262
|
};
|
|
257
263
|
};
|
|
258
264
|
|
|
259
|
-
const createNormalizedConfigs = (screen, routeConfig
|
|
265
|
+
const createNormalizedConfigs = function (screen, routeConfig) {
|
|
266
|
+
let routeNames = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
267
|
+
let initials = arguments.length > 3 ? arguments[3] : undefined;
|
|
268
|
+
let parentScreens = arguments.length > 4 ? arguments[4] : undefined;
|
|
269
|
+
let parentPattern = arguments.length > 5 ? arguments[5] : undefined;
|
|
260
270
|
const configs = [];
|
|
261
271
|
routeNames.push(screen);
|
|
262
272
|
parentScreens.push(screen); // @ts-expect-error: we can't strongly typecheck this for now
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["getStateFromPath.tsx"],"names":["getStateFromPath","path","options","initialRoutes","initialRouteName","push","parentScreens","screens","remaining","replace","endsWith","undefined","routes","split","filter","Boolean","map","segment","name","decodeURIComponent","length","createNestedStateObject","configs","concat","Object","keys","key","createNormalizedConfigs","sort","a","b","pattern","routeNames","join","localeCompare","startsWith","aParts","bParts","i","Math","max","aWildCard","bWildCard","reduce","acc","config","intersects","every","it","Error","assign","match","find","c","screen","result","current","remainingPath","matchAgainstConfigs","regex","RegExp","source","joinPaths","paths","p","matchedParams","params","value","parse","routeConfig","initials","parentPattern","createConfigItem","exact","forEach","nestedConfig","pop","findParseConfigForRoute","routeName","flatConfig","findInitialRoute","sameParents","createStateObject","initialRoute","route","isEmpty","index","state","shift","nestedState","nestedStateIndex","parseQueryParams","parseConfig","query","queryString"],"mappings":"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","sourcesContent":["import type {\n InitialState,\n NavigationState,\n PartialState,\n} from '@react-navigation/routers';\nimport escape from 'escape-string-regexp';\nimport * as queryString from 'query-string';\n\nimport findFocusedRoute from './findFocusedRoute';\nimport type { PathConfigMap } from './types';\nimport validatePathConfig from './validatePathConfig';\n\ntype Options<ParamList extends {}> = {\n initialRouteName?: string;\n screens: PathConfigMap<ParamList>;\n};\n\ntype ParseConfig = Record<string, (value: string) => any>;\n\ntype RouteConfig = {\n screen: string;\n regex?: RegExp;\n path: string;\n pattern: string;\n routeNames: string[];\n parse?: ParseConfig;\n};\n\ntype InitialRouteConfig = {\n initialRouteName: string;\n parentScreens: string[];\n};\n\ntype ResultState = PartialState<NavigationState> & {\n state?: ResultState;\n};\n\ntype ParsedRoute = {\n name: string;\n path?: string;\n params?: Record<string, any> | undefined;\n};\n\n/**\n * Utility to parse a path string to initial state object accepted by the container.\n * This is useful for deep linking when we need to handle the incoming URL.\n *\n * @example\n * ```js\n * getStateFromPath(\n * '/chat/jane/42',\n * {\n * screens: {\n * Chat: {\n * path: 'chat/:author/:id',\n * parse: { id: Number }\n * }\n * }\n * }\n * )\n * ```\n * @param path Path string to parse and convert, e.g. /foo/bar?count=42.\n * @param options Extra options to fine-tune how to parse the path.\n */\nexport default function getStateFromPath<ParamList extends {}>(\n path: string,\n options?: Options<ParamList>\n): ResultState | undefined {\n if (options) {\n validatePathConfig(options);\n }\n\n let initialRoutes: InitialRouteConfig[] = [];\n\n if (options?.initialRouteName) {\n initialRoutes.push({\n initialRouteName: options.initialRouteName,\n parentScreens: [],\n });\n }\n\n const screens = options?.screens;\n\n let remaining = path\n .replace(/\\/+/g, '/') // Replace multiple slash (//) with single ones\n .replace(/^\\//, '') // Remove extra leading slash\n .replace(/\\?.*$/, ''); // Remove query params which we will handle later\n\n // Make sure there is a trailing slash\n remaining = remaining.endsWith('/') ? remaining : `${remaining}/`;\n\n if (screens === undefined) {\n // When no config is specified, use the path segments as route names\n const routes = remaining\n .split('/')\n .filter(Boolean)\n .map((segment) => {\n const name = decodeURIComponent(segment);\n return { name };\n });\n\n if (routes.length) {\n return createNestedStateObject(path, routes, initialRoutes);\n }\n\n return undefined;\n }\n\n // Create a normalized configs array which will be easier to use\n const configs = ([] as RouteConfig[])\n .concat(\n ...Object.keys(screens).map((key) =>\n createNormalizedConfigs(\n key,\n screens as PathConfigMap<object>,\n [],\n initialRoutes,\n []\n )\n )\n )\n .sort((a, b) => {\n // Sort config so that:\n // - the most exhaustive ones are always at the beginning\n // - patterns with wildcard are always at the end\n\n // If 2 patterns are same, move the one with less route names up\n // This is an error state, so it's only useful for consistent error messages\n if (a.pattern === b.pattern) {\n return b.routeNames.join('>').localeCompare(a.routeNames.join('>'));\n }\n\n // If one of the patterns starts with the other, it's more exhaustive\n // So move it up\n if (a.pattern.startsWith(b.pattern)) {\n return -1;\n }\n\n if (b.pattern.startsWith(a.pattern)) {\n return 1;\n }\n\n const aParts = a.pattern.split('/');\n const bParts = b.pattern.split('/');\n\n for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n // if b is longer, b get higher priority\n if (aParts[i] == null) {\n return 1;\n }\n // if a is longer, a get higher priority\n if (bParts[i] == null) {\n return -1;\n }\n const aWildCard = aParts[i] === '*' || aParts[i].startsWith(':');\n const bWildCard = bParts[i] === '*' || bParts[i].startsWith(':');\n // if both are wildcard we compare next component\n if (aWildCard && bWildCard) {\n continue;\n }\n // if only a is wild card, b get higher priority\n if (aWildCard) {\n return 1;\n }\n // if only b is wild card, a get higher priority\n if (bWildCard) {\n return -1;\n }\n }\n return bParts.length - aParts.length;\n });\n\n // Check for duplicate patterns in the config\n configs.reduce<Record<string, RouteConfig>>((acc, config) => {\n if (acc[config.pattern]) {\n const a = acc[config.pattern].routeNames;\n const b = config.routeNames;\n\n // It's not a problem if the path string omitted from a inner most screen\n // For example, it's ok if a path resolves to `A > B > C` or `A > B`\n const intersects =\n a.length > b.length\n ? b.every((it, i) => a[i] === it)\n : a.every((it, i) => b[i] === it);\n\n if (!intersects) {\n throw new Error(\n `Found conflicting screens with the same pattern. The pattern '${\n config.pattern\n }' resolves to both '${a.join(' > ')}' and '${b.join(\n ' > '\n )}'. Patterns must be unique and cannot resolve to more than one screen.`\n );\n }\n }\n\n return Object.assign(acc, {\n [config.pattern]: config,\n });\n }, {});\n\n if (remaining === '/') {\n // We need to add special handling of empty path so navigation to empty path also works\n // When handling empty path, we should only look at the root level config\n const match = configs.find(\n (config) =>\n config.path === '' &&\n config.routeNames.every(\n // Make sure that none of the parent configs have a non-empty path defined\n (name) => !configs.find((c) => c.screen === name)?.path\n )\n );\n\n if (match) {\n return createNestedStateObject(\n path,\n match.routeNames.map((name) => ({ name })),\n initialRoutes,\n configs\n );\n }\n\n return undefined;\n }\n\n let result: PartialState<NavigationState> | undefined;\n let current: PartialState<NavigationState> | undefined;\n\n // We match the whole path against the regex instead of segments\n // This makes sure matches such as wildcard will catch any unmatched routes, even if nested\n const { routes, remainingPath } = matchAgainstConfigs(\n remaining,\n configs.map((c) => ({\n ...c,\n // Add `$` to the regex to make sure it matches till end of the path and not just beginning\n regex: c.regex ? new RegExp(c.regex.source + '$') : undefined,\n }))\n );\n\n if (routes !== undefined) {\n // This will always be empty if full path matched\n current = createNestedStateObject(path, routes, initialRoutes, configs);\n remaining = remainingPath;\n result = current;\n }\n\n if (current == null || result == null) {\n return undefined;\n }\n\n return result;\n}\n\nconst joinPaths = (...paths: string[]): string =>\n ([] as string[])\n .concat(...paths.map((p) => p.split('/')))\n .filter(Boolean)\n .join('/');\n\nconst matchAgainstConfigs = (remaining: string, configs: RouteConfig[]) => {\n let routes: ParsedRoute[] | undefined;\n let remainingPath = remaining;\n\n // Go through all configs, and see if the next path segment matches our regex\n for (const config of configs) {\n if (!config.regex) {\n continue;\n }\n\n const match = remainingPath.match(config.regex);\n\n // If our regex matches, we need to extract params from the path\n if (match) {\n const matchedParams = config.pattern\n ?.split('/')\n .filter((p) => p.startsWith(':'))\n .reduce<Record<string, any>>(\n (acc, p, i) =>\n Object.assign(acc, {\n // The param segments appear every second item starting from 2 in the regex match result\n [p]: match![(i + 1) * 2].replace(/\\//, ''),\n }),\n {}\n );\n\n routes = config.routeNames.map((name) => {\n const config = configs.find((c) => c.screen === name);\n const params = config?.path\n ?.split('/')\n .filter((p) => p.startsWith(':'))\n .reduce<Record<string, any>>((acc, p) => {\n const value = matchedParams[p];\n\n if (value) {\n const key = p.replace(/^:/, '').replace(/\\?$/, '');\n acc[key] = config.parse?.[key] ? config.parse[key](value) : value;\n }\n\n return acc;\n }, {});\n\n if (params && Object.keys(params).length) {\n return { name, params };\n }\n\n return { name };\n });\n\n remainingPath = remainingPath.replace(match[1], '');\n\n break;\n }\n }\n\n return { routes, remainingPath };\n};\n\nconst createNormalizedConfigs = (\n screen: string,\n routeConfig: PathConfigMap<object>,\n routeNames: string[] = [],\n initials: InitialRouteConfig[],\n parentScreens: string[],\n parentPattern?: string\n): RouteConfig[] => {\n const configs: RouteConfig[] = [];\n\n routeNames.push(screen);\n\n parentScreens.push(screen);\n\n // @ts-expect-error: we can't strongly typecheck this for now\n const config = routeConfig[screen];\n\n if (typeof config === 'string') {\n // If a string is specified as the value of the key(e.g. Foo: '/path'), use it as the pattern\n const pattern = parentPattern ? joinPaths(parentPattern, config) : config;\n\n configs.push(createConfigItem(screen, routeNames, pattern, config));\n } else if (typeof config === 'object') {\n let pattern: string | undefined;\n\n // if an object is specified as the value (e.g. Foo: { ... }),\n // it can have `path` property and\n // it could have `screens` prop which has nested configs\n if (typeof config.path === 'string') {\n if (config.exact && config.path === undefined) {\n throw new Error(\n \"A 'path' needs to be specified when specifying 'exact: true'. If you don't want this screen in the URL, specify it as empty string, e.g. `path: ''`.\"\n );\n }\n\n pattern =\n config.exact !== true\n ? joinPaths(parentPattern || '', config.path || '')\n : config.path || '';\n\n configs.push(\n createConfigItem(\n screen,\n routeNames,\n pattern!,\n config.path,\n config.parse\n )\n );\n }\n\n if (config.screens) {\n // property `initialRouteName` without `screens` has no purpose\n if (config.initialRouteName) {\n initials.push({\n initialRouteName: config.initialRouteName,\n parentScreens,\n });\n }\n\n Object.keys(config.screens).forEach((nestedConfig) => {\n const result = createNormalizedConfigs(\n nestedConfig,\n config.screens as PathConfigMap<object>,\n routeNames,\n initials,\n [...parentScreens],\n pattern ?? parentPattern\n );\n\n configs.push(...result);\n });\n }\n }\n\n routeNames.pop();\n\n return configs;\n};\n\nconst createConfigItem = (\n screen: string,\n routeNames: string[],\n pattern: string,\n path: string,\n parse?: ParseConfig\n): RouteConfig => {\n // Normalize pattern to remove any leading, trailing slashes, duplicate slashes etc.\n pattern = pattern.split('/').filter(Boolean).join('/');\n\n const regex = pattern\n ? new RegExp(\n `^(${pattern\n .split('/')\n .map((it) => {\n if (it.startsWith(':')) {\n return `(([^/]+\\\\/)${it.endsWith('?') ? '?' : ''})`;\n }\n\n return `${it === '*' ? '.*' : escape(it)}\\\\/`;\n })\n .join('')})`\n )\n : undefined;\n\n return {\n screen,\n regex,\n pattern,\n path,\n // The routeNames array is mutated, so copy it to keep the current state\n routeNames: [...routeNames],\n parse,\n };\n};\n\nconst findParseConfigForRoute = (\n routeName: string,\n flatConfig: RouteConfig[]\n): ParseConfig | undefined => {\n for (const config of flatConfig) {\n if (routeName === config.routeNames[config.routeNames.length - 1]) {\n return config.parse;\n }\n }\n\n return undefined;\n};\n\n// Try to find an initial route connected with the one passed\nconst findInitialRoute = (\n routeName: string,\n parentScreens: string[],\n initialRoutes: InitialRouteConfig[]\n): string | undefined => {\n for (const config of initialRoutes) {\n if (parentScreens.length === config.parentScreens.length) {\n let sameParents = true;\n for (let i = 0; i < parentScreens.length; i++) {\n if (parentScreens[i].localeCompare(config.parentScreens[i]) !== 0) {\n sameParents = false;\n break;\n }\n }\n if (sameParents) {\n return routeName !== config.initialRouteName\n ? config.initialRouteName\n : undefined;\n }\n }\n }\n return undefined;\n};\n\n// returns state object with values depending on whether\n// it is the end of state and if there is initialRoute for this level\nconst createStateObject = (\n initialRoute: string | undefined,\n route: ParsedRoute,\n isEmpty: boolean\n): InitialState => {\n if (isEmpty) {\n if (initialRoute) {\n return {\n index: 1,\n routes: [{ name: initialRoute }, route],\n };\n } else {\n return {\n routes: [route],\n };\n }\n } else {\n if (initialRoute) {\n return {\n index: 1,\n routes: [{ name: initialRoute }, { ...route, state: { routes: [] } }],\n };\n } else {\n return {\n routes: [{ ...route, state: { routes: [] } }],\n };\n }\n }\n};\n\nconst createNestedStateObject = (\n path: string,\n routes: ParsedRoute[],\n initialRoutes: InitialRouteConfig[],\n flatConfig?: RouteConfig[]\n) => {\n let state: InitialState;\n let route = routes.shift() as ParsedRoute;\n const parentScreens: string[] = [];\n\n let initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n\n parentScreens.push(route.name);\n\n state = createStateObject(initialRoute, route, routes.length === 0);\n\n if (routes.length > 0) {\n let nestedState = state;\n\n while ((route = routes.shift() as ParsedRoute)) {\n initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n\n const nestedStateIndex =\n nestedState.index || nestedState.routes.length - 1;\n\n nestedState.routes[nestedStateIndex].state = createStateObject(\n initialRoute,\n route,\n routes.length === 0\n );\n\n if (routes.length > 0) {\n nestedState = nestedState.routes[nestedStateIndex]\n .state as InitialState;\n }\n\n parentScreens.push(route.name);\n }\n }\n\n route = findFocusedRoute(state) as ParsedRoute;\n route.path = path;\n\n const params = parseQueryParams(\n path,\n flatConfig ? findParseConfigForRoute(route.name, flatConfig) : undefined\n );\n\n if (params) {\n route.params = { ...route.params, ...params };\n }\n\n return state;\n};\n\nconst parseQueryParams = (\n path: string,\n parseConfig?: Record<string, (value: string) => any>\n) => {\n const query = path.split('?')[1];\n const params = queryString.parse(query);\n\n if (parseConfig) {\n Object.keys(params).forEach((name) => {\n if (parseConfig[name] && typeof params[name] === 'string') {\n params[name] = parseConfig[name](params[name] as string);\n }\n });\n }\n\n return Object.keys(params).length ? params : undefined;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["getStateFromPath.tsx"],"names":["getStateFromPath","path","options","initialRoutes","initialRouteName","push","parentScreens","screens","remaining","replace","endsWith","undefined","routes","split","filter","Boolean","map","segment","name","decodeURIComponent","length","createNestedStateObject","configs","concat","Object","keys","key","createNormalizedConfigs","sort","a","b","pattern","routeNames","join","localeCompare","startsWith","aParts","bParts","i","Math","max","aWildCard","bWildCard","reduce","acc","config","intersects","every","it","Error","assign","match","find","c","screen","result","current","remainingPath","matchAgainstConfigs","regex","RegExp","source","joinPaths","paths","p","matchedParams","params","value","parse","routeConfig","initials","parentPattern","createConfigItem","exact","forEach","nestedConfig","pop","findParseConfigForRoute","routeName","flatConfig","findInitialRoute","sameParents","createStateObject","initialRoute","route","isEmpty","index","state","shift","nestedState","nestedStateIndex","parseQueryParams","parseConfig","query","queryString"],"mappings":"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","sourcesContent":["import type {\n InitialState,\n NavigationState,\n PartialState,\n} from '@react-navigation/routers';\nimport escape from 'escape-string-regexp';\nimport * as queryString from 'query-string';\n\nimport findFocusedRoute from './findFocusedRoute';\nimport type { PathConfigMap } from './types';\nimport validatePathConfig from './validatePathConfig';\n\ntype Options<ParamList extends {}> = {\n initialRouteName?: string;\n screens: PathConfigMap<ParamList>;\n};\n\ntype ParseConfig = Record<string, (value: string) => any>;\n\ntype RouteConfig = {\n screen: string;\n regex?: RegExp;\n path: string;\n pattern: string;\n routeNames: string[];\n parse?: ParseConfig;\n};\n\ntype InitialRouteConfig = {\n initialRouteName: string;\n parentScreens: string[];\n};\n\ntype ResultState = PartialState<NavigationState> & {\n state?: ResultState;\n};\n\ntype ParsedRoute = {\n name: string;\n path?: string;\n params?: Record<string, any> | undefined;\n};\n\n/**\n * Utility to parse a path string to initial state object accepted by the container.\n * This is useful for deep linking when we need to handle the incoming URL.\n *\n * @example\n * ```js\n * getStateFromPath(\n * '/chat/jane/42',\n * {\n * screens: {\n * Chat: {\n * path: 'chat/:author/:id',\n * parse: { id: Number }\n * }\n * }\n * }\n * )\n * ```\n * @param path Path string to parse and convert, e.g. /foo/bar?count=42.\n * @param options Extra options to fine-tune how to parse the path.\n */\nexport default function getStateFromPath<ParamList extends {}>(\n path: string,\n options?: Options<ParamList>\n): ResultState | undefined {\n if (options) {\n validatePathConfig(options);\n }\n\n let initialRoutes: InitialRouteConfig[] = [];\n\n if (options?.initialRouteName) {\n initialRoutes.push({\n initialRouteName: options.initialRouteName,\n parentScreens: [],\n });\n }\n\n const screens = options?.screens;\n\n let remaining = path\n .replace(/\\/+/g, '/') // Replace multiple slash (//) with single ones\n .replace(/^\\//, '') // Remove extra leading slash\n .replace(/\\?.*$/, ''); // Remove query params which we will handle later\n\n // Make sure there is a trailing slash\n remaining = remaining.endsWith('/') ? remaining : `${remaining}/`;\n\n if (screens === undefined) {\n // When no config is specified, use the path segments as route names\n const routes = remaining\n .split('/')\n .filter(Boolean)\n .map((segment) => {\n const name = decodeURIComponent(segment);\n return { name };\n });\n\n if (routes.length) {\n return createNestedStateObject(path, routes, initialRoutes);\n }\n\n return undefined;\n }\n\n // Create a normalized configs array which will be easier to use\n const configs = ([] as RouteConfig[])\n .concat(\n ...Object.keys(screens).map((key) =>\n createNormalizedConfigs(\n key,\n screens as PathConfigMap<object>,\n [],\n initialRoutes,\n []\n )\n )\n )\n .sort((a, b) => {\n // Sort config so that:\n // - the most exhaustive ones are always at the beginning\n // - patterns with wildcard are always at the end\n\n // If 2 patterns are same, move the one with less route names up\n // This is an error state, so it's only useful for consistent error messages\n if (a.pattern === b.pattern) {\n return b.routeNames.join('>').localeCompare(a.routeNames.join('>'));\n }\n\n // If one of the patterns starts with the other, it's more exhaustive\n // So move it up\n if (a.pattern.startsWith(b.pattern)) {\n return -1;\n }\n\n if (b.pattern.startsWith(a.pattern)) {\n return 1;\n }\n\n const aParts = a.pattern.split('/');\n const bParts = b.pattern.split('/');\n\n for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n // if b is longer, b get higher priority\n if (aParts[i] == null) {\n return 1;\n }\n // if a is longer, a get higher priority\n if (bParts[i] == null) {\n return -1;\n }\n const aWildCard = aParts[i] === '*' || aParts[i].startsWith(':');\n const bWildCard = bParts[i] === '*' || bParts[i].startsWith(':');\n // if both are wildcard we compare next component\n if (aWildCard && bWildCard) {\n continue;\n }\n // if only a is wild card, b get higher priority\n if (aWildCard) {\n return 1;\n }\n // if only b is wild card, a get higher priority\n if (bWildCard) {\n return -1;\n }\n }\n return bParts.length - aParts.length;\n });\n\n // Check for duplicate patterns in the config\n configs.reduce<Record<string, RouteConfig>>((acc, config) => {\n if (acc[config.pattern]) {\n const a = acc[config.pattern].routeNames;\n const b = config.routeNames;\n\n // It's not a problem if the path string omitted from a inner most screen\n // For example, it's ok if a path resolves to `A > B > C` or `A > B`\n const intersects =\n a.length > b.length\n ? b.every((it, i) => a[i] === it)\n : a.every((it, i) => b[i] === it);\n\n if (!intersects) {\n throw new Error(\n `Found conflicting screens with the same pattern. The pattern '${\n config.pattern\n }' resolves to both '${a.join(' > ')}' and '${b.join(\n ' > '\n )}'. Patterns must be unique and cannot resolve to more than one screen.`\n );\n }\n }\n\n return Object.assign(acc, {\n [config.pattern]: config,\n });\n }, {});\n\n if (remaining === '/') {\n // We need to add special handling of empty path so navigation to empty path also works\n // When handling empty path, we should only look at the root level config\n const match = configs.find(\n (config) =>\n config.path === '' &&\n config.routeNames.every(\n // Make sure that none of the parent configs have a non-empty path defined\n (name) => !configs.find((c) => c.screen === name)?.path\n )\n );\n\n if (match) {\n return createNestedStateObject(\n path,\n match.routeNames.map((name) => ({ name })),\n initialRoutes,\n configs\n );\n }\n\n return undefined;\n }\n\n let result: PartialState<NavigationState> | undefined;\n let current: PartialState<NavigationState> | undefined;\n\n // We match the whole path against the regex instead of segments\n // This makes sure matches such as wildcard will catch any unmatched routes, even if nested\n const { routes, remainingPath } = matchAgainstConfigs(\n remaining,\n configs.map((c) => ({\n ...c,\n // Add `$` to the regex to make sure it matches till end of the path and not just beginning\n regex: c.regex ? new RegExp(c.regex.source + '$') : undefined,\n }))\n );\n\n if (routes !== undefined) {\n // This will always be empty if full path matched\n current = createNestedStateObject(path, routes, initialRoutes, configs);\n remaining = remainingPath;\n result = current;\n }\n\n if (current == null || result == null) {\n return undefined;\n }\n\n return result;\n}\n\nconst joinPaths = (...paths: string[]): string =>\n ([] as string[])\n .concat(...paths.map((p) => p.split('/')))\n .filter(Boolean)\n .join('/');\n\nconst matchAgainstConfigs = (remaining: string, configs: RouteConfig[]) => {\n let routes: ParsedRoute[] | undefined;\n let remainingPath = remaining;\n\n // Go through all configs, and see if the next path segment matches our regex\n for (const config of configs) {\n if (!config.regex) {\n continue;\n }\n\n const match = remainingPath.match(config.regex);\n\n // If our regex matches, we need to extract params from the path\n if (match) {\n const matchedParams = config.pattern\n ?.split('/')\n .filter((p) => p.startsWith(':'))\n .reduce<Record<string, any>>(\n (acc, p, i) =>\n Object.assign(acc, {\n // The param segments appear every second item starting from 2 in the regex match result\n [p]: match![(i + 1) * 2].replace(/\\//, ''),\n }),\n {}\n );\n\n routes = config.routeNames.map((name) => {\n const config = configs.find((c) => c.screen === name);\n const params = config?.path\n ?.split('/')\n .filter((p) => p.startsWith(':'))\n .reduce<Record<string, any>>((acc, p) => {\n const value = matchedParams[p];\n\n if (value) {\n const key = p.replace(/^:/, '').replace(/\\?$/, '');\n acc[key] = config.parse?.[key] ? config.parse[key](value) : value;\n }\n\n return acc;\n }, {});\n\n if (params && Object.keys(params).length) {\n return { name, params };\n }\n\n return { name };\n });\n\n remainingPath = remainingPath.replace(match[1], '');\n\n break;\n }\n }\n\n return { routes, remainingPath };\n};\n\nconst createNormalizedConfigs = (\n screen: string,\n routeConfig: PathConfigMap<object>,\n routeNames: string[] = [],\n initials: InitialRouteConfig[],\n parentScreens: string[],\n parentPattern?: string\n): RouteConfig[] => {\n const configs: RouteConfig[] = [];\n\n routeNames.push(screen);\n\n parentScreens.push(screen);\n\n // @ts-expect-error: we can't strongly typecheck this for now\n const config = routeConfig[screen];\n\n if (typeof config === 'string') {\n // If a string is specified as the value of the key(e.g. Foo: '/path'), use it as the pattern\n const pattern = parentPattern ? joinPaths(parentPattern, config) : config;\n\n configs.push(createConfigItem(screen, routeNames, pattern, config));\n } else if (typeof config === 'object') {\n let pattern: string | undefined;\n\n // if an object is specified as the value (e.g. Foo: { ... }),\n // it can have `path` property and\n // it could have `screens` prop which has nested configs\n if (typeof config.path === 'string') {\n if (config.exact && config.path === undefined) {\n throw new Error(\n \"A 'path' needs to be specified when specifying 'exact: true'. If you don't want this screen in the URL, specify it as empty string, e.g. `path: ''`.\"\n );\n }\n\n pattern =\n config.exact !== true\n ? joinPaths(parentPattern || '', config.path || '')\n : config.path || '';\n\n configs.push(\n createConfigItem(\n screen,\n routeNames,\n pattern!,\n config.path,\n config.parse\n )\n );\n }\n\n if (config.screens) {\n // property `initialRouteName` without `screens` has no purpose\n if (config.initialRouteName) {\n initials.push({\n initialRouteName: config.initialRouteName,\n parentScreens,\n });\n }\n\n Object.keys(config.screens).forEach((nestedConfig) => {\n const result = createNormalizedConfigs(\n nestedConfig,\n config.screens as PathConfigMap<object>,\n routeNames,\n initials,\n [...parentScreens],\n pattern ?? parentPattern\n );\n\n configs.push(...result);\n });\n }\n }\n\n routeNames.pop();\n\n return configs;\n};\n\nconst createConfigItem = (\n screen: string,\n routeNames: string[],\n pattern: string,\n path: string,\n parse?: ParseConfig\n): RouteConfig => {\n // Normalize pattern to remove any leading, trailing slashes, duplicate slashes etc.\n pattern = pattern.split('/').filter(Boolean).join('/');\n\n const regex = pattern\n ? new RegExp(\n `^(${pattern\n .split('/')\n .map((it) => {\n if (it.startsWith(':')) {\n return `(([^/]+\\\\/)${it.endsWith('?') ? '?' : ''})`;\n }\n\n return `${it === '*' ? '.*' : escape(it)}\\\\/`;\n })\n .join('')})`\n )\n : undefined;\n\n return {\n screen,\n regex,\n pattern,\n path,\n // The routeNames array is mutated, so copy it to keep the current state\n routeNames: [...routeNames],\n parse,\n };\n};\n\nconst findParseConfigForRoute = (\n routeName: string,\n flatConfig: RouteConfig[]\n): ParseConfig | undefined => {\n for (const config of flatConfig) {\n if (routeName === config.routeNames[config.routeNames.length - 1]) {\n return config.parse;\n }\n }\n\n return undefined;\n};\n\n// Try to find an initial route connected with the one passed\nconst findInitialRoute = (\n routeName: string,\n parentScreens: string[],\n initialRoutes: InitialRouteConfig[]\n): string | undefined => {\n for (const config of initialRoutes) {\n if (parentScreens.length === config.parentScreens.length) {\n let sameParents = true;\n for (let i = 0; i < parentScreens.length; i++) {\n if (parentScreens[i].localeCompare(config.parentScreens[i]) !== 0) {\n sameParents = false;\n break;\n }\n }\n if (sameParents) {\n return routeName !== config.initialRouteName\n ? config.initialRouteName\n : undefined;\n }\n }\n }\n return undefined;\n};\n\n// returns state object with values depending on whether\n// it is the end of state and if there is initialRoute for this level\nconst createStateObject = (\n initialRoute: string | undefined,\n route: ParsedRoute,\n isEmpty: boolean\n): InitialState => {\n if (isEmpty) {\n if (initialRoute) {\n return {\n index: 1,\n routes: [{ name: initialRoute }, route],\n };\n } else {\n return {\n routes: [route],\n };\n }\n } else {\n if (initialRoute) {\n return {\n index: 1,\n routes: [{ name: initialRoute }, { ...route, state: { routes: [] } }],\n };\n } else {\n return {\n routes: [{ ...route, state: { routes: [] } }],\n };\n }\n }\n};\n\nconst createNestedStateObject = (\n path: string,\n routes: ParsedRoute[],\n initialRoutes: InitialRouteConfig[],\n flatConfig?: RouteConfig[]\n) => {\n let state: InitialState;\n let route = routes.shift() as ParsedRoute;\n const parentScreens: string[] = [];\n\n let initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n\n parentScreens.push(route.name);\n\n state = createStateObject(initialRoute, route, routes.length === 0);\n\n if (routes.length > 0) {\n let nestedState = state;\n\n while ((route = routes.shift() as ParsedRoute)) {\n initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n\n const nestedStateIndex =\n nestedState.index || nestedState.routes.length - 1;\n\n nestedState.routes[nestedStateIndex].state = createStateObject(\n initialRoute,\n route,\n routes.length === 0\n );\n\n if (routes.length > 0) {\n nestedState = nestedState.routes[nestedStateIndex]\n .state as InitialState;\n }\n\n parentScreens.push(route.name);\n }\n }\n\n route = findFocusedRoute(state) as ParsedRoute;\n route.path = path;\n\n const params = parseQueryParams(\n path,\n flatConfig ? findParseConfigForRoute(route.name, flatConfig) : undefined\n );\n\n if (params) {\n route.params = { ...route.params, ...params };\n }\n\n return state;\n};\n\nconst parseQueryParams = (\n path: string,\n parseConfig?: Record<string, (value: string) => any>\n) => {\n const query = path.split('?')[1];\n const params = queryString.parse(query);\n\n if (parseConfig) {\n Object.keys(params).forEach((name) => {\n if (parseConfig[name] && typeof params[name] === 'string') {\n params[name] = parseConfig[name](params[name] as string);\n }\n });\n }\n\n return Object.keys(params).length ? params : undefined;\n};\n"]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -32,76 +32,76 @@ Object.defineProperty(exports, "BaseNavigationContainer", {
|
|
|
32
32
|
return _BaseNavigationContainer.default;
|
|
33
33
|
}
|
|
34
34
|
});
|
|
35
|
-
Object.defineProperty(exports, "
|
|
35
|
+
Object.defineProperty(exports, "CurrentRenderContext", {
|
|
36
36
|
enumerable: true,
|
|
37
37
|
get: function () {
|
|
38
|
-
return
|
|
38
|
+
return _CurrentRenderContext.default;
|
|
39
39
|
}
|
|
40
40
|
});
|
|
41
|
-
Object.defineProperty(exports, "
|
|
41
|
+
Object.defineProperty(exports, "NavigationContainerRefContext", {
|
|
42
42
|
enumerable: true,
|
|
43
43
|
get: function () {
|
|
44
|
-
return
|
|
44
|
+
return _NavigationContainerRefContext.default;
|
|
45
45
|
}
|
|
46
46
|
});
|
|
47
|
-
Object.defineProperty(exports, "
|
|
47
|
+
Object.defineProperty(exports, "NavigationContext", {
|
|
48
48
|
enumerable: true,
|
|
49
49
|
get: function () {
|
|
50
|
-
return
|
|
50
|
+
return _NavigationContext.default;
|
|
51
51
|
}
|
|
52
52
|
});
|
|
53
|
-
Object.defineProperty(exports, "
|
|
53
|
+
Object.defineProperty(exports, "NavigationHelpersContext", {
|
|
54
54
|
enumerable: true,
|
|
55
55
|
get: function () {
|
|
56
|
-
return
|
|
56
|
+
return _NavigationHelpersContext.default;
|
|
57
57
|
}
|
|
58
58
|
});
|
|
59
|
-
Object.defineProperty(exports, "
|
|
59
|
+
Object.defineProperty(exports, "NavigationRouteContext", {
|
|
60
60
|
enumerable: true,
|
|
61
61
|
get: function () {
|
|
62
|
-
return
|
|
62
|
+
return _NavigationRouteContext.default;
|
|
63
63
|
}
|
|
64
64
|
});
|
|
65
|
-
Object.defineProperty(exports, "
|
|
65
|
+
Object.defineProperty(exports, "createNavigationContainerRef", {
|
|
66
66
|
enumerable: true,
|
|
67
67
|
get: function () {
|
|
68
|
-
return
|
|
68
|
+
return _createNavigationContainerRef.default;
|
|
69
69
|
}
|
|
70
70
|
});
|
|
71
|
-
Object.defineProperty(exports, "
|
|
71
|
+
Object.defineProperty(exports, "createNavigatorFactory", {
|
|
72
72
|
enumerable: true,
|
|
73
73
|
get: function () {
|
|
74
|
-
return
|
|
74
|
+
return _createNavigatorFactory.default;
|
|
75
75
|
}
|
|
76
76
|
});
|
|
77
|
-
Object.defineProperty(exports, "
|
|
77
|
+
Object.defineProperty(exports, "findFocusedRoute", {
|
|
78
78
|
enumerable: true,
|
|
79
79
|
get: function () {
|
|
80
|
-
return
|
|
80
|
+
return _findFocusedRoute.default;
|
|
81
81
|
}
|
|
82
82
|
});
|
|
83
|
-
Object.defineProperty(exports, "
|
|
83
|
+
Object.defineProperty(exports, "getActionFromState", {
|
|
84
84
|
enumerable: true,
|
|
85
85
|
get: function () {
|
|
86
|
-
return
|
|
86
|
+
return _getActionFromState.default;
|
|
87
87
|
}
|
|
88
88
|
});
|
|
89
|
-
Object.defineProperty(exports, "
|
|
89
|
+
Object.defineProperty(exports, "getFocusedRouteNameFromRoute", {
|
|
90
90
|
enumerable: true,
|
|
91
91
|
get: function () {
|
|
92
|
-
return
|
|
92
|
+
return _getFocusedRouteNameFromRoute.default;
|
|
93
93
|
}
|
|
94
94
|
});
|
|
95
|
-
Object.defineProperty(exports, "
|
|
95
|
+
Object.defineProperty(exports, "getPathFromState", {
|
|
96
96
|
enumerable: true,
|
|
97
97
|
get: function () {
|
|
98
|
-
return
|
|
98
|
+
return _getPathFromState.default;
|
|
99
99
|
}
|
|
100
100
|
});
|
|
101
|
-
Object.defineProperty(exports, "
|
|
101
|
+
Object.defineProperty(exports, "getStateFromPath", {
|
|
102
102
|
enumerable: true,
|
|
103
103
|
get: function () {
|
|
104
|
-
return
|
|
104
|
+
return _getStateFromPath.default;
|
|
105
105
|
}
|
|
106
106
|
});
|
|
107
107
|
Object.defineProperty(exports, "useFocusEffect", {
|
|
@@ -10,6 +10,14 @@ exports.default = isArrayEqual;
|
|
|
10
10
|
* We need to make sure that both values and order match.
|
|
11
11
|
*/
|
|
12
12
|
function isArrayEqual(a, b) {
|
|
13
|
-
|
|
13
|
+
if (a === b) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (a.length !== b.length) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return a.every((it, index) => it === b[index]);
|
|
14
22
|
}
|
|
15
23
|
//# sourceMappingURL=isArrayEqual.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["isArrayEqual.tsx"],"names":["isArrayEqual","a","b","length","every","it","index"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACe,SAASA,YAAT,CAAsBC,CAAtB,EAAgCC,CAAhC,EAA0C;AACvD,
|
|
1
|
+
{"version":3,"sources":["isArrayEqual.tsx"],"names":["isArrayEqual","a","b","length","every","it","index"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACe,SAASA,YAAT,CAAsBC,CAAtB,EAAgCC,CAAhC,EAA0C;AACvD,MAAID,CAAC,KAAKC,CAAV,EAAa;AACX,WAAO,IAAP;AACD;;AAED,MAAID,CAAC,CAACE,MAAF,KAAaD,CAAC,CAACC,MAAnB,EAA2B;AACzB,WAAO,KAAP;AACD;;AAED,SAAOF,CAAC,CAACG,KAAF,CAAQ,CAACC,EAAD,EAAKC,KAAL,KAAeD,EAAE,KAAKH,CAAC,CAACI,KAAD,CAA/B,CAAP;AACD","sourcesContent":["/**\n * Compare two arrays with primitive values as the content.\n * We need to make sure that both values and order match.\n */\nexport default function isArrayEqual(a: any[], b: any[]) {\n if (a === b) {\n return true;\n }\n\n if (a.length !== b.length) {\n return false;\n }\n\n return a.every((it, index) => it === b[index]);\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = isRecordEqual;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Compare two records with primitive values as the content.
|
|
10
|
+
*/
|
|
11
|
+
function isRecordEqual(a, b) {
|
|
12
|
+
if (a === b) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const aKeys = Object.keys(a);
|
|
17
|
+
const bKeys = Object.keys(b);
|
|
18
|
+
|
|
19
|
+
if (aKeys.length !== bKeys.length) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return aKeys.every(key => a[key] === b[key]);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=isRecordEqual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["isRecordEqual.tsx"],"names":["isRecordEqual","a","b","aKeys","Object","keys","bKeys","length","every","key"],"mappings":";;;;;;;AAAA;AACA;AACA;AACe,SAASA,aAAT,CACbC,CADa,EAEbC,CAFa,EAGb;AACA,MAAID,CAAC,KAAKC,CAAV,EAAa;AACX,WAAO,IAAP;AACD;;AAED,QAAMC,KAAK,GAAGC,MAAM,CAACC,IAAP,CAAYJ,CAAZ,CAAd;AACA,QAAMK,KAAK,GAAGF,MAAM,CAACC,IAAP,CAAYH,CAAZ,CAAd;;AAEA,MAAIC,KAAK,CAACI,MAAN,KAAiBD,KAAK,CAACC,MAA3B,EAAmC;AACjC,WAAO,KAAP;AACD;;AAED,SAAOJ,KAAK,CAACK,KAAN,CAAaC,GAAD,IAASR,CAAC,CAACQ,GAAD,CAAD,KAAWP,CAAC,CAACO,GAAD,CAAjC,CAAP;AACD","sourcesContent":["/**\n * Compare two records with primitive values as the content.\n */\nexport default function isRecordEqual(\n a: Record<string, any>,\n b: Record<string, any>\n) {\n if (a === b) {\n return true;\n }\n\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n return aKeys.every((key) => a[key] === b[key]);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["types.tsx"],"names":["PrivateValueStore"],"mappings":";;;;;;;;;AA2JO,MAAMA,iBAAN,CAAiC;AAAA;AAAA,0BAW5B,EAX4B;AAAA;;AAAA","sourcesContent":["import type {\n DefaultRouterOptions,\n InitialState,\n NavigationAction,\n NavigationState,\n ParamListBase,\n PartialState,\n Route,\n} from '@react-navigation/routers';\nimport type * as React from 'react';\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace ReactNavigation {\n // eslint-disable-next-line @typescript-eslint/no-empty-interface\n interface RootParamList {}\n }\n}\n\ntype Keyof<T extends {}> = Extract<keyof T, string>;\n\nexport type DefaultNavigatorOptions<\n ParamList extends ParamListBase,\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n> = DefaultRouterOptions<Keyof<ParamList>> & {\n /**\n * Children React Elements to extract the route configuration from.\n * Only `Screen`, `Group` and `React.Fragment` are supported as children.\n */\n children: React.ReactNode;\n /**\n * Event listeners for all the screens in the navigator.\n */\n screenListeners?:\n | ScreenListeners<State, EventMap>\n | ((props: {\n route: RouteProp<ParamList>;\n navigation: any;\n }) => ScreenListeners<State, EventMap>);\n /**\n * Default options for all screens under this navigator.\n */\n screenOptions?:\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamList>;\n navigation: any;\n }) => ScreenOptions);\n /**\n * Default options specified by the navigator.\n * It receives the custom options in the arguments if a function is specified.\n */\n defaultScreenOptions?:\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamList>;\n navigation: any;\n options: ScreenOptions;\n }) => ScreenOptions);\n};\n\nexport type EventMapBase = Record<\n string,\n { data?: any; canPreventDefault?: boolean }\n>;\n\nexport type EventMapCore<State extends NavigationState> = {\n focus: { data: undefined };\n blur: { data: undefined };\n state: { data: { state: State } };\n beforeRemove: { data: { action: NavigationAction }; canPreventDefault: true };\n};\n\nexport type EventArg<\n EventName extends string,\n CanPreventDefault extends boolean | undefined = false,\n Data = undefined\n> = {\n /**\n * Type of the event (e.g. `focus`, `blur`)\n */\n readonly type: EventName;\n readonly target?: string;\n} & (CanPreventDefault extends true\n ? {\n /**\n * Whether `event.preventDefault()` was called on this event object.\n */\n readonly defaultPrevented: boolean;\n /**\n * Prevent the default action which happens on this event.\n */\n preventDefault(): void;\n }\n : {}) &\n (undefined extends Data\n ? { readonly data?: Readonly<Data> }\n : { readonly data: Readonly<Data> });\n\nexport type EventListenerCallback<\n EventMap extends EventMapBase,\n EventName extends keyof EventMap\n> = (\n e: EventArg<\n Extract<EventName, string>,\n EventMap[EventName]['canPreventDefault'],\n EventMap[EventName]['data']\n >\n) => void;\n\nexport type EventConsumer<EventMap extends EventMapBase> = {\n /**\n * Subscribe to events from the parent navigator.\n *\n * @param type Type of the event (e.g. `focus`, `blur`)\n * @param callback Callback listener which is executed upon receiving the event.\n */\n addListener<EventName extends Keyof<EventMap>>(\n type: EventName,\n callback: EventListenerCallback<EventMap, EventName>\n ): () => void;\n removeListener<EventName extends Keyof<EventMap>>(\n type: EventName,\n callback: EventListenerCallback<EventMap, EventName>\n ): void;\n};\n\nexport type EventEmitter<EventMap extends EventMapBase> = {\n /**\n * Emit an event to child screens.\n *\n * @param options.type Type of the event (e.g. `focus`, `blur`)\n * @param [options.data] Optional information regarding the event.\n * @param [options.target] Key of the target route which should receive the event.\n * If not specified, all routes receive the event.\n */\n emit<EventName extends Keyof<EventMap>>(\n options: {\n type: EventName;\n target?: string;\n } & (EventMap[EventName]['canPreventDefault'] extends true\n ? { canPreventDefault: true }\n : {}) &\n (undefined extends EventMap[EventName]['data']\n ? { data?: EventMap[EventName]['data'] }\n : { data: EventMap[EventName]['data'] })\n ): EventArg<\n EventName,\n EventMap[EventName]['canPreventDefault'],\n EventMap[EventName]['data']\n >;\n};\n\nexport class PrivateValueStore<A, B, C> {\n /**\n * UGLY HACK! DO NOT USE THE TYPE!!!\n *\n * TypeScript requires a type to be used to be able to infer it.\n * The type should exist as its own without any operations such as union.\n * So we need to figure out a way to store this type in a property.\n * The problem with a normal property is that it shows up in intelliSense.\n * Adding private keyword works, but the annotation is stripped away in declaration.\n * Turns out if we use an empty string, it doesn't show up in intelliSense.\n */\n protected ''?: { a: A; b: B; c: C };\n}\n\ntype NavigationHelpersCommon<\n ParamList extends ParamListBase,\n State extends NavigationState = NavigationState\n> = {\n /**\n * Dispatch an action or an update function to the router.\n * The update function will receive the current state,\n *\n * @param action Action object or update function.\n */\n dispatch(\n action: NavigationAction | ((state: State) => NavigationAction)\n ): void;\n\n /**\n * Navigate to a route in current navigation tree.\n *\n * @param name Name of the route to navigate to.\n * @param [params] Params object for the route.\n */\n navigate<RouteName extends keyof ParamList>(\n ...args: undefined extends ParamList[RouteName]\n ? [screen: RouteName] | [screen: RouteName, params: ParamList[RouteName]]\n : [screen: RouteName, params: ParamList[RouteName]]\n ): void;\n\n /**\n * Navigate to a route in current navigation tree.\n *\n * @param route Object with `key` or `name` for the route to navigate to, and a `params` object.\n */\n navigate<RouteName extends keyof ParamList>(\n options:\n | { key: string; params?: ParamList[RouteName]; merge?: boolean }\n | {\n name: RouteName;\n key?: string;\n params: ParamList[RouteName];\n merge?: boolean;\n }\n ): void;\n\n /**\n * Reset the navigation state to the provided state.\n *\n * @param state Navigation state object.\n */\n reset(state: PartialState<State> | State): void;\n\n /**\n * Go back to the previous route in history.\n */\n goBack(): void;\n\n /**\n * Check if the screen is focused. The method returns `true` if focused, `false` otherwise.\n * Note that this method doesn't re-render screen when the focus changes. So don't use it in `render`.\n * To get notified of focus changes, use `addListener('focus', cb)` and `addListener('blur', cb)`.\n * To conditionally render content based on focus state, use the `useIsFocused` hook.\n */\n isFocused(): boolean;\n\n /**\n * Check if dispatching back action will be handled by navigation.\n * Note that this method doesn't re-render screen when the result changes. So don't use it in `render`.\n */\n canGoBack(): boolean;\n\n /**\n * Returns the navigation prop from the parent navigator,\n */\n getParent<T = NavigationProp<ParamListBase> | undefined>(): T;\n\n /**\n * Returns the navigator's state.\n * Note that this method doesn't re-render screen when the result changes. So don't use it in `render`.\n */\n getState(): State;\n} & PrivateValueStore<ParamList, keyof ParamList, {}>;\n\nexport type NavigationHelpers<\n ParamList extends ParamListBase,\n EventMap extends EventMapBase = {}\n> = NavigationHelpersCommon<ParamList> &\n EventEmitter<EventMap> & {\n /**\n * Update the param object for the route.\n * The new params will be shallow merged with the old one.\n *\n * @param params Params object for the current route.\n */\n setParams<RouteName extends keyof ParamList>(\n params: Partial<ParamList[RouteName]>\n ): void;\n };\n\nexport type NavigationContainerProps = {\n /**\n * Initial navigation state for the child navigators.\n */\n initialState?: InitialState;\n /**\n * Callback which is called with the latest navigation state when it changes.\n */\n onStateChange?: (state: NavigationState | undefined) => void;\n /**\n * Callback which is called when an action is not handled.\n */\n onUnhandledAction?: (action: NavigationAction) => void;\n /**\n * Whether this navigation container should be independent of parent containers.\n * If this is not set to `true`, this container cannot be nested inside another container.\n * Setting it to `true` disconnects any children navigators from parent container.\n */\n independent?: boolean;\n /**\n * Children elements to render.\n */\n children: React.ReactNode;\n};\n\nexport type NavigationProp<\n ParamList extends {},\n RouteName extends keyof ParamList = Keyof<ParamList>,\n State extends NavigationState = NavigationState<ParamList>,\n ScreenOptions extends {} = {},\n EventMap extends EventMapBase = {}\n> = NavigationHelpersCommon<ParamList, State> & {\n /**\n * Update the param object for the route.\n * The new params will be shallow merged with the old one.\n *\n * @param params Params object for the current route.\n */\n setParams(params: Partial<ParamList[RouteName]>): void;\n\n /**\n * Update the options for the route.\n * The options object will be shallow merged with default options object.\n *\n * @param options Options object for the route.\n */\n setOptions(options: Partial<ScreenOptions>): void;\n} & EventConsumer<EventMap & EventMapCore<State>> &\n PrivateValueStore<ParamList, RouteName, EventMap>;\n\nexport type RouteProp<\n ParamList extends ParamListBase,\n RouteName extends keyof ParamList = Keyof<ParamList>\n> = Route<Extract<RouteName, string>, ParamList[RouteName]>;\n\nexport type CompositeNavigationProp<\n A extends NavigationProp<ParamListBase, string, any, any>,\n B extends NavigationHelpersCommon<ParamListBase, any>\n> = Omit<A & B, keyof NavigationProp<any>> &\n NavigationProp<\n /**\n * Param list from both navigation objects needs to be combined\n * For example, we should be able to navigate to screens in both A and B\n */\n (A extends NavigationHelpersCommon<infer T> ? T : never) &\n (B extends NavigationHelpersCommon<infer U> ? U : never),\n /**\n * The route name should refer to the route name specified in the first type\n * Ideally it should work for any of them, but it's not possible to infer that way\n */\n A extends NavigationProp<any, infer R> ? R : string,\n /**\n * The type of state should refer to the state specified in the first type\n */\n A extends NavigationProp<any, any, infer S> ? S : NavigationState,\n /**\n * Screen options from both navigation objects needs to be combined\n * This allows typechecking `setOptions`\n */\n (A extends NavigationProp<any, any, any, infer O> ? O : {}) &\n (B extends NavigationProp<any, any, any, infer P> ? P : {}),\n /**\n * Event consumer config should refer to the config specified in the first type\n * This allows typechecking `addListener`/`removeListener`\n */\n A extends NavigationProp<any, any, any, any, infer E> ? E : {}\n >;\n\nexport type CompositeScreenProps<\n A extends {\n navigation: NavigationProp<ParamListBase, string, any, any>;\n route: RouteProp<ParamListBase>;\n },\n B extends {\n navigation: NavigationHelpersCommon<ParamListBase, any>;\n }\n> = {\n navigation: CompositeNavigationProp<A['navigation'], B['navigation']>;\n route: A['route'];\n};\n\nexport type Descriptor<\n ScreenOptions extends {},\n Navigation extends NavigationProp<any, any, any, any, any>,\n Route extends RouteProp<any, any>\n> = {\n /**\n * Render the component associated with this route.\n */\n render(): JSX.Element;\n\n /**\n * Options for the route.\n */\n options: ScreenOptions;\n\n /**\n * Route object for the screen\n */\n route: Route;\n\n /**\n * Navigation object for the screen\n */\n navigation: Navigation;\n};\n\nexport type ScreenListeners<\n State extends NavigationState,\n EventMap extends EventMapBase\n> = Partial<\n {\n [EventName in keyof (EventMap &\n EventMapCore<State>)]: EventListenerCallback<EventMap, EventName>;\n }\n>;\n\nexport type RouteConfigComponent<\n ParamList extends ParamListBase,\n RouteName extends keyof ParamList\n> =\n | {\n /**\n * React component to render for this screen.\n */\n component: React.ComponentType<any>;\n getComponent?: never;\n children?: never;\n }\n | {\n /**\n * Lazily get a React component to render for this screen.\n */\n getComponent: () => React.ComponentType<any>;\n component?: never;\n children?: never;\n }\n | {\n /**\n * Render callback to render content of this screen.\n */\n children: (props: {\n route: RouteProp<ParamList, RouteName>;\n navigation: any;\n }) => React.ReactNode;\n component?: never;\n getComponent?: never;\n };\n\nexport type RouteConfig<\n ParamList extends ParamListBase,\n RouteName extends keyof ParamList,\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n> = {\n /**\n * Route name of this screen.\n */\n name: RouteName;\n\n /**\n * Navigator options for this screen.\n */\n options?:\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamList, RouteName>;\n navigation: any;\n }) => ScreenOptions);\n\n /**\n * Event listeners for this screen.\n */\n listeners?:\n | ScreenListeners<State, EventMap>\n | ((props: {\n route: RouteProp<ParamList, RouteName>;\n navigation: any;\n }) => ScreenListeners<State, EventMap>);\n\n /**\n * Function to return an unique ID for this screen.\n * Receives an object with the route params.\n * For a given screen name, there will always be only one screen corresponding to an ID.\n * If `undefined` is returned, it acts same as no `getId` being specified.\n */\n getId?: ({ params }: { params: ParamList[RouteName] }) => string | undefined;\n\n /**\n * Initial params object for the route.\n */\n initialParams?: Partial<ParamList[RouteName]>;\n} & RouteConfigComponent<ParamList, RouteName>;\n\nexport type RouteGroupConfig<\n ParamList extends ParamListBase,\n ScreenOptions extends {}\n> = {\n /**\n * Navigator options for this screen.\n */\n screenOptions?:\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamList, keyof ParamList>;\n navigation: any;\n }) => ScreenOptions);\n /**\n * Children React Elements to extract the route configuration from.\n * Only `Screen`, `Group` and `React.Fragment` are supported as children.\n */\n children: React.ReactNode;\n};\n\nexport type NavigationContainerEventMap = {\n /**\n * Event which fires when the navigation state changes.\n */\n state: {\n data: {\n /**\n * The updated state object after the state change.\n */\n state: NavigationState | PartialState<NavigationState> | undefined;\n };\n };\n /**\n * Event which fires when current options changes.\n */\n options: { data: { options: object } };\n /**\n * Event which fires when an action is dispatched.\n * Only intended for debugging purposes, don't use it for app logic.\n * This event will be emitted before state changes have been applied.\n */\n __unsafe_action__: {\n data: {\n /**\n * The action object which was dispatched.\n */\n action: NavigationAction;\n /**\n * Whether the action was a no-op, i.e. resulted any state changes.\n */\n noop: boolean;\n /**\n * Stack trace of the action, this will only be available during development.\n */\n stack: string | undefined;\n };\n };\n};\n\nexport type NavigationContainerRef<ParamList extends {}> =\n NavigationHelpers<ParamList> &\n EventConsumer<NavigationContainerEventMap> & {\n /**\n * Reset the navigation state of the root navigator to the provided state.\n *\n * @param state Navigation state object.\n */\n resetRoot(state?: PartialState<NavigationState> | NavigationState): void;\n /**\n * Get the rehydrated navigation state of the navigation tree.\n */\n getRootState(): NavigationState;\n /**\n * Get the currently focused navigation route.\n */\n getCurrentRoute(): Route<string> | undefined;\n /**\n * Get the currently focused route's options.\n */\n getCurrentOptions(): object | undefined;\n /**\n * Whether the navigation container is ready to handle actions.\n */\n isReady(): boolean;\n };\n\nexport type NavigationContainerRefWithCurrent<ParamList extends {}> =\n NavigationContainerRef<ParamList> & {\n current: NavigationContainerRef<ParamList> | null;\n };\n\nexport type TypedNavigator<\n ParamList extends ParamListBase,\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase,\n Navigator extends React.ComponentType<any>\n> = {\n /**\n * Navigator component which manages the child screens.\n */\n Navigator: React.ComponentType<\n Omit<\n React.ComponentProps<Navigator>,\n keyof DefaultNavigatorOptions<any, any, any, any>\n > &\n DefaultNavigatorOptions<ParamList, State, ScreenOptions, EventMap>\n >;\n /**\n * Component used for grouping multiple route configuration.\n */\n Group: React.ComponentType<RouteGroupConfig<ParamList, ScreenOptions>>;\n /**\n * Component used for specifying route configuration.\n */\n Screen: <RouteName extends keyof ParamList>(\n _: RouteConfig<ParamList, RouteName, State, ScreenOptions, EventMap>\n ) => null;\n};\n\nexport type NavigatorScreenParams<\n ParamList,\n State extends NavigationState = NavigationState\n> =\n | {\n screen?: never;\n params?: never;\n initial?: never;\n path?: string;\n state: PartialState<State> | State | undefined;\n }\n | {\n [RouteName in keyof ParamList]: undefined extends ParamList[RouteName]\n ? {\n screen: RouteName;\n params?: ParamList[RouteName];\n initial?: boolean;\n path?: string;\n state?: never;\n }\n : {\n screen: RouteName;\n params: ParamList[RouteName];\n initial?: boolean;\n path?: string;\n state?: never;\n };\n }[keyof ParamList];\n\nexport type PathConfig<ParamList extends {}> = {\n path?: string;\n exact?: boolean;\n parse?: Record<string, (value: string) => any>;\n stringify?: Record<string, (value: any) => string>;\n screens?: PathConfigMap<ParamList>;\n initialRouteName?: keyof ParamList;\n};\n\nexport type PathConfigMap<ParamList extends {}> = {\n [RouteName in keyof ParamList]?: NonNullable<\n ParamList[RouteName]\n > extends NavigatorScreenParams<infer T, any>\n ? string | PathConfig<T>\n : string | Omit<PathConfig<{}>, 'screens' | 'initialRouteName'>;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["types.tsx"],"names":["PrivateValueStore"],"mappings":";;;;;;;;;AA2JO,MAAMA,iBAAN,CAAiC;AAAA;AAAA,0BAW5B,EAX4B;AAAA;;AAAA","sourcesContent":["import type {\n DefaultRouterOptions,\n InitialState,\n NavigationAction,\n NavigationState,\n ParamListBase,\n PartialState,\n Route,\n} from '@react-navigation/routers';\nimport type * as React from 'react';\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace ReactNavigation {\n // eslint-disable-next-line @typescript-eslint/no-empty-interface\n interface RootParamList {}\n }\n}\n\ntype Keyof<T extends {}> = Extract<keyof T, string>;\n\nexport type DefaultNavigatorOptions<\n ParamList extends ParamListBase,\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n> = DefaultRouterOptions<Keyof<ParamList>> & {\n /**\n * Children React Elements to extract the route configuration from.\n * Only `Screen`, `Group` and `React.Fragment` are supported as children.\n */\n children: React.ReactNode;\n /**\n * Event listeners for all the screens in the navigator.\n */\n screenListeners?:\n | ScreenListeners<State, EventMap>\n | ((props: {\n route: RouteProp<ParamList>;\n navigation: any;\n }) => ScreenListeners<State, EventMap>);\n /**\n * Default options for all screens under this navigator.\n */\n screenOptions?:\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamList>;\n navigation: any;\n }) => ScreenOptions);\n /**\n * Default options specified by the navigator.\n * It receives the custom options in the arguments if a function is specified.\n */\n defaultScreenOptions?:\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamList>;\n navigation: any;\n options: ScreenOptions;\n }) => ScreenOptions);\n};\n\nexport type EventMapBase = Record<\n string,\n { data?: any; canPreventDefault?: boolean }\n>;\n\nexport type EventMapCore<State extends NavigationState> = {\n focus: { data: undefined };\n blur: { data: undefined };\n state: { data: { state: State } };\n beforeRemove: { data: { action: NavigationAction }; canPreventDefault: true };\n};\n\nexport type EventArg<\n EventName extends string,\n CanPreventDefault extends boolean | undefined = false,\n Data = undefined\n> = {\n /**\n * Type of the event (e.g. `focus`, `blur`)\n */\n readonly type: EventName;\n readonly target?: string;\n} & (CanPreventDefault extends true\n ? {\n /**\n * Whether `event.preventDefault()` was called on this event object.\n */\n readonly defaultPrevented: boolean;\n /**\n * Prevent the default action which happens on this event.\n */\n preventDefault(): void;\n }\n : {}) &\n (undefined extends Data\n ? { readonly data?: Readonly<Data> }\n : { readonly data: Readonly<Data> });\n\nexport type EventListenerCallback<\n EventMap extends EventMapBase,\n EventName extends keyof EventMap\n> = (\n e: EventArg<\n Extract<EventName, string>,\n EventMap[EventName]['canPreventDefault'],\n EventMap[EventName]['data']\n >\n) => void;\n\nexport type EventConsumer<EventMap extends EventMapBase> = {\n /**\n * Subscribe to events from the parent navigator.\n *\n * @param type Type of the event (e.g. `focus`, `blur`)\n * @param callback Callback listener which is executed upon receiving the event.\n */\n addListener<EventName extends Keyof<EventMap>>(\n type: EventName,\n callback: EventListenerCallback<EventMap, EventName>\n ): () => void;\n removeListener<EventName extends Keyof<EventMap>>(\n type: EventName,\n callback: EventListenerCallback<EventMap, EventName>\n ): void;\n};\n\nexport type EventEmitter<EventMap extends EventMapBase> = {\n /**\n * Emit an event to child screens.\n *\n * @param options.type Type of the event (e.g. `focus`, `blur`)\n * @param [options.data] Optional information regarding the event.\n * @param [options.target] Key of the target route which should receive the event.\n * If not specified, all routes receive the event.\n */\n emit<EventName extends Keyof<EventMap>>(\n options: {\n type: EventName;\n target?: string;\n } & (EventMap[EventName]['canPreventDefault'] extends true\n ? { canPreventDefault: true }\n : {}) &\n (undefined extends EventMap[EventName]['data']\n ? { data?: EventMap[EventName]['data'] }\n : { data: EventMap[EventName]['data'] })\n ): EventArg<\n EventName,\n EventMap[EventName]['canPreventDefault'],\n EventMap[EventName]['data']\n >;\n};\n\nexport class PrivateValueStore<A, B, C> {\n /**\n * UGLY HACK! DO NOT USE THE TYPE!!!\n *\n * TypeScript requires a type to be used to be able to infer it.\n * The type should exist as its own without any operations such as union.\n * So we need to figure out a way to store this type in a property.\n * The problem with a normal property is that it shows up in intelliSense.\n * Adding private keyword works, but the annotation is stripped away in declaration.\n * Turns out if we use an empty string, it doesn't show up in intelliSense.\n */\n protected ''?: { a: A; b: B; c: C };\n}\n\ntype NavigationHelpersCommon<\n ParamList extends ParamListBase,\n State extends NavigationState = NavigationState\n> = {\n /**\n * Dispatch an action or an update function to the router.\n * The update function will receive the current state,\n *\n * @param action Action object or update function.\n */\n dispatch(\n action: NavigationAction | ((state: State) => NavigationAction)\n ): void;\n\n /**\n * Navigate to a route in current navigation tree.\n *\n * @param name Name of the route to navigate to.\n * @param [params] Params object for the route.\n */\n navigate<RouteName extends keyof ParamList>(\n ...args: undefined extends ParamList[RouteName]\n ? [screen: RouteName] | [screen: RouteName, params: ParamList[RouteName]]\n : [screen: RouteName, params: ParamList[RouteName]]\n ): void;\n\n /**\n * Navigate to a route in current navigation tree.\n *\n * @param route Object with `key` or `name` for the route to navigate to, and a `params` object.\n */\n navigate<RouteName extends keyof ParamList>(\n options:\n | { key: string; params?: ParamList[RouteName]; merge?: boolean }\n | {\n name: RouteName;\n key?: string;\n params: ParamList[RouteName];\n merge?: boolean;\n }\n ): void;\n\n /**\n * Reset the navigation state to the provided state.\n *\n * @param state Navigation state object.\n */\n reset(state: PartialState<State> | State): void;\n\n /**\n * Go back to the previous route in history.\n */\n goBack(): void;\n\n /**\n * Check if the screen is focused. The method returns `true` if focused, `false` otherwise.\n * Note that this method doesn't re-render screen when the focus changes. So don't use it in `render`.\n * To get notified of focus changes, use `addListener('focus', cb)` and `addListener('blur', cb)`.\n * To conditionally render content based on focus state, use the `useIsFocused` hook.\n */\n isFocused(): boolean;\n\n /**\n * Check if dispatching back action will be handled by navigation.\n * Note that this method doesn't re-render screen when the result changes. So don't use it in `render`.\n */\n canGoBack(): boolean;\n\n /**\n * Returns the navigation prop from the parent navigator,\n */\n getParent<T = NavigationProp<ParamListBase> | undefined>(): T;\n\n /**\n * Returns the navigator's state.\n * Note that this method doesn't re-render screen when the result changes. So don't use it in `render`.\n */\n getState(): State;\n} & PrivateValueStore<ParamList, keyof ParamList, {}>;\n\nexport type NavigationHelpers<\n ParamList extends ParamListBase,\n EventMap extends EventMapBase = {}\n> = NavigationHelpersCommon<ParamList> &\n EventEmitter<EventMap> & {\n /**\n * Update the param object for the route.\n * The new params will be shallow merged with the old one.\n *\n * @param params Params object for the current route.\n */\n setParams<RouteName extends keyof ParamList>(\n params: Partial<ParamList[RouteName]>\n ): void;\n };\n\nexport type NavigationContainerProps = {\n /**\n * Initial navigation state for the child navigators.\n */\n initialState?: InitialState;\n /**\n * Callback which is called with the latest navigation state when it changes.\n */\n onStateChange?: (state: NavigationState | undefined) => void;\n /**\n * Callback which is called when an action is not handled.\n */\n onUnhandledAction?: (action: NavigationAction) => void;\n /**\n * Whether this navigation container should be independent of parent containers.\n * If this is not set to `true`, this container cannot be nested inside another container.\n * Setting it to `true` disconnects any children navigators from parent container.\n */\n independent?: boolean;\n /**\n * Children elements to render.\n */\n children: React.ReactNode;\n};\n\nexport type NavigationProp<\n ParamList extends {},\n RouteName extends keyof ParamList = Keyof<ParamList>,\n State extends NavigationState = NavigationState<ParamList>,\n ScreenOptions extends {} = {},\n EventMap extends EventMapBase = {}\n> = NavigationHelpersCommon<ParamList, State> & {\n /**\n * Update the param object for the route.\n * The new params will be shallow merged with the old one.\n *\n * @param params Params object for the current route.\n */\n setParams(params: Partial<ParamList[RouteName]>): void;\n\n /**\n * Update the options for the route.\n * The options object will be shallow merged with default options object.\n *\n * @param options Options object for the route.\n */\n setOptions(options: Partial<ScreenOptions>): void;\n} & EventConsumer<EventMap & EventMapCore<State>> &\n PrivateValueStore<ParamList, RouteName, EventMap>;\n\nexport type RouteProp<\n ParamList extends ParamListBase,\n RouteName extends keyof ParamList = Keyof<ParamList>\n> = Route<Extract<RouteName, string>, ParamList[RouteName]>;\n\nexport type CompositeNavigationProp<\n A extends NavigationProp<ParamListBase, string, any, any>,\n B extends NavigationHelpersCommon<ParamListBase, any>\n> = Omit<A & B, keyof NavigationProp<any>> &\n NavigationProp<\n /**\n * Param list from both navigation objects needs to be combined\n * For example, we should be able to navigate to screens in both A and B\n */\n (A extends NavigationHelpersCommon<infer T> ? T : never) &\n (B extends NavigationHelpersCommon<infer U> ? U : never),\n /**\n * The route name should refer to the route name specified in the first type\n * Ideally it should work for any of them, but it's not possible to infer that way\n */\n A extends NavigationProp<any, infer R> ? R : string,\n /**\n * The type of state should refer to the state specified in the first type\n */\n A extends NavigationProp<any, any, infer S> ? S : NavigationState,\n /**\n * Screen options from both navigation objects needs to be combined\n * This allows typechecking `setOptions`\n */\n (A extends NavigationProp<any, any, any, infer O> ? O : {}) &\n (B extends NavigationProp<any, any, any, infer P> ? P : {}),\n /**\n * Event consumer config should refer to the config specified in the first type\n * This allows typechecking `addListener`/`removeListener`\n */\n A extends NavigationProp<any, any, any, any, infer E> ? E : {}\n >;\n\nexport type CompositeScreenProps<\n A extends {\n navigation: NavigationProp<ParamListBase, string, any, any>;\n route: RouteProp<ParamListBase>;\n },\n B extends {\n navigation: NavigationHelpersCommon<ParamListBase, any>;\n }\n> = {\n navigation: CompositeNavigationProp<A['navigation'], B['navigation']>;\n route: A['route'];\n};\n\nexport type Descriptor<\n ScreenOptions extends {},\n Navigation extends NavigationProp<any, any, any, any, any>,\n Route extends RouteProp<any, any>\n> = {\n /**\n * Render the component associated with this route.\n */\n render(): JSX.Element;\n\n /**\n * Options for the route.\n */\n options: ScreenOptions;\n\n /**\n * Route object for the screen\n */\n route: Route;\n\n /**\n * Navigation object for the screen\n */\n navigation: Navigation;\n};\n\nexport type ScreenListeners<\n State extends NavigationState,\n EventMap extends EventMapBase\n> = Partial<{\n [EventName in keyof (EventMap & EventMapCore<State>)]: EventListenerCallback<\n EventMap,\n EventName\n >;\n}>;\n\nexport type RouteConfigComponent<\n ParamList extends ParamListBase,\n RouteName extends keyof ParamList\n> =\n | {\n /**\n * React component to render for this screen.\n */\n component: React.ComponentType<any>;\n getComponent?: never;\n children?: never;\n }\n | {\n /**\n * Lazily get a React component to render for this screen.\n */\n getComponent: () => React.ComponentType<any>;\n component?: never;\n children?: never;\n }\n | {\n /**\n * Render callback to render content of this screen.\n */\n children: (props: {\n route: RouteProp<ParamList, RouteName>;\n navigation: any;\n }) => React.ReactNode;\n component?: never;\n getComponent?: never;\n };\n\nexport type RouteConfig<\n ParamList extends ParamListBase,\n RouteName extends keyof ParamList,\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase\n> = {\n /**\n * Optional key for this screen. This doesn't need to be unique.\n * If the key changes, existing screens with this name will be removed or reset.\n * Useful when we have some common screens and have conditional rendering.\n */\n navigationKey?: string;\n\n /**\n * Route name of this screen.\n */\n name: RouteName;\n\n /**\n * Navigator options for this screen.\n */\n options?:\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamList, RouteName>;\n navigation: any;\n }) => ScreenOptions);\n\n /**\n * Event listeners for this screen.\n */\n listeners?:\n | ScreenListeners<State, EventMap>\n | ((props: {\n route: RouteProp<ParamList, RouteName>;\n navigation: any;\n }) => ScreenListeners<State, EventMap>);\n\n /**\n * Function to return an unique ID for this screen.\n * Receives an object with the route params.\n * For a given screen name, there will always be only one screen corresponding to an ID.\n * If `undefined` is returned, it acts same as no `getId` being specified.\n */\n getId?: ({ params }: { params: ParamList[RouteName] }) => string | undefined;\n\n /**\n * Initial params object for the route.\n */\n initialParams?: Partial<ParamList[RouteName]>;\n} & RouteConfigComponent<ParamList, RouteName>;\n\nexport type RouteGroupConfig<\n ParamList extends ParamListBase,\n ScreenOptions extends {}\n> = {\n /**\n * Optional key for the screens in this group.\n * If the key changes, all existing screens in this group will be removed or reset.\n */\n navigationKey?: string;\n\n /**\n * Navigator options for this screen.\n */\n screenOptions?:\n | ScreenOptions\n | ((props: {\n route: RouteProp<ParamList, keyof ParamList>;\n navigation: any;\n }) => ScreenOptions);\n /**\n * Children React Elements to extract the route configuration from.\n * Only `Screen`, `Group` and `React.Fragment` are supported as children.\n */\n children: React.ReactNode;\n};\n\nexport type NavigationContainerEventMap = {\n /**\n * Event which fires when the navigation state changes.\n */\n state: {\n data: {\n /**\n * The updated state object after the state change.\n */\n state: NavigationState | PartialState<NavigationState> | undefined;\n };\n };\n /**\n * Event which fires when current options changes.\n */\n options: { data: { options: object } };\n /**\n * Event which fires when an action is dispatched.\n * Only intended for debugging purposes, don't use it for app logic.\n * This event will be emitted before state changes have been applied.\n */\n __unsafe_action__: {\n data: {\n /**\n * The action object which was dispatched.\n */\n action: NavigationAction;\n /**\n * Whether the action was a no-op, i.e. resulted any state changes.\n */\n noop: boolean;\n /**\n * Stack trace of the action, this will only be available during development.\n */\n stack: string | undefined;\n };\n };\n};\n\nexport type NavigationContainerRef<ParamList extends {}> =\n NavigationHelpers<ParamList> &\n EventConsumer<NavigationContainerEventMap> & {\n /**\n * Reset the navigation state of the root navigator to the provided state.\n *\n * @param state Navigation state object.\n */\n resetRoot(state?: PartialState<NavigationState> | NavigationState): void;\n /**\n * Get the rehydrated navigation state of the navigation tree.\n */\n getRootState(): NavigationState;\n /**\n * Get the currently focused navigation route.\n */\n getCurrentRoute(): Route<string> | undefined;\n /**\n * Get the currently focused route's options.\n */\n getCurrentOptions(): object | undefined;\n /**\n * Whether the navigation container is ready to handle actions.\n */\n isReady(): boolean;\n };\n\nexport type NavigationContainerRefWithCurrent<ParamList extends {}> =\n NavigationContainerRef<ParamList> & {\n current: NavigationContainerRef<ParamList> | null;\n };\n\nexport type TypedNavigator<\n ParamList extends ParamListBase,\n State extends NavigationState,\n ScreenOptions extends {},\n EventMap extends EventMapBase,\n Navigator extends React.ComponentType<any>\n> = {\n /**\n * Navigator component which manages the child screens.\n */\n Navigator: React.ComponentType<\n Omit<\n React.ComponentProps<Navigator>,\n keyof DefaultNavigatorOptions<any, any, any, any>\n > &\n DefaultNavigatorOptions<ParamList, State, ScreenOptions, EventMap>\n >;\n /**\n * Component used for grouping multiple route configuration.\n */\n Group: React.ComponentType<RouteGroupConfig<ParamList, ScreenOptions>>;\n /**\n * Component used for specifying route configuration.\n */\n Screen: <RouteName extends keyof ParamList>(\n _: RouteConfig<ParamList, RouteName, State, ScreenOptions, EventMap>\n ) => null;\n};\n\nexport type NavigatorScreenParams<\n ParamList,\n State extends NavigationState = NavigationState\n> =\n | {\n screen?: never;\n params?: never;\n initial?: never;\n path?: string;\n state: PartialState<State> | State | undefined;\n }\n | {\n [RouteName in keyof ParamList]: undefined extends ParamList[RouteName]\n ? {\n screen: RouteName;\n params?: ParamList[RouteName];\n initial?: boolean;\n path?: string;\n state?: never;\n }\n : {\n screen: RouteName;\n params: ParamList[RouteName];\n initial?: boolean;\n path?: string;\n state?: never;\n };\n }[keyof ParamList];\n\nexport type PathConfig<ParamList extends {}> = {\n path?: string;\n exact?: boolean;\n parse?: Record<string, (value: string) => any>;\n stringify?: Record<string, (value: any) => string>;\n screens?: PathConfigMap<ParamList>;\n initialRouteName?: keyof ParamList;\n};\n\nexport type PathConfigMap<ParamList extends {}> = {\n [RouteName in keyof ParamList]?: NonNullable<\n ParamList[RouteName]\n > extends NavigatorScreenParams<infer T, any>\n ? string | PathConfig<T>\n : string | Omit<PathConfig<{}>, 'screens' | 'initialRouteName'>;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useChildListeners.tsx"],"names":["useChildListeners","current","listeners","React","useRef","action","focus","addListener","useCallback","type","listener","push","index","indexOf","splice"],"mappings":";;;;;;;AAAA;;;;;;AAIA;AACA;AACA;AACe,SAASA,iBAAT,GAA6B;AAC1C,QAAM;AAAEC,IAAAA,OAAO,EAAEC;AAAX,MAAyBC,KAAK,CAACC,MAAN,
|
|
1
|
+
{"version":3,"sources":["useChildListeners.tsx"],"names":["useChildListeners","current","listeners","React","useRef","action","focus","addListener","useCallback","type","listener","push","index","indexOf","splice"],"mappings":";;;;;;;AAAA;;;;;;AAIA;AACA;AACA;AACe,SAASA,iBAAT,GAA6B;AAC1C,QAAM;AAAEC,IAAAA,OAAO,EAAEC;AAAX,MAAyBC,KAAK,CAACC,MAAN,CAE5B;AACDC,IAAAA,MAAM,EAAE,EADP;AAEDC,IAAAA,KAAK,EAAE;AAFN,GAF4B,CAA/B;AAOA,QAAMC,WAAW,GAAGJ,KAAK,CAACK,WAAN,CAClB,CAA8BC,IAA9B,EAAuCC,QAAvC,KAAoE;AAClE;AACAR,IAAAA,SAAS,CAACO,IAAD,CAAT,CAAgBE,IAAhB,CAAqBD,QAArB;AAEA,WAAO,MAAM;AACX;AACA,YAAME,KAAK,GAAGV,SAAS,CAACO,IAAD,CAAT,CAAgBI,OAAhB,CAAwBH,QAAxB,CAAd;AAEAR,MAAAA,SAAS,CAACO,IAAD,CAAT,CAAgBK,MAAhB,CAAuBF,KAAvB,EAA8B,CAA9B;AACD,KALD;AAMD,GAXiB,EAYlB,CAACV,SAAD,CAZkB,CAApB;AAeA,SAAO;AACLA,IAAAA,SADK;AAELK,IAAAA;AAFK,GAAP;AAID","sourcesContent":["import * as React from 'react';\n\nimport type { ListenerMap } from './NavigationBuilderContext';\n\n/**\n * Hook which lets child navigators add action listeners.\n */\nexport default function useChildListeners() {\n const { current: listeners } = React.useRef<{\n [K in keyof ListenerMap]: ListenerMap[K][];\n }>({\n action: [],\n focus: [],\n });\n\n const addListener = React.useCallback(\n <T extends keyof ListenerMap>(type: T, listener: ListenerMap[T]) => {\n // @ts-expect-error: listener should be correct type according to `type`\n listeners[type].push(listener);\n\n return () => {\n // @ts-expect-error: listener should be correct type according to `type`\n const index = listeners[type].indexOf(listener);\n\n listeners[type].splice(index, 1);\n };\n },\n [listeners]\n );\n\n return {\n listeners,\n addListener,\n };\n}\n"]}
|
|
@@ -19,11 +19,12 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
19
19
|
* Write the current options, so that server renderer can get current values
|
|
20
20
|
* Mutating values like this is not safe in async mode, but it doesn't apply to SSR
|
|
21
21
|
*/
|
|
22
|
-
function useCurrentRender({
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
function useCurrentRender(_ref) {
|
|
23
|
+
let {
|
|
24
|
+
state,
|
|
25
|
+
navigation,
|
|
26
|
+
descriptors
|
|
27
|
+
} = _ref;
|
|
27
28
|
const current = React.useContext(_CurrentRenderContext.default);
|
|
28
29
|
|
|
29
30
|
if (current && navigation.isFocused()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useCurrentRender.tsx"],"names":["useCurrentRender","state","navigation","descriptors","current","React","useContext","CurrentRenderContext","isFocused","options","routes","index","key"],"mappings":";;;;;;;AACA;;AAEA;;;;;;;;AAiBA;AACA;AACA;AACA;AACe,SAASA,gBAAT,
|
|
1
|
+
{"version":3,"sources":["useCurrentRender.tsx"],"names":["useCurrentRender","state","navigation","descriptors","current","React","useContext","CurrentRenderContext","isFocused","options","routes","index","key"],"mappings":";;;;;;;AACA;;AAEA;;;;;;;;AAiBA;AACA;AACA;AACA;AACe,SAASA,gBAAT,OAIH;AAAA,MAJ6B;AACvCC,IAAAA,KADuC;AAEvCC,IAAAA,UAFuC;AAGvCC,IAAAA;AAHuC,GAI7B;AACV,QAAMC,OAAO,GAAGC,KAAK,CAACC,UAAN,CAAiBC,6BAAjB,CAAhB;;AAEA,MAAIH,OAAO,IAAIF,UAAU,CAACM,SAAX,EAAf,EAAuC;AACrCJ,IAAAA,OAAO,CAACK,OAAR,GAAkBN,WAAW,CAACF,KAAK,CAACS,MAAN,CAAaT,KAAK,CAACU,KAAnB,EAA0BC,GAA3B,CAAX,CAA2CH,OAA7D;AACD;AACF","sourcesContent":["import type { NavigationState, ParamListBase } from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport CurrentRenderContext from './CurrentRenderContext';\nimport type {\n Descriptor,\n NavigationHelpers,\n NavigationProp,\n RouteProp,\n} from './types';\n\ntype Options = {\n state: NavigationState;\n navigation: NavigationHelpers<ParamListBase>;\n descriptors: Record<\n string,\n Descriptor<object, NavigationProp<ParamListBase>, RouteProp<ParamListBase>>\n >;\n};\n\n/**\n * Write the current options, so that server renderer can get current values\n * Mutating values like this is not safe in async mode, but it doesn't apply to SSR\n */\nexport default function useCurrentRender({\n state,\n navigation,\n descriptors,\n}: Options) {\n const current = React.useContext(CurrentRenderContext);\n\n if (current && navigation.isFocused()) {\n current.options = descriptors[state.routes[state.index].key].options;\n }\n}\n"]}
|