@hyeonqyu/typed-router-react 1.5.5 → 1.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/dist/index.d.mts +28 -6
- package/dist/index.d.ts +28 -6
- package/dist/index.js +33 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +34 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import * as _hyeonqyu_typed_router_core from '@hyeonqyu/typed-router-core';
|
|
2
|
+
import { PartialRouteTree as PartialRouteTree$1, RouteTree as RouteTree$1, ResolvedRouteTree as ResolvedRouteTree$1, RoutePathname as RoutePathname$1 } from '@hyeonqyu/typed-router-core';
|
|
3
|
+
export * from '@hyeonqyu/typed-router-core';
|
|
4
|
+
import * as react_router from 'react-router';
|
|
1
5
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
6
|
import { ReactNode } from 'react';
|
|
3
|
-
export * from '@hyeonqyu/typed-router-core';
|
|
4
7
|
|
|
5
8
|
type Paths<TObject, TSplitter extends string, TPrev extends string = '', TMaxDepth extends number = 10, TDepth extends unknown[] = []> = TDepth['length'] extends TMaxDepth ? never : TSplitter | {
|
|
6
9
|
[K in keyof TObject & string]: TObject[K] extends object ? `${TSplitter}${TPrev extends '' ? K : `${TPrev}${TSplitter}${K}`}` | Paths<TObject[K], TSplitter, TPrev extends '' ? K : `${TPrev}${TSplitter}${K}`, TMaxDepth, [...TDepth, 1]> : `${TSplitter}${TPrev extends '' ? K : `${TPrev}${TSplitter}${K}`}`;
|
|
@@ -39,23 +42,42 @@ type RouteTreeWithoutMetadata<T> = {
|
|
|
39
42
|
[K in keyof T as K extends '_metadata' ? never : K]: T[K] extends object ? RouteTreeWithoutMetadata<T[K]> : T[K];
|
|
40
43
|
};
|
|
41
44
|
type RoutePathname<TMetadata extends BaseMetadata, TContext, TRouteTree extends PartialRouteTree<TMetadata, TContext>> = Paths<RouteTreeWithoutMetadata<TRouteTree>, '/', ''>;
|
|
45
|
+
type SimplifyPathname<T> = T extends string ? T : never;
|
|
42
46
|
type ResolvedRouteTree<TMetadata extends BaseMetadata, TContext, TRouteTree extends PartialRouteTree<TMetadata, TContext>> = TRouteTree & RouteTree<TMetadata, TContext, TRouteTree>;
|
|
47
|
+
type ExtractSearchParams<TNode> = TNode extends {
|
|
48
|
+
_metadata: {
|
|
49
|
+
searchParamsSchema: AnyZodSchema;
|
|
50
|
+
};
|
|
51
|
+
} ? TNode['_metadata']['searchParamsSchema']['_output'] : Record<string, unknown>;
|
|
52
|
+
type GetRouteNode<TRouteTree, TPath extends string> = TPath extends `/${infer First}/${infer Rest}` ? First extends keyof TRouteTree ? GetRouteNode<TRouteTree[First], `/${Rest}`> : never : TPath extends `/${infer Key}` ? Key extends keyof TRouteTree ? TRouteTree[Key] : never : TRouteTree;
|
|
43
53
|
|
|
44
54
|
declare const createAppRoutes: <TMetadata extends {
|
|
45
55
|
component: ReactNode;
|
|
46
|
-
}, TContext>() => <TRouteTree extends PartialRouteTree<TMetadata, TContext>>(appRoutes: TRouteTree & RouteTree<TMetadata, TContext, TRouteTree
|
|
56
|
+
}, TContext>() => <TRouteTree extends PartialRouteTree$1<TMetadata, TContext>>(appRoutes: TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree>) => {
|
|
47
57
|
AppRoutesProvider: ({ children }: {
|
|
48
58
|
children: ReactNode;
|
|
49
59
|
}) => react_jsx_runtime.JSX.Element;
|
|
50
|
-
useAppRoutes: () => ResolvedRouteTree<TMetadata, TContext, TRouteTree>;
|
|
51
|
-
|
|
60
|
+
useAppRoutes: () => ResolvedRouteTree$1<TMetadata, TContext, TRouteTree>;
|
|
61
|
+
useTypedNavigation: () => <TPath extends RoutePathname$1<TMetadata, TContext, TRouteTree>>(href: TPath, options?: Omit<react_router.NavigateOptions, "searchParams"> & {
|
|
62
|
+
searchParams?: _hyeonqyu_typed_router_core.ExtractSearchParams<_hyeonqyu_typed_router_core.GetRouteNode<TRouteTree, TPath>> | undefined;
|
|
63
|
+
}) => void | Promise<void>;
|
|
52
64
|
getPathnameFromNode: (targetNode: RouteNode<TMetadata, TContext>, params?: SearchParams) => string | undefined;
|
|
53
|
-
freezeAppRoutes: () => ResolvedRouteTree<TMetadata, TContext, TRouteTree
|
|
65
|
+
freezeAppRoutes: () => ResolvedRouteTree<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>;
|
|
66
|
+
useCurrentRouteNode: <TPath extends RoutePathname<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>>(pathname: TPath) => RouteNode<TMetadata, TContext>;
|
|
67
|
+
appRoutes: TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>;
|
|
54
68
|
_types: {
|
|
69
|
+
AppRoutesPathname: RoutePathname$1<TMetadata, TContext, TRouteTree>;
|
|
55
70
|
AppRoutesMetadata: TMetadata;
|
|
56
71
|
AppRoutesContext: TContext;
|
|
57
|
-
AppRoutesPathname: RoutePathname<TMetadata, TContext, TRouteTree>;
|
|
58
72
|
AppRouteNode: RouteNode<TMetadata, TContext>;
|
|
73
|
+
AppRoutes: ResolvedRouteTree<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>;
|
|
74
|
+
AppRouteTree: TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>;
|
|
75
|
+
AppRouteNodeMetadata: RouteNodeMetadata<TMetadata, TContext>;
|
|
76
|
+
AppPartialRouteTree: PartialRouteTree<TMetadata, TContext>;
|
|
77
|
+
GetRouteNode: <TPath extends RoutePathname<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>>(path: TPath) => GetRouteNode<ResolvedRouteTree<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>, TPath>;
|
|
78
|
+
SearchParamsForPath: <TPath extends RoutePathname<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>>(path: TPath) => ExtractSearchParams<GetRouteNode<ResolvedRouteTree<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>, TPath>>;
|
|
79
|
+
ExtractSearchParams: <TNode extends RouteNode<TMetadata, TContext>>(node: TNode) => ExtractSearchParams<TNode>;
|
|
80
|
+
SimplifyPathname: SimplifyPathname<RoutePathname<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>>;
|
|
59
81
|
};
|
|
60
82
|
};
|
|
61
83
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import * as _hyeonqyu_typed_router_core from '@hyeonqyu/typed-router-core';
|
|
2
|
+
import { PartialRouteTree as PartialRouteTree$1, RouteTree as RouteTree$1, ResolvedRouteTree as ResolvedRouteTree$1, RoutePathname as RoutePathname$1 } from '@hyeonqyu/typed-router-core';
|
|
3
|
+
export * from '@hyeonqyu/typed-router-core';
|
|
4
|
+
import * as react_router from 'react-router';
|
|
1
5
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
6
|
import { ReactNode } from 'react';
|
|
3
|
-
export * from '@hyeonqyu/typed-router-core';
|
|
4
7
|
|
|
5
8
|
type Paths<TObject, TSplitter extends string, TPrev extends string = '', TMaxDepth extends number = 10, TDepth extends unknown[] = []> = TDepth['length'] extends TMaxDepth ? never : TSplitter | {
|
|
6
9
|
[K in keyof TObject & string]: TObject[K] extends object ? `${TSplitter}${TPrev extends '' ? K : `${TPrev}${TSplitter}${K}`}` | Paths<TObject[K], TSplitter, TPrev extends '' ? K : `${TPrev}${TSplitter}${K}`, TMaxDepth, [...TDepth, 1]> : `${TSplitter}${TPrev extends '' ? K : `${TPrev}${TSplitter}${K}`}`;
|
|
@@ -39,23 +42,42 @@ type RouteTreeWithoutMetadata<T> = {
|
|
|
39
42
|
[K in keyof T as K extends '_metadata' ? never : K]: T[K] extends object ? RouteTreeWithoutMetadata<T[K]> : T[K];
|
|
40
43
|
};
|
|
41
44
|
type RoutePathname<TMetadata extends BaseMetadata, TContext, TRouteTree extends PartialRouteTree<TMetadata, TContext>> = Paths<RouteTreeWithoutMetadata<TRouteTree>, '/', ''>;
|
|
45
|
+
type SimplifyPathname<T> = T extends string ? T : never;
|
|
42
46
|
type ResolvedRouteTree<TMetadata extends BaseMetadata, TContext, TRouteTree extends PartialRouteTree<TMetadata, TContext>> = TRouteTree & RouteTree<TMetadata, TContext, TRouteTree>;
|
|
47
|
+
type ExtractSearchParams<TNode> = TNode extends {
|
|
48
|
+
_metadata: {
|
|
49
|
+
searchParamsSchema: AnyZodSchema;
|
|
50
|
+
};
|
|
51
|
+
} ? TNode['_metadata']['searchParamsSchema']['_output'] : Record<string, unknown>;
|
|
52
|
+
type GetRouteNode<TRouteTree, TPath extends string> = TPath extends `/${infer First}/${infer Rest}` ? First extends keyof TRouteTree ? GetRouteNode<TRouteTree[First], `/${Rest}`> : never : TPath extends `/${infer Key}` ? Key extends keyof TRouteTree ? TRouteTree[Key] : never : TRouteTree;
|
|
43
53
|
|
|
44
54
|
declare const createAppRoutes: <TMetadata extends {
|
|
45
55
|
component: ReactNode;
|
|
46
|
-
}, TContext>() => <TRouteTree extends PartialRouteTree<TMetadata, TContext>>(appRoutes: TRouteTree & RouteTree<TMetadata, TContext, TRouteTree
|
|
56
|
+
}, TContext>() => <TRouteTree extends PartialRouteTree$1<TMetadata, TContext>>(appRoutes: TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree>) => {
|
|
47
57
|
AppRoutesProvider: ({ children }: {
|
|
48
58
|
children: ReactNode;
|
|
49
59
|
}) => react_jsx_runtime.JSX.Element;
|
|
50
|
-
useAppRoutes: () => ResolvedRouteTree<TMetadata, TContext, TRouteTree>;
|
|
51
|
-
|
|
60
|
+
useAppRoutes: () => ResolvedRouteTree$1<TMetadata, TContext, TRouteTree>;
|
|
61
|
+
useTypedNavigation: () => <TPath extends RoutePathname$1<TMetadata, TContext, TRouteTree>>(href: TPath, options?: Omit<react_router.NavigateOptions, "searchParams"> & {
|
|
62
|
+
searchParams?: _hyeonqyu_typed_router_core.ExtractSearchParams<_hyeonqyu_typed_router_core.GetRouteNode<TRouteTree, TPath>> | undefined;
|
|
63
|
+
}) => void | Promise<void>;
|
|
52
64
|
getPathnameFromNode: (targetNode: RouteNode<TMetadata, TContext>, params?: SearchParams) => string | undefined;
|
|
53
|
-
freezeAppRoutes: () => ResolvedRouteTree<TMetadata, TContext, TRouteTree
|
|
65
|
+
freezeAppRoutes: () => ResolvedRouteTree<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>;
|
|
66
|
+
useCurrentRouteNode: <TPath extends RoutePathname<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>>(pathname: TPath) => RouteNode<TMetadata, TContext>;
|
|
67
|
+
appRoutes: TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>;
|
|
54
68
|
_types: {
|
|
69
|
+
AppRoutesPathname: RoutePathname$1<TMetadata, TContext, TRouteTree>;
|
|
55
70
|
AppRoutesMetadata: TMetadata;
|
|
56
71
|
AppRoutesContext: TContext;
|
|
57
|
-
AppRoutesPathname: RoutePathname<TMetadata, TContext, TRouteTree>;
|
|
58
72
|
AppRouteNode: RouteNode<TMetadata, TContext>;
|
|
73
|
+
AppRoutes: ResolvedRouteTree<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>;
|
|
74
|
+
AppRouteTree: TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>;
|
|
75
|
+
AppRouteNodeMetadata: RouteNodeMetadata<TMetadata, TContext>;
|
|
76
|
+
AppPartialRouteTree: PartialRouteTree<TMetadata, TContext>;
|
|
77
|
+
GetRouteNode: <TPath extends RoutePathname<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>>(path: TPath) => GetRouteNode<ResolvedRouteTree<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>, TPath>;
|
|
78
|
+
SearchParamsForPath: <TPath extends RoutePathname<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>>(path: TPath) => ExtractSearchParams<GetRouteNode<ResolvedRouteTree<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>, TPath>>;
|
|
79
|
+
ExtractSearchParams: <TNode extends RouteNode<TMetadata, TContext>>(node: TNode) => ExtractSearchParams<TNode>;
|
|
80
|
+
SimplifyPathname: SimplifyPathname<RoutePathname<TMetadata, TContext, TRouteTree & RouteTree$1<TMetadata, TContext, TRouteTree, TRouteTree>>>;
|
|
59
81
|
};
|
|
60
82
|
};
|
|
61
83
|
|
package/dist/index.js
CHANGED
|
@@ -2,9 +2,41 @@
|
|
|
2
2
|
|
|
3
3
|
var routes_utils = require('@hyeonqyu/typed-router-core/routes.utils');
|
|
4
4
|
var typedRouterCore = require('@hyeonqyu/typed-router-core');
|
|
5
|
+
var reactRouterDom = require('react-router-dom');
|
|
5
6
|
|
|
6
7
|
// src/index.ts
|
|
7
|
-
var
|
|
8
|
+
var createTypedNavigation = () => {
|
|
9
|
+
const getHrefWithSearchParams = (href, searchParams) => {
|
|
10
|
+
const { pathname, remainingParams } = typedRouterCore.replaceDynamicSegments(href, searchParams);
|
|
11
|
+
return `${pathname}${typedRouterCore.toSearchParamsString(remainingParams, { includeQuestionMark: true })}`;
|
|
12
|
+
};
|
|
13
|
+
return () => {
|
|
14
|
+
const navigate = reactRouterDom.useNavigate();
|
|
15
|
+
return (href, options) => {
|
|
16
|
+
const finalHref = getHrefWithSearchParams(href, options?.searchParams);
|
|
17
|
+
return navigate(finalHref, options);
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
var createAppRoutes = () => {
|
|
22
|
+
return (appRoutes) => {
|
|
23
|
+
const { AppRoutesProvider, useAppRoutes, getPathnameFromNode, freezeAppRoutes, useCurrentRouteNode, _types } = routes_utils.createAppRoutes()(appRoutes);
|
|
24
|
+
const useTypedNavigation = createTypedNavigation();
|
|
25
|
+
return {
|
|
26
|
+
AppRoutesProvider,
|
|
27
|
+
useAppRoutes,
|
|
28
|
+
useTypedNavigation,
|
|
29
|
+
getPathnameFromNode,
|
|
30
|
+
freezeAppRoutes,
|
|
31
|
+
useCurrentRouteNode,
|
|
32
|
+
appRoutes,
|
|
33
|
+
_types: {
|
|
34
|
+
..._types,
|
|
35
|
+
AppRoutesPathname: {}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
};
|
|
8
40
|
|
|
9
41
|
exports.createAppRoutes = createAppRoutes;
|
|
10
42
|
Object.keys(typedRouterCore).forEach(function (k) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["coreCreateAppRoutes"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/navigation.hooks.ts","../src/index.ts"],"names":["replaceDynamicSegments","toSearchParamsString","useNavigate","coreCreateAppRoutes"],"mappings":";;;;;;;AAQO,IAAM,wBAAwB,MAA+D;AAClG,EAAA,MAAM,uBAAA,GAA0B,CAAC,IAAA,EAAiB,YAAA,KAAgC;AAChF,IAAA,MAAM,EAAE,QAAA,EAAU,eAAA,EAAgB,GAAIA,sCAAA,CAAuB,MAAgB,YAAY,CAAA;AACzF,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAGC,oCAAA,CAAqB,iBAAiB,EAAE,mBAAA,EAAqB,IAAA,EAAM,CAAC,CAAA,CAAA;AAAA,EAC3F,CAAA;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,MAAM,WAAWC,0BAAA,EAAY;AAE7B,IAAA,OAAO,CAA0B,MAAa,OAAA,KAA2E;AACvH,MAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,IAAA,EAAM,OAAA,EAAS,YAA4B,CAAA;AACrF,MAAA,OAAO,QAAA,CAAS,WAAW,OAAO,CAAA;AAAA,IACpC,CAAA;AAAA,EACF,CAAA;AACF,CAAA;ACjBO,IAAM,kBAAkB,MAA4D;AACzF,EAAA,OAAO,CAA2D,SAAA,KAAuE;AACvI,IAAA,MAAM,EAAE,iBAAA,EAAmB,YAAA,EAAc,mBAAA,EAAqB,eAAA,EAAiB,qBAAqB,MAAA,EAAO,GAAIC,4BAAA,EAG7G,CAAE,SAAS,CAAA;AAKb,IAAA,MAAM,qBAAqB,qBAAA,EAA4C;AAEvE,IAAA,OAAO;AAAA,MACL,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA,mBAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,GAAG,MAAA;AAAA,QACH,mBAAmB;AAAC;AACtB,KACF;AAAA,EACF,CAAA;AACF","file":"index.js","sourcesContent":["import { replaceDynamicSegments, SearchParams, SearchParamsForPath, toSearchParamsString } from '@hyeonqyu/typed-router-core';\nimport { NavigateOptions, useNavigate } from 'react-router-dom';\n\ntype TypedNavigateOptions<TSearchParams = SearchParams> = Omit<NavigateOptions, 'searchParams'> & {\n /** Custom typed search params */\n searchParams?: TSearchParams;\n};\n\nexport const createTypedNavigation = <TPathname extends string = string, TRouteTree = unknown>() => {\n const getHrefWithSearchParams = (href: TPathname, searchParams?: SearchParams) => {\n const { pathname, remainingParams } = replaceDynamicSegments(href as string, searchParams);\n return `${pathname}${toSearchParamsString(remainingParams, { includeQuestionMark: true })}`;\n };\n\n return () => {\n const navigate = useNavigate();\n\n return <TPath extends TPathname>(href: TPath, options?: TypedNavigateOptions<SearchParamsForPath<TRouteTree, TPath>>) => {\n const finalHref = getHrefWithSearchParams(href, options?.searchParams as SearchParams);\n return navigate(finalHref, options);\n };\n };\n};\n","import { type PartialRouteTree, type ResolvedRouteTree, type RoutePathname, type RouteTree } from '@hyeonqyu/typed-router-core';\nimport { createAppRoutes as coreCreateAppRoutes } from '@hyeonqyu/typed-router-core/routes.utils';\nimport { ReactNode } from 'react';\nimport { createTypedNavigation } from './navigation.hooks';\n\nexport const createAppRoutes = <TMetadata extends { component: ReactNode }, TContext>() => {\n return <TRouteTree extends PartialRouteTree<TMetadata, TContext>>(appRoutes: TRouteTree & RouteTree<TMetadata, TContext, TRouteTree>) => {\n const { AppRoutesProvider, useAppRoutes, getPathnameFromNode, freezeAppRoutes, useCurrentRouteNode, _types } = coreCreateAppRoutes<\n TMetadata,\n TContext\n >()(appRoutes);\n\n type Pathname = RoutePathname<TMetadata, TContext, TRouteTree>;\n type Routes = ResolvedRouteTree<TMetadata, TContext, TRouteTree>;\n\n const useTypedNavigation = createTypedNavigation<Pathname, TRouteTree>();\n\n return {\n AppRoutesProvider,\n useAppRoutes: useAppRoutes as () => Routes,\n useTypedNavigation,\n getPathnameFromNode,\n freezeAppRoutes,\n useCurrentRouteNode,\n appRoutes,\n _types: {\n ..._types,\n AppRoutesPathname: {} as Pathname,\n },\n };\n };\n};\n\nexport * from '@hyeonqyu/typed-router-core';\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,8 +1,41 @@
|
|
|
1
1
|
import { createAppRoutes as createAppRoutes$1 } from '@hyeonqyu/typed-router-core/routes.utils';
|
|
2
|
+
import { replaceDynamicSegments, toSearchParamsString } from '@hyeonqyu/typed-router-core';
|
|
2
3
|
export * from '@hyeonqyu/typed-router-core';
|
|
4
|
+
import { useNavigate } from 'react-router-dom';
|
|
3
5
|
|
|
4
6
|
// src/index.ts
|
|
5
|
-
var
|
|
7
|
+
var createTypedNavigation = () => {
|
|
8
|
+
const getHrefWithSearchParams = (href, searchParams) => {
|
|
9
|
+
const { pathname, remainingParams } = replaceDynamicSegments(href, searchParams);
|
|
10
|
+
return `${pathname}${toSearchParamsString(remainingParams, { includeQuestionMark: true })}`;
|
|
11
|
+
};
|
|
12
|
+
return () => {
|
|
13
|
+
const navigate = useNavigate();
|
|
14
|
+
return (href, options) => {
|
|
15
|
+
const finalHref = getHrefWithSearchParams(href, options?.searchParams);
|
|
16
|
+
return navigate(finalHref, options);
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
var createAppRoutes = () => {
|
|
21
|
+
return (appRoutes) => {
|
|
22
|
+
const { AppRoutesProvider, useAppRoutes, getPathnameFromNode, freezeAppRoutes, useCurrentRouteNode, _types } = createAppRoutes$1()(appRoutes);
|
|
23
|
+
const useTypedNavigation = createTypedNavigation();
|
|
24
|
+
return {
|
|
25
|
+
AppRoutesProvider,
|
|
26
|
+
useAppRoutes,
|
|
27
|
+
useTypedNavigation,
|
|
28
|
+
getPathnameFromNode,
|
|
29
|
+
freezeAppRoutes,
|
|
30
|
+
useCurrentRouteNode,
|
|
31
|
+
appRoutes,
|
|
32
|
+
_types: {
|
|
33
|
+
..._types,
|
|
34
|
+
AppRoutesPathname: {}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
};
|
|
6
39
|
|
|
7
40
|
export { createAppRoutes };
|
|
8
41
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["coreCreateAppRoutes"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/navigation.hooks.ts","../src/index.ts"],"names":["coreCreateAppRoutes"],"mappings":";;;;;;AAQO,IAAM,wBAAwB,MAA+D;AAClG,EAAA,MAAM,uBAAA,GAA0B,CAAC,IAAA,EAAiB,YAAA,KAAgC;AAChF,IAAA,MAAM,EAAE,QAAA,EAAU,eAAA,EAAgB,GAAI,sBAAA,CAAuB,MAAgB,YAAY,CAAA;AACzF,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAG,oBAAA,CAAqB,iBAAiB,EAAE,mBAAA,EAAqB,IAAA,EAAM,CAAC,CAAA,CAAA;AAAA,EAC3F,CAAA;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,IAAA,OAAO,CAA0B,MAAa,OAAA,KAA2E;AACvH,MAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,IAAA,EAAM,OAAA,EAAS,YAA4B,CAAA;AACrF,MAAA,OAAO,QAAA,CAAS,WAAW,OAAO,CAAA;AAAA,IACpC,CAAA;AAAA,EACF,CAAA;AACF,CAAA;ACjBO,IAAM,kBAAkB,MAA4D;AACzF,EAAA,OAAO,CAA2D,SAAA,KAAuE;AACvI,IAAA,MAAM,EAAE,iBAAA,EAAmB,YAAA,EAAc,mBAAA,EAAqB,eAAA,EAAiB,qBAAqB,MAAA,EAAO,GAAIA,iBAAA,EAG7G,CAAE,SAAS,CAAA;AAKb,IAAA,MAAM,qBAAqB,qBAAA,EAA4C;AAEvE,IAAA,OAAO;AAAA,MACL,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA,mBAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,GAAG,MAAA;AAAA,QACH,mBAAmB;AAAC;AACtB,KACF;AAAA,EACF,CAAA;AACF","file":"index.mjs","sourcesContent":["import { replaceDynamicSegments, SearchParams, SearchParamsForPath, toSearchParamsString } from '@hyeonqyu/typed-router-core';\nimport { NavigateOptions, useNavigate } from 'react-router-dom';\n\ntype TypedNavigateOptions<TSearchParams = SearchParams> = Omit<NavigateOptions, 'searchParams'> & {\n /** Custom typed search params */\n searchParams?: TSearchParams;\n};\n\nexport const createTypedNavigation = <TPathname extends string = string, TRouteTree = unknown>() => {\n const getHrefWithSearchParams = (href: TPathname, searchParams?: SearchParams) => {\n const { pathname, remainingParams } = replaceDynamicSegments(href as string, searchParams);\n return `${pathname}${toSearchParamsString(remainingParams, { includeQuestionMark: true })}`;\n };\n\n return () => {\n const navigate = useNavigate();\n\n return <TPath extends TPathname>(href: TPath, options?: TypedNavigateOptions<SearchParamsForPath<TRouteTree, TPath>>) => {\n const finalHref = getHrefWithSearchParams(href, options?.searchParams as SearchParams);\n return navigate(finalHref, options);\n };\n };\n};\n","import { type PartialRouteTree, type ResolvedRouteTree, type RoutePathname, type RouteTree } from '@hyeonqyu/typed-router-core';\nimport { createAppRoutes as coreCreateAppRoutes } from '@hyeonqyu/typed-router-core/routes.utils';\nimport { ReactNode } from 'react';\nimport { createTypedNavigation } from './navigation.hooks';\n\nexport const createAppRoutes = <TMetadata extends { component: ReactNode }, TContext>() => {\n return <TRouteTree extends PartialRouteTree<TMetadata, TContext>>(appRoutes: TRouteTree & RouteTree<TMetadata, TContext, TRouteTree>) => {\n const { AppRoutesProvider, useAppRoutes, getPathnameFromNode, freezeAppRoutes, useCurrentRouteNode, _types } = coreCreateAppRoutes<\n TMetadata,\n TContext\n >()(appRoutes);\n\n type Pathname = RoutePathname<TMetadata, TContext, TRouteTree>;\n type Routes = ResolvedRouteTree<TMetadata, TContext, TRouteTree>;\n\n const useTypedNavigation = createTypedNavigation<Pathname, TRouteTree>();\n\n return {\n AppRoutesProvider,\n useAppRoutes: useAppRoutes as () => Routes,\n useTypedNavigation,\n getPathnameFromNode,\n freezeAppRoutes,\n useCurrentRouteNode,\n appRoutes,\n _types: {\n ..._types,\n AppRoutesPathname: {} as Pathname,\n },\n };\n };\n};\n\nexport * from '@hyeonqyu/typed-router-core';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyeonqyu/typed-router-react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "Type-safe IA-first routing for React Router",
|
|
5
5
|
"author": "hyeonQyu <dhk0561@naver.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"react-router-dom": "^6.0.0 || ^7.0.0"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@hyeonqyu/typed-router-core": "^1.
|
|
53
|
+
"@hyeonqyu/typed-router-core": "^1.6.0"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/react": "^19.2.5",
|