@taserjs/router 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/middleware-unit.cjs +55 -0
- package/dist/cjs/builder/middleware-unit.cjs.map +1 -0
- package/dist/cjs/builder/middleware-unit.d.cts +18 -0
- package/dist/cjs/builder/middleware.cjs +2 -1
- package/dist/cjs/builder/middleware.cjs.map +1 -1
- package/dist/cjs/builder/route.cjs +6 -21
- package/dist/cjs/builder/route.cjs.map +1 -1
- package/dist/cjs/builder/router.cjs +0 -4
- package/dist/cjs/builder/router.cjs.map +1 -1
- package/dist/cjs/builder/router.d.cts +1 -11
- package/dist/cjs/define/middleware.cjs +10 -14
- package/dist/cjs/define/middleware.cjs.map +1 -1
- package/dist/cjs/define/middleware.d.cts +42 -31
- package/dist/cjs/index.cjs +2 -2
- package/dist/cjs/index.d.cts +2 -2
- 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 +4 -41
- package/dist/cjs/types/units.d.cts +9 -34
- 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/middleware-unit.d.ts +18 -0
- package/dist/esm/builder/middleware-unit.js +55 -0
- package/dist/esm/builder/middleware-unit.js.map +1 -0
- package/dist/esm/builder/middleware.js +2 -1
- package/dist/esm/builder/middleware.js.map +1 -1
- package/dist/esm/builder/route.js +6 -21
- package/dist/esm/builder/route.js.map +1 -1
- package/dist/esm/builder/router.d.ts +1 -11
- package/dist/esm/builder/router.js +0 -4
- package/dist/esm/builder/router.js.map +1 -1
- package/dist/esm/define/middleware.d.ts +42 -31
- package/dist/esm/define/middleware.js +10 -14
- package/dist/esm/define/middleware.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +2 -2
- 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 +6 -2
- package/dist/esm/middleware/jwk.js.map +1 -1
- package/dist/esm/middleware/jwt.js +6 -2
- 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 +4 -41
- package/dist/esm/types/units.d.ts +9 -34
- package/package.json +3 -3
- package/src/builder/constants.ts +0 -6
- package/src/builder/middleware-unit.ts +55 -0
- package/src/builder/middleware.ts +6 -2
- package/src/builder/route.ts +8 -34
- package/src/builder/router.ts +1 -18
- package/src/define/middleware.ts +133 -228
- package/src/index.ts +3 -1
- 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 +9 -7
- package/src/middleware/jwt.ts +8 -6
- package/src/middleware/secure-headers.ts +3 -4
- package/src/middleware/timing.ts +3 -4
- package/src/types/index.ts +15 -172
- package/src/types/units.ts +119 -77
- 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/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/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
|
@@ -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 { defineMiddleware } from \"../define/middleware.js\";\nimport { honoMw } from \"./hono-mw.js\";\n\nexport function secureHeaders(...args: Parameters<typeof honoSecureHeaders>) {\n return defineMiddleware(honoMw(honoSecureHeaders(...args)));\n}\n\nexport type SecureHeadersOptions = NonNullable<Parameters<typeof honoSecureHeaders>[0]>;\n"],"mappings":";;;;AAKA,SAAgB,cAAc,GAAG,MAA4C;CAC3E,OAAO,iBAAiB,OAAO,gBAAkB,GAAG,IAAI,CAAC,CAAC;AAC5D"}
|
|
@@ -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, {}, Response, unknown, unknown, unknown, {}, null, {}>;
|
|
3
3
|
export type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { defineMiddleware } 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 defineMiddleware(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 { defineMiddleware } from \"../define/middleware.js\";\nimport { honoMw } from \"./hono-mw.js\";\n\nexport function timing(...args: Parameters<typeof honoTiming>) {\n return defineMiddleware(honoMw(honoTiming(...args)));\n}\n\nexport type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]>;\n"],"mappings":";;;;AAKA,SAAgB,OAAO,GAAG,MAAqC;CAC7D,OAAO,iBAAiB,OAAO,SAAW,GAAG,IAAI,CAAC,CAAC;AACrD"}
|
|
@@ -3,13 +3,13 @@ import { RouterRegister } from '../register.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 { AppContext, ExtractState,
|
|
6
|
+
import { AppContext, 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
9
|
export type { RouterRegister } from '../register.js';
|
|
10
10
|
export type { MergeMiddlewareField, MergeMiddlewareInputField, MergePart, RequestShape, Simplify, UnitRuntimeContext, UnwrapPart, } from './type-utils.js';
|
|
11
11
|
export type { EmptyReturns, EnforceHandlerReply, HandlerReply, HasReturns, MergeReturns, ReplyFor, ReturnsMap, StatusCode, ValidHandlerReply, } from './returns.js';
|
|
12
|
-
export type { AppContext, ExtractState,
|
|
12
|
+
export type { AppContext, ExtractState, HttpMethod, IsUnknown, Method, MiddlewareDefinition, MiddlewareNext, MiddlewareReturnFromParts, MiddlewareUnit, MiddlewareUnitBuilder, NextFn, NextResult, StandaloneMiddlewareContext, StateBrand, ValidatorParts, } from './units.js';
|
|
13
13
|
export type RoutePath = RouterRegister extends {
|
|
14
14
|
RoutePath: infer P;
|
|
15
15
|
} ? P : never;
|
|
@@ -169,17 +169,13 @@ export type MiddlewareBuilder<Layout extends LayoutId, Acc extends readonly unkn
|
|
|
169
169
|
actualState: MiddlewareChainField<Layout, Acc, "state">;
|
|
170
170
|
}
|
|
171
171
|
]): MiddlewareBuilder<Layout, readonly [...Acc, TAcc], TAppContext>;
|
|
172
|
-
use<
|
|
173
|
-
...Acc,
|
|
174
|
-
MiddlewareReturnFromParts<TQuery, TParams, TBody, ExtractState<R>, TQueryIn, TParamsIn, TBodyIn>
|
|
175
|
-
], TAppContext>;
|
|
172
|
+
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
173
|
};
|
|
177
174
|
export type RouteExport<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], TReturns extends ReturnsMap = {}, TOutput = Response> = Acc & {
|
|
178
175
|
readonly path: Path;
|
|
179
176
|
readonly method: TMethod | "ANY" | "ALL";
|
|
180
177
|
readonly methods?: readonly Method[];
|
|
181
178
|
readonly middlewares: readonly MiddlewareDefinition[];
|
|
182
|
-
readonly handlerMiddlewares: readonly MiddlewareDefinition[];
|
|
183
179
|
readonly returns?: TReturns;
|
|
184
180
|
readonly bodyMode?: "json" | "form" | "urlencoded";
|
|
185
181
|
handler: (ctx: unknown) => Awaitable<Response>;
|
|
@@ -191,9 +187,6 @@ export type RouteExport<Path extends RoutePath, TMethod extends Method, Acc exte
|
|
|
191
187
|
query?: Schema<unknown>;
|
|
192
188
|
params?: Schema<unknown>;
|
|
193
189
|
body?: Schema<unknown>;
|
|
194
|
-
handlerQuery?: Schema<unknown>;
|
|
195
|
-
handlerParams?: Schema<unknown>;
|
|
196
|
-
handlerBody?: Schema<unknown>;
|
|
197
190
|
};
|
|
198
191
|
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
192
|
readonly $Infer: {
|
|
@@ -231,17 +224,13 @@ export type RouteBuilderBase<Path extends RoutePath, TMethod extends Method, Acc
|
|
|
231
224
|
actualState: RouteResolvedField<Path, TMethod, Acc, "state">;
|
|
232
225
|
}
|
|
233
226
|
]): 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>;
|
|
227
|
+
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
228
|
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
229
|
{
|
|
240
230
|
expected: ValidHandlerReply<R, TReturns>;
|
|
241
231
|
actual: R;
|
|
242
232
|
}
|
|
243
233
|
]): 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
234
|
};
|
|
246
235
|
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
236
|
body<TBody, TBodyIn = unknown>(schema: Schema<TBody, TBodyIn>): RouteBuilder<Path, TMethod, Acc, Omit<Validators, "body" | "bodyIn"> & {
|
|
@@ -253,32 +242,6 @@ export type RouteBuilder<Path extends RoutePath, TMethod extends Method, Acc ext
|
|
|
253
242
|
bodyIn: TBodyIn;
|
|
254
243
|
}, TReturns, TAppContext>;
|
|
255
244
|
});
|
|
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
245
|
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
246
|
export type InferRouteContext<R> = R extends {
|
|
284
247
|
$Infer: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Awaitable, MiddlewareDefinition as CoreMiddlewareDefinition, TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
|
|
2
|
-
import {
|
|
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';
|
|
@@ -50,43 +50,18 @@ export type StandaloneMiddlewareContext<TQuery = unknown, TParams = unknown, TBo
|
|
|
50
50
|
headers: TaserHeaders;
|
|
51
51
|
cookies: TaserCookieJar;
|
|
52
52
|
}>;
|
|
53
|
-
export type HandlerContext<Acc extends readonly unknown[], Validators extends ValidatorParts, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & {
|
|
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
|
-
}>;
|
|
67
53
|
export type MiddlewareUnit<TAcc = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown> = MiddlewareDefinition & {
|
|
68
54
|
readonly __middlewareAcc: TAcc;
|
|
69
55
|
readonly __returns?: TReturns;
|
|
70
56
|
readonly __requiredLayouts?: TRequiredLayouts;
|
|
71
57
|
readonly __requiredState?: TRequiredState;
|
|
72
58
|
};
|
|
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>;
|
|
59
|
+
export type MiddlewareUnitBuilder<TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = {}, TAppContext extends Record<string, unknown> = AppContext, TInheritedState = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown> = {
|
|
60
|
+
query<Q, QIn = unknown>(schema: Schema<Q, QIn>): MiddlewareUnitBuilder<Q, TParams, TBody, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, QIn, TParamsIn, TBodyIn>;
|
|
61
|
+
params<P, PIn = unknown>(schema: Schema<P, PIn>): MiddlewareUnitBuilder<TQuery, P, TBody, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, PIn, TBodyIn>;
|
|
62
|
+
body<B, BIn = unknown>(schema: Schema<B, BIn>): MiddlewareUnitBuilder<TQuery, TParams, B, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, TParamsIn, BIn>;
|
|
63
|
+
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>;
|
|
64
|
+
returns<const M extends ReturnsMap>(map: M): MiddlewareUnitBuilder<TQuery, TParams, TBody, Omit<TReturns, keyof M> & M, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn>;
|
|
65
|
+
requires<Requires extends Record<string, unknown>>(): MiddlewareUnitBuilder<TQuery, TParams, TBody, TReturns, TRequiredLayouts, TRequiredState & Requires, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn>;
|
|
66
|
+
handler<TState = unknown, R = unknown>(fn: (ctx: StandaloneMiddlewareContext<TQuery, TParams, TBody, TAppContext, TInheritedState & TRequiredState>, next: NextFn<NoInfer<TState>>) => Awaitable<R>): DefineMiddlewareResult<TQuery, TParams, TBody, TState, R, TQueryIn, TParamsIn, TBodyIn, TReturns, TRequiredLayouts, TRequiredState>;
|
|
91
67
|
};
|
|
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.4",
|
|
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.4",
|
|
151
|
+
"@taserjs/router-core": "0.1.4"
|
|
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>;
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
const builder = {
|
|
13
|
+
query(schema: Schema<unknown>) {
|
|
14
|
+
validators.query = schema;
|
|
15
|
+
return builder;
|
|
16
|
+
},
|
|
17
|
+
params(schema: Schema<unknown>) {
|
|
18
|
+
validators.params = schema;
|
|
19
|
+
return builder;
|
|
20
|
+
},
|
|
21
|
+
body(modeOrSchema: BodyMode | Schema<unknown>, schema?: Schema<unknown>) {
|
|
22
|
+
if (typeof modeOrSchema === "string") {
|
|
23
|
+
bodyMode = modeOrSchema as BodyMode;
|
|
24
|
+
if (schema !== undefined) {
|
|
25
|
+
validators.body = schema;
|
|
26
|
+
}
|
|
27
|
+
} else {
|
|
28
|
+
bodyMode = "json";
|
|
29
|
+
validators.body = modeOrSchema;
|
|
30
|
+
}
|
|
31
|
+
return builder;
|
|
32
|
+
},
|
|
33
|
+
returns(map: ReturnsMap) {
|
|
34
|
+
returnsMap = { ...returnsMap, ...map };
|
|
35
|
+
return builder;
|
|
36
|
+
},
|
|
37
|
+
requires() {
|
|
38
|
+
return builder;
|
|
39
|
+
},
|
|
40
|
+
handler(fn: (ctx: any, next: any) => any) {
|
|
41
|
+
const schemas = pickDefinedSchemas(validators);
|
|
42
|
+
const unit = {
|
|
43
|
+
handler: fn,
|
|
44
|
+
...schemas,
|
|
45
|
+
...(bodyMode ? { bodyMode } : {}),
|
|
46
|
+
...(returnsMap ? { returns: returnsMap, __returns: returnsMap } : {}),
|
|
47
|
+
...(requiredLayouts !== undefined ? { __requiredLayouts: requiredLayouts } : {}),
|
|
48
|
+
__middlewareAcc: undefined as unknown,
|
|
49
|
+
};
|
|
50
|
+
return unit;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
return builder;
|
|
55
|
+
}
|
|
@@ -9,8 +9,12 @@ 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 {
|
|
16
|
+
entries.push(definition);
|
|
17
|
+
}
|
|
14
18
|
return chain;
|
|
15
19
|
},
|
|
16
20
|
};
|
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,31 @@ 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 {
|
|
108
|
+
middlewares.push(definition);
|
|
109
|
+
}
|
|
116
110
|
return builder;
|
|
117
111
|
},
|
|
118
|
-
handler(
|
|
112
|
+
handler(fn: (ctx: unknown) => Response | Promise<Response>) {
|
|
119
113
|
const routeSchemas = pickDefinedSchemas(validators);
|
|
120
114
|
const base = buildRouteBase(path, method, methods, middlewares);
|
|
121
115
|
|
|
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
116
|
const returns = buildEffectiveReturns({
|
|
135
117
|
middlewareReturns: collectReturnsFromDefinitions(middlewares),
|
|
136
118
|
routeReturns,
|
|
137
|
-
handlerMiddlewareReturns: collectReturnsFromDefinitions(unit.middlewares),
|
|
138
|
-
handlerReturns: unit.returns,
|
|
139
119
|
schemas: {
|
|
140
120
|
...validators,
|
|
141
|
-
handlerQuery: (unit as any).query,
|
|
142
|
-
handlerParams: (unit as any).params,
|
|
143
|
-
handlerBody: (unit as any).body,
|
|
144
121
|
middlewares,
|
|
145
|
-
handlerMiddlewares: unit.middlewares,
|
|
146
122
|
},
|
|
147
123
|
});
|
|
148
124
|
|
|
149
125
|
return {
|
|
150
126
|
...base,
|
|
151
|
-
|
|
152
|
-
handler: unit.handler,
|
|
127
|
+
handler: fn,
|
|
153
128
|
...routeSchemas,
|
|
154
|
-
...handlerSchemas,
|
|
155
129
|
...(bodyMode ? { bodyMode } : {}),
|
|
156
130
|
...(returns ? { returns } : {}),
|
|
157
131
|
};
|
package/src/builder/router.ts
CHANGED
|
@@ -17,15 +17,13 @@ import {
|
|
|
17
17
|
createPostRoute,
|
|
18
18
|
createPutRoute,
|
|
19
19
|
} from "./factories.js";
|
|
20
|
-
import { defineHandler } from "../define/handler.js";
|
|
21
20
|
import { defineMiddleware, type DefineMiddlewareFn } from "../define/middleware.js";
|
|
22
21
|
import { createMiddleware } from "./middleware.js";
|
|
23
22
|
import { TaserApp } from "./app.js";
|
|
24
23
|
import type { ContextDefinition, CreateTaserAppOptions, OnErrorOptions } from "../types/app.js";
|
|
25
24
|
import type { AppContext } from "../types/units.js";
|
|
26
|
-
import type {
|
|
25
|
+
import type { LayoutId, MiddlewareBuilder } from "../types/index.js";
|
|
27
26
|
import type { ReturnsMap } from "../types/returns.js";
|
|
28
|
-
import type { Schema } from "../types/schema.js";
|
|
29
27
|
import type {
|
|
30
28
|
CreateAllRoute,
|
|
31
29
|
CreateAnyRoute,
|
|
@@ -117,21 +115,6 @@ export class TaserRouter<
|
|
|
117
115
|
return createMiddleware(layout) as MiddlewareBuilder<Layout, readonly [], TAppContext>;
|
|
118
116
|
}
|
|
119
117
|
|
|
120
|
-
defineHandler<TQuery = unknown, TParams = unknown, TBody = unknown>(options?: {
|
|
121
|
-
query?: Schema<TQuery>;
|
|
122
|
-
params?: Schema<TParams>;
|
|
123
|
-
body?: Schema<TBody>;
|
|
124
|
-
}): HandlerBuilder<
|
|
125
|
-
readonly [],
|
|
126
|
-
{ query: TQuery; params: TParams; body: TBody },
|
|
127
|
-
{},
|
|
128
|
-
TAppContext
|
|
129
|
-
> {
|
|
130
|
-
return options === undefined
|
|
131
|
-
? defineHandler<TAppContext>()
|
|
132
|
-
: defineHandler<TAppContext>(options);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
118
|
defineMiddleware: DefineMiddlewareFn<TAppContext> =
|
|
136
119
|
defineMiddleware as DefineMiddlewareFn<TAppContext>;
|
|
137
120
|
|