@taserjs/router 0.1.3 → 0.1.5
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/README.md +0 -7
- package/dist/cjs/builder/constants.cjs +0 -6
- package/dist/cjs/builder/constants.cjs.map +1 -1
- package/dist/cjs/builder/constants.d.cts +0 -5
- package/dist/cjs/builder/factories.cjs.map +1 -1
- package/dist/cjs/builder/factories.d.cts +9 -9
- package/dist/cjs/builder/middleware-unit.cjs +64 -0
- package/dist/cjs/builder/middleware-unit.cjs.map +1 -0
- package/dist/cjs/builder/middleware-unit.d.cts +1 -0
- package/dist/cjs/builder/middleware.cjs +3 -1
- package/dist/cjs/builder/middleware.cjs.map +1 -1
- package/dist/cjs/builder/route.cjs +7 -21
- package/dist/cjs/builder/route.cjs.map +1 -1
- package/dist/cjs/builder/router.cjs +1 -20
- package/dist/cjs/builder/router.cjs.map +1 -1
- package/dist/cjs/builder/router.d.cts +6 -27
- package/dist/cjs/builder/standalone.cjs +43 -0
- package/dist/cjs/builder/standalone.cjs.map +1 -0
- package/dist/cjs/builder/standalone.d.cts +28 -0
- package/dist/cjs/define/middleware.cjs +11 -16
- package/dist/cjs/define/middleware.cjs.map +1 -1
- package/dist/cjs/define/middleware.d.cts +44 -34
- package/dist/cjs/index.cjs +15 -4
- package/dist/cjs/index.d.cts +6 -4
- package/dist/cjs/middleware/body-limit.cjs +3 -3
- package/dist/cjs/middleware/body-limit.cjs.map +1 -1
- package/dist/cjs/middleware/body-limit.d.cts +1 -1
- package/dist/cjs/middleware/compress.cjs +3 -3
- package/dist/cjs/middleware/compress.cjs.map +1 -1
- package/dist/cjs/middleware/compress.d.cts +1 -1
- package/dist/cjs/middleware/cors.cjs +3 -3
- package/dist/cjs/middleware/cors.cjs.map +1 -1
- package/dist/cjs/middleware/cors.d.cts +1 -1
- package/dist/cjs/middleware/csrf.cjs +3 -3
- package/dist/cjs/middleware/csrf.cjs.map +1 -1
- package/dist/cjs/middleware/csrf.d.cts +1 -1
- package/dist/cjs/middleware/etag.cjs +3 -3
- package/dist/cjs/middleware/etag.cjs.map +1 -1
- package/dist/cjs/middleware/etag.d.cts +1 -1
- package/dist/cjs/middleware/hono-mw.cjs +23 -0
- package/dist/cjs/middleware/hono-mw.cjs.map +1 -0
- package/dist/cjs/middleware/hono-mw.d.cts +16 -0
- package/dist/cjs/middleware/jwk.cjs +6 -2
- package/dist/cjs/middleware/jwk.cjs.map +1 -1
- package/dist/cjs/middleware/jwt.cjs +6 -2
- package/dist/cjs/middleware/jwt.cjs.map +1 -1
- package/dist/cjs/middleware/secure-headers.cjs +3 -3
- package/dist/cjs/middleware/secure-headers.cjs.map +1 -1
- package/dist/cjs/middleware/secure-headers.d.cts +1 -1
- package/dist/cjs/middleware/timing.cjs +3 -3
- package/dist/cjs/middleware/timing.cjs.map +1 -1
- package/dist/cjs/middleware/timing.d.cts +1 -1
- package/dist/cjs/types/index.d.cts +20 -52
- package/dist/cjs/types/type-utils.d.cts +2 -2
- package/dist/cjs/types/units.d.cts +18 -45
- package/dist/esm/builder/constants.d.ts +0 -5
- package/dist/esm/builder/constants.js +1 -6
- package/dist/esm/builder/constants.js.map +1 -1
- package/dist/esm/builder/factories.d.ts +9 -9
- package/dist/esm/builder/factories.js.map +1 -1
- package/dist/esm/builder/middleware-unit.d.ts +1 -0
- package/dist/esm/builder/middleware-unit.js +64 -0
- package/dist/esm/builder/middleware-unit.js.map +1 -0
- package/dist/esm/builder/middleware.js +3 -1
- package/dist/esm/builder/middleware.js.map +1 -1
- package/dist/esm/builder/route.js +7 -21
- package/dist/esm/builder/route.js.map +1 -1
- package/dist/esm/builder/router.d.ts +6 -27
- package/dist/esm/builder/router.js +1 -20
- package/dist/esm/builder/router.js.map +1 -1
- package/dist/esm/builder/standalone.d.ts +28 -0
- package/dist/esm/builder/standalone.js +32 -0
- package/dist/esm/builder/standalone.js.map +1 -0
- package/dist/esm/define/middleware.d.ts +44 -34
- package/dist/esm/define/middleware.js +11 -16
- package/dist/esm/define/middleware.js.map +1 -1
- package/dist/esm/index.d.ts +6 -4
- package/dist/esm/index.js +3 -3
- package/dist/esm/middleware/body-limit.d.ts +1 -1
- package/dist/esm/middleware/body-limit.js +3 -3
- package/dist/esm/middleware/body-limit.js.map +1 -1
- package/dist/esm/middleware/compress.d.ts +1 -1
- package/dist/esm/middleware/compress.js +3 -3
- package/dist/esm/middleware/compress.js.map +1 -1
- package/dist/esm/middleware/cors.d.ts +1 -1
- package/dist/esm/middleware/cors.js +3 -3
- package/dist/esm/middleware/cors.js.map +1 -1
- package/dist/esm/middleware/csrf.d.ts +1 -1
- package/dist/esm/middleware/csrf.js +3 -3
- package/dist/esm/middleware/csrf.js.map +1 -1
- package/dist/esm/middleware/etag.d.ts +1 -1
- package/dist/esm/middleware/etag.js +3 -3
- package/dist/esm/middleware/etag.js.map +1 -1
- package/dist/esm/middleware/hono-mw.d.ts +16 -0
- package/dist/esm/middleware/hono-mw.js +23 -0
- package/dist/esm/middleware/hono-mw.js.map +1 -0
- package/dist/esm/middleware/jwk.js +7 -3
- package/dist/esm/middleware/jwk.js.map +1 -1
- package/dist/esm/middleware/jwt.js +7 -3
- package/dist/esm/middleware/jwt.js.map +1 -1
- package/dist/esm/middleware/secure-headers.d.ts +1 -1
- package/dist/esm/middleware/secure-headers.js +3 -3
- package/dist/esm/middleware/secure-headers.js.map +1 -1
- package/dist/esm/middleware/timing.d.ts +1 -1
- package/dist/esm/middleware/timing.js +3 -3
- package/dist/esm/middleware/timing.js.map +1 -1
- package/dist/esm/types/index.d.ts +20 -52
- package/dist/esm/types/type-utils.d.ts +2 -2
- package/dist/esm/types/units.d.ts +18 -45
- package/package.json +3 -3
- package/src/builder/constants.ts +0 -6
- package/src/builder/factories.ts +2 -2
- package/src/builder/middleware-unit.ts +66 -0
- package/src/builder/middleware.ts +8 -2
- package/src/builder/route.ts +10 -34
- package/src/builder/router.ts +7 -77
- package/src/builder/standalone.ts +70 -0
- package/src/define/middleware.ts +155 -231
- package/src/index.ts +29 -3
- package/src/middleware/body-limit.ts +3 -4
- package/src/middleware/compress.ts +3 -4
- package/src/middleware/cors.ts +3 -4
- package/src/middleware/csrf.ts +3 -4
- package/src/middleware/etag.ts +3 -4
- package/src/middleware/hono-mw.ts +22 -0
- package/src/middleware/jwk.ts +10 -8
- package/src/middleware/jwt.ts +9 -7
- package/src/middleware/secure-headers.ts +3 -4
- package/src/middleware/timing.ts +3 -4
- package/src/types/index.ts +54 -196
- package/src/types/type-utils.ts +8 -4
- package/src/types/units.ts +153 -87
- package/dist/cjs/define/handler.cjs +0 -38
- package/dist/cjs/define/handler.cjs.map +0 -1
- package/dist/cjs/define/handler.d.cts +0 -13
- package/dist/cjs/middleware/wrap-hono.cjs +0 -19
- package/dist/cjs/middleware/wrap-hono.cjs.map +0 -1
- package/dist/cjs/middleware/wrap-hono.d.cts +0 -7
- package/dist/cjs/register.d.cts +0 -2
- package/dist/cjs/types/units.cjs +0 -8
- package/dist/cjs/types/units.cjs.map +0 -1
- package/dist/esm/define/handler.d.ts +0 -13
- package/dist/esm/define/handler.js +0 -38
- package/dist/esm/define/handler.js.map +0 -1
- package/dist/esm/middleware/wrap-hono.d.ts +0 -7
- package/dist/esm/middleware/wrap-hono.js +0 -18
- package/dist/esm/middleware/wrap-hono.js.map +0 -1
- package/dist/esm/register.d.ts +0 -2
- package/dist/esm/types/units.js +0 -8
- package/dist/esm/types/units.js.map +0 -1
- package/src/define/handler.ts +0 -62
- package/src/middleware/wrap-hono.ts +0 -25
- package/src/register.ts +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { middleware } from "../define/middleware.js";
|
|
2
|
+
import { honoMw } from "./hono-mw.js";
|
|
3
3
|
import { jwt as jwt$1 } from "hono/jwt";
|
|
4
4
|
//#region src/middleware/jwt.ts
|
|
5
5
|
/**
|
|
@@ -7,7 +7,11 @@ import { jwt as jwt$1 } from "hono/jwt";
|
|
|
7
7
|
* Successfully decoded payload is placed in `ctx.state.jwtPayload`.
|
|
8
8
|
*/
|
|
9
9
|
function jwt(options) {
|
|
10
|
-
|
|
10
|
+
const mw = honoMw(jwt$1(options));
|
|
11
|
+
return middleware((ctx, next) => mw(ctx, async () => {
|
|
12
|
+
const payload = ctx.var.jwtPayload;
|
|
13
|
+
return next({ jwtPayload: payload });
|
|
14
|
+
}));
|
|
11
15
|
}
|
|
12
16
|
//#endregion
|
|
13
17
|
export { jwt };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.js","names":[],"sources":["../../../src/middleware/jwt.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"jwt.js","names":[],"sources":["../../../src/middleware/jwt.ts"],"sourcesContent":["import { jwt as honoJwt } from \"hono/jwt\";\n\nimport { middleware } from \"../define/middleware.js\";\nimport type { MiddlewareReturnFromParts, MiddlewareUnit } from \"../types/units.js\";\nimport { honoMw } from \"./hono-mw.js\";\n\nexport type JwtPayloadState<TPayload> = {\n jwtPayload: TPayload;\n};\n\nexport type JwtMiddlewareUnit<TPayload> = MiddlewareUnit<\n MiddlewareReturnFromParts<unknown, unknown, unknown, JwtPayloadState<TPayload>>\n>;\n\nexport type JwtOptions = Parameters<typeof honoJwt>[0];\n\n/**\n * JWT auth middleware. Invalid or missing tokens return **401** (Hono).\n * Successfully decoded payload is placed in `ctx.state.jwtPayload`.\n */\nexport function jwt<TPayload = Record<string, unknown>>(\n options: JwtOptions,\n): JwtMiddlewareUnit<TPayload> {\n const mw = honoMw(honoJwt(options));\n return middleware<JwtPayloadState<TPayload>>((ctx, next) =>\n mw(ctx, async () => {\n const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;\n return next({ jwtPayload: payload as TPayload });\n }),\n );\n}\n"],"mappings":";;;;;;;;AAoBA,SAAgB,IACd,SAC6B;CAC7B,MAAM,KAAK,OAAO,MAAQ,OAAO,CAAC;CAClC,OAAO,YAAuC,KAAK,SACjD,GAAG,KAAK,YAAY;EAClB,MAAM,UAAW,IAAqD,IAAI;EAC1E,OAAO,KAAK,EAAE,YAAY,QAAoB,CAAC;CACjD,CAAC,CACH;AACF"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { secureHeaders as honoSecureHeaders } from 'hono/secure-headers';
|
|
2
|
-
export declare function secureHeaders(...args: Parameters<typeof honoSecureHeaders>): import('../types/units.js').
|
|
2
|
+
export declare function secureHeaders(...args: Parameters<typeof honoSecureHeaders>): import('../types/units.js').DefineMiddlewareResult<unknown, unknown, unknown, {}, Promise<Response>, unknown, unknown, unknown, {}, null, {}>;
|
|
3
3
|
export type SecureHeadersOptions = NonNullable<Parameters<typeof honoSecureHeaders>[0]>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { middleware } from "../define/middleware.js";
|
|
2
|
+
import { honoMw } from "./hono-mw.js";
|
|
2
3
|
import { secureHeaders as secureHeaders$1 } from "hono/secure-headers";
|
|
3
4
|
//#region src/middleware/secure-headers.ts
|
|
4
|
-
var wrapped = wrapHonoMiddleware(secureHeaders$1);
|
|
5
5
|
function secureHeaders(...args) {
|
|
6
|
-
return
|
|
6
|
+
return middleware(honoMw(secureHeaders$1(...args)));
|
|
7
7
|
}
|
|
8
8
|
//#endregion
|
|
9
9
|
export { secureHeaders };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secure-headers.js","names":[],"sources":["../../../src/middleware/secure-headers.ts"],"sourcesContent":["import { secureHeaders as honoSecureHeaders } from \"hono/secure-headers\";\n\nimport {
|
|
1
|
+
{"version":3,"file":"secure-headers.js","names":[],"sources":["../../../src/middleware/secure-headers.ts"],"sourcesContent":["import { secureHeaders as honoSecureHeaders } from \"hono/secure-headers\";\n\nimport { middleware } from \"../define/middleware.js\";\nimport { honoMw } from \"./hono-mw.js\";\n\nexport function secureHeaders(...args: Parameters<typeof honoSecureHeaders>) {\n return middleware(honoMw(honoSecureHeaders(...args)));\n}\n\nexport type SecureHeadersOptions = NonNullable<Parameters<typeof honoSecureHeaders>[0]>;\n"],"mappings":";;;;AAKA,SAAgB,cAAc,GAAG,MAA4C;CAC3E,OAAO,WAAW,OAAO,gBAAkB,GAAG,IAAI,CAAC,CAAC;AACtD"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { timing as honoTiming } from 'hono/timing';
|
|
2
|
-
export declare function timing(...args: Parameters<typeof honoTiming>): import('../types/units.js').
|
|
2
|
+
export declare function timing(...args: Parameters<typeof honoTiming>): import('../types/units.js').DefineMiddlewareResult<unknown, unknown, unknown, {}, Promise<Response>, unknown, unknown, unknown, {}, null, {}>;
|
|
3
3
|
export type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { middleware } from "../define/middleware.js";
|
|
2
|
+
import { honoMw } from "./hono-mw.js";
|
|
2
3
|
import { timing as timing$1 } from "hono/timing";
|
|
3
4
|
//#region src/middleware/timing.ts
|
|
4
|
-
var wrapped = wrapHonoMiddleware(timing$1);
|
|
5
5
|
function timing(...args) {
|
|
6
|
-
return
|
|
6
|
+
return middleware(honoMw(timing$1(...args)));
|
|
7
7
|
}
|
|
8
8
|
//#endregion
|
|
9
9
|
export { timing };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timing.js","names":[],"sources":["../../../src/middleware/timing.ts"],"sourcesContent":["import { timing as honoTiming } from \"hono/timing\";\n\nimport {
|
|
1
|
+
{"version":3,"file":"timing.js","names":[],"sources":["../../../src/middleware/timing.ts"],"sourcesContent":["import { timing as honoTiming } from \"hono/timing\";\n\nimport { middleware } from \"../define/middleware.js\";\nimport { honoMw } from \"./hono-mw.js\";\n\nexport function timing(...args: Parameters<typeof honoTiming>) {\n return middleware(honoMw(honoTiming(...args)));\n}\n\nexport type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]>;\n"],"mappings":";;;;AAKA,SAAgB,OAAO,GAAG,MAAqC;CAC7D,OAAO,WAAW,OAAO,SAAW,GAAG,IAAI,CAAC,CAAC;AAC/C"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { Awaitable, TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
|
|
2
|
-
import { RouterRegister } from '../
|
|
2
|
+
import { RouterRegister } 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 {
|
|
6
|
+
import { EmptyAppContext, ExtractState, Method, MiddlewareDefinition, 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
|
-
export type { RouterRegister } from '../register.js';
|
|
10
9
|
export type { MergeMiddlewareField, MergeMiddlewareInputField, MergePart, RequestShape, Simplify, UnitRuntimeContext, UnwrapPart, } from './type-utils.js';
|
|
11
10
|
export type { EmptyReturns, EnforceHandlerReply, HandlerReply, HasReturns, MergeReturns, ReplyFor, ReturnsMap, StatusCode, ValidHandlerReply, } from './returns.js';
|
|
12
|
-
export type {
|
|
11
|
+
export type { EmptyAppContext, ExtractState, HttpMethod, IsUnknown, Method, MiddlewareDefinition, MiddlewareReturnFromParts, MiddlewareUnit, MiddlewareUnitBuilder, NextFn, NextResult, StandaloneMiddlewareContext, StateBrand, ValidatorParts, } from './units.js';
|
|
12
|
+
export type AppContext = RouterRegister extends {
|
|
13
|
+
AppContext: infer C;
|
|
14
|
+
} ? C : EmptyAppContext;
|
|
13
15
|
export type RoutePath = RouterRegister extends {
|
|
14
16
|
RoutePath: infer P;
|
|
15
17
|
} ? P : never;
|
|
@@ -22,6 +24,7 @@ export type LayoutTree = RouterRegister extends {
|
|
|
22
24
|
export type RouteByPathMethod = RouterRegister extends {
|
|
23
25
|
RouteByPathMethod: infer R;
|
|
24
26
|
} ? R : Record<never, never>;
|
|
27
|
+
export type LayoutBuilder<TAppContext extends Record<string, unknown> = AppContext> = <const Layout extends LayoutId>(layout: Layout) => MiddlewareBuilder<Layout, readonly [], TAppContext>;
|
|
25
28
|
type ParseParam<Segment extends string> = Segment extends "*" ? {
|
|
26
29
|
_splat: string;
|
|
27
30
|
} : Segment extends `:${infer Name extends string}` ? Name extends "" ? {} : {
|
|
@@ -30,14 +33,17 @@ type ParseParam<Segment extends string> = Segment extends "*" ? {
|
|
|
30
33
|
type ParseParamsFromSegments<S extends string> = S extends `${infer Segment}/${infer Rest}` ? ParseParam<Segment> & ParseParamsFromSegments<Rest> : ParseParam<S>;
|
|
31
34
|
export type PathParams<Path extends string> = Path extends `/${infer Rest}` ? ParseParamsFromSegments<Rest> : {};
|
|
32
35
|
export type ResolveParams<TPathParams, TSchemaParams> = TSchemaParams extends Record<string, unknown> ? [keyof TSchemaParams] extends [never] ? TPathParams : Simplify<Omit<TPathParams, keyof TSchemaParams> & TSchemaParams> : TPathParams;
|
|
33
|
-
type
|
|
36
|
+
type LayoutParentsMap = RouterRegister extends {
|
|
37
|
+
LayoutParents: infer LP extends Record<string, unknown>;
|
|
38
|
+
} ? LP : {};
|
|
39
|
+
type LayoutParent<Layout extends LayoutId> = Layout extends keyof LayoutParentsMap ? LayoutParentsMap[Layout] extends LayoutId ? LayoutParentsMap[Layout] : null : LayoutTree[Layout] extends {
|
|
34
40
|
parent: infer Parent extends LayoutId | null;
|
|
35
41
|
} ? Parent : null;
|
|
36
|
-
type ResolveLayoutMiddlewares<Layout extends LayoutId | null> =
|
|
37
|
-
...ResolveLayoutMiddlewares<LayoutParent<Layout
|
|
42
|
+
type ResolveLayoutMiddlewares<Layout extends LayoutId | null, Depth extends readonly unknown[] = []> = Depth["length"] extends 10 ? readonly [] : Layout extends LayoutId ? readonly [
|
|
43
|
+
...ResolveLayoutMiddlewares<LayoutParent<Layout>, [...Depth, unknown]>,
|
|
38
44
|
...LayoutTree[Layout]["middlewares"]
|
|
39
45
|
] : readonly [];
|
|
40
|
-
export type ResolveLayoutIdChain<L extends LayoutId | null> =
|
|
46
|
+
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 [];
|
|
41
47
|
export type ResolveLayoutMiddlewaresState<Layout extends LayoutId | null> = Layout extends LayoutId ? MergeMiddlewareField<ResolveLayoutMiddlewares<Layout>, "state"> : {};
|
|
42
48
|
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> : {};
|
|
43
49
|
/** Fold layout middleware Acc from a route's layoutChain (shallow → deep). */
|
|
@@ -61,12 +67,11 @@ export type RouteLayoutMiddlewares<Path extends RoutePath, TMethod extends Metho
|
|
|
61
67
|
export type RouteLayoutField<Path extends RoutePath, TMethod extends Method, Field extends "query" | "params" | "body" | "state"> = MergeMiddlewareField<RouteLayoutMiddlewares<Path, TMethod>, Field>;
|
|
62
68
|
export type RouteLayoutInputField<Path extends RoutePath, TMethod extends Method, Field extends "query" | "params" | "body"> = MergeMiddlewareInputField<RouteLayoutMiddlewares<Path, TMethod>, Field>;
|
|
63
69
|
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>;
|
|
64
|
-
type RouteChainField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends "query" | "params" | "body" | "state"> = RouteResolvedField<Path, TMethod, Acc, Field>;
|
|
65
70
|
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 & {
|
|
66
|
-
query: Simplify<MergePart<TQuery,
|
|
67
|
-
params: Simplify<ResolveParams<PathParams<Path>, MergePart<TParams,
|
|
68
|
-
body: Simplify<MergePart<TBody,
|
|
69
|
-
state: Simplify<
|
|
71
|
+
query: Simplify<MergePart<TQuery, RouteResolvedField<Path, TMethod, Acc, "query">>>;
|
|
72
|
+
params: Simplify<ResolveParams<PathParams<Path>, MergePart<TParams, RouteResolvedField<Path, TMethod, Acc, "params">>>>;
|
|
73
|
+
body: Simplify<MergePart<TBody, RouteResolvedField<Path, TMethod, Acc, "body">>>;
|
|
74
|
+
state: Simplify<RouteResolvedField<Path, TMethod, Acc, "state">>;
|
|
70
75
|
headers: TaserHeaders;
|
|
71
76
|
cookies: TaserCookieJar;
|
|
72
77
|
}>;
|
|
@@ -169,17 +174,13 @@ export type MiddlewareBuilder<Layout extends LayoutId, Acc extends readonly unkn
|
|
|
169
174
|
actualState: MiddlewareChainField<Layout, Acc, "state">;
|
|
170
175
|
}
|
|
171
176
|
]): MiddlewareBuilder<Layout, readonly [...Acc, TAcc], TAppContext>;
|
|
172
|
-
use<
|
|
173
|
-
...Acc,
|
|
174
|
-
MiddlewareReturnFromParts<TQuery, TParams, TBody, ExtractState<R>, TQueryIn, TParamsIn, TBodyIn>
|
|
175
|
-
], TAppContext>;
|
|
177
|
+
use<R = unknown>(fn: (ctx: MiddlewareChainContext<Layout, Acc, unknown, unknown, unknown, TAppContext>, next: NextFn) => Awaitable<R>): MiddlewareBuilder<Layout, readonly [...Acc, MiddlewareReturnFromParts<unknown, unknown, unknown, ExtractState<R>>], TAppContext>;
|
|
176
178
|
};
|
|
177
179
|
export type RouteExport<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], TReturns extends ReturnsMap = {}, TOutput = Response> = Acc & {
|
|
178
180
|
readonly path: Path;
|
|
179
181
|
readonly method: TMethod | "ANY" | "ALL";
|
|
180
182
|
readonly methods?: readonly Method[];
|
|
181
183
|
readonly middlewares: readonly MiddlewareDefinition[];
|
|
182
|
-
readonly handlerMiddlewares: readonly MiddlewareDefinition[];
|
|
183
184
|
readonly returns?: TReturns;
|
|
184
185
|
readonly bodyMode?: "json" | "form" | "urlencoded";
|
|
185
186
|
handler: (ctx: unknown) => Awaitable<Response>;
|
|
@@ -191,9 +192,6 @@ export type RouteExport<Path extends RoutePath, TMethod extends Method, Acc exte
|
|
|
191
192
|
query?: Schema<unknown>;
|
|
192
193
|
params?: Schema<unknown>;
|
|
193
194
|
body?: Schema<unknown>;
|
|
194
|
-
handlerQuery?: Schema<unknown>;
|
|
195
|
-
handlerParams?: Schema<unknown>;
|
|
196
|
-
handlerBody?: Schema<unknown>;
|
|
197
195
|
};
|
|
198
196
|
type RouteHandleResult<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends ValidatorParts, TReturns extends ReturnsMap = {}, TOutput = Response, TAppContext extends Record<string, unknown> = AppContext> = Omit<RouteExport<Path, TMethod, Acc, TReturns, TOutput>, "$Infer"> & {
|
|
199
197
|
readonly $Infer: {
|
|
@@ -231,17 +229,13 @@ export type RouteBuilderBase<Path extends RoutePath, TMethod extends Method, Acc
|
|
|
231
229
|
actualState: RouteResolvedField<Path, TMethod, Acc, "state">;
|
|
232
230
|
}
|
|
233
231
|
]): RouteBuilder<Path, TMethod, readonly [...Acc, TAcc], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
|
|
234
|
-
use<
|
|
235
|
-
...Acc,
|
|
236
|
-
MiddlewareReturnFromParts<TQuery, TParams, TBody, ExtractState<R>, TQueryIn, TParamsIn, TBodyIn>
|
|
237
|
-
], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
|
|
232
|
+
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>;
|
|
238
233
|
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
234
|
{
|
|
240
235
|
expected: ValidHandlerReply<R, TReturns>;
|
|
241
236
|
actual: R;
|
|
242
237
|
}
|
|
243
238
|
]): RouteHandleResult<Path, TMethod, Acc, Validators, TReturns, R, TAppContext>;
|
|
244
|
-
handler<HandlerAcc extends readonly unknown[] = readonly [], HandlerValidators extends ValidatorParts = ValidatorParts, HReturns extends ReturnsMap = {}, HOutput = Response>(unit: HandlerUnit<HandlerAcc, HandlerValidators, HReturns, HOutput>): RouteHandleResult<Path, TMethod, readonly [...Acc, ...HandlerAcc], Validators, Omit<TReturns, keyof HReturns> & HReturns, HOutput, TAppContext>;
|
|
245
239
|
};
|
|
246
240
|
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> = RouteBuilderBase<Path, TMethod, Acc, Validators, TReturns, TAppContext> & (TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? {} : {
|
|
247
241
|
body<TBody, TBodyIn = unknown>(schema: Schema<TBody, TBodyIn>): RouteBuilder<Path, TMethod, Acc, Omit<Validators, "body" | "bodyIn"> & {
|
|
@@ -253,32 +247,6 @@ export type RouteBuilder<Path extends RoutePath, TMethod extends Method, Acc ext
|
|
|
253
247
|
bodyIn: TBodyIn;
|
|
254
248
|
}, TReturns, TAppContext>;
|
|
255
249
|
});
|
|
256
|
-
export type HandlerBuilder<Acc extends readonly unknown[] = readonly [], Validators extends ValidatorParts = {}, TReturns extends ReturnsMap = {}, TAppContext extends Record<string, unknown> = AppContext> = {
|
|
257
|
-
returns<const M extends ReturnsMap>(map: M): HandlerBuilder<Acc, Validators, Omit<TReturns, keyof M> & M, TAppContext>;
|
|
258
|
-
use<TAcc, UReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown>(unit: MiddlewareUnit<TAcc, UReturns, TRequiredLayouts, TRequiredState>, ..._assert: [IsStateSatisfied<MergeMiddlewareField<Acc, "state">, TRequiredState>] extends [
|
|
259
|
-
true
|
|
260
|
-
] ? [] : [
|
|
261
|
-
{
|
|
262
|
-
error: "Middleware cannot be attached to this handler";
|
|
263
|
-
requiredState: TRequiredState;
|
|
264
|
-
actualState: MergeMiddlewareField<Acc, "state">;
|
|
265
|
-
}
|
|
266
|
-
]): HandlerBuilder<readonly [...Acc, TAcc], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
|
|
267
|
-
use<TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, R = unknown>(options: InlineMiddlewareOptions<HandlerContext<Acc, {
|
|
268
|
-
query: TQuery;
|
|
269
|
-
params: TParams;
|
|
270
|
-
body: TBody;
|
|
271
|
-
}, TAppContext>, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn, R>): HandlerBuilder<readonly [
|
|
272
|
-
...Acc,
|
|
273
|
-
MiddlewareReturnFromParts<TQuery, TParams, TBody, ExtractState<R>, TQueryIn, TParamsIn, TBodyIn>
|
|
274
|
-
], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
|
|
275
|
-
handler<R extends Response = Response>(fn: (ctx: HandlerContext<Acc, Validators, TAppContext>) => Awaitable<R>, ..._assert: [R] extends [ValidHandlerReply<R, TReturns>] ? [] : [
|
|
276
|
-
{
|
|
277
|
-
expected: ValidHandlerReply<R, TReturns>;
|
|
278
|
-
actual: R;
|
|
279
|
-
}
|
|
280
|
-
]): HandlerUnit<Acc, Validators, TReturns, R>;
|
|
281
|
-
};
|
|
282
250
|
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>;
|
|
283
251
|
export type InferRouteContext<R> = R extends {
|
|
284
252
|
$Infer: {
|
|
@@ -37,8 +37,8 @@ export type MiddlewareInputField<Middleware, Field extends MiddlewareInputFieldN
|
|
|
37
37
|
[K in Field]: infer V;
|
|
38
38
|
};
|
|
39
39
|
} ? V : {};
|
|
40
|
-
export type MergeMiddlewareField<Middlewares extends readonly unknown[], Field extends MiddlewareFieldName> =
|
|
41
|
-
export type MergeMiddlewareInputField<Middlewares extends readonly unknown[], Field extends MiddlewareInputFieldName> =
|
|
40
|
+
export type MergeMiddlewareField<Middlewares extends readonly unknown[], Field extends MiddlewareFieldName> = Middlewares extends readonly [] ? {} : Middlewares extends readonly [infer Head, ...infer Tail] ? MiddlewareField<Head, Field> & MergeMiddlewareField<Tail, Field> : MiddlewareField<Middlewares[number], Field>;
|
|
41
|
+
export type MergeMiddlewareInputField<Middlewares extends readonly unknown[], Field extends MiddlewareInputFieldName> = Middlewares extends readonly [] ? {} : Middlewares extends readonly [infer Head, ...infer Tail] ? MiddlewareInputField<Head, Field> & MergeMiddlewareInputField<Tail, Field> : MiddlewareInputField<Middlewares[number], Field>;
|
|
42
42
|
export type RuntimeContextFields = {
|
|
43
43
|
request: Request;
|
|
44
44
|
method: Method;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { MiddlewareDefinition as CoreMiddlewareDefinition, TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
|
|
2
|
+
import { RequestShape, Simplify, UnitRuntimeContext, UnwrapPart } from './type-utils.js';
|
|
3
3
|
import { ReturnsMap } from './returns.js';
|
|
4
4
|
import { Schema } from './schema.js';
|
|
5
5
|
export type { HttpMethod, Method } from './type-utils.js';
|
|
6
6
|
export type { EmptyReturns, MergeReturns, ReturnsMap, HandlerReply, HasReturns, StatusCode, ValidHandlerReply, EnforceHandlerReply, } from './returns.js';
|
|
7
7
|
/** Default empty app context for standalone units without a bound router instance. */
|
|
8
|
-
export type
|
|
8
|
+
export type EmptyAppContext = Record<never, never>;
|
|
9
9
|
export type ValidatorParts = {
|
|
10
10
|
query?: unknown;
|
|
11
11
|
params?: unknown;
|
|
@@ -18,16 +18,12 @@ export declare const StateBrand: unique symbol;
|
|
|
18
18
|
export type NextResult<TState = unknown> = Response & {
|
|
19
19
|
readonly [StateBrand]?: TState;
|
|
20
20
|
};
|
|
21
|
-
export type
|
|
22
|
-
[StateBrand]?:
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
}> extends {
|
|
26
|
-
[StateBrand]?: infer S;
|
|
27
|
-
} ? [S] extends [never] ? {} : S : {};
|
|
21
|
+
export type ExtractStateFromUnion<T> = T extends {
|
|
22
|
+
readonly [StateBrand]?: infer S;
|
|
23
|
+
} ? [S] extends [never] ? never : [unknown] extends [S] ? {} : S : never;
|
|
24
|
+
export type ExtractState<T> = [ExtractStateFromUnion<Awaited<T>>] extends [never] ? {} : ExtractStateFromUnion<Awaited<T>>;
|
|
28
25
|
export type IsUnknown<T> = [unknown] extends [T] ? true : false;
|
|
29
26
|
export type NextFn<TExpectedState = unknown> = IsUnknown<TExpectedState> extends true ? <S extends Record<string, unknown> = {}>(state?: S) => Promise<NextResult<S>> : (state: TExpectedState) => Promise<NextResult<TExpectedState>>;
|
|
30
|
-
export type MiddlewareNext = NextFn;
|
|
31
27
|
export type MiddlewareDefinition = CoreMiddlewareDefinition<ReturnsMap>;
|
|
32
28
|
export type MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TQueryIn = TQuery, TParamsIn = TParams, TBodyIn = TBody> = {
|
|
33
29
|
query: Simplify<UnwrapPart<TQuery>>;
|
|
@@ -42,7 +38,7 @@ export type MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TQueryIn =
|
|
|
42
38
|
};
|
|
43
39
|
};
|
|
44
40
|
export type DefineMiddlewareResult<TQuery, TParams, TBody, TState, R, TQueryIn = TQuery, TParamsIn = TParams, TBodyIn = TBody, TReturns extends ReturnsMap = {}, TLayout = null, TRequires = {}> = MiddlewareUnit<MiddlewareReturnFromParts<TQuery, TParams, TBody, IsUnknown<TState> extends true ? ExtractState<R> : TState, TQueryIn, TParamsIn, TBodyIn>, TReturns, TLayout, TRequires>;
|
|
45
|
-
export type StandaloneMiddlewareContext<TQuery = unknown, TParams = unknown, TBody = unknown, TAppContext extends Record<string, unknown> =
|
|
41
|
+
export type StandaloneMiddlewareContext<TQuery = unknown, TParams = unknown, TBody = unknown, TAppContext extends Record<string, unknown> = EmptyAppContext, TState = {}> = Simplify<TAppContext & UnitRuntimeContext & {
|
|
46
42
|
query: Simplify<UnwrapPart<TQuery>>;
|
|
47
43
|
params: Simplify<UnwrapPart<TParams>>;
|
|
48
44
|
body: Simplify<UnwrapPart<TBody>>;
|
|
@@ -50,43 +46,20 @@ export type StandaloneMiddlewareContext<TQuery = unknown, TParams = unknown, TBo
|
|
|
50
46
|
headers: TaserHeaders;
|
|
51
47
|
cookies: TaserCookieJar;
|
|
52
48
|
}>;
|
|
53
|
-
export
|
|
54
|
-
query: Simplify<MergePart<Validators extends {
|
|
55
|
-
query?: infer Q;
|
|
56
|
-
} ? Q : unknown, MergeMiddlewareField<Acc, "query">>>;
|
|
57
|
-
params: Simplify<MergePart<Validators extends {
|
|
58
|
-
params?: infer P;
|
|
59
|
-
} ? P : unknown, MergeMiddlewareField<Acc, "params">>>;
|
|
60
|
-
body: Simplify<MergePart<Validators extends {
|
|
61
|
-
body?: infer B;
|
|
62
|
-
} ? B : unknown, MergeMiddlewareField<Acc, "body">>>;
|
|
63
|
-
state: Simplify<MergeMiddlewareField<Acc, "state">>;
|
|
64
|
-
headers: TaserHeaders;
|
|
65
|
-
cookies: TaserCookieJar;
|
|
66
|
-
}>;
|
|
49
|
+
export declare const MiddlewareUnitBrand: unique symbol;
|
|
67
50
|
export type MiddlewareUnit<TAcc = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown> = MiddlewareDefinition & {
|
|
51
|
+
readonly [MiddlewareUnitBrand]: true;
|
|
68
52
|
readonly __middlewareAcc: TAcc;
|
|
69
53
|
readonly __returns?: TReturns;
|
|
70
54
|
readonly __requiredLayouts?: TRequiredLayouts;
|
|
71
55
|
readonly __requiredState?: TRequiredState;
|
|
72
56
|
};
|
|
73
|
-
export type
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
query?: Schema<unknown>;
|
|
82
|
-
params?: Schema<unknown>;
|
|
83
|
-
body?: Schema<unknown>;
|
|
84
|
-
};
|
|
85
|
-
export type InlineMiddlewareOptions<Ctx = unknown, TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, R = unknown> = {
|
|
86
|
-
query?: Schema<TQuery, TQueryIn>;
|
|
87
|
-
params?: Schema<TParams, TParamsIn>;
|
|
88
|
-
body?: Schema<TBody, TBodyIn>;
|
|
89
|
-
returns?: TReturns;
|
|
90
|
-
handler: (ctx: Ctx, next: NextFn) => Awaitable<R>;
|
|
57
|
+
export type MiddlewareUnitBuilder<TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = {}, TAppContext extends Record<string, unknown> = EmptyAppContext, TInheritedState = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, TExpectedState = unknown> = MiddlewareUnit<MiddlewareReturnFromParts<TQuery, TParams, TBody, IsUnknown<TExpectedState> extends true ? {} : TExpectedState, TQueryIn, TParamsIn, TBodyIn>, TReturns, TRequiredLayouts, TRequiredState> & {
|
|
58
|
+
query<Q, QIn = unknown>(schema: Schema<Q, QIn>): MiddlewareUnitBuilder<Q, TParams, TBody, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, QIn, TParamsIn, TBodyIn, TExpectedState>;
|
|
59
|
+
params<P, PIn = unknown>(schema: Schema<P, PIn>): MiddlewareUnitBuilder<TQuery, P, TBody, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, PIn, TBodyIn, TExpectedState>;
|
|
60
|
+
body<B, BIn = unknown>(schema: Schema<B, BIn>): MiddlewareUnitBuilder<TQuery, TParams, B, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, TParamsIn, BIn, TExpectedState>;
|
|
61
|
+
body<Mode extends "json" | "form" | "urlencoded", B, BIn = unknown>(mode: Mode, schema: Schema<B, BIn>): MiddlewareUnitBuilder<TQuery, TParams, B, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, TParamsIn, BIn, TExpectedState>;
|
|
62
|
+
returns<const M extends ReturnsMap>(map: M): MiddlewareUnitBuilder<TQuery, TParams, TBody, Omit<TReturns, keyof M> & M, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn, TExpectedState>;
|
|
63
|
+
requires<Requires extends Record<string, unknown>>(): MiddlewareUnitBuilder<TQuery, TParams, TBody, TReturns, TRequiredLayouts, TRequiredState & Requires, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn, TExpectedState>;
|
|
64
|
+
handler<R>(fn: (ctx: StandaloneMiddlewareContext<TQuery, TParams, TBody, TAppContext, TInheritedState & TRequiredState>, next: NextFn<TExpectedState>) => R): DefineMiddlewareResult<TQuery, TParams, TBody, IsUnknown<TExpectedState> extends true ? ExtractState<R> : TExpectedState, R, TQueryIn, TParamsIn, TBodyIn, TReturns, TRequiredLayouts, TRequiredState>;
|
|
91
65
|
};
|
|
92
|
-
export declare function isHandlerUnit(value: unknown): value is HandlerUnit<readonly unknown[], ValidatorParts>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taserjs/router",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Type-safe Node.js router with runtime validation and middleware",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"repository": {
|
|
@@ -147,8 +147,8 @@
|
|
|
147
147
|
"dependencies": {
|
|
148
148
|
"@standard-schema/spec": "^1.1.0",
|
|
149
149
|
"hono": "^4.10.3",
|
|
150
|
-
"@taserjs/router-
|
|
151
|
-
"@taserjs/router-
|
|
150
|
+
"@taserjs/router-utils": "0.1.5",
|
|
151
|
+
"@taserjs/router-core": "0.1.5"
|
|
152
152
|
},
|
|
153
153
|
"devDependencies": {
|
|
154
154
|
"@tanstack/vite-config": "^0.6.0",
|
package/src/builder/constants.ts
CHANGED
|
@@ -2,9 +2,3 @@
|
|
|
2
2
|
export const SCHEMA_KEYS = ["query", "params", "body"] as const;
|
|
3
3
|
|
|
4
4
|
export type SchemaKey = (typeof SCHEMA_KEYS)[number];
|
|
5
|
-
|
|
6
|
-
export const HANDLER_SCHEMA_KEY_MAP = {
|
|
7
|
-
query: "handlerQuery",
|
|
8
|
-
params: "handlerParams",
|
|
9
|
-
body: "handlerBody",
|
|
10
|
-
} as const satisfies Record<SchemaKey, string>;
|
package/src/builder/factories.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRouteBuilder } from "./route.js";
|
|
2
|
-
import type { RouteBuilder, RoutePath } from "../types/index.js";
|
|
3
|
-
import type {
|
|
2
|
+
import type { AppContext, RouteBuilder, RoutePath } from "../types/index.js";
|
|
3
|
+
import type { HttpMethod } from "../types/units.js";
|
|
4
4
|
|
|
5
5
|
export type CreateWithoutBodyRoute<
|
|
6
6
|
M extends "GET" | "DELETE" | "OPTIONS" | "HEAD",
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { BodyMode } from "@taserjs/router-core";
|
|
2
|
+
|
|
3
|
+
import type { ReturnsMap } from "../types/returns.js";
|
|
4
|
+
import type { Schema } from "../types/schema.js";
|
|
5
|
+
import { pickDefinedSchemas, type SchemaValidators } from "../define/validators.js";
|
|
6
|
+
|
|
7
|
+
export function createMiddlewareUnitBuilder(requiredLayouts?: string | readonly string[]) {
|
|
8
|
+
const validators: SchemaValidators = {};
|
|
9
|
+
let bodyMode: BodyMode | undefined;
|
|
10
|
+
let returnsMap: ReturnsMap | undefined;
|
|
11
|
+
|
|
12
|
+
function toUnit(fn?: (ctx: any, next: any) => any) {
|
|
13
|
+
const schemas = pickDefinedSchemas(validators);
|
|
14
|
+
return {
|
|
15
|
+
...(fn ? { handler: fn } : {}),
|
|
16
|
+
...schemas,
|
|
17
|
+
...(bodyMode ? { bodyMode } : {}),
|
|
18
|
+
...(returnsMap ? { returns: returnsMap, __returns: returnsMap } : {}),
|
|
19
|
+
...(requiredLayouts !== undefined ? { __requiredLayouts: requiredLayouts } : {}),
|
|
20
|
+
__middlewareAcc: undefined as unknown,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const builder: any = {
|
|
25
|
+
query(schema: Schema<unknown>) {
|
|
26
|
+
validators.query = schema;
|
|
27
|
+
return builder;
|
|
28
|
+
},
|
|
29
|
+
params(schema: Schema<unknown>) {
|
|
30
|
+
validators.params = schema;
|
|
31
|
+
return builder;
|
|
32
|
+
},
|
|
33
|
+
body(modeOrSchema: BodyMode | Schema<unknown>, schema?: Schema<unknown>) {
|
|
34
|
+
if (typeof modeOrSchema === "string") {
|
|
35
|
+
bodyMode = modeOrSchema as BodyMode;
|
|
36
|
+
if (schema !== undefined) {
|
|
37
|
+
validators.body = schema;
|
|
38
|
+
}
|
|
39
|
+
} else {
|
|
40
|
+
bodyMode = "json";
|
|
41
|
+
validators.body = modeOrSchema;
|
|
42
|
+
}
|
|
43
|
+
return builder;
|
|
44
|
+
},
|
|
45
|
+
returns(map: ReturnsMap) {
|
|
46
|
+
returnsMap = { ...returnsMap, ...map };
|
|
47
|
+
return builder;
|
|
48
|
+
},
|
|
49
|
+
requires() {
|
|
50
|
+
return builder;
|
|
51
|
+
},
|
|
52
|
+
handler(fn: (ctx: any, next: any) => any) {
|
|
53
|
+
return toUnit(fn);
|
|
54
|
+
},
|
|
55
|
+
toUnit() {
|
|
56
|
+
return toUnit();
|
|
57
|
+
},
|
|
58
|
+
__middlewareAcc: undefined as unknown,
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
if (requiredLayouts !== undefined) {
|
|
62
|
+
builder.__requiredLayouts = requiredLayouts;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return builder;
|
|
66
|
+
}
|
|
@@ -9,8 +9,14 @@ export function createMiddleware<const Layout extends LayoutId>(
|
|
|
9
9
|
const chain = {
|
|
10
10
|
layout,
|
|
11
11
|
middlewares: entries,
|
|
12
|
-
use(definition: MiddlewareDefinition) {
|
|
13
|
-
|
|
12
|
+
use(definition: MiddlewareDefinition | ((ctx: any, next: any) => any)) {
|
|
13
|
+
if (typeof definition === "function") {
|
|
14
|
+
entries.push({ handler: definition as any });
|
|
15
|
+
} else if (typeof (definition as any)?.toUnit === "function") {
|
|
16
|
+
entries.push((definition as any).toUnit());
|
|
17
|
+
} else {
|
|
18
|
+
entries.push(definition);
|
|
19
|
+
}
|
|
14
20
|
return chain;
|
|
15
21
|
},
|
|
16
22
|
};
|
package/src/builder/route.ts
CHANGED
|
@@ -16,8 +16,6 @@ import type {
|
|
|
16
16
|
Schema,
|
|
17
17
|
} from "../types/index.js";
|
|
18
18
|
import type { HttpMethod, MiddlewareDefinition } from "../types/units.js";
|
|
19
|
-
import { isHandlerUnit } from "../types/units.js";
|
|
20
|
-
import { HANDLER_SCHEMA_KEY_MAP } from "./constants.js";
|
|
21
19
|
import { pickDefinedSchemas, type SchemaValidators } from "../define/validators.js";
|
|
22
20
|
|
|
23
21
|
function toUtilsMap(map: ReturnsMap | undefined): Record<number, StandardSchemaV1> {
|
|
@@ -36,24 +34,16 @@ function toUtilsMap(map: ReturnsMap | undefined): Record<number, StandardSchemaV
|
|
|
36
34
|
function buildEffectiveReturns(args: {
|
|
37
35
|
middlewareReturns: ReturnsMap;
|
|
38
36
|
routeReturns: ReturnsMap;
|
|
39
|
-
handlerMiddlewareReturns: ReturnsMap;
|
|
40
|
-
handlerReturns: ReturnsMap | undefined;
|
|
41
37
|
schemas: {
|
|
42
38
|
query?: unknown;
|
|
43
39
|
params?: unknown;
|
|
44
40
|
body?: unknown;
|
|
45
|
-
handlerQuery?: unknown;
|
|
46
|
-
handlerParams?: unknown;
|
|
47
|
-
handlerBody?: unknown;
|
|
48
41
|
middlewares?: readonly MiddlewareDefinition[];
|
|
49
|
-
handlerMiddlewares?: readonly MiddlewareDefinition[];
|
|
50
42
|
};
|
|
51
43
|
}): Record<number, StandardSchemaV1> | undefined {
|
|
52
44
|
const merged = mergeReturnsMaps(
|
|
53
45
|
toUtilsMap(args.middlewareReturns),
|
|
54
46
|
toUtilsMap(args.routeReturns),
|
|
55
|
-
toUtilsMap(args.handlerMiddlewareReturns),
|
|
56
|
-
toUtilsMap(args.handlerReturns),
|
|
57
47
|
);
|
|
58
48
|
const with422 = withAuto422(merged, hasInputSchemas(args.schemas));
|
|
59
49
|
return Object.keys(with422).length > 0 ? with422 : undefined;
|
|
@@ -111,47 +101,33 @@ export function createRouteBuilder(
|
|
|
111
101
|
routeReturns = { ...routeReturns, ...toUtilsMap(map) };
|
|
112
102
|
return builder;
|
|
113
103
|
},
|
|
114
|
-
use(definition: MiddlewareDefinition) {
|
|
115
|
-
|
|
104
|
+
use(definition: MiddlewareDefinition | ((ctx: any, next: any) => any)) {
|
|
105
|
+
if (typeof definition === "function") {
|
|
106
|
+
middlewares.push({ handler: definition as any });
|
|
107
|
+
} else if (typeof (definition as any)?.toUnit === "function") {
|
|
108
|
+
middlewares.push((definition as any).toUnit());
|
|
109
|
+
} else {
|
|
110
|
+
middlewares.push(definition);
|
|
111
|
+
}
|
|
116
112
|
return builder;
|
|
117
113
|
},
|
|
118
|
-
handler(
|
|
114
|
+
handler(fn: (ctx: unknown) => Response | Promise<Response>) {
|
|
119
115
|
const routeSchemas = pickDefinedSchemas(validators);
|
|
120
116
|
const base = buildRouteBase(path, method, methods, middlewares);
|
|
121
117
|
|
|
122
|
-
const unit = isHandlerUnit(fnOrUnit)
|
|
123
|
-
? fnOrUnit
|
|
124
|
-
: {
|
|
125
|
-
handler: fnOrUnit as (ctx: unknown) => Response | Promise<Response>,
|
|
126
|
-
middlewares: [] as MiddlewareDefinition[],
|
|
127
|
-
returns: undefined as ReturnsMap | undefined,
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
const handlerSchemas = isHandlerUnit(fnOrUnit)
|
|
131
|
-
? pickDefinedSchemas(fnOrUnit, HANDLER_SCHEMA_KEY_MAP)
|
|
132
|
-
: {};
|
|
133
|
-
|
|
134
118
|
const returns = buildEffectiveReturns({
|
|
135
119
|
middlewareReturns: collectReturnsFromDefinitions(middlewares),
|
|
136
120
|
routeReturns,
|
|
137
|
-
handlerMiddlewareReturns: collectReturnsFromDefinitions(unit.middlewares),
|
|
138
|
-
handlerReturns: unit.returns,
|
|
139
121
|
schemas: {
|
|
140
122
|
...validators,
|
|
141
|
-
handlerQuery: (unit as any).query,
|
|
142
|
-
handlerParams: (unit as any).params,
|
|
143
|
-
handlerBody: (unit as any).body,
|
|
144
123
|
middlewares,
|
|
145
|
-
handlerMiddlewares: unit.middlewares,
|
|
146
124
|
},
|
|
147
125
|
});
|
|
148
126
|
|
|
149
127
|
return {
|
|
150
128
|
...base,
|
|
151
|
-
|
|
152
|
-
handler: unit.handler,
|
|
129
|
+
handler: fn,
|
|
153
130
|
...routeSchemas,
|
|
154
|
-
...handlerSchemas,
|
|
155
131
|
...(bodyMode ? { bodyMode } : {}),
|
|
156
132
|
...(returns ? { returns } : {}),
|
|
157
133
|
};
|