@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.
Files changed (135) hide show
  1. package/README.md +0 -7
  2. package/dist/cjs/builder/constants.cjs +0 -6
  3. package/dist/cjs/builder/constants.cjs.map +1 -1
  4. package/dist/cjs/builder/constants.d.cts +0 -5
  5. package/dist/cjs/builder/middleware-unit.cjs +55 -0
  6. package/dist/cjs/builder/middleware-unit.cjs.map +1 -0
  7. package/dist/cjs/builder/middleware-unit.d.cts +18 -0
  8. package/dist/cjs/builder/middleware.cjs +2 -1
  9. package/dist/cjs/builder/middleware.cjs.map +1 -1
  10. package/dist/cjs/builder/route.cjs +6 -21
  11. package/dist/cjs/builder/route.cjs.map +1 -1
  12. package/dist/cjs/builder/router.cjs +0 -4
  13. package/dist/cjs/builder/router.cjs.map +1 -1
  14. package/dist/cjs/builder/router.d.cts +1 -11
  15. package/dist/cjs/define/middleware.cjs +10 -14
  16. package/dist/cjs/define/middleware.cjs.map +1 -1
  17. package/dist/cjs/define/middleware.d.cts +42 -31
  18. package/dist/cjs/index.cjs +2 -2
  19. package/dist/cjs/index.d.cts +2 -2
  20. package/dist/cjs/middleware/body-limit.cjs +3 -3
  21. package/dist/cjs/middleware/body-limit.cjs.map +1 -1
  22. package/dist/cjs/middleware/body-limit.d.cts +1 -1
  23. package/dist/cjs/middleware/compress.cjs +3 -3
  24. package/dist/cjs/middleware/compress.cjs.map +1 -1
  25. package/dist/cjs/middleware/compress.d.cts +1 -1
  26. package/dist/cjs/middleware/cors.cjs +3 -3
  27. package/dist/cjs/middleware/cors.cjs.map +1 -1
  28. package/dist/cjs/middleware/cors.d.cts +1 -1
  29. package/dist/cjs/middleware/csrf.cjs +3 -3
  30. package/dist/cjs/middleware/csrf.cjs.map +1 -1
  31. package/dist/cjs/middleware/csrf.d.cts +1 -1
  32. package/dist/cjs/middleware/etag.cjs +3 -3
  33. package/dist/cjs/middleware/etag.cjs.map +1 -1
  34. package/dist/cjs/middleware/etag.d.cts +1 -1
  35. package/dist/cjs/middleware/hono-mw.cjs +23 -0
  36. package/dist/cjs/middleware/hono-mw.cjs.map +1 -0
  37. package/dist/cjs/middleware/hono-mw.d.cts +16 -0
  38. package/dist/cjs/middleware/jwk.cjs +6 -2
  39. package/dist/cjs/middleware/jwk.cjs.map +1 -1
  40. package/dist/cjs/middleware/jwt.cjs +6 -2
  41. package/dist/cjs/middleware/jwt.cjs.map +1 -1
  42. package/dist/cjs/middleware/secure-headers.cjs +3 -3
  43. package/dist/cjs/middleware/secure-headers.cjs.map +1 -1
  44. package/dist/cjs/middleware/secure-headers.d.cts +1 -1
  45. package/dist/cjs/middleware/timing.cjs +3 -3
  46. package/dist/cjs/middleware/timing.cjs.map +1 -1
  47. package/dist/cjs/middleware/timing.d.cts +1 -1
  48. package/dist/cjs/types/index.d.cts +4 -41
  49. package/dist/cjs/types/units.d.cts +9 -34
  50. package/dist/esm/builder/constants.d.ts +0 -5
  51. package/dist/esm/builder/constants.js +1 -6
  52. package/dist/esm/builder/constants.js.map +1 -1
  53. package/dist/esm/builder/middleware-unit.d.ts +18 -0
  54. package/dist/esm/builder/middleware-unit.js +55 -0
  55. package/dist/esm/builder/middleware-unit.js.map +1 -0
  56. package/dist/esm/builder/middleware.js +2 -1
  57. package/dist/esm/builder/middleware.js.map +1 -1
  58. package/dist/esm/builder/route.js +6 -21
  59. package/dist/esm/builder/route.js.map +1 -1
  60. package/dist/esm/builder/router.d.ts +1 -11
  61. package/dist/esm/builder/router.js +0 -4
  62. package/dist/esm/builder/router.js.map +1 -1
  63. package/dist/esm/define/middleware.d.ts +42 -31
  64. package/dist/esm/define/middleware.js +10 -14
  65. package/dist/esm/define/middleware.js.map +1 -1
  66. package/dist/esm/index.d.ts +2 -2
  67. package/dist/esm/index.js +2 -2
  68. package/dist/esm/middleware/body-limit.d.ts +1 -1
  69. package/dist/esm/middleware/body-limit.js +3 -3
  70. package/dist/esm/middleware/body-limit.js.map +1 -1
  71. package/dist/esm/middleware/compress.d.ts +1 -1
  72. package/dist/esm/middleware/compress.js +3 -3
  73. package/dist/esm/middleware/compress.js.map +1 -1
  74. package/dist/esm/middleware/cors.d.ts +1 -1
  75. package/dist/esm/middleware/cors.js +3 -3
  76. package/dist/esm/middleware/cors.js.map +1 -1
  77. package/dist/esm/middleware/csrf.d.ts +1 -1
  78. package/dist/esm/middleware/csrf.js +3 -3
  79. package/dist/esm/middleware/csrf.js.map +1 -1
  80. package/dist/esm/middleware/etag.d.ts +1 -1
  81. package/dist/esm/middleware/etag.js +3 -3
  82. package/dist/esm/middleware/etag.js.map +1 -1
  83. package/dist/esm/middleware/hono-mw.d.ts +16 -0
  84. package/dist/esm/middleware/hono-mw.js +23 -0
  85. package/dist/esm/middleware/hono-mw.js.map +1 -0
  86. package/dist/esm/middleware/jwk.js +6 -2
  87. package/dist/esm/middleware/jwk.js.map +1 -1
  88. package/dist/esm/middleware/jwt.js +6 -2
  89. package/dist/esm/middleware/jwt.js.map +1 -1
  90. package/dist/esm/middleware/secure-headers.d.ts +1 -1
  91. package/dist/esm/middleware/secure-headers.js +3 -3
  92. package/dist/esm/middleware/secure-headers.js.map +1 -1
  93. package/dist/esm/middleware/timing.d.ts +1 -1
  94. package/dist/esm/middleware/timing.js +3 -3
  95. package/dist/esm/middleware/timing.js.map +1 -1
  96. package/dist/esm/types/index.d.ts +4 -41
  97. package/dist/esm/types/units.d.ts +9 -34
  98. package/package.json +3 -3
  99. package/src/builder/constants.ts +0 -6
  100. package/src/builder/middleware-unit.ts +55 -0
  101. package/src/builder/middleware.ts +6 -2
  102. package/src/builder/route.ts +8 -34
  103. package/src/builder/router.ts +1 -18
  104. package/src/define/middleware.ts +133 -228
  105. package/src/index.ts +3 -1
  106. package/src/middleware/body-limit.ts +3 -4
  107. package/src/middleware/compress.ts +3 -4
  108. package/src/middleware/cors.ts +3 -4
  109. package/src/middleware/csrf.ts +3 -4
  110. package/src/middleware/etag.ts +3 -4
  111. package/src/middleware/hono-mw.ts +22 -0
  112. package/src/middleware/jwk.ts +9 -7
  113. package/src/middleware/jwt.ts +8 -6
  114. package/src/middleware/secure-headers.ts +3 -4
  115. package/src/middleware/timing.ts +3 -4
  116. package/src/types/index.ts +15 -172
  117. package/src/types/units.ts +119 -77
  118. package/dist/cjs/define/handler.cjs +0 -38
  119. package/dist/cjs/define/handler.cjs.map +0 -1
  120. package/dist/cjs/define/handler.d.cts +0 -13
  121. package/dist/cjs/middleware/wrap-hono.cjs +0 -19
  122. package/dist/cjs/middleware/wrap-hono.cjs.map +0 -1
  123. package/dist/cjs/middleware/wrap-hono.d.cts +0 -7
  124. package/dist/cjs/types/units.cjs +0 -8
  125. package/dist/cjs/types/units.cjs.map +0 -1
  126. package/dist/esm/define/handler.d.ts +0 -13
  127. package/dist/esm/define/handler.js +0 -38
  128. package/dist/esm/define/handler.js.map +0 -1
  129. package/dist/esm/middleware/wrap-hono.d.ts +0 -7
  130. package/dist/esm/middleware/wrap-hono.js +0 -18
  131. package/dist/esm/middleware/wrap-hono.js.map +0 -1
  132. package/dist/esm/types/units.js +0 -8
  133. package/dist/esm/types/units.js.map +0 -1
  134. package/src/define/handler.ts +0 -62
  135. 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 { wrapHonoMiddleware } from \"./wrap-hono.js\";\n\nconst wrapped = wrapHonoMiddleware(honoSecureHeaders);\n\nexport function secureHeaders(...args: Parameters<typeof honoSecureHeaders>) {\n return wrapped(...args);\n}\n\nexport type SecureHeadersOptions = NonNullable<Parameters<typeof honoSecureHeaders>[0]>;\n"],"mappings":";;;AAIA,IAAM,UAAU,mBAAmB,eAAiB;AAEpD,SAAgB,cAAc,GAAG,MAA4C;CAC3E,OAAO,QAAQ,GAAG,IAAI;AACxB"}
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').MiddlewareUnit<import('../types/units.js').MiddlewareReturnFromParts<unknown, unknown, unknown, {}>>;
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 { wrapHonoMiddleware } from "./wrap-hono.js";
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 wrapped(...args);
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 { wrapHonoMiddleware } from \"./wrap-hono.js\";\n\nconst wrapped = wrapHonoMiddleware(honoTiming);\n\nexport function timing(...args: Parameters<typeof honoTiming>) {\n return wrapped(...args);\n}\n\nexport type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]>;\n"],"mappings":";;;AAIA,IAAM,UAAU,mBAAmB,QAAU;AAE7C,SAAgB,OAAO,GAAG,MAAqC;CAC7D,OAAO,QAAQ,GAAG,IAAI;AACxB"}
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, HandlerContext, HandlerUnit, InlineMiddlewareOptions, Method, MiddlewareDefinition, MiddlewareReturnFromParts, MiddlewareUnit, ValidatorParts } from './units.js';
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, HandlerContext, HandlerUnit, HttpMethod, InlineMiddlewareOptions, IsUnknown, Method, MiddlewareDefinition, MiddlewareNext, MiddlewareReturnFromParts, MiddlewareUnit, NextFn, NextResult, StandaloneMiddlewareContext, StateBrand, ValidatorParts, } from './units.js';
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<TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, R = unknown>(options: InlineMiddlewareOptions<MiddlewareChainContext<Layout, Acc, TQuery, TParams, TBody, TAppContext>, TQuery, TParams, TBody, TReturns, TQueryIn, TParamsIn, TBodyIn, R>): MiddlewareBuilder<Layout, readonly [
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<TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, R = unknown>(options: InlineMiddlewareOptions<RouteChainContext<Path, TMethod, Acc, TQuery, TParams, TBody, TAppContext>, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn, R>): RouteBuilder<Path, TMethod, readonly [
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 { MergeMiddlewareField, MergePart, RequestShape, Simplify, UnitRuntimeContext, UnwrapPart } from './type-utils.js';
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 HandlerUnit<_Acc extends readonly unknown[], _Validators extends ValidatorParts, TReturns extends ReturnsMap = {}, TOutput = Response> = {
74
- readonly __returns?: TReturns;
75
- readonly $Infer: {
76
- Output: TOutput;
77
- };
78
- middlewares: readonly MiddlewareDefinition[];
79
- handler: (ctx: unknown) => Awaitable<Response>;
80
- returns?: ReturnsMap;
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",
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-core": "0.1.3",
151
- "@taserjs/router-utils": "0.1.3"
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",
@@ -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
- entries.push(definition);
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
  };
@@ -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
- middlewares.push(definition);
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(fnOrUnit: ((ctx: unknown) => unknown) | unknown) {
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
- handlerMiddlewares: [...unit.middlewares],
152
- handler: unit.handler,
127
+ handler: fn,
153
128
  ...routeSchemas,
154
- ...handlerSchemas,
155
129
  ...(bodyMode ? { bodyMode } : {}),
156
130
  ...(returns ? { returns } : {}),
157
131
  };
@@ -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 { HandlerBuilder, LayoutId, MiddlewareBuilder } from "../types/index.js";
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