@taserjs/router 0.1.13 → 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/types.ts ADDED
@@ -0,0 +1,810 @@
1
+ import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+ import type { BodyMode, TypedResponse, ValidationFacet } from "@taserjs/utils";
3
+ import type { RequestHeader } from "hono/utils/headers";
4
+
5
+ export type { BodyMode, ValidationFacet, RequestHeader };
6
+ export type { StandardSchemaV1 };
7
+
8
+ export type HeaderKey = RequestHeader | (string & {});
9
+
10
+ export interface TaserHeaders extends Headers {
11
+ get(name: HeaderKey): string | null;
12
+ has(name: HeaderKey): boolean;
13
+ }
14
+
15
+ export type StatusCode = number;
16
+
17
+ export interface RouteBodySchema {
18
+ readonly schema: StandardSchemaV1;
19
+ readonly mode?: BodyMode | undefined;
20
+ }
21
+
22
+ export interface RouteSchemas {
23
+ params?: StandardSchemaV1 | undefined;
24
+ query?: StandardSchemaV1 | undefined;
25
+ body?: RouteBodySchema | undefined;
26
+ returns?: Record<StatusCode, StandardSchemaV1> | undefined;
27
+ }
28
+
29
+ export type StandardHttpMethod =
30
+ | "GET"
31
+ | "POST"
32
+ | "PUT"
33
+ | "DELETE"
34
+ | "PATCH"
35
+ | "OPTIONS"
36
+ | "HEAD"
37
+ | "QUERY";
38
+
39
+ export type HttpMethod = StandardHttpMethod | "ALL" | "ANY";
40
+ export type HttpNoBodyMethod = "GET" | "HEAD";
41
+
42
+ export type Simplify<T> = unknown extends T
43
+ ? T
44
+ : T extends (...args: any[]) => any
45
+ ? T
46
+ : T extends readonly any[]
47
+ ? T
48
+ : { [K in keyof T]: T[K] } & {};
49
+
50
+ type ExtractParamName<T extends string> = T extends `:${infer P}` ? P : never;
51
+
52
+ type ExtractPathSegments<T extends string> = T extends `/${infer Rest}`
53
+ ? ExtractPathSegments<Rest>
54
+ : T extends `${infer Segment}/${infer Rest}`
55
+ ? Segment | ExtractPathSegments<Rest>
56
+ : T extends ""
57
+ ? never
58
+ : T;
59
+
60
+ type HasWildcard<T extends string> = string extends T
61
+ ? false
62
+ : T extends `${string}*${string}`
63
+ ? true
64
+ : false;
65
+
66
+ type ParamsFromSegments<T extends string> = Simplify<{
67
+ [K in ExtractPathSegments<T> as ExtractParamName<K>]: string;
68
+ }>;
69
+
70
+ export type RouteDefaultParams<TPath extends string = string> = string extends TPath
71
+ ? Record<string, string>
72
+ : Simplify<
73
+ (HasWildcard<TPath> extends true ? { _splat: string } : {}) & ParamsFromSegments<TPath>
74
+ >;
75
+
76
+ export interface TaserRequest<TParams = {}, TQuery = {}, TBody = unknown> {
77
+ params: Simplify<TParams>;
78
+ query: Simplify<TQuery>;
79
+ headers: TaserHeaders;
80
+ method: string;
81
+ url: string;
82
+ path: string;
83
+ raw: Request;
84
+ body: TBody;
85
+ }
86
+
87
+ export interface RouterRegister {}
88
+
89
+ export type RegisteredRoutePath = RouterRegister extends { RoutePath: infer P extends string }
90
+ ? [P] extends [never]
91
+ ? string
92
+ : P
93
+ : string;
94
+
95
+ export type RegisteredLayoutId = RouterRegister extends { LayoutTree: infer LT }
96
+ ? [keyof LT] extends [never]
97
+ ? never
98
+ : keyof LT & string
99
+ : never;
100
+
101
+ export type InferredAppContext = RouterRegister extends { AppContext: infer C } ? C : {};
102
+
103
+ export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
104
+ k: infer I,
105
+ ) => void
106
+ ? I
107
+ : never;
108
+
109
+ export type SafeIntersect<U> = [U] extends [never] ? {} : Simplify<UnionToIntersection<U>>;
110
+
111
+ export type Overwrite<T, U> = unknown extends U
112
+ ? T
113
+ : [U] extends [never]
114
+ ? T
115
+ : Simplify<Omit<T, keyof U> & U>;
116
+
117
+ export type DistributeServices<T> = T extends { readonly _services?: infer S }
118
+ ? [S] extends [never]
119
+ ? {}
120
+ : NonNullable<S>
121
+ : {};
122
+
123
+ export type DistributeState<T> = T extends { readonly _state?: infer St }
124
+ ? [St] extends [never]
125
+ ? {}
126
+ : NonNullable<St>
127
+ : {};
128
+
129
+ export type InferServicesFromMw<T> = T extends (args: any, next: any) => infer R
130
+ ? DistributeServices<Awaited<R>>
131
+ : T extends { readonly _services?: infer S }
132
+ ? [S] extends [never]
133
+ ? {}
134
+ : NonNullable<S>
135
+ : {};
136
+
137
+ export type InferStateFromMw<T> = T extends (args: any, next: any) => infer R
138
+ ? DistributeState<Awaited<R>>
139
+ : T extends { readonly _state?: infer St }
140
+ ? [St] extends [never]
141
+ ? {}
142
+ : NonNullable<St>
143
+ : {};
144
+
145
+ export type ExtractServicesFromMiddleware<TMw> = TMw extends { readonly _services?: infer S }
146
+ ? NonNullable<S>
147
+ : TMw extends MiddlewareDefinition<infer S, any, any, any, any>
148
+ ? NonNullable<S>
149
+ : {};
150
+
151
+ export type ExtractStateFromMiddleware<TMw> = TMw extends { readonly _state?: infer St }
152
+ ? NonNullable<St>
153
+ : TMw extends MiddlewareDefinition<any, infer St, any, any, any>
154
+ ? NonNullable<St>
155
+ : {};
156
+
157
+ export type ExtractParamsFromMiddleware<TMw> = TMw extends { readonly _params?: infer P }
158
+ ? [P] extends [never]
159
+ ? {}
160
+ : unknown extends P
161
+ ? {}
162
+ : NonNullable<P>
163
+ : TMw extends MiddlewareDefinition<any, any, infer P, any, any>
164
+ ? [P] extends [never]
165
+ ? {}
166
+ : unknown extends P
167
+ ? {}
168
+ : NonNullable<P>
169
+ : {};
170
+
171
+ export type ExtractQueryFromMiddleware<TMw> = TMw extends { readonly _query?: infer Q }
172
+ ? [Q] extends [never]
173
+ ? {}
174
+ : unknown extends Q
175
+ ? {}
176
+ : NonNullable<Q>
177
+ : TMw extends MiddlewareDefinition<any, any, any, infer Q, any>
178
+ ? [Q] extends [never]
179
+ ? {}
180
+ : unknown extends Q
181
+ ? {}
182
+ : NonNullable<Q>
183
+ : {};
184
+
185
+ export type ExtractBodyFromMiddleware<TMw> = TMw extends { readonly _body?: infer B }
186
+ ? [B] extends [never]
187
+ ? unknown
188
+ : unknown extends B
189
+ ? unknown
190
+ : NonNullable<B>
191
+ : TMw extends MiddlewareDefinition<any, any, any, any, infer B>
192
+ ? [B] extends [never]
193
+ ? unknown
194
+ : unknown extends B
195
+ ? unknown
196
+ : NonNullable<B>
197
+ : unknown;
198
+
199
+ export type ExtractServicesFromLayout<TLayout> = TLayout extends { readonly _services?: infer S }
200
+ ? NonNullable<S>
201
+ : TLayout extends LayoutDefinition<any, infer S, any, any, any, any>
202
+ ? NonNullable<S>
203
+ : TLayout extends { readonly middlewares: readonly (infer M)[] }
204
+ ? ExtractServicesFromMiddleware<M>
205
+ : {};
206
+
207
+ export type ExtractStateFromLayout<TLayout> = TLayout extends { readonly _state?: infer St }
208
+ ? NonNullable<St>
209
+ : TLayout extends LayoutDefinition<any, any, infer St, any, any, any>
210
+ ? NonNullable<St>
211
+ : TLayout extends { readonly middlewares: readonly (infer M)[] }
212
+ ? ExtractStateFromMiddleware<M>
213
+ : {};
214
+
215
+ type NormalizeFacet<T> = unknown extends T ? {} : [T] extends [never] ? {} : NonNullable<T>;
216
+
217
+ export type ExtractParamsFromLayout<TLayout> = TLayout extends { readonly _params?: infer P }
218
+ ? NormalizeFacet<P>
219
+ : TLayout extends LayoutDefinition<any, any, any, infer P, any, any>
220
+ ? NormalizeFacet<P>
221
+ : TLayout extends { readonly middlewares: readonly (infer M)[] }
222
+ ? ExtractParamsFromMiddleware<M>
223
+ : {};
224
+
225
+ export type ExtractQueryFromLayout<TLayout> = TLayout extends { readonly _query?: infer Q }
226
+ ? NormalizeFacet<Q>
227
+ : TLayout extends LayoutDefinition<any, any, any, any, infer Q, any>
228
+ ? NormalizeFacet<Q>
229
+ : TLayout extends { readonly middlewares: readonly (infer M)[] }
230
+ ? ExtractQueryFromMiddleware<M>
231
+ : {};
232
+
233
+ export type ExtractBodyFromLayout<TLayout> = TLayout extends { readonly _body?: infer B }
234
+ ? NormalizeFacet<B>
235
+ : TLayout extends LayoutDefinition<any, any, any, any, any, infer B>
236
+ ? NormalizeFacet<B>
237
+ : TLayout extends { readonly middlewares: readonly (infer M)[] }
238
+ ? ExtractBodyFromMiddleware<M>
239
+ : {};
240
+
241
+ type GetRouteLayoutIds<TPath extends string, TMethod extends HttpMethod> = RouterRegister extends {
242
+ RouteByPathMethod: infer R;
243
+ }
244
+ ? TPath extends keyof R
245
+ ? TMethod extends keyof R[TPath]
246
+ ? R[TPath][TMethod] extends { layouts: infer L }
247
+ ? L extends readonly (infer Id)[]
248
+ ? [Id] extends [string]
249
+ ? Id
250
+ : never
251
+ : L extends (infer Id)[]
252
+ ? [Id] extends [string]
253
+ ? Id
254
+ : never
255
+ : never
256
+ : never
257
+ : never
258
+ : never
259
+ : never;
260
+
261
+ type GetLayoutServices<LId extends string> = [LId] extends [never]
262
+ ? never
263
+ : RouterRegister extends { LayoutTree: infer LT }
264
+ ? LId extends keyof LT
265
+ ? ExtractServicesFromLayout<LT[LId]>
266
+ : {}
267
+ : {};
268
+
269
+ type GetLayoutState<LId extends string> = [LId] extends [never]
270
+ ? never
271
+ : RouterRegister extends { LayoutTree: infer LT }
272
+ ? LId extends keyof LT
273
+ ? ExtractStateFromLayout<LT[LId]>
274
+ : {}
275
+ : {};
276
+
277
+ export type InferRouteServices<TPath extends string, TMethod extends HttpMethod> = SafeIntersect<
278
+ GetLayoutServices<GetRouteLayoutIds<TPath, TMethod>>
279
+ >;
280
+
281
+ export type InferRouteState<TPath extends string, TMethod extends HttpMethod> = SafeIntersect<
282
+ GetLayoutState<GetRouteLayoutIds<TPath, TMethod>>
283
+ >;
284
+
285
+ type GetLayoutParams<LId extends string> = [LId] extends [never]
286
+ ? never
287
+ : RouterRegister extends { LayoutTree: infer LT }
288
+ ? LId extends keyof LT
289
+ ? ExtractParamsFromLayout<LT[LId]>
290
+ : {}
291
+ : {};
292
+
293
+ type GetLayoutQuery<LId extends string> = [LId] extends [never]
294
+ ? never
295
+ : RouterRegister extends { LayoutTree: infer LT }
296
+ ? LId extends keyof LT
297
+ ? ExtractQueryFromLayout<LT[LId]>
298
+ : {}
299
+ : {};
300
+
301
+ type GetLayoutBody<LId extends string> = [LId] extends [never]
302
+ ? never
303
+ : RouterRegister extends { LayoutTree: infer LT }
304
+ ? LId extends keyof LT
305
+ ? ExtractBodyFromLayout<LT[LId]>
306
+ : {}
307
+ : {};
308
+
309
+ export type InferRouteParams<TPath extends string, TMethod extends HttpMethod> = Simplify<
310
+ Omit<SafeIntersect<GetLayoutParams<GetRouteLayoutIds<TPath, TMethod>>>, "_splat">
311
+ >;
312
+
313
+ export type InferRouteQuery<TPath extends string, TMethod extends HttpMethod> = SafeIntersect<
314
+ GetLayoutQuery<GetRouteLayoutIds<TPath, TMethod>>
315
+ >;
316
+
317
+ export type InferRouteBody<TPath extends string, TMethod extends HttpMethod> = SafeIntersect<
318
+ GetLayoutBody<GetRouteLayoutIds<TPath, TMethod>>
319
+ >;
320
+
321
+ type GetParentLayoutIds<LId extends string> = RouterRegister extends {
322
+ LayoutHierarchy: infer LH;
323
+ }
324
+ ? LId extends keyof LH
325
+ ? LH[LId] extends readonly (infer Id)[]
326
+ ? [Id] extends [string]
327
+ ? Id
328
+ : never
329
+ : never
330
+ : never
331
+ : never;
332
+
333
+ export type InferLayoutState<TPath extends string> = SafeIntersect<
334
+ GetLayoutState<GetParentLayoutIds<TPath>>
335
+ >;
336
+
337
+ export type InferLayoutServices<TPath extends string> = SafeIntersect<
338
+ GetLayoutServices<GetParentLayoutIds<TPath>>
339
+ >;
340
+
341
+ export type InferLayoutParams<TPath extends string> = Simplify<
342
+ Omit<SafeIntersect<GetLayoutParams<GetParentLayoutIds<TPath>>>, "_splat">
343
+ >;
344
+
345
+ export type InferLayoutQuery<TPath extends string> = SafeIntersect<
346
+ GetLayoutQuery<GetParentLayoutIds<TPath>>
347
+ >;
348
+
349
+ export type InferLayoutBody<TPath extends string> = SafeIntersect<
350
+ GetLayoutBody<GetParentLayoutIds<TPath>>
351
+ >;
352
+
353
+ export type InferLayoutBranchState<LId extends string | undefined> = [LId] extends [undefined]
354
+ ? {}
355
+ : [LId] extends [never]
356
+ ? {}
357
+ : SafeIntersect<GetLayoutState<NonNullable<LId> | GetParentLayoutIds<NonNullable<LId>>>>;
358
+
359
+ export type InferLayoutBranchServices<LId extends string | undefined> = [LId] extends [undefined]
360
+ ? {}
361
+ : [LId] extends [never]
362
+ ? {}
363
+ : SafeIntersect<GetLayoutServices<NonNullable<LId> | GetParentLayoutIds<NonNullable<LId>>>>;
364
+
365
+ export type InferLayoutBranchParams<LId extends string | undefined> = Simplify<
366
+ [LId] extends [undefined]
367
+ ? { _splat: string }
368
+ : [LId] extends [never]
369
+ ? { _splat: string }
370
+ : RouteDefaultParams<NonNullable<LId>> &
371
+ SafeIntersect<GetLayoutParams<NonNullable<LId> | GetParentLayoutIds<NonNullable<LId>>>>
372
+ >;
373
+
374
+ export interface MiddlewarePreconditions {
375
+ state?: Record<string, any> | undefined;
376
+ services?: Record<string, any> | undefined;
377
+ params?: Record<string, any> | undefined;
378
+ query?: Record<string, any> | undefined;
379
+ body?: any;
380
+ }
381
+
382
+ export type InferEffectiveParams<
383
+ TPath extends string,
384
+ TMethod extends HttpMethod,
385
+ TRouteParams = unknown,
386
+ > = Simplify<
387
+ (HasWildcard<TPath> extends true ? { _splat: string } : {}) &
388
+ ([keyof InferRouteParams<TPath, TMethod>] extends [never]
389
+ ? TRouteParams
390
+ : [TRouteParams] extends [RouteDefaultParams<TPath>]
391
+ ? Overwrite<RouteDefaultParams<TPath>, InferRouteParams<TPath, TMethod>>
392
+ : Overwrite<InferRouteParams<TPath, TMethod>, TRouteParams>)
393
+ >;
394
+
395
+ export type InferEffectiveQuery<
396
+ TPath extends string,
397
+ TMethod extends HttpMethod,
398
+ TRouteQuery = unknown,
399
+ > = Simplify<Overwrite<InferRouteQuery<TPath, TMethod>, TRouteQuery>>;
400
+
401
+ export type InferEffectiveBody<
402
+ TPath extends string,
403
+ TMethod extends HttpMethod,
404
+ TRouteBody = unknown,
405
+ > = [TMethod] extends [HttpNoBodyMethod]
406
+ ? never
407
+ : Simplify<Overwrite<InferRouteBody<TPath, TMethod>, TRouteBody>>;
408
+
409
+ export type RouteHandlerArgs<
410
+ TParams = {},
411
+ TQuery = {},
412
+ TBody = unknown,
413
+ TServices = {},
414
+ TState = {},
415
+ > = Simplify<
416
+ {
417
+ req: Simplify<TaserRequest<Simplify<TParams>, Simplify<TQuery>, TBody>>;
418
+ ctx: InferredAppContext;
419
+ state: [keyof TState] extends [never] ? {} : Simplify<TState>;
420
+ } & TServices
421
+ >;
422
+
423
+ export type RouteHandler<
424
+ TParams = {},
425
+ TQuery = {},
426
+ TBody = unknown,
427
+ TServices = {},
428
+ TState = {},
429
+ TReturn extends Response | Promise<Response> = Response | Promise<Response>,
430
+ > = (args: RouteHandlerArgs<TParams, TQuery, TBody, TServices, TState>) => TReturn;
431
+
432
+ export interface MiddlewareResponse<TServices = {}, TState = {}> extends Response {
433
+ readonly _services?: TServices;
434
+ readonly _state?: TState;
435
+ }
436
+
437
+ export interface NextFunction {
438
+ <TState extends Record<string, unknown> = {}>(
439
+ state?: TState,
440
+ ): Promise<MiddlewareResponse<{}, TState>>;
441
+ provide<TServices extends Record<string, unknown>, TState extends Record<string, unknown> = {}>(
442
+ services: TServices,
443
+ state?: TState,
444
+ ): Promise<MiddlewareResponse<TServices, TState>>;
445
+ }
446
+
447
+ export type MiddlewareArgs<
448
+ TServices = {},
449
+ TState = {},
450
+ TParams = {},
451
+ TQuery = {},
452
+ TBody = unknown,
453
+ > = Simplify<
454
+ {
455
+ req: Simplify<TaserRequest<Simplify<TParams & { _splat: string }>, Simplify<TQuery>, TBody>>;
456
+ ctx: InferredAppContext;
457
+ state: [keyof TState] extends [never] ? Record<string, unknown> : Simplify<TState>;
458
+ } & TServices
459
+ >;
460
+
461
+ export type MiddlewareHandler<
462
+ TServices = Record<string, any>,
463
+ TState = Record<string, unknown>,
464
+ TParams = Record<string, string>,
465
+ TQuery = Record<string, string | string[]>,
466
+ TBody = unknown,
467
+ > = (
468
+ args: MiddlewareArgs<TServices, TState, TParams, TQuery, TBody>,
469
+ next: NextFunction,
470
+ ) =>
471
+ | Response
472
+ | Promise<Response>
473
+ | MiddlewareResponse<any, any>
474
+ | Promise<MiddlewareResponse<any, any>>;
475
+
476
+ export interface MiddlewareDefinition<
477
+ TServices = {},
478
+ TState = {},
479
+ TParams = unknown,
480
+ TQuery = unknown,
481
+ TBody = unknown,
482
+ TLayoutId extends string | undefined = undefined,
483
+ TRequires extends MiddlewarePreconditions = {},
484
+ > {
485
+ readonly kind: "middleware";
486
+ readonly handler: MiddlewareHandler<any, any, any, any, any>;
487
+ readonly schemas?: RouteSchemas | undefined;
488
+ readonly layoutId?: string | undefined;
489
+ readonly _services?: TServices;
490
+ readonly _state?: TState;
491
+ readonly _params?: TParams;
492
+ readonly _query?: TQuery;
493
+ readonly _body?: TBody;
494
+ readonly _layoutId?: TLayoutId;
495
+ readonly _requires?: TRequires;
496
+ }
497
+
498
+ export type MiddlewareInput =
499
+ | MiddlewareHandler
500
+ | MiddlewareDefinition<any, any, any, any, any, any, any>;
501
+
502
+ export interface LayoutDefinition<
503
+ TPath extends string = string,
504
+ TServices = {},
505
+ TState = {},
506
+ TParams = unknown,
507
+ TQuery = unknown,
508
+ TBody = unknown,
509
+ > {
510
+ readonly kind: "layout";
511
+ readonly path: TPath;
512
+ readonly middlewares: readonly MiddlewareDefinition<any, any, any, any, any, any, any>[];
513
+ readonly schemas?: RouteSchemas | undefined;
514
+ readonly _services?: TServices;
515
+ readonly _state?: TState;
516
+ readonly _params?: TParams;
517
+ readonly _query?: TQuery;
518
+ readonly _body?: TBody;
519
+ }
520
+
521
+ export interface RouteDefinition<
522
+ TPath extends string = string,
523
+ TParams = any,
524
+ TQuery = any,
525
+ TBody = any,
526
+ TReturns = any,
527
+ THandlerReturn = any,
528
+ TParamsIn = TParams,
529
+ TQueryIn = TQuery,
530
+ TBodyIn = TBody,
531
+ > {
532
+ readonly kind: "route";
533
+ readonly method: HttpMethod;
534
+ readonly methods?: readonly string[] | undefined;
535
+ readonly path: TPath;
536
+ readonly middlewares?:
537
+ | readonly MiddlewareDefinition<any, any, any, any, any, any, any>[]
538
+ | undefined;
539
+ readonly handler: RouteHandler<any, any, any, any, any>;
540
+ readonly schemas?: RouteSchemas | undefined;
541
+ readonly returns?: Record<StatusCode, StandardSchemaV1> | undefined;
542
+ readonly $Infer?: {
543
+ Params: TParams;
544
+ Query: TQuery;
545
+ Body: TBody;
546
+ ParamsIn: TParamsIn;
547
+ QueryIn: TQueryIn;
548
+ BodyIn: TBodyIn;
549
+ Returns: TReturns;
550
+ HandlerReturn: THandlerReturn;
551
+ Input: {
552
+ params: TParamsIn;
553
+ query: TQueryIn;
554
+ body: TBodyIn;
555
+ };
556
+ Output: TReturns;
557
+ };
558
+ }
559
+
560
+ export type ExtractPreconditionsFromMiddleware<TMw> = TMw extends {
561
+ readonly _requires?: infer R;
562
+ }
563
+ ? [R] extends [MiddlewarePreconditions]
564
+ ? R
565
+ : {}
566
+ : {};
567
+
568
+ export type ExtractLayoutIdFromMiddleware<TMw> = TMw extends {
569
+ readonly _layoutId?: infer L;
570
+ }
571
+ ? [L] extends [string]
572
+ ? L
573
+ : undefined
574
+ : undefined;
575
+
576
+ export type IsBranchAllowedForLayout<
577
+ TCurrentLayoutPath extends string,
578
+ TTargetLayoutId extends string | undefined,
579
+ > = [TTargetLayoutId] extends [undefined]
580
+ ? true
581
+ : [TTargetLayoutId] extends [never]
582
+ ? true
583
+ : string extends TTargetLayoutId
584
+ ? true
585
+ : string extends TCurrentLayoutPath
586
+ ? true
587
+ : TTargetLayoutId extends TCurrentLayoutPath
588
+ ? true
589
+ : RouterRegister extends { LayoutHierarchy: infer LH }
590
+ ? TCurrentLayoutPath extends keyof LH
591
+ ? TTargetLayoutId extends GetParentLayoutIds<TCurrentLayoutPath>
592
+ ? true
593
+ : false
594
+ : false
595
+ : true;
596
+
597
+ export type IsBranchAllowedForRoute<
598
+ TRoutePath extends string,
599
+ TMethod extends HttpMethod,
600
+ TTargetLayoutId extends string | undefined,
601
+ > = [TTargetLayoutId] extends [undefined]
602
+ ? true
603
+ : [TTargetLayoutId] extends [never]
604
+ ? true
605
+ : string extends TTargetLayoutId
606
+ ? true
607
+ : string extends TRoutePath
608
+ ? true
609
+ : RouterRegister extends { RouteByPathMethod: infer R }
610
+ ? TRoutePath extends keyof R
611
+ ? TMethod extends keyof R[TRoutePath]
612
+ ? TTargetLayoutId extends GetRouteLayoutIds<TRoutePath, TMethod>
613
+ ? true
614
+ : false
615
+ : false
616
+ : false
617
+ : true;
618
+
619
+ export type CheckFacetPrecondition<TAvailable, TRequired> = [TRequired] extends [never]
620
+ ? true
621
+ : [TRequired] extends [undefined]
622
+ ? true
623
+ : unknown extends TRequired
624
+ ? true
625
+ : [Exclude<TRequired, undefined>] extends [never]
626
+ ? true
627
+ : [TAvailable] extends [never]
628
+ ? false
629
+ : TAvailable extends Exclude<TRequired, undefined>
630
+ ? true
631
+ : false;
632
+
633
+ export type CheckMiddlewarePreconditions<
634
+ TState,
635
+ TServices,
636
+ TParams,
637
+ TQuery,
638
+ TBody,
639
+ TRequires extends MiddlewarePreconditions,
640
+ > =
641
+ CheckFacetPrecondition<TState, TRequires["state"]> extends false
642
+ ? false
643
+ : CheckFacetPrecondition<TServices, TRequires["services"]> extends false
644
+ ? false
645
+ : CheckFacetPrecondition<TParams, TRequires["params"]> extends false
646
+ ? false
647
+ : CheckFacetPrecondition<TQuery, TRequires["query"]> extends false
648
+ ? false
649
+ : CheckFacetPrecondition<TBody, TRequires["body"]> extends false
650
+ ? false
651
+ : true;
652
+
653
+ export type CompileError<TMessage extends string> = {
654
+ readonly __compile_error: TMessage;
655
+ } & never;
656
+
657
+ type NormalizeParams<T> = unknown extends T
658
+ ? Record<string, string>
659
+ : [T] extends [never]
660
+ ? Record<string, string>
661
+ : T;
662
+
663
+ type NormalizeQuery<T> = unknown extends T
664
+ ? Record<string, string | string[]>
665
+ : [T] extends [never]
666
+ ? Record<string, string | string[]>
667
+ : T;
668
+
669
+ export type ValidateRouteMiddlewareUse<
670
+ TPath extends string,
671
+ TMethod extends HttpMethod,
672
+ TParams,
673
+ TQuery,
674
+ TBody,
675
+ TRouteServices,
676
+ TRouteState,
677
+ TMw,
678
+ > =
679
+ IsBranchAllowedForRoute<TPath, TMethod, ExtractLayoutIdFromMiddleware<TMw>> extends false
680
+ ? CompileError<`Cannot mount layout-scoped middleware: route "${TPath}" is outside layout branch "${NonNullable<ExtractLayoutIdFromMiddleware<TMw>>}"`>
681
+ : CheckMiddlewarePreconditions<
682
+ InferRouteState<TPath, TMethod> & TRouteState,
683
+ InferRouteServices<TPath, TMethod> & TRouteServices,
684
+ NormalizeParams<TParams>,
685
+ NormalizeQuery<TQuery>,
686
+ TBody,
687
+ ExtractPreconditionsFromMiddleware<TMw>
688
+ > extends false
689
+ ? CompileError<`Cannot mount middleware: route does not satisfy declared preconditions`>
690
+ : TMw;
691
+
692
+ export type ValidateLayoutMiddlewareUse<
693
+ TPath extends string,
694
+ TParams,
695
+ TQuery,
696
+ TBody,
697
+ TServices,
698
+ TState,
699
+ TMw,
700
+ > =
701
+ IsBranchAllowedForLayout<TPath, ExtractLayoutIdFromMiddleware<TMw>> extends false
702
+ ? CompileError<`Cannot mount layout-scoped middleware: layout "${TPath}" is outside layout branch "${NonNullable<ExtractLayoutIdFromMiddleware<TMw>>}"`>
703
+ : CheckMiddlewarePreconditions<
704
+ InferLayoutState<TPath> & TState,
705
+ InferLayoutServices<TPath> & TServices,
706
+ NormalizeParams<TParams>,
707
+ NormalizeQuery<TQuery>,
708
+ TBody,
709
+ ExtractPreconditionsFromMiddleware<TMw>
710
+ > extends false
711
+ ? CompileError<`Cannot mount middleware: layout does not satisfy declared preconditions`>
712
+ : TMw;
713
+
714
+ type ResolveMwParam<T, TReq> = unknown extends T
715
+ ? [TReq] extends [undefined]
716
+ ? Record<string, string>
717
+ : NonNullable<TReq>
718
+ : [T] extends [never]
719
+ ? [TReq] extends [undefined]
720
+ ? Record<string, string>
721
+ : NonNullable<TReq>
722
+ : T;
723
+
724
+ type ResolveMwQuery<T, TReq> = unknown extends T
725
+ ? [TReq] extends [undefined]
726
+ ? Record<string, string | string[]>
727
+ : NonNullable<TReq>
728
+ : [T] extends [never]
729
+ ? [TReq] extends [undefined]
730
+ ? Record<string, string | string[]>
731
+ : NonNullable<TReq>
732
+ : T;
733
+
734
+ type ResolveMwBody<T, TReq> = unknown extends T ? ([TReq] extends [undefined] ? unknown : TReq) : T;
735
+
736
+ export type InferMiddlewareArgs<
737
+ TLayoutId extends string | undefined,
738
+ TParams,
739
+ TQuery,
740
+ TBody,
741
+ TRequires extends MiddlewarePreconditions,
742
+ > = MiddlewareArgs<
743
+ InferLayoutBranchServices<TLayoutId> &
744
+ (TRequires extends { services?: infer S } ? NonNullable<S> : {}),
745
+ InferLayoutBranchState<TLayoutId> &
746
+ (TRequires extends { state?: infer St } ? NonNullable<St> : {}),
747
+ ResolveMwParam<TParams, TRequires["params"]>,
748
+ ResolveMwQuery<TQuery, TRequires["query"]>,
749
+ ResolveMwBody<TBody, TRequires["body"]>
750
+ >;
751
+
752
+ export interface ContextOptions<
753
+ TBoot extends Record<string, unknown> = {},
754
+ TRequest extends Record<string, unknown> = {},
755
+ > {
756
+ boot?: (() => TBoot | Promise<TBoot>) | undefined;
757
+ request?: ((req: TaserRequest<any, any, any>) => TRequest | Promise<TRequest>) | undefined;
758
+ }
759
+
760
+ export interface ContextDefinition<
761
+ TBoot extends Record<string, unknown> = {},
762
+ TRequest extends Record<string, unknown> = {},
763
+ > extends ContextOptions<TBoot, TRequest> {
764
+ readonly kind: "context";
765
+ }
766
+
767
+ export type NotFoundHandler<TContext = {}> = (args: {
768
+ req: TaserRequest<any, any, any>;
769
+ ctx: TContext;
770
+ }) => Response | Promise<Response>;
771
+
772
+ export type OnErrorHandler = (
773
+ err: unknown,
774
+ req: TaserRequest<any, any, any>,
775
+ ) => Response | Promise<Response>;
776
+
777
+ export interface ResponseOptions {
778
+ validate?: boolean | undefined;
779
+ }
780
+
781
+ export type InferReturnsResponse<TReturns> = [TReturns] extends [undefined]
782
+ ? Response
783
+ : [TReturns] extends [never]
784
+ ? Response
785
+ : unknown extends TReturns
786
+ ? Response
787
+ : {
788
+ [K in keyof TReturns & number]: TypedResponse<
789
+ TReturns[K] extends StandardSchemaV1
790
+ ? StandardSchemaV1.InferOutput<TReturns[K]>
791
+ : unknown,
792
+ K
793
+ >;
794
+ }[keyof TReturns & number];
795
+
796
+ export interface TaserAppOptions<TContext = {}> {
797
+ basePath?: string | undefined;
798
+ context?: ContextDefinition<any, any> | undefined;
799
+ notFound?: NotFoundHandler<TContext> | undefined;
800
+ onError?: OnErrorHandler | undefined;
801
+ response?: ResponseOptions | undefined;
802
+ }
803
+
804
+ export interface TaserDefinition<TContext = {}> {
805
+ readonly _context?: TContext;
806
+ readonly $Infer: {
807
+ Context: TContext;
808
+ };
809
+ readonly options: TaserAppOptions<TContext>;
810
+ }