@jlnstack/routes 0.0.3 → 0.0.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/LICENSE +7 -0
- package/package.json +12 -11
- package/dist/index.cjs +0 -21
- package/dist/index.d.cts +0 -19
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts +0 -19
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -22
- package/dist/index.mjs.map +0 -1
- package/dist/proxy.cjs +0 -19
- package/dist/proxy.mjs +0 -19
- package/dist/proxy.mjs.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
The MIT License (MIT) Copyright (c) 2025 - present, jln13x
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jlnstack/routes",
|
|
3
3
|
"description": "Type-safe route builder",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.4",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "jln13x",
|
|
7
7
|
"repository": {
|
|
@@ -9,24 +9,17 @@
|
|
|
9
9
|
"url": "https://github.com/jln13x/jlnstack"
|
|
10
10
|
},
|
|
11
11
|
"publishConfig": {
|
|
12
|
-
"access": "public"
|
|
12
|
+
"access": "public",
|
|
13
|
+
"provenance": true
|
|
13
14
|
},
|
|
14
15
|
"files": [
|
|
15
16
|
"dist",
|
|
16
17
|
"package.json"
|
|
17
18
|
],
|
|
18
|
-
"scripts": {
|
|
19
|
-
"build": "tsdown",
|
|
20
|
-
"dev": "tsdown --watch",
|
|
21
|
-
"lint": "tsc --noEmit",
|
|
22
|
-
"test": "vitest",
|
|
23
|
-
"test:run": "vitest run",
|
|
24
|
-
"test:ui": "vitest --ui"
|
|
25
|
-
},
|
|
26
19
|
"devDependencies": {
|
|
27
20
|
"@vitest/ui": "^2.1.8",
|
|
28
21
|
"tsdown": "^0.15.4",
|
|
29
|
-
"typescript": "
|
|
22
|
+
"typescript": "5.9.2",
|
|
30
23
|
"vitest": "^2.1.8"
|
|
31
24
|
},
|
|
32
25
|
"exports": {
|
|
@@ -41,5 +34,13 @@
|
|
|
41
34
|
"default": "./dist/index.cjs"
|
|
42
35
|
}
|
|
43
36
|
}
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsdown",
|
|
40
|
+
"dev": "tsdown --watch",
|
|
41
|
+
"lint": "tsc --noEmit",
|
|
42
|
+
"test": "vitest",
|
|
43
|
+
"test:run": "vitest run",
|
|
44
|
+
"test:ui": "vitest --ui"
|
|
44
45
|
}
|
|
45
46
|
}
|
package/dist/index.cjs
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
const require_proxy = require('./proxy.cjs');
|
|
2
|
-
|
|
3
|
-
//#region src/index.ts
|
|
4
|
-
function createRoutes() {
|
|
5
|
-
return require_proxy.createRecursiveProxy(({ path, args }) => {
|
|
6
|
-
var _args$;
|
|
7
|
-
const segments = path.slice(0, -1);
|
|
8
|
-
const params = (_args$ = args[0]) !== null && _args$ !== void 0 ? _args$ : {};
|
|
9
|
-
if (segments.length === 0) return "/";
|
|
10
|
-
const resolved = segments.flatMap((seg) => {
|
|
11
|
-
const value = params[seg];
|
|
12
|
-
if (Array.isArray(value)) return value;
|
|
13
|
-
if (value === void 0) return [];
|
|
14
|
-
return value !== null && value !== void 0 ? value : seg;
|
|
15
|
-
});
|
|
16
|
-
return resolved.length === 0 ? "/" : `/${resolved.join("/")}`;
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
//#endregion
|
|
21
|
-
exports.createRoutes = createRoutes;
|
package/dist/index.d.cts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
//#region src/index.d.ts
|
|
2
|
-
type SegmentName<S extends string> = S extends `[...${infer N}]` ? N : S extends `[[...${infer N}]]` ? N : S extends `[${infer N}]` ? N : S;
|
|
3
|
-
type ChildSegments<Routes extends string, Path extends string> = Routes extends `${Path}/${infer Next}/${string}` ? SegmentName<Next> : Routes extends `${Path}/${infer Next}` ? SegmentName<Next> : never;
|
|
4
|
-
type IsDynamicSegment<S extends string> = S extends `[${string}]` | `[...${string}]` | `[[...${string}]]` ? true : false;
|
|
5
|
-
type IsCatchAllSegment<S extends string> = S extends `[...${string}]` ? true : false;
|
|
6
|
-
type IsOptionalCatchAllSegment<S extends string> = S extends `[[...${string}]]` ? true : false;
|
|
7
|
-
type GetOriginalSegment<Routes extends string, Path extends string, Seg extends string> = Routes extends `${Path}/${infer Next}/${string}` ? SegmentName<Next> extends Seg ? Next : never : Routes extends `${Path}/${infer Next}` ? SegmentName<Next> extends Seg ? Next : never : never;
|
|
8
|
-
type IsDynamicAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsDynamicSegment<Original> extends true ? true : false : false : false;
|
|
9
|
-
type IsCatchAllAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsCatchAllSegment<Original> extends true ? true : false : false : false;
|
|
10
|
-
type IsOptionalCatchAllAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsOptionalCatchAllSegment<Original> extends true ? true : false : false : false;
|
|
11
|
-
type Join<T extends readonly string[], Sep extends string> = T extends readonly [infer First extends string, ...infer Rest extends readonly string[]] ? Rest["length"] extends 0 ? First : `${First}${Sep}${Join<Rest, Sep>}` : "";
|
|
12
|
-
type ReplaceDynamicSegments<Path extends string, P extends Record<string, string | string[] | undefined>> = Path extends `${infer Start}/[[...${infer Param}]]${infer Rest}` ? Param extends keyof P ? P[Param] extends readonly string[] ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], "/">}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}` : Path extends `${infer Start}/[...${infer Param}]${infer Rest}` ? Param extends keyof P ? P[Param] extends readonly string[] ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], "/">}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}` : Path extends `${infer Start}/[${infer Param}]${infer Rest}` ? Param extends keyof P ? P[Param] extends string ? `${Start}/${P[Param]}${ReplaceDynamicSegments<Rest, P>}` : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}` : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}` : Path;
|
|
13
|
-
type RouteNode<Routes extends string, Path extends string, Params extends Record<string, string | string[]> = {}> = {
|
|
14
|
-
getRoute: [keyof Params] extends [never] ? () => Path extends "" ? "/" : Path : <const P extends Params>(params: P) => ReplaceDynamicSegments<Path, P>;
|
|
15
|
-
} & { [Seg in ChildSegments<Routes, Path>]: RouteNode<Routes, Path extends "" ? `/${GetOriginalSegment<Routes, Path, Seg>}` : `${Path}/${GetOriginalSegment<Routes, Path, Seg>}`, IsOptionalCatchAllAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]?: string[] } : IsCatchAllAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]: string[] } : IsDynamicAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]: string } : Params> };
|
|
16
|
-
declare function createRoutes<Routes extends string>(): RouteNode<Routes, "", {}>;
|
|
17
|
-
//#endregion
|
|
18
|
-
export { RouteNode, createRoutes };
|
|
19
|
-
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.d.mts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
//#region src/index.d.ts
|
|
2
|
-
type SegmentName<S extends string> = S extends `[...${infer N}]` ? N : S extends `[[...${infer N}]]` ? N : S extends `[${infer N}]` ? N : S;
|
|
3
|
-
type ChildSegments<Routes extends string, Path extends string> = Routes extends `${Path}/${infer Next}/${string}` ? SegmentName<Next> : Routes extends `${Path}/${infer Next}` ? SegmentName<Next> : never;
|
|
4
|
-
type IsDynamicSegment<S extends string> = S extends `[${string}]` | `[...${string}]` | `[[...${string}]]` ? true : false;
|
|
5
|
-
type IsCatchAllSegment<S extends string> = S extends `[...${string}]` ? true : false;
|
|
6
|
-
type IsOptionalCatchAllSegment<S extends string> = S extends `[[...${string}]]` ? true : false;
|
|
7
|
-
type GetOriginalSegment<Routes extends string, Path extends string, Seg extends string> = Routes extends `${Path}/${infer Next}/${string}` ? SegmentName<Next> extends Seg ? Next : never : Routes extends `${Path}/${infer Next}` ? SegmentName<Next> extends Seg ? Next : never : never;
|
|
8
|
-
type IsDynamicAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsDynamicSegment<Original> extends true ? true : false : false : false;
|
|
9
|
-
type IsCatchAllAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsCatchAllSegment<Original> extends true ? true : false : false : false;
|
|
10
|
-
type IsOptionalCatchAllAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsOptionalCatchAllSegment<Original> extends true ? true : false : false : false;
|
|
11
|
-
type Join<T extends readonly string[], Sep extends string> = T extends readonly [infer First extends string, ...infer Rest extends readonly string[]] ? Rest["length"] extends 0 ? First : `${First}${Sep}${Join<Rest, Sep>}` : "";
|
|
12
|
-
type ReplaceDynamicSegments<Path extends string, P extends Record<string, string | string[] | undefined>> = Path extends `${infer Start}/[[...${infer Param}]]${infer Rest}` ? Param extends keyof P ? P[Param] extends readonly string[] ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], "/">}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}` : Path extends `${infer Start}/[...${infer Param}]${infer Rest}` ? Param extends keyof P ? P[Param] extends readonly string[] ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], "/">}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}` : Path extends `${infer Start}/[${infer Param}]${infer Rest}` ? Param extends keyof P ? P[Param] extends string ? `${Start}/${P[Param]}${ReplaceDynamicSegments<Rest, P>}` : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}` : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}` : Path;
|
|
13
|
-
type RouteNode<Routes extends string, Path extends string, Params extends Record<string, string | string[]> = {}> = {
|
|
14
|
-
getRoute: [keyof Params] extends [never] ? () => Path extends "" ? "/" : Path : <const P extends Params>(params: P) => ReplaceDynamicSegments<Path, P>;
|
|
15
|
-
} & { [Seg in ChildSegments<Routes, Path>]: RouteNode<Routes, Path extends "" ? `/${GetOriginalSegment<Routes, Path, Seg>}` : `${Path}/${GetOriginalSegment<Routes, Path, Seg>}`, IsOptionalCatchAllAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]?: string[] } : IsCatchAllAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]: string[] } : IsDynamicAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]: string } : Params> };
|
|
16
|
-
declare function createRoutes<Routes extends string>(): RouteNode<Routes, "", {}>;
|
|
17
|
-
//#endregion
|
|
18
|
-
export { RouteNode, createRoutes };
|
|
19
|
-
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.mjs
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { createRecursiveProxy } from "./proxy.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/index.ts
|
|
4
|
-
function createRoutes() {
|
|
5
|
-
return createRecursiveProxy(({ path, args }) => {
|
|
6
|
-
var _args$;
|
|
7
|
-
const segments = path.slice(0, -1);
|
|
8
|
-
const params = (_args$ = args[0]) !== null && _args$ !== void 0 ? _args$ : {};
|
|
9
|
-
if (segments.length === 0) return "/";
|
|
10
|
-
const resolved = segments.flatMap((seg) => {
|
|
11
|
-
const value = params[seg];
|
|
12
|
-
if (Array.isArray(value)) return value;
|
|
13
|
-
if (value === void 0) return [];
|
|
14
|
-
return value !== null && value !== void 0 ? value : seg;
|
|
15
|
-
});
|
|
16
|
-
return resolved.length === 0 ? "/" : `/${resolved.join("/")}`;
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
//#endregion
|
|
21
|
-
export { createRoutes };
|
|
22
|
-
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { createRecursiveProxy } from \"./proxy\";\n\ntype SegmentName<S extends string> = S extends `[...${infer N}]`\n ? N\n : S extends `[[...${infer N}]]`\n ? N\n : S extends `[${infer N}]`\n ? N\n : S;\n\ntype ChildSegments<\n Routes extends string,\n Path extends string,\n> = Routes extends `${Path}/${infer Next}/${string}`\n ? SegmentName<Next>\n : Routes extends `${Path}/${infer Next}`\n ? SegmentName<Next>\n : never;\n\ntype IsDynamicSegment<S extends string> = S extends\n | `[${string}]`\n | `[...${string}]`\n | `[[...${string}]]`\n ? true\n : false;\n\ntype IsCatchAllSegment<S extends string> = S extends `[...${string}]`\n ? true\n : false;\n\ntype IsOptionalCatchAllSegment<S extends string> = S extends `[[...${string}]]`\n ? true\n : false;\n\ntype GetOriginalSegment<\n Routes extends string,\n Path extends string,\n Seg extends string,\n> = Routes extends `${Path}/${infer Next}/${string}`\n ? SegmentName<Next> extends Seg\n ? Next\n : never\n : Routes extends `${Path}/${infer Next}`\n ? SegmentName<Next> extends Seg\n ? Next\n : never\n : never;\n\ntype IsDynamicAtPath<\n Routes extends string,\n Path extends string,\n Seg extends string,\n> = GetOriginalSegment<Routes, Path, Seg> extends infer Original\n ? Original extends string\n ? IsDynamicSegment<Original> extends true\n ? true\n : false\n : false\n : false;\n\ntype IsCatchAllAtPath<\n Routes extends string,\n Path extends string,\n Seg extends string,\n> = GetOriginalSegment<Routes, Path, Seg> extends infer Original\n ? Original extends string\n ? IsCatchAllSegment<Original> extends true\n ? true\n : false\n : false\n : false;\n\ntype IsOptionalCatchAllAtPath<\n Routes extends string,\n Path extends string,\n Seg extends string,\n> = GetOriginalSegment<Routes, Path, Seg> extends infer Original\n ? Original extends string\n ? IsOptionalCatchAllSegment<Original> extends true\n ? true\n : false\n : false\n : false;\n\ntype Join<\n T extends readonly string[],\n Sep extends string,\n> = T extends readonly [\n infer First extends string,\n ...infer Rest extends readonly string[],\n]\n ? Rest[\"length\"] extends 0\n ? First\n : `${First}${Sep}${Join<Rest, Sep>}`\n : \"\";\n\ntype ReplaceDynamicSegments<\n Path extends string,\n P extends Record<string, string | string[] | undefined>,\n> = Path extends `${infer Start}/[[...${infer Param}]]${infer Rest}`\n ? Param extends keyof P\n ? P[Param] extends readonly string[]\n ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], \"/\">}${ReplaceDynamicSegments<Rest, P>}`\n : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}`\n : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}`\n : Path extends `${infer Start}/[...${infer Param}]${infer Rest}`\n ? Param extends keyof P\n ? P[Param] extends readonly string[]\n ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], \"/\">}${ReplaceDynamicSegments<Rest, P>}`\n : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}`\n : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}`\n : Path extends `${infer Start}/[${infer Param}]${infer Rest}`\n ? Param extends keyof P\n ? P[Param] extends string\n ? `${Start}/${P[Param]}${ReplaceDynamicSegments<Rest, P>}`\n : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}`\n : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}`\n : Path;\n\nexport type RouteNode<\n Routes extends string,\n Path extends string,\n Params extends Record<string, string | string[]> = {},\n> = {\n getRoute: [keyof Params] extends [never]\n ? () => Path extends \"\" ? \"/\" : Path\n : <const P extends Params>(params: P) => ReplaceDynamicSegments<Path, P>;\n} & {\n [Seg in ChildSegments<Routes, Path>]: RouteNode<\n Routes,\n Path extends \"\"\n ? `/${GetOriginalSegment<Routes, Path, Seg>}`\n : `${Path}/${GetOriginalSegment<Routes, Path, Seg>}`,\n IsOptionalCatchAllAtPath<Routes, Path, Seg> extends true\n ? Params & { [K in Seg]?: string[] }\n : IsCatchAllAtPath<Routes, Path, Seg> extends true\n ? Params & { [K in Seg]: string[] }\n : IsDynamicAtPath<Routes, Path, Seg> extends true\n ? Params & { [K in Seg]: string }\n : Params\n >;\n};\n\nexport function createRoutes<Routes extends string>() {\n return createRecursiveProxy(({ path, args }) => {\n const segments = path.slice(0, -1);\n const params = (args[0] ?? {}) as Record<\n string,\n string | string[] | undefined\n >;\n\n if (segments.length === 0) return \"/\";\n\n const resolved = segments.flatMap((seg) => {\n const value = params[seg];\n if (Array.isArray(value)) return value;\n if (value === undefined) return [];\n return value ?? seg;\n });\n\n return resolved.length === 0 ? \"/\" : `/${resolved.join(\"/\")}`;\n }) as RouteNode<Routes, \"\", {}>;\n}\n"],"mappings":";;;AA+IA,SAAgB,eAAsC;AACpD,QAAO,sBAAsB,EAAE,MAAM,WAAW;;EAC9C,MAAM,WAAW,KAAK,MAAM,GAAG,GAAG;EAClC,MAAM,mBAAU,KAAK,6CAAM,EAAE;AAK7B,MAAI,SAAS,WAAW,EAAG,QAAO;EAElC,MAAM,WAAW,SAAS,SAAS,QAAQ;GACzC,MAAM,QAAQ,OAAO;AACrB,OAAI,MAAM,QAAQ,MAAM,CAAE,QAAO;AACjC,OAAI,UAAU,OAAW,QAAO,EAAE;AAClC,UAAO,6CAAS;IAChB;AAEF,SAAO,SAAS,WAAW,IAAI,MAAM,IAAI,SAAS,KAAK,IAAI;GAC3D"}
|
package/dist/proxy.cjs
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/proxy.ts
|
|
3
|
-
function createRecursiveProxy(callback, path = []) {
|
|
4
|
-
return new Proxy(() => {}, {
|
|
5
|
-
get(_obj, key) {
|
|
6
|
-
if (typeof key !== "string") return void 0;
|
|
7
|
-
return createRecursiveProxy(callback, [...path, key]);
|
|
8
|
-
},
|
|
9
|
-
apply(_1, _2, args) {
|
|
10
|
-
return callback({
|
|
11
|
-
path,
|
|
12
|
-
args
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
//#endregion
|
|
19
|
-
exports.createRecursiveProxy = createRecursiveProxy;
|
package/dist/proxy.mjs
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
//#region src/proxy.ts
|
|
2
|
-
function createRecursiveProxy(callback, path = []) {
|
|
3
|
-
return new Proxy(() => {}, {
|
|
4
|
-
get(_obj, key) {
|
|
5
|
-
if (typeof key !== "string") return void 0;
|
|
6
|
-
return createRecursiveProxy(callback, [...path, key]);
|
|
7
|
-
},
|
|
8
|
-
apply(_1, _2, args) {
|
|
9
|
-
return callback({
|
|
10
|
-
path,
|
|
11
|
-
args
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
//#endregion
|
|
18
|
-
export { createRecursiveProxy };
|
|
19
|
-
//# sourceMappingURL=proxy.mjs.map
|
package/dist/proxy.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.mjs","names":[],"sources":["../src/proxy.ts"],"sourcesContent":["interface ProxyCallbackOptions {\n path: readonly string[];\n args: readonly unknown[];\n}\n\ntype ProxyCallback = (opts: ProxyCallbackOptions) => unknown;\n\nexport function createRecursiveProxy(\n callback: ProxyCallback,\n path: readonly string[] = [],\n) {\n const proxy: unknown = new Proxy(() => {}, {\n get(_obj, key) {\n if (typeof key !== \"string\") return undefined;\n return createRecursiveProxy(callback, [...path, key]);\n },\n apply(_1, _2, args) {\n return callback({\n path,\n args,\n });\n },\n });\n\n return proxy;\n}\n"],"mappings":";AAOA,SAAgB,qBACd,UACA,OAA0B,EAAE,EAC5B;AAcA,QAbuB,IAAI,YAAY,IAAI;EACzC,IAAI,MAAM,KAAK;AACb,OAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,UAAO,qBAAqB,UAAU,CAAC,GAAG,MAAM,IAAI,CAAC;;EAEvD,MAAM,IAAI,IAAI,MAAM;AAClB,UAAO,SAAS;IACd;IACA;IACD,CAAC;;EAEL,CAAC"}
|