@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.
Files changed (153) 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/factories.cjs.map +1 -1
  6. package/dist/cjs/builder/factories.d.cts +9 -9
  7. package/dist/cjs/builder/middleware-unit.cjs +64 -0
  8. package/dist/cjs/builder/middleware-unit.cjs.map +1 -0
  9. package/dist/cjs/builder/middleware-unit.d.cts +1 -0
  10. package/dist/cjs/builder/middleware.cjs +3 -1
  11. package/dist/cjs/builder/middleware.cjs.map +1 -1
  12. package/dist/cjs/builder/route.cjs +7 -21
  13. package/dist/cjs/builder/route.cjs.map +1 -1
  14. package/dist/cjs/builder/router.cjs +1 -20
  15. package/dist/cjs/builder/router.cjs.map +1 -1
  16. package/dist/cjs/builder/router.d.cts +6 -27
  17. package/dist/cjs/builder/standalone.cjs +43 -0
  18. package/dist/cjs/builder/standalone.cjs.map +1 -0
  19. package/dist/cjs/builder/standalone.d.cts +28 -0
  20. package/dist/cjs/define/middleware.cjs +11 -16
  21. package/dist/cjs/define/middleware.cjs.map +1 -1
  22. package/dist/cjs/define/middleware.d.cts +44 -34
  23. package/dist/cjs/index.cjs +15 -4
  24. package/dist/cjs/index.d.cts +6 -4
  25. package/dist/cjs/middleware/body-limit.cjs +3 -3
  26. package/dist/cjs/middleware/body-limit.cjs.map +1 -1
  27. package/dist/cjs/middleware/body-limit.d.cts +1 -1
  28. package/dist/cjs/middleware/compress.cjs +3 -3
  29. package/dist/cjs/middleware/compress.cjs.map +1 -1
  30. package/dist/cjs/middleware/compress.d.cts +1 -1
  31. package/dist/cjs/middleware/cors.cjs +3 -3
  32. package/dist/cjs/middleware/cors.cjs.map +1 -1
  33. package/dist/cjs/middleware/cors.d.cts +1 -1
  34. package/dist/cjs/middleware/csrf.cjs +3 -3
  35. package/dist/cjs/middleware/csrf.cjs.map +1 -1
  36. package/dist/cjs/middleware/csrf.d.cts +1 -1
  37. package/dist/cjs/middleware/etag.cjs +3 -3
  38. package/dist/cjs/middleware/etag.cjs.map +1 -1
  39. package/dist/cjs/middleware/etag.d.cts +1 -1
  40. package/dist/cjs/middleware/hono-mw.cjs +23 -0
  41. package/dist/cjs/middleware/hono-mw.cjs.map +1 -0
  42. package/dist/cjs/middleware/hono-mw.d.cts +16 -0
  43. package/dist/cjs/middleware/jwk.cjs +6 -2
  44. package/dist/cjs/middleware/jwk.cjs.map +1 -1
  45. package/dist/cjs/middleware/jwt.cjs +6 -2
  46. package/dist/cjs/middleware/jwt.cjs.map +1 -1
  47. package/dist/cjs/middleware/secure-headers.cjs +3 -3
  48. package/dist/cjs/middleware/secure-headers.cjs.map +1 -1
  49. package/dist/cjs/middleware/secure-headers.d.cts +1 -1
  50. package/dist/cjs/middleware/timing.cjs +3 -3
  51. package/dist/cjs/middleware/timing.cjs.map +1 -1
  52. package/dist/cjs/middleware/timing.d.cts +1 -1
  53. package/dist/cjs/types/index.d.cts +20 -52
  54. package/dist/cjs/types/type-utils.d.cts +2 -2
  55. package/dist/cjs/types/units.d.cts +18 -45
  56. package/dist/esm/builder/constants.d.ts +0 -5
  57. package/dist/esm/builder/constants.js +1 -6
  58. package/dist/esm/builder/constants.js.map +1 -1
  59. package/dist/esm/builder/factories.d.ts +9 -9
  60. package/dist/esm/builder/factories.js.map +1 -1
  61. package/dist/esm/builder/middleware-unit.d.ts +1 -0
  62. package/dist/esm/builder/middleware-unit.js +64 -0
  63. package/dist/esm/builder/middleware-unit.js.map +1 -0
  64. package/dist/esm/builder/middleware.js +3 -1
  65. package/dist/esm/builder/middleware.js.map +1 -1
  66. package/dist/esm/builder/route.js +7 -21
  67. package/dist/esm/builder/route.js.map +1 -1
  68. package/dist/esm/builder/router.d.ts +6 -27
  69. package/dist/esm/builder/router.js +1 -20
  70. package/dist/esm/builder/router.js.map +1 -1
  71. package/dist/esm/builder/standalone.d.ts +28 -0
  72. package/dist/esm/builder/standalone.js +32 -0
  73. package/dist/esm/builder/standalone.js.map +1 -0
  74. package/dist/esm/define/middleware.d.ts +44 -34
  75. package/dist/esm/define/middleware.js +11 -16
  76. package/dist/esm/define/middleware.js.map +1 -1
  77. package/dist/esm/index.d.ts +6 -4
  78. package/dist/esm/index.js +3 -3
  79. package/dist/esm/middleware/body-limit.d.ts +1 -1
  80. package/dist/esm/middleware/body-limit.js +3 -3
  81. package/dist/esm/middleware/body-limit.js.map +1 -1
  82. package/dist/esm/middleware/compress.d.ts +1 -1
  83. package/dist/esm/middleware/compress.js +3 -3
  84. package/dist/esm/middleware/compress.js.map +1 -1
  85. package/dist/esm/middleware/cors.d.ts +1 -1
  86. package/dist/esm/middleware/cors.js +3 -3
  87. package/dist/esm/middleware/cors.js.map +1 -1
  88. package/dist/esm/middleware/csrf.d.ts +1 -1
  89. package/dist/esm/middleware/csrf.js +3 -3
  90. package/dist/esm/middleware/csrf.js.map +1 -1
  91. package/dist/esm/middleware/etag.d.ts +1 -1
  92. package/dist/esm/middleware/etag.js +3 -3
  93. package/dist/esm/middleware/etag.js.map +1 -1
  94. package/dist/esm/middleware/hono-mw.d.ts +16 -0
  95. package/dist/esm/middleware/hono-mw.js +23 -0
  96. package/dist/esm/middleware/hono-mw.js.map +1 -0
  97. package/dist/esm/middleware/jwk.js +7 -3
  98. package/dist/esm/middleware/jwk.js.map +1 -1
  99. package/dist/esm/middleware/jwt.js +7 -3
  100. package/dist/esm/middleware/jwt.js.map +1 -1
  101. package/dist/esm/middleware/secure-headers.d.ts +1 -1
  102. package/dist/esm/middleware/secure-headers.js +3 -3
  103. package/dist/esm/middleware/secure-headers.js.map +1 -1
  104. package/dist/esm/middleware/timing.d.ts +1 -1
  105. package/dist/esm/middleware/timing.js +3 -3
  106. package/dist/esm/middleware/timing.js.map +1 -1
  107. package/dist/esm/types/index.d.ts +20 -52
  108. package/dist/esm/types/type-utils.d.ts +2 -2
  109. package/dist/esm/types/units.d.ts +18 -45
  110. package/package.json +3 -3
  111. package/src/builder/constants.ts +0 -6
  112. package/src/builder/factories.ts +2 -2
  113. package/src/builder/middleware-unit.ts +66 -0
  114. package/src/builder/middleware.ts +8 -2
  115. package/src/builder/route.ts +10 -34
  116. package/src/builder/router.ts +7 -77
  117. package/src/builder/standalone.ts +70 -0
  118. package/src/define/middleware.ts +155 -231
  119. package/src/index.ts +29 -3
  120. package/src/middleware/body-limit.ts +3 -4
  121. package/src/middleware/compress.ts +3 -4
  122. package/src/middleware/cors.ts +3 -4
  123. package/src/middleware/csrf.ts +3 -4
  124. package/src/middleware/etag.ts +3 -4
  125. package/src/middleware/hono-mw.ts +22 -0
  126. package/src/middleware/jwk.ts +10 -8
  127. package/src/middleware/jwt.ts +9 -7
  128. package/src/middleware/secure-headers.ts +3 -4
  129. package/src/middleware/timing.ts +3 -4
  130. package/src/types/index.ts +54 -196
  131. package/src/types/type-utils.ts +8 -4
  132. package/src/types/units.ts +153 -87
  133. package/dist/cjs/define/handler.cjs +0 -38
  134. package/dist/cjs/define/handler.cjs.map +0 -1
  135. package/dist/cjs/define/handler.d.cts +0 -13
  136. package/dist/cjs/middleware/wrap-hono.cjs +0 -19
  137. package/dist/cjs/middleware/wrap-hono.cjs.map +0 -1
  138. package/dist/cjs/middleware/wrap-hono.d.cts +0 -7
  139. package/dist/cjs/register.d.cts +0 -2
  140. package/dist/cjs/types/units.cjs +0 -8
  141. package/dist/cjs/types/units.cjs.map +0 -1
  142. package/dist/esm/define/handler.d.ts +0 -13
  143. package/dist/esm/define/handler.js +0 -38
  144. package/dist/esm/define/handler.js.map +0 -1
  145. package/dist/esm/middleware/wrap-hono.d.ts +0 -7
  146. package/dist/esm/middleware/wrap-hono.js +0 -18
  147. package/dist/esm/middleware/wrap-hono.js.map +0 -1
  148. package/dist/esm/register.d.ts +0 -2
  149. package/dist/esm/types/units.js +0 -8
  150. package/dist/esm/types/units.js.map +0 -1
  151. package/src/define/handler.ts +0 -62
  152. package/src/middleware/wrap-hono.ts +0 -25
  153. package/src/register.ts +0 -1
@@ -1,11 +1,10 @@
1
1
  import { bodyLimit as honoBodyLimit } from "hono/body-limit";
2
2
 
3
- import { wrapHonoMiddleware } from "./wrap-hono.js";
4
-
5
- const wrapped = wrapHonoMiddleware(honoBodyLimit);
3
+ import { middleware } from "../define/middleware.js";
4
+ import { honoMw } from "./hono-mw.js";
6
5
 
7
6
  export function bodyLimit(...args: Parameters<typeof honoBodyLimit>) {
8
- return wrapped(...args);
7
+ return middleware(honoMw(honoBodyLimit(...args)));
9
8
  }
10
9
 
11
10
  export type BodyLimitOptions = Parameters<typeof honoBodyLimit>[0];
@@ -1,11 +1,10 @@
1
1
  import { compress as honoCompress } from "hono/compress";
2
2
 
3
- import { wrapHonoMiddleware } from "./wrap-hono.js";
4
-
5
- const wrapped = wrapHonoMiddleware(honoCompress);
3
+ import { middleware } from "../define/middleware.js";
4
+ import { honoMw } from "./hono-mw.js";
6
5
 
7
6
  export function compress(...args: Parameters<typeof honoCompress>) {
8
- return wrapped(...args);
7
+ return middleware(honoMw(honoCompress(...args)));
9
8
  }
10
9
 
11
10
  export type CompressOptions = NonNullable<Parameters<typeof honoCompress>[0]>;
@@ -1,11 +1,10 @@
1
1
  import { cors as honoCors } from "hono/cors";
2
2
 
3
- import { wrapHonoMiddleware } from "./wrap-hono.js";
4
-
5
- const wrapped = wrapHonoMiddleware(honoCors);
3
+ import { middleware } from "../define/middleware.js";
4
+ import { honoMw } from "./hono-mw.js";
6
5
 
7
6
  export function cors(...args: Parameters<typeof honoCors>) {
8
- return wrapped(...args);
7
+ return middleware(honoMw(honoCors(...args)));
9
8
  }
10
9
 
11
10
  export type CorsOptions = NonNullable<Parameters<typeof honoCors>[0]>;
@@ -1,11 +1,10 @@
1
1
  import { csrf as honoCsrf } from "hono/csrf";
2
2
 
3
- import { wrapHonoMiddleware } from "./wrap-hono.js";
4
-
5
- const wrapped = wrapHonoMiddleware(honoCsrf);
3
+ import { middleware } from "../define/middleware.js";
4
+ import { honoMw } from "./hono-mw.js";
6
5
 
7
6
  export function csrf(...args: Parameters<typeof honoCsrf>) {
8
- return wrapped(...args);
7
+ return middleware(honoMw(honoCsrf(...args)));
9
8
  }
10
9
 
11
10
  export type CsrfOptions = NonNullable<Parameters<typeof honoCsrf>[0]>;
@@ -1,11 +1,10 @@
1
1
  import { etag as honoEtag } from "hono/etag";
2
2
 
3
- import { wrapHonoMiddleware } from "./wrap-hono.js";
4
-
5
- const wrapped = wrapHonoMiddleware(honoEtag);
3
+ import { middleware } from "../define/middleware.js";
4
+ import { honoMw } from "./hono-mw.js";
6
5
 
7
6
  export function etag(...args: Parameters<typeof honoEtag>) {
8
- return wrapped(...args);
7
+ return middleware(honoMw(honoEtag(...args)));
9
8
  }
10
9
 
11
10
  export type EtagOptions = NonNullable<Parameters<typeof honoEtag>[0]>;
@@ -0,0 +1,22 @@
1
+ import { createTaserCompatHandler } from "@taserjs/router-core";
2
+ import type { MiddlewareHandler } from "hono";
3
+
4
+ /**
5
+ * Adapts a standard Web / Hono-compatible middleware function `(c, next) => ...`
6
+ * into a Taser-compatible middleware handler function `(ctx, next) => Promise<Response>`.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { honoMw } from "@taserjs/router";
11
+ * import { cors } from "hono/cors";
12
+ *
13
+ * const app = t.get("/hello").use(honoMw(cors()));
14
+ * // or
15
+ * const customCors = middleware(honoMw(cors()));
16
+ * ```
17
+ */
18
+ export function honoMw(
19
+ middleware: MiddlewareHandler,
20
+ ): (ctx: unknown, next: any) => Promise<Response> {
21
+ return createTaserCompatHandler(middleware) as (ctx: unknown, next: any) => Promise<Response>;
22
+ }
@@ -1,9 +1,8 @@
1
- import type { MiddlewareHandler } from "hono";
2
1
  import { jwk as honoJwk } from "hono/jwk";
3
2
 
4
- import { defineMiddleware } from "../define/middleware.js";
3
+ import { middleware } from "../define/middleware.js";
4
+ import { honoMw } from "./hono-mw.js";
5
5
  import type { JwtMiddlewareUnit, JwtPayloadState } from "./jwt.js";
6
- import { extractJwtPayload } from "./wrap-hono.js";
7
6
 
8
7
  export type JwkOptions = Parameters<typeof honoJwk>[0];
9
8
 
@@ -41,9 +40,12 @@ export function jwk<TPayload = Record<string, unknown>>(
41
40
 
42
41
  const { allowInsecure: _allowInsecure, ...honoOptions } = options;
43
42
  const safeInit = init?.headers !== undefined ? { headers: init.headers } : undefined;
44
- const honoMw: MiddlewareHandler = honoJwk(honoOptions, safeInit);
45
-
46
- return defineMiddleware<JwtPayloadState<TPayload>>({
47
- handler: extractJwtPayload<TPayload>(honoMw),
48
- });
43
+ const mw = honoMw(honoJwk(honoOptions, safeInit));
44
+
45
+ return middleware<JwtPayloadState<TPayload>>((ctx, next) =>
46
+ mw(ctx, async () => {
47
+ const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
48
+ return next({ jwtPayload: payload as TPayload });
49
+ }),
50
+ );
49
51
  }
@@ -1,9 +1,8 @@
1
- import type { MiddlewareHandler } from "hono";
2
1
  import { jwt as honoJwt } from "hono/jwt";
3
2
 
4
- import { defineMiddleware } from "../define/middleware.js";
3
+ import { middleware } from "../define/middleware.js";
5
4
  import type { MiddlewareReturnFromParts, MiddlewareUnit } from "../types/units.js";
6
- import { extractJwtPayload } from "./wrap-hono.js";
5
+ import { honoMw } from "./hono-mw.js";
7
6
 
8
7
  export type JwtPayloadState<TPayload> = {
9
8
  jwtPayload: TPayload;
@@ -22,8 +21,11 @@ export type JwtOptions = Parameters<typeof honoJwt>[0];
22
21
  export function jwt<TPayload = Record<string, unknown>>(
23
22
  options: JwtOptions,
24
23
  ): JwtMiddlewareUnit<TPayload> {
25
- const honoMw: MiddlewareHandler = honoJwt(options);
26
- return defineMiddleware<JwtPayloadState<TPayload>>({
27
- handler: extractJwtPayload<TPayload>(honoMw),
28
- });
24
+ const mw = honoMw(honoJwt(options));
25
+ return middleware<JwtPayloadState<TPayload>>((ctx, next) =>
26
+ mw(ctx, async () => {
27
+ const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
28
+ return next({ jwtPayload: payload as TPayload });
29
+ }),
30
+ );
29
31
  }
@@ -1,11 +1,10 @@
1
1
  import { secureHeaders as honoSecureHeaders } from "hono/secure-headers";
2
2
 
3
- import { wrapHonoMiddleware } from "./wrap-hono.js";
4
-
5
- const wrapped = wrapHonoMiddleware(honoSecureHeaders);
3
+ import { middleware } from "../define/middleware.js";
4
+ import { honoMw } from "./hono-mw.js";
6
5
 
7
6
  export function secureHeaders(...args: Parameters<typeof honoSecureHeaders>) {
8
- return wrapped(...args);
7
+ return middleware(honoMw(honoSecureHeaders(...args)));
9
8
  }
10
9
 
11
10
  export type SecureHeadersOptions = NonNullable<Parameters<typeof honoSecureHeaders>[0]>;
@@ -1,11 +1,10 @@
1
1
  import { timing as honoTiming } from "hono/timing";
2
2
 
3
- import { wrapHonoMiddleware } from "./wrap-hono.js";
4
-
5
- const wrapped = wrapHonoMiddleware(honoTiming);
3
+ import { middleware } from "../define/middleware.js";
4
+ import { honoMw } from "./hono-mw.js";
6
5
 
7
6
  export function timing(...args: Parameters<typeof honoTiming>) {
8
- return wrapped(...args);
7
+ return middleware(honoMw(honoTiming(...args)));
9
8
  }
10
9
 
11
10
  export type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]>;
@@ -1,5 +1,5 @@
1
1
  import type { Awaitable, TaserCookieJar, TaserHeaders } from "@taserjs/router-core";
2
- import type { RouterRegister } from "../register.js";
2
+ import type { RouterRegister } from "../index.js";
3
3
  import type {
4
4
  MergeMiddlewareField,
5
5
  MergeMiddlewareInputField,
@@ -12,15 +12,13 @@ import type {
12
12
  import type { ReturnsMap, ValidHandlerReply } from "./returns.js";
13
13
  import type { Schema } from "./schema.js";
14
14
  import type {
15
- AppContext,
15
+ EmptyAppContext,
16
16
  ExtractState,
17
- HandlerContext,
18
- HandlerUnit,
19
- InlineMiddlewareOptions,
20
17
  Method,
21
18
  MiddlewareDefinition,
22
19
  MiddlewareReturnFromParts,
23
20
  MiddlewareUnit,
21
+ NextFn,
24
22
  ValidatorParts,
25
23
  } from "./units.js";
26
24
 
@@ -32,7 +30,6 @@ export type {
32
30
  Schema,
33
31
  StandardSchemaV1,
34
32
  } from "./schema.js";
35
- export type { RouterRegister } from "../register.js";
36
33
  export type {
37
34
  MergeMiddlewareField,
38
35
  MergeMiddlewareInputField,
@@ -54,18 +51,15 @@ export type {
54
51
  ValidHandlerReply,
55
52
  } from "./returns.js";
56
53
  export type {
57
- AppContext,
54
+ EmptyAppContext,
58
55
  ExtractState,
59
- HandlerContext,
60
- HandlerUnit,
61
56
  HttpMethod,
62
- InlineMiddlewareOptions,
63
57
  IsUnknown,
64
58
  Method,
65
59
  MiddlewareDefinition,
66
- MiddlewareNext,
67
60
  MiddlewareReturnFromParts,
68
61
  MiddlewareUnit,
62
+ MiddlewareUnitBuilder,
69
63
  NextFn,
70
64
  NextResult,
71
65
  StandaloneMiddlewareContext,
@@ -73,6 +67,8 @@ export type {
73
67
  ValidatorParts,
74
68
  } from "./units.js";
75
69
 
70
+ export type AppContext = RouterRegister extends { AppContext: infer C } ? C : EmptyAppContext;
71
+
76
72
  export type RoutePath = RouterRegister extends { RoutePath: infer P } ? P : never;
77
73
  export type LayoutId = RouterRegister extends { LayoutId: infer L } ? L : never;
78
74
  export type LayoutTree = RouterRegister extends { LayoutTree: infer T } ? T : Record<never, never>;
@@ -80,6 +76,12 @@ export type RouteByPathMethod = RouterRegister extends { RouteByPathMethod: infe
80
76
  ? R
81
77
  : Record<never, never>;
82
78
 
79
+ export type LayoutBuilder<TAppContext extends Record<string, unknown> = AppContext> = <
80
+ const Layout extends LayoutId,
81
+ >(
82
+ layout: Layout,
83
+ ) => MiddlewareBuilder<Layout, readonly [], TAppContext>;
84
+
83
85
  type ParseParam<Segment extends string> = Segment extends "*"
84
86
  ? { _splat: string }
85
87
  : Segment extends `:${infer Name extends string}`
@@ -103,25 +105,41 @@ export type ResolveParams<TPathParams, TSchemaParams> =
103
105
  : Simplify<Omit<TPathParams, keyof TSchemaParams> & TSchemaParams>
104
106
  : TPathParams;
105
107
 
106
- type LayoutParent<Layout extends LayoutId> = LayoutTree[Layout] extends {
107
- parent: infer Parent extends LayoutId | null;
108
+ type LayoutParentsMap = RouterRegister extends {
109
+ LayoutParents: infer LP extends Record<string, unknown>;
108
110
  }
109
- ? Parent
110
- : null;
111
+ ? LP
112
+ : {};
111
113
 
112
- type ResolveLayoutMiddlewares<Layout extends LayoutId | null> = Layout extends null
114
+ type LayoutParent<Layout extends LayoutId> = Layout extends keyof LayoutParentsMap
115
+ ? LayoutParentsMap[Layout] extends LayoutId
116
+ ? LayoutParentsMap[Layout]
117
+ : null
118
+ : LayoutTree[Layout] extends {
119
+ parent: infer Parent extends LayoutId | null;
120
+ }
121
+ ? Parent
122
+ : null;
123
+
124
+ type ResolveLayoutMiddlewares<
125
+ Layout extends LayoutId | null,
126
+ Depth extends readonly unknown[] = [],
127
+ > = Depth["length"] extends 10
113
128
  ? readonly []
114
129
  : Layout extends LayoutId
115
130
  ? readonly [
116
- ...ResolveLayoutMiddlewares<LayoutParent<Layout>>,
131
+ ...ResolveLayoutMiddlewares<LayoutParent<Layout>, [...Depth, unknown]>,
117
132
  ...LayoutTree[Layout]["middlewares"],
118
133
  ]
119
134
  : readonly [];
120
135
 
121
- export type ResolveLayoutIdChain<L extends LayoutId | null> = L extends null
136
+ export type ResolveLayoutIdChain<
137
+ L extends LayoutId | null,
138
+ Depth extends readonly unknown[] = [],
139
+ > = Depth["length"] extends 10
122
140
  ? readonly []
123
141
  : L extends LayoutId
124
- ? readonly [...ResolveLayoutIdChain<LayoutParent<L>>, L]
142
+ ? readonly [...ResolveLayoutIdChain<LayoutParent<L>, [...Depth, unknown]>, L]
125
143
  : readonly [];
126
144
 
127
145
  export type ResolveLayoutMiddlewaresState<Layout extends LayoutId | null> = Layout extends LayoutId
@@ -192,13 +210,6 @@ type RouteResolvedField<
192
210
  Field extends "query" | "params" | "body" | "state",
193
211
  > = RouteLayoutField<Path, TMethod, Field> & MergeMiddlewareField<Acc, Field>;
194
212
 
195
- type RouteChainField<
196
- Path extends RoutePath,
197
- TMethod extends Method,
198
- Acc extends readonly unknown[],
199
- Field extends "query" | "params" | "body" | "state",
200
- > = RouteResolvedField<Path, TMethod, Acc, Field>;
201
-
202
213
  export type RouteChainContext<
203
214
  Path extends RoutePath,
204
215
  TMethod extends Method,
@@ -210,15 +221,15 @@ export type RouteChainContext<
210
221
  > = Simplify<
211
222
  TAppContext &
212
223
  UnitRuntimeContext & {
213
- query: Simplify<MergePart<TQuery, RouteChainField<Path, TMethod, Acc, "query">>>;
224
+ query: Simplify<MergePart<TQuery, RouteResolvedField<Path, TMethod, Acc, "query">>>;
214
225
  params: Simplify<
215
226
  ResolveParams<
216
227
  PathParams<Path>,
217
- MergePart<TParams, RouteChainField<Path, TMethod, Acc, "params">>
228
+ MergePart<TParams, RouteResolvedField<Path, TMethod, Acc, "params">>
218
229
  >
219
230
  >;
220
- body: Simplify<MergePart<TBody, RouteChainField<Path, TMethod, Acc, "body">>>;
221
- state: Simplify<RouteChainField<Path, TMethod, Acc, "state">>;
231
+ body: Simplify<MergePart<TBody, RouteResolvedField<Path, TMethod, Acc, "body">>>;
232
+ state: Simplify<RouteResolvedField<Path, TMethod, Acc, "state">>;
222
233
  headers: TaserHeaders;
223
234
  cookies: TaserCookieJar;
224
235
  }
@@ -482,41 +493,14 @@ export type MiddlewareBuilder<
482
493
  },
483
494
  ]
484
495
  ): MiddlewareBuilder<Layout, readonly [...Acc, TAcc], TAppContext>;
485
- use<
486
- TQuery = unknown,
487
- TParams = unknown,
488
- TBody = unknown,
489
- TReturns extends ReturnsMap = {},
490
- TQueryIn = unknown,
491
- TParamsIn = unknown,
492
- TBodyIn = unknown,
493
- R = unknown,
494
- >(
495
- options: InlineMiddlewareOptions<
496
- MiddlewareChainContext<Layout, Acc, TQuery, TParams, TBody, TAppContext>,
497
- TQuery,
498
- TParams,
499
- TBody,
500
- TReturns,
501
- TQueryIn,
502
- TParamsIn,
503
- TBodyIn,
504
- R
505
- >,
496
+ use<R = unknown>(
497
+ fn: (
498
+ ctx: MiddlewareChainContext<Layout, Acc, unknown, unknown, unknown, TAppContext>,
499
+ next: NextFn,
500
+ ) => Awaitable<R>,
506
501
  ): MiddlewareBuilder<
507
502
  Layout,
508
- readonly [
509
- ...Acc,
510
- MiddlewareReturnFromParts<
511
- TQuery,
512
- TParams,
513
- TBody,
514
- ExtractState<R>,
515
- TQueryIn,
516
- TParamsIn,
517
- TBodyIn
518
- >,
519
- ],
503
+ readonly [...Acc, MiddlewareReturnFromParts<unknown, unknown, unknown, ExtractState<R>>],
520
504
  TAppContext
521
505
  >;
522
506
  };
@@ -532,7 +516,6 @@ export type RouteExport<
532
516
  readonly method: TMethod | "ANY" | "ALL";
533
517
  readonly methods?: readonly Method[];
534
518
  readonly middlewares: readonly MiddlewareDefinition[];
535
- readonly handlerMiddlewares: readonly MiddlewareDefinition[];
536
519
  readonly returns?: TReturns;
537
520
  readonly bodyMode?: "json" | "form" | "urlencoded";
538
521
  handler: (ctx: unknown) => Awaitable<Response>;
@@ -548,9 +531,6 @@ export type RouteExport<
548
531
  query?: Schema<unknown>;
549
532
  params?: Schema<unknown>;
550
533
  body?: Schema<unknown>;
551
- handlerQuery?: Schema<unknown>;
552
- handlerParams?: Schema<unknown>;
553
- handlerBody?: Schema<unknown>;
554
534
  };
555
535
 
556
536
  type RouteHandleResult<
@@ -639,44 +619,17 @@ export type RouteBuilderBase<
639
619
  Omit<TReturns, keyof UReturns> & UReturns,
640
620
  TAppContext
641
621
  >;
642
- use<
643
- TQuery = unknown,
644
- TParams = unknown,
645
- TBody = unknown,
646
- UReturns extends ReturnsMap = {},
647
- TQueryIn = unknown,
648
- TParamsIn = unknown,
649
- TBodyIn = unknown,
650
- R = unknown,
651
- >(
652
- options: InlineMiddlewareOptions<
653
- RouteChainContext<Path, TMethod, Acc, TQuery, TParams, TBody, TAppContext>,
654
- TQuery,
655
- TParams,
656
- TBody,
657
- UReturns,
658
- TQueryIn,
659
- TParamsIn,
660
- TBodyIn,
661
- R
662
- >,
622
+ use<R = unknown>(
623
+ fn: (
624
+ ctx: RouteChainContext<Path, TMethod, Acc, unknown, unknown, unknown, TAppContext>,
625
+ next: NextFn,
626
+ ) => Awaitable<R>,
663
627
  ): RouteBuilder<
664
628
  Path,
665
629
  TMethod,
666
- readonly [
667
- ...Acc,
668
- MiddlewareReturnFromParts<
669
- TQuery,
670
- TParams,
671
- TBody,
672
- ExtractState<R>,
673
- TQueryIn,
674
- TParamsIn,
675
- TBodyIn
676
- >,
677
- ],
630
+ readonly [...Acc, MiddlewareReturnFromParts<unknown, unknown, unknown, ExtractState<R>>],
678
631
  Validators,
679
- Omit<TReturns, keyof UReturns> & UReturns,
632
+ TReturns,
680
633
  TAppContext
681
634
  >;
682
635
  handler<R extends Response = Response>(
@@ -694,22 +647,6 @@ export type RouteBuilderBase<
694
647
  },
695
648
  ]
696
649
  ): RouteHandleResult<Path, TMethod, Acc, Validators, TReturns, R, TAppContext>;
697
- handler<
698
- HandlerAcc extends readonly unknown[] = readonly [],
699
- HandlerValidators extends ValidatorParts = ValidatorParts,
700
- HReturns extends ReturnsMap = {},
701
- HOutput = Response,
702
- >(
703
- unit: HandlerUnit<HandlerAcc, HandlerValidators, HReturns, HOutput>,
704
- ): RouteHandleResult<
705
- Path,
706
- TMethod,
707
- readonly [...Acc, ...HandlerAcc],
708
- Validators,
709
- Omit<TReturns, keyof HReturns> & HReturns,
710
- HOutput,
711
- TAppContext
712
- >;
713
650
  };
714
651
 
715
652
  export type RouteBuilder<
@@ -746,85 +683,6 @@ export type RouteBuilder<
746
683
  >;
747
684
  });
748
685
 
749
- export type HandlerBuilder<
750
- Acc extends readonly unknown[] = readonly [],
751
- Validators extends ValidatorParts = {},
752
- TReturns extends ReturnsMap = {},
753
- TAppContext extends Record<string, unknown> = AppContext,
754
- > = {
755
- returns<const M extends ReturnsMap>(
756
- map: M,
757
- ): HandlerBuilder<Acc, Validators, Omit<TReturns, keyof M> & M, TAppContext>;
758
- use<TAcc, UReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown>(
759
- unit: MiddlewareUnit<TAcc, UReturns, TRequiredLayouts, TRequiredState>,
760
- ..._assert: [IsStateSatisfied<MergeMiddlewareField<Acc, "state">, TRequiredState>] extends [
761
- true,
762
- ]
763
- ? []
764
- : [
765
- {
766
- error: "Middleware cannot be attached to this handler";
767
- requiredState: TRequiredState;
768
- actualState: MergeMiddlewareField<Acc, "state">;
769
- },
770
- ]
771
- ): HandlerBuilder<
772
- readonly [...Acc, TAcc],
773
- Validators,
774
- Omit<TReturns, keyof UReturns> & UReturns,
775
- TAppContext
776
- >;
777
- use<
778
- TQuery = unknown,
779
- TParams = unknown,
780
- TBody = unknown,
781
- UReturns extends ReturnsMap = {},
782
- TQueryIn = unknown,
783
- TParamsIn = unknown,
784
- TBodyIn = unknown,
785
- R = unknown,
786
- >(
787
- options: InlineMiddlewareOptions<
788
- HandlerContext<Acc, { query: TQuery; params: TParams; body: TBody }, TAppContext>,
789
- TQuery,
790
- TParams,
791
- TBody,
792
- UReturns,
793
- TQueryIn,
794
- TParamsIn,
795
- TBodyIn,
796
- R
797
- >,
798
- ): HandlerBuilder<
799
- readonly [
800
- ...Acc,
801
- MiddlewareReturnFromParts<
802
- TQuery,
803
- TParams,
804
- TBody,
805
- ExtractState<R>,
806
- TQueryIn,
807
- TParamsIn,
808
- TBodyIn
809
- >,
810
- ],
811
- Validators,
812
- Omit<TReturns, keyof UReturns> & UReturns,
813
- TAppContext
814
- >;
815
- handler<R extends Response = Response>(
816
- fn: (ctx: HandlerContext<Acc, Validators, TAppContext>) => Awaitable<R>,
817
- ..._assert: [R] extends [ValidHandlerReply<R, TReturns>]
818
- ? []
819
- : [
820
- {
821
- expected: ValidHandlerReply<R, TReturns>;
822
- actual: R;
823
- },
824
- ]
825
- ): HandlerUnit<Acc, Validators, TReturns, R>;
826
- };
827
-
828
686
  export type RouteDefinition<
829
687
  Path extends RoutePath = RoutePath,
830
688
  TMethod extends Method = Method,
@@ -63,16 +63,20 @@ export type MiddlewareInputField<
63
63
  export type MergeMiddlewareField<
64
64
  Middlewares extends readonly unknown[],
65
65
  Field extends MiddlewareFieldName,
66
- > = [Middlewares] extends [readonly []]
66
+ > = Middlewares extends readonly []
67
67
  ? {}
68
- : UnionToIntersection<MiddlewareField<Middlewares[number], Field>>;
68
+ : Middlewares extends readonly [infer Head, ...infer Tail]
69
+ ? MiddlewareField<Head, Field> & MergeMiddlewareField<Tail, Field>
70
+ : MiddlewareField<Middlewares[number], Field>;
69
71
 
70
72
  export type MergeMiddlewareInputField<
71
73
  Middlewares extends readonly unknown[],
72
74
  Field extends MiddlewareInputFieldName,
73
- > = [Middlewares] extends [readonly []]
75
+ > = Middlewares extends readonly []
74
76
  ? {}
75
- : UnionToIntersection<MiddlewareInputField<Middlewares[number], Field>>;
77
+ : Middlewares extends readonly [infer Head, ...infer Tail]
78
+ ? MiddlewareInputField<Head, Field> & MergeMiddlewareInputField<Tail, Field>
79
+ : MiddlewareInputField<Middlewares[number], Field>;
76
80
 
77
81
  export type RuntimeContextFields = {
78
82
  request: Request;