@react-navigation/core 8.0.0-alpha.24 → 8.0.0-alpha.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/module/BaseNavigationContainer.js +5 -2
- package/lib/module/BaseNavigationContainer.js.map +1 -1
- package/lib/module/DataLoading.js +102 -0
- package/lib/module/DataLoading.js.map +1 -0
- package/lib/module/NavigationIndependentTree.js +7 -6
- package/lib/module/NavigationIndependentTree.js.map +1 -1
- package/lib/module/NavigationProvider.js +12 -12
- package/lib/module/NavigationProvider.js.map +1 -1
- package/lib/module/PreventRemoveContext.js.map +1 -1
- package/lib/module/PreventRemoveProvider.js +34 -24
- package/lib/module/PreventRemoveProvider.js.map +1 -1
- package/lib/module/StaticNavigation.js +14 -6
- package/lib/module/StaticNavigation.js.map +1 -1
- package/lib/module/StaticTreeContext.js +5 -0
- package/lib/module/StaticTreeContext.js.map +1 -0
- package/lib/module/checkSerializable.js +7 -9
- package/lib/module/checkSerializable.js.map +1 -1
- package/lib/module/createNavigationContainerRef.js +6 -8
- package/lib/module/createNavigationContainerRef.js.map +1 -1
- package/lib/module/createNavigatorFactory.js.map +1 -1
- package/lib/module/getActionFromState.js +11 -11
- package/lib/module/getActionFromState.js.map +1 -1
- package/lib/module/getPathFromState.js +38 -39
- package/lib/module/getPathFromState.js.map +1 -1
- package/lib/module/getPatternParts.js +2 -2
- package/lib/module/getPatternParts.js.map +1 -1
- package/lib/module/getStateFromPath.js +72 -45
- package/lib/module/getStateFromPath.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/useEventEmitter.js +1 -1
- package/lib/module/useEventEmitter.js.map +1 -1
- package/lib/module/useKeyedChildListeners.js +4 -2
- package/lib/module/useKeyedChildListeners.js.map +1 -1
- package/lib/module/useNavigation.js +2 -15
- package/lib/module/useNavigation.js.map +1 -1
- package/lib/module/useNavigationBuilder.js +4 -14
- package/lib/module/useNavigationBuilder.js.map +1 -1
- package/lib/module/useNavigationCache.js +19 -14
- package/lib/module/useNavigationCache.js.map +1 -1
- package/lib/module/useNavigationHelpers.js +27 -9
- package/lib/module/useNavigationHelpers.js.map +1 -1
- package/lib/module/useNavigationState.js +69 -36
- package/lib/module/useNavigationState.js.map +1 -1
- package/lib/module/useOnAction.js +21 -2
- package/lib/module/useOnAction.js.map +1 -1
- package/lib/module/useOptionsGetters.js +3 -1
- package/lib/module/useOptionsGetters.js.map +1 -1
- package/lib/module/usePreventRemove.js +9 -2
- package/lib/module/usePreventRemove.js.map +1 -1
- package/lib/module/useRouteCache.js +14 -7
- package/lib/module/useRouteCache.js.map +1 -1
- package/lib/module/useScheduleUpdate.js +8 -8
- package/lib/module/useScheduleUpdate.js.map +1 -1
- package/lib/module/useSyncState.js +4 -1
- package/lib/module/useSyncState.js.map +1 -1
- package/lib/module/validatePathConfig.js.map +1 -1
- package/lib/typescript/src/BaseNavigationContainer.d.ts.map +1 -1
- package/lib/typescript/src/DataLoading.d.ts +20 -0
- package/lib/typescript/src/DataLoading.d.ts.map +1 -0
- package/lib/typescript/src/NavigationProvider.d.ts +0 -1
- package/lib/typescript/src/NavigationProvider.d.ts.map +1 -1
- package/lib/typescript/src/PreventRemoveContext.d.ts +1 -0
- package/lib/typescript/src/PreventRemoveContext.d.ts.map +1 -1
- package/lib/typescript/src/PreventRemoveProvider.d.ts.map +1 -1
- package/lib/typescript/src/StaticNavigation.d.ts +65 -39
- package/lib/typescript/src/StaticNavigation.d.ts.map +1 -1
- package/lib/typescript/src/StaticTreeContext.d.ts +4 -0
- package/lib/typescript/src/StaticTreeContext.d.ts.map +1 -0
- package/lib/typescript/src/checkSerializable.d.ts +4 -2
- package/lib/typescript/src/checkSerializable.d.ts.map +1 -1
- package/lib/typescript/src/createNavigationContainerRef.d.ts.map +1 -1
- package/lib/typescript/src/createNavigatorFactory.d.ts +9 -5
- package/lib/typescript/src/createNavigatorFactory.d.ts.map +1 -1
- package/lib/typescript/src/getActionFromState.d.ts.map +1 -1
- package/lib/typescript/src/getPathFromState.d.ts.map +1 -1
- package/lib/typescript/src/getStateFromPath.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +27 -18
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/useKeyedChildListeners.d.ts.map +1 -1
- package/lib/typescript/src/useNavigation.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationBuilder.d.ts +1 -1
- package/lib/typescript/src/useNavigationBuilder.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationCache.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationHelpers.d.ts +3 -4
- package/lib/typescript/src/useNavigationHelpers.d.ts.map +1 -1
- package/lib/typescript/src/useNavigationState.d.ts +11 -1
- package/lib/typescript/src/useNavigationState.d.ts.map +1 -1
- package/lib/typescript/src/useOnAction.d.ts.map +1 -1
- package/lib/typescript/src/useOptionsGetters.d.ts.map +1 -1
- package/lib/typescript/src/usePreventRemove.d.ts.map +1 -1
- package/lib/typescript/src/usePreventRemoveContext.d.ts +1 -0
- package/lib/typescript/src/usePreventRemoveContext.d.ts.map +1 -1
- package/lib/typescript/src/useRouteCache.d.ts.map +1 -1
- package/lib/typescript/src/useScheduleUpdate.d.ts +5 -4
- package/lib/typescript/src/useScheduleUpdate.d.ts.map +1 -1
- package/lib/typescript/src/useSyncState.d.ts.map +1 -1
- package/lib/typescript/src/utilities.d.ts +17 -0
- package/lib/typescript/src/utilities.d.ts.map +1 -1
- package/lib/typescript/src/validatePathConfig.d.ts.map +1 -1
- package/package.json +3 -5
- package/src/BaseNavigationContainer.tsx +9 -2
- package/src/DataLoading.tsx +139 -0
- package/src/NavigationIndependentTree.tsx +11 -11
- package/src/NavigationProvider.tsx +13 -16
- package/src/PreventRemoveContext.tsx +1 -0
- package/src/PreventRemoveProvider.tsx +48 -43
- package/src/StaticNavigation.tsx +157 -93
- package/src/StaticTreeContext.tsx +7 -0
- package/src/checkSerializable.tsx +20 -14
- package/src/createNavigationContainerRef.tsx +12 -9
- package/src/createNavigatorFactory.tsx +16 -28
- package/src/getActionFromState.tsx +18 -16
- package/src/getPathFromState.tsx +69 -65
- package/src/getPatternParts.tsx +2 -2
- package/src/getStateFromPath.tsx +107 -66
- package/src/index.tsx +2 -0
- package/src/types.tsx +74 -55
- package/src/useEventEmitter.tsx +1 -1
- package/src/useKeyedChildListeners.tsx +4 -2
- package/src/useNavigation.tsx +2 -21
- package/src/useNavigationBuilder.tsx +6 -16
- package/src/useNavigationCache.tsx +26 -19
- package/src/useNavigationHelpers.tsx +26 -9
- package/src/useNavigationState.tsx +90 -60
- package/src/useOnAction.tsx +49 -1
- package/src/useOptionsGetters.tsx +4 -1
- package/src/usePreventRemove.tsx +11 -2
- package/src/useRouteCache.tsx +19 -11
- package/src/useScheduleUpdate.tsx +8 -7
- package/src/useSyncState.tsx +5 -1
- package/src/utilities.tsx +28 -0
- package/src/validatePathConfig.tsx +1 -0
|
@@ -5,12 +5,13 @@ export const NOT_INITIALIZED_ERROR = "The 'navigation' object hasn't been initia
|
|
|
5
5
|
export function createNavigationContainerRef() {
|
|
6
6
|
const methods = [...Object.keys(CommonActions), 'addListener', 'removeListener', 'resetRoot', 'dispatch', 'isFocused', 'canGoBack', 'getRootState', 'getState', 'getParent', 'getCurrentRoute', 'getCurrentOptions'];
|
|
7
7
|
const listeners = {};
|
|
8
|
+
let current = null;
|
|
8
9
|
const removeListener = (event, callback) => {
|
|
9
10
|
if (listeners[event]) {
|
|
10
11
|
listeners[event] = listeners[event].filter(cb => cb !== callback);
|
|
11
12
|
}
|
|
13
|
+
current?.removeListener(event, callback);
|
|
12
14
|
};
|
|
13
|
-
let current = null;
|
|
14
15
|
const ref = {
|
|
15
16
|
get current() {
|
|
16
17
|
return current;
|
|
@@ -33,7 +34,10 @@ export function createNavigationContainerRef() {
|
|
|
33
34
|
},
|
|
34
35
|
...methods.reduce((acc, name) => {
|
|
35
36
|
acc[name] = (...args) => {
|
|
36
|
-
if (
|
|
37
|
+
if (name === 'removeListener') {
|
|
38
|
+
const [event, callback] = args;
|
|
39
|
+
removeListener(event, callback);
|
|
40
|
+
} else if (current == null) {
|
|
37
41
|
switch (name) {
|
|
38
42
|
case 'addListener':
|
|
39
43
|
{
|
|
@@ -42,12 +46,6 @@ export function createNavigationContainerRef() {
|
|
|
42
46
|
listeners[event].push(callback);
|
|
43
47
|
return () => removeListener(event, callback);
|
|
44
48
|
}
|
|
45
|
-
case 'removeListener':
|
|
46
|
-
{
|
|
47
|
-
const [event, callback] = args;
|
|
48
|
-
removeListener(event, callback);
|
|
49
|
-
break;
|
|
50
|
-
}
|
|
51
49
|
default:
|
|
52
50
|
console.error(NOT_INITIALIZED_ERROR);
|
|
53
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CommonActions","NOT_INITIALIZED_ERROR","createNavigationContainerRef","methods","Object","keys","listeners","removeListener","event","callback","filter","cb","
|
|
1
|
+
{"version":3,"names":["CommonActions","NOT_INITIALIZED_ERROR","createNavigationContainerRef","methods","Object","keys","listeners","current","removeListener","event","callback","filter","cb","ref","value","entries","forEach","callbacks","addListener","isReady","reduce","acc","name","args","push","console","error"],"sourceRoot":"../../src","sources":["createNavigationContainerRef.tsx"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,2BAA2B;AASzD,OAAO,MAAMC,qBAAqB,GAChC,+QAA+Q;AAEjR,OAAO,SAASC,4BAA4BA,CAAA,EAEM;EAChD,MAAMC,OAAO,GAAG,CACd,GAAGC,MAAM,CAACC,IAAI,CAACL,aAAa,CAAC,EAC7B,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,mBAAmB,CACX;EAEV,MAAMM,SAAuD,GAAG,CAAC,CAAC;EAElE,IAAIC,OAAiD,GAAG,IAAI;EAE5D,MAAMC,cAAc,GAAGA,CACrBC,KAAa,EACbC,QAAkC,KAC/B;IACH,IAAIJ,SAAS,CAACG,KAAK,CAAC,EAAE;MACpBH,SAAS,CAACG,KAAK,CAAC,GAAGH,SAAS,CAACG,KAAK,CAAC,CAACE,MAAM,CAAEC,EAAE,IAAKA,EAAE,KAAKF,QAAQ,CAAC;IACrE;IAEAH,OAAO,EAAEC,cAAc,CACrBC,KAAK,EACLC,QACF,CAAC;EACH,CAAC;EAED,MAAMG,GAAiD,GAAG;IACxD,IAAIN,OAAOA,CAAA,EAAG;MACZ,OAAOA,OAAO;IAChB,CAAC;IACD,IAAIA,OAAOA,CAACO,KAA+C,EAAE;MAC3DP,OAAO,GAAGO,KAAK;MAEf,IAAIA,KAAK,IAAI,IAAI,EAAE;QACjBV,MAAM,CAACW,OAAO,CAACT,SAAS,CAAC,CAACU,OAAO,CAAC,CAAC,CAACP,KAAK,EAAEQ,SAAS,CAAC,KAAK;UACxDA,SAAS,CAACD,OAAO,CAAEN,QAAQ,IAAK;YAC9BI,KAAK,CAACI,WAAW,CACfT,KAAK,EACLC,QACF,CAAC;UACH,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ;IACF,CAAC;IACDS,OAAO,EAAEA,CAAA,KAAM;MACb,IAAIZ,OAAO,IAAI,IAAI,EAAE;QACnB,OAAO,KAAK;MACd;MAEA,OAAOA,OAAO,CAACY,OAAO,CAAC,CAAC;IAC1B,CAAC;IACD,GAAGhB,OAAO,CAACiB,MAAM,CAAM,CAACC,GAAG,EAAEC,IAAI,KAAK;MACpCD,GAAG,CAACC,IAAI,CAAC,GAAG,CAAC,GAAGC,IAAW,KAAK;QAC9B,IAAID,IAAI,KAAK,gBAAgB,EAAE;UAC7B,MAAM,CAACb,KAAK,EAAEC,QAAQ,CAAC,GAAGa,IAAI;UAE9Bf,cAAc,CAACC,KAAK,EAAEC,QAAQ,CAAC;QACjC,CAAC,MAAM,IAAIH,OAAO,IAAI,IAAI,EAAE;UAC1B,QAAQe,IAAI;YACV,KAAK,aAAa;cAAE;gBAClB,MAAM,CAACb,KAAK,EAAEC,QAAQ,CAAC,GAAGa,IAAI;gBAE9BjB,SAAS,CAACG,KAAK,CAAC,GAAGH,SAAS,CAACG,KAAK,CAAC,IAAI,EAAE;gBACzCH,SAAS,CAACG,KAAK,CAAC,CAACe,IAAI,CAACd,QAAQ,CAAC;gBAE/B,OAAO,MAAMF,cAAc,CAACC,KAAK,EAAEC,QAAQ,CAAC;cAC9C;YACA;cACEe,OAAO,CAACC,KAAK,CAACzB,qBAAqB,CAAC;UACxC;QACF,CAAC,MAAM;UACL;UACA,OAAOM,OAAO,CAACe,IAAI,CAAC,CAAC,GAAGC,IAAI,CAAC;QAC/B;MACF,CAAC;MACD,OAAOF,GAAG;IACZ,CAAC,EAAE,CAAC,CAAC;EACP,CAAC;EAED,OAAOR,GAAG;AACZ","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Group","Screen","createComponentForStaticConfig","createNavigatorFactory","Navigator","displayName","name","createNavigator","config","NavigatorComponent","with","DecoratorComponent","WithComponent","createElement","getComponent"],"sourceRoot":"../../src","sources":["createNavigatorFactory.tsx"],"mappings":";;AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,KAAK,QAAQ,YAAS;AAC/B,SAASC,MAAM,QAAQ,aAAU;AACjC,SACEC,8BAA8B,
|
|
1
|
+
{"version":3,"names":["React","Group","Screen","createComponentForStaticConfig","createNavigatorFactory","Navigator","displayName","name","createNavigator","config","NavigatorComponent","with","DecoratorComponent","WithComponent","createElement","getComponent"],"sourceRoot":"../../src","sources":["createNavigatorFactory.tsx"],"mappings":";;AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,KAAK,QAAQ,YAAS;AAC/B,SAASC,MAAM,QAAQ,aAAU;AACjC,SACEC,8BAA8B,QAIzB,uBAAoB;AA6C3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CACpCC,SAAmC,EACH;EAChC,MAAMC,WAAW,GAAGD,SAAS,CAACC,WAAW,IAAID,SAAS,CAACE,IAAI,IAAI,WAAW;EAE1E,SAASC,eAAeA,CAACC,MAAY,EAAO;IAC1C,IAAIA,MAAM,IAAI,IAAI,EAAE;MAClB,MAAMC,kBAAkB,GAAGP,8BAA8B,CACvD;QACEE,SAAS;QACTH,MAAM;QACND,KAAK;QACLQ;MACF,CAAC,EACDH,WACF,CAAC;MAED,OAAO;QACLG,MAAM;QACNE,IAAIA,CACFC,kBAEE,EACF;UACA,MAAMC,aAAa,GAAGA,CAAA,KAAM;YAC1B,oBAAOb,KAAK,CAACc,aAAa,CAACF,kBAAkB,EAAE;cAC7CP,SAAS,EAAEK;YACb,CAAC,CAAC;UACJ,CAAC;UAEDG,aAAa,CAACP,WAAW,GAAG,GAAGA,WAAW,MAAM;UAEhD,OAAO;YACLG,MAAM;YACNM,YAAY,EAAEA,CAAA,KAAMF;UACtB,CAAC;QACH,CAAC;QACDE,YAAYA,CAAA,EAAG;UACb,OAAOL,kBAAkB;QAC3B;MACF,CAAC;IACH;IAEA,OAAO;MACLL,SAAS;MACTH,MAAM;MACND;IACF,CAAC;EACH;EAEA,OAAOO,eAAe;AACxB","ignoreList":[]}
|
|
@@ -16,16 +16,16 @@ export function getActionFromState(state, options) {
|
|
|
16
16
|
} else {
|
|
17
17
|
normalizedConfig = {};
|
|
18
18
|
}
|
|
19
|
-
const
|
|
20
|
-
if (
|
|
19
|
+
const routesLength = state.index == null || state.index >= state.routes.length ? state.routes.length : state.index + 1;
|
|
20
|
+
if (routesLength === 0) {
|
|
21
21
|
return undefined;
|
|
22
22
|
}
|
|
23
|
-
const firstRoute = routes[0];
|
|
23
|
+
const firstRoute = state.routes[0];
|
|
24
24
|
if (firstRoute == null) {
|
|
25
25
|
return undefined;
|
|
26
26
|
}
|
|
27
|
-
const secondRoute = routes[1];
|
|
28
|
-
if (!(
|
|
27
|
+
const secondRoute = state.routes[1];
|
|
28
|
+
if (!(routesLength === 1 && firstRoute.key == null || routesLength === 2 && firstRoute.key == null && firstRoute.name === normalizedConfig?.initialRouteName && secondRoute?.key == null)) {
|
|
29
29
|
return {
|
|
30
30
|
type: 'RESET',
|
|
31
31
|
payload: state
|
|
@@ -67,16 +67,16 @@ export function getActionFromState(state, options) {
|
|
|
67
67
|
if (current.routes.length === 0) {
|
|
68
68
|
return undefined;
|
|
69
69
|
}
|
|
70
|
-
const
|
|
71
|
-
const route = routes[
|
|
70
|
+
const routesLength = current.index == null || current.index >= current.routes.length ? current.routes.length : current.index + 1;
|
|
71
|
+
const route = current.routes[routesLength - 1];
|
|
72
72
|
if (route == null) {
|
|
73
73
|
return undefined;
|
|
74
74
|
}
|
|
75
|
-
const firstRoute = routes[0];
|
|
75
|
+
const firstRoute = current.routes[0];
|
|
76
76
|
if (firstRoute == null) {
|
|
77
77
|
return undefined;
|
|
78
78
|
}
|
|
79
|
-
const secondRoute = routes[1];
|
|
79
|
+
const secondRoute = current.routes[1];
|
|
80
80
|
|
|
81
81
|
// Explicitly set to override existing value when merging params
|
|
82
82
|
Object.assign(params, {
|
|
@@ -85,10 +85,10 @@ export function getActionFromState(state, options) {
|
|
|
85
85
|
params: undefined,
|
|
86
86
|
state: undefined
|
|
87
87
|
});
|
|
88
|
-
if (
|
|
88
|
+
if (routesLength === 1 && firstRoute.key == null) {
|
|
89
89
|
params.initial = true;
|
|
90
90
|
params.screen = route.name;
|
|
91
|
-
} else if (
|
|
91
|
+
} else if (routesLength === 2 && firstRoute.key == null && firstRoute.name === config?.initialRouteName && secondRoute?.key == null) {
|
|
92
92
|
params.initial = false;
|
|
93
93
|
params.screen = route.name;
|
|
94
94
|
} else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["cachedNormalizedConfig","WeakMap","getActionFromState","state","options","normalizedConfig","cached","get","createNormalizedConfigItem","set","
|
|
1
|
+
{"version":3,"names":["cachedNormalizedConfig","WeakMap","getActionFromState","state","options","normalizedConfig","cached","get","createNormalizedConfigItem","set","routesLength","index","routes","length","undefined","firstRoute","secondRoute","key","name","initialRouteName","type","payload","route","current","config","screens","params","path","Object","keys","pop","assign","initial","screen","createNormalizedConfigs","entries","reduce","acc","k","v"],"sourceRoot":"../../src","sources":["getActionFromState.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -13,46 +13,32 @@ const encodePathParam = value => {
|
|
|
13
13
|
}
|
|
14
14
|
return result;
|
|
15
15
|
};
|
|
16
|
-
const getActiveRoute = state => {
|
|
16
|
+
const getActiveRoute = (state, configs, getRouteState) => {
|
|
17
17
|
const route = typeof state.index === 'number' ? state.routes[state.index] : state.routes[state.routes.length - 1];
|
|
18
18
|
if (route == null) {
|
|
19
19
|
throw new Error(`Couldn't find the active route.`);
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
const config = configs?.[route.name];
|
|
22
|
+
const routeState = getRouteState(route, config);
|
|
23
|
+
if (routeState) {
|
|
24
|
+
return getActiveRoute(routeState, config?.screens, getRouteState);
|
|
23
25
|
}
|
|
24
26
|
return route;
|
|
25
27
|
};
|
|
26
28
|
const cachedNormalizedConfigs = new WeakMap();
|
|
27
29
|
const getNormalizedConfigs = options => {
|
|
28
|
-
if (!options
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
if (!options) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
const cached = cachedNormalizedConfigs.get(options);
|
|
34
|
+
if (cached) {
|
|
35
|
+
return cached;
|
|
36
|
+
}
|
|
37
|
+
validatePathConfig(options);
|
|
31
38
|
const normalizedConfigs = createNormalizedConfigs(options.screens);
|
|
32
|
-
cachedNormalizedConfigs.set(options
|
|
39
|
+
cachedNormalizedConfigs.set(options, normalizedConfigs);
|
|
33
40
|
return normalizedConfigs;
|
|
34
41
|
};
|
|
35
|
-
const getTransformedState = (state, configs) => {
|
|
36
|
-
const routes = state.routes.map(route => {
|
|
37
|
-
const config = configs?.[route.name];
|
|
38
|
-
if (route.state || config?.screens && route.params && ('screen' in route.params && typeof route.params.screen === 'string' && config.screens[route.params.screen] || 'state' in route.params)) {
|
|
39
|
-
const nestedState = route.state ?? getStateFromRouteParams(route.params);
|
|
40
|
-
if (nestedState) {
|
|
41
|
-
return {
|
|
42
|
-
...route,
|
|
43
|
-
state: getTransformedState(nestedState, configs?.[route.name]?.screens)
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// @ts-expect-error route.state is handled in previous condition
|
|
49
|
-
return route;
|
|
50
|
-
});
|
|
51
|
-
return {
|
|
52
|
-
...state,
|
|
53
|
-
routes
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
42
|
|
|
57
43
|
/**
|
|
58
44
|
* Utility to serialize a navigation state object to a path string.
|
|
@@ -87,13 +73,25 @@ export function getPathFromState(state, options) {
|
|
|
87
73
|
if (state == null) {
|
|
88
74
|
throw Error(`Got '${String(state)}' for the navigation state. You must pass a valid state object.`);
|
|
89
75
|
}
|
|
90
|
-
if (options) {
|
|
91
|
-
validatePathConfig(options);
|
|
92
|
-
}
|
|
93
76
|
const configs = getNormalizedConfigs(options);
|
|
94
|
-
const
|
|
77
|
+
const cachedRouteStates = new Map();
|
|
78
|
+
const getRouteState = (route, config) => {
|
|
79
|
+
if (route.state) {
|
|
80
|
+
return route.state;
|
|
81
|
+
}
|
|
82
|
+
const hasScreenParams = route.params && 'screen' in route.params && typeof route.params.screen === 'string' && config?.screens?.[route.params.screen];
|
|
83
|
+
const hasStateParams = route.params && 'state' in route.params && config?.screens;
|
|
84
|
+
if (!route.params || !config?.screens || !hasScreenParams && !hasStateParams) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
if (!cachedRouteStates.has(route)) {
|
|
88
|
+
cachedRouteStates.set(route, getStateFromRouteParams(route.params));
|
|
89
|
+
}
|
|
90
|
+
return cachedRouteStates.get(route);
|
|
91
|
+
};
|
|
92
|
+
const focusedRoute = getActiveRoute(state, configs, getRouteState);
|
|
95
93
|
let path = '/';
|
|
96
|
-
let current =
|
|
94
|
+
let current = state;
|
|
97
95
|
const allParams = {};
|
|
98
96
|
while (current) {
|
|
99
97
|
let index = typeof current.index === 'number' ? current.index : 0;
|
|
@@ -105,7 +103,6 @@ export function getPathFromState(state, options) {
|
|
|
105
103
|
let parts;
|
|
106
104
|
let focusedParams;
|
|
107
105
|
let currentOptions = configs;
|
|
108
|
-
const focusedRoute = getActiveRoute(transformedState);
|
|
109
106
|
|
|
110
107
|
// Keep all the route names that appeared during going deeper in config in case the pattern is resolved to undefined
|
|
111
108
|
const nestedRouteNames = [];
|
|
@@ -162,11 +159,12 @@ export function getPathFromState(state, options) {
|
|
|
162
159
|
}
|
|
163
160
|
|
|
164
161
|
// If there is no `screens` property or no nested state, we return pattern
|
|
165
|
-
|
|
162
|
+
const routeState = getRouteState(route, config);
|
|
163
|
+
if (!config.screens || routeState == null) {
|
|
166
164
|
hasNext = false;
|
|
167
165
|
} else {
|
|
168
|
-
index = typeof
|
|
169
|
-
const nextRoute =
|
|
166
|
+
index = typeof routeState.index === 'number' ? routeState.index : routeState.routes.length - 1;
|
|
167
|
+
const nextRoute = routeState.routes[index];
|
|
170
168
|
if (nextRoute == null) {
|
|
171
169
|
throw new Error(`Couldn't find a route at index ${index}.`);
|
|
172
170
|
}
|
|
@@ -182,6 +180,7 @@ export function getPathFromState(state, options) {
|
|
|
182
180
|
}
|
|
183
181
|
}
|
|
184
182
|
}
|
|
183
|
+
const routeState = getRouteState(route, currentOptions[route.name]);
|
|
185
184
|
if (currentOptions[route.name] != null) {
|
|
186
185
|
if (parts) {
|
|
187
186
|
let index = 0;
|
|
@@ -232,7 +231,7 @@ export function getPathFromState(state, options) {
|
|
|
232
231
|
}
|
|
233
232
|
}
|
|
234
233
|
}
|
|
235
|
-
if (
|
|
234
|
+
if (routeState) {
|
|
236
235
|
path += '/';
|
|
237
236
|
} else if (focusedParams) {
|
|
238
237
|
const query = queryString.stringify(focusedParams, {
|
|
@@ -242,7 +241,7 @@ export function getPathFromState(state, options) {
|
|
|
242
241
|
path += `?${query}`;
|
|
243
242
|
}
|
|
244
243
|
}
|
|
245
|
-
current =
|
|
244
|
+
current = routeState;
|
|
246
245
|
}
|
|
247
246
|
|
|
248
247
|
// Include the root path if specified
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["queryString","getPatternParts","getStateFromRouteParams","validatePathConfig","encodePathParam","value","result","char","charCode","charCodeAt","safe","includes","encodeURIComponent","getActiveRoute","state","route","index","routes","length","Error","cachedNormalizedConfigs","WeakMap","getNormalizedConfigs","options","
|
|
1
|
+
{"version":3,"names":["queryString","getPatternParts","getStateFromRouteParams","validatePathConfig","encodePathParam","value","result","char","charCode","charCodeAt","safe","includes","encodeURIComponent","getActiveRoute","state","configs","getRouteState","route","index","routes","length","Error","config","name","routeState","screens","cachedNormalizedConfigs","WeakMap","getNormalizedConfigs","options","cached","get","normalizedConfigs","createNormalizedConfigs","set","getPathFromState","String","cachedRouteStates","Map","hasScreenParams","params","screen","hasStateParams","undefined","has","focusedRoute","path","current","allParams","initialRoute","parts","focusedParams","currentOptions","nestedRouteNames","hasNext","push","currentParams","key","optional","part","param","stringify","Object","assign","inPattern","nextRoute","nestedConfig","segment","query","sort","replace","startsWith","createConfigItem","parentParts","exact"],"sourceRoot":"../../src","sources":["getPathFromState.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -41,15 +41,15 @@ export function getPatternParts(path) {
|
|
|
41
41
|
if (regexInnerParens) {
|
|
42
42
|
// The ')' is part of the regex if we're already inside one
|
|
43
43
|
regexInnerParens--;
|
|
44
|
-
current.regex += char;
|
|
45
44
|
} else {
|
|
45
|
+
current.regex += char;
|
|
46
46
|
isRegex = false;
|
|
47
47
|
isParam = false;
|
|
48
48
|
}
|
|
49
49
|
} else {
|
|
50
50
|
throw new Error(`Encountered ')' without preceding '(' in path: ${path}`);
|
|
51
51
|
}
|
|
52
|
-
} else if (char === '?') {
|
|
52
|
+
} else if (char === '?' && !isRegex) {
|
|
53
53
|
if (current.param) {
|
|
54
54
|
isParam = false;
|
|
55
55
|
current.optional = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getPatternParts","path","parts","current","segment","isRegex","isParam","regexInnerParens","i","length","char","Error","regex","param","optional","replace","push","params","map","part","filter","Boolean","index","entries","indexOf","combinePatternParts","parentParts","exact"],"sourceRoot":"../../src","sources":["getPatternParts.tsx"],"mappings":";;AAOA;AACA;AACA;AACA,OAAO,SAASA,eAAeA,CAACC,IAAY,EAAiB;EAC3D,MAAMC,KAAoB,GAAG,EAAE;EAE/B,IAAIC,OAAoB,GAAG;IAAEC,OAAO,EAAE;EAAG,CAAC;EAE1C,IAAIC,OAAO,GAAG,KAAK;EACnB,IAAIC,OAAO,GAAG,KAAK;EACnB,IAAIC,gBAAgB,GAAG,CAAC;;EAExB;EACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIP,IAAI,CAACQ,MAAM,EAAED,CAAC,EAAE,EAAE;IACrC,MAAME,IAAI,GAAGT,IAAI,CAACO,CAAC,CAAC;IAEpB,IAAIE,IAAI,IAAI,IAAI,EAAE;MAChBP,OAAO,CAACC,OAAO,IAAIM,IAAI;IACzB;IAEA,IAAIA,IAAI,KAAK,GAAG,EAAE;MAChB;MACA,IAAIP,OAAO,CAACC,OAAO,KAAK,GAAG,EAAE;QAC3BE,OAAO,GAAG,IAAI;MAChB,CAAC,MAAM,IAAI,CAACD,OAAO,EAAE;QACnB,MAAM,IAAIM,KAAK,CACb,uDAAuDV,IAAI,EAC7D,CAAC;MACH;IACF,CAAC,MAAM,IAAIS,IAAI,KAAK,GAAG,EAAE;MACvB,IAAIJ,OAAO,EAAE;QACX,IAAID,OAAO,EAAE;UACX;UACAE,gBAAgB,EAAE;QACpB,CAAC,MAAM;UACLF,OAAO,GAAG,IAAI;QAChB;MACF,CAAC,MAAM;QACL,MAAM,IAAIM,KAAK,CACb,kDAAkDV,IAAI,EACxD,CAAC;MACH;IACF,CAAC,MAAM,IAAIS,IAAI,KAAK,GAAG,EAAE;MACvB,IAAIJ,OAAO,IAAID,OAAO,EAAE;QACtB,IAAIE,gBAAgB,EAAE;UACpB;UACAA,gBAAgB,EAAE;
|
|
1
|
+
{"version":3,"names":["getPatternParts","path","parts","current","segment","isRegex","isParam","regexInnerParens","i","length","char","Error","regex","param","optional","replace","push","params","map","part","filter","Boolean","index","entries","indexOf","combinePatternParts","parentParts","exact"],"sourceRoot":"../../src","sources":["getPatternParts.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -97,22 +97,21 @@ export function getStateFromPath(path, options, previous) {
|
|
|
97
97
|
// Remove the prefix from the path
|
|
98
98
|
remaining = remaining.replace(normalizedPrefix, '');
|
|
99
99
|
}
|
|
100
|
-
const decodedSegments = [];
|
|
101
|
-
for (const segment of remaining.split('/')) {
|
|
102
|
-
if (!segment) {
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
try {
|
|
106
|
-
decodedSegments.push(decodeURIComponent(segment));
|
|
107
|
-
} catch {
|
|
108
|
-
return undefined;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
100
|
if (screens === undefined) {
|
|
112
101
|
// When no config is specified, use the path segments as route names
|
|
113
|
-
const routes =
|
|
114
|
-
|
|
115
|
-
|
|
102
|
+
const routes = [];
|
|
103
|
+
for (const segment of remaining.split('/')) {
|
|
104
|
+
if (!segment) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
routes.push({
|
|
109
|
+
name: decodeURIComponent(segment)
|
|
110
|
+
});
|
|
111
|
+
} catch {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
116
115
|
if (routes.length) {
|
|
117
116
|
return createNestedStateObject(path, routes, initialRoutes);
|
|
118
117
|
}
|
|
@@ -133,7 +132,18 @@ export function getStateFromPath(path, options, previous) {
|
|
|
133
132
|
|
|
134
133
|
// We match the whole path against the regex instead of segments
|
|
135
134
|
// This makes sure matches such as wildcard will catch any unmatched routes, even if nested
|
|
135
|
+
const firstRawSegment = remaining.split('/')[0];
|
|
136
|
+
let firstDecodedSegment;
|
|
137
|
+
try {
|
|
138
|
+
firstDecodedSegment = firstRawSegment != null ? decodeURIComponent(firstRawSegment) : undefined;
|
|
139
|
+
} catch {
|
|
140
|
+
firstDecodedSegment = undefined;
|
|
141
|
+
}
|
|
136
142
|
for (const config of configs) {
|
|
143
|
+
// Regex matching is expensive, so skip configs that can't match this path.
|
|
144
|
+
if (!canMatchFirstSegment(config.segments[0], firstDecodedSegment, firstRawSegment)) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
137
147
|
const routes = matchAgainstConfig(remaining, config, configsByScreen);
|
|
138
148
|
if (routes === undefined) {
|
|
139
149
|
continue;
|
|
@@ -155,31 +165,50 @@ export function getStateFromPath(path, options, previous) {
|
|
|
155
165
|
}
|
|
156
166
|
return undefined;
|
|
157
167
|
}
|
|
168
|
+
const canMatchFirstSegment = (configSegment, decodedSegment, rawSegment) => {
|
|
169
|
+
if (decodedSegment === undefined) {
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
if (configSegment === undefined) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
if (configSegment === '*' || configSegment.startsWith(':')) {
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
return configSegment === decodedSegment || configSegment === rawSegment;
|
|
179
|
+
};
|
|
158
180
|
|
|
159
181
|
/**
|
|
160
182
|
* Reference to the last used config resources. This is used to avoid recomputing the config resources when the options are the same.
|
|
161
183
|
*/
|
|
162
184
|
const cachedConfigResources = new WeakMap();
|
|
163
185
|
function getConfigResources(options) {
|
|
164
|
-
if (!options)
|
|
186
|
+
if (!options) {
|
|
187
|
+
return prepareConfigResources();
|
|
188
|
+
}
|
|
165
189
|
const cached = cachedConfigResources.get(options);
|
|
166
|
-
if (cached)
|
|
190
|
+
if (cached) {
|
|
191
|
+
return cached;
|
|
192
|
+
}
|
|
193
|
+
validatePathConfig(options);
|
|
167
194
|
const resources = prepareConfigResources(options);
|
|
168
195
|
cachedConfigResources.set(options, resources);
|
|
169
196
|
return resources;
|
|
170
197
|
}
|
|
171
198
|
function prepareConfigResources(options) {
|
|
172
|
-
if (options) {
|
|
173
|
-
validatePathConfig(options);
|
|
174
|
-
}
|
|
175
199
|
const initialRoutes = getInitialRoutes(options);
|
|
176
200
|
const configs = getSortedNormalizedConfigs(initialRoutes, options?.screens);
|
|
177
|
-
checkForDuplicatedConfigs(configs);
|
|
178
201
|
const configsByScreen = {};
|
|
179
202
|
const configsByPattern = {};
|
|
180
203
|
for (const c of configs) {
|
|
181
204
|
(configsByScreen[c.screen] ??= []).push(c);
|
|
182
|
-
|
|
205
|
+
const existing = configsByPattern[c.pattern];
|
|
206
|
+
if (existing) {
|
|
207
|
+
checkForDuplicatedConfigs(existing[existing.length - 1], c);
|
|
208
|
+
existing.push(c);
|
|
209
|
+
} else {
|
|
210
|
+
configsByPattern[c.pattern] = [c];
|
|
211
|
+
}
|
|
183
212
|
}
|
|
184
213
|
return {
|
|
185
214
|
initialRoutes,
|
|
@@ -290,24 +319,20 @@ function getSortedNormalizedConfigs(initialRoutes, screens = {}) {
|
|
|
290
319
|
return a.segments.length - b.segments.length;
|
|
291
320
|
});
|
|
292
321
|
}
|
|
293
|
-
function checkForDuplicatedConfigs(configs) {
|
|
294
|
-
// Check for duplicate patterns in the config
|
|
295
|
-
const patterns = {};
|
|
296
|
-
for (const config of configs) {
|
|
297
|
-
const pattern = config.pattern;
|
|
298
|
-
const existing = patterns[pattern];
|
|
299
|
-
if (existing) {
|
|
300
|
-
const a = existing.routeNames;
|
|
301
|
-
const b = config.routeNames;
|
|
302
322
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
323
|
+
// Throw if two configs resolve to the same pattern but conflicting screens
|
|
324
|
+
function checkForDuplicatedConfigs(existing, config) {
|
|
325
|
+
if (!existing) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
const a = existing.routeNames;
|
|
329
|
+
const b = config.routeNames;
|
|
330
|
+
|
|
331
|
+
// It's not a problem if the path string omitted from a inner most screen
|
|
332
|
+
// For example, it's ok if a path resolves to `A > B > C` or `A > B`
|
|
333
|
+
const intersects = a.length > b.length ? arrayStartsWith(a, b) : arrayStartsWith(b, a);
|
|
334
|
+
if (!intersects && (!existing.shared || !config.shared)) {
|
|
335
|
+
throw new Error(`Found conflicting screens with the same pattern. The pattern '${config.pattern}' resolves to both '${a.join(' > ')}' and '${b.join(' > ')}'. Patterns must be unique and cannot resolve to more than one screen unless shared: true is specified.`);
|
|
311
336
|
}
|
|
312
337
|
}
|
|
313
338
|
const matchAgainstConfig = (remaining, config, configsByScreen) => {
|
|
@@ -328,13 +353,11 @@ const matchAgainstConfig = (remaining, config, configsByScreen) => {
|
|
|
328
353
|
let hasParams = false;
|
|
329
354
|
if (routeConfig && match.groups) {
|
|
330
355
|
params = {};
|
|
331
|
-
for (const
|
|
332
|
-
|
|
333
|
-
const index = Number(key.replace(PARAM_GROUP_PREFIX, ''));
|
|
334
|
-
const param = routeConfig.params.find(it => it.index === index);
|
|
335
|
-
if (!param || param.screen !== routeName) {
|
|
356
|
+
for (const param of routeConfig.params) {
|
|
357
|
+
if (param.screen !== routeName) {
|
|
336
358
|
continue;
|
|
337
359
|
}
|
|
360
|
+
const value = match.groups[`${PARAM_GROUP_PREFIX}${param.index}`];
|
|
338
361
|
if (value == null) {
|
|
339
362
|
params[param.name] = undefined;
|
|
340
363
|
hasParams = true;
|
|
@@ -458,6 +481,7 @@ const createConfigItem = (screen, routeNames, parts, parse, hasNestedScreens = f
|
|
|
458
481
|
let regex;
|
|
459
482
|
const segments = [];
|
|
460
483
|
const params = [];
|
|
484
|
+
const pathParamNames = new Set();
|
|
461
485
|
if (parts.length) {
|
|
462
486
|
let regexString = '^(';
|
|
463
487
|
let index = 0;
|
|
@@ -471,6 +495,9 @@ const createConfigItem = (screen, routeNames, parts, parse, hasNestedScreens = f
|
|
|
471
495
|
screen: part.screen,
|
|
472
496
|
name: part.param
|
|
473
497
|
});
|
|
498
|
+
if (part.screen === screen) {
|
|
499
|
+
pathParamNames.add(part.param);
|
|
500
|
+
}
|
|
474
501
|
} else {
|
|
475
502
|
regexString += `${part.segment === '*' ? '.*' : escape(part.segment)}\\/`;
|
|
476
503
|
}
|
|
@@ -490,6 +517,7 @@ const createConfigItem = (screen, routeNames, parts, parse, hasNestedScreens = f
|
|
|
490
517
|
routeNames,
|
|
491
518
|
parse,
|
|
492
519
|
explicitParamNames: getExplicitParamNames(parse),
|
|
520
|
+
pathParamNames,
|
|
493
521
|
hasNestedScreens,
|
|
494
522
|
shared
|
|
495
523
|
};
|
|
@@ -649,8 +677,7 @@ const createNestedStateObject = (path, routes, initialRoutes, routeConfig) => {
|
|
|
649
677
|
return undefined;
|
|
650
678
|
}
|
|
651
679
|
focusedRoute.path = path.replace(/\/$/, '');
|
|
652
|
-
const
|
|
653
|
-
const queryParams = parseQueryParams(path, routeConfig?.parse, pathParamNames, routeConfig?.explicitParamNames, routeConfig?.hasNestedScreens, focusedRoute.params);
|
|
680
|
+
const queryParams = parseQueryParams(path, routeConfig?.parse, routeConfig?.pathParamNames, routeConfig?.explicitParamNames, routeConfig?.hasNestedScreens, focusedRoute.params);
|
|
654
681
|
if (!queryParams.valid) {
|
|
655
682
|
return undefined;
|
|
656
683
|
}
|