one 1.21.6 → 1.21.8
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/dist/cjs/cli/dev.native.js.map +1 -1
- package/dist/cjs/cli.cjs +0 -3
- package/dist/cjs/cli.native.js +0 -3
- package/dist/cjs/cli.native.js.map +1 -1
- package/dist/cjs/image/getImageData.cjs +1 -1
- package/dist/cjs/image/getImageData.native.js +1 -1
- package/dist/cjs/image/getImageData.native.js.map +1 -1
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/layouts/Stack.cjs +5 -5
- package/dist/cjs/layouts/Stack.native.js +5 -5
- package/dist/cjs/layouts/Stack.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/StackScreen.cjs +3 -0
- package/dist/cjs/layouts/stack-utils/StackScreen.native.js +3 -0
- package/dist/cjs/layouts/stack-utils/StackScreen.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/StackToolbar.cjs +419 -0
- package/dist/cjs/layouts/stack-utils/StackToolbar.native.js +453 -0
- package/dist/cjs/layouts/stack-utils/StackToolbar.native.js.map +1 -0
- package/dist/cjs/layouts/stack-utils/StackToolbar.types.cjs +18 -0
- package/dist/cjs/layouts/stack-utils/StackToolbar.types.native.js +21 -0
- package/dist/cjs/layouts/stack-utils/StackToolbar.types.native.js.map +1 -0
- package/dist/cjs/layouts/stack-utils/__tests__/StackToolbar.runtime.test.cjs +63 -0
- package/dist/cjs/layouts/stack-utils/__tests__/StackToolbar.runtime.test.native.js +73 -0
- package/dist/cjs/layouts/stack-utils/__tests__/StackToolbar.runtime.test.native.js.map +1 -0
- package/dist/cjs/layouts/stack-utils/__tests__/composition.test.cjs +205 -0
- package/dist/cjs/layouts/stack-utils/__tests__/composition.test.native.js +220 -0
- package/dist/cjs/layouts/stack-utils/__tests__/composition.test.native.js.map +1 -1
- package/dist/cjs/layouts/stack-utils/index.cjs +2 -0
- package/dist/cjs/layouts/stack-utils/index.native.js +2 -0
- package/dist/cjs/layouts/stack-utils/index.native.js.map +1 -1
- package/dist/cjs/layouts/withLayoutContext.cjs +39 -8
- package/dist/cjs/layouts/withLayoutContext.native.js +43 -8
- package/dist/cjs/layouts/withLayoutContext.native.js.map +1 -1
- package/dist/cjs/layouts/withLayoutContext.test.cjs +96 -0
- package/dist/cjs/layouts/withLayoutContext.test.native.js +100 -0
- package/dist/cjs/layouts/withLayoutContext.test.native.js.map +1 -0
- package/dist/cjs/router/Route.cjs +3 -0
- package/dist/cjs/router/Route.native.js +3 -0
- package/dist/cjs/router/Route.native.js.map +1 -1
- package/dist/cjs/router/protectedRoutes.test.cjs +22 -0
- package/dist/cjs/router/protectedRoutes.test.native.js +25 -0
- package/dist/cjs/router/protectedRoutes.test.native.js.map +1 -0
- package/dist/cjs/router/router.cjs +26 -8
- package/dist/cjs/router/router.native.js +26 -8
- package/dist/cjs/router/router.native.js.map +1 -1
- package/dist/cjs/router/useScreens.cjs +38 -11
- package/dist/cjs/router/useScreens.native.js +39 -11
- package/dist/cjs/router/useScreens.native.js.map +1 -1
- package/dist/cjs/router/useScreens.test.cjs +134 -0
- package/dist/cjs/router/useScreens.test.native.js +163 -0
- package/dist/cjs/router/useScreens.test.native.js.map +1 -0
- package/dist/cjs/views/Navigator.cjs +14 -6
- package/dist/cjs/views/Navigator.native.js +14 -6
- package/dist/cjs/views/Navigator.native.js.map +1 -1
- package/dist/cjs/views/Protected.native.js.map +1 -1
- package/dist/cjs/views/SuspenseFallback.cjs +18 -0
- package/dist/cjs/views/SuspenseFallback.native.js +21 -0
- package/dist/cjs/views/SuspenseFallback.native.js.map +1 -0
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.cjs +47 -7
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js +47 -7
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.cjs +15 -6
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js +15 -6
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
- package/dist/esm/cli/dev.mjs.map +1 -1
- package/dist/esm/cli/dev.native.js.map +1 -1
- package/dist/esm/cli.mjs +0 -3
- package/dist/esm/cli.mjs.map +1 -1
- package/dist/esm/cli.native.js +0 -3
- package/dist/esm/cli.native.js.map +1 -1
- package/dist/esm/image/getImageData.mjs +1 -1
- package/dist/esm/image/getImageData.mjs.map +1 -1
- package/dist/esm/image/getImageData.native.js +1 -1
- package/dist/esm/image/getImageData.native.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/layouts/Stack.mjs +6 -6
- package/dist/esm/layouts/Stack.mjs.map +1 -1
- package/dist/esm/layouts/Stack.native.js +6 -6
- package/dist/esm/layouts/Stack.native.js.map +1 -1
- package/dist/esm/layouts/stack-utils/StackScreen.mjs +3 -0
- package/dist/esm/layouts/stack-utils/StackScreen.mjs.map +1 -1
- package/dist/esm/layouts/stack-utils/StackScreen.native.js +3 -0
- package/dist/esm/layouts/stack-utils/StackScreen.native.js.map +1 -1
- package/dist/esm/layouts/stack-utils/StackToolbar.mjs +384 -0
- package/dist/esm/layouts/stack-utils/StackToolbar.mjs.map +1 -0
- package/dist/esm/layouts/stack-utils/StackToolbar.native.js +416 -0
- package/dist/esm/layouts/stack-utils/StackToolbar.native.js.map +1 -0
- package/dist/esm/layouts/stack-utils/StackToolbar.types.mjs +2 -0
- package/dist/esm/layouts/stack-utils/StackToolbar.types.mjs.map +1 -0
- package/dist/esm/layouts/stack-utils/StackToolbar.types.native.js +2 -0
- package/dist/esm/layouts/stack-utils/StackToolbar.types.native.js.map +1 -0
- package/dist/esm/layouts/stack-utils/__tests__/StackToolbar.runtime.test.mjs +40 -0
- package/dist/esm/layouts/stack-utils/__tests__/StackToolbar.runtime.test.mjs.map +1 -0
- package/dist/esm/layouts/stack-utils/__tests__/StackToolbar.runtime.test.native.js +47 -0
- package/dist/esm/layouts/stack-utils/__tests__/StackToolbar.runtime.test.native.js.map +1 -0
- package/dist/esm/layouts/stack-utils/__tests__/composition.test.mjs +205 -0
- package/dist/esm/layouts/stack-utils/__tests__/composition.test.mjs.map +1 -1
- package/dist/esm/layouts/stack-utils/__tests__/composition.test.native.js +220 -0
- package/dist/esm/layouts/stack-utils/__tests__/composition.test.native.js.map +1 -1
- package/dist/esm/layouts/stack-utils/index.mjs +2 -1
- package/dist/esm/layouts/stack-utils/index.mjs.map +1 -1
- package/dist/esm/layouts/stack-utils/index.native.js +2 -1
- package/dist/esm/layouts/stack-utils/index.native.js.map +1 -1
- package/dist/esm/layouts/withLayoutContext.mjs +41 -11
- package/dist/esm/layouts/withLayoutContext.mjs.map +1 -1
- package/dist/esm/layouts/withLayoutContext.native.js +45 -11
- package/dist/esm/layouts/withLayoutContext.native.js.map +1 -1
- package/dist/esm/layouts/withLayoutContext.test.mjs +73 -0
- package/dist/esm/layouts/withLayoutContext.test.mjs.map +1 -0
- package/dist/esm/layouts/withLayoutContext.test.native.js +74 -0
- package/dist/esm/layouts/withLayoutContext.test.native.js.map +1 -0
- package/dist/esm/router/Route.mjs +3 -1
- package/dist/esm/router/Route.mjs.map +1 -1
- package/dist/esm/router/Route.native.js +3 -1
- package/dist/esm/router/Route.native.js.map +1 -1
- package/dist/esm/router/protectedRoutes.test.mjs +23 -0
- package/dist/esm/router/protectedRoutes.test.mjs.map +1 -0
- package/dist/esm/router/protectedRoutes.test.native.js +23 -0
- package/dist/esm/router/protectedRoutes.test.native.js.map +1 -0
- package/dist/esm/router/router.mjs +26 -9
- package/dist/esm/router/router.mjs.map +1 -1
- package/dist/esm/router/router.native.js +26 -9
- package/dist/esm/router/router.native.js.map +1 -1
- package/dist/esm/router/useScreens.mjs +39 -11
- package/dist/esm/router/useScreens.mjs.map +1 -1
- package/dist/esm/router/useScreens.native.js +40 -11
- package/dist/esm/router/useScreens.native.js.map +1 -1
- package/dist/esm/router/useScreens.test.mjs +105 -0
- package/dist/esm/router/useScreens.test.mjs.map +1 -0
- package/dist/esm/router/useScreens.test.native.js +130 -0
- package/dist/esm/router/useScreens.test.native.js.map +1 -0
- package/dist/esm/views/Navigator.mjs +15 -7
- package/dist/esm/views/Navigator.mjs.map +1 -1
- package/dist/esm/views/Navigator.native.js +15 -7
- package/dist/esm/views/Navigator.native.js.map +1 -1
- package/dist/esm/views/Protected.mjs.map +1 -1
- package/dist/esm/views/Protected.native.js.map +1 -1
- package/dist/esm/views/SuspenseFallback.mjs +2 -0
- package/dist/esm/views/SuspenseFallback.mjs.map +1 -0
- package/dist/esm/views/SuspenseFallback.native.js +2 -0
- package/dist/esm/views/SuspenseFallback.native.js.map +1 -0
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs +47 -7
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs.map +1 -1
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js +47 -7
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.mjs +15 -6
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.mjs.map +1 -1
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.native.js +15 -6
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
- package/package.json +12 -11
- package/src/cli/dev.ts +0 -1
- package/src/cli.ts +0 -3
- package/src/image/getImageData.ts +2 -2
- package/src/index.ts +12 -0
- package/src/layouts/Stack.tsx +6 -4
- package/src/layouts/stack-utils/README.md +1 -0
- package/src/layouts/stack-utils/StackScreen.tsx +7 -0
- package/src/layouts/stack-utils/StackToolbar.tsx +550 -0
- package/src/layouts/stack-utils/StackToolbar.types.ts +98 -0
- package/src/layouts/stack-utils/__tests__/StackToolbar.runtime.test.tsx +46 -0
- package/src/layouts/stack-utils/__tests__/composition.test.tsx +176 -0
- package/src/layouts/stack-utils/index.tsx +16 -0
- package/src/layouts/withLayoutContext.test.tsx +74 -0
- package/src/layouts/withLayoutContext.tsx +71 -12
- package/src/router/Route.tsx +8 -0
- package/src/router/protectedRoutes.test.ts +35 -0
- package/src/router/router.ts +48 -20
- package/src/router/useScreens.test.tsx +139 -0
- package/src/router/useScreens.tsx +59 -13
- package/src/views/Navigator.tsx +25 -5
- package/src/views/Protected.tsx +3 -0
- package/src/views/SuspenseFallback.ts +7 -0
- package/src/vite/plugins/fileSystemRouterPlugin.test.ts +15 -6
- package/src/vite/plugins/fileSystemRouterPlugin.tsx +52 -7
- package/types/cli/dev.d.ts +0 -1
- package/types/cli/dev.d.ts.map +1 -1
- package/types/image/getImageData.d.ts +1 -1
- package/types/image/getImageData.d.ts.map +1 -1
- package/types/index.d.ts +2 -1
- package/types/index.d.ts.map +1 -1
- package/types/layouts/Stack.d.ts +11 -0
- package/types/layouts/Stack.d.ts.map +1 -1
- package/types/layouts/stack-utils/StackScreen.d.ts.map +1 -1
- package/types/layouts/stack-utils/StackToolbar.d.ts +26 -0
- package/types/layouts/stack-utils/StackToolbar.d.ts.map +1 -0
- package/types/layouts/stack-utils/StackToolbar.types.d.ts +82 -0
- package/types/layouts/stack-utils/StackToolbar.types.d.ts.map +1 -0
- package/types/layouts/stack-utils/index.d.ts +3 -1
- package/types/layouts/stack-utils/index.d.ts.map +1 -1
- package/types/layouts/withLayoutContext.d.ts +7 -0
- package/types/layouts/withLayoutContext.d.ts.map +1 -1
- package/types/layouts/withLayoutContext.test.d.ts +2 -0
- package/types/layouts/withLayoutContext.test.d.ts.map +1 -0
- package/types/router/Route.d.ts +4 -0
- package/types/router/Route.d.ts.map +1 -1
- package/types/router/protectedRoutes.test.d.ts +2 -0
- package/types/router/protectedRoutes.test.d.ts.map +1 -0
- package/types/router/router.d.ts +4 -6
- package/types/router/router.d.ts.map +1 -1
- package/types/router/useScreens.d.ts.map +1 -1
- package/types/router/useScreens.test.d.ts +2 -0
- package/types/router/useScreens.test.d.ts.map +1 -0
- package/types/views/Navigator.d.ts.map +1 -1
- package/types/views/Protected.d.ts +3 -0
- package/types/views/Protected.d.ts.map +1 -1
- package/types/views/SuspenseFallback.d.ts +8 -0
- package/types/views/SuspenseFallback.d.ts.map +1 -0
- package/types/vite/plugins/fileSystemRouterPlugin.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["StackHeaderBackButton","StackHeaderComponent","StackHeaderLeft","StackHeaderRight","StackHeaderSearchBar","StackHeaderTitle","StackScreen","appendScreenStackPropsToOptions","validateStackPresentation","StackHeader","Object","assign","Left","Right","BackButton","Title","SearchBar"],"sources":["../../../../src/layouts/stack-utils/index.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAAAA,qBAAA;AAAA,SACEC,oBAAA;AAAA,SAEKC,eAAA;AACP,SAASC,gBAAA,sCAAmD;AAC5D,SAASC,oBAAA,QAAkD;AAC3D,SAASC,gBAAA,QAAoD;AAC7D,SAAAC,WAAA,EAAAC,+BAAA,EAAAC,yBAAA;AAAA,
|
|
1
|
+
{"version":3,"names":["StackHeaderBackButton","StackHeaderComponent","StackHeaderLeft","StackHeaderRight","StackHeaderSearchBar","StackHeaderTitle","StackToolbar","StackScreen","appendScreenStackPropsToOptions","validateStackPresentation","StackHeader","Object","assign","Left","Right","BackButton","Title","SearchBar"],"sources":["../../../../src/layouts/stack-utils/index.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAAAA,qBAAA;AAAA,SACEC,oBAAA;AAAA,SAEKC,eAAA;AACP,SAASC,gBAAA,sCAAmD;AAC5D,SAASC,oBAAA,QAAkD;AAC3D,SAASC,gBAAA,QAAoD;AAC7D,SAAAC,YAAA;AAAA,SACEC,WAAA,EAAAC,+BAAA,EAAAC,yBAAA;AAAA,IAAAC,WAEK,GAAAC,MAAA,CAAAC,MAAA,CAAAX,oBAAA;EACPY,IAAA,EAAAX,eAAS;EACTY,KAAA,EAASX,gBAAA;EA4CTY,UAAA,EAAAf,qBAAA;EACEgB,KAAA,EAAAX,gBAAA;EACAY,SAAA,EAAAb;AAAA,EACA;AAAA,SAzCKM,WAAM,EACXV,qBAAM,EACNC,oBAAO,EACPC,eAAY,EACZC,gBAAO,EACPC,oBAAW,EACZC,gBAAA,E","ignoreList":[]}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { getContextKey, stripInvisibleSegmentsFromPath } from "../router/matchers.mjs";
|
|
3
|
+
import { useContextKey, useRouteNode } from "../router/Route.mjs";
|
|
4
|
+
import { registerProtectedRoutes, replace, resolveProtectedHref, routeInfo, unregisterProtectedRoutes } from "../router/router.mjs";
|
|
4
5
|
import { useSortedScreens } from "../router/useScreens.mjs";
|
|
6
|
+
import { sortRoutesWithInitial } from "../router/sortRoutes.mjs";
|
|
5
7
|
import { withStaticProperties } from "../utils/withStaticProperties.mjs";
|
|
6
8
|
import { isProtectedElement } from "../views/Protected.mjs";
|
|
7
9
|
import { Screen } from "../views/Screen.mjs";
|
|
@@ -15,7 +17,8 @@ function useFilterScreenChildren(children, {
|
|
|
15
17
|
const customChildren = [];
|
|
16
18
|
const screens = [];
|
|
17
19
|
const protectedScreens = /* @__PURE__ */new Set();
|
|
18
|
-
|
|
20
|
+
const guardedRedirects = /* @__PURE__ */new Map();
|
|
21
|
+
function flattenChild(child, exclude = false, redirectTo) {
|
|
19
22
|
if (React.isValidElement(child) && (child.type === Screen || child.type === StackScreen)) {
|
|
20
23
|
if (typeof child.props === "object" && child.props && "name" in child.props && !child.props.name) {
|
|
21
24
|
throw new Error(`<Screen /> component in \`default export\` at \`app${contextKey}/_layout\` must have a \`name\` prop when used as a child of a Layout Route.`);
|
|
@@ -28,15 +31,18 @@ function useFilterScreenChildren(children, {
|
|
|
28
31
|
const screenProps = child.props;
|
|
29
32
|
if (exclude && screenProps.name) {
|
|
30
33
|
protectedScreens.add(screenProps.name);
|
|
34
|
+
guardedRedirects.set(screenProps.name, redirectTo);
|
|
31
35
|
} else {
|
|
32
36
|
screens.push(screenProps);
|
|
33
37
|
}
|
|
34
38
|
return;
|
|
35
39
|
}
|
|
36
40
|
if (isProtectedElement(child)) {
|
|
37
|
-
const
|
|
41
|
+
const guardFails = !child.props.guard;
|
|
42
|
+
const excludeChildren = exclude || guardFails;
|
|
43
|
+
const childRedirectTo = guardFails ? child.props.redirectTo : redirectTo;
|
|
38
44
|
React.Children.forEach(child.props.children, nested => {
|
|
39
|
-
flattenChild(nested, excludeChildren);
|
|
45
|
+
flattenChild(nested, excludeChildren, childRedirectTo);
|
|
40
46
|
});
|
|
41
47
|
return;
|
|
42
48
|
}
|
|
@@ -56,10 +62,25 @@ function useFilterScreenChildren(children, {
|
|
|
56
62
|
return {
|
|
57
63
|
screens,
|
|
58
64
|
children: customChildren,
|
|
59
|
-
protectedScreens
|
|
65
|
+
protectedScreens,
|
|
66
|
+
guardedRedirects
|
|
60
67
|
};
|
|
61
68
|
}, [children, contextKey, isCustomNavigator]);
|
|
62
69
|
}
|
|
70
|
+
function useResolvedGuardedRedirects(guardedRedirects) {
|
|
71
|
+
const node = useRouteNode();
|
|
72
|
+
return React.useMemo(() => {
|
|
73
|
+
if (!node) {
|
|
74
|
+
return guardedRedirects;
|
|
75
|
+
}
|
|
76
|
+
const defaultRoute = [...node.children].sort(sortRoutesWithInitial(node.initialRouteName)).find(child => {
|
|
77
|
+
const normalized = child.route.replace(/\/index$/, "");
|
|
78
|
+
return !(guardedRedirects.has(child.route) || guardedRedirects.has(normalized));
|
|
79
|
+
});
|
|
80
|
+
const defaultHref = defaultRoute ? stripInvisibleSegmentsFromPath(getContextKey(defaultRoute.contextKey)) || "/" : void 0;
|
|
81
|
+
return new Map(Array.from(guardedRedirects, ([name, redirectTo]) => [name, redirectTo ?? defaultHref]));
|
|
82
|
+
}, [guardedRedirects, node]);
|
|
83
|
+
}
|
|
63
84
|
function withLayoutContext(Nav, processor, options) {
|
|
64
85
|
return withStaticProperties(React.forwardRef((propsIn, ref) => {
|
|
65
86
|
const {
|
|
@@ -69,17 +90,26 @@ function withLayoutContext(Nav, processor, options) {
|
|
|
69
90
|
const contextKey = useContextKey();
|
|
70
91
|
const {
|
|
71
92
|
screens,
|
|
72
|
-
protectedScreens
|
|
93
|
+
protectedScreens,
|
|
94
|
+
guardedRedirects
|
|
73
95
|
} = useFilterScreenChildren(children, {
|
|
74
96
|
contextKey
|
|
75
97
|
});
|
|
76
|
-
|
|
98
|
+
const resolvedGuardedRedirects = useResolvedGuardedRedirects(guardedRedirects);
|
|
99
|
+
registerProtectedRoutes(contextKey, resolvedGuardedRedirects);
|
|
100
|
+
const currentPathname = routeInfo?.pathname;
|
|
101
|
+
const protectedHref = currentPathname ? resolveProtectedHref(currentPathname) : currentPathname;
|
|
77
102
|
React.useEffect(() => {
|
|
78
|
-
registerProtectedRoutes(contextKey,
|
|
103
|
+
registerProtectedRoutes(contextKey, resolvedGuardedRedirects);
|
|
79
104
|
return () => {
|
|
80
105
|
unregisterProtectedRoutes(contextKey);
|
|
81
106
|
};
|
|
82
|
-
}, [contextKey,
|
|
107
|
+
}, [contextKey, resolvedGuardedRedirects]);
|
|
108
|
+
React.useEffect(() => {
|
|
109
|
+
if (currentPathname && protectedHref && protectedHref !== currentPathname) {
|
|
110
|
+
replace(protectedHref);
|
|
111
|
+
}
|
|
112
|
+
}, [currentPathname, protectedHref]);
|
|
83
113
|
const processed = processor ? processor(screens ?? []) : screens;
|
|
84
114
|
const sorted = useSortedScreens(processed ?? [], {
|
|
85
115
|
onlyMatching: true,
|
|
@@ -99,5 +129,5 @@ function withLayoutContext(Nav, processor, options) {
|
|
|
99
129
|
Screen
|
|
100
130
|
});
|
|
101
131
|
}
|
|
102
|
-
export { useFilterScreenChildren, withLayoutContext };
|
|
132
|
+
export { useFilterScreenChildren, useResolvedGuardedRedirects, withLayoutContext };
|
|
103
133
|
//# sourceMappingURL=withLayoutContext.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useContextKey","registerProtectedRoutes","unregisterProtectedRoutes","useSortedScreens","withStaticProperties","isProtectedElement","Screen","StackScreen","jsx","useFilterScreenChildren","children","isCustomNavigator","contextKey","useMemo","customChildren","screens","protectedScreens","Set","flattenChild","child","exclude","isValidElement","type","props","name","Error","process","env","NODE_ENV","some","key","screenProps","add","push","
|
|
1
|
+
{"version":3,"names":["React","getContextKey","stripInvisibleSegmentsFromPath","useContextKey","useRouteNode","registerProtectedRoutes","replace","resolveProtectedHref","routeInfo","unregisterProtectedRoutes","useSortedScreens","sortRoutesWithInitial","withStaticProperties","isProtectedElement","Screen","StackScreen","jsx","useFilterScreenChildren","children","isCustomNavigator","contextKey","useMemo","customChildren","screens","protectedScreens","Set","guardedRedirects","Map","flattenChild","child","exclude","redirectTo","isValidElement","type","props","name","Error","process","env","NODE_ENV","some","key","screenProps","add","set","push","guardFails","guard","excludeChildren","childRedirectTo","Children","forEach","nested","console","warn","names","map","screen","size","length","useResolvedGuardedRedirects","node","defaultRoute","sort","initialRouteName","find","normalized","route","has","defaultHref","Array","from","withLayoutContext","Nav","processor","options","forwardRef","propsIn","ref","resolvedGuardedRedirects","currentPathname","pathname","protectedHref","useEffect","processed","sorted","onlyMatching","id"],"sources":["../../../src/layouts/withLayoutContext.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import React from "react";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { getContextKey, stripInvisibleSegmentsFromPath } from "../router/matchers.native.js";
|
|
4
|
+
import { useContextKey, useRouteNode } from "../router/Route.native.js";
|
|
5
|
+
import { registerProtectedRoutes, replace, resolveProtectedHref, routeInfo, unregisterProtectedRoutes } from "../router/router.native.js";
|
|
5
6
|
import { useSortedScreens } from "../router/useScreens.native.js";
|
|
7
|
+
import { sortRoutesWithInitial } from "../router/sortRoutes.native.js";
|
|
6
8
|
import { withStaticProperties } from "../utils/withStaticProperties.native.js";
|
|
7
9
|
import { isProtectedElement } from "../views/Protected.native.js";
|
|
8
10
|
import { Screen } from "../views/Screen.native.js";
|
|
@@ -22,8 +24,10 @@ function useFilterScreenChildren(children) {
|
|
|
22
24
|
var customChildren = [];
|
|
23
25
|
var screens = [];
|
|
24
26
|
var protectedScreens = /* @__PURE__ */new Set();
|
|
27
|
+
var guardedRedirects = /* @__PURE__ */new Map();
|
|
25
28
|
function flattenChild(child) {
|
|
26
|
-
var exclude = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false
|
|
29
|
+
var exclude = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false,
|
|
30
|
+
redirectTo = arguments.length > 2 ? arguments[2] : void 0;
|
|
27
31
|
if (/* @__PURE__ */React.isValidElement(child) && (child.type === Screen || child.type === StackScreen)) {
|
|
28
32
|
if (_type_of(child.props) === "object" && child.props && "name" in child.props && !child.props.name) {
|
|
29
33
|
throw new Error(`<Screen /> component in \`default export\` at \`app${contextKey}/_layout\` must have a \`name\` prop when used as a child of a Layout Route.`);
|
|
@@ -38,15 +42,18 @@ function useFilterScreenChildren(children) {
|
|
|
38
42
|
var screenProps = child.props;
|
|
39
43
|
if (exclude && screenProps.name) {
|
|
40
44
|
protectedScreens.add(screenProps.name);
|
|
45
|
+
guardedRedirects.set(screenProps.name, redirectTo);
|
|
41
46
|
} else {
|
|
42
47
|
screens.push(screenProps);
|
|
43
48
|
}
|
|
44
49
|
return;
|
|
45
50
|
}
|
|
46
51
|
if (isProtectedElement(child)) {
|
|
47
|
-
var
|
|
52
|
+
var guardFails = !child.props.guard;
|
|
53
|
+
var excludeChildren = exclude || guardFails;
|
|
54
|
+
var childRedirectTo = guardFails ? child.props.redirectTo : redirectTo;
|
|
48
55
|
React.Children.forEach(child.props.children, function (nested) {
|
|
49
|
-
flattenChild(nested, excludeChildren);
|
|
56
|
+
flattenChild(nested, excludeChildren, childRedirectTo);
|
|
50
57
|
});
|
|
51
58
|
return;
|
|
52
59
|
}
|
|
@@ -70,10 +77,28 @@ function useFilterScreenChildren(children) {
|
|
|
70
77
|
return {
|
|
71
78
|
screens,
|
|
72
79
|
children: customChildren,
|
|
73
|
-
protectedScreens
|
|
80
|
+
protectedScreens,
|
|
81
|
+
guardedRedirects
|
|
74
82
|
};
|
|
75
83
|
}, [children, contextKey, isCustomNavigator]);
|
|
76
84
|
}
|
|
85
|
+
function useResolvedGuardedRedirects(guardedRedirects) {
|
|
86
|
+
var node = useRouteNode();
|
|
87
|
+
return React.useMemo(function () {
|
|
88
|
+
if (!node) {
|
|
89
|
+
return guardedRedirects;
|
|
90
|
+
}
|
|
91
|
+
var defaultRoute = [...node.children].sort(sortRoutesWithInitial(node.initialRouteName)).find(function (child) {
|
|
92
|
+
var normalized = child.route.replace(/\/index$/, "");
|
|
93
|
+
return !(guardedRedirects.has(child.route) || guardedRedirects.has(normalized));
|
|
94
|
+
});
|
|
95
|
+
var defaultHref = defaultRoute ? stripInvisibleSegmentsFromPath(getContextKey(defaultRoute.contextKey)) || "/" : void 0;
|
|
96
|
+
return new Map(Array.from(guardedRedirects, function (param) {
|
|
97
|
+
var [name, redirectTo] = param;
|
|
98
|
+
return [name, redirectTo !== null && redirectTo !== void 0 ? redirectTo : defaultHref];
|
|
99
|
+
}));
|
|
100
|
+
}, [guardedRedirects, node]);
|
|
101
|
+
}
|
|
77
102
|
function withLayoutContext(Nav, processor, options) {
|
|
78
103
|
return withStaticProperties(/* @__PURE__ */React.forwardRef(function (propsIn, ref) {
|
|
79
104
|
var {
|
|
@@ -83,17 +108,26 @@ function withLayoutContext(Nav, processor, options) {
|
|
|
83
108
|
var contextKey = useContextKey();
|
|
84
109
|
var {
|
|
85
110
|
screens,
|
|
86
|
-
protectedScreens
|
|
111
|
+
protectedScreens,
|
|
112
|
+
guardedRedirects
|
|
87
113
|
} = useFilterScreenChildren(children, {
|
|
88
114
|
contextKey
|
|
89
115
|
});
|
|
90
|
-
|
|
116
|
+
var resolvedGuardedRedirects = useResolvedGuardedRedirects(guardedRedirects);
|
|
117
|
+
registerProtectedRoutes(contextKey, resolvedGuardedRedirects);
|
|
118
|
+
var currentPathname = routeInfo === null || routeInfo === void 0 ? void 0 : routeInfo.pathname;
|
|
119
|
+
var protectedHref = currentPathname ? resolveProtectedHref(currentPathname) : currentPathname;
|
|
91
120
|
React.useEffect(function () {
|
|
92
|
-
registerProtectedRoutes(contextKey,
|
|
121
|
+
registerProtectedRoutes(contextKey, resolvedGuardedRedirects);
|
|
93
122
|
return function () {
|
|
94
123
|
unregisterProtectedRoutes(contextKey);
|
|
95
124
|
};
|
|
96
|
-
}, [contextKey,
|
|
125
|
+
}, [contextKey, resolvedGuardedRedirects]);
|
|
126
|
+
React.useEffect(function () {
|
|
127
|
+
if (currentPathname && protectedHref && protectedHref !== currentPathname) {
|
|
128
|
+
replace(protectedHref);
|
|
129
|
+
}
|
|
130
|
+
}, [currentPathname, protectedHref]);
|
|
97
131
|
var processed = processor ? processor(screens !== null && screens !== void 0 ? screens : []) : screens;
|
|
98
132
|
var sorted = useSortedScreens(processed !== null && processed !== void 0 ? processed : [], {
|
|
99
133
|
onlyMatching: true,
|
|
@@ -113,5 +147,5 @@ function withLayoutContext(Nav, processor, options) {
|
|
|
113
147
|
Screen
|
|
114
148
|
});
|
|
115
149
|
}
|
|
116
|
-
export { useFilterScreenChildren, withLayoutContext };
|
|
150
|
+
export { useFilterScreenChildren, useResolvedGuardedRedirects, withLayoutContext };
|
|
117
151
|
//# sourceMappingURL=withLayoutContext.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["jsx","_jsx","React","useContextKey","registerProtectedRoutes","unregisterProtectedRoutes","useSortedScreens","withStaticProperties","isProtectedElement","Screen","StackScreen","_type_of","obj","Symbol","constructor","useFilterScreenChildren","children","isCustomNavigator","contextKey","arguments","length","useMemo","customChildren","screens","protectedScreens","Set","flattenChild","child","exclude","isValidElement","type","props","name","Error","process","env","NODE_ENV","some","key","screenProps","add","push","
|
|
1
|
+
{"version":3,"names":["jsx","_jsx","React","getContextKey","stripInvisibleSegmentsFromPath","useContextKey","useRouteNode","registerProtectedRoutes","replace","resolveProtectedHref","routeInfo","unregisterProtectedRoutes","useSortedScreens","sortRoutesWithInitial","withStaticProperties","isProtectedElement","Screen","StackScreen","_type_of","obj","Symbol","constructor","useFilterScreenChildren","children","isCustomNavigator","contextKey","arguments","length","useMemo","customChildren","screens","protectedScreens","Set","guardedRedirects","Map","flattenChild","child","exclude","redirectTo","isValidElement","type","props","name","Error","process","env","NODE_ENV","some","key","screenProps","add","set","push","guardFails","guard","excludeChildren","childRedirectTo","Children","forEach","nested","console","warn","names","map","screen","size","useResolvedGuardedRedirects","node","defaultRoute","sort","initialRouteName","find","normalized","route","has","defaultHref","Array","from","param","withLayoutContext","Nav","processor","options","forwardRef","propsIn","ref","resolvedGuardedRedirects","currentPathname","pathname","protectedHref","useEffect","processed"],"sources":["../../../src/layouts/withLayoutContext.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import TestRenderer, { act } from "react-test-renderer";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { Protected } from "../views/Protected.mjs";
|
|
4
|
+
import { Screen } from "../views/Screen.mjs";
|
|
5
|
+
import { useFilterScreenChildren } from "./withLayoutContext.mjs";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
function readGuardedRedirects(children) {
|
|
8
|
+
let result;
|
|
9
|
+
function Capture() {
|
|
10
|
+
result = useFilterScreenChildren(children);
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
act(() => {
|
|
14
|
+
TestRenderer.create(/* @__PURE__ */jsx(Capture, {}));
|
|
15
|
+
});
|
|
16
|
+
return result.guardedRedirects;
|
|
17
|
+
}
|
|
18
|
+
describe("Protected redirectTo", () => {
|
|
19
|
+
it("associates a failed guard redirect with each protected screen", () => {
|
|
20
|
+
const redirects = readGuardedRedirects(/* @__PURE__ */jsxs(Protected, {
|
|
21
|
+
guard: false,
|
|
22
|
+
redirectTo: "/login",
|
|
23
|
+
children: [/* @__PURE__ */jsx(Screen, {
|
|
24
|
+
name: "dashboard"
|
|
25
|
+
}), /* @__PURE__ */jsx(Screen, {
|
|
26
|
+
name: "settings"
|
|
27
|
+
})]
|
|
28
|
+
}));
|
|
29
|
+
expect(Array.from(redirects)).toEqual([["dashboard", "/login"], ["settings", "/login"]]);
|
|
30
|
+
});
|
|
31
|
+
it("uses the innermost failing guard redirect", () => {
|
|
32
|
+
const redirects = readGuardedRedirects(/* @__PURE__ */jsx(Protected, {
|
|
33
|
+
guard: false,
|
|
34
|
+
redirectTo: "/login",
|
|
35
|
+
children: /* @__PURE__ */jsx(Protected, {
|
|
36
|
+
guard: false,
|
|
37
|
+
redirectTo: "/subscribe",
|
|
38
|
+
children: /* @__PURE__ */jsx(Screen, {
|
|
39
|
+
name: "premium"
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
}));
|
|
43
|
+
expect(redirects.get("premium")).toBe("/subscribe");
|
|
44
|
+
});
|
|
45
|
+
it("inherits a failed parent redirect through a passing child guard", () => {
|
|
46
|
+
const redirects = readGuardedRedirects(/* @__PURE__ */jsx(Protected, {
|
|
47
|
+
guard: false,
|
|
48
|
+
redirectTo: "/login",
|
|
49
|
+
children: /* @__PURE__ */jsx(Protected, {
|
|
50
|
+
guard: true,
|
|
51
|
+
children: /* @__PURE__ */jsx(Screen, {
|
|
52
|
+
name: "account"
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
}));
|
|
56
|
+
expect(redirects.get("account")).toBe("/login");
|
|
57
|
+
});
|
|
58
|
+
it("ignores redirectTo on a passing parent guard", () => {
|
|
59
|
+
const redirects = readGuardedRedirects(/* @__PURE__ */jsx(Protected, {
|
|
60
|
+
guard: true,
|
|
61
|
+
redirectTo: "/login",
|
|
62
|
+
children: /* @__PURE__ */jsx(Protected, {
|
|
63
|
+
guard: false,
|
|
64
|
+
children: /* @__PURE__ */jsx(Screen, {
|
|
65
|
+
name: "account"
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
}));
|
|
69
|
+
expect(redirects.has("account")).toBe(true);
|
|
70
|
+
expect(redirects.get("account")).toBeUndefined();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=withLayoutContext.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TestRenderer","act","describe","expect","it","Protected","Screen","useFilterScreenChildren","jsx","jsxs","readGuardedRedirects","children","result","Capture","create","guardedRedirects","redirects","guard","redirectTo","name","Array","from","toEqual","get","toBe","has","toBeUndefined"],"sources":["../../../src/layouts/withLayoutContext.test.tsx"],"sourcesContent":[null],"mappings":"AACA,OAAOA,YAAA,IAAgBC,GAAA,QAAW;AAClC,SAASC,QAAA,EAAUC,MAAA,EAAQC,EAAA,QAAU;AACrC,SAASC,SAAA,QAAiB;AAC1B,SAASC,MAAA,QAAc;AACvB,SAASC,uBAAA,QAA+B;AAWhB,SAAAC,GAAA,EASlBC,IAAA,QATkB;AATxB,SAASC,qBAAqBC,QAAA,EAA2B;EACvD,IAAIC,MAAA;EAEJ,SAASC,QAAA,EAAU;IACjBD,MAAA,GAASL,uBAAA,CAAwBI,QAAQ;IACzC,OAAO;EACT;EAEAV,GAAA,CAAI,MAAM;IACRD,YAAA,CAAac,MAAA,CAAO,eAAAN,GAAA,CAACK,OAAA,IAAQ,CAAE;EACjC,CAAC;EAED,OAAOD,MAAA,CAAQG,gBAAA;AACjB;AAEAb,QAAA,CAAS,wBAAwB,MAAM;EACrCE,EAAA,CAAG,iEAAiE,MAAM;IACxE,MAAMY,SAAA,GAAYN,oBAAA,CAChB,eAAAD,IAAA,CAACJ,SAAA;MAAUY,KAAA,EAAO;MAAOC,UAAA,EAAW;MAClCP,QAAA,kBAAAH,GAAA,CAACF,MAAA;QAAOa,IAAA,EAAK;MAAA,CAAY,GACzB,eAAAX,GAAA,CAACF,MAAA;QAAOa,IAAA,EAAK;MAAA,CAAW;IAAA,CAC1B,CACF;IAEAhB,MAAA,CAAOiB,KAAA,CAAMC,IAAA,CAAKL,SAAS,CAAC,EAAEM,OAAA,CAAQ,CACpC,CAAC,aAAa,QAAQ,GACtB,CAAC,YAAY,QAAQ,EACtB;EACH,CAAC;EAEDlB,EAAA,CAAG,6CAA6C,MAAM;IACpD,MAAMY,SAAA,GAAYN,oBAAA,CAChB,eAAAF,GAAA,CAACH,SAAA;MAAUY,KAAA,EAAO;MAAOC,UAAA,EAAW;MAClCP,QAAA,iBAAAH,GAAA,CAACH,SAAA;QAAUY,KAAA,EAAO;QAAOC,UAAA,EAAW;QAClCP,QAAA,iBAAAH,GAAA,CAACF,MAAA;UAAOa,IAAA,EAAK;QAAA,CAAU;MAAA,CACzB;IAAA,CACF,CACF;IAEAhB,MAAA,CAAOa,SAAA,CAAUO,GAAA,CAAI,SAAS,CAAC,EAAEC,IAAA,CAAK,YAAY;EACpD,CAAC;EAEDpB,EAAA,CAAG,mEAAmE,MAAM;IAC1E,MAAMY,SAAA,GAAYN,oBAAA,CAChB,eAAAF,GAAA,CAACH,SAAA;MAAUY,KAAA,EAAO;MAAOC,UAAA,EAAW;MAClCP,QAAA,iBAAAH,GAAA,CAACH,SAAA;QAAUY,KAAA,EAAK;QACdN,QAAA,iBAAAH,GAAA,CAACF,MAAA;UAAOa,IAAA,EAAK;QAAA,CAAU;MAAA,CACzB;IAAA,CACF,CACF;IAEAhB,MAAA,CAAOa,SAAA,CAAUO,GAAA,CAAI,SAAS,CAAC,EAAEC,IAAA,CAAK,QAAQ;EAChD,CAAC;EAEDpB,EAAA,CAAG,gDAAgD,MAAM;IACvD,MAAMY,SAAA,GAAYN,oBAAA,CAChB,eAAAF,GAAA,CAACH,SAAA;MAAUY,KAAA,EAAK;MAACC,UAAA,EAAW;MAC1BP,QAAA,iBAAAH,GAAA,CAACH,SAAA;QAAUY,KAAA,EAAO;QAChBN,QAAA,iBAAAH,GAAA,CAACF,MAAA;UAAOa,IAAA,EAAK;QAAA,CAAU;MAAA,CACzB;IAAA,CACF,CACF;IAEAhB,MAAA,CAAOa,SAAA,CAAUS,GAAA,CAAI,SAAS,CAAC,EAAED,IAAA,CAAK,IAAI;IAC1CrB,MAAA,CAAOa,SAAA,CAAUO,GAAA,CAAI,SAAS,CAAC,EAAEG,aAAA,CAAc;EACjD,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import TestRenderer, { act } from "react-test-renderer";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { Protected } from "../views/Protected.native.js";
|
|
6
|
+
import { Screen } from "../views/Screen.native.js";
|
|
7
|
+
import { useFilterScreenChildren } from "./withLayoutContext.native.js";
|
|
8
|
+
function readGuardedRedirects(children) {
|
|
9
|
+
var result;
|
|
10
|
+
function Capture() {
|
|
11
|
+
result = useFilterScreenChildren(children);
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
act(function () {
|
|
15
|
+
TestRenderer.create(/* @__PURE__ */_jsx(Capture, {}));
|
|
16
|
+
});
|
|
17
|
+
return result.guardedRedirects;
|
|
18
|
+
}
|
|
19
|
+
describe("Protected redirectTo", function () {
|
|
20
|
+
it("associates a failed guard redirect with each protected screen", function () {
|
|
21
|
+
var redirects = readGuardedRedirects(/* @__PURE__ */_jsxs(Protected, {
|
|
22
|
+
guard: false,
|
|
23
|
+
redirectTo: "/login",
|
|
24
|
+
children: [/* @__PURE__ */_jsx(Screen, {
|
|
25
|
+
name: "dashboard"
|
|
26
|
+
}), /* @__PURE__ */_jsx(Screen, {
|
|
27
|
+
name: "settings"
|
|
28
|
+
})]
|
|
29
|
+
}));
|
|
30
|
+
expect(Array.from(redirects)).toEqual([["dashboard", "/login"], ["settings", "/login"]]);
|
|
31
|
+
});
|
|
32
|
+
it("uses the innermost failing guard redirect", function () {
|
|
33
|
+
var redirects = readGuardedRedirects(/* @__PURE__ */_jsx(Protected, {
|
|
34
|
+
guard: false,
|
|
35
|
+
redirectTo: "/login",
|
|
36
|
+
children: /* @__PURE__ */_jsx(Protected, {
|
|
37
|
+
guard: false,
|
|
38
|
+
redirectTo: "/subscribe",
|
|
39
|
+
children: /* @__PURE__ */_jsx(Screen, {
|
|
40
|
+
name: "premium"
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
}));
|
|
44
|
+
expect(redirects.get("premium")).toBe("/subscribe");
|
|
45
|
+
});
|
|
46
|
+
it("inherits a failed parent redirect through a passing child guard", function () {
|
|
47
|
+
var redirects = readGuardedRedirects(/* @__PURE__ */_jsx(Protected, {
|
|
48
|
+
guard: false,
|
|
49
|
+
redirectTo: "/login",
|
|
50
|
+
children: /* @__PURE__ */_jsx(Protected, {
|
|
51
|
+
guard: true,
|
|
52
|
+
children: /* @__PURE__ */_jsx(Screen, {
|
|
53
|
+
name: "account"
|
|
54
|
+
})
|
|
55
|
+
})
|
|
56
|
+
}));
|
|
57
|
+
expect(redirects.get("account")).toBe("/login");
|
|
58
|
+
});
|
|
59
|
+
it("ignores redirectTo on a passing parent guard", function () {
|
|
60
|
+
var redirects = readGuardedRedirects(/* @__PURE__ */_jsx(Protected, {
|
|
61
|
+
guard: true,
|
|
62
|
+
redirectTo: "/login",
|
|
63
|
+
children: /* @__PURE__ */_jsx(Protected, {
|
|
64
|
+
guard: false,
|
|
65
|
+
children: /* @__PURE__ */_jsx(Screen, {
|
|
66
|
+
name: "account"
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
}));
|
|
70
|
+
expect(redirects.has("account")).toBe(true);
|
|
71
|
+
expect(redirects.get("account")).toBeUndefined();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=withLayoutContext.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["jsx","_jsx","jsxs","_jsxs","React","TestRenderer","act","describe","expect","it","Protected","Screen","useFilterScreenChildren","readGuardedRedirects","children","result","Capture","create","guardedRedirects","redirects","guard","redirectTo","name","Array","from","toEqual"],"sources":["../../../src/layouts/withLayoutContext.test.tsx"],"sourcesContent":[null],"mappings":"AACA,SAAOA,GAAA,IAAAC,IAAA,EAAAC,IAAgB,IAAAC,KAAW;AAClC,OAAAC,KAAS,aAAU;AACnB,OAAAC,YAAS,IAAAC,GAAiB;AAC1B,SAASC,QAAA,EAAAC,MAAc,EAAAC,EAAA;AACvB,SAASC,SAAA,sCAA+B;AAWhB,SAAAC,MASlB,mCATkB;AATxB,SAASC,uBAAqB,QAA2B;AACvD,SAAIC,qBAAAC,QAAA;EAEJ,IAAAC,MAAS;EACP,SAAAC,OAASA,CAAA;IACTD,MAAA,GAAOH,uBAAA,CAAAE,QAAA;IACT;EAEA;EACER,GAAA,aAAa;IACdD,YAAA,CAAAY,MAAA,gBAAAhB,IAAA,CAAAe,OAAA;EAED;EACF,OAAAD,MAAA,CAAAG,gBAAA;AAEA;AACEX,QAAG;EACDE,EAAA,gEAAkB;IAAA,IAChBU,SAAA,GAAAN,oBAAW,gBAAcV,KAAA,CAAAO,SAAW;MAClCU,KAAA;MAAyBC,UACzB;MAAwBP,QAC1B,GACF,eAAAb,IAAA,CAAAU,MAAA;QAEAW,IAAO;MACJ,IACA,eAAYrB,IAAQ,CAAAU,MAAA;QACtBW,IAAA;MACF;IAGC;IAAkBd,MAChB,CAAAe,KAAA,CAAAC,IAAA,CAAAL,SAAC,GAAAM,OAAU,EAKb,CAEA,WAAO,EACR,SAEE,EACD,CACE,YAKF,SAEA,CACD;EAED;EACEhB,EAAA,4CAAkB;IAAA,IAChBU,SAAA,GAAAN,oBAAW,gBAAMZ,IAAA,CAAAS,SAAW;MAK9BU,KAAA;MAEAC,UAAO,UAAc;MACrBP,QAAO,iBAAcb,IAAU,CAAES,SAAA;QAClCU,KAAA;QACFC,UAAA","ignoreList":[]}
|
|
@@ -9,8 +9,10 @@ import { RouteInfoContextProvider } from "./RouteInfoContext.mjs";
|
|
|
9
9
|
import { jsx } from "react/jsx-runtime";
|
|
10
10
|
const RouteParamsContext = createContext({});
|
|
11
11
|
const CurrentRouteContext = React.createContext(null);
|
|
12
|
+
const SuspenseFallbackContext = createContext(void 0);
|
|
12
13
|
if (process.env.NODE_ENV !== "production") {
|
|
13
14
|
CurrentRouteContext.displayName = "RouteNode";
|
|
15
|
+
SuspenseFallbackContext.displayName = "SuspenseFallback";
|
|
14
16
|
}
|
|
15
17
|
function useRouteNode() {
|
|
16
18
|
return useContext(CurrentRouteContext);
|
|
@@ -58,5 +60,5 @@ function Route({
|
|
|
58
60
|
})
|
|
59
61
|
});
|
|
60
62
|
}
|
|
61
|
-
export { Route, RouteParamsContext, useContextKey, useRouteNode };
|
|
63
|
+
export { Route, RouteParamsContext, SuspenseFallbackContext, useContextKey, useRouteNode };
|
|
62
64
|
//# sourceMappingURL=Route.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","createContext","useContext","findFocusedRoute","getResolvedLinking","getContextKey","mergeDynamicParams","getPathWithRecoveredDynamicSegment","routeInfo","RouteInfoContextProvider","jsx","RouteParamsContext","CurrentRouteContext","process","env","NODE_ENV","displayName","useRouteNode","useContextKey","node","Error","contextKey","getParamsFromCurrentUrl","route","linking","getStateFromPath","path","unstable_globalHref","state","config","focused","params","Route","children","parentParams","resolvedParams","useMemo","rp","ownParams","dynamic","length","Provider","value"],"sources":["../../../src/router/Route.tsx"],"sourcesContent":[null],"mappings":"AAAA,OAAOA,KAAA,IAASC,aAAA,EAA+BC,UAAA,QAAkB;AACjE,SAASC,gBAAA,QAAwB;
|
|
1
|
+
{"version":3,"names":["React","createContext","useContext","findFocusedRoute","getResolvedLinking","getContextKey","mergeDynamicParams","getPathWithRecoveredDynamicSegment","routeInfo","RouteInfoContextProvider","jsx","RouteParamsContext","CurrentRouteContext","SuspenseFallbackContext","process","env","NODE_ENV","displayName","useRouteNode","useContextKey","node","Error","contextKey","getParamsFromCurrentUrl","route","linking","getStateFromPath","path","unstable_globalHref","state","config","focused","params","Route","children","parentParams","resolvedParams","useMemo","rp","ownParams","dynamic","length","Provider","value"],"sources":["../../../src/router/Route.tsx"],"sourcesContent":[null],"mappings":"AAAA,OAAOA,KAAA,IAASC,aAAA,EAA+BC,UAAA,QAAkB;AACjE,SAASC,gBAAA,QAAwB;AAMjC,SAASC,kBAAA,QAA0B;AACnC,SAASC,aAAA,QAAqB;AAC9B,SAASC,kBAAA,QAA0B;AACnC,SAASC,kCAAA,QAA0C;AACnD,SAASC,SAAA,QAAiB;AAC1B,SAASC,wBAAA,QAAgC;AA0MjC,SAAAC,GAAA;AA5FD,MAAMC,kBAAA,GAAqBV,aAAA,CAEhC,CAAC,CAAC;AAEJ,MAAMW,mBAAA,GAAsBZ,KAAA,CAAMC,aAAA,CAAgC,IAAI;AAG/D,MAAMY,uBAAA,GAA0BZ,aAAA,CAErC,MAAS;AAEX,IAAIa,OAAA,CAAQC,GAAA,CAAIC,QAAA,KAAa,cAAc;EACzCJ,mBAAA,CAAoBK,WAAA,GAAc;EAClCJ,uBAAA,CAAwBI,WAAA,GAAc;AACxC;AAGO,SAASC,aAAA,EAAiC;EAC/C,OAAOhB,UAAA,CAAWU,mBAAmB;AACvC;AAEO,SAASO,cAAA,EAAwB;EACtC,MAAMC,IAAA,GAAOF,YAAA,CAAa;EAC1B,IAAIE,IAAA,IAAQ,MAAM;IAChB,MAAM,IAAIC,KAAA,CAAM,oDAAoD;EACtE;EACA,OAAOhB,aAAA,CAAce,IAAA,CAAKE,UAAU;AACtC;AAWA,SAASC,wBAAwBC,KAAA,EAGG;EAClC,MAAMC,OAAA,GAAUrB,kBAAA,CAAmB;EACnC,IAAI,CAACqB,OAAA,EAASC,gBAAA,EAAkB,OAAO;EACvC,MAAMC,IAAA,GAAOpB,kCAAA,CAAmC,CAC9CC,SAAA,EAAWoB,mBAAA,EACXJ,KAAA,EAAOG,IAAA,CACR;EACD,IAAI,CAACA,IAAA,EAAM,OAAO;EAClB,MAAME,KAAA,GAAQJ,OAAA,CAAQC,gBAAA,CAAiBC,IAAA,EAAMF,OAAA,CAAQK,MAAM;EAC3D,IAAI,CAACD,KAAA,EAAO,OAAO;EACnB,MAAME,OAAA,GAAU5B,gBAAA,CAAiB0B,KAAK;EACtC,OAAOE,OAAA,EAASC,MAAA;AAClB;AAGO,SAASC,MAAM;EACpBC,QAAA;EACAd,IAAA;EACAI;AACF,GAOG;EACD,MAAMW,YAAA,GAAejC,UAAA,CAAWS,kBAAkB;EAUlD,MAAMyB,cAAA,GAAiBpC,KAAA,CAAMqC,OAAA,CAAQ,MAAM;IACzC,MAAMC,EAAA,GAAKd,KAAA,EAAOQ,MAAA;IAClB,MAAMO,SAAA,GAAYnB,IAAA,CAAKoB,OAAA,EAASC,MAAA,GAC5BnC,kBAAA,CAAmBgC,EAAA,EAAIlB,IAAA,CAAKoB,OAAA,EAASjB,uBAAA,CAAwBC,KAAK,CAAC,IACnEc,EAAA;IAEJ,IAAI,CAACH,YAAA,EAAc,OAAOI,SAAA;IAC1B,IAAI,CAACA,SAAA,EAAW,OAAOJ,YAAA;IACvB,OAAO;MAAE,GAAGA,YAAA;MAAc,GAAGI;IAAU;EACzC,GAAG,CAACnB,IAAA,EAAMe,YAAA,EAAcX,KAAA,EAAOhB,SAAA,EAAWoB,mBAAmB,CAAC;EAE9D,OACE,eAAAlB,GAAA,CAACC,kBAAA,CAAmB+B,QAAA,EAAnB;IAA4BC,KAAA,EAAOP,cAAA;IAClCF,QAAA,iBAAAxB,GAAA,CAACE,mBAAA,CAAoB8B,QAAA,EAApB;MAA6BC,KAAA,EAAOvB,IAAA;MACnCc,QAAA,iBAAAxB,GAAA,CAACD,wBAAA;QAA0ByB;MAAA,CAAS;IAAA,CACtC;EAAA,CACF;AAEJ","ignoreList":[]}
|
|
@@ -9,8 +9,10 @@ import { routeInfo } from "./router.native.js";
|
|
|
9
9
|
import { RouteInfoContextProvider } from "./RouteInfoContext.native.js";
|
|
10
10
|
var RouteParamsContext = /* @__PURE__ */createContext({});
|
|
11
11
|
var CurrentRouteContext = /* @__PURE__ */React.createContext(null);
|
|
12
|
+
var SuspenseFallbackContext = /* @__PURE__ */createContext(void 0);
|
|
12
13
|
if (process.env.NODE_ENV !== "production") {
|
|
13
14
|
CurrentRouteContext.displayName = "RouteNode";
|
|
15
|
+
SuspenseFallbackContext.displayName = "SuspenseFallback";
|
|
14
16
|
}
|
|
15
17
|
function useRouteNode() {
|
|
16
18
|
return useContext(CurrentRouteContext);
|
|
@@ -60,5 +62,5 @@ function Route(param) {
|
|
|
60
62
|
})
|
|
61
63
|
});
|
|
62
64
|
}
|
|
63
|
-
export { Route, RouteParamsContext, useContextKey, useRouteNode };
|
|
65
|
+
export { Route, RouteParamsContext, SuspenseFallbackContext, useContextKey, useRouteNode };
|
|
64
66
|
//# sourceMappingURL=Route.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["jsx","_jsx","React","createContext","useContext","findFocusedRoute","getResolvedLinking","getContextKey","mergeDynamicParams","getPathWithRecoveredDynamicSegment","routeInfo","RouteInfoContextProvider","RouteParamsContext","CurrentRouteContext","process","env","NODE_ENV","displayName","useRouteNode","useContextKey","node","Error","contextKey","getParamsFromCurrentUrl","route","linking","getStateFromPath","path","unstable_globalHref","state","config","focused","params","Route","param","children","parentParams","resolvedParams","useMemo","_node_dynamic","rp","ownParams","dynamic","length"],"sources":["../../../src/router/Route.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAAOA,GAAA,IAASC,IAAA,2BAA+B;AAC/C,OAAAC,KAAS,IAAAC,aAAA,EAAAC,UAAwB;
|
|
1
|
+
{"version":3,"names":["jsx","_jsx","React","createContext","useContext","findFocusedRoute","getResolvedLinking","getContextKey","mergeDynamicParams","getPathWithRecoveredDynamicSegment","routeInfo","RouteInfoContextProvider","RouteParamsContext","CurrentRouteContext","SuspenseFallbackContext","process","env","NODE_ENV","displayName","useRouteNode","useContextKey","node","Error","contextKey","getParamsFromCurrentUrl","route","linking","getStateFromPath","path","unstable_globalHref","state","config","focused","params","Route","param","children","parentParams","resolvedParams","useMemo","_node_dynamic","rp","ownParams","dynamic","length"],"sources":["../../../src/router/Route.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAAOA,GAAA,IAASC,IAAA,2BAA+B;AAC/C,OAAAC,KAAS,IAAAC,aAAA,EAAAC,UAAwB;AAMjC,SAASC,gBAAA,4CAA0B;AACnC,SAASC,kBAAA,QAAqB;AAC9B,SAASC,aAAA,8BAA0B;AACnC,SAASC,kBAAA;AACT,SAASC,kCAAiB;AAC1B,SAASC,SAAA;AA0MD,SAAAC,wBAAA;AA5FD,IAAAC,kBAAM,kBAEXT,aAAE;AAEJ,IAAAU,mBAAM,kBAA4BX,KAAA,CAAgCC,aAAI;AAG/D,IAAAW,uBAAM,kBAEXX,aAAS;AAEX,IAAIY,OAAA,CAAQC,GAAA,CAAIC,QAAA,KAAa,cAAc;EACzCJ,mBAAA,CAAoBK,WAAA,GAAc;EAClCJ,uBAAA,CAAwBI,WAAA,GAAc;AACxC;AAGO,SAASC,aAAA,EAAiC;EAC/C,OAAOf,UAAA,CAAWS,mBAAmB;AACvC;AAEO,SAASO,cAAA,EAAwB;EACtC,IAAAC,IAAM,GAAAF,YAAO;EACb,IAAIE,IAAA,IAAQ,MAAM;IAChB,MAAM,IAAIC,KAAA,CAAM,oDAAoD;EACtE;EACA,OAAOf,aAAA,CAAcc,IAAA,CAAKE,UAAU;AACtC;AAWA,SAASC,wBAAwBC,KAAA,EAGG;EAClC,IAAAC,OAAM,GAAApB,kBAAU;EAChB,IAAI,EAACoB,OAAA,KAAS,QAAAA,OAAkB,UAAO,aAAAA,OAAA,CAAAC,gBAAA;EACvC,IAAAC,IAAM,GAAAnB,kCAAO,EACXC,SAAA,KAAW,QAAAA,SAAA,uBAAAA,SAAA,CAAAmB,mBAAA,EACXJ,KAAA,KAAO,QAAAA,KAAA,uBAAAA,KAAA,CAAAG,IAAA,CACR;EACD,IAAI,CAACA,IAAA,EAAM,OAAO;EAClB,IAAAE,KAAM,GAAAJ,OAAQ,CAAAC,gBAAQ,CAAAC,IAAiB,EAAAF,OAAM,CAAAK,MAAQ;EACrD,IAAI,CAACD,KAAA,EAAO,OAAO;EACnB,IAAAE,OAAM,GAAA3B,gBAAU,CAAAyB,KAAiB;EACjC,OAAOE,OAAA,KAAS,QAAAA,OAAA,uBAAAA,OAAA,CAAAC,MAAA;AAClB;AAGO,SAASC,MAAMC,KAAA;EACpB;IAAAC,QAAA;IAAAf,IAAA;IAAAI;EAAA,IAAAU,KAAA;EACA,IAAAE,YAAA,GAAAjC,UAAA,CAAAQ,kBAAA;EACA,IAAA0B,cAAA,GAAApC,KAAA,CAAAqC,OAAA;IAQC,IAAAC,aAAA;IACD,IAAMC,EAAA,GAAAhB,KAAA,KAAe,QAAAA,KAAW,mBAAkB,IAAAA,KAAA,CAAAQ,MAAA;IAUlD,IAAMS,SAAA,KAAAF,aAAuB,GAAAnB,IAAQ,CAAAsB,OAAM,cAAAH,aAAA,uBAAAA,aAAA,CAAAI,MAAA,IAAApC,kBAAA,CAAAiC,EAAA,EAAApB,IAAA,CAAAsB,OAAA,EAAAnB,uBAAA,CAAAC,KAAA,KAAAgB,EAAA;IACzC,KAAAJ,YAAW,EAAO,OAAAK,SAAA;IAClB,KAAAA,SAAM,SAAiBL,YAAS;IAIhC,OAAK;MACL,GAAKA,YAAW;MAChB,GAAAK;IACF,CAAG;EAEH,IAOFrB,IAAA,E","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { isRouteProtected, registerProtectedRoutes, resolveProtectedHref, unregisterProtectedRoutes } from "./router.mjs";
|
|
3
|
+
const contextKey = "/account";
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
unregisterProtectedRoutes(contextKey);
|
|
6
|
+
});
|
|
7
|
+
describe("protected route redirects", () => {
|
|
8
|
+
it("resolves a protected href to its redirect target", () => {
|
|
9
|
+
registerProtectedRoutes(contextKey, /* @__PURE__ */new Map([["settings", "/login"]]));
|
|
10
|
+
expect(isRouteProtected("/account/settings?tab=billing")).toBe(true);
|
|
11
|
+
expect(resolveProtectedHref("/account/settings?tab=billing")).toBe("/login");
|
|
12
|
+
});
|
|
13
|
+
it("blocks a protected href without an explicit target", () => {
|
|
14
|
+
registerProtectedRoutes(contextKey, /* @__PURE__ */new Map([["settings", void 0]]));
|
|
15
|
+
expect(resolveProtectedHref("/account/settings")).toBeUndefined();
|
|
16
|
+
});
|
|
17
|
+
it("leaves allowed and similarly prefixed routes unchanged", () => {
|
|
18
|
+
registerProtectedRoutes(contextKey, /* @__PURE__ */new Map([["settings", "/login"]]));
|
|
19
|
+
expect(resolveProtectedHref("/account/profile")).toBe("/account/profile");
|
|
20
|
+
expect(resolveProtectedHref("/accounting/settings")).toBe("/accounting/settings");
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=protectedRoutes.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["afterEach","describe","expect","it","isRouteProtected","registerProtectedRoutes","resolveProtectedHref","unregisterProtectedRoutes","contextKey","Map","toBe","toBeUndefined"],"sources":["../../../src/router/protectedRoutes.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,SAAA,EAAWC,QAAA,EAAUC,MAAA,EAAQC,EAAA,QAAU;AAChD,SACEC,gBAAA,EACAC,uBAAA,EACAC,oBAAA,EACAC,yBAAA,QACK;AAEP,MAAMC,UAAA,GAAa;AAEnBR,SAAA,CAAU,MAAM;EACdO,yBAAA,CAA0BC,UAAU;AACtC,CAAC;AAEDP,QAAA,CAAS,6BAA6B,MAAM;EAC1CE,EAAA,CAAG,oDAAoD,MAAM;IAC3DE,uBAAA,CAAwBG,UAAA,EAAY,mBAAIC,GAAA,CAAI,CAAC,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC;IAErEP,MAAA,CAAOE,gBAAA,CAAiB,+BAA+B,CAAC,EAAEM,IAAA,CAAK,IAAI;IACnER,MAAA,CAAOI,oBAAA,CAAqB,+BAA+B,CAAC,EAAEI,IAAA,CAAK,QAAQ;EAC7E,CAAC;EAEDP,EAAA,CAAG,sDAAsD,MAAM;IAC7DE,uBAAA,CAAwBG,UAAA,EAAY,mBAAIC,GAAA,CAAI,CAAC,CAAC,YAAY,MAAS,CAAC,CAAC,CAAC;IAEtEP,MAAA,CAAOI,oBAAA,CAAqB,mBAAmB,CAAC,EAAEK,aAAA,CAAc;EAClE,CAAC;EAEDR,EAAA,CAAG,0DAA0D,MAAM;IACjEE,uBAAA,CAAwBG,UAAA,EAAY,mBAAIC,GAAA,CAAI,CAAC,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC;IAErEP,MAAA,CAAOI,oBAAA,CAAqB,kBAAkB,CAAC,EAAEI,IAAA,CAAK,kBAAkB;IACxER,MAAA,CAAOI,oBAAA,CAAqB,sBAAsB,CAAC,EAAEI,IAAA,CAAK,sBAAsB;EAClF,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { isRouteProtected, registerProtectedRoutes, resolveProtectedHref, unregisterProtectedRoutes } from "./router.native.js";
|
|
3
|
+
var contextKey = "/account";
|
|
4
|
+
afterEach(function () {
|
|
5
|
+
unregisterProtectedRoutes(contextKey);
|
|
6
|
+
});
|
|
7
|
+
describe("protected route redirects", function () {
|
|
8
|
+
it("resolves a protected href to its redirect target", function () {
|
|
9
|
+
registerProtectedRoutes(contextKey, /* @__PURE__ */new Map([["settings", "/login"]]));
|
|
10
|
+
expect(isRouteProtected("/account/settings?tab=billing")).toBe(true);
|
|
11
|
+
expect(resolveProtectedHref("/account/settings?tab=billing")).toBe("/login");
|
|
12
|
+
});
|
|
13
|
+
it("blocks a protected href without an explicit target", function () {
|
|
14
|
+
registerProtectedRoutes(contextKey, /* @__PURE__ */new Map([["settings", void 0]]));
|
|
15
|
+
expect(resolveProtectedHref("/account/settings")).toBeUndefined();
|
|
16
|
+
});
|
|
17
|
+
it("leaves allowed and similarly prefixed routes unchanged", function () {
|
|
18
|
+
registerProtectedRoutes(contextKey, /* @__PURE__ */new Map([["settings", "/login"]]));
|
|
19
|
+
expect(resolveProtectedHref("/account/profile")).toBe("/account/profile");
|
|
20
|
+
expect(resolveProtectedHref("/accounting/settings")).toBe("/accounting/settings");
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=protectedRoutes.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["afterEach","describe","expect","it","isRouteProtected","registerProtectedRoutes","resolveProtectedHref","unregisterProtectedRoutes","contextKey","Map","toBe","toBeUndefined"],"sources":["../../../src/router/protectedRoutes.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,SAAA,EAAWC,QAAA,EAAUC,MAAA,EAAQC,EAAA,QAAU;AAChD,SAAAC,gBAAA,EAAAC,uBAAA,EAAAC,oBAAA,EAAAC,yBAAA;AAAA,IACEC,UAAA;AAAAR,SACA;EACAO,yBAAA,CAAAC,UAAA;AAAA,EACA;AAAAP,QACK;EAEPE,EAAA,mDAAmB;IAEnBE,uBAAgB,CAAAG,UAAA,qBAAAC,GAAA,EACd,CACD,YAED,QAAS,CACJ,CACD;IAEAP,MAAA,CAAOE,gBAAA,CAAiB,+BAA+B,CAAC,EAAEM,IAAA,CAAK,IAAI;IACnER,MAAA,CAAOI,oBAAA,CAAqB,+BAA+B,CAAC,EAAEI,IAAA,CAAK,QAAQ;EAC7E,CAAC;EAEDP,EAAA,CAAG,sDAAsD,YAAM;IAC7DE,uBAAA,CAAwBG,UAAA,EAAY,mBAAIC,GAAA,CAAI,CAE5C,CACD,YAEE,OACD,CAEA;IACAP,MAAA,CAAOI,oBAAA,CAAqB,sBAAsBK,aAAQ;EAC5D,CAAC;EACFR,EAAA","ignoreList":[]}
|