@sigmela/router 0.5.0 → 0.7.0
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/CHANGELOG.md +16 -0
- package/README.md +32 -0
- package/dist/Router.d.ts +10 -1
- package/dist/Router.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +79 -24
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ All notable changes to this package are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
|
|
5
5
|
[semantic versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## 0.6.0
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `Router.Protected` supports an undecided guard: `when` accepts `'pending'`
|
|
12
|
+
(and `undefined`), which holds the matched URL and renders the new `pending`
|
|
13
|
+
node instead of redirecting. Apps that gate routes on asynchronously loaded
|
|
14
|
+
context can now keep deep links through boot; previously the only way to say
|
|
15
|
+
"not yet" was `false`, which redirected the visitor away.
|
|
16
|
+
- `RouterGuardState` is exported for typing guard values.
|
|
17
|
+
|
|
18
|
+
### Notes
|
|
19
|
+
|
|
20
|
+
- Existing `when={boolean}` guards are unaffected: `true` renders, `false`
|
|
21
|
+
redirects, exactly as before.
|
|
22
|
+
|
|
7
23
|
## 0.5.0
|
|
8
24
|
|
|
9
25
|
### Added
|
package/README.md
CHANGED
|
@@ -110,6 +110,38 @@ function ProductDetail({ product }) {
|
|
|
110
110
|
}
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
+
### Guards that are not decided yet
|
|
114
|
+
|
|
115
|
+
`Router.Protected` answers three states, not two. A guard whose `when` is
|
|
116
|
+
`false` redirects; a guard that is still resolving — `'pending'`, or
|
|
117
|
+
`undefined` so `when={user?.isAdmin}` works before the user loads — **holds the
|
|
118
|
+
URL** and renders its `pending` node instead of the subtree:
|
|
119
|
+
|
|
120
|
+
```tsx
|
|
121
|
+
<Router.Protected
|
|
122
|
+
when={contextLoading ? 'pending' : isReady}
|
|
123
|
+
redirectTo="/home"
|
|
124
|
+
pending={<AppLoadingScreen />}
|
|
125
|
+
>
|
|
126
|
+
<Router.Screen path="/catalog/products" element={ProductsScreen} />
|
|
127
|
+
</Router.Protected>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
This is what keeps deep links alive while an app boots. Without it a guard has
|
|
131
|
+
to answer `false` while it is still loading, which redirects the visitor away
|
|
132
|
+
from the URL they opened — and a catch-all loading screen cannot rescue it,
|
|
133
|
+
because the guarded route is the more specific match.
|
|
134
|
+
|
|
135
|
+
Semantics worth knowing:
|
|
136
|
+
|
|
137
|
+
- Guards resolve outside-in; the first one that is not `true` decides. An
|
|
138
|
+
undecided outer guard defers a later denial, since it is not yet known
|
|
139
|
+
whether that guard would even be reached.
|
|
140
|
+
- A denial always wins immediately, including on a screen that is already
|
|
141
|
+
open — revoking access redirects right away.
|
|
142
|
+
- A guard that turns undecided again while its screen is on-screen keeps that
|
|
143
|
+
screen rendered rather than flashing the pending node.
|
|
144
|
+
|
|
113
145
|
## Hooks
|
|
114
146
|
|
|
115
147
|
| Hook | Returns |
|
package/dist/Router.d.ts
CHANGED
|
@@ -10,6 +10,13 @@ export interface RouterNavigateOptions {
|
|
|
10
10
|
export type RouterNavigateFunction = (to: string | number, options?: RouterNavigateOptions) => void;
|
|
11
11
|
export type RouterReplaceFunction = (to: string, options?: RouterNavigateOptions) => void;
|
|
12
12
|
type RouterGuardValue<T> = T | ((props: RouterRouteRenderProps) => T);
|
|
13
|
+
/**
|
|
14
|
+
* A guard answers one of three things: allowed, denied, or not decided yet.
|
|
15
|
+
* `'pending'` (and `undefined`, so `when={user?.isAdmin}` works before the user
|
|
16
|
+
* loads) holds the URL and renders the guard's `pending` node — it must not
|
|
17
|
+
* redirect, or every deep link would be lost while the app boots.
|
|
18
|
+
*/
|
|
19
|
+
export type RouterGuardState = boolean | 'pending';
|
|
13
20
|
export type RouterSplitPane = 'primary' | 'secondary';
|
|
14
21
|
export interface RouterRouteRenderProps {
|
|
15
22
|
params: DefaultParams;
|
|
@@ -124,8 +131,10 @@ export interface RouterSplitViewProps extends RouterRouteProps {
|
|
|
124
131
|
}
|
|
125
132
|
export type RouterSplitViewSlotProps = RouterRouteProps;
|
|
126
133
|
export interface RouterProtectedProps extends RouterRouteProps {
|
|
127
|
-
when: RouterGuardValue<
|
|
134
|
+
when: RouterGuardValue<RouterGuardState | undefined>;
|
|
128
135
|
redirectTo: RouterGuardValue<string>;
|
|
136
|
+
/** Rendered instead of the subtree while `when` is undecided. */
|
|
137
|
+
pending?: ReactNode;
|
|
129
138
|
}
|
|
130
139
|
export interface RouterRedirectProps extends RouterRouteProps {
|
|
131
140
|
to: RouterGuardValue<string>;
|
package/dist/Router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { Router, useCurrentModal, useCurrentRoute, useDrawer, useHistoryState, useParams, useRoute, useRouter, useSearchParams, type CurrentModalApi, type RouterDrawerApi, type RouterDrawerGroup, type RouterDrawerGroupProps, type RouterDrawerItem, type RouterDrawerItemProps, type RouterDrawerNode, type RouterDrawerSection, type RouterDrawerSectionProps, type RouterDrawerProps, type RouterApi, type RouterNavigateFunction, type RouterReplaceFunction, type RouterRedirectProps, type RouterRouteContextValue, type RouterRouteLayoutProps, type RouterProtectedProps, type RouterRouteRenderProps, type RouterScreenAnimation, type RouterSplitPane, type RouterSplitViewProps, type RouterSplitViewSlotProps, type RouterTabBarTab, } from './Router';
|
|
1
|
+
export { Router, useCurrentModal, useCurrentRoute, useDrawer, useHistoryState, useParams, useRoute, useRouter, useSearchParams, type CurrentModalApi, type RouterDrawerApi, type RouterDrawerGroup, type RouterDrawerGroupProps, type RouterDrawerItem, type RouterDrawerItemProps, type RouterDrawerNode, type RouterDrawerSection, type RouterDrawerSectionProps, type RouterDrawerProps, type RouterGuardState, type RouterApi, type RouterNavigateFunction, type RouterReplaceFunction, type RouterRedirectProps, type RouterRouteContextValue, type RouterRouteLayoutProps, type RouterProtectedProps, type RouterRouteRenderProps, type RouterScreenAnimation, type RouterSplitPane, type RouterSplitViewProps, type RouterSplitViewSlotProps, type RouterTabBarTab, } from './Router';
|
|
2
2
|
export type { RouterShellMode } from './types';
|
|
3
3
|
export type { RouterOverlayLayout } from './types';
|
|
4
4
|
export { Modal, ModalFrame, Sheet, SheetFrame, useModalSwipeTarget, useSheetDragEngine, sheetDragStartsInInteractiveControl, sheetScrollAtTop, type SheetDragUpdate, } from './components';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,eAAe,EACf,eAAe,EACf,SAAS,EACT,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACrB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EACL,KAAK,EACL,UAAU,EACV,KAAK,EACL,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,mCAAmC,EACnC,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,eAAe,EACf,eAAe,EACf,SAAS,EACT,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACrB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EACL,KAAK,EACL,UAAU,EACV,KAAK,EACL,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,mCAAmC,EACnC,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1235,7 +1235,8 @@ function compileStackRoutes(children, parentPath, parentId = "root", inheritedGu
|
|
|
1235
1235
|
const guard = {
|
|
1236
1236
|
id: props.id ?? routeId,
|
|
1237
1237
|
when: child.props.when,
|
|
1238
|
-
redirectTo: child.props.redirectTo
|
|
1238
|
+
redirectTo: child.props.redirectTo,
|
|
1239
|
+
pending: child.props.pending
|
|
1239
1240
|
};
|
|
1240
1241
|
if (routeChildren.length > 0) {
|
|
1241
1242
|
routes.push(
|
|
@@ -1279,10 +1280,11 @@ function compileStackRoutes(children, parentPath, parentId = "root", inheritedGu
|
|
|
1279
1280
|
const overlayFlow = {
|
|
1280
1281
|
id: `${routeId}/overlay-flow`,
|
|
1281
1282
|
kind: presentation,
|
|
1282
|
-
routes: flowRoutes
|
|
1283
|
+
routes: flowRoutes,
|
|
1284
|
+
entries: []
|
|
1283
1285
|
};
|
|
1284
1286
|
for (const flowRoute of flowRoutes) {
|
|
1285
|
-
|
|
1287
|
+
const entryRoute = {
|
|
1286
1288
|
id: `${overlayFlow.id}:${flowRoute.id}`,
|
|
1287
1289
|
path: flowRoute.path,
|
|
1288
1290
|
presentation,
|
|
@@ -1294,7 +1296,9 @@ function compileStackRoutes(children, parentPath, parentId = "root", inheritedGu
|
|
|
1294
1296
|
fallback: flowRoute.fallback ?? props.fallback,
|
|
1295
1297
|
childRoute: flowRoute,
|
|
1296
1298
|
overlayFlow
|
|
1297
|
-
}
|
|
1299
|
+
};
|
|
1300
|
+
overlayFlow.entries.push(entryRoute);
|
|
1301
|
+
routes.push(entryRoute);
|
|
1298
1302
|
}
|
|
1299
1303
|
return;
|
|
1300
1304
|
}
|
|
@@ -1634,16 +1638,25 @@ function routeRenderPropsForMatch(pathname, search, historyState, match) {
|
|
|
1634
1638
|
function resolveGuardValue(value, props) {
|
|
1635
1639
|
return typeof value === "function" ? value(props) : value;
|
|
1636
1640
|
}
|
|
1637
|
-
|
|
1641
|
+
var GUARD_ALLOW = { status: "allow" };
|
|
1642
|
+
function resolveRouteGuard(match, pathname, search, historyState) {
|
|
1638
1643
|
const props = routeRenderPropsForMatch(pathname, search, historyState, match);
|
|
1639
1644
|
for (const guard of match.route.guards) {
|
|
1640
|
-
|
|
1641
|
-
|
|
1645
|
+
const value = resolveGuardValue(guard.when, props);
|
|
1646
|
+
if (value === true) continue;
|
|
1647
|
+
if (value === false) {
|
|
1648
|
+
return { status: "redirect", to: resolveGuardValue(guard.redirectTo, props) };
|
|
1649
|
+
}
|
|
1650
|
+
return { status: "pending", element: guard.pending ?? null };
|
|
1642
1651
|
}
|
|
1643
1652
|
if (match.route.redirectTo) {
|
|
1644
|
-
return resolveGuardValue(match.route.redirectTo, props);
|
|
1653
|
+
return { status: "redirect", to: resolveGuardValue(match.route.redirectTo, props) };
|
|
1645
1654
|
}
|
|
1646
|
-
return
|
|
1655
|
+
return GUARD_ALLOW;
|
|
1656
|
+
}
|
|
1657
|
+
function guardRedirectForMatch(match, pathname, search, historyState) {
|
|
1658
|
+
const outcome = resolveRouteGuard(match, pathname, search, historyState);
|
|
1659
|
+
return outcome.status === "redirect" ? outcome.to : null;
|
|
1647
1660
|
}
|
|
1648
1661
|
var PUSH_PRESENTATIONS = /* @__PURE__ */ new Set(["push"]);
|
|
1649
1662
|
var OVERLAY_PRESENTATIONS = /* @__PURE__ */ new Set(["modal", "sheet"]);
|
|
@@ -3020,6 +3033,34 @@ function modalFlowScreenFromMatch(match, pathname, search, state, historyIndex,
|
|
|
3020
3033
|
)
|
|
3021
3034
|
};
|
|
3022
3035
|
}
|
|
3036
|
+
function overlayFlowRootPathname(rootPath, pathname) {
|
|
3037
|
+
const depth = rootPath.split("/").filter(Boolean).length;
|
|
3038
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
3039
|
+
if (segments.length <= depth) return pathname;
|
|
3040
|
+
return `/${segments.slice(0, depth).join("/")}`;
|
|
3041
|
+
}
|
|
3042
|
+
function seedModalFlowScreens(match, pathname, search, state) {
|
|
3043
|
+
const target = modalFlowScreenFromMatch(match, pathname, search, state, 0, "push");
|
|
3044
|
+
if (!target) return void 0;
|
|
3045
|
+
const flow = match.route.overlayFlow;
|
|
3046
|
+
const rootEntry = flow?.entries[0];
|
|
3047
|
+
const rootRoute = flow?.routes[0];
|
|
3048
|
+
if (!flow || !rootEntry || !rootRoute || rootRoute === match.route.childRoute) {
|
|
3049
|
+
return [target];
|
|
3050
|
+
}
|
|
3051
|
+
const rootScreen = {
|
|
3052
|
+
overlayRoute: rootEntry,
|
|
3053
|
+
route: rootRoute,
|
|
3054
|
+
params: match.params,
|
|
3055
|
+
pathname: rootRoute.path ? overlayFlowRootPathname(rootRoute.path, pathname) : pathname,
|
|
3056
|
+
search,
|
|
3057
|
+
historyState: stateWithHistoryIndex(state, 0, createRouterId(), "push")
|
|
3058
|
+
};
|
|
3059
|
+
return [
|
|
3060
|
+
rootScreen,
|
|
3061
|
+
{ ...target, historyState: stateWithHistoryIndex(state, 1, createRouterId(), "push") }
|
|
3062
|
+
];
|
|
3063
|
+
}
|
|
3023
3064
|
function RouterRuntime({
|
|
3024
3065
|
children,
|
|
3025
3066
|
fallback,
|
|
@@ -3058,11 +3099,27 @@ function RouterRuntime({
|
|
|
3058
3099
|
};
|
|
3059
3100
|
}, [shell]);
|
|
3060
3101
|
const searchPath = search ? `?${search}` : "";
|
|
3061
|
-
const
|
|
3062
|
-
() => rawMatch ?
|
|
3102
|
+
const guardOutcome = useMemo(
|
|
3103
|
+
() => rawMatch ? resolveRouteGuard(rawMatch, pathname, searchPath, historyState) : null,
|
|
3063
3104
|
[historyState, pathname, rawMatch, searchPath]
|
|
3064
3105
|
);
|
|
3065
|
-
const
|
|
3106
|
+
const guardRedirect = guardOutcome?.status === "redirect" ? guardOutcome.to : null;
|
|
3107
|
+
const matchedRoute = guardRedirect ? null : rawMatch;
|
|
3108
|
+
const match = useMemo(() => {
|
|
3109
|
+
if (!matchedRoute) return null;
|
|
3110
|
+
if (guardOutcome?.status !== "pending") return matchedRoute;
|
|
3111
|
+
return {
|
|
3112
|
+
...matchedRoute,
|
|
3113
|
+
route: {
|
|
3114
|
+
...matchedRoute.route,
|
|
3115
|
+
element: guardOutcome.element,
|
|
3116
|
+
elementType: void 0,
|
|
3117
|
+
component: void 0,
|
|
3118
|
+
layout: void 0,
|
|
3119
|
+
overlayLayout: void 0
|
|
3120
|
+
}
|
|
3121
|
+
};
|
|
3122
|
+
}, [guardOutcome, matchedRoute]);
|
|
3066
3123
|
useLayoutEffect(() => {
|
|
3067
3124
|
if (!guardRedirect) return;
|
|
3068
3125
|
const target = parseNavigationTarget(guardRedirect, pathname);
|
|
@@ -3381,22 +3438,21 @@ function RouterRuntime({
|
|
|
3381
3438
|
if (updateActiveModalFlow(overlayMatch, target, overlayState, "push")) {
|
|
3382
3439
|
return;
|
|
3383
3440
|
}
|
|
3384
|
-
const
|
|
3441
|
+
const initialFlowScreens = seedModalFlowScreens(
|
|
3385
3442
|
overlayMatch,
|
|
3386
3443
|
target.pathname,
|
|
3387
3444
|
target.search,
|
|
3388
|
-
overlayState
|
|
3389
|
-
0,
|
|
3390
|
-
"push"
|
|
3445
|
+
overlayState
|
|
3391
3446
|
);
|
|
3447
|
+
const activeFlowScreen = initialFlowScreens?.[initialFlowScreens.length - 1];
|
|
3392
3448
|
pushModalEntry({
|
|
3393
3449
|
kind: overlayMatch.route.presentation,
|
|
3394
3450
|
route: overlayMatch.route,
|
|
3395
3451
|
params: overlayMatch.params,
|
|
3396
3452
|
pathname: target.pathname,
|
|
3397
3453
|
search: target.search,
|
|
3398
|
-
historyState:
|
|
3399
|
-
flowScreens:
|
|
3454
|
+
historyState: activeFlowScreen?.historyState ?? overlayState,
|
|
3455
|
+
flowScreens: initialFlowScreens
|
|
3400
3456
|
});
|
|
3401
3457
|
return;
|
|
3402
3458
|
}
|
|
@@ -3451,14 +3507,13 @@ function RouterRuntime({
|
|
|
3451
3507
|
if (updateActiveModalFlow(overlayMatch, target, overlayState, "replace")) {
|
|
3452
3508
|
return;
|
|
3453
3509
|
}
|
|
3454
|
-
const
|
|
3510
|
+
const initialFlowScreens = seedModalFlowScreens(
|
|
3455
3511
|
overlayMatch,
|
|
3456
3512
|
target.pathname,
|
|
3457
3513
|
target.search,
|
|
3458
|
-
overlayState
|
|
3459
|
-
0,
|
|
3460
|
-
"replace"
|
|
3514
|
+
overlayState
|
|
3461
3515
|
);
|
|
3516
|
+
const activeFlowScreen = initialFlowScreens?.[initialFlowScreens.length - 1];
|
|
3462
3517
|
pushModalEntry(
|
|
3463
3518
|
{
|
|
3464
3519
|
kind: overlayMatch.route.presentation,
|
|
@@ -3466,8 +3521,8 @@ function RouterRuntime({
|
|
|
3466
3521
|
params: overlayMatch.params,
|
|
3467
3522
|
pathname: target.pathname,
|
|
3468
3523
|
search: target.search,
|
|
3469
|
-
historyState:
|
|
3470
|
-
flowScreens:
|
|
3524
|
+
historyState: activeFlowScreen?.historyState ?? overlayState,
|
|
3525
|
+
flowScreens: initialFlowScreens
|
|
3471
3526
|
},
|
|
3472
3527
|
true
|
|
3473
3528
|
);
|