@koordinates/xstate-tree 4.6.7 → 4.8.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/lib/index.js +2 -1
- package/lib/routing/createRoute/createRoute.js +14 -3
- package/lib/routing/index.js +3 -1
- package/lib/routing/useOnRoute.js +26 -0
- package/lib/xstate-tree.d.ts +22 -1
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.lazy = exports.loggingMetaOptions = exports.TestRoutingContext = exports.useActiveRouteEvents = exports.useRouteArgsIfActive = exports.useIsRouteActive = exports.matchRoute = exports.buildCreateRoute = exports.Link = exports.slotTestingDummyFactory = exports.genericSlotsTestingDummy = exports.buildViewProps = exports.buildTestRootComponent = exports.onBroadcast = exports.buildRootComponent = exports.broadcast = void 0;
|
|
17
|
+
exports.lazy = exports.loggingMetaOptions = exports.useOnRoute = exports.TestRoutingContext = exports.useActiveRouteEvents = exports.useRouteArgsIfActive = exports.useIsRouteActive = exports.matchRoute = exports.buildCreateRoute = exports.Link = exports.slotTestingDummyFactory = exports.genericSlotsTestingDummy = exports.buildViewProps = exports.buildTestRootComponent = exports.onBroadcast = exports.buildRootComponent = exports.broadcast = void 0;
|
|
18
18
|
__exportStar(require("./builders"), exports);
|
|
19
19
|
__exportStar(require("./slots"), exports);
|
|
20
20
|
var xstateTree_1 = require("./xstateTree");
|
|
@@ -35,6 +35,7 @@ Object.defineProperty(exports, "useIsRouteActive", { enumerable: true, get: func
|
|
|
35
35
|
Object.defineProperty(exports, "useRouteArgsIfActive", { enumerable: true, get: function () { return routing_1.useRouteArgsIfActive; } });
|
|
36
36
|
Object.defineProperty(exports, "useActiveRouteEvents", { enumerable: true, get: function () { return routing_1.useActiveRouteEvents; } });
|
|
37
37
|
Object.defineProperty(exports, "TestRoutingContext", { enumerable: true, get: function () { return routing_1.TestRoutingContext; } });
|
|
38
|
+
Object.defineProperty(exports, "useOnRoute", { enumerable: true, get: function () { return routing_1.useOnRoute; } });
|
|
38
39
|
var useService_1 = require("./useService");
|
|
39
40
|
Object.defineProperty(exports, "loggingMetaOptions", { enumerable: true, get: function () { return useService_1.loggingMetaOptions; } });
|
|
40
41
|
var lazy_1 = require("./lazy");
|
|
@@ -69,7 +69,7 @@ function buildCreateRoute(history, basePath) {
|
|
|
69
69
|
}
|
|
70
70
|
return parentRoutes;
|
|
71
71
|
}
|
|
72
|
-
return ({ event, matcher, reverser, paramsSchema, querySchema, redirect, preload, }) => {
|
|
72
|
+
return ({ event, matcher, reverser, paramsSchema, querySchema, redirect, preload, canMatch, }) => {
|
|
73
73
|
let fullParamsSchema = paramsSchema;
|
|
74
74
|
let parentRoute = baseRoute;
|
|
75
75
|
while (fullParamsSchema && parentRoute) {
|
|
@@ -86,6 +86,7 @@ function buildCreateRoute(history, basePath) {
|
|
|
86
86
|
querySchema,
|
|
87
87
|
parent: baseRoute,
|
|
88
88
|
redirect,
|
|
89
|
+
canMatch,
|
|
89
90
|
matcher: matcher,
|
|
90
91
|
reverser: reverser,
|
|
91
92
|
// @ts-ignore :cry:
|
|
@@ -95,7 +96,7 @@ function buildCreateRoute(history, basePath) {
|
|
|
95
96
|
},
|
|
96
97
|
// @ts-ignore :cry:
|
|
97
98
|
matches(suppliedUrl, search) {
|
|
98
|
-
var _a, _b, _c;
|
|
99
|
+
var _a, _b, _c, _d;
|
|
99
100
|
const fullUrl = suppliedUrl.endsWith("/")
|
|
100
101
|
? suppliedUrl
|
|
101
102
|
: suppliedUrl + "/";
|
|
@@ -133,11 +134,21 @@ function buildCreateRoute(history, basePath) {
|
|
|
133
134
|
if (querySchema) {
|
|
134
135
|
querySchema.parse(matches.query);
|
|
135
136
|
}
|
|
137
|
+
// Check canMatch predicate if provided
|
|
138
|
+
if (canMatch) {
|
|
139
|
+
const canMatchResult = canMatch({
|
|
140
|
+
params: fullParams,
|
|
141
|
+
query: (_c = matches.query) !== null && _c !== void 0 ? _c : {},
|
|
142
|
+
});
|
|
143
|
+
if (!canMatchResult) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
136
147
|
return {
|
|
137
148
|
originalUrl: `${fullUrl}${search}`,
|
|
138
149
|
type: event,
|
|
139
150
|
params: fullParams,
|
|
140
|
-
query: (
|
|
151
|
+
query: (_d = matches.query) !== null && _d !== void 0 ? _d : {},
|
|
141
152
|
};
|
|
142
153
|
},
|
|
143
154
|
// @ts-ignore :cry:
|
package/lib/routing/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useActiveRouteEvents = exports.useInTestRoutingContext = exports.useInRoutingContext = exports.TestRoutingContext = exports.RoutingContext = exports.useRouteArgsIfActive = exports.useIsRouteActive = exports.handleLocationChange = exports.matchRoute = exports.Link = exports.joinRoutes = exports.buildCreateRoute = void 0;
|
|
3
|
+
exports.useActiveRouteEvents = exports.useInTestRoutingContext = exports.useInRoutingContext = exports.TestRoutingContext = exports.RoutingContext = exports.useOnRoute = exports.useRouteArgsIfActive = exports.useIsRouteActive = exports.handleLocationChange = exports.matchRoute = exports.Link = exports.joinRoutes = exports.buildCreateRoute = void 0;
|
|
4
4
|
var createRoute_1 = require("./createRoute");
|
|
5
5
|
Object.defineProperty(exports, "buildCreateRoute", { enumerable: true, get: function () { return createRoute_1.buildCreateRoute; } });
|
|
6
6
|
var joinRoutes_1 = require("./joinRoutes");
|
|
@@ -15,6 +15,8 @@ var useIsRouteActive_1 = require("./useIsRouteActive");
|
|
|
15
15
|
Object.defineProperty(exports, "useIsRouteActive", { enumerable: true, get: function () { return useIsRouteActive_1.useIsRouteActive; } });
|
|
16
16
|
var useRouteArgsIfActive_1 = require("./useRouteArgsIfActive");
|
|
17
17
|
Object.defineProperty(exports, "useRouteArgsIfActive", { enumerable: true, get: function () { return useRouteArgsIfActive_1.useRouteArgsIfActive; } });
|
|
18
|
+
var useOnRoute_1 = require("./useOnRoute");
|
|
19
|
+
Object.defineProperty(exports, "useOnRoute", { enumerable: true, get: function () { return useOnRoute_1.useOnRoute; } });
|
|
18
20
|
var providers_1 = require("./providers");
|
|
19
21
|
Object.defineProperty(exports, "RoutingContext", { enumerable: true, get: function () { return providers_1.RoutingContext; } });
|
|
20
22
|
Object.defineProperty(exports, "TestRoutingContext", { enumerable: true, get: function () { return providers_1.TestRoutingContext; } });
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useOnRoute = void 0;
|
|
4
|
+
const providers_1 = require("./providers");
|
|
5
|
+
/**
|
|
6
|
+
* @public
|
|
7
|
+
* Accepts a single Route and returns true if the route is currently active and marked as an index route.
|
|
8
|
+
* False if not.
|
|
9
|
+
*
|
|
10
|
+
* If used outside of a RoutingContext, an error will be thrown.
|
|
11
|
+
* @param route - the route to check
|
|
12
|
+
* @returns true if the route is active and an index route, false if not
|
|
13
|
+
* @throws if used outside of an xstate-tree root
|
|
14
|
+
*/
|
|
15
|
+
function useOnRoute(route) {
|
|
16
|
+
const activeRouteEvents = (0, providers_1.useActiveRouteEvents)();
|
|
17
|
+
if (!activeRouteEvents) {
|
|
18
|
+
throw new Error("useOnRoute must be used within a RoutingContext. Are you using it outside of an xstate-tree Root?");
|
|
19
|
+
}
|
|
20
|
+
return activeRouteEvents.some((activeRouteEvent) => {
|
|
21
|
+
var _a;
|
|
22
|
+
return activeRouteEvent.type === route.event &&
|
|
23
|
+
((_a = activeRouteEvent.meta) === null || _a === void 0 ? void 0 : _a.indexEvent) === true;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
exports.useOnRoute = useOnRoute;
|
package/lib/xstate-tree.d.ts
CHANGED
|
@@ -60,6 +60,7 @@ export declare type AnyRoute = {
|
|
|
60
60
|
matcher: (url: string, query: ParsedQuery<string> | undefined) => any;
|
|
61
61
|
reverser: any;
|
|
62
62
|
redirect?: any;
|
|
63
|
+
canMatch?: any;
|
|
63
64
|
};
|
|
64
65
|
|
|
65
66
|
/**
|
|
@@ -129,6 +130,7 @@ export declare function buildCreateRoute(history: () => XstateTreeHistory, baseP
|
|
|
129
130
|
meta?: TMeta | undefined;
|
|
130
131
|
redirect?: RouteRedirect<MergeRouteTypes<RouteParams<TBaseRoute>, ResolveZodType<TParamsSchema>>, ResolveZodType<TQuerySchema>, MergeRouteTypes<RouteMeta<TBaseRoute>, TMeta> & SharedMeta> | undefined;
|
|
131
132
|
preload?: RouteArgumentFunctions<void, MergeRouteTypes<RouteParams<TBaseRoute>, ResolveZodType<TParamsSchema>>, ResolveZodType<TQuerySchema>, MergeRouteTypes<RouteMeta<TBaseRoute>, TMeta>, RouteArguments<MergeRouteTypes<RouteParams<TBaseRoute>, ResolveZodType<TParamsSchema>>, ResolveZodType<TQuerySchema>, MergeRouteTypes<RouteMeta<TBaseRoute>, TMeta>>> | undefined;
|
|
133
|
+
canMatch?: RouteArgumentFunctions<boolean, MergeRouteTypes<RouteParams<TBaseRoute>, ResolveZodType<TParamsSchema>>, ResolveZodType<TQuerySchema>, MergeRouteTypes<RouteMeta<TBaseRoute>, TMeta> & SharedMeta, RouteArguments<MergeRouteTypes<RouteParams<TBaseRoute>, ResolveZodType<TParamsSchema>>, ResolveZodType<TQuerySchema>, MergeRouteTypes<RouteMeta<TBaseRoute>, TMeta> & SharedMeta>> | undefined;
|
|
132
134
|
}) => Route<MergeRouteTypes<RouteParams<TBaseRoute>, ResolveZodType<TParamsSchema>>, ResolveZodType<TQuerySchema>, TEvent, MergeRouteTypes<RouteMeta<TBaseRoute>, TMeta> & SharedMeta>;
|
|
133
135
|
route<TBaseRoute_1 extends AnyRoute>(baseRoute?: TBaseRoute_1 | undefined): <TEvent_1 extends string, TParamsSchema_1 extends Z.ZodObject<any, "strip", Z.ZodTypeAny, {
|
|
134
136
|
[x: string]: any;
|
|
@@ -138,7 +140,7 @@ export declare function buildCreateRoute(history: () => XstateTreeHistory, baseP
|
|
|
138
140
|
[x: string]: any;
|
|
139
141
|
}, {
|
|
140
142
|
[x: string]: any;
|
|
141
|
-
}> | undefined, TMeta_1 extends Record<string, unknown>>({ event, matcher, reverser, paramsSchema, querySchema, redirect, preload, }: {
|
|
143
|
+
}> | undefined, TMeta_1 extends Record<string, unknown>>({ event, matcher, reverser, paramsSchema, querySchema, redirect, preload, canMatch, }: {
|
|
142
144
|
event: TEvent_1;
|
|
143
145
|
paramsSchema?: TParamsSchema_1 | undefined;
|
|
144
146
|
querySchema?: TQuerySchema_1 | undefined;
|
|
@@ -160,6 +162,7 @@ export declare function buildCreateRoute(history: () => XstateTreeHistory, baseP
|
|
|
160
162
|
*/
|
|
161
163
|
reverser: RouteArgumentFunctions<string, MergeRouteTypes<RouteParams<TBaseRoute_1>, ResolveZodType<TParamsSchema_1>>, ResolveZodType<TQuerySchema_1>, MergeRouteTypes<RouteMeta<TBaseRoute_1>, TMeta_1>, RouteArguments<MergeRouteTypes<RouteParams<TBaseRoute_1>, ResolveZodType<TParamsSchema_1>>, ResolveZodType<TQuerySchema_1>, MergeRouteTypes<RouteMeta<TBaseRoute_1>, TMeta_1>>>;
|
|
162
164
|
preload?: RouteArgumentFunctions<void, MergeRouteTypes<RouteParams<TBaseRoute_1>, ResolveZodType<TParamsSchema_1>>, ResolveZodType<TQuerySchema_1>, MergeRouteTypes<RouteMeta<TBaseRoute_1>, TMeta_1>, RouteArguments<MergeRouteTypes<RouteParams<TBaseRoute_1>, ResolveZodType<TParamsSchema_1>>, ResolveZodType<TQuerySchema_1>, MergeRouteTypes<RouteMeta<TBaseRoute_1>, TMeta_1>>> | undefined;
|
|
165
|
+
canMatch?: RouteArgumentFunctions<boolean, MergeRouteTypes<RouteParams<TBaseRoute_1>, ResolveZodType<TParamsSchema_1>>, ResolveZodType<TQuerySchema_1>, MergeRouteTypes<RouteMeta<TBaseRoute_1>, TMeta_1> & SharedMeta, RouteArguments<MergeRouteTypes<RouteParams<TBaseRoute_1>, ResolveZodType<TParamsSchema_1>>, ResolveZodType<TQuerySchema_1>, MergeRouteTypes<RouteMeta<TBaseRoute_1>, TMeta_1> & SharedMeta>> | undefined;
|
|
163
166
|
}) => Route<MergeRouteTypes<RouteParams<TBaseRoute_1>, ResolveZodType<TParamsSchema_1>>, ResolveZodType<TQuerySchema_1>, TEvent_1, MergeRouteTypes<RouteMeta<TBaseRoute_1>, TMeta_1> & SharedMeta>;
|
|
164
167
|
};
|
|
165
168
|
|
|
@@ -591,6 +594,12 @@ export declare type Route<TParams, TQuery, TEvent, TMeta> = {
|
|
|
591
594
|
paramsSchema?: Z.ZodObject<any>;
|
|
592
595
|
querySchema?: Z.ZodObject<any>;
|
|
593
596
|
redirect?: RouteRedirect<TParams, TQuery, TMeta>;
|
|
597
|
+
/**
|
|
598
|
+
* Optional predicate to control whether this route can be matched.
|
|
599
|
+
* Called after URL matching but before the route is considered matched.
|
|
600
|
+
* Useful for access control or conditional routing.
|
|
601
|
+
*/
|
|
602
|
+
canMatch?: RouteArgumentFunctions<boolean, TParams, TQuery, TMeta>;
|
|
594
603
|
};
|
|
595
604
|
|
|
596
605
|
/**
|
|
@@ -809,6 +818,18 @@ export declare function useActiveRouteEvents(): {
|
|
|
809
818
|
*/
|
|
810
819
|
export declare function useIsRouteActive(...routes: AnyRoute[]): boolean;
|
|
811
820
|
|
|
821
|
+
/**
|
|
822
|
+
* @public
|
|
823
|
+
* Accepts a single Route and returns true if the route is currently active and marked as an index route.
|
|
824
|
+
* False if not.
|
|
825
|
+
*
|
|
826
|
+
* If used outside of a RoutingContext, an error will be thrown.
|
|
827
|
+
* @param route - the route to check
|
|
828
|
+
* @returns true if the route is active and an index route, false if not
|
|
829
|
+
* @throws if used outside of an xstate-tree root
|
|
830
|
+
*/
|
|
831
|
+
export declare function useOnRoute(route: AnyRoute): boolean;
|
|
832
|
+
|
|
812
833
|
/**
|
|
813
834
|
* @public
|
|
814
835
|
* Returns the arguments for the given route if the route is active.
|
package/package.json
CHANGED