@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 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: (_c = matches.query) !== null && _c !== void 0 ? _c : {},
151
+ query: (_d = matches.query) !== null && _d !== void 0 ? _d : {},
141
152
  };
142
153
  },
143
154
  // @ts-ignore :cry:
@@ -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;
@@ -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
@@ -2,7 +2,7 @@
2
2
  "name": "@koordinates/xstate-tree",
3
3
  "main": "lib/index.js",
4
4
  "types": "lib/xstate-tree.d.ts",
5
- "version": "4.6.7",
5
+ "version": "4.8.0",
6
6
  "license": "MIT",
7
7
  "description": "Build UIs with Actors using xstate and React",
8
8
  "keywords": [