@hyeonqyu/typed-router-core 1.5.1 → 1.5.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.
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +0 -3
- package/dist/index.mjs.map +1 -1
- package/dist/routes.utils.js +1 -4
- package/dist/routes.utils.js.map +1 -1
- package/dist/routes.utils.mjs +1 -4
- package/dist/routes.utils.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -42,9 +42,6 @@ var toSearchParamsString = /* @__PURE__ */ __name((searchParams, options = { inc
|
|
|
42
42
|
}, "toSearchParamsString");
|
|
43
43
|
var findObjectPath = /* @__PURE__ */ __name((root, target, splitter = "/", path = splitter) => {
|
|
44
44
|
for (const key in root) {
|
|
45
|
-
if (key === "_metadata") {
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
45
|
const current = root[key];
|
|
49
46
|
if (current === target) return path + key;
|
|
50
47
|
if (typeof current === "object" && current !== null) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/object.utils.ts"],"names":[],"mappings":";;;;;;AAGO,IAAM,SAAA,mBAAY,MAAA,CAAA,CACvB,QAAA,EACA,GAAA,EACA,IAAA,KACyC;AACzC,EAAA,IAAI,IAAA,KAAS,EAAA,IAAM,IAAA,KAAS,QAAA,EAAU,OAAO,GAAA;AAE7C,EAAA,MAAM,IAAA,GAAQ,KAAgB,KAAA,CAAM,QAAQ,EAAE,MAAA,CAAO,CAAC,QAAQ,GAAG,CAAA;AACjE,EAAA,IAAI,KAAA,GAAiB,GAAA;AAErB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/D,MAAA,KAAA,GAAS,MAAkC,GAAG,CAAA;AAAA,IAChD,CAAA,MAAO;AACL,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA,EAnByB,WAAA;AAyBlB,IAAM,uCAAuB,MAAA,CAAA,CAClC,YAAA,EACA,UAAqC,EAAE,mBAAA,EAAqB,MAAK,KACtD;AACX,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACrD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,mBAAmB,GAAG,CAAA;AAEzC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,EAAM;AACvC,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,UAAU,CAAA,CAAA,EAAI,mBAAmB,MAAA,CAAO,IAAI,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,QACjE;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,UAAU,CAAA,CAAA,EAAI,mBAAmB,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC1C,EAAA,OAAO,OAAA,CAAQ,mBAAA,GAAsB,CAAA,CAAA,EAAI,kBAAkB,CAAA,CAAA,GAAK,kBAAA;AAClE,CAAA,EA9BoC,sBAAA;AAgC7B,IAAM,iCAAiB,MAAA,CAAA,CAC5B,IAAA,EACA,QACA,QAAA,GAAW,GAAA,EACX,OAAO,QAAA,KACgB;AACvB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;
|
|
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 const replaceDynamicSegments = (\n pathname: string,\n params?: SearchParams,\n): string => {\n if (!params) return pathname;\n\n return pathname.replace(/\\[([^\\]]+)\\]/g, (_, 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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -40,9 +40,6 @@ var toSearchParamsString = /* @__PURE__ */ __name((searchParams, options = { inc
|
|
|
40
40
|
}, "toSearchParamsString");
|
|
41
41
|
var findObjectPath = /* @__PURE__ */ __name((root, target, splitter = "/", path = splitter) => {
|
|
42
42
|
for (const key in root) {
|
|
43
|
-
if (key === "_metadata") {
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
43
|
const current = root[key];
|
|
47
44
|
if (current === target) return path + key;
|
|
48
45
|
if (typeof current === "object" && current !== null) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/object.utils.ts"],"names":[],"mappings":";;;;AAGO,IAAM,SAAA,mBAAY,MAAA,CAAA,CACvB,QAAA,EACA,GAAA,EACA,IAAA,KACyC;AACzC,EAAA,IAAI,IAAA,KAAS,EAAA,IAAM,IAAA,KAAS,QAAA,EAAU,OAAO,GAAA;AAE7C,EAAA,MAAM,IAAA,GAAQ,KAAgB,KAAA,CAAM,QAAQ,EAAE,MAAA,CAAO,CAAC,QAAQ,GAAG,CAAA;AACjE,EAAA,IAAI,KAAA,GAAiB,GAAA;AAErB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/D,MAAA,KAAA,GAAS,MAAkC,GAAG,CAAA;AAAA,IAChD,CAAA,MAAO;AACL,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA,EAnByB,WAAA;AAyBlB,IAAM,uCAAuB,MAAA,CAAA,CAClC,YAAA,EACA,UAAqC,EAAE,mBAAA,EAAqB,MAAK,KACtD;AACX,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACrD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,mBAAmB,GAAG,CAAA;AAEzC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,EAAM;AACvC,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,UAAU,CAAA,CAAA,EAAI,mBAAmB,MAAA,CAAO,IAAI,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,QACjE;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,UAAU,CAAA,CAAA,EAAI,mBAAmB,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC1C,EAAA,OAAO,OAAA,CAAQ,mBAAA,GAAsB,CAAA,CAAA,EAAI,kBAAkB,CAAA,CAAA,GAAK,kBAAA;AAClE,CAAA,EA9BoC,sBAAA;AAgC7B,IAAM,iCAAiB,MAAA,CAAA,CAC5B,IAAA,EACA,QACA,QAAA,GAAW,GAAA,EACX,OAAO,QAAA,KACgB;AACvB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;
|
|
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 const replaceDynamicSegments = (\n pathname: string,\n params?: SearchParams,\n): string => {\n if (!params) return pathname;\n\n return pathname.replace(/\\[([^\\]]+)\\]/g, (_, 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"]}
|
package/dist/routes.utils.js
CHANGED
|
@@ -22,9 +22,6 @@ var getSafely = /* @__PURE__ */ __name((splitter, obj, path) => {
|
|
|
22
22
|
}, "getSafely");
|
|
23
23
|
var findObjectPath = /* @__PURE__ */ __name((root, target, splitter = "/", path = splitter) => {
|
|
24
24
|
for (const key in root) {
|
|
25
|
-
if (key === "_metadata") {
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
25
|
const current = root[key];
|
|
29
26
|
if (current === target) return path + key;
|
|
30
27
|
if (typeof current === "object" && current !== null) {
|
|
@@ -74,7 +71,7 @@ var createAppRoutes = /* @__PURE__ */ __name(() => (appRoutes) => {
|
|
|
74
71
|
return /* @__PURE__ */ jsxRuntime.jsx(Context.Provider, { value: frozenAppRoutes, children });
|
|
75
72
|
}, "AppRoutesProvider");
|
|
76
73
|
const getPathnameFromNode = /* @__PURE__ */ __name((targetNode, params) => {
|
|
77
|
-
const pathname = findObjectPath(
|
|
74
|
+
const pathname = findObjectPath(frozenAppRoutes, targetNode);
|
|
78
75
|
if (!pathname) return void 0;
|
|
79
76
|
return replaceDynamicSegments(pathname, params);
|
|
80
77
|
}, "getPathnameFromNode");
|
package/dist/routes.utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/object.utils.ts","../src/routes.utils.tsx"],"names":["createContext","useContext"],"mappings":";;;;;;;;;AAGO,IAAM,SAAA,mBAAY,MAAA,CAAA,CACvB,QAAA,EACA,GAAA,EACA,IAAA,KACyC;AACzC,EAAA,IAAI,IAAA,KAAS,EAAA,IAAM,IAAA,KAAS,QAAA,EAAU,OAAO,GAAA;AAE7C,EAAA,MAAM,IAAA,GAAQ,KAAgB,KAAA,CAAM,QAAQ,EAAE,MAAA,CAAO,CAAC,QAAQ,GAAG,CAAA;AACjE,EAAA,IAAI,KAAA,GAAiB,GAAA;AAErB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/D,MAAA,KAAA,GAAS,MAAkC,GAAG,CAAA;AAAA,IAChD,CAAA,MAAO;AACL,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA,EAnByB,WAAA,CAAA;AAyDlB,IAAM,iCAAiB,MAAA,CAAA,CAC5B,IAAA,EACA,QACA,QAAA,GAAW,GAAA,EACX,OAAO,QAAA,KACgB;AACvB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;
|
|
1
|
+
{"version":3,"sources":["../src/object.utils.ts","../src/routes.utils.tsx"],"names":["createContext","useContext"],"mappings":"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","file":"routes.utils.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 const replaceDynamicSegments = (\n pathname: string,\n params?: SearchParams,\n): string => {\n if (!params) return pathname;\n\n return pathname.replace(/\\[([^\\]]+)\\]/g, (_, 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","import { createContext, ReactNode, useContext } from 'react';\nimport { findObjectPath, getSafely, replaceDynamicSegments } from './object.utils';\nimport { SearchParams } from './query.types';\nimport { BaseMetadata, PartialRouteTree, ResolvedRouteTree, RouteNode, RoutePathname, RouteTree } from './routes.types';\n\nexport const createAppRoutes =\n <TMetadata extends BaseMetadata, TContext>() =>\n <TRouteTree extends PartialRouteTree<TMetadata, TContext>>(appRoutes: TRouteTree & RouteTree<TMetadata, TContext, TRouteTree>) => {\n type Routes = ResolvedRouteTree<TMetadata, TContext, TRouteTree>;\n type Pathname = RoutePathname<TMetadata, TContext, TRouteTree>;\n type AppRouteNode = RouteNode<TMetadata, TContext>;\n\n const ROUTE_NODE_COMMON_KEY: keyof AppRouteNode = '_metadata';\n\n const freezeAppRoutes = () => {\n const copiedAppRoutes = { ...appRoutes };\n\n const freeze = (obj: Record<string, unknown>) => {\n Object.entries(obj).forEach(([key, value]) => {\n Object.defineProperty(obj, key, {\n writable: false,\n enumerable: key !== ROUTE_NODE_COMMON_KEY,\n configurable: false,\n });\n\n if (typeof value === 'object' && value !== null) {\n freeze(value as Record<string, unknown>);\n }\n });\n };\n\n freeze(copiedAppRoutes as Record<string, unknown>);\n return copiedAppRoutes as Routes;\n };\n\n const frozenAppRoutes = freezeAppRoutes();\n\n const Context = createContext<Routes>(frozenAppRoutes);\n\n const useAppRoutes = (): Routes => {\n return useContext(Context);\n };\n\n const useCurrentRouteNode = <TPath extends Pathname>(pathname: TPath) => {\n const routes = useContext(Context);\n return getSafely('/', routes, pathname) as RouteNode<TMetadata, TContext>;\n };\n\n const AppRoutesProvider = ({ children }: { children: ReactNode }) => {\n return <Context.Provider value={frozenAppRoutes}>{children}</Context.Provider>;\n };\n\n const getPathnameFromNode = (targetNode: AppRouteNode, params?: SearchParams): string | undefined => {\n const pathname = findObjectPath(frozenAppRoutes, targetNode);\n if (!pathname) return undefined;\n return replaceDynamicSegments(pathname, params);\n };\n\n return {\n AppRoutesProvider,\n useAppRoutes,\n useCurrentRouteNode,\n getPathnameFromNode,\n freezeAppRoutes,\n _types: {} as {\n AppRoutesMetadata: TMetadata;\n AppRoutesContext: TContext;\n AppRoutesPathname: Pathname;\n AppRouteNode: AppRouteNode;\n },\n };\n };\n"]}
|
package/dist/routes.utils.mjs
CHANGED
|
@@ -20,9 +20,6 @@ var getSafely = /* @__PURE__ */ __name((splitter, obj, path) => {
|
|
|
20
20
|
}, "getSafely");
|
|
21
21
|
var findObjectPath = /* @__PURE__ */ __name((root, target, splitter = "/", path = splitter) => {
|
|
22
22
|
for (const key in root) {
|
|
23
|
-
if (key === "_metadata") {
|
|
24
|
-
continue;
|
|
25
|
-
}
|
|
26
23
|
const current = root[key];
|
|
27
24
|
if (current === target) return path + key;
|
|
28
25
|
if (typeof current === "object" && current !== null) {
|
|
@@ -72,7 +69,7 @@ var createAppRoutes = /* @__PURE__ */ __name(() => (appRoutes) => {
|
|
|
72
69
|
return /* @__PURE__ */ jsx(Context.Provider, { value: frozenAppRoutes, children });
|
|
73
70
|
}, "AppRoutesProvider");
|
|
74
71
|
const getPathnameFromNode = /* @__PURE__ */ __name((targetNode, params) => {
|
|
75
|
-
const pathname = findObjectPath(
|
|
72
|
+
const pathname = findObjectPath(frozenAppRoutes, targetNode);
|
|
76
73
|
if (!pathname) return void 0;
|
|
77
74
|
return replaceDynamicSegments(pathname, params);
|
|
78
75
|
}, "getPathnameFromNode");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/object.utils.ts","../src/routes.utils.tsx"],"names":[],"mappings":";;;;;;;AAGO,IAAM,SAAA,mBAAY,MAAA,CAAA,CACvB,QAAA,EACA,GAAA,EACA,IAAA,KACyC;AACzC,EAAA,IAAI,IAAA,KAAS,EAAA,IAAM,IAAA,KAAS,QAAA,EAAU,OAAO,GAAA;AAE7C,EAAA,MAAM,IAAA,GAAQ,KAAgB,KAAA,CAAM,QAAQ,EAAE,MAAA,CAAO,CAAC,QAAQ,GAAG,CAAA;AACjE,EAAA,IAAI,KAAA,GAAiB,GAAA;AAErB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/D,MAAA,KAAA,GAAS,MAAkC,GAAG,CAAA;AAAA,IAChD,CAAA,MAAO;AACL,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA,EAnByB,WAAA,CAAA;AAyDlB,IAAM,iCAAiB,MAAA,CAAA,CAC5B,IAAA,EACA,QACA,QAAA,GAAW,GAAA,EACX,OAAO,QAAA,KACgB;AACvB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;
|
|
1
|
+
{"version":3,"sources":["../src/object.utils.ts","../src/routes.utils.tsx"],"names":[],"mappings":"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","file":"routes.utils.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 const replaceDynamicSegments = (\n pathname: string,\n params?: SearchParams,\n): string => {\n if (!params) return pathname;\n\n return pathname.replace(/\\[([^\\]]+)\\]/g, (_, 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","import { createContext, ReactNode, useContext } from 'react';\nimport { findObjectPath, getSafely, replaceDynamicSegments } from './object.utils';\nimport { SearchParams } from './query.types';\nimport { BaseMetadata, PartialRouteTree, ResolvedRouteTree, RouteNode, RoutePathname, RouteTree } from './routes.types';\n\nexport const createAppRoutes =\n <TMetadata extends BaseMetadata, TContext>() =>\n <TRouteTree extends PartialRouteTree<TMetadata, TContext>>(appRoutes: TRouteTree & RouteTree<TMetadata, TContext, TRouteTree>) => {\n type Routes = ResolvedRouteTree<TMetadata, TContext, TRouteTree>;\n type Pathname = RoutePathname<TMetadata, TContext, TRouteTree>;\n type AppRouteNode = RouteNode<TMetadata, TContext>;\n\n const ROUTE_NODE_COMMON_KEY: keyof AppRouteNode = '_metadata';\n\n const freezeAppRoutes = () => {\n const copiedAppRoutes = { ...appRoutes };\n\n const freeze = (obj: Record<string, unknown>) => {\n Object.entries(obj).forEach(([key, value]) => {\n Object.defineProperty(obj, key, {\n writable: false,\n enumerable: key !== ROUTE_NODE_COMMON_KEY,\n configurable: false,\n });\n\n if (typeof value === 'object' && value !== null) {\n freeze(value as Record<string, unknown>);\n }\n });\n };\n\n freeze(copiedAppRoutes as Record<string, unknown>);\n return copiedAppRoutes as Routes;\n };\n\n const frozenAppRoutes = freezeAppRoutes();\n\n const Context = createContext<Routes>(frozenAppRoutes);\n\n const useAppRoutes = (): Routes => {\n return useContext(Context);\n };\n\n const useCurrentRouteNode = <TPath extends Pathname>(pathname: TPath) => {\n const routes = useContext(Context);\n return getSafely('/', routes, pathname) as RouteNode<TMetadata, TContext>;\n };\n\n const AppRoutesProvider = ({ children }: { children: ReactNode }) => {\n return <Context.Provider value={frozenAppRoutes}>{children}</Context.Provider>;\n };\n\n const getPathnameFromNode = (targetNode: AppRouteNode, params?: SearchParams): string | undefined => {\n const pathname = findObjectPath(frozenAppRoutes, targetNode);\n if (!pathname) return undefined;\n return replaceDynamicSegments(pathname, params);\n };\n\n return {\n AppRoutesProvider,\n useAppRoutes,\n useCurrentRouteNode,\n getPathnameFromNode,\n freezeAppRoutes,\n _types: {} as {\n AppRoutesMetadata: TMetadata;\n AppRoutesContext: TContext;\n AppRoutesPathname: Pathname;\n AppRouteNode: AppRouteNode;\n },\n };\n };\n"]}
|