react-iten 0.0.2 → 0.4.2

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.
Files changed (61) hide show
  1. package/README.md +103 -2
  2. package/dist/components/Link.cjs +21 -0
  3. package/dist/components/Link.d.cts +13 -0
  4. package/dist/components/Link.d.ts +13 -0
  5. package/dist/components/Link.mjs +21 -0
  6. package/dist/components/Navigate.cjs +15 -0
  7. package/dist/components/Navigate.d.cts +10 -0
  8. package/dist/components/Navigate.d.ts +10 -0
  9. package/dist/components/Navigate.mjs +15 -0
  10. package/dist/components/Route.cjs +22 -0
  11. package/dist/components/Route.d.cts +17 -0
  12. package/dist/components/Route.d.ts +17 -0
  13. package/dist/components/Route.mjs +22 -0
  14. package/dist/components/Switch.cjs +21 -0
  15. package/dist/components/Switch.d.cts +9 -0
  16. package/dist/components/Switch.d.ts +9 -0
  17. package/dist/components/Switch.mjs +21 -0
  18. package/dist/create-router.cjs +18 -0
  19. package/dist/create-router.d.cts +18 -0
  20. package/dist/create-router.d.ts +18 -0
  21. package/dist/create-router.mjs +18 -0
  22. package/dist/headless.cjs +83 -0
  23. package/dist/headless.d.cts +21 -0
  24. package/dist/headless.d.ts +21 -0
  25. package/dist/headless.mjs +40 -0
  26. package/dist/hooks.cjs +52 -0
  27. package/dist/hooks.d.cts +21 -0
  28. package/dist/hooks.d.ts +21 -0
  29. package/dist/hooks.mjs +52 -0
  30. package/dist/index.cjs +48 -0
  31. package/dist/index.d.cts +8 -0
  32. package/dist/index.d.ts +8 -0
  33. package/dist/index.mjs +4 -0
  34. package/dist/types.d.cts +19 -0
  35. package/dist/types.d.ts +19 -0
  36. package/dist/url.cjs +20 -0
  37. package/dist/url.d.cts +14 -0
  38. package/dist/url.d.ts +14 -0
  39. package/dist/url.mjs +19 -0
  40. package/dist/utils.cjs +44 -0
  41. package/dist/utils.d.cts +3 -0
  42. package/dist/utils.d.ts +3 -0
  43. package/dist/utils.mjs +2 -0
  44. package/dist/zod.cjs +77 -0
  45. package/dist/zod.d.cts +48 -0
  46. package/dist/zod.d.ts +48 -0
  47. package/dist/zod.mjs +73 -0
  48. package/package.json +99 -5
  49. package/src/components/Link.tsx +36 -0
  50. package/src/components/Navigate.tsx +26 -0
  51. package/src/components/Route.tsx +53 -0
  52. package/src/components/Switch.tsx +30 -0
  53. package/src/create-router.ts +33 -0
  54. package/src/headless.ts +91 -0
  55. package/src/hooks.ts +74 -0
  56. package/src/index.ts +35 -0
  57. package/src/types.ts +47 -0
  58. package/src/url.ts +49 -0
  59. package/src/utils.ts +23 -0
  60. package/src/zod.ts +150 -0
  61. package/index.js +0 -1
package/dist/hooks.cjs ADDED
@@ -0,0 +1,52 @@
1
+ let react = require("react");
2
+ //#region src/hooks.ts
3
+ function makeHooks(store) {
4
+ function useRouterState() {
5
+ return (0, react.useSyncExternalStore)((listener) => store.subscribe({ listener }), store.getState, store.getState);
6
+ }
7
+ function useCurrentRoute() {
8
+ return useRouterState().route;
9
+ }
10
+ function useRoute({ name }) {
11
+ const route = useRouterState().route;
12
+ if (route?.name === name) return {
13
+ isActive: true,
14
+ params: route
15
+ };
16
+ return {
17
+ isActive: false,
18
+ params: null
19
+ };
20
+ }
21
+ function useNavigate() {
22
+ return store.navigate;
23
+ }
24
+ function useGoBack() {
25
+ return store.goBack;
26
+ }
27
+ function useIsNavigating() {
28
+ return useRouterState().isNavigating;
29
+ }
30
+ function useCanGoBack() {
31
+ return useRouterState().canGoBack;
32
+ }
33
+ function useRouteLoading({ name }) {
34
+ return useRouterState().pendingRoute?.name === name;
35
+ }
36
+ function useRouterError() {
37
+ return useRouterState().error;
38
+ }
39
+ return {
40
+ useRouterState,
41
+ useCurrentRoute,
42
+ useRoute,
43
+ useNavigate,
44
+ useGoBack,
45
+ useIsNavigating,
46
+ useCanGoBack,
47
+ useRouteLoading,
48
+ useRouterError
49
+ };
50
+ }
51
+ //#endregion
52
+ exports.makeHooks = makeHooks;
@@ -0,0 +1,21 @@
1
+ import { UseRouteResult } from "./types.cjs";
2
+ import { NavigateInput, RouteMapDef, RouteUnion, RouterError, RouterState } from "iten-core";
3
+
4
+ //#region src/hooks.d.ts
5
+ type HookBundle<M extends RouteMapDef> = {
6
+ useRouterState: () => RouterState<M>;
7
+ useCurrentRoute: () => RouteUnion<M> | null;
8
+ useRoute: <K extends keyof M>(input: {
9
+ name: K;
10
+ }) => UseRouteResult<M, K>;
11
+ useNavigate: () => (input: NavigateInput<M>) => Promise<void>;
12
+ useGoBack: () => () => void;
13
+ useIsNavigating: () => boolean;
14
+ useCanGoBack: () => boolean;
15
+ useRouteLoading: (input: {
16
+ name: keyof M;
17
+ }) => boolean;
18
+ useRouterError: () => RouterError | null;
19
+ };
20
+ //#endregion
21
+ export { HookBundle };
@@ -0,0 +1,21 @@
1
+ import { UseRouteResult } from "./types.js";
2
+ import { NavigateInput, RouteMapDef, RouteUnion, RouterError, RouterState } from "iten-core";
3
+
4
+ //#region src/hooks.d.ts
5
+ type HookBundle<M extends RouteMapDef> = {
6
+ useRouterState: () => RouterState<M>;
7
+ useCurrentRoute: () => RouteUnion<M> | null;
8
+ useRoute: <K extends keyof M>(input: {
9
+ name: K;
10
+ }) => UseRouteResult<M, K>;
11
+ useNavigate: () => (input: NavigateInput<M>) => Promise<void>;
12
+ useGoBack: () => () => void;
13
+ useIsNavigating: () => boolean;
14
+ useCanGoBack: () => boolean;
15
+ useRouteLoading: (input: {
16
+ name: keyof M;
17
+ }) => boolean;
18
+ useRouterError: () => RouterError | null;
19
+ };
20
+ //#endregion
21
+ export { HookBundle };
package/dist/hooks.mjs ADDED
@@ -0,0 +1,52 @@
1
+ import { useSyncExternalStore } from "react";
2
+ //#region src/hooks.ts
3
+ function makeHooks(store) {
4
+ function useRouterState() {
5
+ return useSyncExternalStore((listener) => store.subscribe({ listener }), store.getState, store.getState);
6
+ }
7
+ function useCurrentRoute() {
8
+ return useRouterState().route;
9
+ }
10
+ function useRoute({ name }) {
11
+ const route = useRouterState().route;
12
+ if (route?.name === name) return {
13
+ isActive: true,
14
+ params: route
15
+ };
16
+ return {
17
+ isActive: false,
18
+ params: null
19
+ };
20
+ }
21
+ function useNavigate() {
22
+ return store.navigate;
23
+ }
24
+ function useGoBack() {
25
+ return store.goBack;
26
+ }
27
+ function useIsNavigating() {
28
+ return useRouterState().isNavigating;
29
+ }
30
+ function useCanGoBack() {
31
+ return useRouterState().canGoBack;
32
+ }
33
+ function useRouteLoading({ name }) {
34
+ return useRouterState().pendingRoute?.name === name;
35
+ }
36
+ function useRouterError() {
37
+ return useRouterState().error;
38
+ }
39
+ return {
40
+ useRouterState,
41
+ useCurrentRoute,
42
+ useRoute,
43
+ useNavigate,
44
+ useGoBack,
45
+ useIsNavigating,
46
+ useCanGoBack,
47
+ useRouteLoading,
48
+ useRouterError
49
+ };
50
+ }
51
+ //#endregion
52
+ export { makeHooks };
package/dist/index.cjs ADDED
@@ -0,0 +1,48 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_headless = require("./headless.cjs");
3
+ const require_create_router = require("./create-router.cjs");
4
+ let iten_core = require("iten-core");
5
+ exports.createHeadlessRouter = require_headless.createHeadlessRouter;
6
+ Object.defineProperty(exports, "createRoute", {
7
+ enumerable: true,
8
+ get: function() {
9
+ return iten_core.createRoute;
10
+ }
11
+ });
12
+ exports.createRouter = require_create_router.createRouter;
13
+ Object.defineProperty(exports, "defineRouteConfig", {
14
+ enumerable: true,
15
+ get: function() {
16
+ return iten_core.defineRouteConfig;
17
+ }
18
+ });
19
+ Object.defineProperty(exports, "defineRoutes", {
20
+ enumerable: true,
21
+ get: function() {
22
+ return iten_core.defineRoutes;
23
+ }
24
+ });
25
+ Object.defineProperty(exports, "isRoute", {
26
+ enumerable: true,
27
+ get: function() {
28
+ return iten_core.isRoute;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "isRouteName", {
32
+ enumerable: true,
33
+ get: function() {
34
+ return iten_core.isRouteName;
35
+ }
36
+ });
37
+ Object.defineProperty(exports, "matchRoute", {
38
+ enumerable: true,
39
+ get: function() {
40
+ return iten_core.matchRoute;
41
+ }
42
+ });
43
+ Object.defineProperty(exports, "route", {
44
+ enumerable: true,
45
+ get: function() {
46
+ return iten_core.route;
47
+ }
48
+ });
@@ -0,0 +1,8 @@
1
+ import { InferRoutes, NoParams, QueryClientLike, ReactRouterConfig, RouteConfigMap, RouteDefinition, RouteDefinitions, RouteMap, RouteMapDef, RouteMatcher, RouteName, RouteOf, RouteParams, RouteUnion, RouterError, RouterState, UseRouteResult } from "./types.cjs";
2
+ import { HeadlessReactRouter, ReactRouterStore, createHeadlessRouter } from "./headless.cjs";
3
+ import { LinkProps } from "./components/Link.cjs";
4
+ import { NavigateProps } from "./components/Navigate.cjs";
5
+ import { RouteProps } from "./components/Route.cjs";
6
+ import { ReactRouter, createRouter } from "./create-router.cjs";
7
+ import { createRoute, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route } from "iten-core";
8
+ export { type HeadlessReactRouter, type InferRoutes, type LinkProps, type NavigateProps, type NoParams, type QueryClientLike, type ReactRouter, type ReactRouterConfig, type ReactRouterStore, type RouteConfigMap, type RouteDefinition, type RouteDefinitions, type RouteMap, type RouteMapDef, type RouteMatcher, type RouteName, type RouteOf, type RouteParams, type RouteProps, type RouteUnion, type RouterError, type RouterState, type UseRouteResult, createHeadlessRouter, createRoute, createRouter, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route };
@@ -0,0 +1,8 @@
1
+ import { InferRoutes, NoParams, QueryClientLike, ReactRouterConfig, RouteConfigMap, RouteDefinition, RouteDefinitions, RouteMap, RouteMapDef, RouteMatcher, RouteName, RouteOf, RouteParams, RouteUnion, RouterError, RouterState, UseRouteResult } from "./types.js";
2
+ import { HeadlessReactRouter, ReactRouterStore, createHeadlessRouter } from "./headless.js";
3
+ import { LinkProps } from "./components/Link.js";
4
+ import { NavigateProps } from "./components/Navigate.js";
5
+ import { RouteProps } from "./components/Route.js";
6
+ import { ReactRouter, createRouter } from "./create-router.js";
7
+ import { createRoute, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route } from "iten-core";
8
+ export { type HeadlessReactRouter, type InferRoutes, type LinkProps, type NavigateProps, type NoParams, type QueryClientLike, type ReactRouter, type ReactRouterConfig, type ReactRouterStore, type RouteConfigMap, type RouteDefinition, type RouteDefinitions, type RouteMap, type RouteMapDef, type RouteMatcher, type RouteName, type RouteOf, type RouteParams, type RouteProps, type RouteUnion, type RouterError, type RouterState, type UseRouteResult, createHeadlessRouter, createRoute, createRouter, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route };
package/dist/index.mjs ADDED
@@ -0,0 +1,4 @@
1
+ import { createHeadlessRouter } from "./headless.mjs";
2
+ import { createRouter } from "./create-router.mjs";
3
+ import { createRoute, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route } from "iten-core";
4
+ export { createHeadlessRouter, createRoute, createRouter, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route };
@@ -0,0 +1,19 @@
1
+ import { InferRoutes, NoParams, QueryClientLike, RouteConfigMap, RouteDefinition, RouteDefinitions, RouteMap as RouteMap$1, RouteMapDef as RouteMapDef$1, RouteMatcher, RouteName, RouteOf, RouteParams, RouteUnion as RouteUnion$1, RouterError as RouterError$1, RouterState as RouterState$1 } from "iten-core";
2
+
3
+ //#region src/types.d.ts
4
+ type ReactRouterConfig<M extends RouteMapDef$1, Ctx = unknown> = {
5
+ initial: RouteUnion$1<M> | null;
6
+ routeConfig?: RouteConfigMap<M, Ctx> | undefined;
7
+ maxHistoryLength?: number | undefined;
8
+ context?: Ctx | (() => Ctx) | undefined;
9
+ queryClient?: QueryClientLike | null | undefined;
10
+ };
11
+ type UseRouteResult<M extends RouteMapDef$1, K extends keyof M> = {
12
+ isActive: true;
13
+ params: M[K];
14
+ } | {
15
+ isActive: false;
16
+ params: null;
17
+ };
18
+ //#endregion
19
+ export { type InferRoutes, type NoParams, type QueryClientLike, ReactRouterConfig, type RouteConfigMap, type RouteDefinition, type RouteDefinitions, type RouteMap$1 as RouteMap, type RouteMapDef$1 as RouteMapDef, type RouteMatcher, type RouteName, type RouteOf, type RouteParams, type RouteUnion$1 as RouteUnion, type RouterError$1 as RouterError, type RouterState$1 as RouterState, UseRouteResult };
@@ -0,0 +1,19 @@
1
+ import { InferRoutes, NoParams, QueryClientLike, RouteConfigMap, RouteDefinition, RouteDefinitions, RouteMap as RouteMap$1, RouteMapDef as RouteMapDef$1, RouteMatcher, RouteName, RouteOf, RouteParams, RouteUnion as RouteUnion$1, RouterError as RouterError$1, RouterState as RouterState$1 } from "iten-core";
2
+
3
+ //#region src/types.d.ts
4
+ type ReactRouterConfig<M extends RouteMapDef$1, Ctx = unknown> = {
5
+ initial: RouteUnion$1<M> | null;
6
+ routeConfig?: RouteConfigMap<M, Ctx> | undefined;
7
+ maxHistoryLength?: number | undefined;
8
+ context?: Ctx | (() => Ctx) | undefined;
9
+ queryClient?: QueryClientLike | null | undefined;
10
+ };
11
+ type UseRouteResult<M extends RouteMapDef$1, K extends keyof M> = {
12
+ isActive: true;
13
+ params: M[K];
14
+ } | {
15
+ isActive: false;
16
+ params: null;
17
+ };
18
+ //#endregion
19
+ export { type InferRoutes, type NoParams, type QueryClientLike, ReactRouterConfig, type RouteConfigMap, type RouteDefinition, type RouteDefinitions, type RouteMap$1 as RouteMap, type RouteMapDef$1 as RouteMapDef, type RouteMatcher, type RouteName, type RouteOf, type RouteParams, type RouteUnion$1 as RouteUnion, type RouterError$1 as RouterError, type RouterState$1 as RouterState, UseRouteResult };
package/dist/url.cjs ADDED
@@ -0,0 +1,20 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let iten_core_url = require("iten-core/url");
3
+ //#region src/url.ts
4
+ function createUrlSync({ router, ...input }) {
5
+ const coreLike = {
6
+ getState: () => router.store.getState(),
7
+ navigate: (navigateInput) => router.store.navigate(navigateInput),
8
+ goBack: () => router.store.goBack(),
9
+ subscribe: ({ listener }) => router.store.subscribe({ listener: () => {
10
+ listener(router.store.getState());
11
+ } }),
12
+ dispose: () => {}
13
+ };
14
+ return (0, iten_core_url.createUrlSync)({
15
+ ...input,
16
+ router: coreLike
17
+ });
18
+ }
19
+ //#endregion
20
+ exports.createUrlSync = createUrlSync;
package/dist/url.d.cts ADDED
@@ -0,0 +1,14 @@
1
+ import { HeadlessReactRouter } from "./headless.cjs";
2
+ import { RouteMapDef } from "iten-core";
3
+ import { CreateUrlSyncInput as CreateUrlSyncInput$1, FormatUrlInput, ParseUrlInput, UrlHydrateInput, UrlParseErrorInput, UrlStartInput, UrlSubscribeInput, UrlSync, UrlSync as UrlSync$1, UrlWriteInput, UrlWriteMode } from "iten-core/url";
4
+
5
+ //#region src/url.d.ts
6
+ type CreateUrlSyncInput<M extends RouteMapDef> = Omit<CreateUrlSyncInput$1<M>, "router"> & {
7
+ router: HeadlessReactRouter<M>;
8
+ };
9
+ declare function createUrlSync<M extends RouteMapDef>({
10
+ router,
11
+ ...input
12
+ }: CreateUrlSyncInput<M>): UrlSync$1<M>;
13
+ //#endregion
14
+ export { CreateUrlSyncInput, type FormatUrlInput, type ParseUrlInput, type UrlHydrateInput, type UrlParseErrorInput, type UrlStartInput, type UrlSubscribeInput, type UrlSync, type UrlWriteInput, type UrlWriteMode, createUrlSync };
package/dist/url.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { HeadlessReactRouter } from "./headless.js";
2
+ import { RouteMapDef } from "iten-core";
3
+ import { CreateUrlSyncInput as CreateUrlSyncInput$1, FormatUrlInput, ParseUrlInput, UrlHydrateInput, UrlParseErrorInput, UrlStartInput, UrlSubscribeInput, UrlSync, UrlSync as UrlSync$1, UrlWriteInput, UrlWriteMode } from "iten-core/url";
4
+
5
+ //#region src/url.d.ts
6
+ type CreateUrlSyncInput<M extends RouteMapDef> = Omit<CreateUrlSyncInput$1<M>, "router"> & {
7
+ router: HeadlessReactRouter<M>;
8
+ };
9
+ declare function createUrlSync<M extends RouteMapDef>({
10
+ router,
11
+ ...input
12
+ }: CreateUrlSyncInput<M>): UrlSync$1<M>;
13
+ //#endregion
14
+ export { CreateUrlSyncInput, type FormatUrlInput, type ParseUrlInput, type UrlHydrateInput, type UrlParseErrorInput, type UrlStartInput, type UrlSubscribeInput, type UrlSync, type UrlWriteInput, type UrlWriteMode, createUrlSync };
package/dist/url.mjs ADDED
@@ -0,0 +1,19 @@
1
+ import { createUrlSync as createUrlSync$1 } from "iten-core/url";
2
+ //#region src/url.ts
3
+ function createUrlSync({ router, ...input }) {
4
+ const coreLike = {
5
+ getState: () => router.store.getState(),
6
+ navigate: (navigateInput) => router.store.navigate(navigateInput),
7
+ goBack: () => router.store.goBack(),
8
+ subscribe: ({ listener }) => router.store.subscribe({ listener: () => {
9
+ listener(router.store.getState());
10
+ } }),
11
+ dispose: () => {}
12
+ };
13
+ return createUrlSync$1({
14
+ ...input,
15
+ router: coreLike
16
+ });
17
+ }
18
+ //#endregion
19
+ export { createUrlSync };
package/dist/utils.cjs ADDED
@@ -0,0 +1,44 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let iten_core_utils = require("iten-core/utils");
3
+ Object.defineProperty(exports, "createRoute", {
4
+ enumerable: true,
5
+ get: function() {
6
+ return iten_core_utils.createRoute;
7
+ }
8
+ });
9
+ Object.defineProperty(exports, "defineRouteConfig", {
10
+ enumerable: true,
11
+ get: function() {
12
+ return iten_core_utils.defineRouteConfig;
13
+ }
14
+ });
15
+ Object.defineProperty(exports, "defineRoutes", {
16
+ enumerable: true,
17
+ get: function() {
18
+ return iten_core_utils.defineRoutes;
19
+ }
20
+ });
21
+ Object.defineProperty(exports, "isRoute", {
22
+ enumerable: true,
23
+ get: function() {
24
+ return iten_core_utils.isRoute;
25
+ }
26
+ });
27
+ Object.defineProperty(exports, "isRouteName", {
28
+ enumerable: true,
29
+ get: function() {
30
+ return iten_core_utils.isRouteName;
31
+ }
32
+ });
33
+ Object.defineProperty(exports, "matchRoute", {
34
+ enumerable: true,
35
+ get: function() {
36
+ return iten_core_utils.matchRoute;
37
+ }
38
+ });
39
+ Object.defineProperty(exports, "route", {
40
+ enumerable: true,
41
+ get: function() {
42
+ return iten_core_utils.route;
43
+ }
44
+ });
@@ -0,0 +1,3 @@
1
+ import { InferRoutes, NoParams, RouteConfigMap, RouteMap, RouteMapDef, RouteUnion } from "iten-core";
2
+ import { RouteMatcher, RouteName, RouteOf, RouteParams, createRoute, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route } from "iten-core/utils";
3
+ export { type InferRoutes, type NoParams, type RouteConfigMap, type RouteMap, type RouteMapDef, type RouteMatcher, type RouteName, type RouteOf, type RouteParams, type RouteUnion, createRoute, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route };
@@ -0,0 +1,3 @@
1
+ import { InferRoutes, NoParams, RouteConfigMap, RouteMap, RouteMapDef, RouteUnion } from "iten-core";
2
+ import { RouteMatcher, RouteName, RouteOf, RouteParams, createRoute, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route } from "iten-core/utils";
3
+ export { type InferRoutes, type NoParams, type RouteConfigMap, type RouteMap, type RouteMapDef, type RouteMatcher, type RouteName, type RouteOf, type RouteParams, type RouteUnion, createRoute, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route };
package/dist/utils.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import { createRoute, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route } from "iten-core/utils";
2
+ export { createRoute, defineRouteConfig, defineRoutes, isRoute, isRouteName, matchRoute, route };
package/dist/zod.cjs ADDED
@@ -0,0 +1,77 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let zod = require("zod");
3
+ //#region src/zod.ts
4
+ function hasOwnName({ value }) {
5
+ return typeof value === "object" && value !== null && Object.hasOwn(value, "name");
6
+ }
7
+ function splitInput({ value }) {
8
+ if (typeof value !== "object" || value === null || !Object.hasOwn(value, "name")) return null;
9
+ const { name, ...params } = value;
10
+ return {
11
+ name,
12
+ params
13
+ };
14
+ }
15
+ function getSchema({ schemas, name }) {
16
+ if (typeof name !== "string" || !Object.hasOwn(schemas, name)) return null;
17
+ const routeName = name;
18
+ return {
19
+ name: routeName,
20
+ schema: schemas[routeName]
21
+ };
22
+ }
23
+ function defineZodRoutes(schemas) {
24
+ return schemas;
25
+ }
26
+ function zodNoParams() {
27
+ return zod.z.object({}).strict().default({});
28
+ }
29
+ function createZodRoute(schemas) {
30
+ return (({ name, input }) => {
31
+ const schema = schemas[name];
32
+ if (!schema) throw new TypeError(`[iten] Unknown route name: ${String(name)}`);
33
+ if (hasOwnName({ value: input })) throw new TypeError("[iten] Zod route params must not include a name field");
34
+ const params = schema.parse(input ?? {});
35
+ if (hasOwnName({ value: params })) throw new TypeError("[iten] Zod route params must not include a name field");
36
+ return {
37
+ name,
38
+ ...params
39
+ };
40
+ });
41
+ }
42
+ function parseZodRoute({ schemas, value }) {
43
+ const input = splitInput({ value });
44
+ if (!input) return {
45
+ success: false,
46
+ error: /* @__PURE__ */ new TypeError("[iten] Expected a route object with a name field")
47
+ };
48
+ const resolved = getSchema({
49
+ schemas,
50
+ name: input.name
51
+ });
52
+ if (!resolved) return {
53
+ success: false,
54
+ error: /* @__PURE__ */ new TypeError(`[iten] Unknown route name: ${String(input.name)}`)
55
+ };
56
+ const result = resolved.schema.safeParse(input.params);
57
+ if (!result.success) return {
58
+ success: false,
59
+ error: result.error
60
+ };
61
+ if (hasOwnName({ value: result.data })) return {
62
+ success: false,
63
+ error: /* @__PURE__ */ new TypeError("[iten] Zod route params must not include a name field")
64
+ };
65
+ return {
66
+ success: true,
67
+ route: {
68
+ name: resolved.name,
69
+ ...result.data
70
+ }
71
+ };
72
+ }
73
+ //#endregion
74
+ exports.createZodRoute = createZodRoute;
75
+ exports.defineZodRoutes = defineZodRoutes;
76
+ exports.parseZodRoute = parseZodRoute;
77
+ exports.zodNoParams = zodNoParams;
package/dist/zod.d.cts ADDED
@@ -0,0 +1,48 @@
1
+ import { RouteMap, RouteUnion } from "iten-core";
2
+ import { z } from "zod";
3
+
4
+ //#region src/zod.d.ts
5
+ type ObjectParams = Record<string, unknown> & {
6
+ name?: never;
7
+ };
8
+ declare const noParamsBrand: unique symbol;
9
+ type ZodNoParamsSchema = z.ZodDefault<z.ZodObject<Record<string, never>>> & {
10
+ readonly [noParamsBrand]: true;
11
+ };
12
+ type ZodRouteSchemas = Record<string, z.ZodType<ObjectParams, unknown>>;
13
+ type ZodRouteMap<Schemas extends ZodRouteSchemas> = RouteMap<{ [K in Extract<keyof Schemas, string>]: z.output<Schemas[K]> }>;
14
+ type ZodRouteUnion<Schemas extends ZodRouteSchemas> = RouteUnion<ZodRouteMap<Schemas>>;
15
+ type EmptySchemaKeys<Schemas extends ZodRouteSchemas> = { [K in keyof Schemas]: Schemas[K] extends ZodNoParamsSchema ? K : never }[keyof Schemas];
16
+ type ZodRouteFactory<Schemas extends ZodRouteSchemas> = {
17
+ <K extends Extract<EmptySchemaKeys<Schemas>, string>>(input: {
18
+ name: K;
19
+ input?: never;
20
+ }): Extract<ZodRouteUnion<Schemas>, {
21
+ name: K;
22
+ }>;
23
+ <K extends Exclude<Extract<keyof Schemas, string>, Extract<EmptySchemaKeys<Schemas>, string>>>(input: {
24
+ name: K;
25
+ input: z.input<Schemas[K]>;
26
+ }): Extract<ZodRouteUnion<Schemas>, {
27
+ name: K;
28
+ }>;
29
+ };
30
+ type ZodRouteParseResult<Schemas extends ZodRouteSchemas> = {
31
+ success: true;
32
+ route: ZodRouteUnion<Schemas>;
33
+ } | {
34
+ success: false;
35
+ error: unknown;
36
+ };
37
+ declare function defineZodRoutes<const Schemas extends ZodRouteSchemas>(schemas: Schemas): Schemas;
38
+ declare function zodNoParams(): ZodNoParamsSchema;
39
+ declare function createZodRoute<const Schemas extends ZodRouteSchemas>(schemas: Schemas): ZodRouteFactory<Schemas>;
40
+ declare function parseZodRoute<const Schemas extends ZodRouteSchemas>({
41
+ schemas,
42
+ value
43
+ }: {
44
+ schemas: Schemas;
45
+ value: unknown;
46
+ }): ZodRouteParseResult<Schemas>;
47
+ //#endregion
48
+ export { ZodRouteFactory, ZodRouteMap, ZodRouteParseResult, ZodRouteSchemas, ZodRouteUnion, createZodRoute, defineZodRoutes, parseZodRoute, zodNoParams };
package/dist/zod.d.ts ADDED
@@ -0,0 +1,48 @@
1
+ import { RouteMap, RouteUnion } from "iten-core";
2
+ import { z } from "zod";
3
+
4
+ //#region src/zod.d.ts
5
+ type ObjectParams = Record<string, unknown> & {
6
+ name?: never;
7
+ };
8
+ declare const noParamsBrand: unique symbol;
9
+ type ZodNoParamsSchema = z.ZodDefault<z.ZodObject<Record<string, never>>> & {
10
+ readonly [noParamsBrand]: true;
11
+ };
12
+ type ZodRouteSchemas = Record<string, z.ZodType<ObjectParams, unknown>>;
13
+ type ZodRouteMap<Schemas extends ZodRouteSchemas> = RouteMap<{ [K in Extract<keyof Schemas, string>]: z.output<Schemas[K]> }>;
14
+ type ZodRouteUnion<Schemas extends ZodRouteSchemas> = RouteUnion<ZodRouteMap<Schemas>>;
15
+ type EmptySchemaKeys<Schemas extends ZodRouteSchemas> = { [K in keyof Schemas]: Schemas[K] extends ZodNoParamsSchema ? K : never }[keyof Schemas];
16
+ type ZodRouteFactory<Schemas extends ZodRouteSchemas> = {
17
+ <K extends Extract<EmptySchemaKeys<Schemas>, string>>(input: {
18
+ name: K;
19
+ input?: never;
20
+ }): Extract<ZodRouteUnion<Schemas>, {
21
+ name: K;
22
+ }>;
23
+ <K extends Exclude<Extract<keyof Schemas, string>, Extract<EmptySchemaKeys<Schemas>, string>>>(input: {
24
+ name: K;
25
+ input: z.input<Schemas[K]>;
26
+ }): Extract<ZodRouteUnion<Schemas>, {
27
+ name: K;
28
+ }>;
29
+ };
30
+ type ZodRouteParseResult<Schemas extends ZodRouteSchemas> = {
31
+ success: true;
32
+ route: ZodRouteUnion<Schemas>;
33
+ } | {
34
+ success: false;
35
+ error: unknown;
36
+ };
37
+ declare function defineZodRoutes<const Schemas extends ZodRouteSchemas>(schemas: Schemas): Schemas;
38
+ declare function zodNoParams(): ZodNoParamsSchema;
39
+ declare function createZodRoute<const Schemas extends ZodRouteSchemas>(schemas: Schemas): ZodRouteFactory<Schemas>;
40
+ declare function parseZodRoute<const Schemas extends ZodRouteSchemas>({
41
+ schemas,
42
+ value
43
+ }: {
44
+ schemas: Schemas;
45
+ value: unknown;
46
+ }): ZodRouteParseResult<Schemas>;
47
+ //#endregion
48
+ export { ZodRouteFactory, ZodRouteMap, ZodRouteParseResult, ZodRouteSchemas, ZodRouteUnion, createZodRoute, defineZodRoutes, parseZodRoute, zodNoParams };
package/dist/zod.mjs ADDED
@@ -0,0 +1,73 @@
1
+ import { z } from "zod";
2
+ //#region src/zod.ts
3
+ function hasOwnName({ value }) {
4
+ return typeof value === "object" && value !== null && Object.hasOwn(value, "name");
5
+ }
6
+ function splitInput({ value }) {
7
+ if (typeof value !== "object" || value === null || !Object.hasOwn(value, "name")) return null;
8
+ const { name, ...params } = value;
9
+ return {
10
+ name,
11
+ params
12
+ };
13
+ }
14
+ function getSchema({ schemas, name }) {
15
+ if (typeof name !== "string" || !Object.hasOwn(schemas, name)) return null;
16
+ const routeName = name;
17
+ return {
18
+ name: routeName,
19
+ schema: schemas[routeName]
20
+ };
21
+ }
22
+ function defineZodRoutes(schemas) {
23
+ return schemas;
24
+ }
25
+ function zodNoParams() {
26
+ return z.object({}).strict().default({});
27
+ }
28
+ function createZodRoute(schemas) {
29
+ return (({ name, input }) => {
30
+ const schema = schemas[name];
31
+ if (!schema) throw new TypeError(`[iten] Unknown route name: ${String(name)}`);
32
+ if (hasOwnName({ value: input })) throw new TypeError("[iten] Zod route params must not include a name field");
33
+ const params = schema.parse(input ?? {});
34
+ if (hasOwnName({ value: params })) throw new TypeError("[iten] Zod route params must not include a name field");
35
+ return {
36
+ name,
37
+ ...params
38
+ };
39
+ });
40
+ }
41
+ function parseZodRoute({ schemas, value }) {
42
+ const input = splitInput({ value });
43
+ if (!input) return {
44
+ success: false,
45
+ error: /* @__PURE__ */ new TypeError("[iten] Expected a route object with a name field")
46
+ };
47
+ const resolved = getSchema({
48
+ schemas,
49
+ name: input.name
50
+ });
51
+ if (!resolved) return {
52
+ success: false,
53
+ error: /* @__PURE__ */ new TypeError(`[iten] Unknown route name: ${String(input.name)}`)
54
+ };
55
+ const result = resolved.schema.safeParse(input.params);
56
+ if (!result.success) return {
57
+ success: false,
58
+ error: result.error
59
+ };
60
+ if (hasOwnName({ value: result.data })) return {
61
+ success: false,
62
+ error: /* @__PURE__ */ new TypeError("[iten] Zod route params must not include a name field")
63
+ };
64
+ return {
65
+ success: true,
66
+ route: {
67
+ name: resolved.name,
68
+ ...result.data
69
+ }
70
+ };
71
+ }
72
+ //#endregion
73
+ export { createZodRoute, defineZodRoutes, parseZodRoute, zodNoParams };