@hyeonqyu/typed-router-core 1.7.1 → 1.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/dist/index.d.mts +10 -3
- package/dist/index.d.ts +10 -3
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -1
- package/dist/index.mjs.map +1 -1
- package/dist/{routes.types-C0cWyXOZ.d.mts → routes.types-CeQmt8ro.d.mts} +1 -1
- package/dist/{routes.types-C0cWyXOZ.d.ts → routes.types-CeQmt8ro.d.ts} +1 -1
- package/dist/routes.utils.d.mts +1 -1
- package/dist/routes.utils.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { P as Paths, a as PathValue, S as SearchParams } from './routes.types-
|
|
2
|
-
export { A as AnyZodSchema, B as BaseMetadata, E as ExtractSearchParams, G as GetRouteNode,
|
|
1
|
+
import { P as Paths, a as PathValue, S as SearchParams, b as SearchParamsForPath } from './routes.types-CeQmt8ro.mjs';
|
|
2
|
+
export { A as AnyZodSchema, B as BaseMetadata, E as ExtractSearchParams, G as GetRouteNode, e as PartialRouteTree, i as ResolvedRouteTree, R as RouteNode, d as RouteNodeMetadata, g as RoutePathname, f as RouteTree, c as SearchParamsValue, h as SimplifyPathname } from './routes.types-CeQmt8ro.mjs';
|
|
3
3
|
|
|
4
4
|
declare const getSafely: <TObject, TSplitter extends string, TPath extends string & Paths<TObject, TSplitter>>(splitter: TSplitter, obj: TObject, path: TPath) => PathValue<TObject, TPath, TSplitter>;
|
|
5
5
|
type SearchParamsStringOptions = {
|
|
@@ -14,4 +14,11 @@ type ReplaceDynamicSegmentsResult = {
|
|
|
14
14
|
declare const extractDynamicSegmentKeys: (pathname: string) => string[];
|
|
15
15
|
declare const replaceDynamicSegments: (pathname: string, params?: SearchParams) => ReplaceDynamicSegmentsResult;
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
type TypedLinkHrefObject<TPathname extends string = string, TRouteTree = unknown> = TPathname extends infer TPath ? {
|
|
18
|
+
pathname: TPath;
|
|
19
|
+
searchParams?: SearchParamsForPath<TRouteTree, TPath & string>;
|
|
20
|
+
hash?: string;
|
|
21
|
+
} : never;
|
|
22
|
+
declare const buildTypedHref: (pathname: string, searchParams?: SearchParams, hash?: string) => string;
|
|
23
|
+
|
|
24
|
+
export { PathValue, Paths, type ReplaceDynamicSegmentsResult, SearchParams, SearchParamsForPath, type SearchParamsStringOptions, type TypedLinkHrefObject, buildTypedHref, extractDynamicSegmentKeys, findObjectPath, getSafely, replaceDynamicSegments, toSearchParamsString };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { P as Paths, a as PathValue, S as SearchParams } from './routes.types-
|
|
2
|
-
export { A as AnyZodSchema, B as BaseMetadata, E as ExtractSearchParams, G as GetRouteNode,
|
|
1
|
+
import { P as Paths, a as PathValue, S as SearchParams, b as SearchParamsForPath } from './routes.types-CeQmt8ro.js';
|
|
2
|
+
export { A as AnyZodSchema, B as BaseMetadata, E as ExtractSearchParams, G as GetRouteNode, e as PartialRouteTree, i as ResolvedRouteTree, R as RouteNode, d as RouteNodeMetadata, g as RoutePathname, f as RouteTree, c as SearchParamsValue, h as SimplifyPathname } from './routes.types-CeQmt8ro.js';
|
|
3
3
|
|
|
4
4
|
declare const getSafely: <TObject, TSplitter extends string, TPath extends string & Paths<TObject, TSplitter>>(splitter: TSplitter, obj: TObject, path: TPath) => PathValue<TObject, TPath, TSplitter>;
|
|
5
5
|
type SearchParamsStringOptions = {
|
|
@@ -14,4 +14,11 @@ type ReplaceDynamicSegmentsResult = {
|
|
|
14
14
|
declare const extractDynamicSegmentKeys: (pathname: string) => string[];
|
|
15
15
|
declare const replaceDynamicSegments: (pathname: string, params?: SearchParams) => ReplaceDynamicSegmentsResult;
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
type TypedLinkHrefObject<TPathname extends string = string, TRouteTree = unknown> = TPathname extends infer TPath ? {
|
|
18
|
+
pathname: TPath;
|
|
19
|
+
searchParams?: SearchParamsForPath<TRouteTree, TPath & string>;
|
|
20
|
+
hash?: string;
|
|
21
|
+
} : never;
|
|
22
|
+
declare const buildTypedHref: (pathname: string, searchParams?: SearchParams, hash?: string) => string;
|
|
23
|
+
|
|
24
|
+
export { PathValue, Paths, type ReplaceDynamicSegmentsResult, SearchParams, SearchParamsForPath, type SearchParamsStringOptions, type TypedLinkHrefObject, buildTypedHref, extractDynamicSegmentKeys, findObjectPath, getSafely, replaceDynamicSegments, toSearchParamsString };
|
package/dist/index.js
CHANGED
|
@@ -79,6 +79,14 @@ var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
|
79
79
|
};
|
|
80
80
|
}, "replaceDynamicSegments");
|
|
81
81
|
|
|
82
|
+
// src/link.utils.ts
|
|
83
|
+
var buildTypedHref = /* @__PURE__ */ __name((pathname, searchParams, hash) => {
|
|
84
|
+
const { pathname: replacedPathname, remainingParams } = replaceDynamicSegments(pathname, searchParams);
|
|
85
|
+
const queryString = toSearchParamsString(remainingParams, { includeQuestionMark: true });
|
|
86
|
+
return `${replacedPathname}${queryString}${hash ?? ""}`;
|
|
87
|
+
}, "buildTypedHref");
|
|
88
|
+
|
|
89
|
+
exports.buildTypedHref = buildTypedHref;
|
|
82
90
|
exports.extractDynamicSegmentKeys = extractDynamicSegmentKeys;
|
|
83
91
|
exports.findObjectPath = findObjectPath;
|
|
84
92
|
exports.getSafely = getSafely;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/object.utils.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { Paths, PathValue } from './path.types';\nimport { SearchParams } from './query.types';\n\nexport const getSafely = <TObject, TSplitter extends string, TPath extends string & Paths<TObject, TSplitter>>(\n splitter: TSplitter,\n obj: TObject,\n path: TPath,\n): PathValue<TObject, TPath, TSplitter> => {\n if (path === '' || path === splitter) return obj as PathValue<TObject, TPath, TSplitter>;\n\n const keys = (path as string).split(splitter).filter((key) => key);\n let value: unknown = obj;\n\n for (const key of keys) {\n if (typeof value === 'object' && value !== null && key in value) {\n value = (value as Record<string, unknown>)[key];\n } else {\n return undefined as PathValue<TObject, TPath, TSplitter>;\n }\n }\n\n return value as PathValue<TObject, TPath, TSplitter>;\n};\n\nexport type SearchParamsStringOptions = {\n includeQuestionMark?: boolean;\n};\n\nexport const toSearchParamsString = (\n searchParams: SearchParams,\n options: SearchParamsStringOptions = { includeQuestionMark: true },\n): string => {\n const params: string[] = [];\n\n Object.entries(searchParams).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n\n const encodedKey = encodeURIComponent(key);\n\n if (Array.isArray(value)) {\n value.forEach((item) => {\n if (item !== undefined && item !== null) {\n params.push(`${encodedKey}=${encodeURIComponent(String(item))}`);\n }\n });\n } else {\n params.push(`${encodedKey}=${encodeURIComponent(String(value))}`);\n }\n });\n\n if (params.length === 0) {\n return '';\n }\n\n const searchParamsString = params.join('&');\n return options.includeQuestionMark ? `?${searchParamsString}` : searchParamsString;\n};\n\nexport const findObjectPath = <T>(\n root: Record<string, unknown>,\n target: T,\n splitter = '/',\n path = splitter,\n): string | undefined => {\n for (const key in root) {\n const current = root[key];\n\n if (current === target) return path + key;\n\n if (typeof current === 'object' && current !== null) {\n const result = findObjectPath(current as Record<string, unknown>, target, splitter, path + key + splitter);\n if (result) return result;\n }\n }\n\n return undefined;\n};\n\nexport type ReplaceDynamicSegmentsResult = {\n pathname: string;\n remainingParams: SearchParams;\n};\n\nconst DYNAMIC_SEGMENT_REGEX = /\\[([^\\]]+)\\]/g;\n\nexport const extractDynamicSegmentKeys = (pathname: string): string[] => {\n const matches = Array.from(pathname.matchAll(DYNAMIC_SEGMENT_REGEX));\n return matches.map((match) => match[1]);\n};\n\nexport const replaceDynamicSegments = (\n pathname: string,\n params?: SearchParams,\n): ReplaceDynamicSegmentsResult => {\n if (!params) {\n return {\n pathname,\n remainingParams: {},\n };\n }\n\n const usedKeys = new Set<string>();\n\n const replacedPathname = pathname.replace(DYNAMIC_SEGMENT_REGEX, (_, key) => {\n usedKeys.add(key);\n const value = params[key.toString()];\n if (value === undefined || value === null) return `[${key}]`;\n return Array.isArray(value) ? value.join(',') : value.toString();\n });\n\n const remainingParams = Object.fromEntries(\n Object.entries(params).filter(([key]) => !usedKeys.has(key))\n ) as SearchParams;\n\n return {\n pathname: replacedPathname,\n remainingParams,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/object.utils.ts","../src/link.utils.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { Paths, PathValue } from './path.types';\nimport { SearchParams } from './query.types';\n\nexport const getSafely = <TObject, TSplitter extends string, TPath extends string & Paths<TObject, TSplitter>>(\n splitter: TSplitter,\n obj: TObject,\n path: TPath,\n): PathValue<TObject, TPath, TSplitter> => {\n if (path === '' || path === splitter) return obj as PathValue<TObject, TPath, TSplitter>;\n\n const keys = (path as string).split(splitter).filter((key) => key);\n let value: unknown = obj;\n\n for (const key of keys) {\n if (typeof value === 'object' && value !== null && key in value) {\n value = (value as Record<string, unknown>)[key];\n } else {\n return undefined as PathValue<TObject, TPath, TSplitter>;\n }\n }\n\n return value as PathValue<TObject, TPath, TSplitter>;\n};\n\nexport type SearchParamsStringOptions = {\n includeQuestionMark?: boolean;\n};\n\nexport const toSearchParamsString = (\n searchParams: SearchParams,\n options: SearchParamsStringOptions = { includeQuestionMark: true },\n): string => {\n const params: string[] = [];\n\n Object.entries(searchParams).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n\n const encodedKey = encodeURIComponent(key);\n\n if (Array.isArray(value)) {\n value.forEach((item) => {\n if (item !== undefined && item !== null) {\n params.push(`${encodedKey}=${encodeURIComponent(String(item))}`);\n }\n });\n } else {\n params.push(`${encodedKey}=${encodeURIComponent(String(value))}`);\n }\n });\n\n if (params.length === 0) {\n return '';\n }\n\n const searchParamsString = params.join('&');\n return options.includeQuestionMark ? `?${searchParamsString}` : searchParamsString;\n};\n\nexport const findObjectPath = <T>(\n root: Record<string, unknown>,\n target: T,\n splitter = '/',\n path = splitter,\n): string | undefined => {\n for (const key in root) {\n const current = root[key];\n\n if (current === target) return path + key;\n\n if (typeof current === 'object' && current !== null) {\n const result = findObjectPath(current as Record<string, unknown>, target, splitter, path + key + splitter);\n if (result) return result;\n }\n }\n\n return undefined;\n};\n\nexport type ReplaceDynamicSegmentsResult = {\n pathname: string;\n remainingParams: SearchParams;\n};\n\nconst DYNAMIC_SEGMENT_REGEX = /\\[([^\\]]+)\\]/g;\n\nexport const extractDynamicSegmentKeys = (pathname: string): string[] => {\n const matches = Array.from(pathname.matchAll(DYNAMIC_SEGMENT_REGEX));\n return matches.map((match) => match[1]);\n};\n\nexport const replaceDynamicSegments = (\n pathname: string,\n params?: SearchParams,\n): ReplaceDynamicSegmentsResult => {\n if (!params) {\n return {\n pathname,\n remainingParams: {},\n };\n }\n\n const usedKeys = new Set<string>();\n\n const replacedPathname = pathname.replace(DYNAMIC_SEGMENT_REGEX, (_, key) => {\n usedKeys.add(key);\n const value = params[key.toString()];\n if (value === undefined || value === null) return `[${key}]`;\n return Array.isArray(value) ? value.join(',') : value.toString();\n });\n\n const remainingParams = Object.fromEntries(\n Object.entries(params).filter(([key]) => !usedKeys.has(key))\n ) as SearchParams;\n\n return {\n pathname: replacedPathname,\n remainingParams,\n };\n};\n","import { type SearchParams } from './query.types';\nimport { type SearchParamsForPath } from './routes.types';\nimport { replaceDynamicSegments, toSearchParamsString } from './object.utils';\n\nexport type TypedLinkHrefObject<TPathname extends string = string, TRouteTree = unknown> =\n TPathname extends infer TPath\n ? {\n pathname: TPath;\n searchParams?: SearchParamsForPath<TRouteTree, TPath & string>;\n hash?: string;\n }\n : never;\n\nexport const buildTypedHref = (\n pathname: string,\n searchParams?: SearchParams,\n hash?: string,\n): string => {\n const { pathname: replacedPathname, remainingParams } = replaceDynamicSegments(pathname, searchParams);\n const queryString = toSearchParamsString(remainingParams, { includeQuestionMark: true });\n return `${replacedPathname}${queryString}${hash ?? ''}`;\n};\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -77,6 +77,13 @@ var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
|
77
77
|
};
|
|
78
78
|
}, "replaceDynamicSegments");
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
// src/link.utils.ts
|
|
81
|
+
var buildTypedHref = /* @__PURE__ */ __name((pathname, searchParams, hash) => {
|
|
82
|
+
const { pathname: replacedPathname, remainingParams } = replaceDynamicSegments(pathname, searchParams);
|
|
83
|
+
const queryString = toSearchParamsString(remainingParams, { includeQuestionMark: true });
|
|
84
|
+
return `${replacedPathname}${queryString}${hash ?? ""}`;
|
|
85
|
+
}, "buildTypedHref");
|
|
86
|
+
|
|
87
|
+
export { buildTypedHref, extractDynamicSegmentKeys, findObjectPath, getSafely, replaceDynamicSegments, toSearchParamsString };
|
|
81
88
|
//# sourceMappingURL=index.mjs.map
|
|
82
89
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/object.utils.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { Paths, PathValue } from './path.types';\nimport { SearchParams } from './query.types';\n\nexport const getSafely = <TObject, TSplitter extends string, TPath extends string & Paths<TObject, TSplitter>>(\n splitter: TSplitter,\n obj: TObject,\n path: TPath,\n): PathValue<TObject, TPath, TSplitter> => {\n if (path === '' || path === splitter) return obj as PathValue<TObject, TPath, TSplitter>;\n\n const keys = (path as string).split(splitter).filter((key) => key);\n let value: unknown = obj;\n\n for (const key of keys) {\n if (typeof value === 'object' && value !== null && key in value) {\n value = (value as Record<string, unknown>)[key];\n } else {\n return undefined as PathValue<TObject, TPath, TSplitter>;\n }\n }\n\n return value as PathValue<TObject, TPath, TSplitter>;\n};\n\nexport type SearchParamsStringOptions = {\n includeQuestionMark?: boolean;\n};\n\nexport const toSearchParamsString = (\n searchParams: SearchParams,\n options: SearchParamsStringOptions = { includeQuestionMark: true },\n): string => {\n const params: string[] = [];\n\n Object.entries(searchParams).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n\n const encodedKey = encodeURIComponent(key);\n\n if (Array.isArray(value)) {\n value.forEach((item) => {\n if (item !== undefined && item !== null) {\n params.push(`${encodedKey}=${encodeURIComponent(String(item))}`);\n }\n });\n } else {\n params.push(`${encodedKey}=${encodeURIComponent(String(value))}`);\n }\n });\n\n if (params.length === 0) {\n return '';\n }\n\n const searchParamsString = params.join('&');\n return options.includeQuestionMark ? `?${searchParamsString}` : searchParamsString;\n};\n\nexport const findObjectPath = <T>(\n root: Record<string, unknown>,\n target: T,\n splitter = '/',\n path = splitter,\n): string | undefined => {\n for (const key in root) {\n const current = root[key];\n\n if (current === target) return path + key;\n\n if (typeof current === 'object' && current !== null) {\n const result = findObjectPath(current as Record<string, unknown>, target, splitter, path + key + splitter);\n if (result) return result;\n }\n }\n\n return undefined;\n};\n\nexport type ReplaceDynamicSegmentsResult = {\n pathname: string;\n remainingParams: SearchParams;\n};\n\nconst DYNAMIC_SEGMENT_REGEX = /\\[([^\\]]+)\\]/g;\n\nexport const extractDynamicSegmentKeys = (pathname: string): string[] => {\n const matches = Array.from(pathname.matchAll(DYNAMIC_SEGMENT_REGEX));\n return matches.map((match) => match[1]);\n};\n\nexport const replaceDynamicSegments = (\n pathname: string,\n params?: SearchParams,\n): ReplaceDynamicSegmentsResult => {\n if (!params) {\n return {\n pathname,\n remainingParams: {},\n };\n }\n\n const usedKeys = new Set<string>();\n\n const replacedPathname = pathname.replace(DYNAMIC_SEGMENT_REGEX, (_, key) => {\n usedKeys.add(key);\n const value = params[key.toString()];\n if (value === undefined || value === null) return `[${key}]`;\n return Array.isArray(value) ? value.join(',') : value.toString();\n });\n\n const remainingParams = Object.fromEntries(\n Object.entries(params).filter(([key]) => !usedKeys.has(key))\n ) as SearchParams;\n\n return {\n pathname: replacedPathname,\n remainingParams,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/object.utils.ts","../src/link.utils.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { Paths, PathValue } from './path.types';\nimport { SearchParams } from './query.types';\n\nexport const getSafely = <TObject, TSplitter extends string, TPath extends string & Paths<TObject, TSplitter>>(\n splitter: TSplitter,\n obj: TObject,\n path: TPath,\n): PathValue<TObject, TPath, TSplitter> => {\n if (path === '' || path === splitter) return obj as PathValue<TObject, TPath, TSplitter>;\n\n const keys = (path as string).split(splitter).filter((key) => key);\n let value: unknown = obj;\n\n for (const key of keys) {\n if (typeof value === 'object' && value !== null && key in value) {\n value = (value as Record<string, unknown>)[key];\n } else {\n return undefined as PathValue<TObject, TPath, TSplitter>;\n }\n }\n\n return value as PathValue<TObject, TPath, TSplitter>;\n};\n\nexport type SearchParamsStringOptions = {\n includeQuestionMark?: boolean;\n};\n\nexport const toSearchParamsString = (\n searchParams: SearchParams,\n options: SearchParamsStringOptions = { includeQuestionMark: true },\n): string => {\n const params: string[] = [];\n\n Object.entries(searchParams).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n\n const encodedKey = encodeURIComponent(key);\n\n if (Array.isArray(value)) {\n value.forEach((item) => {\n if (item !== undefined && item !== null) {\n params.push(`${encodedKey}=${encodeURIComponent(String(item))}`);\n }\n });\n } else {\n params.push(`${encodedKey}=${encodeURIComponent(String(value))}`);\n }\n });\n\n if (params.length === 0) {\n return '';\n }\n\n const searchParamsString = params.join('&');\n return options.includeQuestionMark ? `?${searchParamsString}` : searchParamsString;\n};\n\nexport const findObjectPath = <T>(\n root: Record<string, unknown>,\n target: T,\n splitter = '/',\n path = splitter,\n): string | undefined => {\n for (const key in root) {\n const current = root[key];\n\n if (current === target) return path + key;\n\n if (typeof current === 'object' && current !== null) {\n const result = findObjectPath(current as Record<string, unknown>, target, splitter, path + key + splitter);\n if (result) return result;\n }\n }\n\n return undefined;\n};\n\nexport type ReplaceDynamicSegmentsResult = {\n pathname: string;\n remainingParams: SearchParams;\n};\n\nconst DYNAMIC_SEGMENT_REGEX = /\\[([^\\]]+)\\]/g;\n\nexport const extractDynamicSegmentKeys = (pathname: string): string[] => {\n const matches = Array.from(pathname.matchAll(DYNAMIC_SEGMENT_REGEX));\n return matches.map((match) => match[1]);\n};\n\nexport const replaceDynamicSegments = (\n pathname: string,\n params?: SearchParams,\n): ReplaceDynamicSegmentsResult => {\n if (!params) {\n return {\n pathname,\n remainingParams: {},\n };\n }\n\n const usedKeys = new Set<string>();\n\n const replacedPathname = pathname.replace(DYNAMIC_SEGMENT_REGEX, (_, key) => {\n usedKeys.add(key);\n const value = params[key.toString()];\n if (value === undefined || value === null) return `[${key}]`;\n return Array.isArray(value) ? value.join(',') : value.toString();\n });\n\n const remainingParams = Object.fromEntries(\n Object.entries(params).filter(([key]) => !usedKeys.has(key))\n ) as SearchParams;\n\n return {\n pathname: replacedPathname,\n remainingParams,\n };\n};\n","import { type SearchParams } from './query.types';\nimport { type SearchParamsForPath } from './routes.types';\nimport { replaceDynamicSegments, toSearchParamsString } from './object.utils';\n\nexport type TypedLinkHrefObject<TPathname extends string = string, TRouteTree = unknown> =\n TPathname extends infer TPath\n ? {\n pathname: TPath;\n searchParams?: SearchParamsForPath<TRouteTree, TPath & string>;\n hash?: string;\n }\n : never;\n\nexport const buildTypedHref = (\n pathname: string,\n searchParams?: SearchParams,\n hash?: string,\n): string => {\n const { pathname: replacedPathname, remainingParams } = replaceDynamicSegments(pathname, searchParams);\n const queryString = toSearchParamsString(remainingParams, { includeQuestionMark: true });\n return `${replacedPathname}${queryString}${hash ?? ''}`;\n};\n"]}
|
|
@@ -46,4 +46,4 @@ type ExtractSearchParams<TNode> = TNode extends {
|
|
|
46
46
|
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;
|
|
47
47
|
type SearchParamsForPath<TRouteTree, TPath extends string> = ExtractSearchParams<GetRouteNode<TRouteTree, TPath>>;
|
|
48
48
|
|
|
49
|
-
export type { AnyZodSchema as A, BaseMetadata as B, ExtractSearchParams as E, GetRouteNode as G, Paths as P, RouteNode as R, SearchParams as S, PathValue as a,
|
|
49
|
+
export type { AnyZodSchema as A, BaseMetadata as B, ExtractSearchParams as E, GetRouteNode as G, Paths as P, RouteNode as R, SearchParams as S, PathValue as a, SearchParamsForPath as b, SearchParamsValue as c, RouteNodeMetadata as d, PartialRouteTree as e, RouteTree as f, RoutePathname as g, SimplifyPathname as h, ResolvedRouteTree as i };
|
|
@@ -46,4 +46,4 @@ type ExtractSearchParams<TNode> = TNode extends {
|
|
|
46
46
|
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;
|
|
47
47
|
type SearchParamsForPath<TRouteTree, TPath extends string> = ExtractSearchParams<GetRouteNode<TRouteTree, TPath>>;
|
|
48
48
|
|
|
49
|
-
export type { AnyZodSchema as A, BaseMetadata as B, ExtractSearchParams as E, GetRouteNode as G, Paths as P, RouteNode as R, SearchParams as S, PathValue as a,
|
|
49
|
+
export type { AnyZodSchema as A, BaseMetadata as B, ExtractSearchParams as E, GetRouteNode as G, Paths as P, RouteNode as R, SearchParams as S, PathValue as a, SearchParamsForPath as b, SearchParamsValue as c, RouteNodeMetadata as d, PartialRouteTree as e, RouteTree as f, RoutePathname as g, SimplifyPathname as h, ResolvedRouteTree as i };
|
package/dist/routes.utils.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import { B as BaseMetadata,
|
|
3
|
+
import { B as BaseMetadata, e as PartialRouteTree, f as RouteTree, i as ResolvedRouteTree, g as RoutePathname, R as RouteNode, S as SearchParams, d as RouteNodeMetadata, G as GetRouteNode, b as SearchParamsForPath, E as ExtractSearchParams, h as SimplifyPathname } from './routes.types-CeQmt8ro.mjs';
|
|
4
4
|
|
|
5
5
|
declare const createAppRoutes: <TMetadata extends BaseMetadata, TContext>() => <TRouteTree extends PartialRouteTree<TMetadata, TContext>>(appRoutes: TRouteTree & RouteTree<TMetadata, TContext, TRouteTree>) => {
|
|
6
6
|
AppRoutesProvider: ({ children }: {
|
package/dist/routes.utils.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import { B as BaseMetadata,
|
|
3
|
+
import { B as BaseMetadata, e as PartialRouteTree, f as RouteTree, i as ResolvedRouteTree, g as RoutePathname, R as RouteNode, S as SearchParams, d as RouteNodeMetadata, G as GetRouteNode, b as SearchParamsForPath, E as ExtractSearchParams, h as SimplifyPathname } from './routes.types-CeQmt8ro.js';
|
|
4
4
|
|
|
5
5
|
declare const createAppRoutes: <TMetadata extends BaseMetadata, TContext>() => <TRouteTree extends PartialRouteTree<TMetadata, TContext>>(appRoutes: TRouteTree & RouteTree<TMetadata, TContext, TRouteTree>) => {
|
|
6
6
|
AppRoutesProvider: ({ children }: {
|