@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
@@ -1,297 +0,0 @@
1
- import { Awaitable, TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
2
- import { RouterMiddlewaresRegister, RouterRegister, RouterRoutesRegister } from '../index.js';
3
- import { MergeMiddlewareField, MergeMiddlewareInputField, MergePart, RequestShape, Simplify, UnionToIntersection, UnitRuntimeContext } from './type-utils.js';
4
- import { ReturnsMap, ValidHandlerReply } from './returns.js';
5
- import { Schema } from './schema.js';
6
- import { EmptyAppContext, ExtractState, Method, MiddlewareDefinition, MiddlewareRequirements, MiddlewareReturnFromParts, MiddlewareUnit, NextFn, ValidatorParts } from './units.js';
7
- export type { Awaitable } from '@taserjs/router-core';
8
- export type { SchemaRequestShape, InferInput, InferOutput, Schema, StandardSchemaV1, } from './schema.js';
9
- export type { MergeMiddlewareField, MergeMiddlewareInputField, MergePart, RequestShape, Simplify, UnitRuntimeContext, UnwrapPart, } from './type-utils.js';
10
- export type { EmptyReturns, EnforceHandlerReply, HandlerReply, HasReturns, MergeReturns, ReplyFor, ReturnsMap, StatusCode, ValidHandlerReply, } from './returns.js';
11
- export type { EmptyAppContext, ExtractState, HttpMethod, IsUnknown, Method, MiddlewareDefinition, MiddlewareRequirements, MiddlewareReturnFromParts, MiddlewareUnit, MiddlewareUnitBuilder, NextFn, NextResult, StandaloneMiddlewareContext, StateBrand, ValidatorParts, } from './units.js';
12
- export type AppContext = RouterRegister extends {
13
- AppContext: infer C;
14
- } ? C : EmptyAppContext;
15
- export type RoutePath = RouterRegister extends {
16
- RoutePath: infer P;
17
- } ? P : never;
18
- export type LayoutId = RouterRegister extends {
19
- LayoutId: infer L;
20
- } ? L : never;
21
- export type LayoutTree = RouterRegister extends {
22
- LayoutTree: infer T;
23
- } ? T : Record<never, never>;
24
- export type LayoutMiddlewaresMap = RouterMiddlewaresRegister extends {
25
- LayoutMiddlewares: infer M;
26
- } ? M : RouterRegister extends {
27
- LayoutMiddlewares: infer M;
28
- } ? M : Record<never, never>;
29
- export type RouteByPathMethod = RouterRoutesRegister extends {
30
- RouteByPathMethod: infer R;
31
- } ? R : RouterRegister extends {
32
- RouteByPathMethod: infer R;
33
- } ? R : Record<never, never>;
34
- export type LayoutBuilder<TAppContext extends Record<string, unknown> = AppContext> = <const Layout extends LayoutId>(layout: Layout) => MiddlewareBuilder<Layout, readonly [], TAppContext>;
35
- type ParseParam<Segment extends string> = Segment extends "*" ? {
36
- _splat: string;
37
- } : Segment extends `:${infer Name extends string}` ? Name extends "" ? {} : {
38
- [K in Name]: string;
39
- } : {};
40
- type ParseParamsFromSegments<S extends string> = S extends `${infer Segment}/${infer Rest}` ? ParseParam<Segment> & ParseParamsFromSegments<Rest> : ParseParam<S>;
41
- export type PathParams<Path extends string> = Path extends `/${infer Rest}` ? ParseParamsFromSegments<Rest> : ParseParamsFromSegments<Path>;
42
- export type LayoutParams<Layout extends string> = PathParams<Layout>;
43
- export type ResolveParams<TPathParams, TSchemaParams> = TSchemaParams extends Record<string, unknown> ? [keyof TSchemaParams] extends [never] ? TPathParams : Simplify<Omit<TPathParams, keyof TSchemaParams> & TSchemaParams> : TPathParams;
44
- type LayoutParent<Layout extends LayoutId> = Layout extends keyof LayoutTree ? LayoutTree[Layout] extends {
45
- parent: infer P extends LayoutId;
46
- } ? P : null : null;
47
- type LayoutMiddlewares<Layout extends LayoutId> = [Layout] extends [keyof LayoutMiddlewaresMap] ? LayoutMiddlewaresMap[Layout] extends {
48
- readonly __acc?: infer Acc extends readonly unknown[];
49
- } ? Acc : LayoutMiddlewaresMap[Layout] extends readonly unknown[] ? LayoutMiddlewaresMap[Layout] : readonly [] : readonly [];
50
- type ResolveLayoutMiddlewares<Layout extends LayoutId | null, Depth extends readonly unknown[] = []> = Depth["length"] extends 10 ? readonly [] : [Layout] extends [LayoutId] ? LayoutParent<Layout> extends infer Parent extends LayoutId ? readonly [
51
- ...ResolveLayoutMiddlewares<Parent, [...Depth, unknown]>,
52
- ...LayoutMiddlewares<Layout>
53
- ] : readonly [...LayoutMiddlewares<Layout>] : readonly [];
54
- export type ResolveLayoutIdChain<L extends LayoutId | null, Depth extends readonly unknown[] = []> = Depth["length"] extends 10 ? readonly [] : L extends LayoutId ? readonly [...ResolveLayoutIdChain<LayoutParent<L>, [...Depth, unknown]>, L] : readonly [];
55
- export type ResolveLayoutMiddlewaresState<Layout extends LayoutId | null> = Layout extends LayoutId ? MergeMiddlewareField<ResolveLayoutMiddlewares<Layout>, "state"> : {};
56
- export type ResolveLayoutsState<Layouts extends LayoutId | readonly LayoutId[]> = Layouts extends LayoutId ? ResolveLayoutMiddlewaresState<Layouts> : Layouts extends readonly LayoutId[] ? UnionToIntersection<Layouts[number] extends infer L extends LayoutId ? ResolveLayoutMiddlewaresState<L> : never> : {};
57
- /** Fold layout middleware Acc from a route's layoutChain (shallow → deep). */
58
- type ResolveLayoutChainMiddlewares<Chain extends readonly LayoutId[]> = Chain extends readonly [
59
- infer Head extends LayoutId,
60
- ...infer Rest
61
- ] ? readonly [
62
- ...LayoutMiddlewares<Head>,
63
- ...ResolveLayoutChainMiddlewares<Rest extends readonly LayoutId[] ? Rest : readonly []>
64
- ] : readonly [];
65
- type RouteEntry<Path extends RoutePath, TMethod extends Method> = RouteByPathMethod[Path] extends {
66
- [K in TMethod]: infer Entry;
67
- } ? Entry : never;
68
- type RouteLayoutChain<Path extends RoutePath, TMethod extends Method> = RouteEntry<Path, TMethod> extends {
69
- layouts: infer Chain extends readonly LayoutId[];
70
- } ? Chain : readonly [];
71
- export type RouteLayoutMiddlewares<Path extends RoutePath, TMethod extends Method> = ResolveLayoutChainMiddlewares<RouteLayoutChain<Path, TMethod>>;
72
- export type RouteLayoutField<Path extends RoutePath, TMethod extends Method, Field extends "query" | "params" | "body" | "state"> = MergeMiddlewareField<RouteLayoutMiddlewares<Path, TMethod>, Field>;
73
- export type RouteLayoutInputField<Path extends RoutePath, TMethod extends Method, Field extends "query" | "params" | "body"> = MergeMiddlewareInputField<RouteLayoutMiddlewares<Path, TMethod>, Field>;
74
- type RouteResolvedField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends "query" | "params" | "body" | "state"> = RouteLayoutField<Path, TMethod, Field> & MergeMiddlewareField<Acc, Field>;
75
- export type RouteChainContext<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], TQuery, TParams, TBody, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & {
76
- query: MergePart<TQuery, RouteResolvedField<Path, TMethod, Acc, "query">>;
77
- params: ResolveParams<PathParams<Path>, MergePart<TParams, RouteResolvedField<Path, TMethod, Acc, "params">>>;
78
- body: MergePart<TBody, RouteResolvedField<Path, TMethod, Acc, "body">>;
79
- state: RouteResolvedField<Path, TMethod, Acc, "state">;
80
- headers: TaserHeaders;
81
- cookies: TaserCookieJar;
82
- }>;
83
- export type RouteHandleContext<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends {
84
- query?: unknown;
85
- params?: unknown;
86
- body?: unknown;
87
- }, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & {
88
- path: Path;
89
- method: TMethod;
90
- query: Simplify<MergePart<Validators extends {
91
- query?: infer Q;
92
- } ? Q : unknown, RouteResolvedField<Path, TMethod, Acc, "query">>>;
93
- params: Simplify<ResolveParams<PathParams<Path>, MergePart<Validators extends {
94
- params?: infer P;
95
- } ? P : unknown, RouteResolvedField<Path, TMethod, Acc, "params">>>>;
96
- body: Simplify<MergePart<Validators extends {
97
- body?: infer B;
98
- } ? B : unknown, RouteResolvedField<Path, TMethod, Acc, "body">>>;
99
- state: Simplify<RouteResolvedField<Path, TMethod, Acc, "state">>;
100
- headers: TaserHeaders;
101
- cookies: TaserCookieJar;
102
- }>;
103
- export type RouteHandleContextWithoutBody<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends {
104
- query?: unknown;
105
- params?: unknown;
106
- }, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & {
107
- path: Path;
108
- method: TMethod;
109
- query: Simplify<MergePart<Validators extends {
110
- query?: infer Q;
111
- } ? Q : unknown, RouteResolvedField<Path, TMethod, Acc, "query">>>;
112
- params: Simplify<ResolveParams<PathParams<Path>, MergePart<Validators extends {
113
- params?: infer P;
114
- } ? P : unknown, RouteResolvedField<Path, TMethod, Acc, "params">>>>;
115
- body: never;
116
- state: Simplify<RouteResolvedField<Path, TMethod, Acc, "state">>;
117
- headers: TaserHeaders;
118
- cookies: TaserCookieJar;
119
- }>;
120
- type RouteResolvedInputField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends "query" | "params" | "body"> = RouteLayoutInputField<Path, TMethod, Field> & MergeMiddlewareInputField<Acc, Field>;
121
- type IsNever<T> = [T] extends [never] ? true : false;
122
- type IsEmptyObject<T> = [keyof T] extends [never] ? true : false;
123
- export type IsLayoutAllowed<TRequiredLayouts, TChain extends readonly LayoutId[]> = [
124
- TRequiredLayouts
125
- ] extends [never] ? true : [unknown] extends [TRequiredLayouts] ? true : [null] extends [TRequiredLayouts] ? true : [undefined] extends [TRequiredLayouts] ? true : TRequiredLayouts extends LayoutId ? TRequiredLayouts extends TChain[number] ? true : false : TRequiredLayouts extends readonly LayoutId[] ? [TRequiredLayouts[number] & TChain[number]] extends [never] ? false : true : true;
126
- export type IsRequirementsSatisfied<TActual extends {
127
- query?: unknown;
128
- params?: unknown;
129
- body?: unknown;
130
- state?: unknown;
131
- }, TRequires extends MiddlewareRequirements> = [TRequires] extends [never] ? true : [unknown] extends [TRequires] ? true : [null] extends [TRequires] ? true : [undefined] extends [TRequires] ? true : [IsEmptyObject<TRequires>] extends [true] ? true : (TRequires extends {
132
- state: infer S extends Record<string, unknown>;
133
- } ? [TActual["state"]] extends [S] ? true : false : true) extends false ? false : (TRequires extends {
134
- query: infer Q extends Record<string, unknown>;
135
- } ? [TActual["query"]] extends [Q] ? true : false : true) extends false ? false : (TRequires extends {
136
- params: infer P extends Record<string, unknown>;
137
- } ? [TActual["params"]] extends [P] ? true : false : true) extends false ? false : (TRequires extends {
138
- body: infer B;
139
- } ? unknown extends B ? true : [TRequires["body"]] extends [undefined] ? true : [TActual["body"]] extends [B] ? true : false : true) extends false ? false : true;
140
- export type IsStateSatisfied<TActualState, TRequiredState> = IsRequirementsSatisfied<{
141
- state: TActualState;
142
- }, {
143
- state: TRequiredState extends Record<string, unknown> ? TRequiredState : {};
144
- }>;
145
- type InputFacet<T, K extends string> = IsNever<T> extends true ? {} : IsEmptyObject<T> extends true ? {} : {
146
- [Key in K]: T;
147
- };
148
- type RouteQueryInput<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends ValidatorParts> = Simplify<MergePart<RequestShape<Validators extends {
149
- queryIn?: infer QI;
150
- } ? QI : unknown, Validators extends {
151
- query?: infer Q;
152
- } ? Q : unknown>, RouteResolvedInputField<Path, TMethod, Acc, "query">>>;
153
- type RouteParamsInput<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends ValidatorParts> = Simplify<ResolveParams<PathParams<Path>, MergePart<RequestShape<Validators extends {
154
- paramsIn?: infer PI;
155
- } ? PI : unknown, Validators extends {
156
- params?: infer P;
157
- } ? P : unknown>, RouteResolvedInputField<Path, TMethod, Acc, "params">>>>;
158
- type RouteBodyInput<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends ValidatorParts> = Simplify<MergePart<RequestShape<Validators extends {
159
- bodyIn?: infer BI;
160
- } ? BI : unknown, Validators extends {
161
- body?: infer B;
162
- } ? B : unknown>, RouteResolvedInputField<Path, TMethod, Acc, "body">>>;
163
- export type RouteHandleInputWithoutBody<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends ValidatorParts = {}> = Simplify<InputFacet<RouteQueryInput<Path, TMethod, Acc, Validators>, "query"> & InputFacet<RouteParamsInput<Path, TMethod, Acc, Validators>, "params">>;
164
- export type RouteHandleInput<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends ValidatorParts = {}> = Simplify<RouteHandleInputWithoutBody<Path, TMethod, Acc, Validators> & InputFacet<RouteBodyInput<Path, TMethod, Acc, Validators>, "body">>;
165
- export type InferRouteInputFromPath<Path extends RoutePath, TMethod extends Method> = RouteEntry<Path, TMethod> extends {
166
- route: infer Route;
167
- } ? Route extends {
168
- $Infer: {
169
- Input: infer I;
170
- };
171
- } ? I : never : never;
172
- export type MiddlewareLayoutField<Layout extends LayoutId, Field extends "query" | "params" | "body" | "state"> = [LayoutParent<Layout>] extends [infer Parent extends LayoutId] ? MergeMiddlewareField<ResolveLayoutMiddlewares<Parent>, Field> : {};
173
- type MiddlewareChainField<Layout extends LayoutId, Acc extends readonly unknown[], Field extends "query" | "params" | "body" | "state"> = MiddlewareLayoutField<Layout, Field> & MergeMiddlewareField<Acc, Field>;
174
- export type MiddlewareChainContext<Layout extends LayoutId, Acc extends readonly unknown[], TQuery = unknown, TParams = unknown, TBody = unknown, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & {
175
- readonly request: Request;
176
- readonly method: Method;
177
- readonly url: URL;
178
- readonly headers: TaserHeaders;
179
- readonly cookies: TaserCookieJar;
180
- query: Simplify<MergePart<TQuery, MiddlewareChainField<Layout, Acc, "query">>>;
181
- params: Simplify<ResolveParams<LayoutParams<Layout>, Simplify<MergePart<TParams, MiddlewareChainField<Layout, Acc, "params">>>>>;
182
- body: Simplify<MergePart<TBody, MiddlewareChainField<Layout, Acc, "body">>>;
183
- state: Simplify<MiddlewareChainField<Layout, Acc, "state">>;
184
- }>;
185
- export type MiddlewareBuilder<Layout extends LayoutId, Acc extends readonly unknown[] = readonly [], TAppContext extends Record<string, unknown> = AppContext> = {
186
- readonly layout: Layout;
187
- readonly middlewares: readonly MiddlewareDefinition[];
188
- readonly __acc?: Acc;
189
- use<TAcc, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequires extends MiddlewareRequirements = {}>(unit: [
190
- IsLayoutAllowed<TRequiredLayouts, ResolveLayoutIdChain<Layout>>,
191
- IsRequirementsSatisfied<{
192
- query: MiddlewareChainField<Layout, Acc, "query">;
193
- params: MiddlewareChainField<Layout, Acc, "params">;
194
- body: MiddlewareChainField<Layout, Acc, "body">;
195
- state: MiddlewareChainField<Layout, Acc, "state">;
196
- }, TRequires>
197
- ] extends [true, true] ? MiddlewareUnit<TAcc, TReturns, TRequiredLayouts, TRequires> : never): MiddlewareBuilder<Layout, readonly [...Acc, TAcc], TAppContext>;
198
- use<R = unknown>(fn: (ctx: Simplify<TAppContext & {
199
- readonly request: Request;
200
- readonly method: Method;
201
- readonly url: URL;
202
- readonly headers: TaserHeaders;
203
- readonly cookies: TaserCookieJar;
204
- query: Simplify<MergePart<unknown, MiddlewareChainField<Layout, Acc, "query">>>;
205
- params: Simplify<ResolveParams<LayoutParams<Layout>, Simplify<MergePart<unknown, MiddlewareChainField<Layout, Acc, "params">>>>>;
206
- body: Simplify<MergePart<unknown, MiddlewareChainField<Layout, Acc, "body">>>;
207
- state: Simplify<MiddlewareChainField<Layout, Acc, "state">>;
208
- }>, next: NextFn) => Awaitable<R>): MiddlewareBuilder<Layout, readonly [...Acc, MiddlewareReturnFromParts<unknown, unknown, unknown, ExtractState<R>>], TAppContext>;
209
- };
210
- export type RouteExport<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], TReturns extends ReturnsMap = {}, TOutput = Response> = {
211
- readonly path: Path;
212
- readonly method: TMethod | "ANY" | "ALL";
213
- readonly methods?: readonly Method[];
214
- readonly middlewares: readonly MiddlewareDefinition[];
215
- readonly __acc?: Acc;
216
- readonly returns?: TReturns;
217
- readonly bodyMode?: "json" | "form" | "urlencoded";
218
- handler: (ctx: unknown) => Awaitable<Response>;
219
- readonly $Infer: {
220
- Context: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleContextWithoutBody<Path, TMethod, Acc, {}> : RouteHandleContext<Path, TMethod, Acc, {}>;
221
- Input: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleInputWithoutBody<Path, TMethod, Acc, {}> : RouteHandleInput<Path, TMethod, Acc, {}>;
222
- Output: TOutput;
223
- };
224
- query?: Schema<unknown>;
225
- params?: Schema<unknown>;
226
- body?: Schema<unknown>;
227
- };
228
- type RouteHandleResult<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends ValidatorParts, TReturns extends ReturnsMap = {}, TOutput = Response, TAppContext extends Record<string, unknown> = AppContext> = Omit<RouteExport<Path, TMethod, Acc, TReturns, TOutput>, "$Infer"> & {
229
- readonly $Infer: {
230
- Context: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleContextWithoutBody<Path, TMethod, Acc, Validators, TAppContext> : RouteHandleContext<Path, TMethod, Acc, Validators, TAppContext>;
231
- Input: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleInputWithoutBody<Path, TMethod, Acc, Validators> : RouteHandleInput<Path, TMethod, Acc, Validators>;
232
- Output: TOutput;
233
- };
234
- };
235
- export type RouteContractBuilderBase<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[] = readonly [], Validators extends ValidatorParts = {}, TReturns extends ReturnsMap = {}, TAppContext extends Record<string, unknown> = AppContext> = {
236
- readonly path: Path;
237
- readonly method: TMethod;
238
- readonly $Infer: {
239
- Context: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleContextWithoutBody<Path, TMethod, Acc, Validators, TAppContext> : RouteHandleContext<Path, TMethod, Acc, Validators, TAppContext>;
240
- Input: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleInputWithoutBody<Path, TMethod, Acc, Validators> : RouteHandleInput<Path, TMethod, Acc, Validators>;
241
- Output: TReturns;
242
- };
243
- query<TQuery, TQueryIn = unknown>(schema: Schema<TQuery, TQueryIn>): RouteContractBuilder<Path, TMethod, Acc, Omit<Validators, "query" | "queryIn"> & {
244
- query: TQuery;
245
- queryIn: TQueryIn;
246
- }, TReturns, TAppContext>;
247
- params<TParams, TParamsIn = unknown>(schema: Schema<TParams, TParamsIn>): RouteContractBuilder<Path, TMethod, Acc, Omit<Validators, "params" | "paramsIn"> & {
248
- params: TParams;
249
- paramsIn: TParamsIn;
250
- }, TReturns, TAppContext>;
251
- returns<const M extends ReturnsMap>(map: M): RouteContractBuilder<Path, TMethod, Acc, Validators, Omit<TReturns, keyof M> & M, TAppContext>;
252
- handler<R extends Response = Response>(fn: (ctx: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleContextWithoutBody<Path, TMethod, Acc, Validators, TAppContext> : RouteHandleContext<Path, TMethod, Acc, Validators, TAppContext>) => Awaitable<R>, ..._assert: [R] extends [ValidHandlerReply<R, TReturns>] ? [] : [
253
- {
254
- expected: ValidHandlerReply<R, TReturns>;
255
- actual: R;
256
- }
257
- ]): RouteHandleResult<Path, TMethod, Acc, Validators, TReturns, R, TAppContext>;
258
- };
259
- export type RouteContractBuilder<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[] = readonly [], Validators extends ValidatorParts = {}, TReturns extends ReturnsMap = {}, TAppContext extends Record<string, unknown> = AppContext> = RouteContractBuilderBase<Path, TMethod, Acc, Validators, TReturns, TAppContext> & (TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? {} : {
260
- body<TBody, TBodyIn = unknown>(schema: Schema<TBody, TBodyIn>): RouteContractBuilder<Path, TMethod, Acc, Omit<Validators, "body" | "bodyIn"> & {
261
- body: TBody;
262
- bodyIn: TBodyIn;
263
- }, TReturns, TAppContext>;
264
- body<Mode extends "json" | "form" | "urlencoded", TBody, TBodyIn = unknown>(mode: Mode, schema: Schema<TBody, TBodyIn>): RouteContractBuilder<Path, TMethod, Acc, Omit<Validators, "body" | "bodyIn"> & {
265
- body: TBody;
266
- bodyIn: TBodyIn;
267
- }, TReturns, TAppContext>;
268
- });
269
- export type RouteMiddlewareBuilder<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[] = readonly [], Validators extends ValidatorParts = {}, TReturns extends ReturnsMap = {}, TAppContext extends Record<string, unknown> = AppContext> = RouteContractBuilder<Path, TMethod, Acc, Validators, TReturns, TAppContext> & {
270
- use<TAcc, UReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequires extends MiddlewareRequirements = {}>(unit: [
271
- IsLayoutAllowed<TRequiredLayouts, RouteLayoutChain<Path, TMethod>>,
272
- IsRequirementsSatisfied<{
273
- query: RouteResolvedField<Path, TMethod, Acc, "query">;
274
- params: ResolveParams<PathParams<Path>, RouteResolvedField<Path, TMethod, Acc, "params">>;
275
- body: RouteResolvedField<Path, TMethod, Acc, "body">;
276
- state: RouteResolvedField<Path, TMethod, Acc, "state">;
277
- }, TRequires>
278
- ] extends [true, true] ? MiddlewareUnit<TAcc, UReturns, TRequiredLayouts, TRequires> : never): RouteMiddlewareBuilder<Path, TMethod, readonly [...Acc, TAcc], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
279
- use<R = unknown>(fn: (ctx: RouteChainContext<Path, TMethod, Acc, unknown, unknown, unknown, TAppContext>, next: NextFn) => Awaitable<R>): RouteMiddlewareBuilder<Path, TMethod, readonly [...Acc, MiddlewareReturnFromParts<unknown, unknown, unknown, ExtractState<R>>], Validators, TReturns, TAppContext>;
280
- };
281
- export type RouteBuilder<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[] = readonly [], Validators extends ValidatorParts = {}, TReturns extends ReturnsMap = {}, TAppContext extends Record<string, unknown> = AppContext> = RouteMiddlewareBuilder<Path, TMethod, Acc, Validators, TReturns, TAppContext>;
282
- export type RouteDefinition<Path extends RoutePath = RoutePath, TMethod extends Method = Method, Acc extends readonly unknown[] = readonly unknown[], Validators extends ValidatorParts = ValidatorParts, TReturns extends ReturnsMap = ReturnsMap, TOutput = Response, TAppContext extends Record<string, unknown> = AppContext> = RouteHandleResult<Path, TMethod, Acc, Validators, TReturns, TOutput, TAppContext>;
283
- export type InferRouteContext<R> = R extends {
284
- $Infer: {
285
- Context: infer C;
286
- };
287
- } ? C : never;
288
- export type InferRouteInput<R> = R extends {
289
- $Infer: {
290
- Input: infer I;
291
- };
292
- } ? I : never;
293
- export type InferRouteOutput<R> = R extends {
294
- $Infer: {
295
- Output: infer O;
296
- };
297
- } ? O : never;
@@ -1,34 +0,0 @@
1
- import { ReplyOf } from '@taserjs/router-utils/reply';
2
- import { StatusCode } from '@taserjs/router-utils';
3
- import { Simplify } from './type-utils.js';
4
- import { Schema, InferOutput } from './schema.js';
5
- export type { StatusCode };
6
- /** Status-code → Standard Schema map for route/middleware/handler outputs. */
7
- export type ReturnsMap = {
8
- readonly [status: number]: Schema<unknown> | undefined;
9
- };
10
- /** Later map wins on overlapping status keys. */
11
- export type MergeReturns<A extends ReturnsMap, B extends ReturnsMap> = Omit<A, keyof B> & B;
12
- /** Typed reply union for statuses declared in a returns map. */
13
- export type ReplyFor<M extends ReturnsMap> = {
14
- [S in keyof M & number]: M[S] extends Schema<unknown> ? ReplyOf<S, Simplify<InferOutput<M[S]>>> : never;
15
- }[keyof M & number];
16
- export type EmptyReturns = {};
17
- /** True when no status schemas have been declared yet. */
18
- export type HasReturns<M extends ReturnsMap> = [keyof M] extends [never] ? false : true;
19
- /**
20
- * Validate a concrete reply `R` against returns map `M`.
21
- * Declared statuses must match schema output; undeclared statuses stay open
22
- * (same rule as runtime `validateReply`).
23
- */
24
- export type ValidHandlerReply<R, M extends ReturnsMap> = R extends ReplyOf<infer S, infer B> ? S extends keyof M ? M[S] extends Schema<unknown> ? B extends Simplify<InferOutput<M[S]>> ? R : never : R : R : R extends Response ? R : never;
25
- /**
26
- * Narrow a handler return so declared statuses are schema-checked without
27
- * breaking multi-status unions (avoids circular `R extends …<R>` constraints).
28
- */
29
- export type EnforceHandlerReply<R, M extends ReturnsMap> = [R] extends [ValidHandlerReply<R, M>] ? R : ValidHandlerReply<R, M>;
30
- /**
31
- * Expected `.handler` return type for a returns map.
32
- * Prefer constraining handler generics with {@link EnforceHandlerReply}.
33
- */
34
- export type HandlerReply<M extends ReturnsMap> = HasReturns<M> extends true ? ReplyFor<M> | Response : Response;
@@ -1,14 +0,0 @@
1
- import { StandardSchemaV1 } from '@standard-schema/spec';
2
- import { RequestShape } from './type-utils.js';
3
- export type { StandardSchemaV1 } from '@standard-schema/spec';
4
- /**
5
- * A Standard Schema validator.
6
- * `TOutput` is the validated/output type; `TInput` is the pre-parse input (request shape).
7
- */
8
- export type Schema<TOutput = unknown, TInput = unknown> = StandardSchemaV1<TInput, TOutput>;
9
- /** Infers the output type from a Standard Schema. */
10
- export type InferOutput<S> = S extends StandardSchemaV1<unknown, infer O> ? O : never;
11
- /** Infers the input type from a Standard Schema. */
12
- export type InferInput<S> = S extends StandardSchemaV1<infer I, unknown> ? I : never;
13
- /** Pre-parse request shape from a Standard Schema. */
14
- export type SchemaRequestShape<S> = S extends StandardSchemaV1<infer I, infer O> ? RequestShape<I, O> : S;
@@ -1,50 +0,0 @@
1
- import { TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
2
- import { HttpMethod, HttpVerb } from '@taserjs/router-utils/http';
3
- export type Method = HttpMethod;
4
- export type { HttpMethod, HttpVerb };
5
- export type MiddlewareFieldName = "query" | "params" | "body" | "state";
6
- export type MiddlewareInputFieldName = "query" | "params" | "body";
7
- export type UnwrapPart<T> = unknown extends T ? {} : T;
8
- export type MergePart<T, Base> = unknown extends T ? Base : Base & T;
9
- /** Collapse intersections so `Omit`/`keyof` treat the result as one object type. */
10
- export type Simplify<T> = [T] extends [infer U] ? {
11
- [K in keyof U]: U[K];
12
- } : never;
13
- /**
14
- * Request prop: when schema input is `unknown` (e.g. zod coerce),
15
- * fall back to the validated output type.
16
- */
17
- type RequestPropType<TIn, TOut> = [unknown] extends [Exclude<TIn, undefined>] ? TOut : TIn;
18
- /**
19
- * Pre-parse request shape. Prefer input types (defaults → optional),
20
- * but replace `unknown` input props with output types.
21
- */
22
- export type RequestShape<TIn, TOut> = unknown extends TIn ? UnwrapPart<TOut> : Simplify<{
23
- [K in keyof TIn]: K extends keyof TOut ? RequestPropType<TIn[K], TOut[K]> : TIn[K];
24
- }>;
25
- export type UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends (value: infer Value) => void ? Value : never;
26
- export type MiddlewareField<Middleware, Field extends MiddlewareFieldName> = Field extends "query" ? Middleware extends {
27
- query: infer Query;
28
- } ? Query : {} : Field extends "params" ? Middleware extends {
29
- params: infer Params;
30
- } ? Params : {} : Field extends "body" ? Middleware extends {
31
- body: infer Body;
32
- } ? Body : {} : Field extends "state" ? Middleware extends {
33
- state: infer State;
34
- } ? State : {} : {};
35
- export type MiddlewareInputField<Middleware, Field extends MiddlewareInputFieldName> = Middleware extends {
36
- input: {
37
- [K in Field]: infer V;
38
- };
39
- } ? V : {};
40
- export type MergeMiddlewareField<Middlewares extends readonly unknown[], Field extends MiddlewareFieldName> = Middlewares extends readonly [] ? {} : Middlewares extends readonly [infer Head, ...infer Tail] ? MiddlewareField<Head, Field> & MergeMiddlewareField<Tail, Field> : MiddlewareField<Middlewares[number], Field>;
41
- export type MergeMiddlewareInputField<Middlewares extends readonly unknown[], Field extends MiddlewareInputFieldName> = Middlewares extends readonly [] ? {} : Middlewares extends readonly [infer Head, ...infer Tail] ? MiddlewareInputField<Head, Field> & MergeMiddlewareInputField<Tail, Field> : MiddlewareInputField<Middlewares[number], Field>;
42
- export type RuntimeContextFields = {
43
- request: Request;
44
- method: Method;
45
- url: URL;
46
- headers: TaserHeaders;
47
- cookies: TaserCookieJar;
48
- var: Record<string, unknown>;
49
- };
50
- export type UnitRuntimeContext = Omit<RuntimeContextFields, "var">;
@@ -1,71 +0,0 @@
1
- import { MiddlewareDefinition as CoreMiddlewareDefinition, TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
2
- import { RequestShape, Simplify, UnitRuntimeContext, UnwrapPart } from './type-utils.js';
3
- import { ReturnsMap } from './returns.js';
4
- import { Schema } from './schema.js';
5
- export type { HttpMethod, Method } from './type-utils.js';
6
- export type { EmptyReturns, MergeReturns, ReturnsMap, HandlerReply, HasReturns, StatusCode, ValidHandlerReply, EnforceHandlerReply, } from './returns.js';
7
- /** Default empty app context for standalone units without a bound router instance. */
8
- export type EmptyAppContext = Record<never, never>;
9
- export type ValidatorParts = {
10
- query?: unknown;
11
- params?: unknown;
12
- body?: unknown;
13
- queryIn?: unknown;
14
- paramsIn?: unknown;
15
- bodyIn?: unknown;
16
- };
17
- export declare const StateBrand: unique symbol;
18
- export type NextResult<TState = unknown> = Response & {
19
- readonly [StateBrand]?: TState;
20
- };
21
- export type ExtractStateFromUnion<T> = T extends {
22
- readonly [StateBrand]?: infer S;
23
- } ? [S] extends [never] ? never : [unknown] extends [S] ? {} : S : never;
24
- export type ExtractState<T> = [ExtractStateFromUnion<Awaited<T>>] extends [never] ? {} : ExtractStateFromUnion<Awaited<T>>;
25
- export type IsUnknown<T> = [unknown] extends [T] ? true : false;
26
- export type NextFn<TExpectedState = unknown> = IsUnknown<TExpectedState> extends true ? <S extends Record<string, unknown> = {}>(state?: S) => Promise<NextResult<S>> : (state: TExpectedState) => Promise<NextResult<TExpectedState>>;
27
- export type MiddlewareDefinition = CoreMiddlewareDefinition<ReturnsMap>;
28
- export type MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TQueryIn = TQuery, TParamsIn = TParams, TBodyIn = TBody> = {
29
- query: UnwrapPart<TQuery>;
30
- params: UnwrapPart<TParams>;
31
- body: UnwrapPart<TBody>;
32
- state: UnwrapPart<TState>;
33
- /** Pre-parse shapes merged into route `$Infer.Input`. */
34
- input: {
35
- query: RequestShape<TQueryIn, TQuery>;
36
- params: RequestShape<TParamsIn, TParams>;
37
- body: RequestShape<TBodyIn, TBody>;
38
- };
39
- };
40
- export type MiddlewareRequirements = {
41
- query?: Record<string, unknown>;
42
- params?: Record<string, unknown>;
43
- body?: unknown;
44
- state?: Record<string, unknown>;
45
- };
46
- export type DefineMiddlewareResult<TQuery, TParams, TBody, TState, R, TQueryIn = TQuery, TParamsIn = TParams, TBodyIn = TBody, TReturns extends ReturnsMap = {}, TLayout = null, TRequires extends MiddlewareRequirements = {}> = MiddlewareUnit<MiddlewareReturnFromParts<TQuery, TParams, TBody, IsUnknown<TState> extends true ? ExtractState<R> : TState, TQueryIn, TParamsIn, TBodyIn>, TReturns, TLayout, TRequires>;
47
- export type StandaloneMiddlewareContext<TQuery = unknown, TParams = unknown, TBody = unknown, TAppContext extends Record<string, unknown> = EmptyAppContext, TState = {}, TRequires extends MiddlewareRequirements = {}> = Simplify<TAppContext & UnitRuntimeContext & {
48
- query: Simplify<UnwrapPart<TQuery> & (TRequires["query"] extends Record<string, unknown> ? TRequires["query"] : {})>;
49
- params: Simplify<UnwrapPart<TParams> & (TRequires["params"] extends Record<string, unknown> ? TRequires["params"] : {})>;
50
- body: Simplify<UnwrapPart<TBody> & (unknown extends TRequires["body"] ? {} : [TRequires["body"]] extends [undefined] ? {} : TRequires["body"])>;
51
- state: Simplify<UnwrapPart<TState> & (TRequires["state"] extends Record<string, unknown> ? TRequires["state"] : {})>;
52
- headers: TaserHeaders;
53
- cookies: TaserCookieJar;
54
- }>;
55
- export declare const MiddlewareUnitBrand: unique symbol;
56
- export type MiddlewareUnit<TAcc = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequires extends MiddlewareRequirements = {}> = MiddlewareDefinition & {
57
- readonly [MiddlewareUnitBrand]: true;
58
- readonly __middlewareAcc: TAcc;
59
- readonly __returns?: TReturns;
60
- readonly __requiredLayouts?: TRequiredLayouts;
61
- readonly __requirements?: TRequires;
62
- };
63
- export type MiddlewareUnitBuilder<TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequires extends MiddlewareRequirements = {}, TAppContext extends Record<string, unknown> = EmptyAppContext, TInheritedState = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, TExpectedState = unknown> = MiddlewareUnit<MiddlewareReturnFromParts<TQuery, TParams, TBody, IsUnknown<TExpectedState> extends true ? {} : TExpectedState, TQueryIn, TParamsIn, TBodyIn>, TReturns, TRequiredLayouts, TRequires> & {
64
- query<Q, QIn = unknown>(schema: Schema<Q, QIn>): MiddlewareUnitBuilder<Q, TParams, TBody, TReturns, TRequiredLayouts, TRequires, TAppContext, TInheritedState, QIn, TParamsIn, TBodyIn, TExpectedState>;
65
- params<P, PIn = unknown>(schema: Schema<P, PIn>): MiddlewareUnitBuilder<TQuery, P, TBody, TReturns, TRequiredLayouts, TRequires, TAppContext, TInheritedState, TQueryIn, PIn, TBodyIn, TExpectedState>;
66
- body<B, BIn = unknown>(schema: Schema<B, BIn>): MiddlewareUnitBuilder<TQuery, TParams, B, TReturns, TRequiredLayouts, TRequires, TAppContext, TInheritedState, TQueryIn, TParamsIn, BIn, TExpectedState>;
67
- body<Mode extends "json" | "form" | "urlencoded", B, BIn = unknown>(mode: Mode, schema: Schema<B, BIn>): MiddlewareUnitBuilder<TQuery, TParams, B, TReturns, TRequiredLayouts, TRequires, TAppContext, TInheritedState, TQueryIn, TParamsIn, BIn, TExpectedState>;
68
- returns<const M extends ReturnsMap>(map: M): MiddlewareUnitBuilder<TQuery, TParams, TBody, Omit<TReturns, keyof M> & M, TRequiredLayouts, TRequires, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn, TExpectedState>;
69
- requires<Requires extends MiddlewareRequirements>(): MiddlewareUnitBuilder<TQuery, TParams, TBody, TReturns, TRequiredLayouts, TRequires & Requires, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn, TExpectedState>;
70
- handler<R>(fn: (ctx: StandaloneMiddlewareContext<TQuery, TParams, TBody, TAppContext, TInheritedState, TRequires>, next: NextFn<TExpectedState>) => R): DefineMiddlewareResult<TQuery, TParams, TBody, IsUnknown<TExpectedState> extends true ? ExtractState<R> : TExpectedState, R, TQueryIn, TParamsIn, TBodyIn, TReturns, TRequiredLayouts, TRequires>;
71
- };
@@ -1,11 +0,0 @@
1
- import { RouteManifestShape, TaserRuntime } from '@taserjs/router-core';
2
- export declare class TaserServeView<THasNotFound extends boolean = boolean> {
3
- protected readonly runtime: TaserRuntime<THasNotFound>;
4
- readonly fetch: (request: Request, env?: unknown, executionCtx?: unknown) => THasNotFound extends true ? Promise<Response> | Response : Promise<Response | undefined> | Response | undefined;
5
- readonly request: (path: string, init?: RequestInit) => THasNotFound extends true ? Promise<Response> : Promise<Response | undefined>;
6
- constructor(runtime: TaserRuntime<THasNotFound>);
7
- }
8
- export declare class TaserApp<TManifest extends RouteManifestShape = RouteManifestShape, THasNotFound extends boolean = boolean> extends TaserServeView<THasNotFound> {
9
- readonly __manifest?: TManifest;
10
- constructor(runtime: TaserRuntime<THasNotFound>, manifest?: TManifest);
11
- }
@@ -1,26 +0,0 @@
1
- //#region src/builder/app.ts
2
- var TaserServeView = class {
3
- runtime;
4
- fetch;
5
- request;
6
- constructor(runtime) {
7
- this.runtime = runtime;
8
- this.fetch = (request, env, executionCtx) => {
9
- return this.runtime.fetch(request, env, executionCtx);
10
- };
11
- this.request = (path, init) => {
12
- return this.runtime.request(path, init);
13
- };
14
- }
15
- };
16
- var TaserApp = class extends TaserServeView {
17
- __manifest;
18
- constructor(runtime, manifest) {
19
- super(runtime);
20
- if (manifest !== void 0) this.__manifest = manifest;
21
- }
22
- };
23
- //#endregion
24
- export { TaserApp, TaserServeView };
25
-
26
- //# sourceMappingURL=app.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.js","names":[],"sources":["../../../src/builder/app.ts"],"sourcesContent":["import type { RouteManifestShape, TaserRuntime } from \"@taserjs/router-core\";\n\nexport class TaserServeView<THasNotFound extends boolean = boolean> {\n readonly fetch: (\n request: Request,\n env?: unknown,\n executionCtx?: unknown,\n ) => THasNotFound extends true\n ? Promise<Response> | Response\n : Promise<Response | undefined> | Response | undefined;\n\n readonly request: (\n path: string,\n init?: RequestInit,\n ) => THasNotFound extends true ? Promise<Response> : Promise<Response | undefined>;\n\n constructor(protected readonly runtime: TaserRuntime<THasNotFound>) {\n this.fetch = (request: Request, env?: unknown, executionCtx?: unknown) => {\n return this.runtime.fetch(request, env, executionCtx as never);\n };\n this.request = (path: string, init?: RequestInit) => {\n return this.runtime.request(path, init);\n };\n }\n}\n\nexport class TaserApp<\n TManifest extends RouteManifestShape = RouteManifestShape,\n THasNotFound extends boolean = boolean,\n> extends TaserServeView<THasNotFound> {\n readonly __manifest?: TManifest;\n\n constructor(runtime: TaserRuntime<THasNotFound>, manifest?: TManifest) {\n super(runtime);\n if (manifest !== undefined) {\n this.__manifest = manifest;\n }\n }\n}\n"],"mappings":";AAEA,IAAa,iBAAb,MAAoE;CAcnC;CAb/B;CAQA;CAKA,YAAY,SAAwD;EAArC,KAAA,UAAA;EAC7B,KAAK,SAAS,SAAkB,KAAe,iBAA2B;GACxE,OAAO,KAAK,QAAQ,MAAM,SAAS,KAAK,YAAqB;EAC/D;EACA,KAAK,WAAW,MAAc,SAAuB;GACnD,OAAO,KAAK,QAAQ,QAAQ,MAAM,IAAI;EACxC;CACF;AACF;AAEA,IAAa,WAAb,cAGU,eAA6B;CACrC;CAEA,YAAY,SAAqC,UAAsB;EACrE,MAAM,OAAO;EACb,IAAI,aAAa,KAAA,GACf,KAAK,aAAa;CAEtB;AACF"}
@@ -1,3 +0,0 @@
1
- /** Input schema keys validated by middleware and route handlers. Headers/cookies are parsed only. */
2
- export declare const SCHEMA_KEYS: readonly ["query", "params", "body"];
3
- export type SchemaKey = (typeof SCHEMA_KEYS)[number];
@@ -1,11 +0,0 @@
1
- //#region src/builder/constants.ts
2
- /** Input schema keys validated by middleware and route handlers. Headers/cookies are parsed only. */
3
- var SCHEMA_KEYS = [
4
- "query",
5
- "params",
6
- "body"
7
- ];
8
- //#endregion
9
- export { SCHEMA_KEYS };
10
-
11
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","names":[],"sources":["../../../src/builder/constants.ts"],"sourcesContent":["/** Input schema keys validated by middleware and route handlers. Headers/cookies are parsed only. */\nexport const SCHEMA_KEYS = [\"query\", \"params\", \"body\"] as const;\n\nexport type SchemaKey = (typeof SCHEMA_KEYS)[number];\n"],"mappings":";;AACA,IAAa,cAAc;CAAC;CAAS;CAAU;AAAM"}
@@ -1,34 +0,0 @@
1
- import { BodyMode } from '@taserjs/router-core';
2
- import { ReturnsMap } from '../types/returns.js';
3
- import { Schema } from '../types/schema.js';
4
- declare class MiddlewareUnitBuilderImpl {
5
- private readonly validators;
6
- private bodyMode;
7
- private returnsMap;
8
- readonly __requiredLayouts: string | readonly string[] | undefined;
9
- readonly __middlewareAcc: unknown;
10
- constructor(requiredLayouts?: string | readonly string[]);
11
- query(schema: Schema<unknown>): this;
12
- params(schema: Schema<unknown>): this;
13
- body(modeOrSchema: BodyMode | Schema<unknown>, schema?: Schema<unknown>): this;
14
- returns(map: ReturnsMap): this;
15
- requires(): this;
16
- handler(fn: (ctx: any, next: any) => any): {
17
- __middlewareAcc: unknown;
18
- __requiredLayouts?: string | readonly string[];
19
- returns?: ReturnsMap;
20
- __returns?: ReturnsMap;
21
- bodyMode?: BodyMode;
22
- handler?: (ctx: any, next: any) => any;
23
- };
24
- toUnit(fn?: (ctx: any, next: any) => any): {
25
- __middlewareAcc: unknown;
26
- __requiredLayouts?: string | readonly string[];
27
- returns?: ReturnsMap;
28
- __returns?: ReturnsMap;
29
- bodyMode?: BodyMode;
30
- handler?: (ctx: any, next: any) => any;
31
- };
32
- }
33
- export declare function createMiddlewareUnitBuilder(requiredLayouts?: string | readonly string[]): MiddlewareUnitBuilderImpl;
34
- export {};