@taserjs/router 0.1.6 → 0.1.8
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/cjs/builder/factories.cjs +2 -0
- package/dist/cjs/builder/factories.cjs.map +1 -1
- package/dist/cjs/builder/factories.d.cts +2 -1
- package/dist/cjs/builder/standalone.cjs +3 -0
- package/dist/cjs/builder/standalone.cjs.map +1 -1
- package/dist/cjs/builder/standalone.d.cts +2 -0
- package/dist/cjs/define/middleware.cjs.map +1 -1
- package/dist/cjs/define/middleware.d.cts +20 -20
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/index.d.cts +6 -2
- package/dist/cjs/middleware/hono-mw.cjs.map +1 -1
- package/dist/cjs/middleware/hono-mw.d.cts +2 -1
- package/dist/cjs/types/index.d.cts +90 -64
- package/dist/cjs/types/type-utils.d.cts +3 -3
- package/dist/cjs/types/units.d.cts +26 -20
- package/dist/esm/builder/factories.d.ts +2 -1
- package/dist/esm/builder/factories.js +2 -1
- package/dist/esm/builder/factories.js.map +1 -1
- package/dist/esm/builder/standalone.d.ts +2 -0
- package/dist/esm/builder/standalone.js +4 -2
- package/dist/esm/builder/standalone.js.map +1 -1
- package/dist/esm/define/middleware.d.ts +20 -20
- package/dist/esm/define/middleware.js.map +1 -1
- package/dist/esm/index.d.ts +6 -2
- package/dist/esm/index.js +2 -2
- package/dist/esm/middleware/hono-mw.d.ts +2 -1
- package/dist/esm/middleware/hono-mw.js.map +1 -1
- package/dist/esm/types/index.d.ts +90 -64
- package/dist/esm/types/type-utils.d.ts +3 -3
- package/dist/esm/types/units.d.ts +26 -20
- package/package.json +3 -3
- package/src/builder/factories.ts +3 -2
- package/src/builder/standalone.ts +5 -0
- package/src/define/middleware.ts +68 -60
- package/src/index.ts +4 -0
- package/src/middleware/hono-mw.ts +5 -3
- package/src/types/index.ts +215 -130
- package/src/types/type-utils.ts +1 -1
- package/src/types/units.ts +47 -22
|
@@ -13,6 +13,7 @@ var createHeadRoute = createWithoutBodyRoute("HEAD");
|
|
|
13
13
|
var createPostRoute = createWithBodyRoute("POST");
|
|
14
14
|
var createPutRoute = createWithBodyRoute("PUT");
|
|
15
15
|
var createPatchRoute = createWithBodyRoute("PATCH");
|
|
16
|
+
var createQueryRoute = createWithBodyRoute("QUERY");
|
|
16
17
|
var createAnyRoute = ((path, methods) => require_route.createRouteBuilder(path, "ANY", methods));
|
|
17
18
|
var createAllRoute = ((path) => require_route.createRouteBuilder(path, "ALL"));
|
|
18
19
|
//#endregion
|
|
@@ -25,5 +26,6 @@ exports.createOptionsRoute = createOptionsRoute;
|
|
|
25
26
|
exports.createPatchRoute = createPatchRoute;
|
|
26
27
|
exports.createPostRoute = createPostRoute;
|
|
27
28
|
exports.createPutRoute = createPutRoute;
|
|
29
|
+
exports.createQueryRoute = createQueryRoute;
|
|
28
30
|
|
|
29
31
|
//# sourceMappingURL=factories.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factories.cjs","names":[],"sources":["../../../src/builder/factories.ts"],"sourcesContent":["import { createRouteBuilder } from \"./route.js\";\nimport type { AppContext, RouteBuilder, RoutePath } from \"../types/index.js\";\nimport type { HttpMethod } from \"../types/units.js\";\n\nexport type CreateWithoutBodyRoute<\n M extends \"GET\" | \"DELETE\" | \"OPTIONS\" | \"HEAD\",\n TAppContext extends Record<string, unknown> = AppContext,\n> = <const Path extends RoutePath>(\n path: Path,\n) => RouteBuilder<Path, M, readonly [], {}, {}, TAppContext>;\n\nexport type CreateWithBodyRoute<\n M extends \"POST\" | \"PUT\" | \"PATCH\",\n TAppContext extends Record<string, unknown> = AppContext,\n> = <const Path extends RoutePath>(\n path: Path,\n) => RouteBuilder<Path, M, readonly [], {}, {}, TAppContext>;\n\nexport type CreateAnyRoute<TAppContext extends Record<string, unknown> = AppContext> = <\n const Path extends RoutePath,\n const Methods extends readonly HttpMethod[],\n>(\n path: Path,\n methods: Methods,\n) => RouteBuilder<Path, Methods[number], readonly [], {}, {}, TAppContext>;\n\nexport type CreateAllRoute<TAppContext extends Record<string, unknown> = AppContext> = <\n const Path extends RoutePath,\n>(\n path: Path,\n) => RouteBuilder<Path, HttpMethod, readonly [], {}, {}, TAppContext>;\n\nfunction createWithoutBodyRoute<M extends \"GET\" | \"DELETE\" | \"OPTIONS\" | \"HEAD\">(\n method: M,\n): CreateWithoutBodyRoute<M> {\n return ((path: string) =>\n createRouteBuilder(path, method)) as unknown as CreateWithoutBodyRoute<M>;\n}\n\nfunction createWithBodyRoute<M extends \"POST\" | \"PUT\" | \"PATCH\">(\n method: M,\n): CreateWithBodyRoute<M> {\n return ((path: string) => createRouteBuilder(path, method)) as unknown as CreateWithBodyRoute<M>;\n}\n\nexport const createGetRoute = createWithoutBodyRoute(\"GET\");\nexport const createDeleteRoute = createWithoutBodyRoute(\"DELETE\");\nexport const createOptionsRoute = createWithoutBodyRoute(\"OPTIONS\");\nexport const createHeadRoute = createWithoutBodyRoute(\"HEAD\");\nexport const createPostRoute = createWithBodyRoute(\"POST\");\nexport const createPutRoute = createWithBodyRoute(\"PUT\");\nexport const createPatchRoute = createWithBodyRoute(\"PATCH\");\n\nexport const createAnyRoute: CreateAnyRoute = ((path: string, methods: readonly HttpMethod[]) =>\n createRouteBuilder(path, \"ANY\", methods)) as unknown as CreateAnyRoute;\n\nexport const createAllRoute: CreateAllRoute = ((path: string) =>\n createRouteBuilder(path, \"ALL\")) as unknown as CreateAllRoute;\n"],"mappings":";;AAgCA,SAAS,uBACP,QAC2B;CAC3B,SAAS,SACP,cAAA,mBAAmB,MAAM,MAAM;AACnC;AAEA,SAAS,oBACP,QACwB;CACxB,SAAS,SAAiB,cAAA,mBAAmB,MAAM,MAAM;AAC3D;AAEA,IAAa,iBAAiB,uBAAuB,KAAK;AAC1D,IAAa,oBAAoB,uBAAuB,QAAQ;AAChE,IAAa,qBAAqB,uBAAuB,SAAS;AAClE,IAAa,kBAAkB,uBAAuB,MAAM;AAC5D,IAAa,kBAAkB,oBAAoB,MAAM;AACzD,IAAa,iBAAiB,oBAAoB,KAAK;AACvD,IAAa,mBAAmB,oBAAoB,OAAO;AAE3D,IAAa,mBAAmC,MAAc,YAC5D,cAAA,mBAAmB,MAAM,OAAO,OAAO;AAEzC,IAAa,mBAAmC,SAC9C,cAAA,mBAAmB,MAAM,KAAK"}
|
|
1
|
+
{"version":3,"file":"factories.cjs","names":[],"sources":["../../../src/builder/factories.ts"],"sourcesContent":["import { createRouteBuilder } from \"./route.js\";\nimport type { AppContext, RouteBuilder, RoutePath } from \"../types/index.js\";\nimport type { HttpMethod } from \"../types/units.js\";\n\nexport type CreateWithoutBodyRoute<\n M extends \"GET\" | \"DELETE\" | \"OPTIONS\" | \"HEAD\",\n TAppContext extends Record<string, unknown> = AppContext,\n> = <const Path extends RoutePath>(\n path: Path,\n) => RouteBuilder<Path, M, readonly [], {}, {}, TAppContext>;\n\nexport type CreateWithBodyRoute<\n M extends \"POST\" | \"PUT\" | \"PATCH\" | \"QUERY\",\n TAppContext extends Record<string, unknown> = AppContext,\n> = <const Path extends RoutePath>(\n path: Path,\n) => RouteBuilder<Path, M, readonly [], {}, {}, TAppContext>;\n\nexport type CreateAnyRoute<TAppContext extends Record<string, unknown> = AppContext> = <\n const Path extends RoutePath,\n const Methods extends readonly HttpMethod[],\n>(\n path: Path,\n methods: Methods,\n) => RouteBuilder<Path, Methods[number], readonly [], {}, {}, TAppContext>;\n\nexport type CreateAllRoute<TAppContext extends Record<string, unknown> = AppContext> = <\n const Path extends RoutePath,\n>(\n path: Path,\n) => RouteBuilder<Path, HttpMethod, readonly [], {}, {}, TAppContext>;\n\nfunction createWithoutBodyRoute<M extends \"GET\" | \"DELETE\" | \"OPTIONS\" | \"HEAD\">(\n method: M,\n): CreateWithoutBodyRoute<M> {\n return ((path: string) =>\n createRouteBuilder(path, method)) as unknown as CreateWithoutBodyRoute<M>;\n}\n\nfunction createWithBodyRoute<M extends \"POST\" | \"PUT\" | \"PATCH\" | \"QUERY\">(\n method: M,\n): CreateWithBodyRoute<M> {\n return ((path: string) => createRouteBuilder(path, method)) as unknown as CreateWithBodyRoute<M>;\n}\n\nexport const createGetRoute = createWithoutBodyRoute(\"GET\");\nexport const createDeleteRoute = createWithoutBodyRoute(\"DELETE\");\nexport const createOptionsRoute = createWithoutBodyRoute(\"OPTIONS\");\nexport const createHeadRoute = createWithoutBodyRoute(\"HEAD\");\nexport const createPostRoute = createWithBodyRoute(\"POST\");\nexport const createPutRoute = createWithBodyRoute(\"PUT\");\nexport const createPatchRoute = createWithBodyRoute(\"PATCH\");\nexport const createQueryRoute = createWithBodyRoute(\"QUERY\");\n\nexport const createAnyRoute: CreateAnyRoute = ((path: string, methods: readonly HttpMethod[]) =>\n createRouteBuilder(path, \"ANY\", methods)) as unknown as CreateAnyRoute;\n\nexport const createAllRoute: CreateAllRoute = ((path: string) =>\n createRouteBuilder(path, \"ALL\")) as unknown as CreateAllRoute;\n"],"mappings":";;AAgCA,SAAS,uBACP,QAC2B;CAC3B,SAAS,SACP,cAAA,mBAAmB,MAAM,MAAM;AACnC;AAEA,SAAS,oBACP,QACwB;CACxB,SAAS,SAAiB,cAAA,mBAAmB,MAAM,MAAM;AAC3D;AAEA,IAAa,iBAAiB,uBAAuB,KAAK;AAC1D,IAAa,oBAAoB,uBAAuB,QAAQ;AAChE,IAAa,qBAAqB,uBAAuB,SAAS;AAClE,IAAa,kBAAkB,uBAAuB,MAAM;AAC5D,IAAa,kBAAkB,oBAAoB,MAAM;AACzD,IAAa,iBAAiB,oBAAoB,KAAK;AACvD,IAAa,mBAAmB,oBAAoB,OAAO;AAC3D,IAAa,mBAAmB,oBAAoB,OAAO;AAE3D,IAAa,mBAAmC,MAAc,YAC5D,cAAA,mBAAmB,MAAM,OAAO,OAAO;AAEzC,IAAa,mBAAmC,SAC9C,cAAA,mBAAmB,MAAM,KAAK"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AppContext, RouteBuilder, RoutePath } from '../types/index.js';
|
|
2
2
|
import { HttpMethod } from '../types/units.js';
|
|
3
3
|
export type CreateWithoutBodyRoute<M extends "GET" | "DELETE" | "OPTIONS" | "HEAD", TAppContext extends Record<string, unknown> = AppContext> = <const Path extends RoutePath>(path: Path) => RouteBuilder<Path, M, readonly [], {}, {}, TAppContext>;
|
|
4
|
-
export type CreateWithBodyRoute<M extends "POST" | "PUT" | "PATCH", TAppContext extends Record<string, unknown> = AppContext> = <const Path extends RoutePath>(path: Path) => RouteBuilder<Path, M, readonly [], {}, {}, TAppContext>;
|
|
4
|
+
export type CreateWithBodyRoute<M extends "POST" | "PUT" | "PATCH" | "QUERY", TAppContext extends Record<string, unknown> = AppContext> = <const Path extends RoutePath>(path: Path) => RouteBuilder<Path, M, readonly [], {}, {}, TAppContext>;
|
|
5
5
|
export type CreateAnyRoute<TAppContext extends Record<string, unknown> = AppContext> = <const Path extends RoutePath, const Methods extends readonly HttpMethod[]>(path: Path, methods: Methods) => RouteBuilder<Path, Methods[number], readonly [], {}, {}, TAppContext>;
|
|
6
6
|
export type CreateAllRoute<TAppContext extends Record<string, unknown> = AppContext> = <const Path extends RoutePath>(path: Path) => RouteBuilder<Path, HttpMethod, readonly [], {}, {}, TAppContext>;
|
|
7
7
|
export declare const createGetRoute: CreateWithoutBodyRoute<"GET", import('../types/units.js').EmptyAppContext>;
|
|
@@ -11,5 +11,6 @@ export declare const createHeadRoute: CreateWithoutBodyRoute<"HEAD", import('../
|
|
|
11
11
|
export declare const createPostRoute: CreateWithBodyRoute<"POST", import('../types/units.js').EmptyAppContext>;
|
|
12
12
|
export declare const createPutRoute: CreateWithBodyRoute<"PUT", import('../types/units.js').EmptyAppContext>;
|
|
13
13
|
export declare const createPatchRoute: CreateWithBodyRoute<"PATCH", import('../types/units.js').EmptyAppContext>;
|
|
14
|
+
export declare const createQueryRoute: CreateWithBodyRoute<"QUERY", import('../types/units.js').EmptyAppContext>;
|
|
14
15
|
export declare const createAnyRoute: CreateAnyRoute;
|
|
15
16
|
export declare const createAllRoute: CreateAllRoute;
|
|
@@ -9,6 +9,7 @@ var patch = require_factories.createPatchRoute;
|
|
|
9
9
|
var del = require_factories.createDeleteRoute;
|
|
10
10
|
var options = require_factories.createOptionsRoute;
|
|
11
11
|
var head = require_factories.createHeadRoute;
|
|
12
|
+
var query = require_factories.createQueryRoute;
|
|
12
13
|
var any = require_factories.createAnyRoute;
|
|
13
14
|
var all = require_factories.createAllRoute;
|
|
14
15
|
var layout = require_middleware.createMiddleware;
|
|
@@ -21,6 +22,7 @@ var t = {
|
|
|
21
22
|
delete: del,
|
|
22
23
|
options,
|
|
23
24
|
head,
|
|
25
|
+
query,
|
|
24
26
|
any,
|
|
25
27
|
all,
|
|
26
28
|
layout,
|
|
@@ -38,6 +40,7 @@ exports.options = options;
|
|
|
38
40
|
exports.patch = patch;
|
|
39
41
|
exports.post = post;
|
|
40
42
|
exports.put = put;
|
|
43
|
+
exports.query = query;
|
|
41
44
|
exports.t = t;
|
|
42
45
|
|
|
43
46
|
//# sourceMappingURL=standalone.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standalone.cjs","names":[],"sources":["../../../src/builder/standalone.ts"],"sourcesContent":["import type { AppContext, LayoutBuilder } from \"../types/index.js\";\nimport {\n createAllRoute,\n createAnyRoute,\n createDeleteRoute,\n createGetRoute,\n createHeadRoute,\n createOptionsRoute,\n createPatchRoute,\n createPostRoute,\n createPutRoute,\n type CreateAllRoute,\n type CreateAnyRoute,\n type CreateWithBodyRoute,\n type CreateWithoutBodyRoute,\n} from \"./factories.js\";\nimport { createMiddleware } from \"./middleware.js\";\nimport { middleware as createMiddlewareFn, type MiddlewareFn } from \"../define/middleware.js\";\n\nexport const get: CreateWithoutBodyRoute<\"GET\", AppContext> =\n createGetRoute as CreateWithoutBodyRoute<\"GET\", AppContext>;\nexport const post: CreateWithBodyRoute<\"POST\", AppContext> = createPostRoute as CreateWithBodyRoute<\n \"POST\",\n AppContext\n>;\nexport const put: CreateWithBodyRoute<\"PUT\", AppContext> = createPutRoute as CreateWithBodyRoute<\n \"PUT\",\n AppContext\n>;\nexport const patch: CreateWithBodyRoute<\"PATCH\", AppContext> =\n createPatchRoute as CreateWithBodyRoute<\"PATCH\", AppContext>;\nexport const del: CreateWithoutBodyRoute<\"DELETE\", AppContext> =\n createDeleteRoute as CreateWithoutBodyRoute<\"DELETE\", AppContext>;\nexport const options: CreateWithoutBodyRoute<\"OPTIONS\", AppContext> =\n createOptionsRoute as CreateWithoutBodyRoute<\"OPTIONS\", AppContext>;\nexport const head: CreateWithoutBodyRoute<\"HEAD\", AppContext> =\n createHeadRoute as CreateWithoutBodyRoute<\"HEAD\", AppContext>;\nexport const any: CreateAnyRoute<AppContext> = createAnyRoute as CreateAnyRoute<AppContext>;\nexport const all: CreateAllRoute<AppContext> = createAllRoute as CreateAllRoute<AppContext>;\n\nexport const layout: LayoutBuilder<AppContext> = createMiddleware as LayoutBuilder<AppContext>;\nexport const middleware: MiddlewareFn<AppContext> = createMiddlewareFn as MiddlewareFn<AppContext>;\n\nexport type TaserNamespace<TAppContext extends Record<string, unknown> = AppContext> = {\n readonly get: CreateWithoutBodyRoute<\"GET\", TAppContext>;\n readonly post: CreateWithBodyRoute<\"POST\", TAppContext>;\n readonly put: CreateWithBodyRoute<\"PUT\", TAppContext>;\n readonly patch: CreateWithBodyRoute<\"PATCH\", TAppContext>;\n readonly delete: CreateWithoutBodyRoute<\"DELETE\", TAppContext>;\n readonly options: CreateWithoutBodyRoute<\"OPTIONS\", TAppContext>;\n readonly head: CreateWithoutBodyRoute<\"HEAD\", TAppContext>;\n readonly any: CreateAnyRoute<TAppContext>;\n readonly all: CreateAllRoute<TAppContext>;\n readonly layout: LayoutBuilder<TAppContext>;\n readonly middleware: MiddlewareFn<TAppContext>;\n};\n\nexport const t: TaserNamespace<AppContext> = {\n get,\n post,\n put,\n patch,\n delete: del,\n options,\n head,\n any,\n all,\n layout,\n middleware,\n};\n"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"standalone.cjs","names":[],"sources":["../../../src/builder/standalone.ts"],"sourcesContent":["import type { AppContext, LayoutBuilder } from \"../types/index.js\";\nimport {\n createAllRoute,\n createAnyRoute,\n createDeleteRoute,\n createGetRoute,\n createHeadRoute,\n createOptionsRoute,\n createPatchRoute,\n createPostRoute,\n createPutRoute,\n createQueryRoute,\n type CreateAllRoute,\n type CreateAnyRoute,\n type CreateWithBodyRoute,\n type CreateWithoutBodyRoute,\n} from \"./factories.js\";\nimport { createMiddleware } from \"./middleware.js\";\nimport { middleware as createMiddlewareFn, type MiddlewareFn } from \"../define/middleware.js\";\n\nexport const get: CreateWithoutBodyRoute<\"GET\", AppContext> =\n createGetRoute as CreateWithoutBodyRoute<\"GET\", AppContext>;\nexport const post: CreateWithBodyRoute<\"POST\", AppContext> = createPostRoute as CreateWithBodyRoute<\n \"POST\",\n AppContext\n>;\nexport const put: CreateWithBodyRoute<\"PUT\", AppContext> = createPutRoute as CreateWithBodyRoute<\n \"PUT\",\n AppContext\n>;\nexport const patch: CreateWithBodyRoute<\"PATCH\", AppContext> =\n createPatchRoute as CreateWithBodyRoute<\"PATCH\", AppContext>;\nexport const del: CreateWithoutBodyRoute<\"DELETE\", AppContext> =\n createDeleteRoute as CreateWithoutBodyRoute<\"DELETE\", AppContext>;\nexport const options: CreateWithoutBodyRoute<\"OPTIONS\", AppContext> =\n createOptionsRoute as CreateWithoutBodyRoute<\"OPTIONS\", AppContext>;\nexport const head: CreateWithoutBodyRoute<\"HEAD\", AppContext> =\n createHeadRoute as CreateWithoutBodyRoute<\"HEAD\", AppContext>;\nexport const query: CreateWithBodyRoute<\"QUERY\", AppContext> =\n createQueryRoute as CreateWithBodyRoute<\"QUERY\", AppContext>;\nexport const any: CreateAnyRoute<AppContext> = createAnyRoute as CreateAnyRoute<AppContext>;\nexport const all: CreateAllRoute<AppContext> = createAllRoute as CreateAllRoute<AppContext>;\n\nexport const layout: LayoutBuilder<AppContext> = createMiddleware as LayoutBuilder<AppContext>;\nexport const middleware: MiddlewareFn<AppContext> = createMiddlewareFn as MiddlewareFn<AppContext>;\n\nexport type TaserNamespace<TAppContext extends Record<string, unknown> = AppContext> = {\n readonly get: CreateWithoutBodyRoute<\"GET\", TAppContext>;\n readonly post: CreateWithBodyRoute<\"POST\", TAppContext>;\n readonly put: CreateWithBodyRoute<\"PUT\", TAppContext>;\n readonly patch: CreateWithBodyRoute<\"PATCH\", TAppContext>;\n readonly delete: CreateWithoutBodyRoute<\"DELETE\", TAppContext>;\n readonly options: CreateWithoutBodyRoute<\"OPTIONS\", TAppContext>;\n readonly head: CreateWithoutBodyRoute<\"HEAD\", TAppContext>;\n readonly query: CreateWithBodyRoute<\"QUERY\", TAppContext>;\n readonly any: CreateAnyRoute<TAppContext>;\n readonly all: CreateAllRoute<TAppContext>;\n readonly layout: LayoutBuilder<TAppContext>;\n readonly middleware: MiddlewareFn<TAppContext>;\n};\n\nexport const t: TaserNamespace<AppContext> = {\n get,\n post,\n put,\n patch,\n delete: del,\n options,\n head,\n query,\n any,\n all,\n layout,\n middleware,\n};\n"],"mappings":";;;;AAoBA,IAAa,MACX,kBAAA;AACF,IAAa,OAAgD,kBAAA;AAI7D,IAAa,MAA8C,kBAAA;AAI3D,IAAa,QACX,kBAAA;AACF,IAAa,MACX,kBAAA;AACF,IAAa,UACX,kBAAA;AACF,IAAa,OACX,kBAAA;AACF,IAAa,QACX,kBAAA;AACF,IAAa,MAAkC,kBAAA;AAC/C,IAAa,MAAkC,kBAAA;AAE/C,IAAa,SAAoC,mBAAA;AACjD,IAAa,aAAuC,qBAAA;AAiBpD,IAAa,IAAgC;CAC3C;CACA;CACA;CACA;CACA,QAAQ;CACR;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
|
|
@@ -8,6 +8,7 @@ export declare const patch: CreateWithBodyRoute<"PATCH", AppContext>;
|
|
|
8
8
|
export declare const del: CreateWithoutBodyRoute<"DELETE", AppContext>;
|
|
9
9
|
export declare const options: CreateWithoutBodyRoute<"OPTIONS", AppContext>;
|
|
10
10
|
export declare const head: CreateWithoutBodyRoute<"HEAD", AppContext>;
|
|
11
|
+
export declare const query: CreateWithBodyRoute<"QUERY", AppContext>;
|
|
11
12
|
export declare const any: CreateAnyRoute<AppContext>;
|
|
12
13
|
export declare const all: CreateAllRoute<AppContext>;
|
|
13
14
|
export declare const layout: LayoutBuilder<AppContext>;
|
|
@@ -20,6 +21,7 @@ export type TaserNamespace<TAppContext extends Record<string, unknown> = AppCont
|
|
|
20
21
|
readonly delete: CreateWithoutBodyRoute<"DELETE", TAppContext>;
|
|
21
22
|
readonly options: CreateWithoutBodyRoute<"OPTIONS", TAppContext>;
|
|
22
23
|
readonly head: CreateWithoutBodyRoute<"HEAD", TAppContext>;
|
|
24
|
+
readonly query: CreateWithBodyRoute<"QUERY", TAppContext>;
|
|
23
25
|
readonly any: CreateAnyRoute<TAppContext>;
|
|
24
26
|
readonly all: CreateAllRoute<TAppContext>;
|
|
25
27
|
readonly layout: LayoutBuilder<TAppContext>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.cjs","names":[],"sources":["../../../src/define/middleware.ts"],"sourcesContent":["import { createMiddlewareUnitBuilder } from \"../builder/middleware-unit.js\";\nimport type {\n DefineMiddlewareResult,\n ExtractState,\n IsUnknown,\n MiddlewareUnitBuilder,\n NextFn,\n StandaloneMiddlewareContext,\n} from \"../types/units.js\";\nimport type {\n AppContext,\n LayoutId,\n ResolveLayoutMiddlewaresState,\n ResolveLayoutsState,\n} from \"../types/index.js\";\n\nexport interface MiddlewareFn<TAppContext extends Record<string, unknown> = AppContext> {\n /**\n *
|
|
1
|
+
{"version":3,"file":"middleware.cjs","names":[],"sources":["../../../src/define/middleware.ts"],"sourcesContent":["import { createMiddlewareUnitBuilder } from \"../builder/middleware-unit.js\";\nimport type {\n DefineMiddlewareResult,\n ExtractState,\n IsUnknown,\n MiddlewareRequirements,\n MiddlewareUnitBuilder,\n NextFn,\n StandaloneMiddlewareContext,\n} from \"../types/units.js\";\nimport type {\n AppContext,\n LayoutId,\n ResolveLayoutMiddlewaresState,\n ResolveLayoutsState,\n} from \"../types/index.js\";\n\nexport interface MiddlewareFn<TAppContext extends Record<string, unknown> = AppContext> {\n /**\n * Defines a standalone, unscoped middleware using a short function signature.\n *\n * @example\n * ```ts\n * const auth = middleware((ctx, next) => {\n * return next({ user: \"alice\" });\n * });\n * ```\n */\n <TState = unknown, TRequires extends MiddlewareRequirements = {}, R = unknown>(\n fn: (\n ctx: StandaloneMiddlewareContext<unknown, unknown, unknown, TAppContext, {}, TRequires>,\n next: NextFn<NoInfer<TState>>,\n ) => R,\n ): DefineMiddlewareResult<\n unknown,\n unknown,\n unknown,\n IsUnknown<TState> extends true ? ExtractState<R> : TState,\n R,\n unknown,\n unknown,\n unknown,\n {},\n null,\n TRequires\n >;\n\n /**\n * Constructs a fluent unscoped middleware builder, with optional explicit State generic.\n *\n * @example\n * ```ts\n * const auth = middleware<{ user: string }>()\n * .query(z.object({ token: z.string() }))\n * .body(\"form\", z.object({ file: z.instanceof(File) }))\n * .returns({ 401: z.string() })\n * .handler(async (ctx, next) => next({ user: \"alice\" }));\n * ```\n */\n <TState = unknown>(): MiddlewareUnitBuilder<\n unknown,\n unknown,\n unknown,\n {},\n null,\n {},\n TAppContext,\n {},\n unknown,\n unknown,\n unknown,\n TState\n >;\n\n /**\n * Defines a standalone middleware scoped to a single layout branch using a short function signature.\n */\n <\n const Layout extends LayoutId,\n TState = unknown,\n TRequires extends MiddlewareRequirements = {},\n R = unknown,\n >(\n layout: Layout,\n fn: (\n ctx: StandaloneMiddlewareContext<\n unknown,\n unknown,\n unknown,\n TAppContext,\n ResolveLayoutMiddlewaresState<Layout>,\n TRequires\n >,\n next: NextFn<NoInfer<TState>>,\n ) => R,\n ): DefineMiddlewareResult<\n unknown,\n unknown,\n unknown,\n IsUnknown<TState> extends true ? ExtractState<R> : TState,\n R,\n unknown,\n unknown,\n unknown,\n {},\n Layout,\n TRequires\n >;\n\n /**\n * Defines a standalone middleware scoped to multiple layout branches using a short function signature.\n */\n <\n const Layouts extends readonly [LayoutId, ...LayoutId[]],\n TState = unknown,\n TRequires extends MiddlewareRequirements = {},\n R = unknown,\n >(\n layouts: Layouts,\n fn: (\n ctx: StandaloneMiddlewareContext<\n unknown,\n unknown,\n unknown,\n TAppContext,\n ResolveLayoutsState<Layouts>,\n TRequires\n >,\n next: NextFn<NoInfer<TState>>,\n ) => R,\n ): DefineMiddlewareResult<\n unknown,\n unknown,\n unknown,\n IsUnknown<TState> extends true ? ExtractState<R> : TState,\n R,\n unknown,\n unknown,\n unknown,\n {},\n Layouts,\n TRequires\n >;\n\n /**\n * Constructs a fluent middleware builder scoped to a single layout branch, with optional explicit State generic.\n */\n <const Layout extends LayoutId, TState = unknown>(\n layout: Layout,\n ): MiddlewareUnitBuilder<\n unknown,\n unknown,\n unknown,\n {},\n Layout,\n {},\n TAppContext,\n ResolveLayoutMiddlewaresState<Layout>,\n unknown,\n unknown,\n unknown,\n TState\n >;\n\n /**\n * Constructs a fluent middleware builder scoped to multiple layout branches (branch union), with optional explicit State generic.\n */\n <const Layouts extends readonly [LayoutId, ...LayoutId[]], TState = unknown>(\n layouts: Layouts,\n ): MiddlewareUnitBuilder<\n unknown,\n unknown,\n unknown,\n {},\n Layouts,\n {},\n TAppContext,\n ResolveLayoutsState<Layouts>,\n unknown,\n unknown,\n unknown,\n TState\n >;\n}\n\nexport const middleware: MiddlewareFn<AppContext> = function middleware(\n first?: any,\n second?: any,\n): any {\n if (first === undefined) {\n return createMiddlewareUnitBuilder();\n }\n\n if (typeof first === \"string\" || Array.isArray(first)) {\n if (typeof second === \"function\") {\n return {\n handler: second,\n __middlewareAcc: undefined as unknown,\n __requiredLayouts: first,\n };\n }\n return createMiddlewareUnitBuilder(first);\n }\n\n if (typeof first === \"function\") {\n return {\n handler: first,\n __middlewareAcc: undefined as unknown,\n };\n }\n\n return createMiddlewareUnitBuilder();\n};\n"],"mappings":";;AAyLA,IAAa,aAAuC,SAAS,WAC3D,OACA,QACK;CACL,IAAI,UAAU,KAAA,GACZ,OAAO,wBAAA,4BAA4B;CAGrC,IAAI,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;EACrD,IAAI,OAAO,WAAW,YACpB,OAAO;GACL,SAAS;GACT,iBAAiB,KAAA;GACjB,mBAAmB;EACrB;EAEF,OAAO,wBAAA,4BAA4B,KAAK;CAC1C;CAEA,IAAI,OAAO,UAAU,YACnB,OAAO;EACL,SAAS;EACT,iBAAiB,KAAA;CACnB;CAGF,OAAO,wBAAA,4BAA4B;AACrC"}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
|
-
import { DefineMiddlewareResult, ExtractState, IsUnknown, MiddlewareUnitBuilder, NextFn, StandaloneMiddlewareContext } from '../types/units.js';
|
|
1
|
+
import { DefineMiddlewareResult, ExtractState, IsUnknown, MiddlewareRequirements, MiddlewareUnitBuilder, NextFn, StandaloneMiddlewareContext } from '../types/units.js';
|
|
2
2
|
import { AppContext, LayoutId, ResolveLayoutMiddlewaresState, ResolveLayoutsState } from '../types/index.js';
|
|
3
3
|
export interface MiddlewareFn<TAppContext extends Record<string, unknown> = AppContext> {
|
|
4
|
+
/**
|
|
5
|
+
* Defines a standalone, unscoped middleware using a short function signature.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const auth = middleware((ctx, next) => {
|
|
10
|
+
* return next({ user: "alice" });
|
|
11
|
+
* });
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
<TState = unknown, TRequires extends MiddlewareRequirements = {}, R = unknown>(fn: (ctx: StandaloneMiddlewareContext<unknown, unknown, unknown, TAppContext, {}, TRequires>, next: NextFn<NoInfer<TState>>) => R): DefineMiddlewareResult<unknown, unknown, unknown, IsUnknown<TState> extends true ? ExtractState<R> : TState, R, unknown, unknown, unknown, {}, null, TRequires>;
|
|
4
15
|
/**
|
|
5
16
|
* Constructs a fluent unscoped middleware builder, with optional explicit State generic.
|
|
6
17
|
*
|
|
@@ -14,32 +25,21 @@ export interface MiddlewareFn<TAppContext extends Record<string, unknown> = AppC
|
|
|
14
25
|
* ```
|
|
15
26
|
*/
|
|
16
27
|
<TState = unknown>(): MiddlewareUnitBuilder<unknown, unknown, unknown, {}, null, {}, TAppContext, {}, unknown, unknown, unknown, TState>;
|
|
17
|
-
/**
|
|
18
|
-
* Constructs a fluent middleware builder scoped to a single layout branch, with optional explicit State generic.
|
|
19
|
-
*/
|
|
20
|
-
<const Layout extends LayoutId, TState = unknown>(layout: Layout): MiddlewareUnitBuilder<unknown, unknown, unknown, {}, Layout, {}, TAppContext, ResolveLayoutMiddlewaresState<Layout>, unknown, unknown, unknown, TState>;
|
|
21
|
-
/**
|
|
22
|
-
* Constructs a fluent middleware builder scoped to multiple layout branches (branch union), with optional explicit State generic.
|
|
23
|
-
*/
|
|
24
|
-
<const Layouts extends readonly [LayoutId, ...LayoutId[]], TState = unknown>(layouts: Layouts): MiddlewareUnitBuilder<unknown, unknown, unknown, {}, Layouts, {}, TAppContext, ResolveLayoutsState<Layouts>, unknown, unknown, unknown, TState>;
|
|
25
28
|
/**
|
|
26
29
|
* Defines a standalone middleware scoped to a single layout branch using a short function signature.
|
|
27
30
|
*/
|
|
28
|
-
<const Layout extends LayoutId, TState = unknown, TRequires = {}, R = unknown>(layout: Layout, fn: (ctx: StandaloneMiddlewareContext<unknown, unknown, unknown, TAppContext, ResolveLayoutMiddlewaresState<Layout
|
|
31
|
+
<const Layout extends LayoutId, TState = unknown, TRequires extends MiddlewareRequirements = {}, R = unknown>(layout: Layout, fn: (ctx: StandaloneMiddlewareContext<unknown, unknown, unknown, TAppContext, ResolveLayoutMiddlewaresState<Layout>, TRequires>, next: NextFn<NoInfer<TState>>) => R): DefineMiddlewareResult<unknown, unknown, unknown, IsUnknown<TState> extends true ? ExtractState<R> : TState, R, unknown, unknown, unknown, {}, Layout, TRequires>;
|
|
29
32
|
/**
|
|
30
33
|
* Defines a standalone middleware scoped to multiple layout branches using a short function signature.
|
|
31
34
|
*/
|
|
32
|
-
<const Layouts extends readonly [LayoutId, ...LayoutId[]], TState = unknown, TRequires = {}, R = unknown>(layouts: Layouts, fn: (ctx: StandaloneMiddlewareContext<unknown, unknown, unknown, TAppContext, ResolveLayoutsState<Layouts
|
|
35
|
+
<const Layouts extends readonly [LayoutId, ...LayoutId[]], TState = unknown, TRequires extends MiddlewareRequirements = {}, R = unknown>(layouts: Layouts, fn: (ctx: StandaloneMiddlewareContext<unknown, unknown, unknown, TAppContext, ResolveLayoutsState<Layouts>, TRequires>, next: NextFn<NoInfer<TState>>) => R): DefineMiddlewareResult<unknown, unknown, unknown, IsUnknown<TState> extends true ? ExtractState<R> : TState, R, unknown, unknown, unknown, {}, Layouts, TRequires>;
|
|
33
36
|
/**
|
|
34
|
-
*
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
*
|
|
39
|
-
* return next({ user: "alice" });
|
|
40
|
-
* });
|
|
41
|
-
* ```
|
|
37
|
+
* Constructs a fluent middleware builder scoped to a single layout branch, with optional explicit State generic.
|
|
38
|
+
*/
|
|
39
|
+
<const Layout extends LayoutId, TState = unknown>(layout: Layout): MiddlewareUnitBuilder<unknown, unknown, unknown, {}, Layout, {}, TAppContext, ResolveLayoutMiddlewaresState<Layout>, unknown, unknown, unknown, TState>;
|
|
40
|
+
/**
|
|
41
|
+
* Constructs a fluent middleware builder scoped to multiple layout branches (branch union), with optional explicit State generic.
|
|
42
42
|
*/
|
|
43
|
-
<
|
|
43
|
+
<const Layouts extends readonly [LayoutId, ...LayoutId[]], TState = unknown>(layouts: Layouts): MiddlewareUnitBuilder<unknown, unknown, unknown, {}, Layouts, {}, TAppContext, ResolveLayoutsState<Layouts>, unknown, unknown, unknown, TState>;
|
|
44
44
|
}
|
|
45
45
|
export declare const middleware: MiddlewareFn<AppContext>;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -27,6 +27,7 @@ exports.options = require_standalone.options;
|
|
|
27
27
|
exports.patch = require_standalone.patch;
|
|
28
28
|
exports.post = require_standalone.post;
|
|
29
29
|
exports.put = require_standalone.put;
|
|
30
|
+
exports.query = require_standalone.query;
|
|
30
31
|
exports.t = require_standalone.t;
|
|
31
32
|
Object.defineProperty(exports, "validationErrorSchema", {
|
|
32
33
|
enumerable: true,
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
export interface RouterRegister {
|
|
2
2
|
}
|
|
3
|
-
export
|
|
3
|
+
export interface RouterMiddlewaresRegister {
|
|
4
|
+
}
|
|
5
|
+
export interface RouterRoutesRegister {
|
|
6
|
+
}
|
|
7
|
+
export type { AppContext, EmptyAppContext, HttpMethod, InferInput, InferOutput, InferRouteContext, InferRouteInput, InferRouteInputFromPath, InferRouteOutput, LayoutBuilder, LayoutId, LayoutMiddlewaresMap, LayoutTree, Method, MiddlewareBuilder, MiddlewareDefinition, MiddlewareUnit, MiddlewareUnitBuilder, PathParams, ReturnsMap, RouteByPathMethod, RouteDefinition, RouteExport, RoutePath, Schema, Simplify, StatusCode, } from './types/index.js';
|
|
4
8
|
export type { ContextDefinition, CreateTaserAppOptions, InferAppContext, InferAppManifest, OnErrorOptions, RouteManifestShape, } from './types/app.js';
|
|
5
9
|
export { ValidationError, validationErrorSchema } from '@taserjs/router-utils';
|
|
6
10
|
export type { ResponseValidationFailureHandler, SuccessStatusCode } from '@taserjs/router-utils';
|
|
7
|
-
export { all, any, del, get, head, layout, middleware, options, patch, post, put, t, type TaserNamespace, } from './builder/standalone.js';
|
|
11
|
+
export { all, any, del, get, head, layout, middleware, options, patch, post, put, query, t, type TaserNamespace, } from './builder/standalone.js';
|
|
8
12
|
export { createTaserApp, TaserRouter } from './builder/router.js';
|
|
9
13
|
export { TaserApp } from './builder/app.js';
|
|
10
14
|
export { createContext } from './context/create-context.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hono-mw.cjs","names":[],"sources":["../../../src/middleware/hono-mw.ts"],"sourcesContent":["import { createTaserCompatHandler } from \"@taserjs/router-core\";\nimport type { MiddlewareHandler } from \"hono\";\n\n/**\n * Adapts a standard Web / Hono-compatible middleware function `(c, next) => ...`\n * into a Taser-compatible middleware handler function `(ctx, next) => Promise<Response>`.\n *\n * @example\n * ```ts\n * import { honoMw } from \"@taserjs/router\";\n * import { cors } from \"hono/cors\";\n *\n * const app = t.get(\"/hello\").use(honoMw(cors()));\n * // or\n * const customCors = middleware(honoMw(cors()));\n * ```\n */\nexport function honoMw(\n middleware: MiddlewareHandler,\n): (ctx: unknown, next:
|
|
1
|
+
{"version":3,"file":"hono-mw.cjs","names":[],"sources":["../../../src/middleware/hono-mw.ts"],"sourcesContent":["import { createTaserCompatHandler } from \"@taserjs/router-core\";\nimport type { MiddlewareHandler } from \"hono\";\n\nimport type { NextFn } from \"../types/units.js\";\n\n/**\n * Adapts a standard Web / Hono-compatible middleware function `(c, next) => ...`\n * into a Taser-compatible middleware handler function `(ctx, next) => Promise<Response>`.\n *\n * @example\n * ```ts\n * import { honoMw } from \"@taserjs/router\";\n * import { cors } from \"hono/cors\";\n *\n * const app = t.get(\"/hello\").use(honoMw(cors()));\n * // or\n * const customCors = middleware(honoMw(cors()));\n * ```\n */\nexport function honoMw<TState extends Record<string, unknown> = {}>(\n middleware: MiddlewareHandler,\n): (ctx: unknown, next: NextFn<TState>) => Promise<Response> {\n return createTaserCompatHandler(middleware) as (ctx: unknown, next: NextFn<TState>) => Promise<Response>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,SAAgB,OACd,YAC2D;CAC3D,QAAA,GAAA,qBAAA,yBAAA,CAAgC,UAAU;AAC5C"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MiddlewareHandler } from 'hono';
|
|
2
|
+
import { NextFn } from '../types/units.js';
|
|
2
3
|
/**
|
|
3
4
|
* Adapts a standard Web / Hono-compatible middleware function `(c, next) => ...`
|
|
4
5
|
* into a Taser-compatible middleware handler function `(ctx, next) => Promise<Response>`.
|
|
@@ -13,4 +14,4 @@ import { MiddlewareHandler } from 'hono';
|
|
|
13
14
|
* const customCors = middleware(honoMw(cors()));
|
|
14
15
|
* ```
|
|
15
16
|
*/
|
|
16
|
-
export declare function honoMw(middleware: MiddlewareHandler): (ctx: unknown, next:
|
|
17
|
+
export declare function honoMw<TState extends Record<string, unknown> = {}>(middleware: MiddlewareHandler): (ctx: unknown, next: NextFn<TState>) => Promise<Response>;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { Awaitable, TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
|
|
2
|
-
import { RouterRegister } from '../index.js';
|
|
2
|
+
import { RouterMiddlewaresRegister, RouterRegister, RouterRoutesRegister } from '../index.js';
|
|
3
3
|
import { MergeMiddlewareField, MergeMiddlewareInputField, MergePart, RequestShape, Simplify, UnionToIntersection, UnitRuntimeContext } from './type-utils.js';
|
|
4
4
|
import { ReturnsMap, ValidHandlerReply } from './returns.js';
|
|
5
5
|
import { Schema } from './schema.js';
|
|
6
|
-
import { EmptyAppContext, ExtractState, Method, MiddlewareDefinition, MiddlewareReturnFromParts, MiddlewareUnit, NextFn, ValidatorParts } from './units.js';
|
|
6
|
+
import { EmptyAppContext, ExtractState, Method, MiddlewareDefinition, MiddlewareRequirements, MiddlewareReturnFromParts, MiddlewareUnit, NextFn, ValidatorParts } from './units.js';
|
|
7
7
|
export type { Awaitable } from '@taserjs/router-core';
|
|
8
8
|
export type { SchemaRequestShape, InferInput, InferOutput, Schema, StandardSchemaV1, } from './schema.js';
|
|
9
9
|
export type { MergeMiddlewareField, MergeMiddlewareInputField, MergePart, RequestShape, Simplify, UnitRuntimeContext, UnwrapPart, } from './type-utils.js';
|
|
10
10
|
export type { EmptyReturns, EnforceHandlerReply, HandlerReply, HasReturns, MergeReturns, ReplyFor, ReturnsMap, StatusCode, ValidHandlerReply, } from './returns.js';
|
|
11
|
-
export type { EmptyAppContext, ExtractState, HttpMethod, IsUnknown, Method, MiddlewareDefinition, MiddlewareReturnFromParts, MiddlewareUnit, MiddlewareUnitBuilder, NextFn, NextResult, StandaloneMiddlewareContext, StateBrand, ValidatorParts, } from './units.js';
|
|
11
|
+
export type { EmptyAppContext, ExtractState, HttpMethod, IsUnknown, Method, MiddlewareDefinition, MiddlewareRequirements, MiddlewareReturnFromParts, MiddlewareUnit, MiddlewareUnitBuilder, NextFn, NextResult, StandaloneMiddlewareContext, StateBrand, ValidatorParts, } from './units.js';
|
|
12
12
|
export type AppContext = RouterRegister extends {
|
|
13
13
|
AppContext: infer C;
|
|
14
14
|
} ? C : EmptyAppContext;
|
|
@@ -21,7 +21,14 @@ export type LayoutId = RouterRegister extends {
|
|
|
21
21
|
export type LayoutTree = RouterRegister extends {
|
|
22
22
|
LayoutTree: infer T;
|
|
23
23
|
} ? T : Record<never, never>;
|
|
24
|
-
export type
|
|
24
|
+
export type LayoutMiddlewaresMap = RouterMiddlewaresRegister extends {
|
|
25
|
+
LayoutMiddlewares: infer M;
|
|
26
|
+
} ? M : RouterRegister extends {
|
|
27
|
+
LayoutMiddlewares: infer M;
|
|
28
|
+
} ? M : Record<never, never>;
|
|
29
|
+
export type RouteByPathMethod = RouterRoutesRegister extends {
|
|
30
|
+
RouteByPathMethod: infer R;
|
|
31
|
+
} ? R : RouterRegister extends {
|
|
25
32
|
RouteByPathMethod: infer R;
|
|
26
33
|
} ? R : Record<never, never>;
|
|
27
34
|
export type LayoutBuilder<TAppContext extends Record<string, unknown> = AppContext> = <const Layout extends LayoutId>(layout: Layout) => MiddlewareBuilder<Layout, readonly [], TAppContext>;
|
|
@@ -33,19 +40,16 @@ type ParseParam<Segment extends string> = Segment extends "*" ? {
|
|
|
33
40
|
type ParseParamsFromSegments<S extends string> = S extends `${infer Segment}/${infer Rest}` ? ParseParam<Segment> & ParseParamsFromSegments<Rest> : ParseParam<S>;
|
|
34
41
|
export type PathParams<Path extends string> = Path extends `/${infer Rest}` ? ParseParamsFromSegments<Rest> : {};
|
|
35
42
|
export type ResolveParams<TPathParams, TSchemaParams> = TSchemaParams extends Record<string, unknown> ? [keyof TSchemaParams] extends [never] ? TPathParams : Simplify<Omit<TPathParams, keyof TSchemaParams> & TSchemaParams> : TPathParams;
|
|
36
|
-
type
|
|
37
|
-
|
|
38
|
-
} ?
|
|
39
|
-
type
|
|
40
|
-
parent: infer Parent extends LayoutId | null;
|
|
41
|
-
} ? Parent : null;
|
|
42
|
-
type LayoutMiddlewares<Layout extends LayoutId> = LayoutTree[Layout]["middlewares"] extends {
|
|
43
|
+
type LayoutParent<Layout extends LayoutId> = Layout extends keyof LayoutTree ? LayoutTree[Layout] extends {
|
|
44
|
+
parent: infer P extends LayoutId;
|
|
45
|
+
} ? P : null : null;
|
|
46
|
+
type LayoutMiddlewares<Layout extends LayoutId> = [Layout] extends [keyof LayoutMiddlewaresMap] ? LayoutMiddlewaresMap[Layout] extends {
|
|
43
47
|
readonly __acc?: infer Acc extends readonly unknown[];
|
|
44
|
-
} ? Acc :
|
|
45
|
-
type ResolveLayoutMiddlewares<Layout extends LayoutId | null, Depth extends readonly unknown[] = []> = Depth["length"] extends 10 ? readonly [] : Layout extends LayoutId ? readonly [
|
|
46
|
-
...ResolveLayoutMiddlewares<
|
|
48
|
+
} ? Acc : LayoutMiddlewaresMap[Layout] extends readonly unknown[] ? LayoutMiddlewaresMap[Layout] : readonly [] : readonly [];
|
|
49
|
+
type ResolveLayoutMiddlewares<Layout extends LayoutId | null, Depth extends readonly unknown[] = []> = Depth["length"] extends 10 ? readonly [] : [Layout] extends [LayoutId] ? LayoutParent<Layout> extends infer Parent extends LayoutId ? readonly [
|
|
50
|
+
...ResolveLayoutMiddlewares<Parent, [...Depth, unknown]>,
|
|
47
51
|
...LayoutMiddlewares<Layout>
|
|
48
|
-
] : readonly [];
|
|
52
|
+
] : readonly [...LayoutMiddlewares<Layout>] : readonly [];
|
|
49
53
|
export type ResolveLayoutIdChain<L extends LayoutId | null, Depth extends readonly unknown[] = []> = Depth["length"] extends 10 ? readonly [] : L extends LayoutId ? readonly [...ResolveLayoutIdChain<LayoutParent<L>, [...Depth, unknown]>, L] : readonly [];
|
|
50
54
|
export type ResolveLayoutMiddlewaresState<Layout extends LayoutId | null> = Layout extends LayoutId ? MergeMiddlewareField<ResolveLayoutMiddlewares<Layout>, "state"> : {};
|
|
51
55
|
export type ResolveLayoutsState<Layouts extends LayoutId | readonly LayoutId[]> = Layouts extends LayoutId ? ResolveLayoutMiddlewaresState<Layouts> : Layouts extends readonly LayoutId[] ? UnionToIntersection<Layouts[number] extends infer L extends LayoutId ? ResolveLayoutMiddlewaresState<L> : never> : {};
|
|
@@ -60,21 +64,18 @@ type ResolveLayoutChainMiddlewares<Chain extends readonly LayoutId[]> = Chain ex
|
|
|
60
64
|
type RouteEntry<Path extends RoutePath, TMethod extends Method> = RouteByPathMethod[Path] extends {
|
|
61
65
|
[K in TMethod]: infer Entry;
|
|
62
66
|
} ? Entry : never;
|
|
63
|
-
type RouteParent<Path extends RoutePath, TMethod extends Method> = RouteEntry<Path, TMethod> extends {
|
|
64
|
-
parent: infer Parent extends LayoutId | null;
|
|
65
|
-
} ? Parent : null;
|
|
66
67
|
type RouteLayoutChain<Path extends RoutePath, TMethod extends Method> = RouteEntry<Path, TMethod> extends {
|
|
67
|
-
|
|
68
|
-
} ? Chain :
|
|
68
|
+
layouts: infer Chain extends readonly LayoutId[];
|
|
69
|
+
} ? Chain : readonly [];
|
|
69
70
|
export type RouteLayoutMiddlewares<Path extends RoutePath, TMethod extends Method> = ResolveLayoutChainMiddlewares<RouteLayoutChain<Path, TMethod>>;
|
|
70
71
|
export type RouteLayoutField<Path extends RoutePath, TMethod extends Method, Field extends "query" | "params" | "body" | "state"> = MergeMiddlewareField<RouteLayoutMiddlewares<Path, TMethod>, Field>;
|
|
71
72
|
export type RouteLayoutInputField<Path extends RoutePath, TMethod extends Method, Field extends "query" | "params" | "body"> = MergeMiddlewareInputField<RouteLayoutMiddlewares<Path, TMethod>, Field>;
|
|
72
73
|
type RouteResolvedField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends "query" | "params" | "body" | "state"> = RouteLayoutField<Path, TMethod, Field> & MergeMiddlewareField<Acc, Field>;
|
|
73
74
|
export type RouteChainContext<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], TQuery, TParams, TBody, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & {
|
|
74
|
-
query:
|
|
75
|
-
params:
|
|
76
|
-
body:
|
|
77
|
-
state:
|
|
75
|
+
query: MergePart<TQuery, RouteResolvedField<Path, TMethod, Acc, "query">>;
|
|
76
|
+
params: ResolveParams<PathParams<Path>, MergePart<TParams, RouteResolvedField<Path, TMethod, Acc, "params">>>;
|
|
77
|
+
body: MergePart<TBody, RouteResolvedField<Path, TMethod, Acc, "body">>;
|
|
78
|
+
state: RouteResolvedField<Path, TMethod, Acc, "state">;
|
|
78
79
|
headers: TaserHeaders;
|
|
79
80
|
cookies: TaserCookieJar;
|
|
80
81
|
}>;
|
|
@@ -121,7 +122,25 @@ type IsEmptyObject<T> = [keyof T] extends [never] ? true : false;
|
|
|
121
122
|
export type IsLayoutAllowed<TRequiredLayouts, TChain extends readonly LayoutId[]> = [
|
|
122
123
|
TRequiredLayouts
|
|
123
124
|
] extends [never] ? true : [unknown] extends [TRequiredLayouts] ? true : [null] extends [TRequiredLayouts] ? true : [undefined] extends [TRequiredLayouts] ? true : TRequiredLayouts extends LayoutId ? TRequiredLayouts extends TChain[number] ? true : false : TRequiredLayouts extends readonly LayoutId[] ? [TRequiredLayouts[number] & TChain[number]] extends [never] ? false : true : true;
|
|
124
|
-
export type
|
|
125
|
+
export type IsRequirementsSatisfied<TActual extends {
|
|
126
|
+
query?: unknown;
|
|
127
|
+
params?: unknown;
|
|
128
|
+
body?: unknown;
|
|
129
|
+
state?: unknown;
|
|
130
|
+
}, TRequires extends MiddlewareRequirements> = [TRequires] extends [never] ? true : [unknown] extends [TRequires] ? true : [null] extends [TRequires] ? true : [undefined] extends [TRequires] ? true : [IsEmptyObject<TRequires>] extends [true] ? true : (TRequires extends {
|
|
131
|
+
state: infer S extends Record<string, unknown>;
|
|
132
|
+
} ? [TActual["state"]] extends [S] ? true : false : true) extends false ? false : (TRequires extends {
|
|
133
|
+
query: infer Q extends Record<string, unknown>;
|
|
134
|
+
} ? [TActual["query"]] extends [Q] ? true : false : true) extends false ? false : (TRequires extends {
|
|
135
|
+
params: infer P extends Record<string, unknown>;
|
|
136
|
+
} ? [TActual["params"]] extends [P] ? true : false : true) extends false ? false : (TRequires extends {
|
|
137
|
+
body: infer B;
|
|
138
|
+
} ? unknown extends B ? true : [TRequires["body"]] extends [undefined] ? true : [TActual["body"]] extends [B] ? true : false : true) extends false ? false : true;
|
|
139
|
+
export type IsStateSatisfied<TActualState, TRequiredState> = IsRequirementsSatisfied<{
|
|
140
|
+
state: TActualState;
|
|
141
|
+
}, {
|
|
142
|
+
state: TRequiredState extends Record<string, unknown> ? TRequiredState : {};
|
|
143
|
+
}>;
|
|
125
144
|
type InputFacet<T, K extends string> = IsNever<T> extends true ? {} : IsEmptyObject<T> extends true ? {} : {
|
|
126
145
|
[Key in K]: T;
|
|
127
146
|
};
|
|
@@ -149,36 +168,43 @@ export type InferRouteInputFromPath<Path extends RoutePath, TMethod extends Meth
|
|
|
149
168
|
Input: infer I;
|
|
150
169
|
};
|
|
151
170
|
} ? I : never : never;
|
|
152
|
-
export type MiddlewareLayoutField<Layout extends LayoutId, Field extends "query" | "params" | "body" | "state"> = MergeMiddlewareField<ResolveLayoutMiddlewares<
|
|
171
|
+
export type MiddlewareLayoutField<Layout extends LayoutId, Field extends "query" | "params" | "body" | "state"> = [LayoutParent<Layout>] extends [infer Parent extends LayoutId] ? MergeMiddlewareField<ResolveLayoutMiddlewares<Parent>, Field> : {};
|
|
153
172
|
type MiddlewareChainField<Layout extends LayoutId, Acc extends readonly unknown[], Field extends "query" | "params" | "body" | "state"> = MiddlewareLayoutField<Layout, Field> & MergeMiddlewareField<Acc, Field>;
|
|
154
|
-
export type MiddlewareChainContext<Layout extends LayoutId, Acc extends readonly unknown[], TQuery, TParams, TBody, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext &
|
|
173
|
+
export type MiddlewareChainContext<Layout extends LayoutId, Acc extends readonly unknown[], TQuery = unknown, TParams = unknown, TBody = unknown, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & {
|
|
174
|
+
readonly request: Request;
|
|
175
|
+
readonly method: Method;
|
|
176
|
+
readonly url: URL;
|
|
177
|
+
readonly headers: TaserHeaders;
|
|
178
|
+
readonly cookies: TaserCookieJar;
|
|
155
179
|
query: Simplify<MergePart<TQuery, MiddlewareChainField<Layout, Acc, "query">>>;
|
|
156
180
|
params: Simplify<MergePart<TParams, MiddlewareChainField<Layout, Acc, "params">>>;
|
|
157
181
|
body: Simplify<MergePart<TBody, MiddlewareChainField<Layout, Acc, "body">>>;
|
|
158
182
|
state: Simplify<MiddlewareChainField<Layout, Acc, "state">>;
|
|
159
|
-
headers: TaserHeaders;
|
|
160
|
-
cookies: TaserCookieJar;
|
|
161
183
|
}>;
|
|
162
184
|
export type MiddlewareBuilder<Layout extends LayoutId, Acc extends readonly unknown[] = readonly [], TAppContext extends Record<string, unknown> = AppContext> = {
|
|
163
185
|
readonly layout: Layout;
|
|
164
186
|
readonly middlewares: readonly MiddlewareDefinition[];
|
|
165
187
|
readonly __acc?: Acc;
|
|
166
|
-
|
|
167
|
-
Context: MiddlewareChainContext<Layout, Acc, unknown, unknown, unknown, TAppContext>;
|
|
168
|
-
};
|
|
169
|
-
use<TAcc, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown>(unit: MiddlewareUnit<TAcc, TReturns, TRequiredLayouts, TRequiredState>, ..._assert: [
|
|
188
|
+
use<TAcc, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequires extends MiddlewareRequirements = {}>(unit: [
|
|
170
189
|
IsLayoutAllowed<TRequiredLayouts, ResolveLayoutIdChain<Layout>>,
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
190
|
+
IsRequirementsSatisfied<{
|
|
191
|
+
query: MiddlewareChainField<Layout, Acc, "query">;
|
|
192
|
+
params: MiddlewareChainField<Layout, Acc, "params">;
|
|
193
|
+
body: MiddlewareChainField<Layout, Acc, "body">;
|
|
194
|
+
state: MiddlewareChainField<Layout, Acc, "state">;
|
|
195
|
+
}, TRequires>
|
|
196
|
+
] extends [true, true] ? MiddlewareUnit<TAcc, TReturns, TRequiredLayouts, TRequires> : never): MiddlewareBuilder<Layout, readonly [...Acc, TAcc], TAppContext>;
|
|
197
|
+
use<R = unknown>(fn: (ctx: Simplify<TAppContext & {
|
|
198
|
+
readonly request: Request;
|
|
199
|
+
readonly method: Method;
|
|
200
|
+
readonly url: URL;
|
|
201
|
+
readonly headers: TaserHeaders;
|
|
202
|
+
readonly cookies: TaserCookieJar;
|
|
203
|
+
query: Simplify<MergePart<unknown, MiddlewareChainField<Layout, Acc, "query">>>;
|
|
204
|
+
params: Simplify<MergePart<unknown, MiddlewareChainField<Layout, Acc, "params">>>;
|
|
205
|
+
body: Simplify<MergePart<unknown, MiddlewareChainField<Layout, Acc, "body">>>;
|
|
206
|
+
state: Simplify<MiddlewareChainField<Layout, Acc, "state">>;
|
|
207
|
+
}>, next: NextFn) => Awaitable<R>): MiddlewareBuilder<Layout, readonly [...Acc, MiddlewareReturnFromParts<unknown, unknown, unknown, ExtractState<R>>], TAppContext>;
|
|
182
208
|
};
|
|
183
209
|
export type RouteExport<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], TReturns extends ReturnsMap = {}, TOutput = Response> = {
|
|
184
210
|
readonly path: Path;
|
|
@@ -205,7 +231,7 @@ type RouteHandleResult<Path extends RoutePath, TMethod extends Method, Acc exten
|
|
|
205
231
|
Output: TOutput;
|
|
206
232
|
};
|
|
207
233
|
};
|
|
208
|
-
export type
|
|
234
|
+
export type RouteContractBuilderBase<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[] = readonly [], Validators extends ValidatorParts = {}, TReturns extends ReturnsMap = {}, TAppContext extends Record<string, unknown> = AppContext> = {
|
|
209
235
|
readonly path: Path;
|
|
210
236
|
readonly method: TMethod;
|
|
211
237
|
readonly $Infer: {
|
|
@@ -213,28 +239,15 @@ export type RouteBuilderBase<Path extends RoutePath, TMethod extends Method, Acc
|
|
|
213
239
|
Input: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleInputWithoutBody<Path, TMethod, Acc, Validators> : RouteHandleInput<Path, TMethod, Acc, Validators>;
|
|
214
240
|
Output: TReturns;
|
|
215
241
|
};
|
|
216
|
-
query<TQuery, TQueryIn = unknown>(schema: Schema<TQuery, TQueryIn>):
|
|
242
|
+
query<TQuery, TQueryIn = unknown>(schema: Schema<TQuery, TQueryIn>): RouteContractBuilder<Path, TMethod, Acc, Omit<Validators, "query" | "queryIn"> & {
|
|
217
243
|
query: TQuery;
|
|
218
244
|
queryIn: TQueryIn;
|
|
219
245
|
}, TReturns, TAppContext>;
|
|
220
|
-
params<TParams, TParamsIn = unknown>(schema: Schema<TParams, TParamsIn>):
|
|
246
|
+
params<TParams, TParamsIn = unknown>(schema: Schema<TParams, TParamsIn>): RouteContractBuilder<Path, TMethod, Acc, Omit<Validators, "params" | "paramsIn"> & {
|
|
221
247
|
params: TParams;
|
|
222
248
|
paramsIn: TParamsIn;
|
|
223
249
|
}, TReturns, TAppContext>;
|
|
224
|
-
returns<const M extends ReturnsMap>(map: M):
|
|
225
|
-
use<TAcc, UReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown>(unit: MiddlewareUnit<TAcc, UReturns, TRequiredLayouts, TRequiredState>, ..._assert: [
|
|
226
|
-
IsLayoutAllowed<TRequiredLayouts, RouteLayoutChain<Path, TMethod>>,
|
|
227
|
-
IsStateSatisfied<RouteResolvedField<Path, TMethod, Acc, "state">, TRequiredState>
|
|
228
|
-
] extends [true, true] ? [] : [
|
|
229
|
-
{
|
|
230
|
-
error: "Middleware cannot be attached to this route";
|
|
231
|
-
requiredLayouts: TRequiredLayouts;
|
|
232
|
-
routeLayoutChain: RouteLayoutChain<Path, TMethod>;
|
|
233
|
-
requiredState: TRequiredState;
|
|
234
|
-
actualState: RouteResolvedField<Path, TMethod, Acc, "state">;
|
|
235
|
-
}
|
|
236
|
-
]): RouteBuilder<Path, TMethod, readonly [...Acc, TAcc], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
|
|
237
|
-
use<R = unknown>(fn: (ctx: RouteChainContext<Path, TMethod, Acc, unknown, unknown, unknown, TAppContext>, next: NextFn) => Awaitable<R>): RouteBuilder<Path, TMethod, readonly [...Acc, MiddlewareReturnFromParts<unknown, unknown, unknown, ExtractState<R>>], Validators, TReturns, TAppContext>;
|
|
250
|
+
returns<const M extends ReturnsMap>(map: M): RouteContractBuilder<Path, TMethod, Acc, Validators, Omit<TReturns, keyof M> & M, TAppContext>;
|
|
238
251
|
handler<R extends Response = Response>(fn: (ctx: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleContextWithoutBody<Path, TMethod, Acc, Validators, TAppContext> : RouteHandleContext<Path, TMethod, Acc, Validators, TAppContext>) => Awaitable<R>, ..._assert: [R] extends [ValidHandlerReply<R, TReturns>] ? [] : [
|
|
239
252
|
{
|
|
240
253
|
expected: ValidHandlerReply<R, TReturns>;
|
|
@@ -242,16 +255,29 @@ export type RouteBuilderBase<Path extends RoutePath, TMethod extends Method, Acc
|
|
|
242
255
|
}
|
|
243
256
|
]): RouteHandleResult<Path, TMethod, Acc, Validators, TReturns, R, TAppContext>;
|
|
244
257
|
};
|
|
245
|
-
export type
|
|
246
|
-
body<TBody, TBodyIn = unknown>(schema: Schema<TBody, TBodyIn>):
|
|
258
|
+
export type RouteContractBuilder<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[] = readonly [], Validators extends ValidatorParts = {}, TReturns extends ReturnsMap = {}, TAppContext extends Record<string, unknown> = AppContext> = RouteContractBuilderBase<Path, TMethod, Acc, Validators, TReturns, TAppContext> & (TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? {} : {
|
|
259
|
+
body<TBody, TBodyIn = unknown>(schema: Schema<TBody, TBodyIn>): RouteContractBuilder<Path, TMethod, Acc, Omit<Validators, "body" | "bodyIn"> & {
|
|
247
260
|
body: TBody;
|
|
248
261
|
bodyIn: TBodyIn;
|
|
249
262
|
}, TReturns, TAppContext>;
|
|
250
|
-
body<Mode extends "json" | "form" | "urlencoded", TBody, TBodyIn = unknown>(mode: Mode, schema: Schema<TBody, TBodyIn>):
|
|
263
|
+
body<Mode extends "json" | "form" | "urlencoded", TBody, TBodyIn = unknown>(mode: Mode, schema: Schema<TBody, TBodyIn>): RouteContractBuilder<Path, TMethod, Acc, Omit<Validators, "body" | "bodyIn"> & {
|
|
251
264
|
body: TBody;
|
|
252
265
|
bodyIn: TBodyIn;
|
|
253
266
|
}, TReturns, TAppContext>;
|
|
254
267
|
});
|
|
268
|
+
export type RouteMiddlewareBuilder<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[] = readonly [], Validators extends ValidatorParts = {}, TReturns extends ReturnsMap = {}, TAppContext extends Record<string, unknown> = AppContext> = RouteContractBuilder<Path, TMethod, Acc, Validators, TReturns, TAppContext> & {
|
|
269
|
+
use<TAcc, UReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequires extends MiddlewareRequirements = {}>(unit: [
|
|
270
|
+
IsLayoutAllowed<TRequiredLayouts, RouteLayoutChain<Path, TMethod>>,
|
|
271
|
+
IsRequirementsSatisfied<{
|
|
272
|
+
query: RouteResolvedField<Path, TMethod, Acc, "query">;
|
|
273
|
+
params: ResolveParams<PathParams<Path>, RouteResolvedField<Path, TMethod, Acc, "params">>;
|
|
274
|
+
body: RouteResolvedField<Path, TMethod, Acc, "body">;
|
|
275
|
+
state: RouteResolvedField<Path, TMethod, Acc, "state">;
|
|
276
|
+
}, TRequires>
|
|
277
|
+
] extends [true, true] ? MiddlewareUnit<TAcc, UReturns, TRequiredLayouts, TRequires> : never): RouteMiddlewareBuilder<Path, TMethod, readonly [...Acc, TAcc], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
|
|
278
|
+
use<R = unknown>(fn: (ctx: RouteChainContext<Path, TMethod, Acc, unknown, unknown, unknown, TAppContext>, next: NextFn) => Awaitable<R>): RouteMiddlewareBuilder<Path, TMethod, readonly [...Acc, MiddlewareReturnFromParts<unknown, unknown, unknown, ExtractState<R>>], Validators, TReturns, TAppContext>;
|
|
279
|
+
};
|
|
280
|
+
export type RouteBuilder<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[] = readonly [], Validators extends ValidatorParts = {}, TReturns extends ReturnsMap = {}, TAppContext extends Record<string, unknown> = AppContext> = RouteMiddlewareBuilder<Path, TMethod, Acc, Validators, TReturns, TAppContext>;
|
|
255
281
|
export type RouteDefinition<Path extends RoutePath = RoutePath, TMethod extends Method = Method, Acc extends readonly unknown[] = readonly unknown[], Validators extends ValidatorParts = ValidatorParts, TReturns extends ReturnsMap = ReturnsMap, TOutput = Response, TAppContext extends Record<string, unknown> = AppContext> = RouteHandleResult<Path, TMethod, Acc, Validators, TReturns, TOutput, TAppContext>;
|
|
256
282
|
export type InferRouteContext<R> = R extends {
|
|
257
283
|
$Infer: {
|
|
@@ -7,9 +7,9 @@ export type MiddlewareInputFieldName = "query" | "params" | "body";
|
|
|
7
7
|
export type UnwrapPart<T> = unknown extends T ? {} : T;
|
|
8
8
|
export type MergePart<T, Base> = unknown extends T ? Base : Base & T;
|
|
9
9
|
/** Collapse intersections so `Omit`/`keyof` treat the result as one object type. */
|
|
10
|
-
export type Simplify<T> = {
|
|
11
|
-
[K in keyof
|
|
12
|
-
}
|
|
10
|
+
export type Simplify<T> = [T] extends [infer U] ? {
|
|
11
|
+
[K in keyof U]: U[K];
|
|
12
|
+
} : never;
|
|
13
13
|
/**
|
|
14
14
|
* Request prop: when schema input is `unknown` (e.g. zod coerce),
|
|
15
15
|
* fall back to the validated output type.
|