@hyeonqyu/typed-router-core 1.5.3 → 1.5.4
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 +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -2
- package/dist/index.mjs.map +1 -1
- package/dist/routes.utils.js +2 -1
- package/dist/routes.utils.js.map +1 -1
- package/dist/routes.utils.mjs +2 -1
- package/dist/routes.utils.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -11,6 +11,7 @@ type ReplaceDynamicSegmentsResult = {
|
|
|
11
11
|
pathname: string;
|
|
12
12
|
remainingParams: SearchParams;
|
|
13
13
|
};
|
|
14
|
+
declare const extractDynamicSegmentKeys: (pathname: string) => string[];
|
|
14
15
|
declare const replaceDynamicSegments: (pathname: string, params?: SearchParams) => ReplaceDynamicSegmentsResult;
|
|
15
16
|
|
|
16
|
-
export { PathValue, Paths, type ReplaceDynamicSegmentsResult, SearchParams, type SearchParamsStringOptions, findObjectPath, getSafely, replaceDynamicSegments, toSearchParamsString };
|
|
17
|
+
export { PathValue, Paths, type ReplaceDynamicSegmentsResult, SearchParams, type SearchParamsStringOptions, extractDynamicSegmentKeys, findObjectPath, getSafely, replaceDynamicSegments, toSearchParamsString };
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ type ReplaceDynamicSegmentsResult = {
|
|
|
11
11
|
pathname: string;
|
|
12
12
|
remainingParams: SearchParams;
|
|
13
13
|
};
|
|
14
|
+
declare const extractDynamicSegmentKeys: (pathname: string) => string[];
|
|
14
15
|
declare const replaceDynamicSegments: (pathname: string, params?: SearchParams) => ReplaceDynamicSegmentsResult;
|
|
15
16
|
|
|
16
|
-
export { PathValue, Paths, type ReplaceDynamicSegmentsResult, SearchParams, type SearchParamsStringOptions, findObjectPath, getSafely, replaceDynamicSegments, toSearchParamsString };
|
|
17
|
+
export { PathValue, Paths, type ReplaceDynamicSegmentsResult, SearchParams, type SearchParamsStringOptions, extractDynamicSegmentKeys, findObjectPath, getSafely, replaceDynamicSegments, toSearchParamsString };
|
package/dist/index.js
CHANGED
|
@@ -51,6 +51,11 @@ var findObjectPath = /* @__PURE__ */ __name((root, target, splitter = "/", path
|
|
|
51
51
|
}
|
|
52
52
|
return void 0;
|
|
53
53
|
}, "findObjectPath");
|
|
54
|
+
var DYNAMIC_SEGMENT_REGEX = /\[([^\]]+)\]/g;
|
|
55
|
+
var extractDynamicSegmentKeys = /* @__PURE__ */ __name((pathname) => {
|
|
56
|
+
const matches = Array.from(pathname.matchAll(DYNAMIC_SEGMENT_REGEX));
|
|
57
|
+
return matches.map((match) => match[1]);
|
|
58
|
+
}, "extractDynamicSegmentKeys");
|
|
54
59
|
var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
55
60
|
if (!params) {
|
|
56
61
|
return {
|
|
@@ -59,7 +64,7 @@ var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
|
59
64
|
};
|
|
60
65
|
}
|
|
61
66
|
const usedKeys = /* @__PURE__ */ new Set();
|
|
62
|
-
const replacedPathname = pathname.replace(
|
|
67
|
+
const replacedPathname = pathname.replace(DYNAMIC_SEGMENT_REGEX, (_, key) => {
|
|
63
68
|
usedKeys.add(key);
|
|
64
69
|
const value = params[key.toString()];
|
|
65
70
|
if (value === void 0 || value === null) return `[${key}]`;
|
|
@@ -74,6 +79,7 @@ var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
|
74
79
|
};
|
|
75
80
|
}, "replaceDynamicSegments");
|
|
76
81
|
|
|
82
|
+
exports.extractDynamicSegmentKeys = extractDynamicSegmentKeys;
|
|
77
83
|
exports.findObjectPath = findObjectPath;
|
|
78
84
|
exports.getSafely = getSafely;
|
|
79
85
|
exports.replaceDynamicSegments = replaceDynamicSegments;
|
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;AACtB,IAAA,MAAM,OAAA,GAAU,KAAK,GAAG,CAAA;AAExB,IAAA,IAAI,OAAA,KAAY,MAAA,EAAQ,OAAO,IAAA,GAAO,GAAA;AAEtC,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,MAAA,MAAM,SAAS,cAAA,CAAe,OAAA,EAAoC,QAAQ,QAAA,EAAU,IAAA,GAAO,MAAM,QAAQ,CAAA;AACzG,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA,EAlB8B,gBAAA;
|
|
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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -49,6 +49,11 @@ var findObjectPath = /* @__PURE__ */ __name((root, target, splitter = "/", path
|
|
|
49
49
|
}
|
|
50
50
|
return void 0;
|
|
51
51
|
}, "findObjectPath");
|
|
52
|
+
var DYNAMIC_SEGMENT_REGEX = /\[([^\]]+)\]/g;
|
|
53
|
+
var extractDynamicSegmentKeys = /* @__PURE__ */ __name((pathname) => {
|
|
54
|
+
const matches = Array.from(pathname.matchAll(DYNAMIC_SEGMENT_REGEX));
|
|
55
|
+
return matches.map((match) => match[1]);
|
|
56
|
+
}, "extractDynamicSegmentKeys");
|
|
52
57
|
var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
53
58
|
if (!params) {
|
|
54
59
|
return {
|
|
@@ -57,7 +62,7 @@ var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
|
57
62
|
};
|
|
58
63
|
}
|
|
59
64
|
const usedKeys = /* @__PURE__ */ new Set();
|
|
60
|
-
const replacedPathname = pathname.replace(
|
|
65
|
+
const replacedPathname = pathname.replace(DYNAMIC_SEGMENT_REGEX, (_, key) => {
|
|
61
66
|
usedKeys.add(key);
|
|
62
67
|
const value = params[key.toString()];
|
|
63
68
|
if (value === void 0 || value === null) return `[${key}]`;
|
|
@@ -72,6 +77,6 @@ var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
|
72
77
|
};
|
|
73
78
|
}, "replaceDynamicSegments");
|
|
74
79
|
|
|
75
|
-
export { findObjectPath, getSafely, replaceDynamicSegments, toSearchParamsString };
|
|
80
|
+
export { extractDynamicSegmentKeys, findObjectPath, getSafely, replaceDynamicSegments, toSearchParamsString };
|
|
76
81
|
//# sourceMappingURL=index.mjs.map
|
|
77
82
|
//# sourceMappingURL=index.mjs.map
|
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;AACtB,IAAA,MAAM,OAAA,GAAU,KAAK,GAAG,CAAA;AAExB,IAAA,IAAI,OAAA,KAAY,MAAA,EAAQ,OAAO,IAAA,GAAO,GAAA;AAEtC,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,MAAA,MAAM,SAAS,cAAA,CAAe,OAAA,EAAoC,QAAQ,QAAA,EAAU,IAAA,GAAO,MAAM,QAAQ,CAAA;AACzG,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA,EAlB8B,gBAAA;
|
|
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"]}
|
package/dist/routes.utils.js
CHANGED
|
@@ -31,6 +31,7 @@ var findObjectPath = /* @__PURE__ */ __name((root, target, splitter = "/", path
|
|
|
31
31
|
}
|
|
32
32
|
return void 0;
|
|
33
33
|
}, "findObjectPath");
|
|
34
|
+
var DYNAMIC_SEGMENT_REGEX = /\[([^\]]+)\]/g;
|
|
34
35
|
var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
35
36
|
if (!params) {
|
|
36
37
|
return {
|
|
@@ -39,7 +40,7 @@ var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
|
39
40
|
};
|
|
40
41
|
}
|
|
41
42
|
const usedKeys = /* @__PURE__ */ new Set();
|
|
42
|
-
const replacedPathname = pathname.replace(
|
|
43
|
+
const replacedPathname = pathname.replace(DYNAMIC_SEGMENT_REGEX, (_, key) => {
|
|
43
44
|
usedKeys.add(key);
|
|
44
45
|
const value = params[key.toString()];
|
|
45
46
|
if (value === void 0 || value === null) return `[${key}]`;
|
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;AACtB,IAAA,MAAM,OAAA,GAAU,KAAK,GAAG,CAAA;AAExB,IAAA,IAAI,OAAA,KAAY,MAAA,EAAQ,OAAO,IAAA,GAAO,GAAA;AAEtC,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,MAAA,MAAM,SAAS,cAAA,CAAe,OAAA,EAAoC,QAAQ,QAAA,EAAU,IAAA,GAAO,MAAM,QAAQ,CAAA;AACzG,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA,EAlB8B,gBAAA,CAAA;
|
|
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 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 { 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 const { pathname: replacedPathname } = replaceDynamicSegments(pathname, params);\n return replacedPathname;\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
|
@@ -29,6 +29,7 @@ var findObjectPath = /* @__PURE__ */ __name((root, target, splitter = "/", path
|
|
|
29
29
|
}
|
|
30
30
|
return void 0;
|
|
31
31
|
}, "findObjectPath");
|
|
32
|
+
var DYNAMIC_SEGMENT_REGEX = /\[([^\]]+)\]/g;
|
|
32
33
|
var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
33
34
|
if (!params) {
|
|
34
35
|
return {
|
|
@@ -37,7 +38,7 @@ var replaceDynamicSegments = /* @__PURE__ */ __name((pathname, params) => {
|
|
|
37
38
|
};
|
|
38
39
|
}
|
|
39
40
|
const usedKeys = /* @__PURE__ */ new Set();
|
|
40
|
-
const replacedPathname = pathname.replace(
|
|
41
|
+
const replacedPathname = pathname.replace(DYNAMIC_SEGMENT_REGEX, (_, key) => {
|
|
41
42
|
usedKeys.add(key);
|
|
42
43
|
const value = params[key.toString()];
|
|
43
44
|
if (value === void 0 || value === null) return `[${key}]`;
|
|
@@ -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;AACtB,IAAA,MAAM,OAAA,GAAU,KAAK,GAAG,CAAA;AAExB,IAAA,IAAI,OAAA,KAAY,MAAA,EAAQ,OAAO,IAAA,GAAO,GAAA;AAEtC,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,MAAA,MAAM,SAAS,cAAA,CAAe,OAAA,EAAoC,QAAQ,QAAA,EAAU,IAAA,GAAO,MAAM,QAAQ,CAAA;AACzG,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA,EAlB8B,gBAAA,CAAA;
|
|
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 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 { 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 const { pathname: replacedPathname } = replaceDynamicSegments(pathname, params);\n return replacedPathname;\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"]}
|