expo-router 3.1.0 → 3.1.2
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/_ctx-html.js +7 -0
- package/_ctx.android.js +1 -1
- package/_ctx.ios.js +1 -1
- package/_ctx.js +6 -1
- package/_ctx.web.js +1 -1
- package/babel.js +0 -18
- package/build/ExpoRoot.d.ts.map +1 -1
- package/build/ExpoRoot.js +64 -56
- package/build/ExpoRoot.js.map +1 -1
- package/build/LocationProvider.d.ts +2 -2
- package/build/LocationProvider.d.ts.map +1 -1
- package/build/LocationProvider.js +11 -5
- package/build/LocationProvider.js.map +1 -1
- package/build/Route.d.ts +2 -2
- package/build/Route.d.ts.map +1 -1
- package/build/Route.js +41 -55
- package/build/Route.js.map +1 -1
- package/build/exports.d.ts +1 -1
- package/build/exports.d.ts.map +1 -1
- package/build/exports.js +34 -12
- package/build/exports.js.map +1 -1
- package/build/fork/NavigationContainer.js +4 -2
- package/build/fork/NavigationContainer.js.map +1 -1
- package/build/fork/NavigationContainer.native.js +48 -20
- package/build/fork/NavigationContainer.native.js.map +1 -1
- package/build/fork/extractPathFromURL.js +39 -8
- package/build/fork/extractPathFromURL.js.map +1 -1
- package/build/fork/findFocusedRoute.js +5 -1
- package/build/fork/findFocusedRoute.js.map +1 -1
- package/build/fork/getPathFromState.d.ts +1 -0
- package/build/fork/getPathFromState.d.ts.map +1 -1
- package/build/fork/getPathFromState.js +59 -14
- package/build/fork/getPathFromState.js.map +1 -1
- package/build/fork/getStateFromPath.d.ts +2 -1
- package/build/fork/getStateFromPath.d.ts.map +1 -1
- package/build/fork/getStateFromPath.js +73 -21
- package/build/fork/getStateFromPath.js.map +1 -1
- package/build/fork/react-native-web-container.js +3 -1
- package/build/fork/react-native-web-container.js.map +1 -1
- package/build/fork/useLinking.js +7 -2
- package/build/fork/useLinking.js.map +1 -1
- package/build/fork/useLinking.native.js +36 -10
- package/build/fork/useLinking.native.js.map +1 -1
- package/build/fork/validatePathConfig.js +4 -1
- package/build/fork/validatePathConfig.js.map +1 -1
- package/build/getDevServer/index.js +13 -6
- package/build/getDevServer/index.js.map +1 -1
- package/build/getDevServer/index.native.js +4 -1
- package/build/getDevServer/index.native.js.map +1 -1
- package/build/getLinkingConfig.js +19 -14
- package/build/getLinkingConfig.js.map +1 -1
- package/build/getReactNavigationConfig.js +10 -5
- package/build/getReactNavigationConfig.js.map +1 -1
- package/build/getRoutes.d.ts +2 -0
- package/build/getRoutes.d.ts.map +1 -1
- package/build/getRoutes.js +56 -27
- package/build/getRoutes.js.map +1 -1
- package/build/getServerManifest.d.ts +55 -0
- package/build/getServerManifest.d.ts.map +1 -0
- package/build/getServerManifest.js +159 -0
- package/build/getServerManifest.js.map +1 -0
- package/build/global-state/router-store.js +53 -45
- package/build/global-state/router-store.js.map +1 -1
- package/build/global-state/routing.js +62 -29
- package/build/global-state/routing.js.map +1 -1
- package/build/global-state/sort-routes.js +7 -3
- package/build/global-state/sort-routes.js.map +1 -1
- package/build/head/ExpoHead.android.js +10 -3
- package/build/head/ExpoHead.android.js.map +1 -1
- package/build/head/ExpoHead.ios.js +41 -35
- package/build/head/ExpoHead.ios.js.map +1 -1
- package/build/head/ExpoHead.js +12 -5
- package/build/head/ExpoHead.js.map +1 -1
- package/build/head/ExpoHeadModule.js +4 -1
- package/build/head/ExpoHeadModule.js.map +1 -1
- package/build/head/ExpoHeadModule.native.js +31 -5
- package/build/head/ExpoHeadModule.native.js.map +1 -1
- package/build/head/index.js +17 -1
- package/build/head/index.js.map +1 -1
- package/build/head/url.js +12 -5
- package/build/head/url.js.map +1 -1
- package/build/hooks.d.ts +0 -3
- package/build/hooks.d.ts.map +1 -1
- package/build/hooks.js +41 -36
- package/build/hooks.js.map +1 -1
- package/build/imperative-api.js +10 -7
- package/build/imperative-api.js.map +1 -1
- package/build/import-mode/index.android.js +3 -1
- package/build/import-mode/index.android.js.map +1 -1
- package/build/import-mode/index.ios.js +3 -1
- package/build/import-mode/index.ios.js.map +1 -1
- package/build/import-mode/index.js +3 -1
- package/build/import-mode/index.js.map +1 -1
- package/build/import-mode/index.web.js +3 -1
- package/build/import-mode/index.web.js.map +1 -1
- package/build/index.js +22 -3
- package/build/index.js.map +1 -1
- package/build/layouts/Drawer.js +8 -5
- package/build/layouts/Drawer.js.map +1 -1
- package/build/layouts/Stack.js +8 -5
- package/build/layouts/Stack.js.map +1 -1
- package/build/layouts/Tabs.js +16 -10
- package/build/layouts/Tabs.js.map +1 -1
- package/build/layouts/withLayoutContext.js +22 -14
- package/build/layouts/withLayoutContext.js.map +1 -1
- package/build/link/Link.js +46 -16
- package/build/link/Link.js.map +1 -1
- package/build/link/href.js +6 -2
- package/build/link/href.js.map +1 -1
- package/build/link/linking.js +48 -15
- package/build/link/linking.js.map +1 -1
- package/build/link/path.js +5 -1
- package/build/link/path.js.map +1 -1
- package/build/link/stateOperations.js +11 -4
- package/build/link/stateOperations.js.map +1 -1
- package/build/link/useLinkToPathProps.d.ts.map +1 -1
- package/build/link/useLinkToPathProps.js +12 -8
- package/build/link/useLinkToPathProps.js.map +1 -1
- package/build/link/useLoadedNavigation.js +20 -15
- package/build/link/useLoadedNavigation.js.map +1 -1
- package/build/loadStaticParamsAsync.js +5 -1
- package/build/loadStaticParamsAsync.js.map +1 -1
- package/build/matchers.js +22 -10
- package/build/matchers.js.map +1 -1
- package/build/onboard/Tutorial.js +37 -30
- package/build/onboard/Tutorial.js.map +1 -1
- package/build/onboard/createEntryFile.js +9 -4
- package/build/onboard/createEntryFile.js.map +1 -1
- package/build/primitives.js +6 -2
- package/build/primitives.js.map +1 -1
- package/build/qualified-entry.js +14 -7
- package/build/qualified-entry.js.map +1 -1
- package/build/renderRootComponent.js +18 -11
- package/build/renderRootComponent.js.map +1 -1
- package/build/routes-manifest.d.ts +14 -0
- package/build/routes-manifest.d.ts.map +1 -0
- package/build/routes-manifest.js +27 -0
- package/build/routes-manifest.js.map +1 -0
- package/build/sortRoutes.d.ts +4 -0
- package/build/sortRoutes.d.ts.map +1 -0
- package/build/sortRoutes.js +53 -0
- package/build/sortRoutes.js.map +1 -0
- package/build/static/getRootComponent.js +8 -4
- package/build/static/getRootComponent.js.map +1 -1
- package/build/static/html.js +19 -11
- package/build/static/html.js.map +1 -1
- package/build/static/renderStaticContent.d.ts.map +1 -1
- package/build/static/renderStaticContent.js +63 -30
- package/build/static/renderStaticContent.js.map +1 -1
- package/build/testing-library/context-stubs.js +14 -6
- package/build/testing-library/context-stubs.js.map +1 -1
- package/build/testing-library/expect.js +10 -5
- package/build/testing-library/expect.js.map +1 -1
- package/build/testing-library/index.js +41 -20
- package/build/testing-library/index.js.map +1 -1
- package/build/testing-library/mocks.js +6 -3
- package/build/testing-library/mocks.js.map +1 -1
- package/build/testing-library/require-context-ponyfill.js +14 -8
- package/build/testing-library/require-context-ponyfill.js.map +1 -1
- package/build/types.js +2 -1
- package/build/useDeprecated.js +11 -6
- package/build/useDeprecated.js.map +1 -1
- package/build/useFocusEffect.js +31 -4
- package/build/useFocusEffect.js.map +1 -1
- package/build/useNavigation.js +20 -12
- package/build/useNavigation.js.map +1 -1
- package/build/useScreens.js +40 -31
- package/build/useScreens.js.map +1 -1
- package/build/utils/mockState.js +10 -5
- package/build/utils/mockState.js.map +1 -1
- package/build/utils/url.js +5 -1
- package/build/utils/url.js.map +1 -1
- package/build/views/EmptyRoute.js +14 -7
- package/build/views/EmptyRoute.js.map +1 -1
- package/build/views/ErrorBoundary.js +37 -30
- package/build/views/ErrorBoundary.js.map +1 -1
- package/build/views/Navigator.js +58 -26
- package/build/views/Navigator.js.map +1 -1
- package/build/views/Pressable.js +5 -2
- package/build/views/Pressable.js.map +1 -1
- package/build/views/Screen.d.ts +1 -3
- package/build/views/Screen.d.ts.map +1 -1
- package/build/views/Screen.js +12 -18
- package/build/views/Screen.js.map +1 -1
- package/build/views/Sitemap.js +48 -40
- package/build/views/Sitemap.js.map +1 -1
- package/build/views/Splash.js +41 -12
- package/build/views/Splash.js.map +1 -1
- package/build/views/SuspenseFallback.js +12 -5
- package/build/views/SuspenseFallback.js.map +1 -1
- package/build/views/Toast.js +33 -25
- package/build/views/Toast.js.map +1 -1
- package/build/views/Try.js +12 -5
- package/build/views/Try.js.map +1 -1
- package/build/views/Unmatched.js +30 -23
- package/build/views/Unmatched.js.map +1 -1
- package/package.json +8 -5
- package/server.d.ts +10 -0
- package/server.js +3 -0
- package/types/global.d.ts +14 -5
|
@@ -1,12 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
29
|
// Forked from React Navigation in order to use a custom `useLinking` -> `extractPathFromURL` function.
|
|
2
30
|
// https://github.com/react-navigation/react-navigation/blob/main/packages/native/src/NavigationContainer.tsx
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
31
|
+
const core_1 = require("@react-navigation/core");
|
|
32
|
+
const native_1 = require("@react-navigation/native");
|
|
33
|
+
const useBackButton_1 = __importDefault(require("@react-navigation/native/src/useBackButton"));
|
|
34
|
+
const useDocumentTitle_1 = __importDefault(require("@react-navigation/native/src/useDocumentTitle"));
|
|
35
|
+
const useThenable_1 = __importDefault(require("@react-navigation/native/src/useThenable"));
|
|
36
|
+
const React = __importStar(require("react"));
|
|
37
|
+
const useLinking_1 = __importDefault(require("./useLinking"));
|
|
10
38
|
global.REACT_NAVIGATION_DEVTOOLS = new WeakMap();
|
|
11
39
|
/**
|
|
12
40
|
* Container component which holds the navigation state designed for React Native apps.
|
|
@@ -22,15 +50,15 @@ global.REACT_NAVIGATION_DEVTOOLS = new WeakMap();
|
|
|
22
50
|
* @param props.children Child elements to render the content.
|
|
23
51
|
* @param props.ref Ref object which refers to the navigation object containing helper methods.
|
|
24
52
|
*/
|
|
25
|
-
function NavigationContainerInner({ theme = DefaultTheme, linking, fallback = null, documentTitle, onReady, ...rest }, ref) {
|
|
53
|
+
function NavigationContainerInner({ theme = native_1.DefaultTheme, linking, fallback = null, documentTitle, onReady, ...rest }, ref) {
|
|
26
54
|
const isLinkingEnabled = linking ? linking.enabled !== false : false;
|
|
27
55
|
if (linking?.config) {
|
|
28
|
-
validatePathConfig(linking.config);
|
|
56
|
+
(0, core_1.validatePathConfig)(linking.config);
|
|
29
57
|
}
|
|
30
58
|
const refContainer = React.useRef(null);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const { getInitialState } =
|
|
59
|
+
(0, useBackButton_1.default)(refContainer);
|
|
60
|
+
(0, useDocumentTitle_1.default)(refContainer, documentTitle);
|
|
61
|
+
const { getInitialState } = (0, useLinking_1.default)(refContainer, {
|
|
34
62
|
// independent: rest.independent,
|
|
35
63
|
enabled: isLinkingEnabled,
|
|
36
64
|
prefixes: [],
|
|
@@ -46,15 +74,15 @@ function NavigationContainerInner({ theme = DefaultTheme, linking, fallback = nu
|
|
|
46
74
|
...linking,
|
|
47
75
|
enabled: isLinkingEnabled,
|
|
48
76
|
prefixes: linking?.prefixes ?? [],
|
|
49
|
-
getStateFromPath: linking?.getStateFromPath ?? getStateFromPath,
|
|
50
|
-
getPathFromState: linking?.getPathFromState ?? getPathFromState,
|
|
51
|
-
getActionFromState: linking?.getActionFromState ?? getActionFromState,
|
|
77
|
+
getStateFromPath: linking?.getStateFromPath ?? core_1.getStateFromPath,
|
|
78
|
+
getPathFromState: linking?.getPathFromState ?? core_1.getPathFromState,
|
|
79
|
+
getActionFromState: linking?.getActionFromState ?? core_1.getActionFromState,
|
|
52
80
|
};
|
|
53
81
|
},
|
|
54
82
|
});
|
|
55
83
|
}
|
|
56
84
|
});
|
|
57
|
-
const [isResolved, initialState] =
|
|
85
|
+
const [isResolved, initialState] = (0, useThenable_1.default)(getInitialState);
|
|
58
86
|
React.useImperativeHandle(ref, () => refContainer.current);
|
|
59
87
|
const linkingContext = React.useMemo(() => ({ options: linking }), [linking]);
|
|
60
88
|
const isReady = rest.initialState != null || !isLinkingEnabled || isResolved;
|
|
@@ -72,10 +100,10 @@ function NavigationContainerInner({ theme = DefaultTheme, linking, fallback = nu
|
|
|
72
100
|
// Then the fallback will be handled by a parent `Suspense` component
|
|
73
101
|
return fallback;
|
|
74
102
|
}
|
|
75
|
-
return (React.createElement(LinkingContext.Provider, { value: linkingContext },
|
|
76
|
-
React.createElement(ThemeProvider, { value: theme },
|
|
77
|
-
React.createElement(BaseNavigationContainer, { ...rest, initialState: rest.initialState == null ? initialState : rest.initialState, ref: refContainer }))));
|
|
103
|
+
return (React.createElement(native_1.LinkingContext.Provider, { value: linkingContext },
|
|
104
|
+
React.createElement(native_1.ThemeProvider, { value: theme },
|
|
105
|
+
React.createElement(core_1.BaseNavigationContainer, { ...rest, initialState: rest.initialState == null ? initialState : rest.initialState, ref: refContainer }))));
|
|
78
106
|
}
|
|
79
107
|
const NavigationContainer = React.forwardRef(NavigationContainerInner);
|
|
80
|
-
|
|
108
|
+
exports.default = NavigationContainer;
|
|
81
109
|
//# sourceMappingURL=NavigationContainer.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavigationContainer.native.js","sourceRoot":"","sources":["../../src/fork/NavigationContainer.native.tsx"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,6GAA6G;AAC7G,
|
|
1
|
+
{"version":3,"file":"NavigationContainer.native.js","sourceRoot":"","sources":["../../src/fork/NavigationContainer.native.tsx"],"names":[],"mappings":"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","sourcesContent":["// Forked from React Navigation in order to use a custom `useLinking` -> `extractPathFromURL` function.\n// https://github.com/react-navigation/react-navigation/blob/main/packages/native/src/NavigationContainer.tsx\nimport {\n BaseNavigationContainer,\n getActionFromState,\n getPathFromState,\n getStateFromPath,\n NavigationContainerProps,\n NavigationContainerRef,\n ParamListBase,\n validatePathConfig,\n} from '@react-navigation/core';\nimport {\n DefaultTheme,\n DocumentTitleOptions,\n LinkingContext,\n LinkingOptions,\n Theme,\n ThemeProvider,\n} from '@react-navigation/native';\nimport useBackButton from '@react-navigation/native/src/useBackButton';\nimport useDocumentTitle from '@react-navigation/native/src/useDocumentTitle';\nimport useThenable from '@react-navigation/native/src/useThenable';\nimport * as React from 'react';\n\nimport useLinking from './useLinking';\n\nglobal.REACT_NAVIGATION_DEVTOOLS = new WeakMap();\n\ntype Props<ParamList extends object> = NavigationContainerProps & {\n theme?: Theme;\n linking?: LinkingOptions<ParamList>;\n fallback?: React.ReactNode;\n documentTitle?: DocumentTitleOptions;\n onReady?: () => void;\n};\n\n/**\n * Container component which holds the navigation state designed for React Native apps.\n * This should be rendered at the root wrapping the whole app.\n *\n * @param props.initialState Initial state object for the navigation tree. When deep link handling is enabled, this will override deep links when specified. Make sure that you don't specify an `initialState` when there's a deep link (`Linking.getInitialURL()`).\n * @param props.onReady Callback which is called after the navigation tree mounts.\n * @param props.onStateChange Callback which is called with the latest navigation state when it changes.\n * @param props.theme Theme object for the navigators.\n * @param props.linking Options for deep linking. Deep link handling is enabled when this prop is provided, unless `linking.enabled` is `false`.\n * @param props.fallback Fallback component to render until we have finished getting initial state when linking is enabled. Defaults to `null`.\n * @param props.documentTitle Options to configure the document title on Web. Updating document title is handled by default unless `documentTitle.enabled` is `false`.\n * @param props.children Child elements to render the content.\n * @param props.ref Ref object which refers to the navigation object containing helper methods.\n */\nfunction NavigationContainerInner(\n {\n theme = DefaultTheme,\n linking,\n fallback = null,\n documentTitle,\n onReady,\n ...rest\n }: Props<ParamListBase>,\n ref?: React.Ref<NavigationContainerRef<ParamListBase> | null>\n) {\n const isLinkingEnabled = linking ? linking.enabled !== false : false;\n\n if (linking?.config) {\n validatePathConfig(linking.config);\n }\n\n const refContainer = React.useRef<NavigationContainerRef<ParamListBase>>(null);\n\n useBackButton(refContainer);\n useDocumentTitle(refContainer, documentTitle);\n\n const { getInitialState } = useLinking(refContainer, {\n // independent: rest.independent,\n enabled: isLinkingEnabled,\n prefixes: [],\n ...linking,\n });\n\n // Add additional linking related info to the ref\n // This will be used by the devtools\n React.useEffect(() => {\n if (refContainer.current) {\n REACT_NAVIGATION_DEVTOOLS.set(refContainer.current, {\n get linking() {\n return {\n ...linking,\n enabled: isLinkingEnabled,\n prefixes: linking?.prefixes ?? [],\n getStateFromPath: linking?.getStateFromPath ?? getStateFromPath,\n getPathFromState: linking?.getPathFromState ?? getPathFromState,\n getActionFromState: linking?.getActionFromState ?? getActionFromState,\n };\n },\n });\n }\n });\n\n const [isResolved, initialState] = useThenable(getInitialState);\n\n React.useImperativeHandle(ref, () => refContainer.current);\n\n const linkingContext = React.useMemo(() => ({ options: linking }), [linking]);\n\n const isReady = rest.initialState != null || !isLinkingEnabled || isResolved;\n\n const onReadyRef = React.useRef(onReady);\n\n React.useEffect(() => {\n onReadyRef.current = onReady;\n });\n\n React.useEffect(() => {\n if (isReady) {\n onReadyRef.current?.();\n }\n }, [isReady]);\n\n if (!isReady) {\n // This is temporary until we have Suspense for data-fetching\n // Then the fallback will be handled by a parent `Suspense` component\n return fallback as React.ReactElement;\n }\n\n return (\n <LinkingContext.Provider value={linkingContext}>\n <ThemeProvider value={theme}>\n <BaseNavigationContainer\n {...rest}\n initialState={rest.initialState == null ? initialState : rest.initialState}\n ref={refContainer}\n />\n </ThemeProvider>\n </LinkingContext.Provider>\n );\n}\n\nconst NavigationContainer = React.forwardRef(NavigationContainerInner) as <\n RootParamList extends object = ReactNavigation.RootParamList,\n>(\n props: Props<RootParamList> & {\n ref?: React.Ref<NavigationContainerRef<RootParamList>>;\n }\n) => React.ReactElement;\n\nexport default NavigationContainer;\n"]}
|
|
@@ -1,17 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.adjustPathname = exports.extractExpoPathFromURL = void 0;
|
|
30
|
+
const expo_constants_1 = __importStar(require("expo-constants"));
|
|
31
|
+
const Linking = __importStar(require("expo-linking"));
|
|
32
|
+
const url_parse_1 = __importDefault(require("url-parse"));
|
|
4
33
|
// This is only run on native.
|
|
5
34
|
function extractExactPathFromURL(url) {
|
|
6
35
|
if (
|
|
7
36
|
// If a universal link / app link / web URL is used, we should use the path
|
|
8
37
|
// from the URL, while stripping the origin.
|
|
9
38
|
url.match(/^https?:\/\//)) {
|
|
10
|
-
const { origin, href } = new
|
|
39
|
+
const { origin, href } = new url_parse_1.default(url);
|
|
11
40
|
return href.replace(origin, '');
|
|
12
41
|
}
|
|
13
42
|
// Handle special URLs used in Expo Go: `/--/pathname` -> `pathname`
|
|
14
|
-
if (
|
|
43
|
+
if (expo_constants_1.default.executionEnvironment === expo_constants_1.ExecutionEnvironment.StoreClient &&
|
|
15
44
|
// while not exhaustive, `exp` and `exps` are the only two schemes which
|
|
16
45
|
// are passed through to other apps in Expo Go.
|
|
17
46
|
url.match(/^exp(s)?:\/\//)) {
|
|
@@ -37,7 +66,7 @@ function isExpoDevelopmentClient(url) {
|
|
|
37
66
|
function fromDeepLink(url) {
|
|
38
67
|
// This is for all standard deep links, e.g. `foobar://` where everything
|
|
39
68
|
// after the `://` is the path.
|
|
40
|
-
const res = new
|
|
69
|
+
const res = new url_parse_1.default(url, true);
|
|
41
70
|
if (isExpoDevelopmentClient(res)) {
|
|
42
71
|
if (!res.query || !res.query.url) {
|
|
43
72
|
return '';
|
|
@@ -62,15 +91,17 @@ function fromDeepLink(url) {
|
|
|
62
91
|
}
|
|
63
92
|
return results;
|
|
64
93
|
}
|
|
65
|
-
|
|
94
|
+
function extractExpoPathFromURL(url = '') {
|
|
66
95
|
// TODO: We should get rid of this, dropping specificities is not good
|
|
67
96
|
return extractExactPathFromURL(url).replace(/^\//, '');
|
|
68
97
|
}
|
|
69
|
-
|
|
98
|
+
exports.extractExpoPathFromURL = extractExpoPathFromURL;
|
|
99
|
+
function adjustPathname(url) {
|
|
70
100
|
if (url.hostname === 'exp.host' || url.hostname === 'u.expo.dev') {
|
|
71
101
|
// drop the first two segments from pathname:
|
|
72
102
|
return url.pathname.split('/').slice(2).join('/');
|
|
73
103
|
}
|
|
74
104
|
return url.pathname;
|
|
75
105
|
}
|
|
106
|
+
exports.adjustPathname = adjustPathname;
|
|
76
107
|
//# sourceMappingURL=extractPathFromURL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractPathFromURL.js","sourceRoot":"","sources":["../../src/fork/extractPathFromURL.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"extractPathFromURL.js","sourceRoot":"","sources":["../../src/fork/extractPathFromURL.ts"],"names":[],"mappings":"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","sourcesContent":["import Constants, { ExecutionEnvironment } from 'expo-constants';\nimport * as Linking from 'expo-linking';\nimport URL from 'url-parse';\n\n// This is only run on native.\nfunction extractExactPathFromURL(url: string): string {\n if (\n // If a universal link / app link / web URL is used, we should use the path\n // from the URL, while stripping the origin.\n url.match(/^https?:\\/\\//)\n ) {\n const { origin, href } = new URL(url);\n return href.replace(origin, '');\n }\n\n // Handle special URLs used in Expo Go: `/--/pathname` -> `pathname`\n if (\n Constants.executionEnvironment === ExecutionEnvironment.StoreClient &&\n // while not exhaustive, `exp` and `exps` are the only two schemes which\n // are passed through to other apps in Expo Go.\n url.match(/^exp(s)?:\\/\\//)\n ) {\n const pathname = url.match(/exps?:\\/\\/.*?\\/--\\/(.*)/)?.[1];\n if (pathname) {\n return fromDeepLink('a://' + pathname);\n }\n\n const res = Linking.parse(url);\n\n const qs = !res.queryParams\n ? ''\n : Object.entries(res.queryParams)\n .map(([k, v]) => `${k}=${v}`)\n .join('&');\n return (\n adjustPathname({ hostname: res.hostname, pathname: res.path || '' }) + (qs ? '?' + qs : '')\n );\n }\n\n // TODO: Support dev client URLs\n\n return fromDeepLink(url);\n}\n\n/** Major hack to support the makeshift expo-development-client system. */\nfunction isExpoDevelopmentClient(url: URL<Record<string, string | undefined>>): boolean {\n return !!url.hostname.match(/^expo-development-client$/);\n}\n\nfunction fromDeepLink(url: string): string {\n // This is for all standard deep links, e.g. `foobar://` where everything\n // after the `://` is the path.\n const res = new URL(url, true);\n\n if (isExpoDevelopmentClient(res)) {\n if (!res.query || !res.query.url) {\n return '';\n }\n const incomingUrl = res.query.url;\n return extractExactPathFromURL(decodeURI(incomingUrl));\n }\n\n const qs = !res.query\n ? ''\n : Object.entries(res.query as Record<string, string>)\n .map(([k, v]) => `${k}=${decodeURIComponent(v)}`)\n .join('&');\n\n let results = '';\n\n if (res.host) {\n results += res.host;\n }\n\n if (res.pathname) {\n results += res.pathname;\n }\n\n if (qs) {\n results += '?' + qs;\n }\n\n return results;\n}\n\nexport function extractExpoPathFromURL(url: string = '') {\n // TODO: We should get rid of this, dropping specificities is not good\n return extractExactPathFromURL(url).replace(/^\\//, '');\n}\n\nexport function adjustPathname(url: { hostname?: string | null; pathname: string }) {\n if (url.hostname === 'exp.host' || url.hostname === 'u.expo.dev') {\n // drop the first two segments from pathname:\n return url.pathname.split('/').slice(2).join('/');\n }\n return url.pathname;\n}\n"]}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
// Forked so we can access without importing any React Native code in Node.js environments.
|
|
2
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.findFocusedRoute = void 0;
|
|
5
|
+
function findFocusedRoute(state) {
|
|
3
6
|
let current = state;
|
|
4
7
|
while (current?.routes[current.index ?? 0].state != null) {
|
|
5
8
|
current = current.routes[current.index ?? 0].state;
|
|
@@ -7,4 +10,5 @@ export function findFocusedRoute(state) {
|
|
|
7
10
|
const route = current?.routes[current?.index ?? 0];
|
|
8
11
|
return route;
|
|
9
12
|
}
|
|
13
|
+
exports.findFocusedRoute = findFocusedRoute;
|
|
10
14
|
//# sourceMappingURL=findFocusedRoute.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findFocusedRoute.js","sourceRoot":"","sources":["../../src/fork/findFocusedRoute.tsx"],"names":[],"mappings":"AAAA,2FAA2F
|
|
1
|
+
{"version":3,"file":"findFocusedRoute.js","sourceRoot":"","sources":["../../src/fork/findFocusedRoute.tsx"],"names":[],"mappings":";AAAA,2FAA2F;;;AAI3F,SAAgB,gBAAgB,CAAC,KAAmB;IAClD,IAAI,OAAO,GAA6B,KAAK,CAAC;IAE9C,OAAO,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE;QACxD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;KACpD;IAED,MAAM,KAAK,GAAG,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;IAEnD,OAAO,KAAK,CAAC;AACf,CAAC;AAVD,4CAUC","sourcesContent":["// Forked so we can access without importing any React Native code in Node.js environments.\n\nimport type { InitialState } from '@react-navigation/routers';\n\nexport function findFocusedRoute(state: InitialState) {\n let current: InitialState | undefined = state;\n\n while (current?.routes[current.index ?? 0].state != null) {\n current = current.routes[current.index ?? 0].state;\n }\n\n const route = current?.routes[current?.index ?? 0];\n\n return route;\n}\n"]}
|
|
@@ -46,5 +46,6 @@ export declare function getPathDataFromState<ParamList extends object>(state: St
|
|
|
46
46
|
params: Record<string, any>;
|
|
47
47
|
};
|
|
48
48
|
export declare function deepEqual(a: any, b: any): boolean;
|
|
49
|
+
export declare function appendBasePath(path: string, assetPrefix?: string | undefined): string;
|
|
49
50
|
export {};
|
|
50
51
|
//# sourceMappingURL=getPathFromState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPathFromState.d.ts","sourceRoot":"","sources":["../../src/fork/getPathFromState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,aAAa,EAAsB,MAAM,wBAAwB,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAS,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"getPathFromState.d.ts","sourceRoot":"","sources":["../../src/fork/getPathFromState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,aAAa,EAAsB,MAAM,wBAAwB,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAS,MAAM,2BAA2B,CAAC;AAMtF,KAAK,OAAO,CAAC,SAAS,SAAS,MAAM,IAAI;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC;AAkEnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,SAAS,SAAS,MAAM,EAC/D,KAAK,EAAE,KAAK,EACZ,QAAQ,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,GACA,MAAM,CAER;AAED,wBAAgB,oBAAoB,CAAC,SAAS,SAAS,MAAM,EAC3D,KAAK,EAAE,KAAK,EACZ,QAAQ,GAAE,OAAO,CAAC,SAAS,CAAC,GAAG;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACF;;;EAqBjC;AAmBD,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,WAqCvC;AAiaD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,MAAM,GAAG,SAAuD,UAQ9E"}
|
|
@@ -1,6 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.appendBasePath = exports.deepEqual = exports.getPathDataFromState = void 0;
|
|
30
|
+
const core_1 = require("@react-navigation/core");
|
|
31
|
+
const expo_constants_1 = __importDefault(require("expo-constants"));
|
|
32
|
+
const queryString = __importStar(require("query-string"));
|
|
33
|
+
const matchers_1 = require("../matchers");
|
|
4
34
|
const DEFAULT_SCREENS = {};
|
|
5
35
|
const getActiveRoute = (state) => {
|
|
6
36
|
const route = typeof state.index === 'number'
|
|
@@ -33,9 +63,9 @@ function createFakeState(params) {
|
|
|
33
63
|
}
|
|
34
64
|
function segmentMatchesConvention(segment) {
|
|
35
65
|
return (segment === 'index' ||
|
|
36
|
-
matchDynamicName(segment) != null ||
|
|
37
|
-
matchGroupName(segment) != null ||
|
|
38
|
-
matchDeepDynamicRouteName(segment) != null);
|
|
66
|
+
(0, matchers_1.matchDynamicName)(segment) != null ||
|
|
67
|
+
(0, matchers_1.matchGroupName)(segment) != null ||
|
|
68
|
+
(0, matchers_1.matchDeepDynamicRouteName)(segment) != null);
|
|
39
69
|
}
|
|
40
70
|
function encodeURIComponentPreservingBrackets(str) {
|
|
41
71
|
return encodeURIComponent(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
|
|
@@ -69,15 +99,16 @@ function encodeURIComponentPreservingBrackets(str) {
|
|
|
69
99
|
* @param options Extra options to fine-tune how to serialize the path.
|
|
70
100
|
* @returns Path representing the state, e.g. /foo/bar?count=42.
|
|
71
101
|
*/
|
|
72
|
-
|
|
102
|
+
function getPathFromState(state, _options) {
|
|
73
103
|
return getPathDataFromState(state, _options).path;
|
|
74
104
|
}
|
|
75
|
-
|
|
105
|
+
exports.default = getPathFromState;
|
|
106
|
+
function getPathDataFromState(state, _options = { screens: DEFAULT_SCREENS }) {
|
|
76
107
|
if (state == null) {
|
|
77
108
|
throw Error("Got 'undefined' for the navigation state. You must pass a valid state object.");
|
|
78
109
|
}
|
|
79
110
|
const { preserveGroups, preserveDynamicRoutes, ...options } = _options;
|
|
80
|
-
validatePathConfig(options);
|
|
111
|
+
(0, core_1.validatePathConfig)(options);
|
|
81
112
|
// Expo Router disallows usage without a linking config.
|
|
82
113
|
if (Object.is(options.screens, DEFAULT_SCREENS)) {
|
|
83
114
|
throw Error("You must pass a 'screens' object to 'getPathFromState' to generate a path.");
|
|
@@ -86,6 +117,7 @@ export function getPathDataFromState(state, _options = { screens: DEFAULT_SCREEN
|
|
|
86
117
|
// Create a normalized configs object which will be easier to use
|
|
87
118
|
createNormalizedConfigs(options.screens), { preserveGroups, preserveDynamicRoutes });
|
|
88
119
|
}
|
|
120
|
+
exports.getPathDataFromState = getPathDataFromState;
|
|
89
121
|
function processParamsWithUserSettings(configItem, params) {
|
|
90
122
|
const stringify = configItem?.stringify;
|
|
91
123
|
return Object.fromEntries(Object.entries(params).map(([key, value]) => [
|
|
@@ -99,7 +131,7 @@ function processParamsWithUserSettings(configItem, params) {
|
|
|
99
131
|
: String(value),
|
|
100
132
|
]));
|
|
101
133
|
}
|
|
102
|
-
|
|
134
|
+
function deepEqual(a, b) {
|
|
103
135
|
if (a === b) {
|
|
104
136
|
return true;
|
|
105
137
|
}
|
|
@@ -129,6 +161,7 @@ export function deepEqual(a, b) {
|
|
|
129
161
|
}
|
|
130
162
|
return false;
|
|
131
163
|
}
|
|
164
|
+
exports.deepEqual = deepEqual;
|
|
132
165
|
function walkConfigItems(route, focusedRoute, configs, { preserveDynamicRoutes, }) {
|
|
133
166
|
// NOTE(EvanBacon): Fill in current route using state that was passed as params.
|
|
134
167
|
if (!route.state && isInvalidParams(route.params)) {
|
|
@@ -281,7 +314,7 @@ function getPathFromResolvedState(state, configs, { preserveGroups, preserveDyna
|
|
|
281
314
|
break;
|
|
282
315
|
}
|
|
283
316
|
}
|
|
284
|
-
return { path: basicSanitizePath(path), params: decodeParams(allParams) };
|
|
317
|
+
return { path: appendBasePath(basicSanitizePath(path)), params: decodeParams(allParams) };
|
|
285
318
|
}
|
|
286
319
|
function decodeParams(params) {
|
|
287
320
|
const parsed = {};
|
|
@@ -303,7 +336,10 @@ function getPathWithConventionsCollapsed({ pattern, routePath, params, preserveG
|
|
|
303
336
|
return `[...${name}]`;
|
|
304
337
|
}
|
|
305
338
|
if (params[name]) {
|
|
306
|
-
|
|
339
|
+
if (Array.isArray(params[name])) {
|
|
340
|
+
return params[name].join('/');
|
|
341
|
+
}
|
|
342
|
+
return params[name];
|
|
307
343
|
}
|
|
308
344
|
if (i === 0) {
|
|
309
345
|
// This can occur when a wildcard matches all routes and the given path was `/`.
|
|
@@ -325,7 +361,7 @@ function getPathWithConventionsCollapsed({ pattern, routePath, params, preserveG
|
|
|
325
361
|
// Optional params without value assigned in route.params should be ignored
|
|
326
362
|
return params[name];
|
|
327
363
|
}
|
|
328
|
-
if (!preserveGroups && matchGroupName(p) != null) {
|
|
364
|
+
if (!preserveGroups && (0, matchers_1.matchGroupName)(p) != null) {
|
|
329
365
|
// When the last part is a group it could be a shared URL
|
|
330
366
|
// if the route has an initialRouteName defined, then we should
|
|
331
367
|
// use that as the component path as we can assume it will be shown.
|
|
@@ -361,7 +397,7 @@ function getParamsWithConventionsCollapsed({ pattern, routeName, params, }) {
|
|
|
361
397
|
// Deep Dynamic Routes
|
|
362
398
|
if (segments.some((segment) => segment.startsWith('*'))) {
|
|
363
399
|
// NOTE(EvanBacon): Drop the param name matching the wildcard route name -- this is specific to Expo Router.
|
|
364
|
-
const name = matchDeepDynamicRouteName(routeName) ?? routeName;
|
|
400
|
+
const name = (0, matchers_1.matchDeepDynamicRouteName)(routeName) ?? routeName;
|
|
365
401
|
delete processedParams[name];
|
|
366
402
|
}
|
|
367
403
|
return processedParams;
|
|
@@ -417,4 +453,13 @@ const createConfigItem = (config, parentPattern) => {
|
|
|
417
453
|
};
|
|
418
454
|
};
|
|
419
455
|
const createNormalizedConfigs = (options, pattern) => Object.fromEntries(Object.entries(options).map(([name, c]) => [name, createConfigItem(c, pattern)]));
|
|
456
|
+
function appendBasePath(path, assetPrefix = expo_constants_1.default.expoConfig?.experiments?.basePath) {
|
|
457
|
+
if (process.env.NODE_ENV !== 'development') {
|
|
458
|
+
if (assetPrefix) {
|
|
459
|
+
return `/${assetPrefix.replace(/^\/+/, '').replace(/\/$/, '')}${path}`;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
return path;
|
|
463
|
+
}
|
|
464
|
+
exports.appendBasePath = appendBasePath;
|
|
420
465
|
//# sourceMappingURL=getPathFromState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPathFromState.js","sourceRoot":"","sources":["../../src/fork/getPathFromState.ts"],"names":[],"mappings":"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","sourcesContent":["import { PathConfig, PathConfigMap, validatePathConfig } from '@react-navigation/core';\nimport type { NavigationState, PartialState, Route } from '@react-navigation/routers';\nimport * as queryString from 'query-string';\n\nimport { matchDeepDynamicRouteName, matchDynamicName, matchGroupName } from '../matchers';\n\ntype Options<ParamList extends object> = {\n initialRouteName?: string;\n screens: PathConfigMap<ParamList>;\n};\n\nexport type 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 // Used as fallback for groups\n initialRouteName?: string;\n};\n\ntype CustomRoute = Route<string> & {\n state?: State;\n};\n\nconst DEFAULT_SCREENS: PathConfigMap<object> = {};\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 if (route && isInvalidParams(route.params)) {\n return getActiveRoute(createFakeState(route.params));\n }\n\n return route;\n};\n\nfunction createFakeState(params: StateAsParams) {\n return {\n stale: false,\n type: 'UNKNOWN',\n key: 'UNKNOWN',\n index: 0,\n routeNames: [],\n routes: [\n {\n key: 'UNKNOWN',\n name: params.screen,\n params: params.params,\n path: params.path,\n },\n ],\n };\n}\n\nfunction segmentMatchesConvention(segment: string): boolean {\n return (\n segment === 'index' ||\n matchDynamicName(segment) != null ||\n matchGroupName(segment) != null ||\n matchDeepDynamicRouteName(segment) != null\n );\n}\n\nfunction encodeURIComponentPreservingBrackets(str: string) {\n return encodeURIComponent(str).replace(/%5B/g, '[').replace(/%5D/g, ']');\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 object>(\n state: State,\n _options?: Options<ParamList> & {\n preserveGroups?: boolean;\n preserveDynamicRoutes?: boolean;\n }\n): string {\n return getPathDataFromState(state, _options).path;\n}\n\nexport function getPathDataFromState<ParamList extends object>(\n state: State,\n _options: Options<ParamList> & {\n preserveGroups?: boolean;\n preserveDynamicRoutes?: boolean;\n } = { screens: DEFAULT_SCREENS }\n) {\n if (state == null) {\n throw Error(\"Got 'undefined' for the navigation state. You must pass a valid state object.\");\n }\n\n const { preserveGroups, preserveDynamicRoutes, ...options } = _options;\n\n validatePathConfig(options);\n\n // Expo Router disallows usage without a linking config.\n if (Object.is(options.screens, DEFAULT_SCREENS)) {\n throw Error(\"You must pass a 'screens' object to 'getPathFromState' to generate a path.\");\n }\n\n return getPathFromResolvedState(\n JSON.parse(JSON.stringify(state)),\n // Create a normalized configs object which will be easier to use\n createNormalizedConfigs(options.screens),\n { preserveGroups, preserveDynamicRoutes }\n );\n}\n\nfunction processParamsWithUserSettings(configItem: ConfigItem, params: Record<string, any>) {\n const stringify = configItem?.stringify;\n\n return Object.fromEntries(\n Object.entries(params).map(([key, value]) => [\n key,\n // TODO: Strip nullish values here.\n stringify?.[key]\n ? stringify[key](value)\n : // Preserve rest params\n Array.isArray(value)\n ? value\n : String(value),\n ])\n );\n}\n\nexport function deepEqual(a: any, b: any) {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n for (const key of keysA) {\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction walkConfigItems(\n route: CustomRoute,\n focusedRoute: {\n name: string;\n params?: object;\n },\n configs: Record<string, ConfigItem>,\n {\n preserveDynamicRoutes,\n }: {\n preserveDynamicRoutes?: boolean;\n }\n) {\n // NOTE(EvanBacon): Fill in current route using state that was passed as params.\n if (!route.state && isInvalidParams(route.params)) {\n route.state = createFakeState(route.params);\n }\n\n let pattern: string | null = null;\n let focusedParams: Record<string, any> | undefined;\n\n const collectedParams: Record<string, any> = {};\n\n while (route.name in configs) {\n const configItem = configs[route.name];\n const inputPattern = configItem.pattern;\n\n if (inputPattern == null) {\n // This should never happen in Expo Router.\n throw new Error('Unexpected: No pattern found for route ' + route.name);\n }\n pattern = inputPattern;\n\n if (route.params) {\n const params = processParamsWithUserSettings(configItem, route.params);\n // TODO: Does this need to be a null check?\n if (pattern) {\n Object.assign(collectedParams, params);\n }\n if (deepEqual(focusedRoute, route)) {\n if (preserveDynamicRoutes) {\n focusedParams = params;\n } else {\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 = getParamsWithConventionsCollapsed({\n params,\n pattern,\n routeName: route.name,\n });\n }\n }\n }\n\n if (!route.state && isInvalidParams(route.params)) {\n route.state = createFakeState(route.params);\n }\n\n // If there is no `screens` property or no nested state, we return pattern\n if (!configItem.screens || route.state === undefined) {\n if (\n configItem.initialRouteName &&\n configItem.screens &&\n configItem.initialRouteName in configItem.screens &&\n configItem.screens[configItem.initialRouteName]?.pattern\n ) {\n const initialRouteConfig = configItem.screens[configItem.initialRouteName];\n\n // NOTE(EvanBacon): Big hack to support initial route changes in tab bars.\n pattern = initialRouteConfig.pattern!;\n if (focusedParams) {\n if (!preserveDynamicRoutes) {\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 = getParamsWithConventionsCollapsed({\n params: focusedParams,\n pattern,\n routeName: route.name,\n });\n }\n }\n }\n break;\n }\n\n const index = route.state.index ?? route.state.routes.length - 1;\n\n const nextRoute = route.state.routes[index];\n const nestedScreens = configItem.screens;\n\n // if there is config for next route name, we go deeper\n if (nestedScreens && nextRoute.name in nestedScreens) {\n route = nextRoute as CustomRoute;\n configs = nestedScreens;\n } else {\n // If not, there is no sense in going deeper in config\n break;\n }\n }\n\n if (pattern == null) {\n throw new Error(\n `No pattern found for route \"${route.name}\". Options are: ${Object.keys(configs).join(', ')}.`\n );\n }\n\n if (pattern && !focusedParams && focusedRoute.params) {\n if (preserveDynamicRoutes) {\n focusedParams = focusedRoute.params;\n } else {\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 = getParamsWithConventionsCollapsed({\n params: focusedRoute.params,\n pattern,\n routeName: route.name,\n });\n }\n Object.assign(focusedParams, collectedParams);\n }\n\n return {\n pattern,\n nextRoute: route,\n focusedParams,\n params: collectedParams,\n };\n}\n\nfunction getPathFromResolvedState(\n state: State,\n configs: Record<string, ConfigItem>,\n {\n preserveGroups,\n preserveDynamicRoutes,\n }: { preserveGroups?: boolean; preserveDynamicRoutes?: boolean }\n) {\n let path = '';\n let current: State = state;\n\n const allParams: Record<string, any> = {};\n\n while (current) {\n path += '/';\n\n // Make mutable copies to ensure we don't leak state outside of the function.\n const route = current.routes[current.index ?? 0] as CustomRoute;\n\n // NOTE(EvanBacon): Fill in current route using state that was passed as params.\n // if (isInvalidParams(route.params)) {\n if (!route.state && isInvalidParams(route.params)) {\n route.state = createFakeState(route.params);\n }\n\n const { pattern, params, nextRoute, focusedParams } = walkConfigItems(\n route,\n getActiveRoute(current),\n { ...configs },\n { preserveDynamicRoutes }\n );\n\n Object.assign(allParams, params);\n\n path += getPathWithConventionsCollapsed({\n pattern,\n routePath: nextRoute.path,\n params: allParams,\n initialRouteName: configs[nextRoute.name]?.initialRouteName,\n preserveGroups,\n preserveDynamicRoutes,\n });\n\n if (\n nextRoute.state &&\n // NOTE(EvanBacon): The upstream implementation allows for sending in synthetic states (states that weren't generated by `getStateFromPath`)\n // and any invalid routes will simply be ignored.\n // Because of this, we need to check if the next route is valid before continuing, otherwise our more strict\n // implementation will throw an error.\n configs[nextRoute.state.routes?.[nextRoute.state?.index ?? 0]?.name]\n ) {\n // Continue looping with the next state if available.\n current = nextRoute.state;\n } else {\n // Finished crawling state.\n\n // Check for query params before exiting.\n if (focusedParams) {\n for (const param in focusedParams) {\n // TODO: This is not good. We shouldn't squat strings named \"undefined\".\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 if (query) {\n path += `?${query}`;\n }\n }\n break;\n }\n }\n\n return { path: basicSanitizePath(path), params: decodeParams(allParams) };\n}\n\nfunction decodeParams(params: Record<string, string>) {\n const parsed: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(params)) {\n parsed[key] = decodeURIComponent(value);\n }\n\n return parsed;\n}\n\nfunction getPathWithConventionsCollapsed({\n pattern,\n routePath,\n params,\n preserveGroups,\n preserveDynamicRoutes,\n initialRouteName,\n}: {\n pattern: string;\n routePath?: string;\n params: Record<string, any>;\n preserveGroups?: boolean;\n preserveDynamicRoutes?: boolean;\n initialRouteName?: string;\n}) {\n const segments = pattern.split('/');\n return segments\n .map((p, i) => {\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.startsWith('*')) {\n if (preserveDynamicRoutes) {\n return `[...${name}]`;\n }\n if (params[name]) {\n return params[name].join('/');\n }\n if (i === 0) {\n // This can occur when a wildcard matches all routes and the given path was `/`.\n return routePath;\n }\n // remove existing segments from route.path and return it\n // this is used for nested wildcard routes. Without this, the path would add\n // all nested segments to the beginning of the wildcard route.\n return routePath\n ?.split('/')\n .slice(i + 1)\n .join('/');\n }\n\n // If the path has a pattern for a param, put the param in the path\n if (p.startsWith(':')) {\n if (preserveDynamicRoutes) {\n return `[${name}]`;\n }\n // Optional params without value assigned in route.params should be ignored\n return params[name];\n }\n\n if (!preserveGroups && matchGroupName(p) != null) {\n // When the last part is a group it could be a shared URL\n // if the route has an initialRouteName defined, then we should\n // use that as the component path as we can assume it will be shown.\n if (segments.length - 1 === i) {\n if (initialRouteName) {\n // Return an empty string if the init route is ambiguous.\n if (segmentMatchesConvention(initialRouteName)) {\n return '';\n }\n return encodeURIComponentPreservingBrackets(initialRouteName);\n }\n }\n return '';\n }\n // Preserve dynamic syntax for rehydration\n return encodeURIComponentPreservingBrackets(p);\n })\n .map((v) => v ?? '')\n .join('/');\n}\n\n/** Given a set of query params and a pattern with possible conventions, collapse the conventions and return the remaining params. */\nfunction getParamsWithConventionsCollapsed({\n pattern,\n routeName,\n params,\n}: {\n pattern: string;\n /** Route name is required for matching the wildcard route. This is specific to Expo Router. */\n routeName: string;\n params: object;\n}): Record<string, string> {\n const processedParams: Record<string, string> = { ...params };\n\n // Remove the params present in the pattern since we'll only use the rest for query string\n\n const segments = pattern.split('/');\n\n // Dynamic Routes\n segments\n .filter((segment) => segment.startsWith(':'))\n .forEach((segment) => {\n const name = getParamName(segment);\n delete processedParams[name];\n });\n\n // Deep Dynamic Routes\n if (segments.some((segment) => segment.startsWith('*'))) {\n // NOTE(EvanBacon): Drop the param name matching the wildcard route name -- this is specific to Expo Router.\n const name = matchDeepDynamicRouteName(routeName) ?? routeName;\n delete processedParams[name];\n }\n\n return processedParams;\n}\n\n// Remove multiple as well as trailing slashes\nfunction basicSanitizePath(path: string) {\n // Remove duplicate slashes like `foo//bar` -> `foo/bar`\n const simplifiedPath = path.replace(/\\/+/g, '/');\n if (simplifiedPath.length <= 1) {\n return simplifiedPath;\n }\n // Remove trailing slash like `foo/bar/` -> `foo/bar`\n return simplifiedPath.replace(/\\/$/, '');\n}\n\ntype StateAsParams = {\n initial: boolean;\n path?: string;\n screen: string;\n params: Record<string, any>;\n};\n\n// TODO: Make StackRouter not do this...\n// Detect if the params came from StackRouter using `params` to pass around internal state.\nfunction isInvalidParams(params?: Record<string, any>): params is StateAsParams {\n if (!params) {\n return false;\n }\n\n if ('params' in params && typeof params.params === 'object' && !!params.params) {\n return true;\n }\n\n return (\n 'initial' in params &&\n typeof params.initial === 'boolean' &&\n // \"path\" in params &&\n 'screen' in params\n );\n}\n\nconst getParamName = (pattern: string) => 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 (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 // 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 const pattern =\n config.exact !== true ? joinPaths(parentPattern || '', config.path || '') : config.path || '';\n\n const screens = config.screens ? createNormalizedConfigs(config.screens, pattern) : 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 initialRouteName: config.initialRouteName,\n };\n};\n\nconst createNormalizedConfigs = (\n options: PathConfigMap<object>,\n pattern?: string\n): Record<string, ConfigItem> =>\n Object.fromEntries(\n Object.entries(options).map(([name, c]) => [name, createConfigItem(c, pattern)])\n );\n"]}
|
|
1
|
+
{"version":3,"file":"getPathFromState.js","sourceRoot":"","sources":["../../src/fork/getPathFromState.ts"],"names":[],"mappings":"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","sourcesContent":["import { PathConfig, PathConfigMap, validatePathConfig } from '@react-navigation/core';\nimport type { NavigationState, PartialState, Route } from '@react-navigation/routers';\nimport Constants from 'expo-constants';\nimport * as queryString from 'query-string';\n\nimport { matchDeepDynamicRouteName, matchDynamicName, matchGroupName } from '../matchers';\n\ntype Options<ParamList extends object> = {\n initialRouteName?: string;\n screens: PathConfigMap<ParamList>;\n};\n\nexport type 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 // Used as fallback for groups\n initialRouteName?: string;\n};\n\ntype CustomRoute = Route<string> & {\n state?: State;\n};\n\nconst DEFAULT_SCREENS: PathConfigMap<object> = {};\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 if (route && isInvalidParams(route.params)) {\n return getActiveRoute(createFakeState(route.params));\n }\n\n return route;\n};\n\nfunction createFakeState(params: StateAsParams) {\n return {\n stale: false,\n type: 'UNKNOWN',\n key: 'UNKNOWN',\n index: 0,\n routeNames: [],\n routes: [\n {\n key: 'UNKNOWN',\n name: params.screen,\n params: params.params,\n path: params.path,\n },\n ],\n };\n}\n\nfunction segmentMatchesConvention(segment: string): boolean {\n return (\n segment === 'index' ||\n matchDynamicName(segment) != null ||\n matchGroupName(segment) != null ||\n matchDeepDynamicRouteName(segment) != null\n );\n}\n\nfunction encodeURIComponentPreservingBrackets(str: string) {\n return encodeURIComponent(str).replace(/%5B/g, '[').replace(/%5D/g, ']');\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 object>(\n state: State,\n _options?: Options<ParamList> & {\n preserveGroups?: boolean;\n preserveDynamicRoutes?: boolean;\n }\n): string {\n return getPathDataFromState(state, _options).path;\n}\n\nexport function getPathDataFromState<ParamList extends object>(\n state: State,\n _options: Options<ParamList> & {\n preserveGroups?: boolean;\n preserveDynamicRoutes?: boolean;\n } = { screens: DEFAULT_SCREENS }\n) {\n if (state == null) {\n throw Error(\"Got 'undefined' for the navigation state. You must pass a valid state object.\");\n }\n\n const { preserveGroups, preserveDynamicRoutes, ...options } = _options;\n\n validatePathConfig(options);\n\n // Expo Router disallows usage without a linking config.\n if (Object.is(options.screens, DEFAULT_SCREENS)) {\n throw Error(\"You must pass a 'screens' object to 'getPathFromState' to generate a path.\");\n }\n\n return getPathFromResolvedState(\n JSON.parse(JSON.stringify(state)),\n // Create a normalized configs object which will be easier to use\n createNormalizedConfigs(options.screens),\n { preserveGroups, preserveDynamicRoutes }\n );\n}\n\nfunction processParamsWithUserSettings(configItem: ConfigItem, params: Record<string, any>) {\n const stringify = configItem?.stringify;\n\n return Object.fromEntries(\n Object.entries(params).map(([key, value]) => [\n key,\n // TODO: Strip nullish values here.\n stringify?.[key]\n ? stringify[key](value)\n : // Preserve rest params\n Array.isArray(value)\n ? value\n : String(value),\n ])\n );\n}\n\nexport function deepEqual(a: any, b: any) {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n for (const key of keysA) {\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction walkConfigItems(\n route: CustomRoute,\n focusedRoute: {\n name: string;\n params?: object;\n },\n configs: Record<string, ConfigItem>,\n {\n preserveDynamicRoutes,\n }: {\n preserveDynamicRoutes?: boolean;\n }\n) {\n // NOTE(EvanBacon): Fill in current route using state that was passed as params.\n if (!route.state && isInvalidParams(route.params)) {\n route.state = createFakeState(route.params);\n }\n\n let pattern: string | null = null;\n let focusedParams: Record<string, any> | undefined;\n\n const collectedParams: Record<string, any> = {};\n\n while (route.name in configs) {\n const configItem = configs[route.name];\n const inputPattern = configItem.pattern;\n\n if (inputPattern == null) {\n // This should never happen in Expo Router.\n throw new Error('Unexpected: No pattern found for route ' + route.name);\n }\n pattern = inputPattern;\n\n if (route.params) {\n const params = processParamsWithUserSettings(configItem, route.params);\n // TODO: Does this need to be a null check?\n if (pattern) {\n Object.assign(collectedParams, params);\n }\n if (deepEqual(focusedRoute, route)) {\n if (preserveDynamicRoutes) {\n focusedParams = params;\n } else {\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 = getParamsWithConventionsCollapsed({\n params,\n pattern,\n routeName: route.name,\n });\n }\n }\n }\n\n if (!route.state && isInvalidParams(route.params)) {\n route.state = createFakeState(route.params);\n }\n\n // If there is no `screens` property or no nested state, we return pattern\n if (!configItem.screens || route.state === undefined) {\n if (\n configItem.initialRouteName &&\n configItem.screens &&\n configItem.initialRouteName in configItem.screens &&\n configItem.screens[configItem.initialRouteName]?.pattern\n ) {\n const initialRouteConfig = configItem.screens[configItem.initialRouteName];\n\n // NOTE(EvanBacon): Big hack to support initial route changes in tab bars.\n pattern = initialRouteConfig.pattern!;\n if (focusedParams) {\n if (!preserveDynamicRoutes) {\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 = getParamsWithConventionsCollapsed({\n params: focusedParams,\n pattern,\n routeName: route.name,\n });\n }\n }\n }\n break;\n }\n\n const index = route.state.index ?? route.state.routes.length - 1;\n\n const nextRoute = route.state.routes[index];\n const nestedScreens = configItem.screens;\n\n // if there is config for next route name, we go deeper\n if (nestedScreens && nextRoute.name in nestedScreens) {\n route = nextRoute as CustomRoute;\n configs = nestedScreens;\n } else {\n // If not, there is no sense in going deeper in config\n break;\n }\n }\n\n if (pattern == null) {\n throw new Error(\n `No pattern found for route \"${route.name}\". Options are: ${Object.keys(configs).join(', ')}.`\n );\n }\n\n if (pattern && !focusedParams && focusedRoute.params) {\n if (preserveDynamicRoutes) {\n focusedParams = focusedRoute.params;\n } else {\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 = getParamsWithConventionsCollapsed({\n params: focusedRoute.params,\n pattern,\n routeName: route.name,\n });\n }\n Object.assign(focusedParams, collectedParams);\n }\n\n return {\n pattern,\n nextRoute: route,\n focusedParams,\n params: collectedParams,\n };\n}\n\nfunction getPathFromResolvedState(\n state: State,\n configs: Record<string, ConfigItem>,\n {\n preserveGroups,\n preserveDynamicRoutes,\n }: { preserveGroups?: boolean; preserveDynamicRoutes?: boolean }\n) {\n let path = '';\n let current: State = state;\n\n const allParams: Record<string, any> = {};\n\n while (current) {\n path += '/';\n\n // Make mutable copies to ensure we don't leak state outside of the function.\n const route = current.routes[current.index ?? 0] as CustomRoute;\n\n // NOTE(EvanBacon): Fill in current route using state that was passed as params.\n // if (isInvalidParams(route.params)) {\n if (!route.state && isInvalidParams(route.params)) {\n route.state = createFakeState(route.params);\n }\n\n const { pattern, params, nextRoute, focusedParams } = walkConfigItems(\n route,\n getActiveRoute(current),\n { ...configs },\n { preserveDynamicRoutes }\n );\n\n Object.assign(allParams, params);\n\n path += getPathWithConventionsCollapsed({\n pattern,\n routePath: nextRoute.path,\n params: allParams,\n initialRouteName: configs[nextRoute.name]?.initialRouteName,\n preserveGroups,\n preserveDynamicRoutes,\n });\n\n if (\n nextRoute.state &&\n // NOTE(EvanBacon): The upstream implementation allows for sending in synthetic states (states that weren't generated by `getStateFromPath`)\n // and any invalid routes will simply be ignored.\n // Because of this, we need to check if the next route is valid before continuing, otherwise our more strict\n // implementation will throw an error.\n configs[nextRoute.state.routes?.[nextRoute.state?.index ?? 0]?.name]\n ) {\n // Continue looping with the next state if available.\n current = nextRoute.state;\n } else {\n // Finished crawling state.\n\n // Check for query params before exiting.\n if (focusedParams) {\n for (const param in focusedParams) {\n // TODO: This is not good. We shouldn't squat strings named \"undefined\".\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 if (query) {\n path += `?${query}`;\n }\n }\n break;\n }\n }\n\n return { path: appendBasePath(basicSanitizePath(path)), params: decodeParams(allParams) };\n}\n\nfunction decodeParams(params: Record<string, string>) {\n const parsed: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(params)) {\n parsed[key] = decodeURIComponent(value);\n }\n\n return parsed;\n}\n\nfunction getPathWithConventionsCollapsed({\n pattern,\n routePath,\n params,\n preserveGroups,\n preserveDynamicRoutes,\n initialRouteName,\n}: {\n pattern: string;\n routePath?: string;\n params: Record<string, any>;\n preserveGroups?: boolean;\n preserveDynamicRoutes?: boolean;\n initialRouteName?: string;\n}) {\n const segments = pattern.split('/');\n return segments\n .map((p, i) => {\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.startsWith('*')) {\n if (preserveDynamicRoutes) {\n return `[...${name}]`;\n }\n if (params[name]) {\n if (Array.isArray(params[name])) {\n return params[name].join('/');\n }\n return params[name];\n }\n if (i === 0) {\n // This can occur when a wildcard matches all routes and the given path was `/`.\n return routePath;\n }\n // remove existing segments from route.path and return it\n // this is used for nested wildcard routes. Without this, the path would add\n // all nested segments to the beginning of the wildcard route.\n return routePath\n ?.split('/')\n .slice(i + 1)\n .join('/');\n }\n\n // If the path has a pattern for a param, put the param in the path\n if (p.startsWith(':')) {\n if (preserveDynamicRoutes) {\n return `[${name}]`;\n }\n // Optional params without value assigned in route.params should be ignored\n return params[name];\n }\n\n if (!preserveGroups && matchGroupName(p) != null) {\n // When the last part is a group it could be a shared URL\n // if the route has an initialRouteName defined, then we should\n // use that as the component path as we can assume it will be shown.\n if (segments.length - 1 === i) {\n if (initialRouteName) {\n // Return an empty string if the init route is ambiguous.\n if (segmentMatchesConvention(initialRouteName)) {\n return '';\n }\n return encodeURIComponentPreservingBrackets(initialRouteName);\n }\n }\n return '';\n }\n // Preserve dynamic syntax for rehydration\n return encodeURIComponentPreservingBrackets(p);\n })\n .map((v) => v ?? '')\n .join('/');\n}\n\n/** Given a set of query params and a pattern with possible conventions, collapse the conventions and return the remaining params. */\nfunction getParamsWithConventionsCollapsed({\n pattern,\n routeName,\n params,\n}: {\n pattern: string;\n /** Route name is required for matching the wildcard route. This is specific to Expo Router. */\n routeName: string;\n params: object;\n}): Record<string, string> {\n const processedParams: Record<string, string> = { ...params };\n\n // Remove the params present in the pattern since we'll only use the rest for query string\n\n const segments = pattern.split('/');\n\n // Dynamic Routes\n segments\n .filter((segment) => segment.startsWith(':'))\n .forEach((segment) => {\n const name = getParamName(segment);\n delete processedParams[name];\n });\n\n // Deep Dynamic Routes\n if (segments.some((segment) => segment.startsWith('*'))) {\n // NOTE(EvanBacon): Drop the param name matching the wildcard route name -- this is specific to Expo Router.\n const name = matchDeepDynamicRouteName(routeName) ?? routeName;\n delete processedParams[name];\n }\n\n return processedParams;\n}\n\n// Remove multiple as well as trailing slashes\nfunction basicSanitizePath(path: string) {\n // Remove duplicate slashes like `foo//bar` -> `foo/bar`\n const simplifiedPath = path.replace(/\\/+/g, '/');\n if (simplifiedPath.length <= 1) {\n return simplifiedPath;\n }\n // Remove trailing slash like `foo/bar/` -> `foo/bar`\n return simplifiedPath.replace(/\\/$/, '');\n}\n\ntype StateAsParams = {\n initial: boolean;\n path?: string;\n screen: string;\n params: Record<string, any>;\n};\n\n// TODO: Make StackRouter not do this...\n// Detect if the params came from StackRouter using `params` to pass around internal state.\nfunction isInvalidParams(params?: Record<string, any>): params is StateAsParams {\n if (!params) {\n return false;\n }\n\n if ('params' in params && typeof params.params === 'object' && !!params.params) {\n return true;\n }\n\n return (\n 'initial' in params &&\n typeof params.initial === 'boolean' &&\n // \"path\" in params &&\n 'screen' in params\n );\n}\n\nconst getParamName = (pattern: string) => 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 (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 // 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 const pattern =\n config.exact !== true ? joinPaths(parentPattern || '', config.path || '') : config.path || '';\n\n const screens = config.screens ? createNormalizedConfigs(config.screens, pattern) : 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 initialRouteName: config.initialRouteName,\n };\n};\n\nconst createNormalizedConfigs = (\n options: PathConfigMap<object>,\n pattern?: string\n): Record<string, ConfigItem> =>\n Object.fromEntries(\n Object.entries(options).map(([name, c]) => [name, createConfigItem(c, pattern)])\n );\n\nexport function appendBasePath(\n path: string,\n assetPrefix: string | undefined = Constants.expoConfig?.experiments?.basePath\n) {\n if (process.env.NODE_ENV !== 'development') {\n if (assetPrefix) {\n return `/${assetPrefix.replace(/^\\/+/, '').replace(/\\/$/, '')}${path}`;\n }\n }\n return path;\n}\n"]}
|
|
@@ -13,7 +13,7 @@ type InitialRouteConfig = {
|
|
|
13
13
|
export type ResultState = PartialState<NavigationState> & {
|
|
14
14
|
state?: ResultState;
|
|
15
15
|
};
|
|
16
|
-
export declare function getUrlWithReactNavigationConcessions(path: string): {
|
|
16
|
+
export declare function getUrlWithReactNavigationConcessions(path: string, basePath?: string | undefined): {
|
|
17
17
|
nonstandardPathname: string;
|
|
18
18
|
inputPathnameWithoutHash: string;
|
|
19
19
|
};
|
|
@@ -54,5 +54,6 @@ export declare function getMatchableRouteConfigs<ParamList extends object>(optio
|
|
|
54
54
|
}[];
|
|
55
55
|
initialRoutes: InitialRouteConfig[];
|
|
56
56
|
};
|
|
57
|
+
export declare function stripBasePath(path: string, basePath?: string | undefined): string;
|
|
57
58
|
export {};
|
|
58
59
|
//# sourceMappingURL=getStateFromPath.d.ts.map
|