@taserjs/router 0.1.12 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/README.md +5 -5
  2. package/dist/builder-BNkN_JKi.cjs +284 -0
  3. package/dist/builder-DObEWeC0.js +227 -0
  4. package/dist/builder-DObEWeC0.js.map +1 -0
  5. package/dist/hono-Ddk3waH-.cjs +42 -0
  6. package/dist/hono-kDZSomjd.js +39 -0
  7. package/dist/hono-kDZSomjd.js.map +1 -0
  8. package/dist/index.cjs +60 -0
  9. package/dist/index.d.cts +105 -0
  10. package/dist/index.d.cts.map +1 -0
  11. package/dist/index.d.ts +105 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +14 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/middleware/body-limit.cjs +15 -0
  16. package/dist/middleware/body-limit.d.cts +11 -0
  17. package/dist/middleware/body-limit.d.cts.map +1 -0
  18. package/dist/middleware/body-limit.d.ts +11 -0
  19. package/dist/middleware/body-limit.d.ts.map +1 -0
  20. package/dist/middleware/body-limit.js +16 -0
  21. package/dist/middleware/body-limit.js.map +1 -0
  22. package/dist/middleware/compress.cjs +10 -0
  23. package/dist/middleware/compress.d.cts +8 -0
  24. package/dist/middleware/compress.d.cts.map +1 -0
  25. package/dist/middleware/compress.d.ts +8 -0
  26. package/dist/middleware/compress.d.ts.map +1 -0
  27. package/dist/middleware/compress.js +10 -0
  28. package/dist/middleware/compress.js.map +1 -0
  29. package/dist/middleware/cookie.cjs +87 -0
  30. package/dist/middleware/cookie.d.cts +26 -0
  31. package/dist/middleware/cookie.d.cts.map +1 -0
  32. package/dist/middleware/cookie.d.ts +26 -0
  33. package/dist/middleware/cookie.d.ts.map +1 -0
  34. package/dist/middleware/cookie.js +87 -0
  35. package/dist/middleware/cookie.js.map +1 -0
  36. package/dist/middleware/cors.cjs +9 -0
  37. package/dist/middleware/cors.d.cts +7 -0
  38. package/dist/middleware/cors.d.cts.map +1 -0
  39. package/dist/middleware/cors.d.ts +7 -0
  40. package/dist/middleware/cors.d.ts.map +1 -0
  41. package/dist/middleware/cors.js +10 -0
  42. package/dist/middleware/cors.js.map +1 -0
  43. package/dist/middleware/csrf.cjs +9 -0
  44. package/dist/middleware/csrf.d.cts +7 -0
  45. package/dist/middleware/csrf.d.cts.map +1 -0
  46. package/dist/middleware/csrf.d.ts +7 -0
  47. package/dist/middleware/csrf.d.ts.map +1 -0
  48. package/dist/middleware/csrf.js +10 -0
  49. package/dist/middleware/csrf.js.map +1 -0
  50. package/dist/middleware/etag.cjs +10 -0
  51. package/dist/middleware/etag.d.cts +8 -0
  52. package/dist/middleware/etag.d.cts.map +1 -0
  53. package/dist/middleware/etag.d.ts +8 -0
  54. package/dist/middleware/etag.d.ts.map +1 -0
  55. package/dist/middleware/etag.js +10 -0
  56. package/dist/middleware/etag.js.map +1 -0
  57. package/dist/middleware/index.cjs +39 -0
  58. package/dist/middleware/index.d.cts +11 -0
  59. package/dist/middleware/index.d.ts +11 -0
  60. package/dist/middleware/index.js +11 -0
  61. package/dist/middleware/jwk.cjs +12 -0
  62. package/dist/middleware/jwk.d.cts +9 -0
  63. package/dist/middleware/jwk.d.cts.map +1 -0
  64. package/dist/middleware/jwk.d.ts +9 -0
  65. package/dist/middleware/jwk.d.ts.map +1 -0
  66. package/dist/middleware/jwk.js +13 -0
  67. package/dist/middleware/jwk.js.map +1 -0
  68. package/dist/middleware/jwt.cjs +21 -0
  69. package/dist/middleware/jwt.d.cts +13 -0
  70. package/dist/middleware/jwt.d.cts.map +1 -0
  71. package/dist/middleware/jwt.d.ts +13 -0
  72. package/dist/middleware/jwt.d.ts.map +1 -0
  73. package/dist/middleware/jwt.js +17 -0
  74. package/dist/middleware/jwt.js.map +1 -0
  75. package/dist/middleware/secure-headers.cjs +10 -0
  76. package/dist/middleware/secure-headers.d.cts +8 -0
  77. package/dist/middleware/secure-headers.d.cts.map +1 -0
  78. package/dist/middleware/secure-headers.d.ts +8 -0
  79. package/dist/middleware/secure-headers.d.ts.map +1 -0
  80. package/dist/middleware/secure-headers.js +10 -0
  81. package/dist/middleware/secure-headers.js.map +1 -0
  82. package/dist/middleware/timing.cjs +13 -0
  83. package/dist/middleware/timing.d.cts +8 -0
  84. package/dist/middleware/timing.d.cts.map +1 -0
  85. package/dist/middleware/timing.d.ts +8 -0
  86. package/dist/middleware/timing.d.ts.map +1 -0
  87. package/dist/middleware/timing.js +10 -0
  88. package/dist/middleware/timing.js.map +1 -0
  89. package/dist/reply.cjs +128 -0
  90. package/dist/reply.d.cts +2 -0
  91. package/dist/reply.d.ts +2 -0
  92. package/dist/reply.js +2 -0
  93. package/dist/stream.cjs +32 -0
  94. package/dist/stream.d.cts +2 -0
  95. package/dist/stream.d.ts +2 -0
  96. package/dist/stream.js +2 -0
  97. package/dist/types-BjPmu9B-.d.cts +294 -0
  98. package/dist/types-BjPmu9B-.d.cts.map +1 -0
  99. package/dist/types-COZ0UN-A.d.ts +294 -0
  100. package/dist/types-COZ0UN-A.d.ts.map +1 -0
  101. package/package.json +49 -107
  102. package/src/builder.ts +755 -0
  103. package/src/context.ts +11 -0
  104. package/src/hono.ts +75 -0
  105. package/src/index.ts +67 -49
  106. package/src/middleware/body-limit.ts +17 -5
  107. package/src/middleware/compress.ts +7 -6
  108. package/src/middleware/cookie.ts +128 -0
  109. package/src/middleware/cors.ts +5 -6
  110. package/src/middleware/csrf.ts +5 -6
  111. package/src/middleware/etag.ts +7 -6
  112. package/src/middleware/index.ts +35 -0
  113. package/src/middleware/jwk.ts +12 -46
  114. package/src/middleware/jwt.ts +21 -26
  115. package/src/middleware/secure-headers.ts +7 -6
  116. package/src/middleware/timing.ts +9 -6
  117. package/src/reply.ts +26 -1
  118. package/src/stream.ts +10 -1
  119. package/src/taser.ts +55 -0
  120. package/src/types.ts +810 -0
  121. package/dist/cjs/builder/app.cjs +0 -27
  122. package/dist/cjs/builder/app.cjs.map +0 -1
  123. package/dist/cjs/builder/app.d.cts +0 -11
  124. package/dist/cjs/builder/constants.cjs +0 -11
  125. package/dist/cjs/builder/constants.cjs.map +0 -1
  126. package/dist/cjs/builder/constants.d.cts +0 -3
  127. package/dist/cjs/builder/middleware-unit.cjs +0 -64
  128. package/dist/cjs/builder/middleware-unit.cjs.map +0 -1
  129. package/dist/cjs/builder/middleware-unit.d.cts +0 -34
  130. package/dist/cjs/builder/middleware.cjs +0 -20
  131. package/dist/cjs/builder/middleware.cjs.map +0 -1
  132. package/dist/cjs/builder/middleware.d.cts +0 -2
  133. package/dist/cjs/builder/normalize.cjs +0 -10
  134. package/dist/cjs/builder/normalize.cjs.map +0 -1
  135. package/dist/cjs/builder/normalize.d.cts +0 -2
  136. package/dist/cjs/builder/route.cjs +0 -83
  137. package/dist/cjs/builder/route.cjs.map +0 -1
  138. package/dist/cjs/builder/route.d.cts +0 -4
  139. package/dist/cjs/builder/router.cjs +0 -88
  140. package/dist/cjs/builder/router.cjs.map +0 -1
  141. package/dist/cjs/builder/router.d.cts +0 -26
  142. package/dist/cjs/builder/standalone.cjs +0 -30
  143. package/dist/cjs/builder/standalone.cjs.map +0 -1
  144. package/dist/cjs/builder/standalone.d.cts +0 -23
  145. package/dist/cjs/context/create-context.cjs +0 -8
  146. package/dist/cjs/context/create-context.cjs.map +0 -1
  147. package/dist/cjs/context/create-context.d.cts +0 -5
  148. package/dist/cjs/define/middleware.cjs +0 -22
  149. package/dist/cjs/define/middleware.cjs.map +0 -1
  150. package/dist/cjs/define/middleware.d.cts +0 -45
  151. package/dist/cjs/define/validators.cjs +0 -14
  152. package/dist/cjs/define/validators.cjs.map +0 -1
  153. package/dist/cjs/define/validators.d.cts +0 -8
  154. package/dist/cjs/index.cjs +0 -26
  155. package/dist/cjs/index.d.cts +0 -17
  156. package/dist/cjs/middleware/body-limit.cjs +0 -12
  157. package/dist/cjs/middleware/body-limit.cjs.map +0 -1
  158. package/dist/cjs/middleware/body-limit.d.cts +0 -3
  159. package/dist/cjs/middleware/compress.cjs +0 -12
  160. package/dist/cjs/middleware/compress.cjs.map +0 -1
  161. package/dist/cjs/middleware/compress.d.cts +0 -3
  162. package/dist/cjs/middleware/cors.cjs +0 -12
  163. package/dist/cjs/middleware/cors.cjs.map +0 -1
  164. package/dist/cjs/middleware/cors.d.cts +0 -3
  165. package/dist/cjs/middleware/csrf.cjs +0 -12
  166. package/dist/cjs/middleware/csrf.cjs.map +0 -1
  167. package/dist/cjs/middleware/csrf.d.cts +0 -3
  168. package/dist/cjs/middleware/etag.cjs +0 -12
  169. package/dist/cjs/middleware/etag.cjs.map +0 -1
  170. package/dist/cjs/middleware/etag.d.cts +0 -3
  171. package/dist/cjs/middleware/hono-mw.cjs +0 -23
  172. package/dist/cjs/middleware/hono-mw.cjs.map +0 -1
  173. package/dist/cjs/middleware/hono-mw.d.cts +0 -17
  174. package/dist/cjs/middleware/jwk.cjs +0 -30
  175. package/dist/cjs/middleware/jwk.cjs.map +0 -1
  176. package/dist/cjs/middleware/jwk.d.cts +0 -14
  177. package/dist/cjs/middleware/jwt.cjs +0 -20
  178. package/dist/cjs/middleware/jwt.cjs.map +0 -1
  179. package/dist/cjs/middleware/jwt.d.cts +0 -12
  180. package/dist/cjs/middleware/secure-headers.cjs +0 -12
  181. package/dist/cjs/middleware/secure-headers.cjs.map +0 -1
  182. package/dist/cjs/middleware/secure-headers.d.cts +0 -3
  183. package/dist/cjs/middleware/timing.cjs +0 -12
  184. package/dist/cjs/middleware/timing.cjs.map +0 -1
  185. package/dist/cjs/middleware/timing.d.cts +0 -3
  186. package/dist/cjs/reply.cjs +0 -9
  187. package/dist/cjs/reply.d.cts +0 -1
  188. package/dist/cjs/stream.cjs +0 -9
  189. package/dist/cjs/stream.d.cts +0 -1
  190. package/dist/cjs/types/app.d.cts +0 -29
  191. package/dist/cjs/types/index.d.cts +0 -297
  192. package/dist/cjs/types/returns.d.cts +0 -34
  193. package/dist/cjs/types/schema.d.cts +0 -14
  194. package/dist/cjs/types/type-utils.d.cts +0 -50
  195. package/dist/cjs/types/units.d.cts +0 -71
  196. package/dist/esm/builder/app.d.ts +0 -11
  197. package/dist/esm/builder/app.js +0 -26
  198. package/dist/esm/builder/app.js.map +0 -1
  199. package/dist/esm/builder/constants.d.ts +0 -3
  200. package/dist/esm/builder/constants.js +0 -11
  201. package/dist/esm/builder/constants.js.map +0 -1
  202. package/dist/esm/builder/middleware-unit.d.ts +0 -34
  203. package/dist/esm/builder/middleware-unit.js +0 -64
  204. package/dist/esm/builder/middleware-unit.js.map +0 -1
  205. package/dist/esm/builder/middleware.d.ts +0 -2
  206. package/dist/esm/builder/middleware.js +0 -20
  207. package/dist/esm/builder/middleware.js.map +0 -1
  208. package/dist/esm/builder/normalize.d.ts +0 -2
  209. package/dist/esm/builder/normalize.js +0 -10
  210. package/dist/esm/builder/normalize.js.map +0 -1
  211. package/dist/esm/builder/route.d.ts +0 -4
  212. package/dist/esm/builder/route.js +0 -83
  213. package/dist/esm/builder/route.js.map +0 -1
  214. package/dist/esm/builder/router.d.ts +0 -26
  215. package/dist/esm/builder/router.js +0 -87
  216. package/dist/esm/builder/router.js.map +0 -1
  217. package/dist/esm/builder/standalone.d.ts +0 -23
  218. package/dist/esm/builder/standalone.js +0 -29
  219. package/dist/esm/builder/standalone.js.map +0 -1
  220. package/dist/esm/context/create-context.d.ts +0 -5
  221. package/dist/esm/context/create-context.js +0 -8
  222. package/dist/esm/context/create-context.js.map +0 -1
  223. package/dist/esm/define/middleware.d.ts +0 -45
  224. package/dist/esm/define/middleware.js +0 -22
  225. package/dist/esm/define/middleware.js.map +0 -1
  226. package/dist/esm/define/validators.d.ts +0 -8
  227. package/dist/esm/define/validators.js +0 -14
  228. package/dist/esm/define/validators.js.map +0 -1
  229. package/dist/esm/index.d.ts +0 -17
  230. package/dist/esm/index.js +0 -7
  231. package/dist/esm/middleware/body-limit.d.ts +0 -3
  232. package/dist/esm/middleware/body-limit.js +0 -11
  233. package/dist/esm/middleware/body-limit.js.map +0 -1
  234. package/dist/esm/middleware/compress.d.ts +0 -3
  235. package/dist/esm/middleware/compress.js +0 -11
  236. package/dist/esm/middleware/compress.js.map +0 -1
  237. package/dist/esm/middleware/cors.d.ts +0 -3
  238. package/dist/esm/middleware/cors.js +0 -11
  239. package/dist/esm/middleware/cors.js.map +0 -1
  240. package/dist/esm/middleware/csrf.d.ts +0 -3
  241. package/dist/esm/middleware/csrf.js +0 -11
  242. package/dist/esm/middleware/csrf.js.map +0 -1
  243. package/dist/esm/middleware/etag.d.ts +0 -3
  244. package/dist/esm/middleware/etag.js +0 -11
  245. package/dist/esm/middleware/etag.js.map +0 -1
  246. package/dist/esm/middleware/hono-mw.d.ts +0 -17
  247. package/dist/esm/middleware/hono-mw.js +0 -23
  248. package/dist/esm/middleware/hono-mw.js.map +0 -1
  249. package/dist/esm/middleware/jwk.d.ts +0 -14
  250. package/dist/esm/middleware/jwk.js +0 -29
  251. package/dist/esm/middleware/jwk.js.map +0 -1
  252. package/dist/esm/middleware/jwt.d.ts +0 -12
  253. package/dist/esm/middleware/jwt.js +0 -19
  254. package/dist/esm/middleware/jwt.js.map +0 -1
  255. package/dist/esm/middleware/secure-headers.d.ts +0 -3
  256. package/dist/esm/middleware/secure-headers.js +0 -11
  257. package/dist/esm/middleware/secure-headers.js.map +0 -1
  258. package/dist/esm/middleware/timing.d.ts +0 -3
  259. package/dist/esm/middleware/timing.js +0 -11
  260. package/dist/esm/middleware/timing.js.map +0 -1
  261. package/dist/esm/reply.d.ts +0 -1
  262. package/dist/esm/reply.js +0 -1
  263. package/dist/esm/stream.d.ts +0 -1
  264. package/dist/esm/stream.js +0 -1
  265. package/dist/esm/types/app.d.ts +0 -29
  266. package/dist/esm/types/index.d.ts +0 -297
  267. package/dist/esm/types/returns.d.ts +0 -34
  268. package/dist/esm/types/schema.d.ts +0 -14
  269. package/dist/esm/types/type-utils.d.ts +0 -50
  270. package/dist/esm/types/units.d.ts +0 -71
  271. package/src/builder/app.ts +0 -39
  272. package/src/builder/constants.ts +0 -4
  273. package/src/builder/middleware-unit.ts +0 -71
  274. package/src/builder/middleware.ts +0 -23
  275. package/src/builder/normalize.ts +0 -13
  276. package/src/builder/route.ts +0 -137
  277. package/src/builder/router.ts +0 -144
  278. package/src/builder/standalone.ts +0 -79
  279. package/src/context/create-context.ts +0 -19
  280. package/src/define/middleware.ts +0 -214
  281. package/src/define/validators.ts +0 -22
  282. package/src/middleware/hono-mw.ts +0 -27
  283. package/src/types/app.ts +0 -48
  284. package/src/types/index.ts +0 -801
  285. package/src/types/returns.ts +0 -61
  286. package/src/types/schema.ts +0 -21
  287. package/src/types/type-utils.ts +0 -90
  288. package/src/types/units.ts +0 -314
package/src/context.ts ADDED
@@ -0,0 +1,11 @@
1
+ import type { ContextDefinition, ContextOptions } from "./types.js";
2
+
3
+ export function createContext<
4
+ TBoot extends Record<string, unknown> = {},
5
+ TRequest extends Record<string, unknown> = {},
6
+ >(options: ContextOptions<TBoot, TRequest>): ContextDefinition<TBoot, TRequest> {
7
+ return {
8
+ kind: "context",
9
+ ...options,
10
+ };
11
+ }
package/src/hono.ts ADDED
@@ -0,0 +1,75 @@
1
+ import { Context } from "hono";
2
+ import type { MiddlewareHandler as HonoMiddlewareHandler, Next as HonoNext } from "hono";
3
+ import { mergeResponseCookies } from "@taserjs/utils";
4
+ import type {
5
+ DistributeServices,
6
+ DistributeState,
7
+ MiddlewareDefinition,
8
+ MiddlewareResponse,
9
+ NextFunction,
10
+ } from "./types.js";
11
+
12
+ export function hono<
13
+ R extends
14
+ | Response
15
+ | Promise<Response>
16
+ | MiddlewareResponse<any, any>
17
+ | Promise<MiddlewareResponse<any, any>> = Promise<Response>,
18
+ >(
19
+ honoMw: HonoMiddlewareHandler,
20
+ refine?: (c: Context, next: NextFunction) => R,
21
+ ): MiddlewareDefinition<
22
+ DistributeServices<Awaited<R>>,
23
+ DistributeState<Awaited<R>>,
24
+ unknown,
25
+ unknown,
26
+ unknown
27
+ > {
28
+ return {
29
+ kind: "middleware",
30
+ handler: async (args, next) => {
31
+ let c = (args.ctx as Record<string, unknown>).context as Context | undefined;
32
+ if (!c) {
33
+ c = new Context(args.req.raw);
34
+ (args.ctx as Record<string, unknown>).context = c;
35
+ }
36
+
37
+ let nextCalled = false;
38
+ let downstreamResponse: Response | undefined;
39
+
40
+ const honoNext: HonoNext = async () => {
41
+ nextCalled = true;
42
+ void c.res;
43
+ downstreamResponse = refine ? await refine(c, next) : await next();
44
+ mergeResponseCookies(c, downstreamResponse);
45
+ };
46
+
47
+ let result: Response | void;
48
+ try {
49
+ result = await honoMw(c, honoNext);
50
+ } catch (err: any) {
51
+ if (typeof err?.getResponse === "function") {
52
+ return err.getResponse();
53
+ }
54
+ if (err?.res instanceof Response) {
55
+ return err.res;
56
+ }
57
+ throw err;
58
+ }
59
+
60
+ if (result instanceof Response) {
61
+ return result;
62
+ }
63
+
64
+ if (nextCalled) {
65
+ return c.res ?? downstreamResponse!;
66
+ }
67
+
68
+ if (c.res instanceof Response) {
69
+ return c.res;
70
+ }
71
+
72
+ throw new Error("Hono middleware did not call next() or return a Response");
73
+ },
74
+ };
75
+ }
package/src/index.ts CHANGED
@@ -1,54 +1,72 @@
1
- export interface RouterRegister {}
2
- export interface RouterMiddlewaresRegister {}
3
- export interface RouterRoutesRegister {}
4
- export type {
5
- AppContext,
6
- EmptyAppContext,
7
- HttpMethod,
8
- InferInput,
9
- InferOutput,
10
- InferRouteContext,
11
- InferRouteInput,
12
- InferRouteInputFromPath,
13
- InferRouteOutput,
1
+ export {
2
+ t,
3
+ layout,
4
+ RouteBuilder,
5
+ RouteValidationBuilder,
14
6
  LayoutBuilder,
15
- LayoutId,
16
- LayoutMiddlewaresMap,
17
- LayoutParams,
18
- LayoutTree,
19
- Method,
20
7
  MiddlewareBuilder,
8
+ middleware,
9
+ toMiddlewareDefinition,
10
+ } from "./builder.js";
11
+ export { hono } from "./hono.js";
12
+ export { createContext } from "./context.js";
13
+ export { defineTaser, TaserBuilder } from "./taser.js";
14
+ export {
15
+ ValidationError,
16
+ ResponseValidationError,
17
+ unsupportedMediaType,
18
+ UnsupportedMediaTypeError,
19
+ isStandardSchema,
20
+ validateStandardSchema,
21
+ } from "@taserjs/utils";
22
+ export type {
23
+ BodyMode,
24
+ ValidationFacet,
25
+ StatusCode,
26
+ RouteSchemas,
27
+ RouteBodySchema,
28
+ StandardSchemaV1,
29
+ ContextDefinition,
30
+ ContextOptions,
31
+ HttpMethod,
32
+ StandardHttpMethod,
33
+ HttpNoBodyMethod,
34
+ MiddlewarePreconditions,
35
+ LayoutDefinition,
36
+ MiddlewareArgs,
21
37
  MiddlewareDefinition,
22
- MiddlewareUnit,
23
- MiddlewareUnitBuilder,
24
- PathParams,
25
- ReturnsMap,
26
- RouteByPathMethod,
38
+ MiddlewareHandler,
39
+ MiddlewareInput,
40
+ NextFunction,
41
+ RouteDefaultParams,
27
42
  RouteDefinition,
28
- RouteExport,
29
- RoutePath,
30
- Schema,
43
+ RouteHandler,
44
+ RouteHandlerArgs,
45
+ TaserRequest,
46
+ RequestHeader,
47
+ HeaderKey,
48
+ TaserHeaders,
49
+ RouterRegister,
50
+ RegisteredRoutePath,
51
+ RegisteredLayoutId,
52
+ InferredAppContext,
31
53
  Simplify,
32
- StatusCode,
33
- } from "./types/index.js";
34
- export type {
35
- ContextDefinition,
36
- CreateTaserAppOptions,
37
- InferAppContext,
38
- InferAppManifest,
39
- OnErrorOptions,
40
- RouteManifestShape,
41
- } from "./types/app.js";
42
-
43
- export { ValidationError, validationErrorSchema } from "@taserjs/router-utils";
44
- export type { ResponseValidationFailureHandler, SuccessStatusCode } from "@taserjs/router-utils";
45
-
46
- export { middleware, t, type TaserNamespace } from "./builder/standalone.js";
47
-
48
- export { createTaserApp, TaserRouter } from "./builder/router.js";
49
- export { TaserApp } from "./builder/app.js";
50
- export { createContext } from "./context/create-context.js";
51
- export { honoMw } from "./middleware/hono-mw.js";
52
- export type { MiddlewareFn } from "./define/middleware.js";
53
-
54
- export type { TaserCookieJar, TaserCookieOptions, TaserHeaders } from "@taserjs/router-core";
54
+ UnionToIntersection,
55
+ SafeIntersect,
56
+ ExtractServicesFromLayout,
57
+ ExtractStateFromLayout,
58
+ ExtractServicesFromMiddleware,
59
+ ExtractStateFromMiddleware,
60
+ InferEffectiveParams,
61
+ InferEffectiveQuery,
62
+ InferEffectiveBody,
63
+ InferRouteServices,
64
+ InferRouteState,
65
+ InferMiddlewareArgs,
66
+ InferReturnsResponse,
67
+ NotFoundHandler,
68
+ OnErrorHandler,
69
+ ResponseOptions,
70
+ TaserAppOptions,
71
+ TaserDefinition,
72
+ } from "./types.js";
@@ -1,10 +1,22 @@
1
1
  import { bodyLimit as honoBodyLimit } from "hono/body-limit";
2
+ import type { Context } from "hono";
3
+ import { payloadTooLarge } from "@taserjs/utils";
4
+ import { hono } from "../hono.js";
5
+ import type { MiddlewareDefinition } from "../types.js";
2
6
 
3
- import { middleware } from "../define/middleware.js";
4
- import { honoMw } from "./hono-mw.js";
7
+ export type OnError = (c: Context) => Response | Promise<Response>;
5
8
 
6
- export function bodyLimit(...args: Parameters<typeof honoBodyLimit>) {
7
- return middleware(honoMw(honoBodyLimit(...args)));
9
+ export interface BodyLimitOptions {
10
+ maxSize: number;
11
+ onError?: OnError;
8
12
  }
9
13
 
10
- export type BodyLimitOptions = Parameters<typeof honoBodyLimit>[0];
14
+ export function bodyLimit(options: BodyLimitOptions): MiddlewareDefinition {
15
+ const onError = options.onError ?? (() => payloadTooLarge({ message: "Payload Too Large" }));
16
+ const honoMw = honoBodyLimit({
17
+ maxSize: options.maxSize,
18
+ onError,
19
+ });
20
+
21
+ return hono(honoMw);
22
+ }
@@ -1,10 +1,11 @@
1
- import { compress as honoCompress } from "hono/compress";
1
+ import { compress as honoCompress, COMPRESSIBLE_CONTENT_TYPE_REGEX } from "hono/compress";
2
+ import { hono } from "../hono.js";
3
+ import type { MiddlewareDefinition } from "../types.js";
2
4
 
3
- import { middleware } from "../define/middleware.js";
4
- import { honoMw } from "./hono-mw.js";
5
+ export type CompressionOptions = Parameters<typeof honoCompress>[0];
5
6
 
6
- export function compress(...args: Parameters<typeof honoCompress>) {
7
- return middleware(honoMw(honoCompress(...args)));
7
+ export function compress(options?: CompressionOptions): MiddlewareDefinition {
8
+ return hono(honoCompress(options));
8
9
  }
9
10
 
10
- export type CompressOptions = NonNullable<Parameters<typeof honoCompress>[0]>;
11
+ export { COMPRESSIBLE_CONTENT_TYPE_REGEX };
@@ -0,0 +1,128 @@
1
+ import { Context } from "hono";
2
+ import { deleteCookie, getCookie, getSignedCookie, setCookie, setSignedCookie } from "hono/cookie";
3
+ import type { Cookie, CookieOptions, CookiePrefixOptions, SignedCookie } from "hono/utils/cookie";
4
+ import { mergeResponseCookies } from "@taserjs/utils";
5
+ import { middleware } from "../builder.js";
6
+ import type { MiddlewareDefinition } from "../types.js";
7
+
8
+ export type { Cookie, CookieOptions, CookiePrefixOptions, SignedCookie };
9
+
10
+ export type CookieJarOptions = CookieOptions & {
11
+ secret?: string | BufferSource | undefined;
12
+ };
13
+
14
+ export class TaserCookieJar {
15
+ readonly #c: Context;
16
+ readonly #defaultOptions: CookieJarOptions;
17
+ #dirty = false;
18
+
19
+ constructor(c: Context, defaultOptions?: CookieJarOptions) {
20
+ this.#c = c;
21
+ this.#defaultOptions = defaultOptions ?? {};
22
+ }
23
+
24
+ get(name: string, prefixOptions?: CookiePrefixOptions): string | undefined;
25
+ get(): Cookie;
26
+ get(name?: string, prefixOptions?: CookiePrefixOptions): string | Cookie | undefined {
27
+ if (typeof name === "string") {
28
+ return getCookie(this.#c, name, prefixOptions);
29
+ }
30
+ return getCookie(this.#c);
31
+ }
32
+
33
+ async getSigned(
34
+ name: string,
35
+ secret?: string | BufferSource,
36
+ prefixOptions?: CookiePrefixOptions,
37
+ ): Promise<string | undefined | false>;
38
+ async getSigned(secret?: string | BufferSource): Promise<SignedCookie>;
39
+ async getSigned(
40
+ nameOrSecret?: string | BufferSource,
41
+ maybeSecret?: string | BufferSource,
42
+ prefixOptions?: CookiePrefixOptions,
43
+ ): Promise<string | SignedCookie | undefined | false> {
44
+ if (
45
+ typeof nameOrSecret === "string" &&
46
+ (maybeSecret !== undefined || this.#defaultOptions.secret !== undefined)
47
+ ) {
48
+ const secret = maybeSecret ?? this.#defaultOptions.secret!;
49
+ return await getSignedCookie(this.#c, secret, nameOrSecret, prefixOptions);
50
+ }
51
+
52
+ const secret =
53
+ (nameOrSecret as string | BufferSource | undefined) ?? this.#defaultOptions.secret;
54
+ if (!secret) {
55
+ throw new Error("Secret is required to read signed cookies");
56
+ }
57
+ return await getSignedCookie(this.#c, secret);
58
+ }
59
+
60
+ set(name: string, value: string, opt?: CookieOptions): this {
61
+ this.#dirty = true;
62
+ const mergedOpt = opt ? { ...this.#defaultOptions, ...opt } : this.#defaultOptions;
63
+ setCookie(this.#c, name, value, mergedOpt);
64
+ return this;
65
+ }
66
+
67
+ async setSigned(
68
+ name: string,
69
+ value: string,
70
+ secretOrOpt?: string | BufferSource | CookieOptions,
71
+ opt?: CookieOptions,
72
+ ): Promise<this> {
73
+ this.#dirty = true;
74
+ let secret: string | BufferSource;
75
+ let options: CookieOptions | undefined;
76
+
77
+ if (typeof secretOrOpt === "string" || (secretOrOpt && "byteLength" in secretOrOpt)) {
78
+ secret = secretOrOpt;
79
+ options = opt;
80
+ } else {
81
+ secret = this.#defaultOptions.secret!;
82
+ options = secretOrOpt;
83
+ }
84
+
85
+ if (!secret) {
86
+ throw new Error("Secret is required to set signed cookies");
87
+ }
88
+
89
+ const mergedOpt = { ...this.#defaultOptions, ...options };
90
+ await setSignedCookie(this.#c, name, value, secret, mergedOpt);
91
+ return this;
92
+ }
93
+
94
+ delete(name: string, opt?: CookieOptions): string | undefined {
95
+ this.#dirty = true;
96
+ const mergedOpt = opt ? { ...this.#defaultOptions, ...opt } : this.#defaultOptions;
97
+ return deleteCookie(this.#c, name, mergedOpt);
98
+ }
99
+
100
+ getSetCookieHeaders(): string[] {
101
+ void this.#c.res;
102
+ return typeof this.#c.res?.headers?.getSetCookie === "function"
103
+ ? this.#c.res.headers.getSetCookie()
104
+ : [];
105
+ }
106
+
107
+ flush<TRes extends Response>(res: TRes): TRes {
108
+ if (!this.#dirty) {
109
+ return res;
110
+ }
111
+ return mergeResponseCookies(this.#c, res) as TRes;
112
+ }
113
+ }
114
+
115
+ export function cookie(
116
+ options?: CookieJarOptions,
117
+ ): MiddlewareDefinition<{ cookies: TaserCookieJar }> {
118
+ return middleware(async ({ req, ctx }, next) => {
119
+ let c = (ctx as Record<string, unknown>).context as Context | undefined;
120
+ if (!c) {
121
+ c = new Context(req.raw);
122
+ (ctx as Record<string, unknown>).context = c;
123
+ }
124
+ const jar = new TaserCookieJar(c, options);
125
+ const res = await next.provide({ cookies: jar });
126
+ return jar.flush(res);
127
+ });
128
+ }
@@ -1,10 +1,9 @@
1
1
  import { cors as honoCors } from "hono/cors";
2
+ import { hono } from "../hono.js";
3
+ import type { MiddlewareDefinition } from "../types.js";
2
4
 
3
- import { middleware } from "../define/middleware.js";
4
- import { honoMw } from "./hono-mw.js";
5
+ export type CORSOptions = Parameters<typeof honoCors>[0];
5
6
 
6
- export function cors(...args: Parameters<typeof honoCors>) {
7
- return middleware(honoMw(honoCors(...args)));
7
+ export function cors(options?: CORSOptions): MiddlewareDefinition {
8
+ return hono(honoCors(options));
8
9
  }
9
-
10
- export type CorsOptions = NonNullable<Parameters<typeof honoCors>[0]>;
@@ -1,10 +1,9 @@
1
1
  import { csrf as honoCsrf } from "hono/csrf";
2
+ import { hono } from "../hono.js";
3
+ import type { MiddlewareDefinition } from "../types.js";
2
4
 
3
- import { middleware } from "../define/middleware.js";
4
- import { honoMw } from "./hono-mw.js";
5
+ export type CSRFOptions = Parameters<typeof honoCsrf>[0];
5
6
 
6
- export function csrf(...args: Parameters<typeof honoCsrf>) {
7
- return middleware(honoMw(honoCsrf(...args)));
7
+ export function csrf(options?: CSRFOptions): MiddlewareDefinition {
8
+ return hono(honoCsrf(options));
8
9
  }
9
-
10
- export type CsrfOptions = NonNullable<Parameters<typeof honoCsrf>[0]>;
@@ -1,10 +1,11 @@
1
- import { etag as honoEtag } from "hono/etag";
1
+ import { etag as honoEtag, RETAINED_304_HEADERS } from "hono/etag";
2
+ import { hono } from "../hono.js";
3
+ import type { MiddlewareDefinition } from "../types.js";
2
4
 
3
- import { middleware } from "../define/middleware.js";
4
- import { honoMw } from "./hono-mw.js";
5
+ export type ETagOptions = Parameters<typeof honoEtag>[0];
5
6
 
6
- export function etag(...args: Parameters<typeof honoEtag>) {
7
- return middleware(honoMw(honoEtag(...args)));
7
+ export function etag(options?: ETagOptions): MiddlewareDefinition {
8
+ return hono(honoEtag(options));
8
9
  }
9
10
 
10
- export type EtagOptions = NonNullable<Parameters<typeof honoEtag>[0]>;
11
+ export { RETAINED_304_HEADERS };
@@ -0,0 +1,35 @@
1
+ export {
2
+ cookie,
3
+ TaserCookieJar,
4
+ type CookieJarOptions,
5
+ type Cookie,
6
+ type CookieOptions,
7
+ type CookiePrefixOptions,
8
+ type SignedCookie,
9
+ } from "./cookie.js";
10
+ export { cors, type CORSOptions } from "./cors.js";
11
+ export {
12
+ jwt,
13
+ sign,
14
+ verify,
15
+ decode,
16
+ verifyWithJwks,
17
+ AlgorithmTypes,
18
+ type JWTOptions,
19
+ type HonoJWTOptions,
20
+ } from "./jwt.js";
21
+ export { jwk, type JWKOptions } from "./jwk.js";
22
+ export { secureHeaders, NONCE, type SecureHeadersOptions } from "./secure-headers.js";
23
+ export { bodyLimit, type BodyLimitOptions, type OnError } from "./body-limit.js";
24
+ export { csrf, type CSRFOptions } from "./csrf.js";
25
+ export { etag, RETAINED_304_HEADERS, type ETagOptions } from "./etag.js";
26
+ export {
27
+ timing,
28
+ startTime,
29
+ endTime,
30
+ setMetric,
31
+ wrapTime,
32
+ type TimingOptions,
33
+ type TimingVariables,
34
+ } from "./timing.js";
35
+ export { compress, COMPRESSIBLE_CONTENT_TYPE_REGEX, type CompressionOptions } from "./compress.js";
@@ -1,51 +1,17 @@
1
1
  import { jwk as honoJwk } from "hono/jwk";
2
+ import { hono } from "../hono.js";
3
+ import type { MiddlewareDefinition } from "../types.js";
2
4
 
3
- import { middleware } from "../define/middleware.js";
4
- import { honoMw } from "./hono-mw.js";
5
- import type { JwtMiddlewareUnit, JwtPayloadState } from "./jwt.js";
5
+ export type JWKOptions = Parameters<typeof honoJwk>[0];
6
6
 
7
- export type JwkOptions = Parameters<typeof honoJwk>[0];
7
+ export function jwk<TClaims = Record<string, unknown>>(
8
+ options: JWKOptions,
9
+ init?: RequestInit,
10
+ ): MiddlewareDefinition<unknown, { jwtPayload: TClaims }, unknown, unknown, unknown> {
11
+ const honoMw = honoJwk(options, init);
8
12
 
9
- export type JwkRequestInit = Pick<RequestInit, "headers">;
10
-
11
- export type JwkMiddlewareOptions = JwkOptions & {
12
- /** Allow `http://` JWKS URLs (local dev). Default false — requires `https://`. */
13
- allowInsecure?: boolean;
14
- };
15
-
16
- function assertJwksScheme(jwksUri: string, allowInsecure: boolean): void {
17
- const scheme = new URL(jwksUri).protocol.replace(":", "");
18
- if (scheme === "https") {
19
- return;
20
- }
21
- if (scheme === "http" && allowInsecure) {
22
- return;
23
- }
24
- throw new Error(`JWKS URL must use https:// (or http:// with allowInsecure: true): "${jwksUri}"`);
25
- }
26
-
27
- /**
28
- * JWK auth middleware. Invalid or missing tokens return **401** (Hono).
29
- * Successfully decoded payload is placed in `ctx.state.jwtPayload`.
30
- * Static `jwks_uri` must use HTTPS unless `allowInsecure: true`.
31
- */
32
- export function jwk<TPayload = Record<string, unknown>>(
33
- options: JwkMiddlewareOptions,
34
- init?: JwkRequestInit,
35
- ): JwtMiddlewareUnit<TPayload> {
36
- const jwksUri = options.jwks_uri;
37
- if (typeof jwksUri === "string") {
38
- assertJwksScheme(jwksUri, options.allowInsecure ?? false);
39
- }
40
-
41
- const { allowInsecure: _allowInsecure, ...honoOptions } = options;
42
- const safeInit = init?.headers !== undefined ? { headers: init.headers } : undefined;
43
- const mw = honoMw(honoJwk(honoOptions, safeInit));
44
-
45
- return middleware<JwtPayloadState<TPayload>>((ctx, next) =>
46
- mw(ctx, async () => {
47
- const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
48
- return next({ jwtPayload: payload as TPayload });
49
- }),
50
- );
13
+ return hono(honoMw, (c, next) => {
14
+ const jwtPayload = c.get("jwtPayload") as TClaims;
15
+ return next({ jwtPayload });
16
+ });
51
17
  }
@@ -1,31 +1,26 @@
1
- import { jwt as honoJwt } from "hono/jwt";
1
+ import { jwt as honoJwt, sign, verify, decode, verifyWithJwks, AlgorithmTypes } from "hono/jwt";
2
+ import { hono } from "../hono.js";
3
+ import type { MiddlewareDefinition } from "../types.js";
2
4
 
3
- import { middleware } from "../define/middleware.js";
4
- import type { MiddlewareReturnFromParts, MiddlewareUnit } from "../types/units.js";
5
- import { honoMw } from "./hono-mw.js";
5
+ export type HonoJWTOptions = Parameters<typeof honoJwt>[0];
6
6
 
7
- export type JwtPayloadState<TPayload> = {
8
- jwtPayload: TPayload;
9
- };
10
-
11
- export type JwtMiddlewareUnit<TPayload> = MiddlewareUnit<
12
- MiddlewareReturnFromParts<unknown, unknown, unknown, JwtPayloadState<TPayload>>
13
- >;
7
+ export interface JWTOptions extends Omit<HonoJWTOptions, "alg"> {
8
+ alg?: HonoJWTOptions["alg"];
9
+ }
14
10
 
15
- export type JwtOptions = Parameters<typeof honoJwt>[0];
11
+ export function jwt<TClaims = Record<string, unknown>>(
12
+ options: JWTOptions,
13
+ ): MiddlewareDefinition<unknown, { jwtPayload: TClaims }, unknown, unknown, unknown> {
14
+ const { alg = "HS256", ...rest } = options;
15
+ const honoMw = honoJwt({
16
+ alg,
17
+ ...rest,
18
+ });
16
19
 
17
- /**
18
- * JWT auth middleware. Invalid or missing tokens return **401** (Hono).
19
- * Successfully decoded payload is placed in `ctx.state.jwtPayload`.
20
- */
21
- export function jwt<TPayload = Record<string, unknown>>(
22
- options: JwtOptions,
23
- ): JwtMiddlewareUnit<TPayload> {
24
- const mw = honoMw(honoJwt(options));
25
- return middleware<JwtPayloadState<TPayload>>((ctx, next) =>
26
- mw(ctx, async () => {
27
- const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
28
- return next({ jwtPayload: payload as TPayload });
29
- }),
30
- );
20
+ return hono(honoMw, (c, next) => {
21
+ const jwtPayload = c.get("jwtPayload") as TClaims;
22
+ return next({ jwtPayload });
23
+ });
31
24
  }
25
+
26
+ export { sign, verify, decode, verifyWithJwks, AlgorithmTypes };
@@ -1,10 +1,11 @@
1
- import { secureHeaders as honoSecureHeaders } from "hono/secure-headers";
1
+ import { secureHeaders as honoSecureHeaders, NONCE } from "hono/secure-headers";
2
+ import { hono } from "../hono.js";
3
+ import type { MiddlewareDefinition } from "../types.js";
2
4
 
3
- import { middleware } from "../define/middleware.js";
4
- import { honoMw } from "./hono-mw.js";
5
+ export type SecureHeadersOptions = Parameters<typeof honoSecureHeaders>[0];
5
6
 
6
- export function secureHeaders(...args: Parameters<typeof honoSecureHeaders>) {
7
- return middleware(honoMw(honoSecureHeaders(...args)));
7
+ export function secureHeaders(options?: SecureHeadersOptions): MiddlewareDefinition {
8
+ return hono(honoSecureHeaders(options));
8
9
  }
9
10
 
10
- export type SecureHeadersOptions = NonNullable<Parameters<typeof honoSecureHeaders>[0]>;
11
+ export { NONCE };
@@ -1,10 +1,13 @@
1
- import { timing as honoTiming } from "hono/timing";
1
+ import { timing as honoTiming, startTime, endTime, setMetric, wrapTime } from "hono/timing";
2
+ import type { TimingVariables } from "hono/timing";
3
+ import { hono } from "../hono.js";
4
+ import type { MiddlewareDefinition } from "../types.js";
2
5
 
3
- import { middleware } from "../define/middleware.js";
4
- import { honoMw } from "./hono-mw.js";
6
+ export type TimingOptions = Parameters<typeof honoTiming>[0];
5
7
 
6
- export function timing(...args: Parameters<typeof honoTiming>) {
7
- return middleware(honoMw(honoTiming(...args)));
8
+ export function timing(config?: TimingOptions): MiddlewareDefinition {
9
+ return hono(honoTiming(config));
8
10
  }
9
11
 
10
- export type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]>;
12
+ export { startTime, endTime, setMetric, wrapTime };
13
+ export type { TimingVariables };
package/src/reply.ts CHANGED
@@ -1 +1,26 @@
1
- export * from "@taserjs/router-utils/reply";
1
+ export {
2
+ accepted,
3
+ badRequest,
4
+ conflict,
5
+ created,
6
+ createReply,
7
+ createTypedResponse,
8
+ forbidden,
9
+ html,
10
+ internalServerError,
11
+ isPlainObjectOrArray,
12
+ json,
13
+ methodNotAllowed,
14
+ noContent,
15
+ notFound,
16
+ ok,
17
+ payloadTooLarge,
18
+ redirect,
19
+ text,
20
+ tooManyRequests,
21
+ unauthorized,
22
+ unprocessable,
23
+ type ExtractStatus,
24
+ type JsonResponse,
25
+ type TypedResponse,
26
+ } from "@taserjs/utils";
package/src/stream.ts CHANGED
@@ -1 +1,10 @@
1
- export * from "@taserjs/router-utils/stream";
1
+ export {
2
+ blob,
3
+ buffer,
4
+ formatSSE,
5
+ pipe,
6
+ sse,
7
+ type SSEController,
8
+ type SSEInit,
9
+ type SSEMessage,
10
+ } from "@taserjs/utils/stream";