@taserjs/router 0.1.13 → 0.2.1

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