expo-router 0.0.40 → 0.0.41
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/build/ContextNavigationContainer.d.ts.map +1 -1
- package/build/ContextNavigationContainer.js +1 -0
- package/build/ContextNavigationContainer.js.map +1 -1
- package/build/ContextNavigator.d.ts.map +1 -1
- package/build/ContextNavigator.js +3 -1
- package/build/ContextNavigator.js.map +1 -1
- package/build/LocationProvider.d.ts +11 -0
- package/build/LocationProvider.d.ts.map +1 -0
- package/build/LocationProvider.js +114 -0
- package/build/LocationProvider.js.map +1 -0
- package/build/Route.js +3 -3
- package/build/Route.js.map +1 -1
- package/build/exports.d.ts +8 -8
- package/build/exports.d.ts.map +1 -1
- package/build/exports.js +11 -7
- package/build/exports.js.map +1 -1
- package/build/fork/getPathFromState.d.ts +1 -1
- package/build/fork/getPathFromState.d.ts.map +1 -1
- package/build/fork/getPathFromState.js +9 -9
- package/build/fork/getPathFromState.js.map +1 -1
- package/build/fork/getStateFromPath.js +12 -12
- package/build/fork/getStateFromPath.js.map +1 -1
- package/build/getLinkingConfig.js +3 -3
- package/build/getLinkingConfig.js.map +1 -1
- package/build/getRoutes.d.ts.map +1 -1
- package/build/getRoutes.js +42 -35
- package/build/getRoutes.js.map +1 -1
- package/build/link/Link.d.ts.map +1 -1
- package/build/link/Link.js +4 -4
- package/build/link/Link.js.map +1 -1
- package/build/link/href.d.ts +0 -2
- package/build/link/href.d.ts.map +1 -1
- package/build/link/href.js.map +1 -1
- package/build/link/useHref.d.ts +2 -2
- package/build/link/useHref.d.ts.map +1 -1
- package/build/link/useHref.js +6 -79
- package/build/link/useHref.js.map +1 -1
- package/build/link/useLinkToPath.js +1 -1
- package/build/link/useLinkToPath.js.map +1 -1
- package/build/link/useLinkToPathProps.js +2 -2
- package/build/link/useLinkToPathProps.js.map +1 -1
- package/build/link/useLoadedNavigation.d.ts +1 -0
- package/build/link/useLoadedNavigation.d.ts.map +1 -1
- package/build/link/useLoadedNavigation.js +9 -1
- package/build/link/useLoadedNavigation.js.map +1 -1
- package/build/link/useRouter.d.ts +13 -0
- package/build/link/useRouter.d.ts.map +1 -0
- package/build/link/{useLink.js → useRouter.js} +5 -2
- package/build/link/useRouter.js.map +1 -0
- package/build/matchers.d.ts +2 -2
- package/build/matchers.d.ts.map +1 -1
- package/build/matchers.js +3 -3
- package/build/matchers.js.map +1 -1
- package/build/useFocusEffect.d.ts +11 -0
- package/build/useFocusEffect.d.ts.map +1 -0
- package/build/useFocusEffect.js +98 -0
- package/build/useFocusEffect.js.map +1 -0
- package/build/views/Sitemap.js +1 -1
- package/build/views/Sitemap.js.map +1 -1
- package/build/views/Unmatched.js +4 -4
- package/build/views/Unmatched.js.map +1 -1
- package/entry.js +3 -1
- package/package.json +5 -4
- package/build/link/useLink.d.ts +0 -8
- package/build/link/useLink.d.ts.map +0 -1
- package/build/link/useLink.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextNavigationContainer.d.ts","sourceRoot":"","sources":["../src/ContextNavigationContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAEL,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAK7B,aAAK,wBAAwB,GAAG,KAAK,CAAC,cAAc,CAClD,OAAO,mBAAmB,CAC3B,CAAC;AASF,wBAAgB,6BAA6B;;;;;;;;;;;;;;;;aAQ5C;AAED,8GAA8G;AAC9G,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,wBAAwB,eAkBzE;AAmCD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,IAAI,CACT,wBAAwB,EACxB,aAAa,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAC/C,
|
|
1
|
+
{"version":3,"file":"ContextNavigationContainer.d.ts","sourceRoot":"","sources":["../src/ContextNavigationContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAEL,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAK7B,aAAK,wBAAwB,GAAG,KAAK,CAAC,cAAc,CAClD,OAAO,mBAAmB,CAC3B,CAAC;AASF,wBAAgB,6BAA6B;;;;;;;;;;;;;;;;aAQ5C;AAED,8GAA8G;AAC9G,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,wBAAwB,eAkBzE;AAmCD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,IAAI,CACT,wBAAwB,EACxB,aAAa,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAC/C,QA6DF;yBAjEe,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextNavigationContainer.js","sourceRoot":"","sources":["../src/ContextNavigationContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n createNavigationContainerRef,\n NavigationContainer,\n} from \"@react-navigation/native\";\nimport React from \"react\";\n\nimport { useRootRouteNodeContext } from \"./context\";\nimport { getLinkingConfig } from \"./getLinkingConfig\";\nimport {\n RootNavigationRef,\n useRootNavigation,\n useRootNavigationState,\n} from \"./useRootNavigation\";\nimport { SplashScreen } from \"./views/Splash\";\n\nconst navigationRef = createNavigationContainerRef();\n\ntype NavigationContainerProps = React.ComponentProps<\n typeof NavigationContainer\n>;\n\nconst NavigationContainerContext = React.createContext<\n [\n Partial<NavigationContainerProps>,\n (props: Partial<NavigationContainerProps>) => void\n ]\n>([{}, function () {}]);\n\nexport function useNavigationContainerContext() {\n const context = React.useContext(NavigationContainerContext);\n if (!context) {\n throw new Error(\n \"useNavigationContainerContext must be used within a NavigationContainerContext\"\n );\n }\n return context;\n}\n\n/** react-navigation `NavigationContainer` with automatic `linking` prop generated from the routes context. */\nexport function ContextNavigationContainer(props: NavigationContainerProps) {\n const [state, setState] = React.useState<Partial<NavigationContainerProps>>(\n {}\n );\n\n return (\n <NavigationContainerContext.Provider\n value={[\n {\n ...props,\n ...state,\n },\n setState,\n ]}\n >\n <InternalContextNavigationContainer />\n </NavigationContainerContext.Provider>\n );\n}\n\nfunction InternalContextNavigationContainer() {\n const [contextProps] = useNavigationContainerContext();\n const [isReady, setReady] = React.useState(false);\n const ref = React.useMemo(() => (isReady ? navigationRef : null), [isReady]);\n\n const root = useRootRouteNodeContext();\n\n const linking = React.useMemo(() => {\n const linking = getLinkingConfig(root);\n console.log(\"linking\", linking);\n return linking;\n }, [root]);\n\n React.useEffect(() => {\n contextProps.onReady?.();\n }, [!!contextProps?.onReady]);\n\n return (\n <RootNavigationRef.Provider value={{ ref }}>\n {!isReady && <SplashScreen />}\n {/* @ts-expect-error: children are required */}\n <NavigationContainer\n {...contextProps}\n linking={linking}\n ref={navigationRef}\n onReady={() => {\n setReady(true);\n }}\n />\n </RootNavigationRef.Provider>\n );\n}\n\nexport function RootContainer(\n props: Omit<\n NavigationContainerProps,\n \"independent\" | \"ref\" | \"children\" | \"linking\"\n >\n) {\n const [, setProps] = useNavigationContainerContext();\n\n React.useEffect(() => {\n if (process.env.NODE_ENV !== \"production\") {\n const restrictedProps = [\n \"fallback\",\n \"independent\",\n \"onReady\",\n \"initialState\",\n \"onStateChange\",\n \"onUnhandledAction\",\n \"children\",\n \"linking\",\n ];\n const invalidProps = Object.keys(props).filter((prop) =>\n restrictedProps.includes(prop)\n );\n\n if (invalidProps.length > 0) {\n console.warn(\n `RootContainer does not support the following props: ${invalidProps.join(\n \", \"\n )}. Learn more: https://expo.github.io/router/docs/features/container#restrictions`\n );\n }\n }\n }, [props]);\n\n const {\n documentTitle,\n fallback,\n onReady,\n initialState,\n onStateChange,\n onUnhandledAction,\n theme,\n } = props;\n React.useEffect(() => {\n setProps({\n documentTitle,\n fallback,\n onReady,\n initialState,\n onStateChange,\n onUnhandledAction,\n theme,\n });\n }, [\n documentTitle,\n fallback,\n onReady,\n initialState,\n onStateChange,\n onUnhandledAction,\n theme,\n ]);\n\n return null;\n}\n\nRootContainer.useRef = useRootNavigation;\nRootContainer.useState = useRootNavigationState;\n\n/** Get the root navigation container ref. */\nRootContainer.getRef = () => {\n return navigationRef;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ContextNavigationContainer.js","sourceRoot":"","sources":["../src/ContextNavigationContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n createNavigationContainerRef,\n NavigationContainer,\n} from \"@react-navigation/native\";\nimport React from \"react\";\n\nimport { useRootRouteNodeContext } from \"./context\";\nimport { getLinkingConfig } from \"./getLinkingConfig\";\nimport {\n RootNavigationRef,\n useRootNavigation,\n useRootNavigationState,\n} from \"./useRootNavigation\";\nimport { SplashScreen } from \"./views/Splash\";\n\nconst navigationRef = createNavigationContainerRef();\n\ntype NavigationContainerProps = React.ComponentProps<\n typeof NavigationContainer\n>;\n\nconst NavigationContainerContext = React.createContext<\n [\n Partial<NavigationContainerProps>,\n (props: Partial<NavigationContainerProps>) => void\n ]\n>([{}, function () {}]);\n\nexport function useNavigationContainerContext() {\n const context = React.useContext(NavigationContainerContext);\n if (!context) {\n throw new Error(\n \"useNavigationContainerContext must be used within a NavigationContainerContext\"\n );\n }\n return context;\n}\n\n/** react-navigation `NavigationContainer` with automatic `linking` prop generated from the routes context. */\nexport function ContextNavigationContainer(props: NavigationContainerProps) {\n const [state, setState] = React.useState<Partial<NavigationContainerProps>>(\n {}\n );\n\n return (\n <NavigationContainerContext.Provider\n value={[\n {\n ...props,\n ...state,\n },\n setState,\n ]}\n >\n <InternalContextNavigationContainer />\n </NavigationContainerContext.Provider>\n );\n}\n\nfunction InternalContextNavigationContainer() {\n const [contextProps] = useNavigationContainerContext();\n const [isReady, setReady] = React.useState(false);\n const ref = React.useMemo(() => (isReady ? navigationRef : null), [isReady]);\n\n const root = useRootRouteNodeContext();\n\n const linking = React.useMemo(() => {\n const linking = getLinkingConfig(root);\n console.log(\"linking\", linking);\n return linking;\n }, [root]);\n\n React.useEffect(() => {\n contextProps.onReady?.();\n }, [!!contextProps?.onReady]);\n\n return (\n <RootNavigationRef.Provider value={{ ref }}>\n {!isReady && <SplashScreen />}\n {/* @ts-expect-error: children are required */}\n <NavigationContainer\n {...contextProps}\n linking={linking}\n ref={navigationRef}\n onReady={() => {\n setReady(true);\n }}\n />\n </RootNavigationRef.Provider>\n );\n}\n\nexport function RootContainer(\n props: Omit<\n NavigationContainerProps,\n \"independent\" | \"ref\" | \"children\" | \"linking\"\n >\n) {\n const [, setProps] = useNavigationContainerContext();\n\n React.useEffect(() => {\n if (process.env.NODE_ENV !== \"production\") {\n const restrictedProps = [\n \"theme\",\n \"fallback\",\n \"independent\",\n \"onReady\",\n \"initialState\",\n \"onStateChange\",\n \"onUnhandledAction\",\n \"children\",\n \"linking\",\n ];\n const invalidProps = Object.keys(props).filter((prop) =>\n restrictedProps.includes(prop)\n );\n\n if (invalidProps.length > 0) {\n console.warn(\n `RootContainer does not support the following props: ${invalidProps.join(\n \", \"\n )}. Learn more: https://expo.github.io/router/docs/features/container#restrictions`\n );\n }\n }\n }, [props]);\n\n const {\n documentTitle,\n fallback,\n onReady,\n initialState,\n onStateChange,\n onUnhandledAction,\n theme,\n } = props;\n React.useEffect(() => {\n setProps({\n documentTitle,\n fallback,\n onReady,\n initialState,\n onStateChange,\n onUnhandledAction,\n theme,\n });\n }, [\n documentTitle,\n fallback,\n onReady,\n initialState,\n onStateChange,\n onUnhandledAction,\n theme,\n ]);\n\n return null;\n}\n\nRootContainer.useRef = useRootNavigation;\nRootContainer.useState = useRootNavigationState;\n\n/** Get the root navigation container ref. */\nRootContainer.getRef = () => {\n return navigationRef;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextNavigator.d.ts","sourceRoot":"","sources":["../src/ContextNavigator.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"ContextNavigator.d.ts","sourceRoot":"","sources":["../src/ContextNavigator.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAyBzC,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,cAAc,CAAA;CAAE,eAkBxE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useMemo } from "react";
|
|
2
2
|
import { ContextNavigationContainer } from "./ContextNavigationContainer";
|
|
3
|
+
import { LocationProvider } from "./LocationProvider";
|
|
3
4
|
import { RootRouteNodeContext, useRootRouteNodeContext } from "./context";
|
|
4
5
|
import { getRoutes } from "./getRoutes";
|
|
5
6
|
import { useTutorial } from "./onboard/useTutorial";
|
|
@@ -24,7 +25,8 @@ export function ContextNavigator({ context }) {
|
|
|
24
25
|
return (React.createElement(RootRouteNodeProvider, { context: context },
|
|
25
26
|
React.createElement(ContextNavigationContainer, null,
|
|
26
27
|
React.createElement(InitialRootStateProvider, null,
|
|
27
|
-
React.createElement(
|
|
28
|
+
React.createElement(LocationProvider, null,
|
|
29
|
+
React.createElement(RootRoute, null))))));
|
|
28
30
|
}
|
|
29
31
|
function RootRoute() {
|
|
30
32
|
const root = useRootRouteNodeContext();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextNavigator.js","sourceRoot":"","sources":["../src/ContextNavigator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,SAAS,wBAAwB,CAAC,OAAuB;IACvD,4CAA4C;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,qBAAqB,CAAC,EAC7B,OAAO,EACP,QAAQ,GAIT;IACC,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,CACL,oBAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,IACzC,QAAQ,CACqB,CACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAE,OAAO,EAA+B;IACvE,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,QAAQ,EAAE;QACZ,YAAY,CAAC,SAAS,EAAE,CAAC;QACzB,OAAO,oBAAC,QAAQ,OAAG,CAAC;KACrB;IAED,OAAO,CACL,oBAAC,qBAAqB,IAAC,OAAO,EAAE,OAAO;QACrC,oBAAC,0BAA0B;YACzB,oBAAC,wBAAwB;gBACvB,oBAAC,SAAS,OAAG,
|
|
1
|
+
{"version":3,"file":"ContextNavigator.js","sourceRoot":"","sources":["../src/ContextNavigator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,SAAS,wBAAwB,CAAC,OAAuB;IACvD,4CAA4C;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,qBAAqB,CAAC,EAC7B,OAAO,EACP,QAAQ,GAIT;IACC,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,CACL,oBAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,IACzC,QAAQ,CACqB,CACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAE,OAAO,EAA+B;IACvE,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,QAAQ,EAAE;QACZ,YAAY,CAAC,SAAS,EAAE,CAAC;QACzB,OAAO,oBAAC,QAAQ,OAAG,CAAC;KACrB;IAED,OAAO,CACL,oBAAC,qBAAqB,IAAC,OAAO,EAAE,OAAO;QACrC,oBAAC,0BAA0B;YACzB,oBAAC,wBAAwB;gBACvB,oBAAC,gBAAgB;oBACf,oBAAC,SAAS,OAAG,CACI,CACM,CACA,CACP,CACzB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,uBAAuB,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IACnD,0DAA0D;IAC1D,OAAO,oBAAC,SAAS,OAAG,CAAC;AACvB,CAAC","sourcesContent":["import React, { useMemo } from \"react\";\n\nimport { ContextNavigationContainer } from \"./ContextNavigationContainer\";\nimport { LocationProvider } from \"./LocationProvider\";\nimport { RootRouteNodeContext, useRootRouteNodeContext } from \"./context\";\nimport { getRoutes } from \"./getRoutes\";\nimport { useTutorial } from \"./onboard/useTutorial\";\nimport { InitialRootStateProvider } from \"./rootStateContext\";\nimport { RequireContext } from \"./types\";\nimport { getQualifiedRouteComponent } from \"./useScreens\";\nimport { SplashScreen } from \"./views/Splash\";\n\nfunction useContextModuleAsRoutes(context: RequireContext) {\n // TODO: Is this an optimal hook dependency?\n const keys = useMemo(() => context.keys(), [context]);\n return useMemo(() => getRoutes(context), [keys]);\n}\n\nfunction RootRouteNodeProvider({\n context,\n children,\n}: {\n context: RequireContext;\n children: React.ReactNode;\n}) {\n const routes = useContextModuleAsRoutes(context);\n return (\n <RootRouteNodeContext.Provider value={routes}>\n {children}\n </RootRouteNodeContext.Provider>\n );\n}\n\nexport function ContextNavigator({ context }: { context: RequireContext }) {\n const Tutorial = useTutorial(context);\n if (Tutorial) {\n SplashScreen.hideAsync();\n return <Tutorial />;\n }\n\n return (\n <RootRouteNodeProvider context={context}>\n <ContextNavigationContainer>\n <InitialRootStateProvider>\n <LocationProvider>\n <RootRoute />\n </LocationProvider>\n </InitialRootStateProvider>\n </ContextNavigationContainer>\n </RootRouteNodeProvider>\n );\n}\n\nfunction RootRoute() {\n const root = useRootRouteNodeContext();\n const Component = getQualifiedRouteComponent(root);\n // @ts-expect-error: TODO: Drop navigation and route props\n return <Component />;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export declare function LocationProvider({ children }: {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
}): JSX.Element;
|
|
5
|
+
/** @returns Currently selected route as a normalized string without search parameters. e.g. `/acme?foo=bar` -> `/acme`. Segments will be normalized: `/[id]?id=normal` -> `/normal` */
|
|
6
|
+
export declare function usePathname(): string;
|
|
7
|
+
/** @returns Current URL Search Parameters. */
|
|
8
|
+
export declare function useSearchParams(): URLSearchParams;
|
|
9
|
+
/** @returns array of selected segments. */
|
|
10
|
+
export declare function useSegments(): string[];
|
|
11
|
+
//# sourceMappingURL=LocationProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocationProvider.d.ts","sourceRoot":"","sources":["../src/LocationProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AA0I1B,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,eAM3E;AAcD,uLAAuL;AACvL,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,8CAA8C;AAC9C,wBAAgB,eAAe,IAAI,eAAe,CAGjD;AAED,2CAA2C;AAC3C,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAEtC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { RootContainer } from "./ContextNavigationContainer";
|
|
3
|
+
import { useLinkingContext } from "./link/useLinkingContext";
|
|
4
|
+
import { useInitialRootStateContext } from "./rootStateContext";
|
|
5
|
+
function getRouteInfoFromState(getPathFromState, state) {
|
|
6
|
+
const path = getPathFromState(state, false);
|
|
7
|
+
return {
|
|
8
|
+
pathname: path.split("?")["0"],
|
|
9
|
+
// TODO: This sometimes returns: `params=[object Object]&screen=XX&path=XX&initial=true`
|
|
10
|
+
...getNormalizedStatePath(getPathFromState(state, true)),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function compareShallowRecords(a, b) {
|
|
14
|
+
const aKeys = Object.keys(a);
|
|
15
|
+
const bKeys = Object.keys(b);
|
|
16
|
+
if (aKeys.length !== bKeys.length) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
for (const key of aKeys) {
|
|
20
|
+
if (a[key] !== b[key]) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
function compareRouteInfo(a, b) {
|
|
27
|
+
return (a.segments.length === b.segments.length &&
|
|
28
|
+
a.segments.every((segment, index) => segment === b.segments[index]) &&
|
|
29
|
+
a.pathname === b.pathname &&
|
|
30
|
+
compareShallowRecords(a.params, b.params));
|
|
31
|
+
}
|
|
32
|
+
function useUrlObject() {
|
|
33
|
+
const initialRootState = useInitialRootStateContext();
|
|
34
|
+
const getPathFromState = useGetPathFromState();
|
|
35
|
+
const [routeInfo, setRouteInfo] = React.useState(getRouteInfoFromState(getPathFromState,
|
|
36
|
+
// If the root state (from upstream) is not ready, use the hacky initial state.
|
|
37
|
+
// Initial state can be generate because it assumes the linking configuration never changes.
|
|
38
|
+
RootContainer.getRef().getRootState() ?? initialRootState));
|
|
39
|
+
const routeInfoRef = React.useRef(routeInfo);
|
|
40
|
+
React.useEffect(() => {
|
|
41
|
+
routeInfoRef.current = routeInfo;
|
|
42
|
+
}, [routeInfo]);
|
|
43
|
+
const maybeUpdateRouteInfo = React.useCallback((state) => {
|
|
44
|
+
// Prevent unnecessary updates
|
|
45
|
+
const newRouteInfo = getRouteInfoFromState(getPathFromState, state);
|
|
46
|
+
if (!compareRouteInfo(routeInfoRef.current, newRouteInfo)) {
|
|
47
|
+
setRouteInfo(newRouteInfo);
|
|
48
|
+
}
|
|
49
|
+
}, [
|
|
50
|
+
// TODO: This probably never changes
|
|
51
|
+
getPathFromState,
|
|
52
|
+
]);
|
|
53
|
+
React.useEffect(() => {
|
|
54
|
+
const rootNavigation = RootContainer.getRef();
|
|
55
|
+
return rootNavigation.addListener("state", ({ data }) => {
|
|
56
|
+
// Attempt to use the complete state from the root, otherwise this will default to
|
|
57
|
+
// sending events from the nearest layout.
|
|
58
|
+
const navigationState = rootNavigation.getRootState() ?? data.state;
|
|
59
|
+
// NOTE(EvanBacon): It's probably worth asserting if the root state is missing here.
|
|
60
|
+
maybeUpdateRouteInfo(navigationState);
|
|
61
|
+
});
|
|
62
|
+
}, [maybeUpdateRouteInfo]);
|
|
63
|
+
return routeInfo;
|
|
64
|
+
}
|
|
65
|
+
function useGetPathFromState() {
|
|
66
|
+
const linking = useLinkingContext();
|
|
67
|
+
return React.useCallback((state, asPath) => {
|
|
68
|
+
return linking.getPathFromState(state, {
|
|
69
|
+
...linking.config,
|
|
70
|
+
// @ts-expect-error
|
|
71
|
+
preserveDynamicRoutes: asPath,
|
|
72
|
+
preserveGroups: asPath,
|
|
73
|
+
});
|
|
74
|
+
}, [linking]);
|
|
75
|
+
}
|
|
76
|
+
// TODO: Split up getPathFromState to return all this info at once.
|
|
77
|
+
function getNormalizedStatePath(statePath) {
|
|
78
|
+
const [pathname, querystring] = statePath.split("?");
|
|
79
|
+
return {
|
|
80
|
+
// Strip empty path at the start
|
|
81
|
+
segments: pathname.split("/").filter(Boolean),
|
|
82
|
+
// TODO: This is not efficient, we should generate based on the state instead
|
|
83
|
+
// of converting to string then back to object
|
|
84
|
+
params: new URLSearchParams(querystring),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const LocationContext = React.createContext(undefined);
|
|
88
|
+
if (process.env.NODE_ENV !== "production") {
|
|
89
|
+
LocationContext.displayName = "LocationContext";
|
|
90
|
+
}
|
|
91
|
+
export function LocationProvider({ children }) {
|
|
92
|
+
return (React.createElement(LocationContext.Provider, { value: useUrlObject() }, children));
|
|
93
|
+
}
|
|
94
|
+
function useLocation() {
|
|
95
|
+
const location = React.useContext(LocationContext);
|
|
96
|
+
if (!location) {
|
|
97
|
+
throw new Error("Location context is missing. Make sure you are rendering a <LocationProvider />.");
|
|
98
|
+
}
|
|
99
|
+
return location;
|
|
100
|
+
}
|
|
101
|
+
/** @returns Currently selected route as a normalized string without search parameters. e.g. `/acme?foo=bar` -> `/acme`. Segments will be normalized: `/[id]?id=normal` -> `/normal` */
|
|
102
|
+
export function usePathname() {
|
|
103
|
+
return useLocation().pathname;
|
|
104
|
+
}
|
|
105
|
+
/** @returns Current URL Search Parameters. */
|
|
106
|
+
export function useSearchParams() {
|
|
107
|
+
// TODO: Make this readonly
|
|
108
|
+
return useLocation().params;
|
|
109
|
+
}
|
|
110
|
+
/** @returns array of selected segments. */
|
|
111
|
+
export function useSegments() {
|
|
112
|
+
return useLocation().segments;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=LocationProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocationProvider.js","sourceRoot":"","sources":["../src/LocationProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\n\nimport { RootContainer } from \"./ContextNavigationContainer\";\nimport getPathFromState, { State } from \"./fork/getPathFromState\";\nimport { useLinkingContext } from \"./link/useLinkingContext\";\nimport { useInitialRootStateContext } from \"./rootStateContext\";\n\ntype UrlObject = {\n pathname: string;\n readonly params: URLSearchParams;\n segments: string[];\n};\n\nfunction getRouteInfoFromState(\n getPathFromState: (state: State, asPath: boolean) => string,\n state: State\n): UrlObject {\n const path = getPathFromState(state, false);\n\n return {\n pathname: path.split(\"?\")[\"0\"],\n // TODO: This sometimes returns: `params=[object Object]&screen=XX&path=XX&initial=true`\n ...getNormalizedStatePath(getPathFromState(state, true)),\n };\n}\n\nfunction compareShallowRecords(a: Record<string, any>, b: Record<string, any>) {\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 for (const key of aKeys) {\n if (a[key] !== b[key]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction compareRouteInfo(a: UrlObject, b: UrlObject) {\n return (\n a.segments.length === b.segments.length &&\n a.segments.every((segment, index) => segment === b.segments[index]) &&\n a.pathname === b.pathname &&\n compareShallowRecords(a.params, b.params)\n );\n}\n\nfunction useUrlObject(): UrlObject {\n const initialRootState = useInitialRootStateContext();\n const getPathFromState = useGetPathFromState();\n\n const [routeInfo, setRouteInfo] = React.useState<UrlObject>(\n getRouteInfoFromState(\n getPathFromState,\n // If the root state (from upstream) is not ready, use the hacky initial state.\n // Initial state can be generate because it assumes the linking configuration never changes.\n RootContainer.getRef().getRootState() ?? initialRootState\n )\n );\n\n const routeInfoRef = React.useRef(routeInfo);\n\n React.useEffect(() => {\n routeInfoRef.current = routeInfo;\n }, [routeInfo]);\n\n const maybeUpdateRouteInfo = React.useCallback(\n (state: State) => {\n // Prevent unnecessary updates\n const newRouteInfo = getRouteInfoFromState(getPathFromState, state);\n if (!compareRouteInfo(routeInfoRef.current, newRouteInfo)) {\n setRouteInfo(newRouteInfo);\n }\n },\n [\n // TODO: This probably never changes\n getPathFromState,\n ]\n );\n\n React.useEffect(() => {\n const rootNavigation = RootContainer.getRef();\n\n return rootNavigation.addListener(\"state\", ({ data }) => {\n // Attempt to use the complete state from the root, otherwise this will default to\n // sending events from the nearest layout.\n const navigationState =\n rootNavigation.getRootState() ?? (data.state as unknown as State);\n // NOTE(EvanBacon): It's probably worth asserting if the root state is missing here.\n maybeUpdateRouteInfo(navigationState);\n });\n }, [maybeUpdateRouteInfo]);\n\n return routeInfo;\n}\n\nfunction useGetPathFromState() {\n const linking = useLinkingContext();\n\n return React.useCallback(\n (state: Parameters<typeof getPathFromState>[0], asPath: boolean) => {\n return linking.getPathFromState(state, {\n ...linking.config,\n // @ts-expect-error\n preserveDynamicRoutes: asPath,\n preserveGroups: asPath,\n });\n },\n [linking]\n );\n}\n\n// TODO: Split up getPathFromState to return all this info at once.\nfunction getNormalizedStatePath(\n statePath: string\n): Omit<UrlObject, \"pathname\"> {\n const [pathname, querystring] = statePath.split(\"?\");\n\n return {\n // Strip empty path at the start\n segments: pathname.split(\"/\").filter(Boolean),\n // TODO: This is not efficient, we should generate based on the state instead\n // of converting to string then back to object\n params: new URLSearchParams(querystring),\n };\n}\n\nconst LocationContext = React.createContext<UrlObject | undefined>(undefined);\n\nif (process.env.NODE_ENV !== \"production\") {\n LocationContext.displayName = \"LocationContext\";\n}\n\nexport function LocationProvider({ children }: { children: React.ReactNode }) {\n return (\n <LocationContext.Provider value={useUrlObject()}>\n {children}\n </LocationContext.Provider>\n );\n}\n\nfunction useLocation() {\n const location = React.useContext(LocationContext);\n\n if (!location) {\n throw new Error(\n \"Location context is missing. Make sure you are rendering a <LocationProvider />.\"\n );\n }\n\n return location;\n}\n\n/** @returns Currently selected route as a normalized string without search parameters. e.g. `/acme?foo=bar` -> `/acme`. Segments will be normalized: `/[id]?id=normal` -> `/normal` */\nexport function usePathname(): string {\n return useLocation().pathname;\n}\n\n/** @returns Current URL Search Parameters. */\nexport function useSearchParams(): URLSearchParams {\n // TODO: Make this readonly\n return useLocation().params;\n}\n\n/** @returns array of selected segments. */\nexport function useSegments(): string[] {\n return useLocation().segments;\n}\n"]}
|
package/build/Route.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { useContext } from "react";
|
|
2
2
|
import { RootRouteNodeContext } from "./context";
|
|
3
|
-
import { getNameFromFilePath,
|
|
3
|
+
import { getNameFromFilePath, matchGroupName } from "./matchers";
|
|
4
4
|
const CurrentRoutePathContext = React.createContext(null);
|
|
5
5
|
const CurrentRouteContext = React.createContext(null);
|
|
6
6
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -71,8 +71,8 @@ export function sortRoutes(a, b) {
|
|
|
71
71
|
}
|
|
72
72
|
return 0;
|
|
73
73
|
}
|
|
74
|
-
const aIndex = a.route === "index" ||
|
|
75
|
-
const bIndex = b.route === "index" ||
|
|
74
|
+
const aIndex = a.route === "index" || matchGroupName(a.route) != null;
|
|
75
|
+
const bIndex = b.route === "index" || matchGroupName(b.route) != null;
|
|
76
76
|
if (aIndex && !bIndex) {
|
|
77
77
|
return -1;
|
|
78
78
|
}
|
package/build/Route.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Route.js","sourceRoot":"","sources":["../src/Route.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAa,UAAU,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"Route.js","sourceRoot":"","sources":["../src/Route.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { ReactNode, useContext } from \"react\";\n\nimport { RootRouteNodeContext } from \"./context\";\nimport { getNameFromFilePath, matchGroupName } from \"./matchers\";\n\n/** The list of input keys will become optional, everything else will remain the same. */\nexport type PickPartial<T, K extends keyof T> = Omit<T, K> &\n Partial<Pick<T, K>>;\n\nexport type DynamicConvention = { name: string; deep: boolean };\n\nexport type RouteNode = {\n /** Load a route into memory. Returns the exports from a route. */\n loadRoute: () => any;\n\n /** Loaded initial route name. */\n initialRouteName?: string;\n /** nested routes */\n children: RouteNode[];\n /** Is the route a dynamic path */\n dynamic: null | DynamicConvention[];\n /** `index`, `error-boundary`, etc. */\n route: string;\n /** require.context key, used for matching children. */\n contextKey: string;\n /** Added in-memory */\n generated?: boolean;\n\n /** Internal screens like the directory or the auto 404 should be marked as internal. */\n internal?: boolean;\n};\n\nconst CurrentRoutePathContext = React.createContext<string | null>(null);\n\nconst CurrentRouteContext = React.createContext<RouteNode | null>(null);\n\nif (process.env.NODE_ENV !== \"production\") {\n CurrentRoutePathContext.displayName = \"RoutePath\";\n CurrentRouteContext.displayName = \"Route\";\n}\n\n/** Return the RouteNode at the current contextual boundary. */\nexport function useRouteNode(): RouteNode | null {\n return useContext(CurrentRouteContext);\n}\n\nexport function useContextKey(): string {\n const filename = useContext(CurrentRoutePathContext);\n if (filename == null) {\n throw new Error(\"No filename found. This is likely a bug in expo-router.\");\n }\n return filename;\n}\n\n/** Provides the matching routes and filename to the children. */\nexport function Route({\n children,\n node,\n}: {\n children: ReactNode;\n node: RouteNode;\n}) {\n const normalName = React.useMemo(() => {\n // The root path is `` (empty string) so always prepend `/` to ensure\n // there is some value.\n const normal = \"/\" + getNameFromFilePath(node.contextKey);\n if (!normal.endsWith(\"_layout\")) {\n return normal;\n }\n return normal.replace(/\\/?_layout$/, \"\");\n }, [node.contextKey]);\n\n return (\n <CurrentRoutePathContext.Provider value={normalName}>\n <CurrentRouteContext.Provider value={node}>\n {children}\n </CurrentRouteContext.Provider>\n </CurrentRoutePathContext.Provider>\n );\n}\n\nexport function useRootRoute(): RouteNode | null {\n return useContext(RootRouteNodeContext);\n}\n\nexport function sortRoutesWithInitial(initialRouteName?: string) {\n return (a: RouteNode, b: RouteNode): number => {\n if (initialRouteName) {\n if (a.route === initialRouteName) {\n return -1;\n }\n if (b.route === initialRouteName) {\n return 1;\n }\n }\n return sortRoutes(a, b);\n };\n}\n\nexport function sortRoutes(a: RouteNode, b: RouteNode): number {\n if (a.dynamic && !b.dynamic) {\n return 1;\n }\n if (!a.dynamic && b.dynamic) {\n return -1;\n }\n if (a.dynamic && b.dynamic) {\n if (a.dynamic.length !== b.dynamic.length) {\n return b.dynamic.length - a.dynamic.length;\n }\n for (let i = 0; i < a.dynamic.length; i++) {\n const aDynamic = a.dynamic[i];\n const bDynamic = b.dynamic[i];\n if (aDynamic.deep && !bDynamic.deep) {\n return 1;\n }\n if (!aDynamic.deep && bDynamic.deep) {\n return -1;\n }\n }\n return 0;\n }\n\n const aIndex = a.route === \"index\" || matchGroupName(a.route) != null;\n const bIndex = b.route === \"index\" || matchGroupName(b.route) != null;\n\n if (aIndex && !bIndex) {\n return -1;\n }\n if (!aIndex && bIndex) {\n return 1;\n }\n\n return a.route.length - b.route.length;\n}\n"]}
|
package/build/exports.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { useRouter } from "./link/useRouter";
|
|
2
|
+
export { usePathname, useSearchParams, useSegments } from "./LocationProvider";
|
|
3
|
+
export { Link, Redirect } from "./link/Link";
|
|
3
4
|
export { withLayoutContext } from "./layouts/withLayoutContext";
|
|
5
|
+
export { Layout, Children } from "./views/Layout";
|
|
4
6
|
export { ExpoRoot } from "./views/Root";
|
|
5
7
|
export { Unmatched } from "./views/Unmatched";
|
|
8
|
+
export { ErrorBoundaryProps } from "./views/Try";
|
|
6
9
|
export { ErrorBoundary } from "./views/ErrorBoundary";
|
|
7
|
-
export { Layout, Children } from "./views/Layout";
|
|
8
|
-
export { Link, Redirect } from "./link/Link";
|
|
9
|
-
export { useLink } from "./link/useLink";
|
|
10
|
-
export { RootContainer } from "./ContextNavigationContainer";
|
|
11
|
-
export * as Linking from "./link/linking";
|
|
12
10
|
export { SplashScreen } from "./views/Splash";
|
|
13
|
-
export
|
|
11
|
+
export * as Linking from "./link/linking";
|
|
14
12
|
export { useNavigation } from "./useNavigation";
|
|
13
|
+
export { RootContainer } from "./ContextNavigationContainer";
|
|
14
|
+
export { useFocusEffect } from "./useFocusEffect";
|
|
15
15
|
//# sourceMappingURL=exports.d.ts.map
|
package/build/exports.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../src/exports.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../src/exports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAG1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
package/build/exports.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
|
|
1
|
+
// Expo Router API
|
|
2
|
+
export { useRouter } from "./link/useRouter";
|
|
3
|
+
export { usePathname, useSearchParams, useSegments } from "./LocationProvider";
|
|
4
|
+
export { Link, Redirect } from "./link/Link";
|
|
2
5
|
export { withLayoutContext } from "./layouts/withLayoutContext";
|
|
6
|
+
export { Layout, Children } from "./views/Layout";
|
|
7
|
+
// Expo Router Views
|
|
3
8
|
export { ExpoRoot } from "./views/Root";
|
|
4
9
|
export { Unmatched } from "./views/Unmatched";
|
|
5
10
|
export { ErrorBoundary } from "./views/ErrorBoundary";
|
|
6
|
-
|
|
7
|
-
export {
|
|
8
|
-
export { useLink } from "./link/useLink";
|
|
9
|
-
export { RootContainer } from "./ContextNavigationContainer";
|
|
11
|
+
// Platform
|
|
12
|
+
export { SplashScreen } from "./views/Splash";
|
|
10
13
|
import * as Linking_1 from "./link/linking";
|
|
11
14
|
export { Linking_1 as Linking };
|
|
12
|
-
|
|
13
|
-
export { useHref } from "./link/useHref";
|
|
15
|
+
// React Navigation
|
|
14
16
|
export { useNavigation } from "./useNavigation";
|
|
17
|
+
export { RootContainer } from "./ContextNavigationContainer";
|
|
18
|
+
export { useFocusEffect } from "./useFocusEffect";
|
|
15
19
|
//# sourceMappingURL=exports.js.map
|
package/build/exports.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.js","sourceRoot":"","sources":["../src/exports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"exports.js","sourceRoot":"","sources":["../src/exports.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAElD,oBAAoB;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;2BACrB,gBAAgB;sBAA7B,OAAO;AAEnB,mBAAmB;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["// Expo Router API\nexport { useRouter } from \"./link/useRouter\";\nexport { usePathname, useSearchParams, useSegments } from \"./LocationProvider\";\nexport { Link, Redirect } from \"./link/Link\";\n\nexport { withLayoutContext } from \"./layouts/withLayoutContext\";\nexport { Layout, Children } from \"./views/Layout\";\n\n// Expo Router Views\nexport { ExpoRoot } from \"./views/Root\";\nexport { Unmatched } from \"./views/Unmatched\";\nexport { ErrorBoundaryProps } from \"./views/Try\";\nexport { ErrorBoundary } from \"./views/ErrorBoundary\";\n\n// Platform\nexport { SplashScreen } from \"./views/Splash\";\nexport * as Linking from \"./link/linking\";\n\n// React Navigation\nexport { useNavigation } from \"./useNavigation\";\nexport { RootContainer } from \"./ContextNavigationContainer\";\nexport { useFocusEffect } from \"./useFocusEffect\";\n"]}
|
|
@@ -35,7 +35,7 @@ export declare type State = NavigationState | Omit<PartialState<NavigationState>
|
|
|
35
35
|
* @returns Path representing the state, e.g. /foo/bar?count=42.
|
|
36
36
|
*/
|
|
37
37
|
export default function getPathFromState<ParamList extends object>(state: State, _options?: Options<ParamList> & {
|
|
38
|
-
|
|
38
|
+
preserveGroups?: boolean;
|
|
39
39
|
preserveDynamicRoutes?: boolean;
|
|
40
40
|
}): string;
|
|
41
41
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPathFromState.d.ts","sourceRoot":"","sources":["../../src/fork/getPathFromState.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EAEd,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EAEb,MAAM,2BAA2B,CAAC;AASnC,aAAK,OAAO,CAAC,SAAS,SAAS,MAAM,IAAI;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACnC,CAAC;AAEF,oBAAY,KAAK,GACb,eAAe,GACf,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC;AAgEjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,SAAS,SAAS,MAAM,EAC/D,KAAK,EAAE,KAAK,EAEZ,QAAQ,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;IAC9B,
|
|
1
|
+
{"version":3,"file":"getPathFromState.d.ts","sourceRoot":"","sources":["../../src/fork/getPathFromState.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EAEd,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EAEb,MAAM,2BAA2B,CAAC;AASnC,aAAK,OAAO,CAAC,SAAS,SAAS,MAAM,IAAI;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACnC,CAAC;AAEF,oBAAY,KAAK,GACb,eAAe,GACf,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC;AAgEjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,SAAS,SAAS,MAAM,EAC/D,KAAK,EAAE,KAAK,EAEZ,QAAQ,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC5B,GACL,MAAM,CA2BR"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { validatePathConfig, } from "@react-navigation/core";
|
|
2
2
|
import * as queryString from "query-string";
|
|
3
|
-
import { matchDeepDynamicRouteName, matchDynamicName,
|
|
3
|
+
import { matchDeepDynamicRouteName, matchDynamicName, matchGroupName, } from "../matchers";
|
|
4
4
|
const getActiveRoute = (state) => {
|
|
5
5
|
const route = typeof state.index === "number"
|
|
6
6
|
? state.routes[state.index]
|
|
@@ -33,7 +33,7 @@ function createFakeState(params) {
|
|
|
33
33
|
function segmentMatchesConvention(segment) {
|
|
34
34
|
return (segment === "index" ||
|
|
35
35
|
matchDynamicName(segment) != null ||
|
|
36
|
-
|
|
36
|
+
matchGroupName(segment) != null ||
|
|
37
37
|
matchDeepDynamicRouteName(segment) != null);
|
|
38
38
|
}
|
|
39
39
|
function encodeURIComponentPreservingBrackets(str) {
|
|
@@ -74,7 +74,7 @@ _options = {}) {
|
|
|
74
74
|
if (state == null) {
|
|
75
75
|
throw Error("Got 'undefined' for the navigation state. You must pass a valid state object.");
|
|
76
76
|
}
|
|
77
|
-
const {
|
|
77
|
+
const { preserveGroups, preserveDynamicRoutes, ...options } = _options;
|
|
78
78
|
if (_options) {
|
|
79
79
|
validatePathConfig(options);
|
|
80
80
|
}
|
|
@@ -85,7 +85,7 @@ _options = {}) {
|
|
|
85
85
|
}
|
|
86
86
|
return getPathFromResolvedState(state,
|
|
87
87
|
// Create a normalized configs object which will be easier to use
|
|
88
|
-
createNormalizedConfigs(screens), {
|
|
88
|
+
createNormalizedConfigs(screens), { preserveGroups, preserveDynamicRoutes });
|
|
89
89
|
}
|
|
90
90
|
function processParamsWithUserSettings(configItem, params) {
|
|
91
91
|
const stringify = configItem?.stringify;
|
|
@@ -214,7 +214,7 @@ function walkConfigItems(route, focusedRoute, configs) {
|
|
|
214
214
|
params: collectedParams,
|
|
215
215
|
};
|
|
216
216
|
}
|
|
217
|
-
function getPathFromResolvedState(state, configs, {
|
|
217
|
+
function getPathFromResolvedState(state, configs, { preserveGroups, preserveDynamicRoutes, }) {
|
|
218
218
|
let path = "";
|
|
219
219
|
let current = state;
|
|
220
220
|
const allParams = {};
|
|
@@ -233,7 +233,7 @@ function getPathFromResolvedState(state, configs, { preserveFragments, preserveD
|
|
|
233
233
|
routePath: nextRoute.path,
|
|
234
234
|
params: allParams,
|
|
235
235
|
initialRouteName: configs[nextRoute.name]?.initialRouteName,
|
|
236
|
-
|
|
236
|
+
preserveGroups,
|
|
237
237
|
preserveDynamicRoutes,
|
|
238
238
|
});
|
|
239
239
|
if (nextRoute.state &&
|
|
@@ -267,7 +267,7 @@ function getPathFromResolvedState(state, configs, { preserveFragments, preserveD
|
|
|
267
267
|
}
|
|
268
268
|
return basicSanitizePath(path);
|
|
269
269
|
}
|
|
270
|
-
function getPathWithConventionsCollapsed({ pattern, routePath, params,
|
|
270
|
+
function getPathWithConventionsCollapsed({ pattern, routePath, params, preserveGroups, preserveDynamicRoutes, initialRouteName, }) {
|
|
271
271
|
const segments = pattern.split("/");
|
|
272
272
|
return segments
|
|
273
273
|
.map((p, i) => {
|
|
@@ -296,8 +296,8 @@ function getPathWithConventionsCollapsed({ pattern, routePath, params, preserveF
|
|
|
296
296
|
// Optional params without value assigned in route.params should be ignored
|
|
297
297
|
return params[name];
|
|
298
298
|
}
|
|
299
|
-
if (!
|
|
300
|
-
// When the last part is a
|
|
299
|
+
if (!preserveGroups && matchGroupName(p) != null) {
|
|
300
|
+
// When the last part is a group it could be a shared URL
|
|
301
301
|
// if the route has an initialRouteName defined, then we should
|
|
302
302
|
// use that as the component path as we can assume it will be shown.
|
|
303
303
|
if (segments.length - 1 === i) {
|