@taserjs/router 0.0.4 → 0.0.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/dist/cjs/builder/app.cjs +22 -0
  2. package/dist/cjs/builder/app.cjs.map +1 -0
  3. package/dist/cjs/builder/app.d.cts +11 -0
  4. package/dist/cjs/{constants.cjs → builder/constants.cjs} +1 -1
  5. package/dist/cjs/builder/constants.cjs.map +1 -0
  6. package/dist/cjs/{factories.cjs → builder/factories.cjs} +1 -1
  7. package/dist/cjs/builder/factories.cjs.map +1 -0
  8. package/dist/cjs/{factories.d.cts → builder/factories.d.cts} +2 -2
  9. package/dist/cjs/{middleware.cjs → builder/middleware.cjs} +1 -1
  10. package/dist/cjs/builder/middleware.cjs.map +1 -0
  11. package/dist/cjs/{middleware.d.cts → builder/middleware.d.cts} +1 -1
  12. package/dist/cjs/{route.cjs → builder/route.cjs} +19 -33
  13. package/dist/cjs/builder/route.cjs.map +1 -0
  14. package/dist/cjs/{route.d.cts → builder/route.d.cts} +3 -3
  15. package/dist/cjs/{taser-router.cjs → builder/router.cjs} +38 -11
  16. package/dist/cjs/builder/router.cjs.map +1 -0
  17. package/dist/cjs/builder/router.d.cts +48 -0
  18. package/dist/cjs/{create-context.cjs → context/create-context.cjs} +1 -1
  19. package/dist/cjs/context/create-context.cjs.map +1 -0
  20. package/dist/cjs/{create-context.d.cts → context/create-context.d.cts} +2 -2
  21. package/dist/cjs/define/validators.cjs +1 -1
  22. package/dist/cjs/define/validators.cjs.map +1 -1
  23. package/dist/cjs/define/validators.d.cts +1 -1
  24. package/dist/cjs/index.cjs +6 -16
  25. package/dist/cjs/index.d.cts +6 -7
  26. package/dist/cjs/middleware/body-limit.cjs +2 -2
  27. package/dist/cjs/middleware/body-limit.cjs.map +1 -1
  28. package/dist/cjs/middleware/compress.cjs +2 -2
  29. package/dist/cjs/middleware/compress.cjs.map +1 -1
  30. package/dist/cjs/middleware/cors.cjs +2 -2
  31. package/dist/cjs/middleware/cors.cjs.map +1 -1
  32. package/dist/cjs/middleware/csrf.cjs +2 -2
  33. package/dist/cjs/middleware/csrf.cjs.map +1 -1
  34. package/dist/cjs/middleware/etag.cjs +2 -2
  35. package/dist/cjs/middleware/etag.cjs.map +1 -1
  36. package/dist/cjs/middleware/jwk.cjs +2 -8
  37. package/dist/cjs/middleware/jwk.cjs.map +1 -1
  38. package/dist/cjs/middleware/jwt.cjs +2 -8
  39. package/dist/cjs/middleware/jwt.cjs.map +1 -1
  40. package/dist/cjs/middleware/secure-headers.cjs +2 -2
  41. package/dist/cjs/middleware/secure-headers.cjs.map +1 -1
  42. package/dist/cjs/middleware/timing.cjs +2 -2
  43. package/dist/cjs/middleware/timing.cjs.map +1 -1
  44. package/dist/cjs/middleware/wrap-hono.cjs +10 -0
  45. package/dist/cjs/middleware/wrap-hono.cjs.map +1 -1
  46. package/dist/cjs/middleware/wrap-hono.d.cts +4 -0
  47. package/dist/cjs/types/app.d.cts +7 -7
  48. package/dist/cjs/types/index.d.cts +32 -13
  49. package/dist/cjs/types/returns.d.cts +2 -2
  50. package/dist/cjs/types/type-utils.d.cts +1 -2
  51. package/dist/cjs/types/units.cjs.map +1 -1
  52. package/dist/cjs/types/units.d.cts +4 -9
  53. package/dist/esm/builder/app.d.ts +11 -0
  54. package/dist/esm/builder/app.js +22 -0
  55. package/dist/esm/builder/app.js.map +1 -0
  56. package/dist/esm/{constants.js → builder/constants.js} +1 -1
  57. package/dist/esm/builder/constants.js.map +1 -0
  58. package/dist/esm/{factories.d.ts → builder/factories.d.ts} +2 -2
  59. package/dist/esm/{factories.js → builder/factories.js} +1 -1
  60. package/dist/esm/builder/factories.js.map +1 -0
  61. package/dist/esm/{middleware.d.ts → builder/middleware.d.ts} +1 -1
  62. package/dist/esm/{middleware.js → builder/middleware.js} +1 -1
  63. package/dist/esm/builder/middleware.js.map +1 -0
  64. package/dist/esm/{route.d.ts → builder/route.d.ts} +3 -3
  65. package/dist/esm/{route.js → builder/route.js} +19 -33
  66. package/dist/esm/builder/route.js.map +1 -0
  67. package/dist/esm/builder/router.d.ts +48 -0
  68. package/dist/esm/{taser-router.js → builder/router.js} +37 -10
  69. package/dist/esm/builder/router.js.map +1 -0
  70. package/dist/esm/{create-context.d.ts → context/create-context.d.ts} +2 -2
  71. package/dist/esm/{create-context.js → context/create-context.js} +1 -1
  72. package/dist/esm/context/create-context.js.map +1 -0
  73. package/dist/esm/define/validators.d.ts +1 -1
  74. package/dist/esm/define/validators.js +1 -1
  75. package/dist/esm/define/validators.js.map +1 -1
  76. package/dist/esm/index.d.ts +6 -7
  77. package/dist/esm/index.js +5 -6
  78. package/dist/esm/middleware/body-limit.js +2 -2
  79. package/dist/esm/middleware/body-limit.js.map +1 -1
  80. package/dist/esm/middleware/compress.js +2 -2
  81. package/dist/esm/middleware/compress.js.map +1 -1
  82. package/dist/esm/middleware/cors.js +2 -2
  83. package/dist/esm/middleware/cors.js.map +1 -1
  84. package/dist/esm/middleware/csrf.js +2 -2
  85. package/dist/esm/middleware/csrf.js.map +1 -1
  86. package/dist/esm/middleware/etag.js +2 -2
  87. package/dist/esm/middleware/etag.js.map +1 -1
  88. package/dist/esm/middleware/jwk.js +2 -8
  89. package/dist/esm/middleware/jwk.js.map +1 -1
  90. package/dist/esm/middleware/jwt.js +2 -8
  91. package/dist/esm/middleware/jwt.js.map +1 -1
  92. package/dist/esm/middleware/secure-headers.js +2 -2
  93. package/dist/esm/middleware/secure-headers.js.map +1 -1
  94. package/dist/esm/middleware/timing.js +2 -2
  95. package/dist/esm/middleware/timing.js.map +1 -1
  96. package/dist/esm/middleware/wrap-hono.d.ts +4 -0
  97. package/dist/esm/middleware/wrap-hono.js +10 -1
  98. package/dist/esm/middleware/wrap-hono.js.map +1 -1
  99. package/dist/esm/types/app.d.ts +7 -7
  100. package/dist/esm/types/index.d.ts +32 -13
  101. package/dist/esm/types/returns.d.ts +2 -2
  102. package/dist/esm/types/type-utils.d.ts +1 -2
  103. package/dist/esm/types/units.d.ts +4 -9
  104. package/dist/esm/types/units.js.map +1 -1
  105. package/package.json +3 -3
  106. package/src/builder/app.ts +28 -0
  107. package/src/{factories.ts → builder/factories.ts} +2 -2
  108. package/src/{middleware.ts → builder/middleware.ts} +2 -2
  109. package/src/{route.ts → builder/route.ts} +30 -34
  110. package/src/builder/router.ts +347 -0
  111. package/src/{create-context.ts → context/create-context.ts} +2 -2
  112. package/src/define/validators.ts +1 -1
  113. package/src/index.ts +9 -12
  114. package/src/middleware/body-limit.ts +2 -2
  115. package/src/middleware/compress.ts +2 -2
  116. package/src/middleware/cors.ts +2 -2
  117. package/src/middleware/csrf.ts +2 -2
  118. package/src/middleware/etag.ts +2 -2
  119. package/src/middleware/jwk.ts +2 -7
  120. package/src/middleware/jwt.ts +2 -7
  121. package/src/middleware/secure-headers.ts +2 -2
  122. package/src/middleware/timing.ts +2 -2
  123. package/src/middleware/wrap-hono.ts +13 -0
  124. package/src/types/app.ts +12 -8
  125. package/src/types/index.ts +44 -10
  126. package/src/types/returns.ts +2 -2
  127. package/src/types/type-utils.ts +1 -2
  128. package/src/types/units.ts +4 -8
  129. package/dist/cjs/constants.cjs.map +0 -1
  130. package/dist/cjs/create-context.cjs.map +0 -1
  131. package/dist/cjs/factories.cjs.map +0 -1
  132. package/dist/cjs/middleware.cjs.map +0 -1
  133. package/dist/cjs/route.cjs.map +0 -1
  134. package/dist/cjs/taser-app.cjs +0 -36
  135. package/dist/cjs/taser-app.cjs.map +0 -1
  136. package/dist/cjs/taser-app.d.cts +0 -18
  137. package/dist/cjs/taser-router.cjs.map +0 -1
  138. package/dist/cjs/taser-router.d.cts +0 -42
  139. package/dist/esm/constants.js.map +0 -1
  140. package/dist/esm/create-context.js.map +0 -1
  141. package/dist/esm/factories.js.map +0 -1
  142. package/dist/esm/middleware.js.map +0 -1
  143. package/dist/esm/route.js.map +0 -1
  144. package/dist/esm/taser-app.d.ts +0 -18
  145. package/dist/esm/taser-app.js +0 -35
  146. package/dist/esm/taser-app.js.map +0 -1
  147. package/dist/esm/taser-router.d.ts +0 -42
  148. package/dist/esm/taser-router.js.map +0 -1
  149. package/src/taser-app.ts +0 -38
  150. package/src/taser-router.ts +0 -165
  151. /package/dist/cjs/{constants.d.cts → builder/constants.d.cts} +0 -0
  152. /package/dist/esm/{constants.d.ts → builder/constants.d.ts} +0 -0
  153. /package/src/{constants.ts → builder/constants.ts} +0 -0
@@ -0,0 +1,347 @@
1
+ import {
2
+ createTaserCompatHandler,
3
+ createTaserRuntime,
4
+ type NotFoundHandler,
5
+ type OnErrorHandler,
6
+ type RouteManifestShape,
7
+ } from "@taserjs/router-core";
8
+ import { isPromise, normalizeOnError } from "@taserjs/router-utils";
9
+
10
+ import {
11
+ createAllRoute,
12
+ createAnyRoute,
13
+ createDeleteRoute,
14
+ createGetRoute,
15
+ createHeadRoute,
16
+ createOptionsRoute,
17
+ createPatchRoute,
18
+ createPostRoute,
19
+ createPutRoute,
20
+ } from "./factories.js";
21
+ import { defineHandler } from "../define/handler.js";
22
+ import {
23
+ defineMiddleware,
24
+ type DefineMiddlewareOptions,
25
+ type MultiScopedMiddlewareOptions,
26
+ type ScopedMiddlewareOptions,
27
+ } from "../define/middleware.js";
28
+ import { createMiddleware } from "./middleware.js";
29
+ import { TaserApp } from "./app.js";
30
+ import type { ContextDefinition, CreateTaserAppOptions, OnErrorOptions } from "../types/app.js";
31
+ import type {
32
+ AppContext,
33
+ ExtractState,
34
+ IsUnknown,
35
+ MiddlewareReturnFromParts,
36
+ MiddlewareUnit,
37
+ } from "../types/units.js";
38
+ import type { HandlerBuilder, LayoutId, MiddlewareBuilder } from "../types/index.js";
39
+ import type { ReturnsMap } from "../types/returns.js";
40
+ import type { Schema } from "../types/schema.js";
41
+ import type {
42
+ CreateAllRoute,
43
+ CreateAnyRoute,
44
+ CreateWithBodyRoute,
45
+ CreateWithoutBodyRoute,
46
+ } from "./factories.js";
47
+
48
+ function toOnErrorHandler(
49
+ onErrorOptions: OnErrorOptions | OnErrorOptions["handle"],
50
+ ): OnErrorHandler {
51
+ return normalizeOnError(onErrorOptions);
52
+ }
53
+
54
+ type RouterState = {
55
+ options: CreateTaserAppOptions;
56
+ contextDef: ContextDefinition<Record<string, unknown>, Record<string, unknown>>;
57
+ onError?: OnErrorHandler;
58
+ notFound?: NotFoundHandler;
59
+ };
60
+
61
+ const emptyContext: ContextDefinition<Record<string, unknown>, Record<string, unknown>> = {};
62
+
63
+ export class TaserRouter<TAppContext extends Record<string, unknown> = AppContext> {
64
+ private readonly state: RouterState;
65
+
66
+ constructor(options: CreateTaserAppOptions = {}, state?: Partial<Omit<RouterState, "options">>) {
67
+ this.state = {
68
+ options,
69
+ contextDef: state?.contextDef ?? emptyContext,
70
+ ...(state?.onError !== undefined ? { onError: state.onError } : {}),
71
+ ...(state?.notFound !== undefined ? { notFound: state.notFound } : {}),
72
+ };
73
+ }
74
+
75
+ context<TBoot extends Record<string, unknown>, TReq extends Record<string, unknown>>(
76
+ definition: ContextDefinition<TBoot, TReq>,
77
+ ): TaserRouter<TBoot & TReq> {
78
+ this.state.contextDef = definition;
79
+ return this as unknown as TaserRouter<TBoot & TReq>;
80
+ }
81
+
82
+ onError<TResponses extends ReturnsMap = ReturnsMap>(
83
+ options: OnErrorOptions<TResponses> | OnErrorOptions<TResponses>["handle"],
84
+ ): this {
85
+ this.state.onError = toOnErrorHandler(options);
86
+ return this;
87
+ }
88
+
89
+ notFound(handler: (ctx: unknown) => Response | Promise<Response> | unknown): this {
90
+ this.state.notFound = (ctx) => handler(ctx);
91
+ return this;
92
+ }
93
+
94
+ get: CreateWithoutBodyRoute<"GET", TAppContext> = createGetRoute as CreateWithoutBodyRoute<
95
+ "GET",
96
+ TAppContext
97
+ >;
98
+ post: CreateWithBodyRoute<"POST", TAppContext> = createPostRoute as CreateWithBodyRoute<
99
+ "POST",
100
+ TAppContext
101
+ >;
102
+ put: CreateWithBodyRoute<"PUT", TAppContext> = createPutRoute as CreateWithBodyRoute<
103
+ "PUT",
104
+ TAppContext
105
+ >;
106
+ patch: CreateWithBodyRoute<"PATCH", TAppContext> = createPatchRoute as CreateWithBodyRoute<
107
+ "PATCH",
108
+ TAppContext
109
+ >;
110
+ delete: CreateWithoutBodyRoute<"DELETE", TAppContext> =
111
+ createDeleteRoute as CreateWithoutBodyRoute<"DELETE", TAppContext>;
112
+ options: CreateWithoutBodyRoute<"OPTIONS", TAppContext> =
113
+ createOptionsRoute as CreateWithoutBodyRoute<"OPTIONS", TAppContext>;
114
+ head: CreateWithoutBodyRoute<"HEAD", TAppContext> = createHeadRoute as CreateWithoutBodyRoute<
115
+ "HEAD",
116
+ TAppContext
117
+ >;
118
+ any: CreateAnyRoute<TAppContext> = createAnyRoute as CreateAnyRoute<TAppContext>;
119
+ all: CreateAllRoute<TAppContext> = createAllRoute as CreateAllRoute<TAppContext>;
120
+
121
+ middleware<const Layout extends LayoutId>(
122
+ layout: Layout,
123
+ ): MiddlewareBuilder<Layout, readonly [], TAppContext> {
124
+ return createMiddleware(layout) as MiddlewareBuilder<Layout, readonly [], TAppContext>;
125
+ }
126
+
127
+ defineHandler<TQuery = unknown, TParams = unknown, TBody = unknown>(options?: {
128
+ query?: Schema<TQuery>;
129
+ params?: Schema<TParams>;
130
+ body?: Schema<TBody>;
131
+ }): HandlerBuilder<
132
+ readonly [],
133
+ { query: TQuery; params: TParams; body: TBody },
134
+ {},
135
+ TAppContext
136
+ > {
137
+ return options === undefined
138
+ ? defineHandler<TAppContext>()
139
+ : defineHandler<TAppContext>(options);
140
+ }
141
+
142
+ defineMiddleware(
143
+ middleware: Parameters<typeof createTaserCompatHandler>[0],
144
+ ): MiddlewareUnit<MiddlewareReturnFromParts<unknown, unknown, unknown, {}>, {}, null, {}>;
145
+
146
+ defineMiddleware<
147
+ const Layout extends LayoutId,
148
+ TState = unknown,
149
+ TRequires = {},
150
+ TQuery = unknown,
151
+ TParams = unknown,
152
+ TBody = unknown,
153
+ TReturns extends ReturnsMap = {},
154
+ TQueryIn = unknown,
155
+ TParamsIn = unknown,
156
+ TBodyIn = unknown,
157
+ R = unknown,
158
+ >(
159
+ layout: Layout,
160
+ options: ScopedMiddlewareOptions<
161
+ Layout,
162
+ TState,
163
+ TRequires,
164
+ TQuery,
165
+ TParams,
166
+ TBody,
167
+ TReturns,
168
+ TQueryIn,
169
+ TParamsIn,
170
+ TBodyIn,
171
+ TAppContext,
172
+ R
173
+ >,
174
+ ): MiddlewareUnit<
175
+ MiddlewareReturnFromParts<
176
+ TQuery,
177
+ TParams,
178
+ TBody,
179
+ IsUnknown<TState> extends true ? ExtractState<R> : TState,
180
+ TQueryIn,
181
+ TParamsIn,
182
+ TBodyIn
183
+ >,
184
+ TReturns,
185
+ Layout,
186
+ TRequires
187
+ >;
188
+
189
+ defineMiddleware<
190
+ const Layouts extends readonly [LayoutId, ...LayoutId[]],
191
+ TState = unknown,
192
+ TRequires = {},
193
+ TQuery = unknown,
194
+ TParams = unknown,
195
+ TBody = unknown,
196
+ TReturns extends ReturnsMap = {},
197
+ TQueryIn = unknown,
198
+ TParamsIn = unknown,
199
+ TBodyIn = unknown,
200
+ R = unknown,
201
+ >(
202
+ layouts: Layouts,
203
+ options: MultiScopedMiddlewareOptions<
204
+ Layouts,
205
+ TState,
206
+ TRequires,
207
+ TQuery,
208
+ TParams,
209
+ TBody,
210
+ TReturns,
211
+ TQueryIn,
212
+ TParamsIn,
213
+ TBodyIn,
214
+ TAppContext,
215
+ R
216
+ >,
217
+ ): MiddlewareUnit<
218
+ MiddlewareReturnFromParts<
219
+ TQuery,
220
+ TParams,
221
+ TBody,
222
+ IsUnknown<TState> extends true ? ExtractState<R> : TState,
223
+ TQueryIn,
224
+ TParamsIn,
225
+ TBodyIn
226
+ >,
227
+ TReturns,
228
+ Layouts,
229
+ TRequires
230
+ >;
231
+
232
+ defineMiddleware<
233
+ TState = unknown,
234
+ TRequires = {},
235
+ TQuery = unknown,
236
+ TParams = unknown,
237
+ TBody = unknown,
238
+ TReturns extends ReturnsMap = {},
239
+ TQueryIn = unknown,
240
+ TParamsIn = unknown,
241
+ TBodyIn = unknown,
242
+ R = unknown,
243
+ >(
244
+ options: DefineMiddlewareOptions<
245
+ TState,
246
+ TRequires,
247
+ TQuery,
248
+ TParams,
249
+ TBody,
250
+ TReturns,
251
+ TQueryIn,
252
+ TParamsIn,
253
+ TBodyIn,
254
+ TAppContext,
255
+ R
256
+ >,
257
+ ): MiddlewareUnit<
258
+ MiddlewareReturnFromParts<
259
+ TQuery,
260
+ TParams,
261
+ TBody,
262
+ IsUnknown<TState> extends true ? ExtractState<R> : TState,
263
+ TQueryIn,
264
+ TParamsIn,
265
+ TBodyIn
266
+ >,
267
+ TReturns,
268
+ null,
269
+ TRequires
270
+ >;
271
+
272
+ defineMiddleware(first: any, second?: any): any {
273
+ return defineMiddleware(first, second);
274
+ }
275
+
276
+ create<const TManifest extends RouteManifestShape>(manifest: TManifest): TaserApp<TManifest> {
277
+ const definition = this.state.contextDef;
278
+ const validateResponse = this.state.options.response?.validate ?? true;
279
+ const onValidationFailure = this.state.options.response?.onValidationFailure;
280
+ const basePath = this.state.options.basePath;
281
+
282
+ const hasCustomContext = definition.boot !== undefined || definition.request !== undefined;
283
+ let bootContextResolved: Record<string, unknown> | undefined;
284
+ let bootPromise: Promise<Record<string, unknown>> | undefined;
285
+
286
+ if (definition.boot !== undefined) {
287
+ const bootResult = definition.boot();
288
+ if (isPromise(bootResult)) {
289
+ bootPromise = bootResult.then((ctx) => {
290
+ bootContextResolved = (ctx ?? {}) as Record<string, unknown>;
291
+ return bootContextResolved;
292
+ });
293
+ } else {
294
+ bootContextResolved = (bootResult ?? {}) as Record<string, unknown>;
295
+ }
296
+ } else if (hasCustomContext) {
297
+ bootContextResolved = {};
298
+ }
299
+
300
+ const contextFactory = hasCustomContext
301
+ ? (req?: Request) => {
302
+ if (bootPromise !== undefined && bootContextResolved === undefined) {
303
+ return bootPromise.then(async (bootContext) => {
304
+ if (!definition.request) {
305
+ return { ...bootContext };
306
+ }
307
+ const requestResult = definition.request(req!);
308
+ const requestContext = isPromise(requestResult) ? await requestResult : requestResult;
309
+ return { ...bootContext, ...requestContext };
310
+ });
311
+ }
312
+
313
+ const bootContext = bootContextResolved ?? {};
314
+ if (!definition.request) {
315
+ return { ...bootContext };
316
+ }
317
+
318
+ const requestResult = definition.request(req!);
319
+ if (isPromise(requestResult)) {
320
+ return requestResult.then((requestContext) => ({
321
+ ...bootContext,
322
+ ...requestContext,
323
+ }));
324
+ }
325
+
326
+ return { ...bootContext, ...(requestResult as Record<string, unknown>) };
327
+ }
328
+ : () => ({});
329
+
330
+ const runtime = createTaserRuntime(manifest, contextFactory, {
331
+ ...(basePath !== undefined ? { basePath } : {}),
332
+ response: {
333
+ validate: validateResponse,
334
+ ...(onValidationFailure !== undefined ? { onValidationFailure } : {}),
335
+ },
336
+ ...(this.state.onError !== undefined ? { onError: this.state.onError } : {}),
337
+ ...(this.state.notFound !== undefined ? { notFound: this.state.notFound } : {}),
338
+ ...(this.state.options.cookies !== undefined ? { cookies: this.state.options.cookies } : {}),
339
+ });
340
+
341
+ return new TaserApp(runtime, manifest);
342
+ }
343
+ }
344
+
345
+ export function createTaserApp(options: CreateTaserAppOptions = {}): TaserRouter {
346
+ return new TaserRouter(options);
347
+ }
@@ -1,6 +1,6 @@
1
1
  import type { ReservedContextKey } from "@taserjs/router-core";
2
2
 
3
- import type { ContextDefinition } from "./types/app.js";
3
+ import type { ContextDefinition } from "../types/app.js";
4
4
 
5
5
  type NoReservedKeysConstraint<
6
6
  TBoot extends Record<string, unknown>,
@@ -16,4 +16,4 @@ export function createContext<
16
16
  return definition;
17
17
  }
18
18
 
19
- export type { ContextDefinition, InferAppContext } from "./types/app.js";
19
+ export type { ContextDefinition, InferAppContext } from "../types/app.js";
@@ -1,5 +1,5 @@
1
1
  import type { Schema } from "../types/schema.js";
2
- import { SCHEMA_KEYS, type SchemaKey } from "../constants.js";
2
+ import { SCHEMA_KEYS, type SchemaKey } from "../builder/constants.js";
3
3
 
4
4
  export type SchemaValidators = {
5
5
  query?: Schema<unknown>;
package/src/index.ts CHANGED
@@ -2,16 +2,20 @@ export type { RouterRegister } from "./register.js";
2
2
  export type {
3
3
  InferInput,
4
4
  InferOutput,
5
+ InferRouteContext,
6
+ InferRouteInput,
7
+ InferRouteOutput,
5
8
  Method,
6
9
  PathParams,
7
10
  ReturnsMap,
11
+ RouteDefinition,
12
+ RouteExport,
8
13
  RoutePath,
9
14
  Schema,
10
15
  Simplify,
11
16
  } from "./types/index.js";
12
17
  export type {
13
18
  ContextDefinition,
14
- CreateContextArgs,
15
19
  CreateTaserAppOptions,
16
20
  InferAppContext,
17
21
  InferAppManifest,
@@ -20,13 +24,7 @@ export type {
20
24
  TaserHandler,
21
25
  } from "./types/app.js";
22
26
 
23
- export {
24
- isReplyResult,
25
- reply,
26
- stream,
27
- ValidationError,
28
- validationErrorSchema,
29
- } from "@taserjs/router-utils";
27
+ export { reply, stream, ValidationError, validationErrorSchema } from "@taserjs/router-utils";
30
28
  export type {
31
29
  ReplyBodyKind,
32
30
  ReplyOf,
@@ -35,10 +33,9 @@ export type {
35
33
  SuccessStatusCode,
36
34
  } from "@taserjs/router-utils";
37
35
 
38
- export { createAnyRoute, createAllRoute } from "./factories.js";
39
- export { createTaserApp, TaserRouter } from "./taser-router.js";
40
- export { TaserApp, TaserNativeBound } from "./taser-app.js";
41
- export { createContext } from "./create-context.js";
36
+ export { createTaserApp, TaserRouter } from "./builder/router.js";
37
+ export { TaserApp } from "./builder/app.js";
38
+ export { createContext } from "./context/create-context.js";
42
39
  export { defineHandler } from "./define/handler.js";
43
40
  export { defineMiddleware } from "./define/middleware.js";
44
41
 
@@ -2,10 +2,10 @@ import { bodyLimit as honoBodyLimit } from "hono/body-limit";
2
2
 
3
3
  import { wrapHonoMiddleware } from "./wrap-hono.js";
4
4
 
5
- const honoBodyLimitMiddleware = wrapHonoMiddleware(honoBodyLimit);
5
+ const wrapped = wrapHonoMiddleware(honoBodyLimit);
6
6
 
7
7
  export function bodyLimit(...args: Parameters<typeof honoBodyLimit>) {
8
- return honoBodyLimitMiddleware(...args);
8
+ return wrapped(...args);
9
9
  }
10
10
 
11
11
  export type BodyLimitOptions = Parameters<typeof honoBodyLimit>[0];
@@ -2,10 +2,10 @@ import { compress as honoCompress } from "hono/compress";
2
2
 
3
3
  import { wrapHonoMiddleware } from "./wrap-hono.js";
4
4
 
5
- const honoCompressMiddleware = wrapHonoMiddleware(honoCompress);
5
+ const wrapped = wrapHonoMiddleware(honoCompress);
6
6
 
7
7
  export function compress(...args: Parameters<typeof honoCompress>) {
8
- return honoCompressMiddleware(...args);
8
+ return wrapped(...args);
9
9
  }
10
10
 
11
11
  export type CompressOptions = NonNullable<Parameters<typeof honoCompress>[0]>;
@@ -2,10 +2,10 @@ import { cors as honoCors } from "hono/cors";
2
2
 
3
3
  import { wrapHonoMiddleware } from "./wrap-hono.js";
4
4
 
5
- const honoCorsMiddleware = wrapHonoMiddleware(honoCors);
5
+ const wrapped = wrapHonoMiddleware(honoCors);
6
6
 
7
7
  export function cors(...args: Parameters<typeof honoCors>) {
8
- return honoCorsMiddleware(...args);
8
+ return wrapped(...args);
9
9
  }
10
10
 
11
11
  export type CorsOptions = NonNullable<Parameters<typeof honoCors>[0]>;
@@ -2,10 +2,10 @@ import { csrf as honoCsrf } from "hono/csrf";
2
2
 
3
3
  import { wrapHonoMiddleware } from "./wrap-hono.js";
4
4
 
5
- const honoCsrfMiddleware = wrapHonoMiddleware(honoCsrf);
5
+ const wrapped = wrapHonoMiddleware(honoCsrf);
6
6
 
7
7
  export function csrf(...args: Parameters<typeof honoCsrf>) {
8
- return honoCsrfMiddleware(...args);
8
+ return wrapped(...args);
9
9
  }
10
10
 
11
11
  export type CsrfOptions = NonNullable<Parameters<typeof honoCsrf>[0]>;
@@ -2,10 +2,10 @@ import { etag as honoEtag } from "hono/etag";
2
2
 
3
3
  import { wrapHonoMiddleware } from "./wrap-hono.js";
4
4
 
5
- const honoEtagMiddleware = wrapHonoMiddleware(honoEtag);
5
+ const wrapped = wrapHonoMiddleware(honoEtag);
6
6
 
7
7
  export function etag(...args: Parameters<typeof honoEtag>) {
8
- return honoEtagMiddleware(...args);
8
+ return wrapped(...args);
9
9
  }
10
10
 
11
11
  export type EtagOptions = NonNullable<Parameters<typeof honoEtag>[0]>;
@@ -1,9 +1,9 @@
1
- import { createTaserCompatHandler } from "@taserjs/router-core";
2
1
  import type { MiddlewareHandler } from "hono";
3
2
  import { jwk as honoJwk } from "hono/jwk";
4
3
 
5
4
  import { defineMiddleware } from "../define/middleware.js";
6
5
  import type { JwtMiddlewareUnit, JwtPayloadState } from "./jwt.js";
6
+ import { extractJwtPayload } from "./wrap-hono.js";
7
7
 
8
8
  export type JwkOptions = Parameters<typeof honoJwk>[0];
9
9
 
@@ -44,11 +44,6 @@ export function jwk<TPayload = Record<string, unknown>>(
44
44
  const honoMw: MiddlewareHandler = honoJwk(honoOptions, safeInit);
45
45
 
46
46
  return defineMiddleware<JwtPayloadState<TPayload>>({
47
- handler: (ctx, next) => {
48
- return createTaserCompatHandler(honoMw)(ctx, async () => {
49
- const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
50
- return next({ jwtPayload: payload as TPayload });
51
- });
52
- },
47
+ handler: extractJwtPayload<TPayload>(honoMw),
53
48
  });
54
49
  }
@@ -1,9 +1,9 @@
1
- import { createTaserCompatHandler } from "@taserjs/router-core";
2
1
  import type { MiddlewareHandler } from "hono";
3
2
  import { jwt as honoJwt } from "hono/jwt";
4
3
 
5
4
  import { defineMiddleware } from "../define/middleware.js";
6
5
  import type { MiddlewareReturnFromParts, MiddlewareUnit } from "../types/units.js";
6
+ import { extractJwtPayload } from "./wrap-hono.js";
7
7
 
8
8
  export type JwtPayloadState<TPayload> = {
9
9
  jwtPayload: TPayload;
@@ -24,11 +24,6 @@ export function jwt<TPayload = Record<string, unknown>>(
24
24
  ): JwtMiddlewareUnit<TPayload> {
25
25
  const honoMw: MiddlewareHandler = honoJwt(options);
26
26
  return defineMiddleware<JwtPayloadState<TPayload>>({
27
- handler: (ctx, next) => {
28
- return createTaserCompatHandler(honoMw)(ctx, async () => {
29
- const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
30
- return next({ jwtPayload: payload as TPayload });
31
- });
32
- },
27
+ handler: extractJwtPayload<TPayload>(honoMw),
33
28
  });
34
29
  }
@@ -2,10 +2,10 @@ import { secureHeaders as honoSecureHeaders } from "hono/secure-headers";
2
2
 
3
3
  import { wrapHonoMiddleware } from "./wrap-hono.js";
4
4
 
5
- const honoSecureHeadersMiddleware = wrapHonoMiddleware(honoSecureHeaders);
5
+ const wrapped = wrapHonoMiddleware(honoSecureHeaders);
6
6
 
7
7
  export function secureHeaders(...args: Parameters<typeof honoSecureHeaders>) {
8
- return honoSecureHeadersMiddleware(...args);
8
+ return wrapped(...args);
9
9
  }
10
10
 
11
11
  export type SecureHeadersOptions = NonNullable<Parameters<typeof honoSecureHeaders>[0]>;
@@ -2,10 +2,10 @@ import { timing as honoTiming } from "hono/timing";
2
2
 
3
3
  import { wrapHonoMiddleware } from "./wrap-hono.js";
4
4
 
5
- const honoTimingMiddleware = wrapHonoMiddleware(honoTiming);
5
+ const wrapped = wrapHonoMiddleware(honoTiming);
6
6
 
7
7
  export function timing(...args: Parameters<typeof honoTiming>) {
8
- return honoTimingMiddleware(...args);
8
+ return wrapped(...args);
9
9
  }
10
10
 
11
11
  export type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]>;
@@ -1,3 +1,4 @@
1
+ import { createTaserCompatHandler } from "@taserjs/router-core";
1
2
  import type { MiddlewareHandler } from "hono";
2
3
 
3
4
  import { defineMiddleware } from "../define/middleware.js";
@@ -10,3 +11,15 @@ export function wrapHonoMiddleware<F extends (...args: never[]) => MiddlewareHan
10
11
  ) => MiddlewareUnit<MiddlewareReturnFromParts<unknown, unknown, unknown, {}>> {
11
12
  return (...args) => defineMiddleware(honoFactory(...args));
12
13
  }
14
+
15
+ /** Extracts the jwtPayload from Hono's variable bag and forwards it into Taser's state via next(). */
16
+ export function extractJwtPayload<TPayload>(
17
+ honoMw: MiddlewareHandler,
18
+ ): (ctx: unknown, next: (state: { jwtPayload: TPayload }) => unknown) => unknown {
19
+ const taserHandler = createTaserCompatHandler(honoMw);
20
+ return (ctx, next) =>
21
+ taserHandler(ctx, async () => {
22
+ const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
23
+ return next({ jwtPayload: payload as TPayload });
24
+ });
25
+ }
package/src/types/app.ts CHANGED
@@ -1,6 +1,7 @@
1
+ import type { RouteManifestShape } from "@taserjs/router-core";
1
2
  import type { ResponseValidationFailureHandler } from "@taserjs/router-utils";
2
3
 
3
- import type { TaserApp } from "../taser-app.js";
4
+ import type { TaserApp } from "../builder/app.js";
4
5
  import type { ReturnsMap } from "./returns.js";
5
6
  import type { Schema } from "./schema.js";
6
7
 
@@ -24,16 +25,12 @@ export type CreateTaserAppOptions = {
24
25
  };
25
26
  };
26
27
 
27
- export type CreateContextArgs = {
28
- native?: import("./units.js").NativeContext;
29
- };
30
-
31
28
  export type ContextDefinition<
32
29
  TBoot extends Record<string, unknown> = Record<string, never>,
33
30
  TReq extends Record<string, unknown> = Record<string, never>,
34
31
  > = {
35
32
  boot?: () => TBoot | Promise<TBoot>;
36
- request?: (args: CreateContextArgs) => TReq | Promise<TReq>;
33
+ request?: (req: Request) => TReq | Promise<TReq>;
37
34
  };
38
35
 
39
36
  export type InferAppContext<
@@ -45,7 +42,14 @@ export type OnErrorOptions<TResponses extends ReturnsMap = ReturnsMap> = {
45
42
  handle: (error: unknown, ctx?: unknown) => Response | Promise<Response>;
46
43
  };
47
44
 
48
- export type InferAppManifest<TApp> = TApp extends TaserApp<infer TManifest> ? TManifest : never;
45
+ export type InferAppManifest<TApp> =
46
+ TApp extends TaserApp<infer TManifest>
47
+ ? TManifest
48
+ : TApp extends { manifest: infer TManifest }
49
+ ? TManifest
50
+ : TApp extends RouteManifestShape
51
+ ? TApp
52
+ : never;
49
53
 
50
54
  export type TaserHandler<TFrameworkApp> = {
51
55
  /**
@@ -60,4 +64,4 @@ export type { RouteManifestShape } from "@taserjs/router-core";
60
64
 
61
65
  export type { Schema };
62
66
 
63
- export type { TaserApp, TaserNativeBound } from "../taser-app.js";
67
+ export type { TaserApp } from "../builder/app.js";