@taserjs/router 0.0.2 → 0.0.4

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 (138) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/constants.cjs.map +1 -1
  3. package/dist/cjs/create-context.cjs.map +1 -1
  4. package/dist/cjs/define/handler.cjs.map +1 -1
  5. package/dist/cjs/define/middleware.cjs +18 -27
  6. package/dist/cjs/define/middleware.cjs.map +1 -1
  7. package/dist/cjs/define/middleware.d.cts +27 -79
  8. package/dist/cjs/define/validators.cjs.map +1 -1
  9. package/dist/cjs/factories.cjs.map +1 -1
  10. package/dist/cjs/factories.d.cts +2 -2
  11. package/dist/cjs/index.cjs +1 -2
  12. package/dist/cjs/index.d.cts +1 -1
  13. package/dist/cjs/middleware/body-limit.cjs +2 -2
  14. package/dist/cjs/middleware/body-limit.cjs.map +1 -1
  15. package/dist/cjs/middleware/compress.cjs +2 -2
  16. package/dist/cjs/middleware/compress.cjs.map +1 -1
  17. package/dist/cjs/middleware/cors.cjs +2 -2
  18. package/dist/cjs/middleware/cors.cjs.map +1 -1
  19. package/dist/cjs/middleware/csrf.cjs +2 -2
  20. package/dist/cjs/middleware/csrf.cjs.map +1 -1
  21. package/dist/cjs/middleware/etag.cjs +2 -2
  22. package/dist/cjs/middleware/etag.cjs.map +1 -1
  23. package/dist/cjs/middleware/jwk.cjs +11 -4
  24. package/dist/cjs/middleware/jwk.cjs.map +1 -1
  25. package/dist/cjs/middleware/jwk.d.cts +4 -5
  26. package/dist/cjs/middleware/jwt.cjs +11 -5
  27. package/dist/cjs/middleware/jwt.cjs.map +1 -1
  28. package/dist/cjs/middleware/jwt.d.cts +7 -5
  29. package/dist/cjs/middleware/secure-headers.cjs +2 -2
  30. package/dist/cjs/middleware/secure-headers.cjs.map +1 -1
  31. package/dist/cjs/middleware/timing.cjs +2 -2
  32. package/dist/cjs/middleware/timing.cjs.map +1 -1
  33. package/dist/cjs/middleware/wrap-hono.cjs +9 -0
  34. package/dist/cjs/middleware/wrap-hono.cjs.map +1 -0
  35. package/dist/cjs/middleware/wrap-hono.d.cts +3 -0
  36. package/dist/cjs/middleware.cjs.map +1 -1
  37. package/dist/cjs/reply.d.cts +1 -1
  38. package/dist/cjs/route.cjs.map +1 -1
  39. package/dist/cjs/route.d.cts +1 -1
  40. package/dist/cjs/stream.d.cts +1 -1
  41. package/dist/cjs/taser-app.cjs +0 -6
  42. package/dist/cjs/taser-app.cjs.map +1 -1
  43. package/dist/cjs/taser-app.d.cts +0 -3
  44. package/dist/cjs/taser-router.cjs +9 -10
  45. package/dist/cjs/taser-router.cjs.map +1 -1
  46. package/dist/cjs/taser-router.d.cts +9 -11
  47. package/dist/cjs/types/app.d.cts +3 -2
  48. package/dist/cjs/types/index.d.cts +94 -143
  49. package/dist/cjs/types/type-utils.d.cts +8 -10
  50. package/dist/cjs/types/units.cjs.map +1 -1
  51. package/dist/cjs/types/units.d.cts +32 -27
  52. package/dist/esm/constants.js.map +1 -1
  53. package/dist/esm/create-context.js.map +1 -1
  54. package/dist/esm/define/handler.js.map +1 -1
  55. package/dist/esm/define/middleware.d.ts +27 -79
  56. package/dist/esm/define/middleware.js +18 -27
  57. package/dist/esm/define/middleware.js.map +1 -1
  58. package/dist/esm/define/validators.js.map +1 -1
  59. package/dist/esm/factories.d.ts +2 -2
  60. package/dist/esm/factories.js.map +1 -1
  61. package/dist/esm/index.d.ts +1 -1
  62. package/dist/esm/index.js +3 -3
  63. package/dist/esm/middleware/body-limit.js +1 -1
  64. package/dist/esm/middleware/body-limit.js.map +1 -1
  65. package/dist/esm/middleware/compress.js +1 -1
  66. package/dist/esm/middleware/compress.js.map +1 -1
  67. package/dist/esm/middleware/cors.js +1 -1
  68. package/dist/esm/middleware/cors.js.map +1 -1
  69. package/dist/esm/middleware/csrf.js +1 -1
  70. package/dist/esm/middleware/csrf.js.map +1 -1
  71. package/dist/esm/middleware/etag.js +1 -1
  72. package/dist/esm/middleware/etag.js.map +1 -1
  73. package/dist/esm/middleware/jwk.d.ts +4 -5
  74. package/dist/esm/middleware/jwk.js +11 -4
  75. package/dist/esm/middleware/jwk.js.map +1 -1
  76. package/dist/esm/middleware/jwt.d.ts +7 -5
  77. package/dist/esm/middleware/jwt.js +11 -5
  78. package/dist/esm/middleware/jwt.js.map +1 -1
  79. package/dist/esm/middleware/secure-headers.js +1 -1
  80. package/dist/esm/middleware/secure-headers.js.map +1 -1
  81. package/dist/esm/middleware/timing.js +1 -1
  82. package/dist/esm/middleware/timing.js.map +1 -1
  83. package/dist/esm/middleware/wrap-hono.d.ts +3 -0
  84. package/dist/esm/middleware/wrap-hono.js +9 -0
  85. package/dist/esm/middleware/wrap-hono.js.map +1 -0
  86. package/dist/esm/middleware.js.map +1 -1
  87. package/dist/esm/reply.d.ts +1 -1
  88. package/dist/esm/route.d.ts +1 -1
  89. package/dist/esm/route.js.map +1 -1
  90. package/dist/esm/stream.d.ts +1 -1
  91. package/dist/esm/taser-app.d.ts +0 -3
  92. package/dist/esm/taser-app.js +1 -6
  93. package/dist/esm/taser-app.js.map +1 -1
  94. package/dist/esm/taser-router.d.ts +9 -11
  95. package/dist/esm/taser-router.js +7 -8
  96. package/dist/esm/taser-router.js.map +1 -1
  97. package/dist/esm/types/app.d.ts +3 -2
  98. package/dist/esm/types/index.d.ts +94 -143
  99. package/dist/esm/types/type-utils.d.ts +8 -10
  100. package/dist/esm/types/units.d.ts +32 -27
  101. package/dist/esm/types/units.js.map +1 -1
  102. package/package.json +17 -17
  103. package/src/constants.ts +6 -6
  104. package/src/create-context.ts +8 -8
  105. package/src/define/handler.ts +24 -34
  106. package/src/define/middleware.ts +222 -222
  107. package/src/define/validators.ts +10 -10
  108. package/src/factories.ts +63 -61
  109. package/src/index.ts +12 -12
  110. package/src/middleware/body-limit.ts +5 -5
  111. package/src/middleware/compress.ts +5 -5
  112. package/src/middleware/cors.ts +5 -5
  113. package/src/middleware/csrf.ts +5 -5
  114. package/src/middleware/etag.ts +5 -5
  115. package/src/middleware/jwk.ts +33 -26
  116. package/src/middleware/jwt.ts +26 -10
  117. package/src/middleware/secure-headers.ts +5 -5
  118. package/src/middleware/timing.ts +5 -5
  119. package/src/middleware/wrap-hono.ts +12 -0
  120. package/src/middleware.ts +7 -7
  121. package/src/reply.ts +2 -6
  122. package/src/route.ts +45 -48
  123. package/src/stream.ts +1 -7
  124. package/src/taser-app.ts +13 -18
  125. package/src/taser-router.ts +103 -98
  126. package/src/types/app.ts +33 -35
  127. package/src/types/index.ts +403 -731
  128. package/src/types/returns.ts +92 -97
  129. package/src/types/schema.ts +8 -9
  130. package/src/types/type-utils.ts +42 -45
  131. package/src/types/units.ts +140 -104
  132. package/dist/cjs/middleware/auth.cjs +0 -34
  133. package/dist/cjs/middleware/auth.cjs.map +0 -1
  134. package/dist/cjs/middleware/auth.d.cts +0 -9
  135. package/dist/esm/middleware/auth.d.ts +0 -9
  136. package/dist/esm/middleware/auth.js +0 -33
  137. package/dist/esm/middleware/auth.js.map +0 -1
  138. package/src/middleware/auth.ts +0 -51
@@ -1,16 +1,15 @@
1
1
  import { Awaitable, TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
2
- import { ReplyResult } from '@taserjs/router-utils';
3
2
  import { RouterRegister } from '../register.js';
4
- import { MergeMiddlewareField, MergeMiddlewareInputField, MergePart, RequestShape, RuntimeContextFields, Simplify } from './type-utils.js';
3
+ import { MergeMiddlewareField, MergeMiddlewareInputField, MergePart, RequestShape, RuntimeContextFields, Simplify, UnionToIntersection } from './type-utils.js';
5
4
  import { ReturnsMap, ValidHandlerReply } from './returns.js';
6
5
  import { Schema } from './schema.js';
7
- import { AppContext, HandlerContext, HandlerUnit, Method, MiddlewareDefinition, MiddlewareReturnFromParts, MiddlewareUnit, NativeContext, ValidatorParts } from './units.js';
6
+ import { AppContext, ExtractState, HandlerContext, HandlerUnit, InlineMiddlewareOptions, Method, MiddlewareDefinition, MiddlewareReturnFromParts, MiddlewareUnit, NativeContext, ValidatorParts } from './units.js';
8
7
  export type { Awaitable } from '@taserjs/router-core';
9
8
  export type { SchemaRequestShape, InferInput, InferOutput, Schema, StandardSchemaV1, } from './schema.js';
10
9
  export type { RouterRegister } from '../register.js';
11
10
  export type { MergeMiddlewareField, MergeMiddlewareInputField, MergePart, RequestShape, Simplify, UnwrapPart, } from './type-utils.js';
12
11
  export type { EmptyReturns, EnforceHandlerReply, HandlerReply, HasReturns, MergeReturns, ReplyResultFor, ReturnsMap, StatusCode, ValidHandlerReply, } from './returns.js';
13
- export type { AppContext, HandlerContext, HandlerUnit, HttpMethod, InlineMiddlewareOptions, Method, MiddlewareDefinition, MiddlewareNext, MiddlewareReturnFromParts, MiddlewareUnit, NativeContext, StandaloneMiddlewareContext, ValidatorParts, } from './units.js';
12
+ export type { AppContext, ExtractState, HandlerContext, HandlerUnit, HttpMethod, InlineMiddlewareOptions, IsUnknown, Method, MiddlewareDefinition, MiddlewareNext, MiddlewareReturnFromParts, MiddlewareUnit, NativeContext, NextFn, NextResult, StandaloneMiddlewareContext, StateBrand, ValidatorParts, } from './units.js';
14
13
  export type RoutePath = RouterRegister extends {
15
14
  RoutePath: infer P;
16
15
  } ? P : never;
@@ -23,9 +22,9 @@ export type LayoutTree = RouterRegister extends {
23
22
  export type RouteByPathMethod = RouterRegister extends {
24
23
  RouteByPathMethod: infer R;
25
24
  } ? R : Record<never, never>;
26
- type ParseParam<Segment extends string> = Segment extends '*' ? {
25
+ type ParseParam<Segment extends string> = Segment extends "*" ? {
27
26
  _splat: string;
28
- } : Segment extends `:${infer Name extends string}` ? Name extends '' ? {} : {
27
+ } : Segment extends `:${infer Name extends string}` ? Name extends "" ? {} : {
29
28
  [K in Name]: string;
30
29
  } : {};
31
30
  type ParseParamsFromSegments<S extends string> = S extends `${infer Segment}/${infer Rest}` ? ParseParam<Segment> & ParseParamsFromSegments<Rest> : ParseParam<S>;
@@ -35,11 +34,17 @@ type LayoutParent<Layout extends LayoutId> = LayoutTree[Layout] extends {
35
34
  } ? Parent : null;
36
35
  type ResolveLayoutMiddlewares<Layout extends LayoutId | null> = Layout extends null ? readonly [] : Layout extends LayoutId ? readonly [
37
36
  ...ResolveLayoutMiddlewares<LayoutParent<Layout>>,
38
- ...LayoutTree[Layout]['middlewares']
37
+ ...LayoutTree[Layout]["middlewares"]
39
38
  ] : readonly [];
39
+ export type ResolveLayoutIdChain<L extends LayoutId | null> = L extends null ? readonly [] : L extends LayoutId ? readonly [...ResolveLayoutIdChain<LayoutParent<L>>, L] : readonly [];
40
+ export type ResolveLayoutMiddlewaresState<Layout extends LayoutId | null> = Layout extends LayoutId ? MergeMiddlewareField<ResolveLayoutMiddlewares<Layout>, "state"> : {};
41
+ 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> : {};
40
42
  /** Fold layout middleware Acc from a route's layoutChain (shallow → deep). */
41
- type ResolveLayoutChainMiddlewares<Chain extends readonly LayoutId[]> = Chain extends readonly [infer Head extends LayoutId, ...infer Rest] ? readonly [
42
- ...LayoutTree[Head]['middlewares'],
43
+ type ResolveLayoutChainMiddlewares<Chain extends readonly LayoutId[]> = Chain extends readonly [
44
+ infer Head extends LayoutId,
45
+ ...infer Rest
46
+ ] ? readonly [
47
+ ...LayoutTree[Head]["middlewares"],
43
48
  ...ResolveLayoutChainMiddlewares<Rest extends readonly LayoutId[] ? Rest : readonly []>
44
49
  ] : readonly [];
45
50
  type RouteEntry<Path extends RoutePath, TMethod extends Method> = RouteByPathMethod[Path] extends {
@@ -51,15 +56,14 @@ type RouteParent<Path extends RoutePath, TMethod extends Method> = RouteEntry<Pa
51
56
  type RouteLayoutChain<Path extends RoutePath, TMethod extends Method> = RouteEntry<Path, TMethod> extends {
52
57
  layoutChain: infer Chain extends readonly LayoutId[];
53
58
  } ? Chain : RouteParent<Path, TMethod> extends LayoutId ? readonly [RouteParent<Path, TMethod>] : readonly [];
54
- type RouteResolvedField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends 'query' | 'params' | 'body' | 'state' | 'ctx'> = MergeMiddlewareField<ResolveLayoutChainMiddlewares<RouteLayoutChain<Path, TMethod>>, Field> & MergeMiddlewareField<Acc, Field>;
55
- type MiddlewareCtxField<Layout extends LayoutId, Field extends 'query' | 'params' | 'body' | 'state' | 'ctx'> = MergeMiddlewareField<ResolveLayoutMiddlewares<LayoutParent<Layout>>, Field>;
56
- type RouteChainField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends 'query' | 'params' | 'body' | 'state' | 'ctx'> = RouteResolvedField<Path, TMethod, Acc, Field>;
57
- type UnitRuntimeContext = Omit<RuntimeContextFields<NativeContext>, 'var'>;
58
- 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 & RouteChainField<Path, TMethod, Acc, 'ctx'> & {
59
- query: Simplify<MergePart<TQuery, RouteChainField<Path, TMethod, Acc, 'query'>>>;
60
- params: Simplify<PathParams<Path> & MergePart<TParams, RouteChainField<Path, TMethod, Acc, 'params'>>>;
61
- body: Simplify<MergePart<TBody, RouteChainField<Path, TMethod, Acc, 'body'>>>;
62
- state: Simplify<RouteChainField<Path, TMethod, Acc, 'state'>>;
59
+ type RouteResolvedField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends "query" | "params" | "body" | "state"> = MergeMiddlewareField<ResolveLayoutChainMiddlewares<RouteLayoutChain<Path, TMethod>>, Field> & MergeMiddlewareField<Acc, Field>;
60
+ type RouteChainField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends "query" | "params" | "body" | "state"> = RouteResolvedField<Path, TMethod, Acc, Field>;
61
+ type UnitRuntimeContext = Omit<RuntimeContextFields<NativeContext>, "var">;
62
+ 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 & {
63
+ query: Simplify<MergePart<TQuery, RouteChainField<Path, TMethod, Acc, "query">>>;
64
+ params: Simplify<PathParams<Path> & MergePart<TParams, RouteChainField<Path, TMethod, Acc, "params">>>;
65
+ body: Simplify<MergePart<TBody, RouteChainField<Path, TMethod, Acc, "body">>>;
66
+ state: Simplify<RouteChainField<Path, TMethod, Acc, "state">>;
63
67
  headers: TaserHeaders;
64
68
  cookies: TaserCookieJar;
65
69
  }>;
@@ -67,42 +71,46 @@ export type RouteHandleContext<Path extends RoutePath, TMethod extends Method, A
67
71
  query?: unknown;
68
72
  params?: unknown;
69
73
  body?: unknown;
70
- }, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & RouteResolvedField<Path, TMethod, Acc, 'ctx'> & {
74
+ }, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & {
71
75
  path: Path;
72
76
  method: TMethod;
73
77
  query: Simplify<MergePart<Validators extends {
74
78
  query?: infer Q;
75
- } ? Q : unknown, RouteResolvedField<Path, TMethod, Acc, 'query'>>>;
79
+ } ? Q : unknown, RouteResolvedField<Path, TMethod, Acc, "query">>>;
76
80
  params: Simplify<PathParams<Path> & MergePart<Validators extends {
77
81
  params?: infer P;
78
- } ? P : unknown, RouteResolvedField<Path, TMethod, Acc, 'params'>>>;
82
+ } ? P : unknown, RouteResolvedField<Path, TMethod, Acc, "params">>>;
79
83
  body: Simplify<MergePart<Validators extends {
80
84
  body?: infer B;
81
- } ? B : unknown, RouteResolvedField<Path, TMethod, Acc, 'body'>>>;
82
- state: Simplify<RouteResolvedField<Path, TMethod, Acc, 'state'>>;
85
+ } ? B : unknown, RouteResolvedField<Path, TMethod, Acc, "body">>>;
86
+ state: Simplify<RouteResolvedField<Path, TMethod, Acc, "state">>;
83
87
  headers: TaserHeaders;
84
88
  cookies: TaserCookieJar;
85
89
  }>;
86
90
  export type RouteHandleContextWithoutBody<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends {
87
91
  query?: unknown;
88
92
  params?: unknown;
89
- }, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & RouteResolvedField<Path, TMethod, Acc, 'ctx'> & {
93
+ }, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & {
90
94
  path: Path;
91
95
  method: TMethod;
92
96
  query: Simplify<MergePart<Validators extends {
93
97
  query?: infer Q;
94
- } ? Q : unknown, RouteResolvedField<Path, TMethod, Acc, 'query'>>>;
98
+ } ? Q : unknown, RouteResolvedField<Path, TMethod, Acc, "query">>>;
95
99
  params: Simplify<PathParams<Path> & MergePart<Validators extends {
96
100
  params?: infer P;
97
- } ? P : unknown, RouteResolvedField<Path, TMethod, Acc, 'params'>>>;
101
+ } ? P : unknown, RouteResolvedField<Path, TMethod, Acc, "params">>>;
98
102
  body: never;
99
- state: Simplify<RouteResolvedField<Path, TMethod, Acc, 'state'>>;
103
+ state: Simplify<RouteResolvedField<Path, TMethod, Acc, "state">>;
100
104
  headers: TaserHeaders;
101
105
  cookies: TaserCookieJar;
102
106
  }>;
103
- type RouteResolvedInputField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends 'query' | 'params' | 'body'> = MergeMiddlewareInputField<ResolveLayoutChainMiddlewares<RouteLayoutChain<Path, TMethod>>, Field> & MergeMiddlewareInputField<Acc, Field>;
107
+ type RouteResolvedInputField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends "query" | "params" | "body"> = MergeMiddlewareInputField<ResolveLayoutChainMiddlewares<RouteLayoutChain<Path, TMethod>>, Field> & MergeMiddlewareInputField<Acc, Field>;
104
108
  type IsNever<T> = [T] extends [never] ? true : false;
105
109
  type IsEmptyObject<T> = [keyof T] extends [never] ? true : false;
110
+ export type IsLayoutAllowed<TRequiredLayouts, TChain extends readonly LayoutId[]> = [
111
+ TRequiredLayouts
112
+ ] 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;
113
+ export type IsStateSatisfied<TActualState, TRequiredState> = [TRequiredState] extends [never] ? true : [unknown] extends [TRequiredState] ? true : [null] extends [TRequiredState] ? true : [undefined] extends [TRequiredState] ? true : [IsEmptyObject<TRequiredState>] extends [true] ? true : [TActualState] extends [TRequiredState] ? true : false;
106
114
  type InputFacet<T, K extends string> = IsNever<T> extends true ? {} : IsEmptyObject<T> extends true ? {} : {
107
115
  [Key in K]: T;
108
116
  };
@@ -110,19 +118,19 @@ type RouteQueryInput<Path extends RoutePath, TMethod extends Method, Acc extends
110
118
  queryIn?: infer QI;
111
119
  } ? QI : unknown, Validators extends {
112
120
  query?: infer Q;
113
- } ? Q : unknown>, RouteResolvedInputField<Path, TMethod, Acc, 'query'>>>;
121
+ } ? Q : unknown>, RouteResolvedInputField<Path, TMethod, Acc, "query">>>;
114
122
  type RouteParamsInput<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends ValidatorParts> = Simplify<PathParams<Path> & MergePart<RequestShape<Validators extends {
115
123
  paramsIn?: infer PI;
116
124
  } ? PI : unknown, Validators extends {
117
125
  params?: infer P;
118
- } ? P : unknown>, RouteResolvedInputField<Path, TMethod, Acc, 'params'>>>;
126
+ } ? P : unknown>, RouteResolvedInputField<Path, TMethod, Acc, "params">>>;
119
127
  type RouteBodyInput<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Validators extends ValidatorParts> = Simplify<MergePart<RequestShape<Validators extends {
120
128
  bodyIn?: infer BI;
121
129
  } ? BI : unknown, Validators extends {
122
130
  body?: infer B;
123
- } ? B : unknown>, RouteResolvedInputField<Path, TMethod, Acc, 'body'>>>;
124
- 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'>>;
125
- 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'>>;
131
+ } ? B : unknown>, RouteResolvedInputField<Path, TMethod, Acc, "body">>>;
132
+ 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">>;
133
+ 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">>;
126
134
  export type InferRouteInput<Path extends RoutePath, TMethod extends Method> = RouteEntry<Path, TMethod> extends {
127
135
  route: infer Route;
128
136
  } ? Route extends {
@@ -130,88 +138,48 @@ export type InferRouteInput<Path extends RoutePath, TMethod extends Method> = Ro
130
138
  Input: infer I;
131
139
  };
132
140
  } ? I : never : never;
133
- type MiddlewareChainField<Layout extends LayoutId, Acc extends readonly unknown[], Field extends 'query' | 'params' | 'body' | 'state' | 'ctx'> = MiddlewareCtxField<Layout, Field> & MergeMiddlewareField<Acc, Field>;
134
- export type MiddlewareChainContext<Layout extends LayoutId, Acc extends readonly unknown[], TQuery, TParams, TBody, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & MiddlewareChainField<Layout, Acc, 'ctx'> & {
135
- query: Simplify<MergePart<TQuery, MiddlewareChainField<Layout, Acc, 'query'>>>;
136
- params: Simplify<MergePart<TParams, MiddlewareChainField<Layout, Acc, 'params'>>>;
137
- body: Simplify<MergePart<TBody, MiddlewareChainField<Layout, Acc, 'body'>>>;
138
- state: Simplify<MiddlewareChainField<Layout, Acc, 'state'>>;
141
+ type MiddlewareChainField<Layout extends LayoutId, Acc extends readonly unknown[], Field extends "query" | "params" | "body" | "state"> = MergeMiddlewareField<ResolveLayoutMiddlewares<LayoutParent<Layout>>, Field> & MergeMiddlewareField<Acc, Field>;
142
+ export type MiddlewareChainContext<Layout extends LayoutId, Acc extends readonly unknown[], TQuery, TParams, TBody, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & {
143
+ query: Simplify<MergePart<TQuery, MiddlewareChainField<Layout, Acc, "query">>>;
144
+ params: Simplify<MergePart<TParams, MiddlewareChainField<Layout, Acc, "params">>>;
145
+ body: Simplify<MergePart<TBody, MiddlewareChainField<Layout, Acc, "body">>>;
146
+ state: Simplify<MiddlewareChainField<Layout, Acc, "state">>;
139
147
  headers: TaserHeaders;
140
148
  cookies: TaserCookieJar;
141
149
  }>;
142
- type StatefulUseOptions<Ctx, TState, TQuery, TParams, TBody, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown> = {
143
- state: Schema<TState>;
144
- query?: Schema<TQuery, TQueryIn>;
145
- params?: Schema<TParams, TParamsIn>;
146
- body?: Schema<TBody, TBodyIn>;
147
- returns?: TReturns;
148
- handler: (ctx: Ctx, next: (args: {
149
- state: TState;
150
- }) => Promise<ReplyResult>) => Awaitable<ReplyResult | Response | unknown>;
151
- };
152
- type CtxUseOptions<Ctx, TCtx, TQuery, TParams, TBody, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown> = {
153
- ctx: Schema<TCtx>;
154
- query?: Schema<TQuery, TQueryIn>;
155
- params?: Schema<TParams, TParamsIn>;
156
- body?: Schema<TBody, TBodyIn>;
157
- returns?: TReturns;
158
- handler: (ctx: Ctx, next: (args: {
159
- ctx: TCtx;
160
- }) => Promise<ReplyResult>) => Awaitable<ReplyResult | Response | unknown>;
161
- };
162
- type StateAndCtxUseOptions<Ctx, TState, TCtx, TQuery, TParams, TBody, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown> = {
163
- state: Schema<TState>;
164
- ctx: Schema<TCtx>;
165
- query?: Schema<TQuery, TQueryIn>;
166
- params?: Schema<TParams, TParamsIn>;
167
- body?: Schema<TBody, TBodyIn>;
168
- returns?: TReturns;
169
- handler: (ctx: Ctx, next: (args: {
170
- state: TState;
171
- ctx: TCtx;
172
- }) => Promise<ReplyResult>) => Awaitable<ReplyResult | Response | unknown>;
173
- };
174
- type StatelessUseOptions<Ctx, TQuery, TParams, TBody, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown> = {
175
- query?: Schema<TQuery, TQueryIn>;
176
- params?: Schema<TParams, TParamsIn>;
177
- body?: Schema<TBody, TBodyIn>;
178
- returns?: TReturns;
179
- handler: (ctx: Ctx, next: () => Promise<ReplyResult>) => Awaitable<ReplyResult | Response | unknown>;
180
- };
181
150
  export type MiddlewareBuilder<Layout extends LayoutId, Acc extends readonly unknown[] = readonly [], TAppContext extends Record<string, unknown> = AppContext> = Acc & {
182
151
  readonly layout: Layout;
183
152
  readonly middlewares: readonly MiddlewareDefinition[];
184
153
  readonly $Infer: {
185
154
  Context: MiddlewareChainContext<Layout, Acc, unknown, unknown, unknown, TAppContext>;
186
155
  };
187
- use<TAcc, TReturns extends ReturnsMap = {}>(unit: MiddlewareUnit<TAcc, TReturns>): MiddlewareBuilder<Layout, readonly [...Acc, TAcc], TAppContext>;
188
- use<TState, TCtx, TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: StateAndCtxUseOptions<MiddlewareChainContext<Layout, Acc, TQuery, TParams, TBody, TAppContext>, TState, TCtx, TQuery, TParams, TBody, TReturns, TQueryIn, TParamsIn, TBodyIn>): MiddlewareBuilder<Layout, readonly [
189
- ...Acc,
190
- MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TCtx, TQueryIn, TParamsIn, TBodyIn>
191
- ], TAppContext>;
192
- use<TState, TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: StatefulUseOptions<MiddlewareChainContext<Layout, Acc, TQuery, TParams, TBody, TAppContext>, TState, TQuery, TParams, TBody, TReturns, TQueryIn, TParamsIn, TBodyIn>): MiddlewareBuilder<Layout, readonly [
193
- ...Acc,
194
- MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, unknown, TQueryIn, TParamsIn, TBodyIn>
195
- ], TAppContext>;
196
- use<TCtx, TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: CtxUseOptions<MiddlewareChainContext<Layout, Acc, TQuery, TParams, TBody, TAppContext>, TCtx, TQuery, TParams, TBody, TReturns, TQueryIn, TParamsIn, TBodyIn>): MiddlewareBuilder<Layout, readonly [
197
- ...Acc,
198
- MiddlewareReturnFromParts<TQuery, TParams, TBody, {}, TCtx, TQueryIn, TParamsIn, TBodyIn>
199
- ], TAppContext>;
200
- use<TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: StatelessUseOptions<MiddlewareChainContext<Layout, Acc, TQuery, TParams, TBody, TAppContext>, TQuery, TParams, TBody, TReturns, TQueryIn, TParamsIn, TBodyIn>): MiddlewareBuilder<Layout, readonly [
156
+ use<TAcc, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown>(unit: MiddlewareUnit<TAcc, TReturns, TRequiredLayouts, TRequiredState>, ..._assert: [
157
+ IsLayoutAllowed<TRequiredLayouts, ResolveLayoutIdChain<Layout>>,
158
+ IsStateSatisfied<MiddlewareChainField<Layout, Acc, "state">, TRequiredState>
159
+ ] extends [true, true] ? [] : [
160
+ {
161
+ error: "Middleware cannot be attached to this layout";
162
+ requiredLayouts: TRequiredLayouts;
163
+ layoutChain: ResolveLayoutIdChain<Layout>;
164
+ requiredState: TRequiredState;
165
+ actualState: MiddlewareChainField<Layout, Acc, "state">;
166
+ }
167
+ ]): MiddlewareBuilder<Layout, readonly [...Acc, TAcc], TAppContext>;
168
+ use<TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, R = unknown>(options: InlineMiddlewareOptions<MiddlewareChainContext<Layout, Acc, TQuery, TParams, TBody, TAppContext>, TQuery, TParams, TBody, TReturns, TQueryIn, TParamsIn, TBodyIn, R>): MiddlewareBuilder<Layout, readonly [
201
169
  ...Acc,
202
- MiddlewareReturnFromParts<TQuery, TParams, TBody, {}, unknown, TQueryIn, TParamsIn, TBodyIn>
170
+ MiddlewareReturnFromParts<TQuery, TParams, TBody, ExtractState<R>, TQueryIn, TParamsIn, TBodyIn>
203
171
  ], TAppContext>;
204
172
  };
205
173
  export type RouteExport<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], TReturns extends ReturnsMap = {}, TOutput = Response> = Acc & {
206
174
  readonly path: Path;
207
- readonly method: TMethod | 'ANY' | 'ALL';
175
+ readonly method: TMethod | "ANY" | "ALL";
208
176
  readonly methods?: readonly Method[];
209
177
  readonly middlewares: readonly MiddlewareDefinition[];
210
178
  readonly handlerMiddlewares: readonly MiddlewareDefinition[];
211
179
  readonly returns?: TReturns;
212
180
  handler: (ctx: unknown) => Awaitable<Response>;
213
181
  readonly $Infer: {
214
- Context: TMethod extends 'GET' | 'DELETE' | 'HEAD' | 'OPTIONS' ? RouteHandleContextWithoutBody<Path, TMethod, Acc, {}> : RouteHandleContext<Path, TMethod, Acc, {}>;
182
+ Context: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleContextWithoutBody<Path, TMethod, Acc, {}> : RouteHandleContext<Path, TMethod, Acc, {}>;
215
183
  /** Concrete handler reply (`ReplyOf` union) for client inference. */
216
184
  Output: TOutput;
217
185
  };
@@ -222,10 +190,10 @@ export type RouteExport<Path extends RoutePath, TMethod extends Method, Acc exte
222
190
  handlerParams?: Schema<unknown>;
223
191
  handlerBody?: Schema<unknown>;
224
192
  };
225
- 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'> & {
193
+ 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"> & {
226
194
  readonly $Infer: {
227
- Context: TMethod extends 'GET' | 'DELETE' | 'HEAD' | 'OPTIONS' ? RouteHandleContextWithoutBody<Path, TMethod, Acc, Validators, TAppContext> : RouteHandleContext<Path, TMethod, Acc, Validators, TAppContext>;
228
- Input: TMethod extends 'GET' | 'DELETE' | 'HEAD' | 'OPTIONS' ? RouteHandleInputWithoutBody<Path, TMethod, Acc, Validators> : RouteHandleInput<Path, TMethod, Acc, Validators>;
195
+ Context: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleContextWithoutBody<Path, TMethod, Acc, Validators, TAppContext> : RouteHandleContext<Path, TMethod, Acc, Validators, TAppContext>;
196
+ Input: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleInputWithoutBody<Path, TMethod, Acc, Validators> : RouteHandleInput<Path, TMethod, Acc, Validators>;
229
197
  Output: TOutput;
230
198
  };
231
199
  };
@@ -233,27 +201,26 @@ export type RouteBuilder<Path extends RoutePath, TMethod extends Method, Acc ext
233
201
  readonly path: Path;
234
202
  readonly method: TMethod;
235
203
  readonly $Infer: {
236
- Context: TMethod extends 'GET' | 'DELETE' | 'HEAD' | 'OPTIONS' ? RouteHandleContextWithoutBody<Path, TMethod, Acc, Validators, TAppContext> : RouteHandleContext<Path, TMethod, Acc, Validators, TAppContext>;
204
+ Context: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS" ? RouteHandleContextWithoutBody<Path, TMethod, Acc, Validators, TAppContext> : RouteHandleContext<Path, TMethod, Acc, Validators, TAppContext>;
237
205
  };
238
206
  returns<const M extends ReturnsMap>(map: M): RouteBuilder<Path, TMethod, Acc, Validators, Omit<TReturns, keyof M> & M, TAppContext>;
239
- use<TAcc, UReturns extends ReturnsMap = {}>(unit: MiddlewareUnit<TAcc, UReturns>): RouteBuilder<Path, TMethod, readonly [...Acc, TAcc], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
240
- use<TState, TCtx, TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: StateAndCtxUseOptions<RouteChainContext<Path, TMethod, Acc, TQuery, TParams, TBody, TAppContext>, TState, TCtx, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn>): RouteBuilder<Path, TMethod, readonly [
241
- ...Acc,
242
- MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TCtx, TQueryIn, TParamsIn, TBodyIn>
243
- ], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
244
- use<TState, TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: StatefulUseOptions<RouteChainContext<Path, TMethod, Acc, TQuery, TParams, TBody, TAppContext>, TState, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn>): RouteBuilder<Path, TMethod, readonly [
245
- ...Acc,
246
- MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, unknown, TQueryIn, TParamsIn, TBodyIn>
247
- ], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
248
- use<TCtx, TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: CtxUseOptions<RouteChainContext<Path, TMethod, Acc, TQuery, TParams, TBody, TAppContext>, TCtx, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn>): RouteBuilder<Path, TMethod, readonly [
249
- ...Acc,
250
- MiddlewareReturnFromParts<TQuery, TParams, TBody, {}, TCtx, TQueryIn, TParamsIn, TBodyIn>
251
- ], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
252
- use<TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: StatelessUseOptions<RouteChainContext<Path, TMethod, Acc, TQuery, TParams, TBody, TAppContext>, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn>): RouteBuilder<Path, TMethod, readonly [
207
+ use<TAcc, UReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown>(unit: MiddlewareUnit<TAcc, UReturns, TRequiredLayouts, TRequiredState>, ..._assert: [
208
+ IsLayoutAllowed<TRequiredLayouts, RouteLayoutChain<Path, TMethod>>,
209
+ IsStateSatisfied<RouteResolvedField<Path, TMethod, Acc, "state">, TRequiredState>
210
+ ] extends [true, true] ? [] : [
211
+ {
212
+ error: "Middleware cannot be attached to this route";
213
+ requiredLayouts: TRequiredLayouts;
214
+ routeLayoutChain: RouteLayoutChain<Path, TMethod>;
215
+ requiredState: TRequiredState;
216
+ actualState: RouteResolvedField<Path, TMethod, Acc, "state">;
217
+ }
218
+ ]): RouteBuilder<Path, TMethod, readonly [...Acc, TAcc], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
219
+ use<TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, R = unknown>(options: InlineMiddlewareOptions<RouteChainContext<Path, TMethod, Acc, TQuery, TParams, TBody, TAppContext>, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn, R>): RouteBuilder<Path, TMethod, readonly [
253
220
  ...Acc,
254
- MiddlewareReturnFromParts<TQuery, TParams, TBody, {}, unknown, TQueryIn, TParamsIn, TBodyIn>
221
+ MiddlewareReturnFromParts<TQuery, TParams, TBody, ExtractState<R>, TQueryIn, TParamsIn, TBodyIn>
255
222
  ], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
256
- 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>] ? [] : [
223
+ 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>] ? [] : [
257
224
  {
258
225
  expected: ValidHandlerReply<R, TReturns>;
259
226
  actual: R;
@@ -263,38 +230,22 @@ export type RouteBuilder<Path extends RoutePath, TMethod extends Method, Acc ext
263
230
  };
264
231
  export type HandlerBuilder<Acc extends readonly unknown[] = readonly [], Validators extends ValidatorParts = {}, TReturns extends ReturnsMap = {}, TAppContext extends Record<string, unknown> = AppContext> = {
265
232
  returns<const M extends ReturnsMap>(map: M): HandlerBuilder<Acc, Validators, Omit<TReturns, keyof M> & M, TAppContext>;
266
- use<TAcc, UReturns extends ReturnsMap = {}>(unit: MiddlewareUnit<TAcc, UReturns>): HandlerBuilder<readonly [...Acc, TAcc], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
267
- use<TState, TCtx, TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: StateAndCtxUseOptions<HandlerContext<Acc, {
268
- query: TQuery;
269
- params: TParams;
270
- body: TBody;
271
- }, TAppContext>, TState, TCtx, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn>): HandlerBuilder<readonly [
272
- ...Acc,
273
- MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TCtx, TQueryIn, TParamsIn, TBodyIn>
274
- ], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
275
- use<TState, TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: StatefulUseOptions<HandlerContext<Acc, {
276
- query: TQuery;
277
- params: TParams;
278
- body: TBody;
279
- }, TAppContext>, TState, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn>): HandlerBuilder<readonly [
280
- ...Acc,
281
- MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, unknown, TQueryIn, TParamsIn, TBodyIn>
282
- ], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
283
- use<TCtx, TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: CtxUseOptions<HandlerContext<Acc, {
284
- query: TQuery;
285
- params: TParams;
286
- body: TBody;
287
- }, TAppContext>, TCtx, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn>): HandlerBuilder<readonly [
288
- ...Acc,
289
- MiddlewareReturnFromParts<TQuery, TParams, TBody, {}, TCtx, TQueryIn, TParamsIn, TBodyIn>
290
- ], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
291
- use<TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown>(options: StatelessUseOptions<HandlerContext<Acc, {
233
+ use<TAcc, UReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown>(unit: MiddlewareUnit<TAcc, UReturns, TRequiredLayouts, TRequiredState>, ..._assert: [IsStateSatisfied<MergeMiddlewareField<Acc, "state">, TRequiredState>] extends [
234
+ true
235
+ ] ? [] : [
236
+ {
237
+ error: "Middleware cannot be attached to this handler";
238
+ requiredState: TRequiredState;
239
+ actualState: MergeMiddlewareField<Acc, "state">;
240
+ }
241
+ ]): HandlerBuilder<readonly [...Acc, TAcc], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
242
+ use<TQuery = unknown, TParams = unknown, TBody = unknown, UReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, R = unknown>(options: InlineMiddlewareOptions<HandlerContext<Acc, {
292
243
  query: TQuery;
293
244
  params: TParams;
294
245
  body: TBody;
295
- }, TAppContext>, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn>): HandlerBuilder<readonly [
246
+ }, TAppContext>, TQuery, TParams, TBody, UReturns, TQueryIn, TParamsIn, TBodyIn, R>): HandlerBuilder<readonly [
296
247
  ...Acc,
297
- MiddlewareReturnFromParts<TQuery, TParams, TBody, {}, unknown, TQueryIn, TParamsIn, TBodyIn>
248
+ MiddlewareReturnFromParts<TQuery, TParams, TBody, ExtractState<R>, TQueryIn, TParamsIn, TBodyIn>
298
249
  ], Validators, Omit<TReturns, keyof UReturns> & UReturns, TAppContext>;
299
250
  handler<R extends Response = Response>(fn: (ctx: HandlerContext<Acc, Validators, TAppContext>) => Awaitable<R>, ..._assert: [R] extends [ValidHandlerReply<R, TReturns>] ? [] : [
300
251
  {
@@ -1,7 +1,7 @@
1
- export type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'HEAD';
1
+ export type Method = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS" | "HEAD";
2
2
  export type HttpMethod = Method;
3
- export type MiddlewareFieldName = 'query' | 'params' | 'body' | 'state' | 'ctx';
4
- export type MiddlewareInputFieldName = 'query' | 'params' | 'body';
3
+ export type MiddlewareFieldName = "query" | "params" | "body" | "state";
4
+ export type MiddlewareInputFieldName = "query" | "params" | "body";
5
5
  export type UnwrapPart<T> = unknown extends T ? {} : T;
6
6
  export type MergePart<T, Base> = unknown extends T ? Base : Base & T;
7
7
  /** Collapse intersections so `Omit`/`keyof` treat the result as one object type. */
@@ -21,17 +21,15 @@ export type RequestShape<TIn, TOut> = unknown extends TIn ? UnwrapPart<TOut> : S
21
21
  [K in keyof TIn]: K extends keyof TOut ? RequestPropType<TIn[K], TOut[K]> : TIn[K];
22
22
  }>;
23
23
  export type UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends (value: infer Value) => void ? Value : never;
24
- export type MiddlewareField<Middleware, Field extends MiddlewareFieldName> = Field extends 'query' ? Middleware extends {
24
+ export type MiddlewareField<Middleware, Field extends MiddlewareFieldName> = Field extends "query" ? Middleware extends {
25
25
  query: infer Query;
26
- } ? Query : {} : Field extends 'params' ? Middleware extends {
26
+ } ? Query : {} : Field extends "params" ? Middleware extends {
27
27
  params: infer Params;
28
- } ? Params : {} : Field extends 'body' ? Middleware extends {
28
+ } ? Params : {} : Field extends "body" ? Middleware extends {
29
29
  body: infer Body;
30
- } ? Body : {} : Field extends 'state' ? Middleware extends {
30
+ } ? Body : {} : Field extends "state" ? Middleware extends {
31
31
  state: infer State;
32
- } ? State : {} : Field extends 'ctx' ? Middleware extends {
33
- ctx: infer Ctx;
34
- } ? Ctx : {} : {};
32
+ } ? State : {} : {};
35
33
  export type MiddlewareInputField<Middleware, Field extends MiddlewareInputFieldName> = Middleware extends {
36
34
  input: {
37
35
  [K in Field]: infer V;
@@ -5,7 +5,7 @@ import { MergeMiddlewareField, MergePart, RequestShape, RuntimeContextFields, Si
5
5
  import { ReturnsMap } from './returns.js';
6
6
  import { Schema } from './schema.js';
7
7
  export type { HttpMethod, Method } from './type-utils.js';
8
- export type { EmptyReturns, MergeReturns, ReturnsMap, HandlerReply, HasReturns, StatusCode, ValidHandlerReply, EnforceHandlerReply } from './returns.js';
8
+ export type { EmptyReturns, MergeReturns, ReturnsMap, HandlerReply, HasReturns, StatusCode, ValidHandlerReply, EnforceHandlerReply, } from './returns.js';
9
9
  /** Default empty app context for standalone units without a bound router instance. */
10
10
  export type AppContext = Record<never, never>;
11
11
  export type NativeContext = RouterRegister extends {
@@ -19,27 +19,32 @@ export type ValidatorParts = {
19
19
  paramsIn?: unknown;
20
20
  bodyIn?: unknown;
21
21
  };
22
- export type MiddlewareNext = {
23
- (args?: {
24
- state?: unknown;
25
- ctx?: unknown;
26
- }): Promise<ReplyResult>;
22
+ export declare const StateBrand: unique symbol;
23
+ export type NextResult<TState = unknown> = ReplyResult & {
24
+ readonly [StateBrand]?: TState;
27
25
  };
26
+ export type ExtractState<T> = [Extract<Awaited<T>, {
27
+ [StateBrand]?: unknown;
28
+ }>] extends [never] ? {} : Extract<Awaited<T>, {
29
+ [StateBrand]?: unknown;
30
+ }> extends {
31
+ [StateBrand]?: infer S;
32
+ } ? [S] extends [never] ? {} : S : {};
33
+ export type IsUnknown<T> = [unknown] extends [T] ? true : false;
34
+ export type NextFn<TExpectedState = unknown> = IsUnknown<TExpectedState> extends true ? <S extends Record<string, unknown> = {}>(state?: S) => Promise<NextResult<S>> : (state: TExpectedState) => Promise<NextResult<TExpectedState>>;
35
+ export type MiddlewareNext = NextFn;
28
36
  export type MiddlewareDefinition = {
29
- state?: unknown;
30
- ctx?: unknown;
31
37
  query?: unknown;
32
38
  params?: unknown;
33
39
  body?: unknown;
34
40
  returns?: ReturnsMap;
35
41
  handler: (ctx: unknown, next: MiddlewareNext) => Awaitable<ReplyResult | Response | unknown>;
36
42
  };
37
- export type MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TCtx = unknown, TQueryIn = TQuery, TParamsIn = TParams, TBodyIn = TBody> = {
43
+ export type MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TQueryIn = TQuery, TParamsIn = TParams, TBodyIn = TBody> = {
38
44
  query: Simplify<UnwrapPart<TQuery>>;
39
45
  params: Simplify<UnwrapPart<TParams>>;
40
46
  body: Simplify<UnwrapPart<TBody>>;
41
47
  state: Simplify<UnwrapPart<TState>>;
42
- ctx: Simplify<UnwrapPart<TCtx>>;
43
48
  /** Pre-parse shapes merged into route `$Infer.Input`. */
44
49
  input: {
45
50
  query: RequestShape<TQueryIn, TQuery>;
@@ -47,32 +52,34 @@ export type MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TCtx = unk
47
52
  body: RequestShape<TBodyIn, TBody>;
48
53
  };
49
54
  };
50
- type UnitRuntimeContext = Omit<RuntimeContextFields<NativeContext>, 'var'>;
51
- export type StandaloneMiddlewareContext<TQuery = unknown, TParams = unknown, TBody = unknown, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & {
55
+ type UnitRuntimeContext = Omit<RuntimeContextFields<NativeContext>, "var">;
56
+ export type StandaloneMiddlewareContext<TQuery = unknown, TParams = unknown, TBody = unknown, TAppContext extends Record<string, unknown> = AppContext, TState = {}> = Simplify<TAppContext & UnitRuntimeContext & {
52
57
  query: Simplify<UnwrapPart<TQuery>>;
53
58
  params: Simplify<UnwrapPart<TParams>>;
54
59
  body: Simplify<UnwrapPart<TBody>>;
55
- state: {};
60
+ state: Simplify<UnwrapPart<TState>>;
56
61
  headers: TaserHeaders;
57
62
  cookies: TaserCookieJar;
58
63
  }>;
59
- export type HandlerContext<Acc extends readonly unknown[], Validators extends ValidatorParts, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & MergeMiddlewareField<Acc, 'ctx'> & {
64
+ export type HandlerContext<Acc extends readonly unknown[], Validators extends ValidatorParts, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & {
60
65
  query: Simplify<MergePart<Validators extends {
61
66
  query?: infer Q;
62
- } ? Q : unknown, MergeMiddlewareField<Acc, 'query'>>>;
67
+ } ? Q : unknown, MergeMiddlewareField<Acc, "query">>>;
63
68
  params: Simplify<MergePart<Validators extends {
64
69
  params?: infer P;
65
- } ? P : unknown, MergeMiddlewareField<Acc, 'params'>>>;
70
+ } ? P : unknown, MergeMiddlewareField<Acc, "params">>>;
66
71
  body: Simplify<MergePart<Validators extends {
67
72
  body?: infer B;
68
- } ? B : unknown, MergeMiddlewareField<Acc, 'body'>>>;
69
- state: Simplify<MergeMiddlewareField<Acc, 'state'>>;
73
+ } ? B : unknown, MergeMiddlewareField<Acc, "body">>>;
74
+ state: Simplify<MergeMiddlewareField<Acc, "state">>;
70
75
  headers: TaserHeaders;
71
76
  cookies: TaserCookieJar;
72
77
  }>;
73
- export type MiddlewareUnit<TAcc = unknown, TReturns extends ReturnsMap = {}> = MiddlewareDefinition & {
78
+ export type MiddlewareUnit<TAcc = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown> = MiddlewareDefinition & {
74
79
  readonly __middlewareAcc: TAcc;
75
80
  readonly __returns?: TReturns;
81
+ readonly __requiredLayouts?: TRequiredLayouts;
82
+ readonly __requiredState?: TRequiredState;
76
83
  };
77
84
  export type HandlerUnit<_Acc extends readonly unknown[], _Validators extends ValidatorParts, TReturns extends ReturnsMap = {}, TOutput = Response> = {
78
85
  readonly __returns?: TReturns;
@@ -86,13 +93,11 @@ export type HandlerUnit<_Acc extends readonly unknown[], _Validators extends Val
86
93
  params?: Schema<unknown>;
87
94
  body?: Schema<unknown>;
88
95
  };
89
- export type InlineMiddlewareOptions = {
90
- state?: Schema<unknown>;
91
- ctx?: Schema<unknown>;
92
- query?: Schema<unknown>;
93
- params?: Schema<unknown>;
94
- body?: Schema<unknown>;
95
- returns?: ReturnsMap;
96
- handler: (ctx: unknown, next: MiddlewareNext) => Awaitable<unknown>;
96
+ export type InlineMiddlewareOptions<Ctx = unknown, TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, R = unknown> = {
97
+ query?: Schema<TQuery, TQueryIn>;
98
+ params?: Schema<TParams, TParamsIn>;
99
+ body?: Schema<TBody, TBodyIn>;
100
+ returns?: TReturns;
101
+ handler: (ctx: Ctx, next: NextFn) => Awaitable<R>;
97
102
  };
98
103
  export declare function isHandlerUnit(value: unknown): value is HandlerUnit<readonly unknown[], ValidatorParts>;
@@ -1 +1 @@
1
- {"version":3,"file":"units.js","names":[],"sources":["../../../src/types/units.ts"],"sourcesContent":["import type { Awaitable, TaserCookieJar, TaserHeaders } from '@taserjs/router-core'\nimport type { ReplyResult } from '@taserjs/router-utils'\n\nimport type { RouterRegister } from '../register.js'\nimport type {\n MergeMiddlewareField,\n MergePart,\n RequestShape,\n RuntimeContextFields,\n Simplify,\n UnwrapPart,\n} from './type-utils.js'\nimport type { ReturnsMap } from './returns.js'\nimport type { Schema } from './schema.js'\n\nexport type { HttpMethod, Method } from './type-utils.js'\nexport type { EmptyReturns, MergeReturns, ReturnsMap, HandlerReply, HasReturns, StatusCode, ValidHandlerReply, EnforceHandlerReply } from './returns.js'\n\n/** Default empty app context for standalone units without a bound router instance. */\nexport type AppContext = Record<never, never>\n\nexport type NativeContext = RouterRegister extends { NativeContext: infer N } ? N : unknown\n\nexport type ValidatorParts = {\n query?: unknown\n params?: unknown\n body?: unknown\n queryIn?: unknown\n paramsIn?: unknown\n bodyIn?: unknown\n}\n\nexport type MiddlewareNext = {\n (args?: { state?: unknown, ctx?: unknown }): Promise<ReplyResult>\n}\n\nexport type MiddlewareDefinition = {\n state?: unknown\n ctx?: unknown\n query?: unknown\n params?: unknown\n body?: unknown\n returns?: ReturnsMap\n handler: (\n ctx: unknown,\n next: MiddlewareNext,\n ) => Awaitable<ReplyResult | Response | unknown>\n}\n\nexport type MiddlewareReturnFromParts<\n TQuery,\n TParams,\n TBody,\n TState,\n TCtx = unknown,\n TQueryIn = TQuery,\n TParamsIn = TParams,\n TBodyIn = TBody,\n> = {\n query: Simplify<UnwrapPart<TQuery>>\n params: Simplify<UnwrapPart<TParams>>\n body: Simplify<UnwrapPart<TBody>>\n state: Simplify<UnwrapPart<TState>>\n ctx: Simplify<UnwrapPart<TCtx>>\n /** Pre-parse shapes merged into route `$Infer.Input`. */\n input: {\n query: RequestShape<TQueryIn, TQuery>\n params: RequestShape<TParamsIn, TParams>\n body: RequestShape<TBodyIn, TBody>\n }\n}\n\ntype UnitRuntimeContext = Omit<RuntimeContextFields<NativeContext>, 'var'>\n\nexport type StandaloneMiddlewareContext<\n TQuery = unknown,\n TParams = unknown,\n TBody = unknown,\n TAppContext extends Record<string, unknown> = AppContext,\n> = Simplify<\n TAppContext & UnitRuntimeContext & {\n query: Simplify<UnwrapPart<TQuery>>\n params: Simplify<UnwrapPart<TParams>>\n body: Simplify<UnwrapPart<TBody>>\n state: {}\n headers: TaserHeaders\n cookies: TaserCookieJar\n }\n>\n\nexport type HandlerContext<\n Acc extends readonly unknown[],\n Validators extends ValidatorParts,\n TAppContext extends Record<string, unknown> = AppContext,\n> = Simplify<\n TAppContext\n & UnitRuntimeContext\n & MergeMiddlewareField<Acc, 'ctx'>\n & {\n query: Simplify<MergePart<\n Validators extends { query?: infer Q } ? Q : unknown,\n MergeMiddlewareField<Acc, 'query'>\n >>\n params: Simplify<MergePart<\n Validators extends { params?: infer P } ? P : unknown,\n MergeMiddlewareField<Acc, 'params'>\n >>\n body: Simplify<MergePart<\n Validators extends { body?: infer B } ? B : unknown,\n MergeMiddlewareField<Acc, 'body'>\n >>\n state: Simplify<MergeMiddlewareField<Acc, 'state'>>\n headers: TaserHeaders\n cookies: TaserCookieJar\n }\n>\n\nexport type MiddlewareUnit<\n TAcc = unknown,\n TReturns extends ReturnsMap = {},\n> = MiddlewareDefinition & {\n readonly __middlewareAcc: TAcc\n readonly __returns?: TReturns\n}\n\nexport type HandlerUnit<\n _Acc extends readonly unknown[],\n _Validators extends ValidatorParts,\n TReturns extends ReturnsMap = {},\n TOutput = Response,\n> = {\n readonly __returns?: TReturns\n readonly $Infer: {\n Output: TOutput\n }\n middlewares: readonly MiddlewareDefinition[]\n handler: (ctx: unknown) => Awaitable<ReplyResult | Response>\n returns?: ReturnsMap\n query?: Schema<unknown>\n params?: Schema<unknown>\n body?: Schema<unknown>\n}\n\nexport type InlineMiddlewareOptions = {\n state?: Schema<unknown>\n ctx?: Schema<unknown>\n query?: Schema<unknown>\n params?: Schema<unknown>\n body?: Schema<unknown>\n returns?: ReturnsMap\n handler: (\n ctx: unknown,\n next: MiddlewareNext,\n ) => Awaitable<unknown>\n}\n\nexport function isHandlerUnit(\n value: unknown,\n): value is HandlerUnit<readonly unknown[], ValidatorParts> {\n return (\n typeof value === 'object'\n && value !== null\n && 'handler' in value\n && 'middlewares' in value\n && Array.isArray((value as HandlerUnit<readonly unknown[], ValidatorParts>).middlewares)\n )\n}\n"],"mappings":";AA4JA,SAAgB,cACd,OAC0D;CAC1D,OACE,OAAO,UAAU,YACd,UAAU,QACV,aAAa,SACb,iBAAiB,SACjB,MAAM,QAAS,MAA0D,WAAW;AAE3F"}
1
+ {"version":3,"file":"units.js","names":[],"sources":["../../../src/types/units.ts"],"sourcesContent":["import type { Awaitable, TaserCookieJar, TaserHeaders } from \"@taserjs/router-core\";\nimport type { ReplyResult } from \"@taserjs/router-utils\";\n\nimport type { RouterRegister } from \"../register.js\";\nimport type {\n MergeMiddlewareField,\n MergePart,\n RequestShape,\n RuntimeContextFields,\n Simplify,\n UnwrapPart,\n} from \"./type-utils.js\";\nimport type { ReturnsMap } from \"./returns.js\";\nimport type { Schema } from \"./schema.js\";\n\nexport type { HttpMethod, Method } from \"./type-utils.js\";\nexport type {\n EmptyReturns,\n MergeReturns,\n ReturnsMap,\n HandlerReply,\n HasReturns,\n StatusCode,\n ValidHandlerReply,\n EnforceHandlerReply,\n} from \"./returns.js\";\n\n/** Default empty app context for standalone units without a bound router instance. */\nexport type AppContext = Record<never, never>;\n\nexport type NativeContext = RouterRegister extends { NativeContext: infer N } ? N : unknown;\n\nexport type ValidatorParts = {\n query?: unknown;\n params?: unknown;\n body?: unknown;\n queryIn?: unknown;\n paramsIn?: unknown;\n bodyIn?: unknown;\n};\n\nexport declare const StateBrand: unique symbol;\n\nexport type NextResult<TState = unknown> = ReplyResult & {\n readonly [StateBrand]?: TState;\n};\n\nexport type ExtractState<T> = [Extract<Awaited<T>, { [StateBrand]?: unknown }>] extends [never]\n ? {}\n : Extract<Awaited<T>, { [StateBrand]?: unknown }> extends { [StateBrand]?: infer S }\n ? [S] extends [never]\n ? {}\n : S\n : {};\n\nexport type IsUnknown<T> = [unknown] extends [T] ? true : false;\n\nexport type NextFn<TExpectedState = unknown> =\n IsUnknown<TExpectedState> extends true\n ? <S extends Record<string, unknown> = {}>(state?: S) => Promise<NextResult<S>>\n : (state: TExpectedState) => Promise<NextResult<TExpectedState>>;\n\nexport type MiddlewareNext = NextFn;\n\nexport type MiddlewareDefinition = {\n query?: unknown;\n params?: unknown;\n body?: unknown;\n returns?: ReturnsMap;\n handler: (ctx: unknown, next: MiddlewareNext) => Awaitable<ReplyResult | Response | unknown>;\n};\n\nexport type MiddlewareReturnFromParts<\n TQuery,\n TParams,\n TBody,\n TState,\n TQueryIn = TQuery,\n TParamsIn = TParams,\n TBodyIn = TBody,\n> = {\n query: Simplify<UnwrapPart<TQuery>>;\n params: Simplify<UnwrapPart<TParams>>;\n body: Simplify<UnwrapPart<TBody>>;\n state: Simplify<UnwrapPart<TState>>;\n /** Pre-parse shapes merged into route `$Infer.Input`. */\n input: {\n query: RequestShape<TQueryIn, TQuery>;\n params: RequestShape<TParamsIn, TParams>;\n body: RequestShape<TBodyIn, TBody>;\n };\n};\n\ntype UnitRuntimeContext = Omit<RuntimeContextFields<NativeContext>, \"var\">;\n\nexport type StandaloneMiddlewareContext<\n TQuery = unknown,\n TParams = unknown,\n TBody = unknown,\n TAppContext extends Record<string, unknown> = AppContext,\n TState = {},\n> = Simplify<\n TAppContext &\n UnitRuntimeContext & {\n query: Simplify<UnwrapPart<TQuery>>;\n params: Simplify<UnwrapPart<TParams>>;\n body: Simplify<UnwrapPart<TBody>>;\n state: Simplify<UnwrapPart<TState>>;\n headers: TaserHeaders;\n cookies: TaserCookieJar;\n }\n>;\n\nexport type HandlerContext<\n Acc extends readonly unknown[],\n Validators extends ValidatorParts,\n TAppContext extends Record<string, unknown> = AppContext,\n> = Simplify<\n TAppContext &\n UnitRuntimeContext & {\n query: Simplify<\n MergePart<\n Validators extends { query?: infer Q } ? Q : unknown,\n MergeMiddlewareField<Acc, \"query\">\n >\n >;\n params: Simplify<\n MergePart<\n Validators extends { params?: infer P } ? P : unknown,\n MergeMiddlewareField<Acc, \"params\">\n >\n >;\n body: Simplify<\n MergePart<\n Validators extends { body?: infer B } ? B : unknown,\n MergeMiddlewareField<Acc, \"body\">\n >\n >;\n state: Simplify<MergeMiddlewareField<Acc, \"state\">>;\n headers: TaserHeaders;\n cookies: TaserCookieJar;\n }\n>;\n\nexport type MiddlewareUnit<\n TAcc = unknown,\n TReturns extends ReturnsMap = {},\n TRequiredLayouts = unknown,\n TRequiredState = unknown,\n> = MiddlewareDefinition & {\n readonly __middlewareAcc: TAcc;\n readonly __returns?: TReturns;\n readonly __requiredLayouts?: TRequiredLayouts;\n readonly __requiredState?: TRequiredState;\n};\n\nexport type HandlerUnit<\n _Acc extends readonly unknown[],\n _Validators extends ValidatorParts,\n TReturns extends ReturnsMap = {},\n TOutput = Response,\n> = {\n readonly __returns?: TReturns;\n readonly $Infer: {\n Output: TOutput;\n };\n middlewares: readonly MiddlewareDefinition[];\n handler: (ctx: unknown) => Awaitable<ReplyResult | Response>;\n returns?: ReturnsMap;\n query?: Schema<unknown>;\n params?: Schema<unknown>;\n body?: Schema<unknown>;\n};\n\nexport type InlineMiddlewareOptions<\n Ctx = unknown,\n TQuery = unknown,\n TParams = unknown,\n TBody = unknown,\n TReturns extends ReturnsMap = {},\n TQueryIn = unknown,\n TParamsIn = unknown,\n TBodyIn = unknown,\n R = unknown,\n> = {\n query?: Schema<TQuery, TQueryIn>;\n params?: Schema<TParams, TParamsIn>;\n body?: Schema<TBody, TBodyIn>;\n returns?: TReturns;\n handler: (ctx: Ctx, next: NextFn) => Awaitable<R>;\n};\n\nexport function isHandlerUnit(\n value: unknown,\n): value is HandlerUnit<readonly unknown[], ValidatorParts> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"handler\" in value &&\n \"middlewares\" in value &&\n Array.isArray((value as HandlerUnit<readonly unknown[], ValidatorParts>).middlewares)\n );\n}\n"],"mappings":";AAgMA,SAAgB,cACd,OAC0D;CAC1D,OACE,OAAO,UAAU,YACjB,UAAU,QACV,aAAa,SACb,iBAAiB,SACjB,MAAM,QAAS,MAA0D,WAAW;AAExF"}