@taserjs/router 0.1.3 → 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 (153) hide show
  1. package/README.md +0 -7
  2. package/dist/cjs/builder/constants.cjs +0 -6
  3. package/dist/cjs/builder/constants.cjs.map +1 -1
  4. package/dist/cjs/builder/constants.d.cts +0 -5
  5. package/dist/cjs/builder/factories.cjs.map +1 -1
  6. package/dist/cjs/builder/factories.d.cts +9 -9
  7. package/dist/cjs/builder/middleware-unit.cjs +64 -0
  8. package/dist/cjs/builder/middleware-unit.cjs.map +1 -0
  9. package/dist/cjs/builder/middleware-unit.d.cts +1 -0
  10. package/dist/cjs/builder/middleware.cjs +3 -1
  11. package/dist/cjs/builder/middleware.cjs.map +1 -1
  12. package/dist/cjs/builder/route.cjs +7 -21
  13. package/dist/cjs/builder/route.cjs.map +1 -1
  14. package/dist/cjs/builder/router.cjs +1 -20
  15. package/dist/cjs/builder/router.cjs.map +1 -1
  16. package/dist/cjs/builder/router.d.cts +6 -27
  17. package/dist/cjs/builder/standalone.cjs +43 -0
  18. package/dist/cjs/builder/standalone.cjs.map +1 -0
  19. package/dist/cjs/builder/standalone.d.cts +28 -0
  20. package/dist/cjs/define/middleware.cjs +11 -16
  21. package/dist/cjs/define/middleware.cjs.map +1 -1
  22. package/dist/cjs/define/middleware.d.cts +44 -34
  23. package/dist/cjs/index.cjs +15 -4
  24. package/dist/cjs/index.d.cts +6 -4
  25. package/dist/cjs/middleware/body-limit.cjs +3 -3
  26. package/dist/cjs/middleware/body-limit.cjs.map +1 -1
  27. package/dist/cjs/middleware/body-limit.d.cts +1 -1
  28. package/dist/cjs/middleware/compress.cjs +3 -3
  29. package/dist/cjs/middleware/compress.cjs.map +1 -1
  30. package/dist/cjs/middleware/compress.d.cts +1 -1
  31. package/dist/cjs/middleware/cors.cjs +3 -3
  32. package/dist/cjs/middleware/cors.cjs.map +1 -1
  33. package/dist/cjs/middleware/cors.d.cts +1 -1
  34. package/dist/cjs/middleware/csrf.cjs +3 -3
  35. package/dist/cjs/middleware/csrf.cjs.map +1 -1
  36. package/dist/cjs/middleware/csrf.d.cts +1 -1
  37. package/dist/cjs/middleware/etag.cjs +3 -3
  38. package/dist/cjs/middleware/etag.cjs.map +1 -1
  39. package/dist/cjs/middleware/etag.d.cts +1 -1
  40. package/dist/cjs/middleware/hono-mw.cjs +23 -0
  41. package/dist/cjs/middleware/hono-mw.cjs.map +1 -0
  42. package/dist/cjs/middleware/hono-mw.d.cts +16 -0
  43. package/dist/cjs/middleware/jwk.cjs +6 -2
  44. package/dist/cjs/middleware/jwk.cjs.map +1 -1
  45. package/dist/cjs/middleware/jwt.cjs +6 -2
  46. package/dist/cjs/middleware/jwt.cjs.map +1 -1
  47. package/dist/cjs/middleware/secure-headers.cjs +3 -3
  48. package/dist/cjs/middleware/secure-headers.cjs.map +1 -1
  49. package/dist/cjs/middleware/secure-headers.d.cts +1 -1
  50. package/dist/cjs/middleware/timing.cjs +3 -3
  51. package/dist/cjs/middleware/timing.cjs.map +1 -1
  52. package/dist/cjs/middleware/timing.d.cts +1 -1
  53. package/dist/cjs/types/index.d.cts +20 -52
  54. package/dist/cjs/types/type-utils.d.cts +2 -2
  55. package/dist/cjs/types/units.d.cts +18 -45
  56. package/dist/esm/builder/constants.d.ts +0 -5
  57. package/dist/esm/builder/constants.js +1 -6
  58. package/dist/esm/builder/constants.js.map +1 -1
  59. package/dist/esm/builder/factories.d.ts +9 -9
  60. package/dist/esm/builder/factories.js.map +1 -1
  61. package/dist/esm/builder/middleware-unit.d.ts +1 -0
  62. package/dist/esm/builder/middleware-unit.js +64 -0
  63. package/dist/esm/builder/middleware-unit.js.map +1 -0
  64. package/dist/esm/builder/middleware.js +3 -1
  65. package/dist/esm/builder/middleware.js.map +1 -1
  66. package/dist/esm/builder/route.js +7 -21
  67. package/dist/esm/builder/route.js.map +1 -1
  68. package/dist/esm/builder/router.d.ts +6 -27
  69. package/dist/esm/builder/router.js +1 -20
  70. package/dist/esm/builder/router.js.map +1 -1
  71. package/dist/esm/builder/standalone.d.ts +28 -0
  72. package/dist/esm/builder/standalone.js +32 -0
  73. package/dist/esm/builder/standalone.js.map +1 -0
  74. package/dist/esm/define/middleware.d.ts +44 -34
  75. package/dist/esm/define/middleware.js +11 -16
  76. package/dist/esm/define/middleware.js.map +1 -1
  77. package/dist/esm/index.d.ts +6 -4
  78. package/dist/esm/index.js +3 -3
  79. package/dist/esm/middleware/body-limit.d.ts +1 -1
  80. package/dist/esm/middleware/body-limit.js +3 -3
  81. package/dist/esm/middleware/body-limit.js.map +1 -1
  82. package/dist/esm/middleware/compress.d.ts +1 -1
  83. package/dist/esm/middleware/compress.js +3 -3
  84. package/dist/esm/middleware/compress.js.map +1 -1
  85. package/dist/esm/middleware/cors.d.ts +1 -1
  86. package/dist/esm/middleware/cors.js +3 -3
  87. package/dist/esm/middleware/cors.js.map +1 -1
  88. package/dist/esm/middleware/csrf.d.ts +1 -1
  89. package/dist/esm/middleware/csrf.js +3 -3
  90. package/dist/esm/middleware/csrf.js.map +1 -1
  91. package/dist/esm/middleware/etag.d.ts +1 -1
  92. package/dist/esm/middleware/etag.js +3 -3
  93. package/dist/esm/middleware/etag.js.map +1 -1
  94. package/dist/esm/middleware/hono-mw.d.ts +16 -0
  95. package/dist/esm/middleware/hono-mw.js +23 -0
  96. package/dist/esm/middleware/hono-mw.js.map +1 -0
  97. package/dist/esm/middleware/jwk.js +7 -3
  98. package/dist/esm/middleware/jwk.js.map +1 -1
  99. package/dist/esm/middleware/jwt.js +7 -3
  100. package/dist/esm/middleware/jwt.js.map +1 -1
  101. package/dist/esm/middleware/secure-headers.d.ts +1 -1
  102. package/dist/esm/middleware/secure-headers.js +3 -3
  103. package/dist/esm/middleware/secure-headers.js.map +1 -1
  104. package/dist/esm/middleware/timing.d.ts +1 -1
  105. package/dist/esm/middleware/timing.js +3 -3
  106. package/dist/esm/middleware/timing.js.map +1 -1
  107. package/dist/esm/types/index.d.ts +20 -52
  108. package/dist/esm/types/type-utils.d.ts +2 -2
  109. package/dist/esm/types/units.d.ts +18 -45
  110. package/package.json +3 -3
  111. package/src/builder/constants.ts +0 -6
  112. package/src/builder/factories.ts +2 -2
  113. package/src/builder/middleware-unit.ts +66 -0
  114. package/src/builder/middleware.ts +8 -2
  115. package/src/builder/route.ts +10 -34
  116. package/src/builder/router.ts +7 -77
  117. package/src/builder/standalone.ts +70 -0
  118. package/src/define/middleware.ts +155 -231
  119. package/src/index.ts +29 -3
  120. package/src/middleware/body-limit.ts +3 -4
  121. package/src/middleware/compress.ts +3 -4
  122. package/src/middleware/cors.ts +3 -4
  123. package/src/middleware/csrf.ts +3 -4
  124. package/src/middleware/etag.ts +3 -4
  125. package/src/middleware/hono-mw.ts +22 -0
  126. package/src/middleware/jwk.ts +10 -8
  127. package/src/middleware/jwt.ts +9 -7
  128. package/src/middleware/secure-headers.ts +3 -4
  129. package/src/middleware/timing.ts +3 -4
  130. package/src/types/index.ts +54 -196
  131. package/src/types/type-utils.ts +8 -4
  132. package/src/types/units.ts +153 -87
  133. package/dist/cjs/define/handler.cjs +0 -38
  134. package/dist/cjs/define/handler.cjs.map +0 -1
  135. package/dist/cjs/define/handler.d.cts +0 -13
  136. package/dist/cjs/middleware/wrap-hono.cjs +0 -19
  137. package/dist/cjs/middleware/wrap-hono.cjs.map +0 -1
  138. package/dist/cjs/middleware/wrap-hono.d.cts +0 -7
  139. package/dist/cjs/register.d.cts +0 -2
  140. package/dist/cjs/types/units.cjs +0 -8
  141. package/dist/cjs/types/units.cjs.map +0 -1
  142. package/dist/esm/define/handler.d.ts +0 -13
  143. package/dist/esm/define/handler.js +0 -38
  144. package/dist/esm/define/handler.js.map +0 -1
  145. package/dist/esm/middleware/wrap-hono.d.ts +0 -7
  146. package/dist/esm/middleware/wrap-hono.js +0 -18
  147. package/dist/esm/middleware/wrap-hono.js.map +0 -1
  148. package/dist/esm/register.d.ts +0 -2
  149. package/dist/esm/types/units.js +0 -8
  150. package/dist/esm/types/units.js.map +0 -1
  151. package/src/define/handler.ts +0 -62
  152. package/src/middleware/wrap-hono.ts +0 -25
  153. package/src/register.ts +0 -1
@@ -6,32 +6,10 @@ import {
6
6
  } from "@taserjs/router-core";
7
7
  import { isPromise, normalizeOnError } from "@taserjs/router-utils";
8
8
 
9
- import {
10
- createAllRoute,
11
- createAnyRoute,
12
- createDeleteRoute,
13
- createGetRoute,
14
- createHeadRoute,
15
- createOptionsRoute,
16
- createPatchRoute,
17
- createPostRoute,
18
- createPutRoute,
19
- } from "./factories.js";
20
- import { defineHandler } from "../define/handler.js";
21
- import { defineMiddleware, type DefineMiddlewareFn } from "../define/middleware.js";
22
- import { createMiddleware } from "./middleware.js";
23
9
  import { TaserApp } from "./app.js";
24
10
  import type { ContextDefinition, CreateTaserAppOptions, OnErrorOptions } from "../types/app.js";
25
- import type { AppContext } from "../types/units.js";
26
- import type { HandlerBuilder, LayoutId, MiddlewareBuilder } from "../types/index.js";
11
+ import type { EmptyAppContext } from "../types/units.js";
27
12
  import type { ReturnsMap } from "../types/returns.js";
28
- import type { Schema } from "../types/schema.js";
29
- import type {
30
- CreateAllRoute,
31
- CreateAnyRoute,
32
- CreateWithBodyRoute,
33
- CreateWithoutBodyRoute,
34
- } from "./factories.js";
35
13
 
36
14
  function toOnErrorHandler(
37
15
  onErrorOptions: OnErrorOptions | OnErrorOptions["handle"],
@@ -49,10 +27,13 @@ type RouterState = {
49
27
  const emptyContext: ContextDefinition<Record<string, unknown>, Record<string, unknown>> = {};
50
28
 
51
29
  export class TaserRouter<
52
- TAppContext extends Record<string, unknown> = AppContext,
30
+ TAppContext extends Record<string, unknown> = EmptyAppContext,
53
31
  THasNotFound extends boolean = false,
54
32
  > {
55
33
  private readonly state: RouterState;
34
+ readonly $Infer!: {
35
+ Context: TAppContext;
36
+ };
56
37
 
57
38
  constructor(options: CreateTaserAppOptions = {}, state?: Partial<Omit<RouterState, "options">>) {
58
39
  this.state = {
@@ -84,57 +65,6 @@ export class TaserRouter<
84
65
  return this as unknown as TaserRouter<TAppContext, true>;
85
66
  }
86
67
 
87
- get: CreateWithoutBodyRoute<"GET", TAppContext> = createGetRoute as CreateWithoutBodyRoute<
88
- "GET",
89
- TAppContext
90
- >;
91
- post: CreateWithBodyRoute<"POST", TAppContext> = createPostRoute as CreateWithBodyRoute<
92
- "POST",
93
- TAppContext
94
- >;
95
- put: CreateWithBodyRoute<"PUT", TAppContext> = createPutRoute as CreateWithBodyRoute<
96
- "PUT",
97
- TAppContext
98
- >;
99
- patch: CreateWithBodyRoute<"PATCH", TAppContext> = createPatchRoute as CreateWithBodyRoute<
100
- "PATCH",
101
- TAppContext
102
- >;
103
- delete: CreateWithoutBodyRoute<"DELETE", TAppContext> =
104
- createDeleteRoute as CreateWithoutBodyRoute<"DELETE", TAppContext>;
105
- options: CreateWithoutBodyRoute<"OPTIONS", TAppContext> =
106
- createOptionsRoute as CreateWithoutBodyRoute<"OPTIONS", TAppContext>;
107
- head: CreateWithoutBodyRoute<"HEAD", TAppContext> = createHeadRoute as CreateWithoutBodyRoute<
108
- "HEAD",
109
- TAppContext
110
- >;
111
- any: CreateAnyRoute<TAppContext> = createAnyRoute as CreateAnyRoute<TAppContext>;
112
- all: CreateAllRoute<TAppContext> = createAllRoute as CreateAllRoute<TAppContext>;
113
-
114
- middleware<const Layout extends LayoutId>(
115
- layout: Layout,
116
- ): MiddlewareBuilder<Layout, readonly [], TAppContext> {
117
- return createMiddleware(layout) as MiddlewareBuilder<Layout, readonly [], TAppContext>;
118
- }
119
-
120
- defineHandler<TQuery = unknown, TParams = unknown, TBody = unknown>(options?: {
121
- query?: Schema<TQuery>;
122
- params?: Schema<TParams>;
123
- body?: Schema<TBody>;
124
- }): HandlerBuilder<
125
- readonly [],
126
- { query: TQuery; params: TParams; body: TBody },
127
- {},
128
- TAppContext
129
- > {
130
- return options === undefined
131
- ? defineHandler<TAppContext>()
132
- : defineHandler<TAppContext>(options);
133
- }
134
-
135
- defineMiddleware: DefineMiddlewareFn<TAppContext> =
136
- defineMiddleware as DefineMiddlewareFn<TAppContext>;
137
-
138
68
  create<const TManifest extends RouteManifestShape>(
139
69
  manifest: TManifest,
140
70
  runtimeOptions?: { basePath?: string },
@@ -209,6 +139,6 @@ export class TaserRouter<
209
139
 
210
140
  export function createTaserApp(
211
141
  options: CreateTaserAppOptions = {},
212
- ): TaserRouter<AppContext, false> {
213
- return new TaserRouter<AppContext, false>(options);
142
+ ): TaserRouter<EmptyAppContext, false> {
143
+ return new TaserRouter<EmptyAppContext, false>(options);
214
144
  }
@@ -0,0 +1,70 @@
1
+ import type { AppContext, LayoutBuilder } from "../types/index.js";
2
+ import {
3
+ createAllRoute,
4
+ createAnyRoute,
5
+ createDeleteRoute,
6
+ createGetRoute,
7
+ createHeadRoute,
8
+ createOptionsRoute,
9
+ createPatchRoute,
10
+ createPostRoute,
11
+ createPutRoute,
12
+ type CreateAllRoute,
13
+ type CreateAnyRoute,
14
+ type CreateWithBodyRoute,
15
+ type CreateWithoutBodyRoute,
16
+ } from "./factories.js";
17
+ import { createMiddleware } from "./middleware.js";
18
+ import { middleware as createMiddlewareFn, type MiddlewareFn } from "../define/middleware.js";
19
+
20
+ export const get: CreateWithoutBodyRoute<"GET", AppContext> =
21
+ createGetRoute as CreateWithoutBodyRoute<"GET", AppContext>;
22
+ export const post: CreateWithBodyRoute<"POST", AppContext> = createPostRoute as CreateWithBodyRoute<
23
+ "POST",
24
+ AppContext
25
+ >;
26
+ export const put: CreateWithBodyRoute<"PUT", AppContext> = createPutRoute as CreateWithBodyRoute<
27
+ "PUT",
28
+ AppContext
29
+ >;
30
+ export const patch: CreateWithBodyRoute<"PATCH", AppContext> =
31
+ createPatchRoute as CreateWithBodyRoute<"PATCH", AppContext>;
32
+ export const del: CreateWithoutBodyRoute<"DELETE", AppContext> =
33
+ createDeleteRoute as CreateWithoutBodyRoute<"DELETE", AppContext>;
34
+ export const options: CreateWithoutBodyRoute<"OPTIONS", AppContext> =
35
+ createOptionsRoute as CreateWithoutBodyRoute<"OPTIONS", AppContext>;
36
+ export const head: CreateWithoutBodyRoute<"HEAD", AppContext> =
37
+ createHeadRoute as CreateWithoutBodyRoute<"HEAD", AppContext>;
38
+ export const any: CreateAnyRoute<AppContext> = createAnyRoute as CreateAnyRoute<AppContext>;
39
+ export const all: CreateAllRoute<AppContext> = createAllRoute as CreateAllRoute<AppContext>;
40
+
41
+ export const layout: LayoutBuilder<AppContext> = createMiddleware as LayoutBuilder<AppContext>;
42
+ export const middleware: MiddlewareFn<AppContext> = createMiddlewareFn as MiddlewareFn<AppContext>;
43
+
44
+ export type TaserNamespace<TAppContext extends Record<string, unknown> = AppContext> = {
45
+ readonly get: CreateWithoutBodyRoute<"GET", TAppContext>;
46
+ readonly post: CreateWithBodyRoute<"POST", TAppContext>;
47
+ readonly put: CreateWithBodyRoute<"PUT", TAppContext>;
48
+ readonly patch: CreateWithBodyRoute<"PATCH", TAppContext>;
49
+ readonly delete: CreateWithoutBodyRoute<"DELETE", TAppContext>;
50
+ readonly options: CreateWithoutBodyRoute<"OPTIONS", TAppContext>;
51
+ readonly head: CreateWithoutBodyRoute<"HEAD", TAppContext>;
52
+ readonly any: CreateAnyRoute<TAppContext>;
53
+ readonly all: CreateAllRoute<TAppContext>;
54
+ readonly layout: LayoutBuilder<TAppContext>;
55
+ readonly middleware: MiddlewareFn<TAppContext>;
56
+ };
57
+
58
+ export const t: TaserNamespace<AppContext> = {
59
+ get,
60
+ post,
61
+ put,
62
+ patch,
63
+ delete: del,
64
+ options,
65
+ head,
66
+ any,
67
+ all,
68
+ layout,
69
+ middleware,
70
+ };
@@ -1,281 +1,205 @@
1
- import { createTaserCompatHandler, type Awaitable } from "@taserjs/router-core";
2
-
3
- import type { ReturnsMap } from "../types/returns.js";
1
+ import { createMiddlewareUnitBuilder } from "../builder/middleware-unit.js";
4
2
  import type {
5
- AppContext,
6
3
  DefineMiddlewareResult,
7
- MiddlewareReturnFromParts,
8
- MiddlewareUnit,
4
+ ExtractState,
5
+ IsUnknown,
6
+ MiddlewareUnitBuilder,
9
7
  NextFn,
10
8
  StandaloneMiddlewareContext,
11
9
  } from "../types/units.js";
12
10
  import type {
11
+ AppContext,
13
12
  LayoutId,
14
13
  ResolveLayoutMiddlewaresState,
15
14
  ResolveLayoutsState,
16
15
  } from "../types/index.js";
17
- import type { Schema } from "../types/schema.js";
18
-
19
- export type HonoMiddlewareHandler = Parameters<typeof createTaserCompatHandler>[0];
20
-
21
- export type HonoMiddlewareUnit = MiddlewareUnit<
22
- MiddlewareReturnFromParts<unknown, unknown, unknown, {}>,
23
- {},
24
- null,
25
- {}
26
- >;
27
16
 
28
- export type DefineMiddlewareOptions<
29
- TState = unknown,
30
- TRequires = {},
31
- TQuery = unknown,
32
- TParams = unknown,
33
- TBody = unknown,
34
- TReturns extends ReturnsMap = {},
35
- TQueryIn = unknown,
36
- TParamsIn = unknown,
37
- TBodyIn = unknown,
38
- TAppContext extends Record<string, unknown> = AppContext,
39
- R = unknown,
40
- > = {
41
- query?: Schema<TQuery, TQueryIn>;
42
- params?: Schema<TParams, TParamsIn>;
43
- body?: Schema<TBody, TBodyIn>;
44
- returns?: TReturns;
45
- handler: (
46
- ctx: StandaloneMiddlewareContext<TQuery, TParams, TBody, TAppContext, TRequires>,
47
- next: NextFn<NoInfer<TState>>,
48
- ) => Awaitable<R>;
49
- };
50
-
51
- export type ScopedMiddlewareOptions<
52
- Layout extends LayoutId,
53
- TState = unknown,
54
- TRequires = {},
55
- TQuery = unknown,
56
- TParams = unknown,
57
- TBody = unknown,
58
- TReturns extends ReturnsMap = {},
59
- TQueryIn = unknown,
60
- TParamsIn = unknown,
61
- TBodyIn = unknown,
62
- TAppContext extends Record<string, unknown> = AppContext,
63
- R = unknown,
64
- > = {
65
- query?: Schema<TQuery, TQueryIn>;
66
- params?: Schema<TParams, TParamsIn>;
67
- body?: Schema<TBody, TBodyIn>;
68
- returns?: TReturns;
69
- handler: (
70
- ctx: StandaloneMiddlewareContext<
71
- TQuery,
72
- TParams,
73
- TBody,
74
- TAppContext,
75
- ResolveLayoutMiddlewaresState<Layout> & TRequires
76
- >,
77
- next: NextFn<NoInfer<TState>>,
78
- ) => Awaitable<R>;
79
- };
17
+ export interface MiddlewareFn<TAppContext extends Record<string, unknown> = AppContext> {
18
+ /**
19
+ * Constructs a fluent unscoped middleware builder, with optional explicit State generic.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const auth = middleware<{ user: string }>()
24
+ * .query(z.object({ token: z.string() }))
25
+ * .body("form", z.object({ file: z.instanceof(File) }))
26
+ * .returns({ 401: z.string() })
27
+ * .handler(async (ctx, next) => next({ user: "alice" }));
28
+ * ```
29
+ */
30
+ <TState = unknown>(): MiddlewareUnitBuilder<
31
+ unknown,
32
+ unknown,
33
+ unknown,
34
+ {},
35
+ null,
36
+ {},
37
+ TAppContext,
38
+ {},
39
+ unknown,
40
+ unknown,
41
+ unknown,
42
+ TState
43
+ >;
80
44
 
81
- export type MultiScopedMiddlewareOptions<
82
- Layouts extends readonly LayoutId[],
83
- TState = unknown,
84
- TRequires = {},
85
- TQuery = unknown,
86
- TParams = unknown,
87
- TBody = unknown,
88
- TReturns extends ReturnsMap = {},
89
- TQueryIn = unknown,
90
- TParamsIn = unknown,
91
- TBodyIn = unknown,
92
- TAppContext extends Record<string, unknown> = AppContext,
93
- R = unknown,
94
- > = {
95
- query?: Schema<TQuery, TQueryIn>;
96
- params?: Schema<TParams, TParamsIn>;
97
- body?: Schema<TBody, TBodyIn>;
98
- returns?: TReturns;
99
- handler: (
100
- ctx: StandaloneMiddlewareContext<
101
- TQuery,
102
- TParams,
103
- TBody,
104
- TAppContext,
105
- ResolveLayoutsState<Layouts> & TRequires
106
- >,
107
- next: NextFn<NoInfer<TState>>,
108
- ) => Awaitable<R>;
109
- };
45
+ /**
46
+ * Constructs a fluent middleware builder scoped to a single layout branch, with optional explicit State generic.
47
+ */
48
+ <const Layout extends LayoutId, TState = unknown>(
49
+ layout: Layout,
50
+ ): MiddlewareUnitBuilder<
51
+ unknown,
52
+ unknown,
53
+ unknown,
54
+ {},
55
+ Layout,
56
+ {},
57
+ TAppContext,
58
+ ResolveLayoutMiddlewaresState<Layout>,
59
+ unknown,
60
+ unknown,
61
+ unknown,
62
+ TState
63
+ >;
110
64
 
111
- export interface DefineMiddlewareFn<TAppContext extends Record<string, unknown> = AppContext> {
112
- (middleware: HonoMiddlewareHandler): HonoMiddlewareUnit;
65
+ /**
66
+ * Constructs a fluent middleware builder scoped to multiple layout branches (branch union), with optional explicit State generic.
67
+ */
68
+ <const Layouts extends readonly [LayoutId, ...LayoutId[]], TState = unknown>(
69
+ layouts: Layouts,
70
+ ): MiddlewareUnitBuilder<
71
+ unknown,
72
+ unknown,
73
+ unknown,
74
+ {},
75
+ Layouts,
76
+ {},
77
+ TAppContext,
78
+ ResolveLayoutsState<Layouts>,
79
+ unknown,
80
+ unknown,
81
+ unknown,
82
+ TState
83
+ >;
113
84
 
114
- <
115
- const Layout extends LayoutId,
116
- TState = unknown,
117
- TRequires = {},
118
- TQuery = unknown,
119
- TParams = unknown,
120
- TBody = unknown,
121
- TReturns extends ReturnsMap = {},
122
- TQueryIn = unknown,
123
- TParamsIn = unknown,
124
- TBodyIn = unknown,
125
- R = unknown,
126
- >(
85
+ /**
86
+ * Defines a standalone middleware scoped to a single layout branch using a short function signature.
87
+ */
88
+ <const Layout extends LayoutId, TState = unknown, TRequires = {}, R = unknown>(
127
89
  layout: Layout,
128
- options: ScopedMiddlewareOptions<
129
- Layout,
130
- TState,
131
- TRequires,
132
- TQuery,
133
- TParams,
134
- TBody,
135
- TReturns,
136
- TQueryIn,
137
- TParamsIn,
138
- TBodyIn,
139
- TAppContext,
140
- R
141
- >,
90
+ fn: (
91
+ ctx: StandaloneMiddlewareContext<
92
+ unknown,
93
+ unknown,
94
+ unknown,
95
+ TAppContext,
96
+ ResolveLayoutMiddlewaresState<Layout> & TRequires
97
+ >,
98
+ next: NextFn<NoInfer<TState>>,
99
+ ) => R,
142
100
  ): DefineMiddlewareResult<
143
- TQuery,
144
- TParams,
145
- TBody,
146
- TState,
101
+ unknown,
102
+ unknown,
103
+ unknown,
104
+ IsUnknown<TState> extends true ? ExtractState<R> : TState,
147
105
  R,
148
- TQueryIn,
149
- TParamsIn,
150
- TBodyIn,
151
- TReturns,
106
+ unknown,
107
+ unknown,
108
+ unknown,
109
+ {},
152
110
  Layout,
153
111
  TRequires
154
112
  >;
155
113
 
114
+ /**
115
+ * Defines a standalone middleware scoped to multiple layout branches using a short function signature.
116
+ */
156
117
  <
157
118
  const Layouts extends readonly [LayoutId, ...LayoutId[]],
158
119
  TState = unknown,
159
120
  TRequires = {},
160
- TQuery = unknown,
161
- TParams = unknown,
162
- TBody = unknown,
163
- TReturns extends ReturnsMap = {},
164
- TQueryIn = unknown,
165
- TParamsIn = unknown,
166
- TBodyIn = unknown,
167
121
  R = unknown,
168
122
  >(
169
123
  layouts: Layouts,
170
- options: MultiScopedMiddlewareOptions<
171
- Layouts,
172
- TState,
173
- TRequires,
174
- TQuery,
175
- TParams,
176
- TBody,
177
- TReturns,
178
- TQueryIn,
179
- TParamsIn,
180
- TBodyIn,
181
- TAppContext,
182
- R
183
- >,
124
+ fn: (
125
+ ctx: StandaloneMiddlewareContext<
126
+ unknown,
127
+ unknown,
128
+ unknown,
129
+ TAppContext,
130
+ ResolveLayoutsState<Layouts> & TRequires
131
+ >,
132
+ next: NextFn<NoInfer<TState>>,
133
+ ) => R,
184
134
  ): DefineMiddlewareResult<
185
- TQuery,
186
- TParams,
187
- TBody,
188
- TState,
135
+ unknown,
136
+ unknown,
137
+ unknown,
138
+ IsUnknown<TState> extends true ? ExtractState<R> : TState,
189
139
  R,
190
- TQueryIn,
191
- TParamsIn,
192
- TBodyIn,
193
- TReturns,
140
+ unknown,
141
+ unknown,
142
+ unknown,
143
+ {},
194
144
  Layouts,
195
145
  TRequires
196
146
  >;
197
147
 
198
- <
199
- TState = unknown,
200
- TRequires = {},
201
- TQuery = unknown,
202
- TParams = unknown,
203
- TBody = unknown,
204
- TReturns extends ReturnsMap = {},
205
- TQueryIn = unknown,
206
- TParamsIn = unknown,
207
- TBodyIn = unknown,
208
- R = unknown,
209
- >(
210
- options: DefineMiddlewareOptions<
211
- TState,
212
- TRequires,
213
- TQuery,
214
- TParams,
215
- TBody,
216
- TReturns,
217
- TQueryIn,
218
- TParamsIn,
219
- TBodyIn,
220
- TAppContext,
221
- R
222
- >,
148
+ /**
149
+ * Defines a standalone, unscoped middleware using a short function signature.
150
+ *
151
+ * @example
152
+ * ```ts
153
+ * const auth = middleware((ctx, next) => {
154
+ * return next({ user: "alice" });
155
+ * });
156
+ * ```
157
+ */
158
+ <TState = unknown, TRequires = {}, R = unknown>(
159
+ fn: (
160
+ ctx: StandaloneMiddlewareContext<unknown, unknown, unknown, TAppContext, TRequires>,
161
+ next: NextFn<NoInfer<TState>>,
162
+ ) => R,
223
163
  ): DefineMiddlewareResult<
224
- TQuery,
225
- TParams,
226
- TBody,
227
- TState,
164
+ unknown,
165
+ unknown,
166
+ unknown,
167
+ IsUnknown<TState> extends true ? ExtractState<R> : TState,
228
168
  R,
229
- TQueryIn,
230
- TParamsIn,
231
- TBodyIn,
232
- TReturns,
169
+ unknown,
170
+ unknown,
171
+ unknown,
172
+ {},
233
173
  null,
234
174
  TRequires
235
175
  >;
236
176
  }
237
177
 
238
- export const defineMiddleware: DefineMiddlewareFn<AppContext> = function defineMiddleware(
239
- first: any,
178
+ export const middleware: MiddlewareFn<AppContext> = function middleware(
179
+ first?: any,
240
180
  second?: any,
241
181
  ): any {
182
+ if (first === undefined) {
183
+ return createMiddlewareUnitBuilder();
184
+ }
185
+
242
186
  if (typeof first === "string" || Array.isArray(first)) {
243
- const options = second!;
244
- const unit = {
245
- ...options,
246
- __middlewareAcc: undefined as unknown,
247
- ...(options?.returns ? { __returns: options.returns } : {}),
248
- __requiredLayouts: first,
249
- };
250
- return unit;
187
+ if (typeof second === "function") {
188
+ return {
189
+ handler: second,
190
+ __middlewareAcc: undefined as unknown,
191
+ __requiredLayouts: first,
192
+ };
193
+ }
194
+ return createMiddlewareUnitBuilder(first);
251
195
  }
252
196
 
253
197
  if (typeof first === "function") {
254
- const honoMiddleware = first as HonoMiddlewareHandler;
255
- return defineMiddleware({
256
- handler: (ctx: unknown, next: (state?: Record<string, unknown>) => unknown) =>
257
- createTaserCompatHandler(honoMiddleware)(ctx, next),
258
- });
198
+ return {
199
+ handler: first,
200
+ __middlewareAcc: undefined as unknown,
201
+ };
259
202
  }
260
203
 
261
- const options = first as DefineMiddlewareOptions<
262
- any,
263
- any,
264
- any,
265
- any,
266
- any,
267
- any,
268
- any,
269
- any,
270
- any,
271
- any,
272
- any
273
- >;
274
- const unit = {
275
- ...options,
276
- __middlewareAcc: undefined as unknown,
277
- ...(options.returns ? { __returns: options.returns } : {}),
278
- };
279
-
280
- return unit;
204
+ return createMiddlewareUnitBuilder();
281
205
  };
package/src/index.ts CHANGED
@@ -1,15 +1,25 @@
1
- export type { RouterRegister } from "./register.js";
1
+ export interface RouterRegister {}
2
2
  export type {
3
+ AppContext,
4
+ EmptyAppContext,
3
5
  HttpMethod,
4
6
  InferInput,
5
7
  InferOutput,
6
8
  InferRouteContext,
7
9
  InferRouteInput,
10
+ InferRouteInputFromPath,
8
11
  InferRouteOutput,
12
+ LayoutBuilder,
13
+ LayoutId,
14
+ LayoutTree,
9
15
  Method,
16
+ MiddlewareBuilder,
10
17
  MiddlewareDefinition,
18
+ MiddlewareUnit,
19
+ MiddlewareUnitBuilder,
11
20
  PathParams,
12
21
  ReturnsMap,
22
+ RouteByPathMethod,
13
23
  RouteDefinition,
14
24
  RouteExport,
15
25
  RoutePath,
@@ -29,10 +39,26 @@ export type {
29
39
  export { ValidationError, validationErrorSchema } from "@taserjs/router-utils";
30
40
  export type { ResponseValidationFailureHandler, SuccessStatusCode } from "@taserjs/router-utils";
31
41
 
42
+ export {
43
+ all,
44
+ any,
45
+ del,
46
+ get,
47
+ head,
48
+ layout,
49
+ middleware,
50
+ options,
51
+ patch,
52
+ post,
53
+ put,
54
+ t,
55
+ type TaserNamespace,
56
+ } from "./builder/standalone.js";
57
+
32
58
  export { createTaserApp, TaserRouter } from "./builder/router.js";
33
59
  export { TaserApp } from "./builder/app.js";
34
60
  export { createContext } from "./context/create-context.js";
35
- export { defineHandler } from "./define/handler.js";
36
- export { defineMiddleware } from "./define/middleware.js";
61
+ export { honoMw } from "./middleware/hono-mw.js";
62
+ export type { MiddlewareFn } from "./define/middleware.js";
37
63
 
38
64
  export type { TaserCookieJar, TaserHeaders } from "@taserjs/router-core";