@taserjs/router 0.1.4 → 0.1.5

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 (127) hide show
  1. package/dist/cjs/builder/factories.cjs.map +1 -1
  2. package/dist/cjs/builder/factories.d.cts +9 -9
  3. package/dist/cjs/builder/middleware-unit.cjs +21 -12
  4. package/dist/cjs/builder/middleware-unit.cjs.map +1 -1
  5. package/dist/cjs/builder/middleware-unit.d.cts +1 -18
  6. package/dist/cjs/builder/middleware.cjs +1 -0
  7. package/dist/cjs/builder/middleware.cjs.map +1 -1
  8. package/dist/cjs/builder/route.cjs +1 -0
  9. package/dist/cjs/builder/route.cjs.map +1 -1
  10. package/dist/cjs/builder/router.cjs +1 -16
  11. package/dist/cjs/builder/router.cjs.map +1 -1
  12. package/dist/cjs/builder/router.d.cts +6 -17
  13. package/dist/cjs/builder/standalone.cjs +43 -0
  14. package/dist/cjs/builder/standalone.cjs.map +1 -0
  15. package/dist/cjs/builder/standalone.d.cts +28 -0
  16. package/dist/cjs/define/middleware.cjs +2 -3
  17. package/dist/cjs/define/middleware.cjs.map +1 -1
  18. package/dist/cjs/define/middleware.d.cts +15 -16
  19. package/dist/cjs/index.cjs +13 -2
  20. package/dist/cjs/index.d.cts +5 -3
  21. package/dist/cjs/middleware/body-limit.cjs +1 -1
  22. package/dist/cjs/middleware/body-limit.cjs.map +1 -1
  23. package/dist/cjs/middleware/body-limit.d.cts +1 -1
  24. package/dist/cjs/middleware/compress.cjs +1 -1
  25. package/dist/cjs/middleware/compress.cjs.map +1 -1
  26. package/dist/cjs/middleware/compress.d.cts +1 -1
  27. package/dist/cjs/middleware/cors.cjs +1 -1
  28. package/dist/cjs/middleware/cors.cjs.map +1 -1
  29. package/dist/cjs/middleware/cors.d.cts +1 -1
  30. package/dist/cjs/middleware/csrf.cjs +1 -1
  31. package/dist/cjs/middleware/csrf.cjs.map +1 -1
  32. package/dist/cjs/middleware/csrf.d.cts +1 -1
  33. package/dist/cjs/middleware/etag.cjs +1 -1
  34. package/dist/cjs/middleware/etag.cjs.map +1 -1
  35. package/dist/cjs/middleware/etag.d.cts +1 -1
  36. package/dist/cjs/middleware/hono-mw.cjs +1 -1
  37. package/dist/cjs/middleware/hono-mw.cjs.map +1 -1
  38. package/dist/cjs/middleware/hono-mw.d.cts +1 -1
  39. package/dist/cjs/middleware/jwk.cjs +1 -1
  40. package/dist/cjs/middleware/jwk.cjs.map +1 -1
  41. package/dist/cjs/middleware/jwt.cjs +1 -1
  42. package/dist/cjs/middleware/jwt.cjs.map +1 -1
  43. package/dist/cjs/middleware/secure-headers.cjs +1 -1
  44. package/dist/cjs/middleware/secure-headers.cjs.map +1 -1
  45. package/dist/cjs/middleware/secure-headers.d.cts +1 -1
  46. package/dist/cjs/middleware/timing.cjs +1 -1
  47. package/dist/cjs/middleware/timing.cjs.map +1 -1
  48. package/dist/cjs/middleware/timing.d.cts +1 -1
  49. package/dist/cjs/types/index.d.cts +18 -13
  50. package/dist/cjs/types/type-utils.d.cts +2 -2
  51. package/dist/cjs/types/units.d.cts +17 -19
  52. package/dist/esm/builder/factories.d.ts +9 -9
  53. package/dist/esm/builder/factories.js.map +1 -1
  54. package/dist/esm/builder/middleware-unit.d.ts +1 -18
  55. package/dist/esm/builder/middleware-unit.js +21 -12
  56. package/dist/esm/builder/middleware-unit.js.map +1 -1
  57. package/dist/esm/builder/middleware.js +1 -0
  58. package/dist/esm/builder/middleware.js.map +1 -1
  59. package/dist/esm/builder/route.js +1 -0
  60. package/dist/esm/builder/route.js.map +1 -1
  61. package/dist/esm/builder/router.d.ts +6 -17
  62. package/dist/esm/builder/router.js +1 -16
  63. package/dist/esm/builder/router.js.map +1 -1
  64. package/dist/esm/builder/standalone.d.ts +28 -0
  65. package/dist/esm/builder/standalone.js +32 -0
  66. package/dist/esm/builder/standalone.js.map +1 -0
  67. package/dist/esm/define/middleware.d.ts +15 -16
  68. package/dist/esm/define/middleware.js +2 -3
  69. package/dist/esm/define/middleware.js.map +1 -1
  70. package/dist/esm/index.d.ts +5 -3
  71. package/dist/esm/index.js +2 -2
  72. package/dist/esm/middleware/body-limit.d.ts +1 -1
  73. package/dist/esm/middleware/body-limit.js +2 -2
  74. package/dist/esm/middleware/body-limit.js.map +1 -1
  75. package/dist/esm/middleware/compress.d.ts +1 -1
  76. package/dist/esm/middleware/compress.js +2 -2
  77. package/dist/esm/middleware/compress.js.map +1 -1
  78. package/dist/esm/middleware/cors.d.ts +1 -1
  79. package/dist/esm/middleware/cors.js +2 -2
  80. package/dist/esm/middleware/cors.js.map +1 -1
  81. package/dist/esm/middleware/csrf.d.ts +1 -1
  82. package/dist/esm/middleware/csrf.js +2 -2
  83. package/dist/esm/middleware/csrf.js.map +1 -1
  84. package/dist/esm/middleware/etag.d.ts +1 -1
  85. package/dist/esm/middleware/etag.js +2 -2
  86. package/dist/esm/middleware/etag.js.map +1 -1
  87. package/dist/esm/middleware/hono-mw.d.ts +1 -1
  88. package/dist/esm/middleware/hono-mw.js +1 -1
  89. package/dist/esm/middleware/hono-mw.js.map +1 -1
  90. package/dist/esm/middleware/jwk.js +2 -2
  91. package/dist/esm/middleware/jwk.js.map +1 -1
  92. package/dist/esm/middleware/jwt.js +2 -2
  93. package/dist/esm/middleware/jwt.js.map +1 -1
  94. package/dist/esm/middleware/secure-headers.d.ts +1 -1
  95. package/dist/esm/middleware/secure-headers.js +2 -2
  96. package/dist/esm/middleware/secure-headers.js.map +1 -1
  97. package/dist/esm/middleware/timing.d.ts +1 -1
  98. package/dist/esm/middleware/timing.js +2 -2
  99. package/dist/esm/middleware/timing.js.map +1 -1
  100. package/dist/esm/types/index.d.ts +18 -13
  101. package/dist/esm/types/type-utils.d.ts +2 -2
  102. package/dist/esm/types/units.d.ts +17 -19
  103. package/package.json +3 -3
  104. package/src/builder/factories.ts +2 -2
  105. package/src/builder/middleware-unit.ts +22 -11
  106. package/src/builder/middleware.ts +2 -0
  107. package/src/builder/route.ts +2 -0
  108. package/src/builder/router.ts +7 -60
  109. package/src/builder/standalone.ts +70 -0
  110. package/src/define/middleware.ts +37 -18
  111. package/src/index.ts +26 -2
  112. package/src/middleware/body-limit.ts +2 -2
  113. package/src/middleware/compress.ts +2 -2
  114. package/src/middleware/cors.ts +2 -2
  115. package/src/middleware/csrf.ts +2 -2
  116. package/src/middleware/etag.ts +2 -2
  117. package/src/middleware/hono-mw.ts +1 -1
  118. package/src/middleware/jwk.ts +2 -2
  119. package/src/middleware/jwt.ts +2 -2
  120. package/src/middleware/secure-headers.ts +2 -2
  121. package/src/middleware/timing.ts +2 -2
  122. package/src/types/index.ts +39 -24
  123. package/src/types/type-utils.ts +8 -4
  124. package/src/types/units.ts +46 -22
  125. package/dist/cjs/register.d.cts +0 -2
  126. package/dist/esm/register.d.ts +0 -2
  127. package/src/register.ts +0 -1
@@ -1,10 +1,10 @@
1
1
  import { bodyLimit as honoBodyLimit } from "hono/body-limit";
2
2
 
3
- import { defineMiddleware } from "../define/middleware.js";
3
+ import { middleware } from "../define/middleware.js";
4
4
  import { honoMw } from "./hono-mw.js";
5
5
 
6
6
  export function bodyLimit(...args: Parameters<typeof honoBodyLimit>) {
7
- return defineMiddleware(honoMw(honoBodyLimit(...args)));
7
+ return middleware(honoMw(honoBodyLimit(...args)));
8
8
  }
9
9
 
10
10
  export type BodyLimitOptions = Parameters<typeof honoBodyLimit>[0];
@@ -1,10 +1,10 @@
1
1
  import { compress as honoCompress } from "hono/compress";
2
2
 
3
- import { defineMiddleware } from "../define/middleware.js";
3
+ import { middleware } from "../define/middleware.js";
4
4
  import { honoMw } from "./hono-mw.js";
5
5
 
6
6
  export function compress(...args: Parameters<typeof honoCompress>) {
7
- return defineMiddleware(honoMw(honoCompress(...args)));
7
+ return middleware(honoMw(honoCompress(...args)));
8
8
  }
9
9
 
10
10
  export type CompressOptions = NonNullable<Parameters<typeof honoCompress>[0]>;
@@ -1,10 +1,10 @@
1
1
  import { cors as honoCors } from "hono/cors";
2
2
 
3
- import { defineMiddleware } from "../define/middleware.js";
3
+ import { middleware } from "../define/middleware.js";
4
4
  import { honoMw } from "./hono-mw.js";
5
5
 
6
6
  export function cors(...args: Parameters<typeof honoCors>) {
7
- return defineMiddleware(honoMw(honoCors(...args)));
7
+ return middleware(honoMw(honoCors(...args)));
8
8
  }
9
9
 
10
10
  export type CorsOptions = NonNullable<Parameters<typeof honoCors>[0]>;
@@ -1,10 +1,10 @@
1
1
  import { csrf as honoCsrf } from "hono/csrf";
2
2
 
3
- import { defineMiddleware } from "../define/middleware.js";
3
+ import { middleware } from "../define/middleware.js";
4
4
  import { honoMw } from "./hono-mw.js";
5
5
 
6
6
  export function csrf(...args: Parameters<typeof honoCsrf>) {
7
- return defineMiddleware(honoMw(honoCsrf(...args)));
7
+ return middleware(honoMw(honoCsrf(...args)));
8
8
  }
9
9
 
10
10
  export type CsrfOptions = NonNullable<Parameters<typeof honoCsrf>[0]>;
@@ -1,10 +1,10 @@
1
1
  import { etag as honoEtag } from "hono/etag";
2
2
 
3
- import { defineMiddleware } from "../define/middleware.js";
3
+ import { middleware } from "../define/middleware.js";
4
4
  import { honoMw } from "./hono-mw.js";
5
5
 
6
6
  export function etag(...args: Parameters<typeof honoEtag>) {
7
- return defineMiddleware(honoMw(honoEtag(...args)));
7
+ return middleware(honoMw(honoEtag(...args)));
8
8
  }
9
9
 
10
10
  export type EtagOptions = NonNullable<Parameters<typeof honoEtag>[0]>;
@@ -12,7 +12,7 @@ import type { MiddlewareHandler } from "hono";
12
12
  *
13
13
  * const app = t.get("/hello").use(honoMw(cors()));
14
14
  * // or
15
- * const customCors = defineMiddleware(honoMw(cors()));
15
+ * const customCors = middleware(honoMw(cors()));
16
16
  * ```
17
17
  */
18
18
  export function honoMw(
@@ -1,6 +1,6 @@
1
1
  import { jwk as honoJwk } from "hono/jwk";
2
2
 
3
- import { defineMiddleware } from "../define/middleware.js";
3
+ import { middleware } from "../define/middleware.js";
4
4
  import { honoMw } from "./hono-mw.js";
5
5
  import type { JwtMiddlewareUnit, JwtPayloadState } from "./jwt.js";
6
6
 
@@ -42,7 +42,7 @@ export function jwk<TPayload = Record<string, unknown>>(
42
42
  const safeInit = init?.headers !== undefined ? { headers: init.headers } : undefined;
43
43
  const mw = honoMw(honoJwk(honoOptions, safeInit));
44
44
 
45
- return defineMiddleware<JwtPayloadState<TPayload>>((ctx, next) =>
45
+ return middleware<JwtPayloadState<TPayload>>((ctx, next) =>
46
46
  mw(ctx, async () => {
47
47
  const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
48
48
  return next({ jwtPayload: payload as TPayload });
@@ -1,6 +1,6 @@
1
1
  import { jwt as honoJwt } from "hono/jwt";
2
2
 
3
- import { defineMiddleware } from "../define/middleware.js";
3
+ import { middleware } from "../define/middleware.js";
4
4
  import type { MiddlewareReturnFromParts, MiddlewareUnit } from "../types/units.js";
5
5
  import { honoMw } from "./hono-mw.js";
6
6
 
@@ -22,7 +22,7 @@ export function jwt<TPayload = Record<string, unknown>>(
22
22
  options: JwtOptions,
23
23
  ): JwtMiddlewareUnit<TPayload> {
24
24
  const mw = honoMw(honoJwt(options));
25
- return defineMiddleware<JwtPayloadState<TPayload>>((ctx, next) =>
25
+ return middleware<JwtPayloadState<TPayload>>((ctx, next) =>
26
26
  mw(ctx, async () => {
27
27
  const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
28
28
  return next({ jwtPayload: payload as TPayload });
@@ -1,10 +1,10 @@
1
1
  import { secureHeaders as honoSecureHeaders } from "hono/secure-headers";
2
2
 
3
- import { defineMiddleware } from "../define/middleware.js";
3
+ import { middleware } from "../define/middleware.js";
4
4
  import { honoMw } from "./hono-mw.js";
5
5
 
6
6
  export function secureHeaders(...args: Parameters<typeof honoSecureHeaders>) {
7
- return defineMiddleware(honoMw(honoSecureHeaders(...args)));
7
+ return middleware(honoMw(honoSecureHeaders(...args)));
8
8
  }
9
9
 
10
10
  export type SecureHeadersOptions = NonNullable<Parameters<typeof honoSecureHeaders>[0]>;
@@ -1,10 +1,10 @@
1
1
  import { timing as honoTiming } from "hono/timing";
2
2
 
3
- import { defineMiddleware } from "../define/middleware.js";
3
+ import { middleware } from "../define/middleware.js";
4
4
  import { honoMw } from "./hono-mw.js";
5
5
 
6
6
  export function timing(...args: Parameters<typeof honoTiming>) {
7
- return defineMiddleware(honoMw(honoTiming(...args)));
7
+ return middleware(honoMw(honoTiming(...args)));
8
8
  }
9
9
 
10
10
  export type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]>;
@@ -1,5 +1,5 @@
1
1
  import type { Awaitable, TaserCookieJar, TaserHeaders } from "@taserjs/router-core";
2
- import type { RouterRegister } from "../register.js";
2
+ import type { RouterRegister } from "../index.js";
3
3
  import type {
4
4
  MergeMiddlewareField,
5
5
  MergeMiddlewareInputField,
@@ -12,7 +12,7 @@ import type {
12
12
  import type { ReturnsMap, ValidHandlerReply } from "./returns.js";
13
13
  import type { Schema } from "./schema.js";
14
14
  import type {
15
- AppContext,
15
+ EmptyAppContext,
16
16
  ExtractState,
17
17
  Method,
18
18
  MiddlewareDefinition,
@@ -30,7 +30,6 @@ export type {
30
30
  Schema,
31
31
  StandardSchemaV1,
32
32
  } from "./schema.js";
33
- export type { RouterRegister } from "../register.js";
34
33
  export type {
35
34
  MergeMiddlewareField,
36
35
  MergeMiddlewareInputField,
@@ -52,13 +51,12 @@ export type {
52
51
  ValidHandlerReply,
53
52
  } from "./returns.js";
54
53
  export type {
55
- AppContext,
54
+ EmptyAppContext,
56
55
  ExtractState,
57
56
  HttpMethod,
58
57
  IsUnknown,
59
58
  Method,
60
59
  MiddlewareDefinition,
61
- MiddlewareNext,
62
60
  MiddlewareReturnFromParts,
63
61
  MiddlewareUnit,
64
62
  MiddlewareUnitBuilder,
@@ -69,6 +67,8 @@ export type {
69
67
  ValidatorParts,
70
68
  } from "./units.js";
71
69
 
70
+ export type AppContext = RouterRegister extends { AppContext: infer C } ? C : EmptyAppContext;
71
+
72
72
  export type RoutePath = RouterRegister extends { RoutePath: infer P } ? P : never;
73
73
  export type LayoutId = RouterRegister extends { LayoutId: infer L } ? L : never;
74
74
  export type LayoutTree = RouterRegister extends { LayoutTree: infer T } ? T : Record<never, never>;
@@ -76,6 +76,12 @@ export type RouteByPathMethod = RouterRegister extends { RouteByPathMethod: infe
76
76
  ? R
77
77
  : Record<never, never>;
78
78
 
79
+ export type LayoutBuilder<TAppContext extends Record<string, unknown> = AppContext> = <
80
+ const Layout extends LayoutId,
81
+ >(
82
+ layout: Layout,
83
+ ) => MiddlewareBuilder<Layout, readonly [], TAppContext>;
84
+
79
85
  type ParseParam<Segment extends string> = Segment extends "*"
80
86
  ? { _splat: string }
81
87
  : Segment extends `:${infer Name extends string}`
@@ -99,25 +105,41 @@ export type ResolveParams<TPathParams, TSchemaParams> =
99
105
  : Simplify<Omit<TPathParams, keyof TSchemaParams> & TSchemaParams>
100
106
  : TPathParams;
101
107
 
102
- type LayoutParent<Layout extends LayoutId> = LayoutTree[Layout] extends {
103
- parent: infer Parent extends LayoutId | null;
108
+ type LayoutParentsMap = RouterRegister extends {
109
+ LayoutParents: infer LP extends Record<string, unknown>;
104
110
  }
105
- ? Parent
106
- : null;
111
+ ? LP
112
+ : {};
113
+
114
+ type LayoutParent<Layout extends LayoutId> = Layout extends keyof LayoutParentsMap
115
+ ? LayoutParentsMap[Layout] extends LayoutId
116
+ ? LayoutParentsMap[Layout]
117
+ : null
118
+ : LayoutTree[Layout] extends {
119
+ parent: infer Parent extends LayoutId | null;
120
+ }
121
+ ? Parent
122
+ : null;
107
123
 
108
- type ResolveLayoutMiddlewares<Layout extends LayoutId | null> = Layout extends null
124
+ type ResolveLayoutMiddlewares<
125
+ Layout extends LayoutId | null,
126
+ Depth extends readonly unknown[] = [],
127
+ > = Depth["length"] extends 10
109
128
  ? readonly []
110
129
  : Layout extends LayoutId
111
130
  ? readonly [
112
- ...ResolveLayoutMiddlewares<LayoutParent<Layout>>,
131
+ ...ResolveLayoutMiddlewares<LayoutParent<Layout>, [...Depth, unknown]>,
113
132
  ...LayoutTree[Layout]["middlewares"],
114
133
  ]
115
134
  : readonly [];
116
135
 
117
- export type ResolveLayoutIdChain<L extends LayoutId | null> = L extends null
136
+ export type ResolveLayoutIdChain<
137
+ L extends LayoutId | null,
138
+ Depth extends readonly unknown[] = [],
139
+ > = Depth["length"] extends 10
118
140
  ? readonly []
119
141
  : L extends LayoutId
120
- ? readonly [...ResolveLayoutIdChain<LayoutParent<L>>, L]
142
+ ? readonly [...ResolveLayoutIdChain<LayoutParent<L>, [...Depth, unknown]>, L]
121
143
  : readonly [];
122
144
 
123
145
  export type ResolveLayoutMiddlewaresState<Layout extends LayoutId | null> = Layout extends LayoutId
@@ -188,13 +210,6 @@ type RouteResolvedField<
188
210
  Field extends "query" | "params" | "body" | "state",
189
211
  > = RouteLayoutField<Path, TMethod, Field> & MergeMiddlewareField<Acc, Field>;
190
212
 
191
- type RouteChainField<
192
- Path extends RoutePath,
193
- TMethod extends Method,
194
- Acc extends readonly unknown[],
195
- Field extends "query" | "params" | "body" | "state",
196
- > = RouteResolvedField<Path, TMethod, Acc, Field>;
197
-
198
213
  export type RouteChainContext<
199
214
  Path extends RoutePath,
200
215
  TMethod extends Method,
@@ -206,15 +221,15 @@ export type RouteChainContext<
206
221
  > = Simplify<
207
222
  TAppContext &
208
223
  UnitRuntimeContext & {
209
- query: Simplify<MergePart<TQuery, RouteChainField<Path, TMethod, Acc, "query">>>;
224
+ query: Simplify<MergePart<TQuery, RouteResolvedField<Path, TMethod, Acc, "query">>>;
210
225
  params: Simplify<
211
226
  ResolveParams<
212
227
  PathParams<Path>,
213
- MergePart<TParams, RouteChainField<Path, TMethod, Acc, "params">>
228
+ MergePart<TParams, RouteResolvedField<Path, TMethod, Acc, "params">>
214
229
  >
215
230
  >;
216
- body: Simplify<MergePart<TBody, RouteChainField<Path, TMethod, Acc, "body">>>;
217
- state: Simplify<RouteChainField<Path, TMethod, Acc, "state">>;
231
+ body: Simplify<MergePart<TBody, RouteResolvedField<Path, TMethod, Acc, "body">>>;
232
+ state: Simplify<RouteResolvedField<Path, TMethod, Acc, "state">>;
218
233
  headers: TaserHeaders;
219
234
  cookies: TaserCookieJar;
220
235
  }
@@ -63,16 +63,20 @@ export type MiddlewareInputField<
63
63
  export type MergeMiddlewareField<
64
64
  Middlewares extends readonly unknown[],
65
65
  Field extends MiddlewareFieldName,
66
- > = [Middlewares] extends [readonly []]
66
+ > = Middlewares extends readonly []
67
67
  ? {}
68
- : UnionToIntersection<MiddlewareField<Middlewares[number], Field>>;
68
+ : Middlewares extends readonly [infer Head, ...infer Tail]
69
+ ? MiddlewareField<Head, Field> & MergeMiddlewareField<Tail, Field>
70
+ : MiddlewareField<Middlewares[number], Field>;
69
71
 
70
72
  export type MergeMiddlewareInputField<
71
73
  Middlewares extends readonly unknown[],
72
74
  Field extends MiddlewareInputFieldName,
73
- > = [Middlewares] extends [readonly []]
75
+ > = Middlewares extends readonly []
74
76
  ? {}
75
- : UnionToIntersection<MiddlewareInputField<Middlewares[number], Field>>;
77
+ : Middlewares extends readonly [infer Head, ...infer Tail]
78
+ ? MiddlewareInputField<Head, Field> & MergeMiddlewareInputField<Tail, Field>
79
+ : MiddlewareInputField<Middlewares[number], Field>;
76
80
 
77
81
  export type RuntimeContextFields = {
78
82
  request: Request;
@@ -1,5 +1,4 @@
1
1
  import type {
2
- Awaitable,
3
2
  MiddlewareDefinition as CoreMiddlewareDefinition,
4
3
  TaserCookieJar,
5
4
  TaserHeaders,
@@ -22,7 +21,7 @@ export type {
22
21
  } from "./returns.js";
23
22
 
24
23
  /** Default empty app context for standalone units without a bound router instance. */
25
- export type AppContext = Record<never, never>;
24
+ export type EmptyAppContext = Record<never, never>;
26
25
 
27
26
  export type ValidatorParts = {
28
27
  query?: unknown;
@@ -39,13 +38,17 @@ export type NextResult<TState = unknown> = Response & {
39
38
  readonly [StateBrand]?: TState;
40
39
  };
41
40
 
42
- export type ExtractState<T> = [Extract<Awaited<T>, { [StateBrand]?: unknown }>] extends [never]
43
- ? {}
44
- : Extract<Awaited<T>, { [StateBrand]?: unknown }> extends { [StateBrand]?: infer S }
45
- ? [S] extends [never]
41
+ export type ExtractStateFromUnion<T> = T extends { readonly [StateBrand]?: infer S }
42
+ ? [S] extends [never]
43
+ ? never
44
+ : [unknown] extends [S]
46
45
  ? {}
47
46
  : S
48
- : {};
47
+ : never;
48
+
49
+ export type ExtractState<T> = [ExtractStateFromUnion<Awaited<T>>] extends [never]
50
+ ? {}
51
+ : ExtractStateFromUnion<Awaited<T>>;
49
52
 
50
53
  export type IsUnknown<T> = [unknown] extends [T] ? true : false;
51
54
 
@@ -54,8 +57,6 @@ export type NextFn<TExpectedState = unknown> =
54
57
  ? <S extends Record<string, unknown> = {}>(state?: S) => Promise<NextResult<S>>
55
58
  : (state: TExpectedState) => Promise<NextResult<TExpectedState>>;
56
59
 
57
- export type MiddlewareNext = NextFn;
58
-
59
60
  export type MiddlewareDefinition = CoreMiddlewareDefinition<ReturnsMap>;
60
61
 
61
62
  export type MiddlewareReturnFromParts<
@@ -110,7 +111,7 @@ export type StandaloneMiddlewareContext<
110
111
  TQuery = unknown,
111
112
  TParams = unknown,
112
113
  TBody = unknown,
113
- TAppContext extends Record<string, unknown> = AppContext,
114
+ TAppContext extends Record<string, unknown> = EmptyAppContext,
114
115
  TState = {},
115
116
  > = Simplify<
116
117
  TAppContext &
@@ -124,12 +125,15 @@ export type StandaloneMiddlewareContext<
124
125
  }
125
126
  >;
126
127
 
128
+ export declare const MiddlewareUnitBrand: unique symbol;
129
+
127
130
  export type MiddlewareUnit<
128
131
  TAcc = unknown,
129
132
  TReturns extends ReturnsMap = {},
130
133
  TRequiredLayouts = unknown,
131
134
  TRequiredState = unknown,
132
135
  > = MiddlewareDefinition & {
136
+ readonly [MiddlewareUnitBrand]: true;
133
137
  readonly __middlewareAcc: TAcc;
134
138
  readonly __returns?: TReturns;
135
139
  readonly __requiredLayouts?: TRequiredLayouts;
@@ -143,12 +147,26 @@ export type MiddlewareUnitBuilder<
143
147
  TReturns extends ReturnsMap = {},
144
148
  TRequiredLayouts = unknown,
145
149
  TRequiredState = {},
146
- TAppContext extends Record<string, unknown> = AppContext,
150
+ TAppContext extends Record<string, unknown> = EmptyAppContext,
147
151
  TInheritedState = {},
148
152
  TQueryIn = unknown,
149
153
  TParamsIn = unknown,
150
154
  TBodyIn = unknown,
151
- > = {
155
+ TExpectedState = unknown,
156
+ > = MiddlewareUnit<
157
+ MiddlewareReturnFromParts<
158
+ TQuery,
159
+ TParams,
160
+ TBody,
161
+ IsUnknown<TExpectedState> extends true ? {} : TExpectedState,
162
+ TQueryIn,
163
+ TParamsIn,
164
+ TBodyIn
165
+ >,
166
+ TReturns,
167
+ TRequiredLayouts,
168
+ TRequiredState
169
+ > & {
152
170
  query<Q, QIn = unknown>(
153
171
  schema: Schema<Q, QIn>,
154
172
  ): MiddlewareUnitBuilder<
@@ -162,7 +180,8 @@ export type MiddlewareUnitBuilder<
162
180
  TInheritedState,
163
181
  QIn,
164
182
  TParamsIn,
165
- TBodyIn
183
+ TBodyIn,
184
+ TExpectedState
166
185
  >;
167
186
  params<P, PIn = unknown>(
168
187
  schema: Schema<P, PIn>,
@@ -177,7 +196,8 @@ export type MiddlewareUnitBuilder<
177
196
  TInheritedState,
178
197
  TQueryIn,
179
198
  PIn,
180
- TBodyIn
199
+ TBodyIn,
200
+ TExpectedState
181
201
  >;
182
202
  body<B, BIn = unknown>(
183
203
  schema: Schema<B, BIn>,
@@ -192,7 +212,8 @@ export type MiddlewareUnitBuilder<
192
212
  TInheritedState,
193
213
  TQueryIn,
194
214
  TParamsIn,
195
- BIn
215
+ BIn,
216
+ TExpectedState
196
217
  >;
197
218
  body<Mode extends "json" | "form" | "urlencoded", B, BIn = unknown>(
198
219
  mode: Mode,
@@ -208,7 +229,8 @@ export type MiddlewareUnitBuilder<
208
229
  TInheritedState,
209
230
  TQueryIn,
210
231
  TParamsIn,
211
- BIn
232
+ BIn,
233
+ TExpectedState
212
234
  >;
213
235
  returns<const M extends ReturnsMap>(
214
236
  map: M,
@@ -223,7 +245,8 @@ export type MiddlewareUnitBuilder<
223
245
  TInheritedState,
224
246
  TQueryIn,
225
247
  TParamsIn,
226
- TBodyIn
248
+ TBodyIn,
249
+ TExpectedState
227
250
  >;
228
251
  requires<Requires extends Record<string, unknown>>(): MiddlewareUnitBuilder<
229
252
  TQuery,
@@ -236,9 +259,10 @@ export type MiddlewareUnitBuilder<
236
259
  TInheritedState,
237
260
  TQueryIn,
238
261
  TParamsIn,
239
- TBodyIn
262
+ TBodyIn,
263
+ TExpectedState
240
264
  >;
241
- handler<TState = unknown, R = unknown>(
265
+ handler<R>(
242
266
  fn: (
243
267
  ctx: StandaloneMiddlewareContext<
244
268
  TQuery,
@@ -247,13 +271,13 @@ export type MiddlewareUnitBuilder<
247
271
  TAppContext,
248
272
  TInheritedState & TRequiredState
249
273
  >,
250
- next: NextFn<NoInfer<TState>>,
251
- ) => Awaitable<R>,
274
+ next: NextFn<TExpectedState>,
275
+ ) => R,
252
276
  ): DefineMiddlewareResult<
253
277
  TQuery,
254
278
  TParams,
255
279
  TBody,
256
- TState,
280
+ IsUnknown<TExpectedState> extends true ? ExtractState<R> : TExpectedState,
257
281
  R,
258
282
  TQueryIn,
259
283
  TParamsIn,
@@ -1,2 +0,0 @@
1
- export interface RouterRegister {
2
- }
@@ -1,2 +0,0 @@
1
- export interface RouterRegister {
2
- }
package/src/register.ts DELETED
@@ -1 +0,0 @@
1
- export interface RouterRegister {}