@taserjs/router 0.1.12 → 0.2.0

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 (288) hide show
  1. package/README.md +5 -5
  2. package/dist/builder-BNkN_JKi.cjs +284 -0
  3. package/dist/builder-DObEWeC0.js +227 -0
  4. package/dist/builder-DObEWeC0.js.map +1 -0
  5. package/dist/hono-Ddk3waH-.cjs +42 -0
  6. package/dist/hono-kDZSomjd.js +39 -0
  7. package/dist/hono-kDZSomjd.js.map +1 -0
  8. package/dist/index.cjs +60 -0
  9. package/dist/index.d.cts +105 -0
  10. package/dist/index.d.cts.map +1 -0
  11. package/dist/index.d.ts +105 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +14 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/middleware/body-limit.cjs +15 -0
  16. package/dist/middleware/body-limit.d.cts +11 -0
  17. package/dist/middleware/body-limit.d.cts.map +1 -0
  18. package/dist/middleware/body-limit.d.ts +11 -0
  19. package/dist/middleware/body-limit.d.ts.map +1 -0
  20. package/dist/middleware/body-limit.js +16 -0
  21. package/dist/middleware/body-limit.js.map +1 -0
  22. package/dist/middleware/compress.cjs +10 -0
  23. package/dist/middleware/compress.d.cts +8 -0
  24. package/dist/middleware/compress.d.cts.map +1 -0
  25. package/dist/middleware/compress.d.ts +8 -0
  26. package/dist/middleware/compress.d.ts.map +1 -0
  27. package/dist/middleware/compress.js +10 -0
  28. package/dist/middleware/compress.js.map +1 -0
  29. package/dist/middleware/cookie.cjs +87 -0
  30. package/dist/middleware/cookie.d.cts +26 -0
  31. package/dist/middleware/cookie.d.cts.map +1 -0
  32. package/dist/middleware/cookie.d.ts +26 -0
  33. package/dist/middleware/cookie.d.ts.map +1 -0
  34. package/dist/middleware/cookie.js +87 -0
  35. package/dist/middleware/cookie.js.map +1 -0
  36. package/dist/middleware/cors.cjs +9 -0
  37. package/dist/middleware/cors.d.cts +7 -0
  38. package/dist/middleware/cors.d.cts.map +1 -0
  39. package/dist/middleware/cors.d.ts +7 -0
  40. package/dist/middleware/cors.d.ts.map +1 -0
  41. package/dist/middleware/cors.js +10 -0
  42. package/dist/middleware/cors.js.map +1 -0
  43. package/dist/middleware/csrf.cjs +9 -0
  44. package/dist/middleware/csrf.d.cts +7 -0
  45. package/dist/middleware/csrf.d.cts.map +1 -0
  46. package/dist/middleware/csrf.d.ts +7 -0
  47. package/dist/middleware/csrf.d.ts.map +1 -0
  48. package/dist/middleware/csrf.js +10 -0
  49. package/dist/middleware/csrf.js.map +1 -0
  50. package/dist/middleware/etag.cjs +10 -0
  51. package/dist/middleware/etag.d.cts +8 -0
  52. package/dist/middleware/etag.d.cts.map +1 -0
  53. package/dist/middleware/etag.d.ts +8 -0
  54. package/dist/middleware/etag.d.ts.map +1 -0
  55. package/dist/middleware/etag.js +10 -0
  56. package/dist/middleware/etag.js.map +1 -0
  57. package/dist/middleware/index.cjs +39 -0
  58. package/dist/middleware/index.d.cts +11 -0
  59. package/dist/middleware/index.d.ts +11 -0
  60. package/dist/middleware/index.js +11 -0
  61. package/dist/middleware/jwk.cjs +12 -0
  62. package/dist/middleware/jwk.d.cts +9 -0
  63. package/dist/middleware/jwk.d.cts.map +1 -0
  64. package/dist/middleware/jwk.d.ts +9 -0
  65. package/dist/middleware/jwk.d.ts.map +1 -0
  66. package/dist/middleware/jwk.js +13 -0
  67. package/dist/middleware/jwk.js.map +1 -0
  68. package/dist/middleware/jwt.cjs +21 -0
  69. package/dist/middleware/jwt.d.cts +13 -0
  70. package/dist/middleware/jwt.d.cts.map +1 -0
  71. package/dist/middleware/jwt.d.ts +13 -0
  72. package/dist/middleware/jwt.d.ts.map +1 -0
  73. package/dist/middleware/jwt.js +17 -0
  74. package/dist/middleware/jwt.js.map +1 -0
  75. package/dist/middleware/secure-headers.cjs +10 -0
  76. package/dist/middleware/secure-headers.d.cts +8 -0
  77. package/dist/middleware/secure-headers.d.cts.map +1 -0
  78. package/dist/middleware/secure-headers.d.ts +8 -0
  79. package/dist/middleware/secure-headers.d.ts.map +1 -0
  80. package/dist/middleware/secure-headers.js +10 -0
  81. package/dist/middleware/secure-headers.js.map +1 -0
  82. package/dist/middleware/timing.cjs +13 -0
  83. package/dist/middleware/timing.d.cts +8 -0
  84. package/dist/middleware/timing.d.cts.map +1 -0
  85. package/dist/middleware/timing.d.ts +8 -0
  86. package/dist/middleware/timing.d.ts.map +1 -0
  87. package/dist/middleware/timing.js +10 -0
  88. package/dist/middleware/timing.js.map +1 -0
  89. package/dist/reply.cjs +128 -0
  90. package/dist/reply.d.cts +2 -0
  91. package/dist/reply.d.ts +2 -0
  92. package/dist/reply.js +2 -0
  93. package/dist/stream.cjs +32 -0
  94. package/dist/stream.d.cts +2 -0
  95. package/dist/stream.d.ts +2 -0
  96. package/dist/stream.js +2 -0
  97. package/dist/types-BjPmu9B-.d.cts +294 -0
  98. package/dist/types-BjPmu9B-.d.cts.map +1 -0
  99. package/dist/types-COZ0UN-A.d.ts +294 -0
  100. package/dist/types-COZ0UN-A.d.ts.map +1 -0
  101. package/package.json +49 -107
  102. package/src/builder.ts +755 -0
  103. package/src/context.ts +11 -0
  104. package/src/hono.ts +75 -0
  105. package/src/index.ts +67 -49
  106. package/src/middleware/body-limit.ts +17 -5
  107. package/src/middleware/compress.ts +7 -6
  108. package/src/middleware/cookie.ts +128 -0
  109. package/src/middleware/cors.ts +5 -6
  110. package/src/middleware/csrf.ts +5 -6
  111. package/src/middleware/etag.ts +7 -6
  112. package/src/middleware/index.ts +35 -0
  113. package/src/middleware/jwk.ts +12 -46
  114. package/src/middleware/jwt.ts +21 -26
  115. package/src/middleware/secure-headers.ts +7 -6
  116. package/src/middleware/timing.ts +9 -6
  117. package/src/reply.ts +26 -1
  118. package/src/stream.ts +10 -1
  119. package/src/taser.ts +55 -0
  120. package/src/types.ts +810 -0
  121. package/dist/cjs/builder/app.cjs +0 -27
  122. package/dist/cjs/builder/app.cjs.map +0 -1
  123. package/dist/cjs/builder/app.d.cts +0 -11
  124. package/dist/cjs/builder/constants.cjs +0 -11
  125. package/dist/cjs/builder/constants.cjs.map +0 -1
  126. package/dist/cjs/builder/constants.d.cts +0 -3
  127. package/dist/cjs/builder/middleware-unit.cjs +0 -64
  128. package/dist/cjs/builder/middleware-unit.cjs.map +0 -1
  129. package/dist/cjs/builder/middleware-unit.d.cts +0 -34
  130. package/dist/cjs/builder/middleware.cjs +0 -20
  131. package/dist/cjs/builder/middleware.cjs.map +0 -1
  132. package/dist/cjs/builder/middleware.d.cts +0 -2
  133. package/dist/cjs/builder/normalize.cjs +0 -10
  134. package/dist/cjs/builder/normalize.cjs.map +0 -1
  135. package/dist/cjs/builder/normalize.d.cts +0 -2
  136. package/dist/cjs/builder/route.cjs +0 -83
  137. package/dist/cjs/builder/route.cjs.map +0 -1
  138. package/dist/cjs/builder/route.d.cts +0 -4
  139. package/dist/cjs/builder/router.cjs +0 -88
  140. package/dist/cjs/builder/router.cjs.map +0 -1
  141. package/dist/cjs/builder/router.d.cts +0 -26
  142. package/dist/cjs/builder/standalone.cjs +0 -30
  143. package/dist/cjs/builder/standalone.cjs.map +0 -1
  144. package/dist/cjs/builder/standalone.d.cts +0 -23
  145. package/dist/cjs/context/create-context.cjs +0 -8
  146. package/dist/cjs/context/create-context.cjs.map +0 -1
  147. package/dist/cjs/context/create-context.d.cts +0 -5
  148. package/dist/cjs/define/middleware.cjs +0 -22
  149. package/dist/cjs/define/middleware.cjs.map +0 -1
  150. package/dist/cjs/define/middleware.d.cts +0 -45
  151. package/dist/cjs/define/validators.cjs +0 -14
  152. package/dist/cjs/define/validators.cjs.map +0 -1
  153. package/dist/cjs/define/validators.d.cts +0 -8
  154. package/dist/cjs/index.cjs +0 -26
  155. package/dist/cjs/index.d.cts +0 -17
  156. package/dist/cjs/middleware/body-limit.cjs +0 -12
  157. package/dist/cjs/middleware/body-limit.cjs.map +0 -1
  158. package/dist/cjs/middleware/body-limit.d.cts +0 -3
  159. package/dist/cjs/middleware/compress.cjs +0 -12
  160. package/dist/cjs/middleware/compress.cjs.map +0 -1
  161. package/dist/cjs/middleware/compress.d.cts +0 -3
  162. package/dist/cjs/middleware/cors.cjs +0 -12
  163. package/dist/cjs/middleware/cors.cjs.map +0 -1
  164. package/dist/cjs/middleware/cors.d.cts +0 -3
  165. package/dist/cjs/middleware/csrf.cjs +0 -12
  166. package/dist/cjs/middleware/csrf.cjs.map +0 -1
  167. package/dist/cjs/middleware/csrf.d.cts +0 -3
  168. package/dist/cjs/middleware/etag.cjs +0 -12
  169. package/dist/cjs/middleware/etag.cjs.map +0 -1
  170. package/dist/cjs/middleware/etag.d.cts +0 -3
  171. package/dist/cjs/middleware/hono-mw.cjs +0 -23
  172. package/dist/cjs/middleware/hono-mw.cjs.map +0 -1
  173. package/dist/cjs/middleware/hono-mw.d.cts +0 -17
  174. package/dist/cjs/middleware/jwk.cjs +0 -30
  175. package/dist/cjs/middleware/jwk.cjs.map +0 -1
  176. package/dist/cjs/middleware/jwk.d.cts +0 -14
  177. package/dist/cjs/middleware/jwt.cjs +0 -20
  178. package/dist/cjs/middleware/jwt.cjs.map +0 -1
  179. package/dist/cjs/middleware/jwt.d.cts +0 -12
  180. package/dist/cjs/middleware/secure-headers.cjs +0 -12
  181. package/dist/cjs/middleware/secure-headers.cjs.map +0 -1
  182. package/dist/cjs/middleware/secure-headers.d.cts +0 -3
  183. package/dist/cjs/middleware/timing.cjs +0 -12
  184. package/dist/cjs/middleware/timing.cjs.map +0 -1
  185. package/dist/cjs/middleware/timing.d.cts +0 -3
  186. package/dist/cjs/reply.cjs +0 -9
  187. package/dist/cjs/reply.d.cts +0 -1
  188. package/dist/cjs/stream.cjs +0 -9
  189. package/dist/cjs/stream.d.cts +0 -1
  190. package/dist/cjs/types/app.d.cts +0 -29
  191. package/dist/cjs/types/index.d.cts +0 -297
  192. package/dist/cjs/types/returns.d.cts +0 -34
  193. package/dist/cjs/types/schema.d.cts +0 -14
  194. package/dist/cjs/types/type-utils.d.cts +0 -50
  195. package/dist/cjs/types/units.d.cts +0 -71
  196. package/dist/esm/builder/app.d.ts +0 -11
  197. package/dist/esm/builder/app.js +0 -26
  198. package/dist/esm/builder/app.js.map +0 -1
  199. package/dist/esm/builder/constants.d.ts +0 -3
  200. package/dist/esm/builder/constants.js +0 -11
  201. package/dist/esm/builder/constants.js.map +0 -1
  202. package/dist/esm/builder/middleware-unit.d.ts +0 -34
  203. package/dist/esm/builder/middleware-unit.js +0 -64
  204. package/dist/esm/builder/middleware-unit.js.map +0 -1
  205. package/dist/esm/builder/middleware.d.ts +0 -2
  206. package/dist/esm/builder/middleware.js +0 -20
  207. package/dist/esm/builder/middleware.js.map +0 -1
  208. package/dist/esm/builder/normalize.d.ts +0 -2
  209. package/dist/esm/builder/normalize.js +0 -10
  210. package/dist/esm/builder/normalize.js.map +0 -1
  211. package/dist/esm/builder/route.d.ts +0 -4
  212. package/dist/esm/builder/route.js +0 -83
  213. package/dist/esm/builder/route.js.map +0 -1
  214. package/dist/esm/builder/router.d.ts +0 -26
  215. package/dist/esm/builder/router.js +0 -87
  216. package/dist/esm/builder/router.js.map +0 -1
  217. package/dist/esm/builder/standalone.d.ts +0 -23
  218. package/dist/esm/builder/standalone.js +0 -29
  219. package/dist/esm/builder/standalone.js.map +0 -1
  220. package/dist/esm/context/create-context.d.ts +0 -5
  221. package/dist/esm/context/create-context.js +0 -8
  222. package/dist/esm/context/create-context.js.map +0 -1
  223. package/dist/esm/define/middleware.d.ts +0 -45
  224. package/dist/esm/define/middleware.js +0 -22
  225. package/dist/esm/define/middleware.js.map +0 -1
  226. package/dist/esm/define/validators.d.ts +0 -8
  227. package/dist/esm/define/validators.js +0 -14
  228. package/dist/esm/define/validators.js.map +0 -1
  229. package/dist/esm/index.d.ts +0 -17
  230. package/dist/esm/index.js +0 -7
  231. package/dist/esm/middleware/body-limit.d.ts +0 -3
  232. package/dist/esm/middleware/body-limit.js +0 -11
  233. package/dist/esm/middleware/body-limit.js.map +0 -1
  234. package/dist/esm/middleware/compress.d.ts +0 -3
  235. package/dist/esm/middleware/compress.js +0 -11
  236. package/dist/esm/middleware/compress.js.map +0 -1
  237. package/dist/esm/middleware/cors.d.ts +0 -3
  238. package/dist/esm/middleware/cors.js +0 -11
  239. package/dist/esm/middleware/cors.js.map +0 -1
  240. package/dist/esm/middleware/csrf.d.ts +0 -3
  241. package/dist/esm/middleware/csrf.js +0 -11
  242. package/dist/esm/middleware/csrf.js.map +0 -1
  243. package/dist/esm/middleware/etag.d.ts +0 -3
  244. package/dist/esm/middleware/etag.js +0 -11
  245. package/dist/esm/middleware/etag.js.map +0 -1
  246. package/dist/esm/middleware/hono-mw.d.ts +0 -17
  247. package/dist/esm/middleware/hono-mw.js +0 -23
  248. package/dist/esm/middleware/hono-mw.js.map +0 -1
  249. package/dist/esm/middleware/jwk.d.ts +0 -14
  250. package/dist/esm/middleware/jwk.js +0 -29
  251. package/dist/esm/middleware/jwk.js.map +0 -1
  252. package/dist/esm/middleware/jwt.d.ts +0 -12
  253. package/dist/esm/middleware/jwt.js +0 -19
  254. package/dist/esm/middleware/jwt.js.map +0 -1
  255. package/dist/esm/middleware/secure-headers.d.ts +0 -3
  256. package/dist/esm/middleware/secure-headers.js +0 -11
  257. package/dist/esm/middleware/secure-headers.js.map +0 -1
  258. package/dist/esm/middleware/timing.d.ts +0 -3
  259. package/dist/esm/middleware/timing.js +0 -11
  260. package/dist/esm/middleware/timing.js.map +0 -1
  261. package/dist/esm/reply.d.ts +0 -1
  262. package/dist/esm/reply.js +0 -1
  263. package/dist/esm/stream.d.ts +0 -1
  264. package/dist/esm/stream.js +0 -1
  265. package/dist/esm/types/app.d.ts +0 -29
  266. package/dist/esm/types/index.d.ts +0 -297
  267. package/dist/esm/types/returns.d.ts +0 -34
  268. package/dist/esm/types/schema.d.ts +0 -14
  269. package/dist/esm/types/type-utils.d.ts +0 -50
  270. package/dist/esm/types/units.d.ts +0 -71
  271. package/src/builder/app.ts +0 -39
  272. package/src/builder/constants.ts +0 -4
  273. package/src/builder/middleware-unit.ts +0 -71
  274. package/src/builder/middleware.ts +0 -23
  275. package/src/builder/normalize.ts +0 -13
  276. package/src/builder/route.ts +0 -137
  277. package/src/builder/router.ts +0 -144
  278. package/src/builder/standalone.ts +0 -79
  279. package/src/context/create-context.ts +0 -19
  280. package/src/define/middleware.ts +0 -214
  281. package/src/define/validators.ts +0 -22
  282. package/src/middleware/hono-mw.ts +0 -27
  283. package/src/types/app.ts +0 -48
  284. package/src/types/index.ts +0 -801
  285. package/src/types/returns.ts +0 -61
  286. package/src/types/schema.ts +0 -21
  287. package/src/types/type-utils.ts +0 -90
  288. package/src/types/units.ts +0 -314
package/src/builder.ts ADDED
@@ -0,0 +1,755 @@
1
+ import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+ import { hono } from "./hono.js";
3
+ import { defineTaser } from "./taser.js";
4
+ import type {
5
+ BodyMode,
6
+ ExtractBodyFromMiddleware,
7
+ ExtractLayoutIdFromMiddleware,
8
+ ExtractParamsFromMiddleware,
9
+ ExtractPreconditionsFromMiddleware,
10
+ ExtractQueryFromMiddleware,
11
+ HttpMethod,
12
+ HttpNoBodyMethod,
13
+ InferEffectiveBody,
14
+ InferEffectiveParams,
15
+ InferEffectiveQuery,
16
+ InferLayoutBody,
17
+ InferLayoutBranchParams,
18
+ InferLayoutBranchServices,
19
+ InferLayoutBranchState,
20
+ InferLayoutParams,
21
+ InferLayoutQuery,
22
+ InferLayoutServices,
23
+ InferLayoutState,
24
+ InferMiddlewareArgs,
25
+ InferReturnsResponse,
26
+ InferRouteServices,
27
+ InferRouteState,
28
+ InferServicesFromMw,
29
+ InferStateFromMw,
30
+ LayoutDefinition,
31
+ MiddlewareArgs,
32
+ MiddlewareDefinition,
33
+ MiddlewareHandler,
34
+ MiddlewarePreconditions,
35
+ MiddlewareResponse,
36
+ NextFunction,
37
+ Overwrite,
38
+ RegisteredRoutePath,
39
+ RegisteredLayoutId,
40
+ RouteDefaultParams,
41
+ RouteDefinition,
42
+ RouteHandler,
43
+ RouteSchemas,
44
+ StatusCode,
45
+ ValidateLayoutMiddlewareUse,
46
+ ValidateRouteMiddlewareUse,
47
+ } from "./types.js";
48
+
49
+ export function toMiddlewareDefinition<TMw>(
50
+ input: TMw,
51
+ ): TMw extends MiddlewareDefinition<any, any, any, any, any, any, any>
52
+ ? TMw
53
+ : MiddlewareDefinition<
54
+ InferServicesFromMw<TMw>,
55
+ InferStateFromMw<TMw>,
56
+ ExtractParamsFromMiddleware<TMw>,
57
+ ExtractQueryFromMiddleware<TMw>,
58
+ ExtractBodyFromMiddleware<TMw>,
59
+ ExtractLayoutIdFromMiddleware<TMw>,
60
+ ExtractPreconditionsFromMiddleware<TMw>
61
+ > {
62
+ if (typeof input === "function") {
63
+ return {
64
+ kind: "middleware",
65
+ handler: input as MiddlewareHandler,
66
+ } as any;
67
+ }
68
+ return input as any;
69
+ }
70
+
71
+ export class MiddlewareBuilder<
72
+ TParams = unknown,
73
+ TQuery = unknown,
74
+ TBody = unknown,
75
+ TServices = {},
76
+ TState = {},
77
+ TLayoutId extends string | undefined = undefined,
78
+ TRequires extends MiddlewarePreconditions = {},
79
+ > implements MiddlewareDefinition<TServices, TState, TParams, TQuery, TBody, TLayoutId, TRequires> {
80
+ public readonly kind = "middleware" as const;
81
+ public readonly schemas: RouteSchemas = {};
82
+ public readonly layoutId?: string | undefined;
83
+
84
+ readonly _services?: TServices;
85
+ readonly _state?: TState;
86
+ readonly _params?: TParams;
87
+ readonly _query?: TQuery;
88
+ readonly _body?: TBody;
89
+ readonly _layoutId?: TLayoutId;
90
+ readonly _requires?: TRequires;
91
+
92
+ constructor(layoutId?: string | undefined) {
93
+ this.layoutId = layoutId;
94
+ this.handler = this.handler.bind(this);
95
+ }
96
+
97
+ requires<TPreconditions extends MiddlewarePreconditions>(): MiddlewareBuilder<
98
+ TParams,
99
+ TQuery,
100
+ TBody,
101
+ TServices,
102
+ TState,
103
+ TLayoutId,
104
+ TRequires & TPreconditions
105
+ > {
106
+ return this as unknown as MiddlewareBuilder<
107
+ TParams,
108
+ TQuery,
109
+ TBody,
110
+ TServices,
111
+ TState,
112
+ TLayoutId,
113
+ TRequires & TPreconditions
114
+ >;
115
+ }
116
+
117
+ params<TSchema extends StandardSchemaV1>(
118
+ schema: TSchema,
119
+ ): MiddlewareBuilder<
120
+ StandardSchemaV1.InferOutput<TSchema>,
121
+ TQuery,
122
+ TBody,
123
+ TServices,
124
+ TState,
125
+ TLayoutId,
126
+ TRequires
127
+ > {
128
+ this.schemas.params = schema;
129
+ return this as unknown as MiddlewareBuilder<
130
+ StandardSchemaV1.InferOutput<TSchema>,
131
+ TQuery,
132
+ TBody,
133
+ TServices,
134
+ TState,
135
+ TLayoutId,
136
+ TRequires
137
+ >;
138
+ }
139
+
140
+ query<TSchema extends StandardSchemaV1>(
141
+ schema: TSchema,
142
+ ): MiddlewareBuilder<
143
+ TParams,
144
+ StandardSchemaV1.InferOutput<TSchema>,
145
+ TBody,
146
+ TServices,
147
+ TState,
148
+ TLayoutId,
149
+ TRequires
150
+ > {
151
+ this.schemas.query = schema;
152
+ return this as unknown as MiddlewareBuilder<
153
+ TParams,
154
+ StandardSchemaV1.InferOutput<TSchema>,
155
+ TBody,
156
+ TServices,
157
+ TState,
158
+ TLayoutId,
159
+ TRequires
160
+ >;
161
+ }
162
+
163
+ body<TSchema extends StandardSchemaV1>(
164
+ schema: TSchema,
165
+ mode?: BodyMode,
166
+ ): MiddlewareBuilder<
167
+ TParams,
168
+ TQuery,
169
+ StandardSchemaV1.InferOutput<TSchema>,
170
+ TServices,
171
+ TState,
172
+ TLayoutId,
173
+ TRequires
174
+ > {
175
+ this.schemas.body = { schema, mode };
176
+ return this as unknown as MiddlewareBuilder<
177
+ TParams,
178
+ TQuery,
179
+ StandardSchemaV1.InferOutput<TSchema>,
180
+ TServices,
181
+ TState,
182
+ TLayoutId,
183
+ TRequires
184
+ >;
185
+ }
186
+
187
+ handler(
188
+ args: MiddlewareArgs<any, any, any, any, any>,
189
+ next: NextFunction,
190
+ ):
191
+ | Response
192
+ | Promise<Response>
193
+ | MiddlewareResponse<any, any>
194
+ | Promise<MiddlewareResponse<any, any>>;
195
+ handler<
196
+ F extends (
197
+ args: InferMiddlewareArgs<TLayoutId, TParams, TQuery, TBody, TRequires>,
198
+ next: NextFunction,
199
+ ) => any,
200
+ >(
201
+ fn: F,
202
+ ): MiddlewareDefinition<
203
+ InferServicesFromMw<F>,
204
+ InferStateFromMw<F>,
205
+ TParams,
206
+ TQuery,
207
+ TBody,
208
+ TLayoutId,
209
+ TRequires
210
+ >;
211
+ handler(arg1?: any, arg2?: any): any {
212
+ if (typeof arg1 === "function" && arg2 === undefined) {
213
+ return {
214
+ kind: "middleware",
215
+ layoutId: this.layoutId,
216
+ handler: arg1 as unknown as MiddlewareHandler,
217
+ schemas: Object.keys(this.schemas).length > 0 ? { ...this.schemas } : undefined,
218
+ };
219
+ }
220
+ if (typeof arg2 === "function") {
221
+ return Promise.resolve(arg2());
222
+ }
223
+ return async (_args: any, next: NextFunction) => next();
224
+ }
225
+ }
226
+
227
+ export function middleware<
228
+ TLayoutId extends RegisteredLayoutId,
229
+ F extends (
230
+ args: MiddlewareArgs<
231
+ InferLayoutBranchServices<TLayoutId>,
232
+ InferLayoutBranchState<TLayoutId>,
233
+ InferLayoutBranchParams<TLayoutId>
234
+ >,
235
+ next: NextFunction,
236
+ ) => any,
237
+ >(
238
+ layoutId: TLayoutId,
239
+ fn: F,
240
+ ): MiddlewareDefinition<
241
+ InferServicesFromMw<F>,
242
+ InferStateFromMw<F>,
243
+ InferLayoutBranchParams<TLayoutId>,
244
+ unknown,
245
+ unknown,
246
+ TLayoutId,
247
+ {}
248
+ >;
249
+ export function middleware<TLayoutId extends RegisteredLayoutId>(
250
+ layoutId: TLayoutId,
251
+ ): MiddlewareBuilder<InferLayoutBranchParams<TLayoutId>, unknown, unknown, {}, {}, TLayoutId, {}>;
252
+ export function middleware<F extends (args: MiddlewareArgs<{}, {}>, next: NextFunction) => any>(
253
+ fn: F,
254
+ ): MiddlewareDefinition<
255
+ InferServicesFromMw<F>,
256
+ InferStateFromMw<F>,
257
+ unknown,
258
+ unknown,
259
+ unknown,
260
+ undefined,
261
+ {}
262
+ >;
263
+ export function middleware(): MiddlewareBuilder<unknown, unknown, unknown, {}, {}, undefined, {}>;
264
+ export function middleware(
265
+ arg1?: any,
266
+ arg2?: any,
267
+ ):
268
+ | MiddlewareBuilder<any, any, any, any, any, any, any>
269
+ | MiddlewareDefinition<any, any, any, any, any, any, any> {
270
+ if (typeof arg1 === "string") {
271
+ if (typeof arg2 === "function") {
272
+ return {
273
+ kind: "middleware",
274
+ layoutId: arg1,
275
+ handler: arg2 as MiddlewareHandler,
276
+ };
277
+ }
278
+ return new MiddlewareBuilder(arg1);
279
+ }
280
+ if (typeof arg1 === "function") {
281
+ return {
282
+ kind: "middleware",
283
+ handler: arg1 as MiddlewareHandler,
284
+ };
285
+ }
286
+ return new MiddlewareBuilder();
287
+ }
288
+
289
+ export class LayoutBuilder<
290
+ TPath extends string = string,
291
+ TParams = RouteDefaultParams<TPath>,
292
+ TServices = {},
293
+ TState = {},
294
+ TQuery = {},
295
+ TBody = {},
296
+ > implements LayoutDefinition<TPath, TServices, TState, TParams, TQuery, TBody> {
297
+ readonly kind = "layout" as const;
298
+ public readonly path: TPath;
299
+ public readonly middlewares: MiddlewareDefinition<any, any, any, any, any>[] = [];
300
+
301
+ readonly _services?: TServices;
302
+ readonly _state?: TState;
303
+ readonly _params?: TParams;
304
+ readonly _query?: TQuery;
305
+ readonly _body?: TBody;
306
+
307
+ public readonly schemas: RouteSchemas = {};
308
+
309
+ constructor(path: TPath) {
310
+ this.path = path;
311
+ }
312
+
313
+ private pushSchemaMiddleware(schemas: RouteSchemas): void {
314
+ this.middlewares.push({
315
+ kind: "middleware",
316
+ handler: async (_args, next) => next(),
317
+ schemas,
318
+ });
319
+ }
320
+
321
+ params<TSchema extends StandardSchemaV1>(
322
+ schema: TSchema,
323
+ ): LayoutBuilder<
324
+ TPath,
325
+ Overwrite<TParams, StandardSchemaV1.InferOutput<TSchema>>,
326
+ TServices,
327
+ TState,
328
+ TQuery,
329
+ TBody
330
+ > {
331
+ this.schemas.params = schema;
332
+ this.pushSchemaMiddleware({ params: schema });
333
+ return this as unknown as LayoutBuilder<
334
+ TPath,
335
+ Overwrite<TParams, StandardSchemaV1.InferOutput<TSchema>>,
336
+ TServices,
337
+ TState,
338
+ TQuery,
339
+ TBody
340
+ >;
341
+ }
342
+
343
+ query<TSchema extends StandardSchemaV1>(
344
+ schema: TSchema,
345
+ ): LayoutBuilder<
346
+ TPath,
347
+ TParams,
348
+ TServices,
349
+ TState,
350
+ StandardSchemaV1.InferOutput<TSchema>,
351
+ TBody
352
+ > {
353
+ this.schemas.query = schema;
354
+ this.pushSchemaMiddleware({ query: schema });
355
+ return this as unknown as LayoutBuilder<
356
+ TPath,
357
+ TParams,
358
+ TServices,
359
+ TState,
360
+ StandardSchemaV1.InferOutput<TSchema>,
361
+ TBody
362
+ >;
363
+ }
364
+
365
+ body<TSchema extends StandardSchemaV1>(
366
+ schema: TSchema,
367
+ mode?: BodyMode,
368
+ ): LayoutBuilder<
369
+ TPath,
370
+ TParams,
371
+ TServices,
372
+ TState,
373
+ TQuery,
374
+ StandardSchemaV1.InferOutput<TSchema>
375
+ > {
376
+ this.schemas.body = { schema, mode };
377
+ this.pushSchemaMiddleware({ body: { schema, mode } });
378
+ return this as unknown as LayoutBuilder<
379
+ TPath,
380
+ TParams,
381
+ TServices,
382
+ TState,
383
+ TQuery,
384
+ StandardSchemaV1.InferOutput<TSchema>
385
+ >;
386
+ }
387
+
388
+ use<
389
+ TMw extends
390
+ | MiddlewareDefinition<any, any, any, any, any, any, any>
391
+ | ((
392
+ args: MiddlewareArgs<
393
+ InferLayoutServices<TPath> & TServices,
394
+ InferLayoutState<TPath> & TState,
395
+ [keyof InferLayoutParams<TPath>] extends [never]
396
+ ? TParams
397
+ : Overwrite<InferLayoutParams<TPath>, TParams>,
398
+ Overwrite<InferLayoutQuery<TPath>, TQuery>,
399
+ Overwrite<InferLayoutBody<TPath>, TBody>
400
+ >,
401
+ next: NextFunction,
402
+ ) => any),
403
+ >(
404
+ middleware: ValidateLayoutMiddlewareUse<
405
+ TPath,
406
+ [keyof InferLayoutParams<TPath>] extends [never]
407
+ ? TParams
408
+ : Overwrite<InferLayoutParams<TPath>, TParams>,
409
+ Overwrite<InferLayoutQuery<TPath>, TQuery>,
410
+ Overwrite<InferLayoutBody<TPath>, TBody>,
411
+ TServices,
412
+ TState,
413
+ TMw
414
+ >,
415
+ ): LayoutBuilder<
416
+ TPath,
417
+ Overwrite<TParams, ExtractParamsFromMiddleware<TMw>>,
418
+ TServices & InferServicesFromMw<TMw>,
419
+ TState & InferStateFromMw<TMw>,
420
+ Overwrite<TQuery, ExtractQueryFromMiddleware<TMw>>,
421
+ Overwrite<TBody, ExtractBodyFromMiddleware<TMw>>
422
+ > {
423
+ this.middlewares.push(toMiddlewareDefinition(middleware));
424
+ return this as unknown as LayoutBuilder<
425
+ TPath,
426
+ Overwrite<TParams, ExtractParamsFromMiddleware<TMw>>,
427
+ TServices & InferServicesFromMw<TMw>,
428
+ TState & InferStateFromMw<TMw>,
429
+ Overwrite<TQuery, ExtractQueryFromMiddleware<TMw>>,
430
+ Overwrite<TBody, ExtractBodyFromMiddleware<TMw>>
431
+ >;
432
+ }
433
+ }
434
+
435
+ export function layout<TPath extends string>(
436
+ path: TPath,
437
+ ): LayoutBuilder<TPath, RouteDefaultParams<TPath>> {
438
+ return new LayoutBuilder<TPath, RouteDefaultParams<TPath>>(path);
439
+ }
440
+
441
+ export class RouteValidationBuilder<
442
+ TMethod extends HttpMethod = HttpMethod,
443
+ TPath extends string = string,
444
+ TParams = RouteDefaultParams<TPath>,
445
+ TQuery = {},
446
+ TBody = [TMethod] extends [HttpNoBodyMethod] ? never : {},
447
+ TRouteServices = {},
448
+ TRouteState = {},
449
+ TReturns = undefined,
450
+ TParamsIn = TParams,
451
+ TQueryIn = TQuery,
452
+ TBodyIn = TBody,
453
+ > {
454
+ public readonly middlewares: MiddlewareDefinition<any, any, any, any, any, any, any>[] = [];
455
+ public readonly schemas: RouteSchemas = {};
456
+
457
+ constructor(
458
+ public readonly method: TMethod,
459
+ public readonly path: TPath,
460
+ public readonly methods?: readonly string[] | undefined,
461
+ ) {}
462
+
463
+ params<TSchema extends StandardSchemaV1>(
464
+ schema: TSchema,
465
+ ): RouteValidationBuilder<
466
+ TMethod,
467
+ TPath,
468
+ StandardSchemaV1.InferOutput<TSchema>,
469
+ TQuery,
470
+ TBody,
471
+ TRouteServices,
472
+ TRouteState,
473
+ TReturns,
474
+ StandardSchemaV1.InferInput<TSchema>,
475
+ TQueryIn,
476
+ TBodyIn
477
+ > {
478
+ this.schemas.params = schema;
479
+ return this as unknown as RouteValidationBuilder<
480
+ TMethod,
481
+ TPath,
482
+ StandardSchemaV1.InferOutput<TSchema>,
483
+ TQuery,
484
+ TBody,
485
+ TRouteServices,
486
+ TRouteState,
487
+ TReturns,
488
+ StandardSchemaV1.InferInput<TSchema>,
489
+ TQueryIn,
490
+ TBodyIn
491
+ >;
492
+ }
493
+
494
+ query<TSchema extends StandardSchemaV1>(
495
+ schema: TSchema,
496
+ ): RouteValidationBuilder<
497
+ TMethod,
498
+ TPath,
499
+ TParams,
500
+ StandardSchemaV1.InferOutput<TSchema>,
501
+ TBody,
502
+ TRouteServices,
503
+ TRouteState,
504
+ TReturns,
505
+ TParamsIn,
506
+ StandardSchemaV1.InferInput<TSchema>,
507
+ TBodyIn
508
+ > {
509
+ this.schemas.query = schema;
510
+ return this as unknown as RouteValidationBuilder<
511
+ TMethod,
512
+ TPath,
513
+ TParams,
514
+ StandardSchemaV1.InferOutput<TSchema>,
515
+ TBody,
516
+ TRouteServices,
517
+ TRouteState,
518
+ TReturns,
519
+ TParamsIn,
520
+ StandardSchemaV1.InferInput<TSchema>,
521
+ TBodyIn
522
+ >;
523
+ }
524
+
525
+ body<TSchema extends StandardSchemaV1>(
526
+ this: [TMethod] extends [HttpNoBodyMethod] ? never : any,
527
+ schema: TSchema,
528
+ mode?: BodyMode,
529
+ ): RouteValidationBuilder<
530
+ TMethod,
531
+ TPath,
532
+ TParams,
533
+ TQuery,
534
+ StandardSchemaV1.InferOutput<TSchema>,
535
+ TRouteServices,
536
+ TRouteState,
537
+ TReturns,
538
+ TParamsIn,
539
+ TQueryIn,
540
+ StandardSchemaV1.InferInput<TSchema>
541
+ > {
542
+ (this as any).schemas.body = { schema, mode };
543
+ return this as unknown as RouteValidationBuilder<
544
+ TMethod,
545
+ TPath,
546
+ TParams,
547
+ TQuery,
548
+ StandardSchemaV1.InferOutput<TSchema>,
549
+ TRouteServices,
550
+ TRouteState,
551
+ TReturns,
552
+ TParamsIn,
553
+ TQueryIn,
554
+ StandardSchemaV1.InferInput<TSchema>
555
+ >;
556
+ }
557
+
558
+ returns<const TMap extends Record<StatusCode, StandardSchemaV1>>(
559
+ map: TMap,
560
+ ): RouteValidationBuilder<
561
+ TMethod,
562
+ TPath,
563
+ TParams,
564
+ TQuery,
565
+ TBody,
566
+ TRouteServices,
567
+ TRouteState,
568
+ TReturns extends Record<StatusCode, StandardSchemaV1> ? TReturns & TMap : TMap,
569
+ TParamsIn,
570
+ TQueryIn,
571
+ TBodyIn
572
+ > {
573
+ this.schemas.returns = { ...this.schemas.returns, ...map };
574
+ return this as unknown as RouteValidationBuilder<
575
+ TMethod,
576
+ TPath,
577
+ TParams,
578
+ TQuery,
579
+ TBody,
580
+ TRouteServices,
581
+ TRouteState,
582
+ TReturns extends Record<StatusCode, StandardSchemaV1> ? TReturns & TMap : TMap,
583
+ TParamsIn,
584
+ TQueryIn,
585
+ TBodyIn
586
+ >;
587
+ }
588
+
589
+ handler<
590
+ TReturn extends ([TReturns] extends [undefined]
591
+ ? any
592
+ : [TReturns] extends [never]
593
+ ? any
594
+ : unknown extends TReturns
595
+ ? any
596
+ : InferReturnsResponse<TReturns> | Promise<InferReturnsResponse<TReturns>>),
597
+ >(
598
+ fn: RouteHandler<
599
+ InferEffectiveParams<TPath, TMethod, TParams>,
600
+ InferEffectiveQuery<TPath, TMethod, TQuery>,
601
+ InferEffectiveBody<TPath, TMethod, TBody>,
602
+ InferRouteServices<TPath, TMethod> & TRouteServices,
603
+ InferRouteState<TPath, TMethod> & TRouteState,
604
+ TReturn
605
+ >,
606
+ ): RouteDefinition<
607
+ TPath,
608
+ TParams,
609
+ TQuery,
610
+ TBody,
611
+ TReturns,
612
+ TReturn,
613
+ TParamsIn,
614
+ TQueryIn,
615
+ TBodyIn
616
+ > {
617
+ return {
618
+ kind: "route",
619
+ method: this.method,
620
+ methods: this.methods,
621
+ path: this.path,
622
+ middlewares: [...this.middlewares],
623
+ handler: fn as RouteHandler<any, any, any, any, any>,
624
+ schemas: { ...this.schemas },
625
+ returns: this.schemas.returns ? { ...this.schemas.returns } : undefined,
626
+ } as unknown as RouteDefinition<
627
+ TPath,
628
+ TParams,
629
+ TQuery,
630
+ TBody,
631
+ TReturns,
632
+ TReturn,
633
+ TParamsIn,
634
+ TQueryIn,
635
+ TBodyIn
636
+ >;
637
+ }
638
+ }
639
+
640
+ export class RouteBuilder<
641
+ TMethod extends HttpMethod = HttpMethod,
642
+ TPath extends string = string,
643
+ TParams = RouteDefaultParams<TPath>,
644
+ TQuery = {},
645
+ TBody = [TMethod] extends [HttpNoBodyMethod] ? never : {},
646
+ TRouteServices = {},
647
+ TRouteState = {},
648
+ TReturns = undefined,
649
+ TParamsIn = TParams,
650
+ TQueryIn = TQuery,
651
+ TBodyIn = TBody,
652
+ > extends RouteValidationBuilder<
653
+ TMethod,
654
+ TPath,
655
+ TParams,
656
+ TQuery,
657
+ TBody,
658
+ TRouteServices,
659
+ TRouteState,
660
+ TReturns,
661
+ TParamsIn,
662
+ TQueryIn,
663
+ TBodyIn
664
+ > {
665
+ constructor(method: TMethod, path: TPath, methods?: readonly string[] | undefined) {
666
+ super(method, path, methods);
667
+ }
668
+
669
+ use<
670
+ TMw extends
671
+ | MiddlewareDefinition<any, any, any, any, any, any, any>
672
+ | ((
673
+ args: MiddlewareArgs<
674
+ InferRouteServices<TPath, TMethod> & TRouteServices,
675
+ InferRouteState<TPath, TMethod> & TRouteState,
676
+ InferEffectiveParams<TPath, TMethod, TParams>,
677
+ InferEffectiveQuery<TPath, TMethod, TQuery>,
678
+ InferEffectiveBody<TPath, TMethod, TBody>
679
+ >,
680
+ next: NextFunction,
681
+ ) => any),
682
+ >(
683
+ middleware: ValidateRouteMiddlewareUse<
684
+ TPath,
685
+ TMethod,
686
+ InferEffectiveParams<TPath, TMethod, TParams>,
687
+ InferEffectiveQuery<TPath, TMethod, TQuery>,
688
+ InferEffectiveBody<TPath, TMethod, TBody>,
689
+ TRouteServices,
690
+ TRouteState,
691
+ TMw
692
+ >,
693
+ ): RouteBuilder<
694
+ TMethod,
695
+ TPath,
696
+ Overwrite<TParams, ExtractParamsFromMiddleware<TMw>>,
697
+ Overwrite<TQuery, ExtractQueryFromMiddleware<TMw>>,
698
+ Overwrite<TBody, ExtractBodyFromMiddleware<TMw>>,
699
+ TRouteServices & InferServicesFromMw<TMw>,
700
+ TRouteState & InferStateFromMw<TMw>,
701
+ TReturns,
702
+ TParamsIn,
703
+ TQueryIn,
704
+ TBodyIn
705
+ > {
706
+ this.middlewares.push(toMiddlewareDefinition(middleware));
707
+ return this as unknown as RouteBuilder<
708
+ TMethod,
709
+ TPath,
710
+ Overwrite<TParams, ExtractParamsFromMiddleware<TMw>>,
711
+ Overwrite<TQuery, ExtractQueryFromMiddleware<TMw>>,
712
+ Overwrite<TBody, ExtractBodyFromMiddleware<TMw>>,
713
+ TRouteServices & InferServicesFromMw<TMw>,
714
+ TRouteState & InferStateFromMw<TMw>,
715
+ TReturns,
716
+ TParamsIn,
717
+ TQueryIn,
718
+ TBodyIn
719
+ >;
720
+ }
721
+ }
722
+
723
+ export const t = {
724
+ get: <TPath extends RegisteredRoutePath>(path: TPath) =>
725
+ new RouteBuilder<"GET", TPath>("GET", path),
726
+ post: <TPath extends RegisteredRoutePath>(path: TPath) =>
727
+ new RouteBuilder<"POST", TPath>("POST", path),
728
+ put: <TPath extends RegisteredRoutePath>(path: TPath) =>
729
+ new RouteBuilder<"PUT", TPath>("PUT", path),
730
+ delete: <TPath extends RegisteredRoutePath>(path: TPath) =>
731
+ new RouteBuilder<"DELETE", TPath>("DELETE", path),
732
+ patch: <TPath extends RegisteredRoutePath>(path: TPath) =>
733
+ new RouteBuilder<"PATCH", TPath>("PATCH", path),
734
+ options: <TPath extends RegisteredRoutePath>(path: TPath) =>
735
+ new RouteBuilder<"OPTIONS", TPath>("OPTIONS", path),
736
+ head: <TPath extends RegisteredRoutePath>(path: TPath) =>
737
+ new RouteBuilder<"HEAD", TPath>("HEAD", path),
738
+ query: <TPath extends RegisteredRoutePath>(path: TPath) =>
739
+ new RouteBuilder<"QUERY", TPath>("QUERY", path),
740
+ all: <TPath extends RegisteredRoutePath>(path: TPath) =>
741
+ new RouteBuilder<"ALL", TPath>("ALL", path),
742
+ any: <TPath extends RegisteredRoutePath, const TMethods extends readonly string[]>(
743
+ path: TPath,
744
+ methods: TMethods,
745
+ ) =>
746
+ new RouteBuilder<"ANY", TPath>(
747
+ "ANY",
748
+ path,
749
+ methods.map((m) => m.toUpperCase()),
750
+ ),
751
+ layout,
752
+ middleware,
753
+ hono,
754
+ app: defineTaser,
755
+ };