@taserjs/router 0.1.13 → 0.2.1

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-DYfjARJF.js +226 -0
  3. package/dist/builder-DYfjARJF.js.map +1 -0
  4. package/dist/builder-EWuIQcdU.cjs +283 -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 +104 -0
  10. package/dist/index.d.cts.map +1 -0
  11. package/dist/index.d.ts +104 -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-87QgPePQ.d.cts +294 -0
  98. package/dist/types-87QgPePQ.d.cts.map +1 -0
  99. package/dist/types-oo9In1Ss.d.ts +294 -0
  100. package/dist/types-oo9In1Ss.d.ts.map +1 -0
  101. package/package.json +49 -107
  102. package/src/builder.ts +753 -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 +802 -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
@@ -1,34 +0,0 @@
1
- import { ReplyOf } from '@taserjs/router-utils/reply';
2
- import { StatusCode } from '@taserjs/router-utils';
3
- import { Simplify } from './type-utils.js';
4
- import { Schema, InferOutput } from './schema.js';
5
- export type { StatusCode };
6
- /** Status-code → Standard Schema map for route/middleware/handler outputs. */
7
- export type ReturnsMap = {
8
- readonly [status: number]: Schema<unknown> | undefined;
9
- };
10
- /** Later map wins on overlapping status keys. */
11
- export type MergeReturns<A extends ReturnsMap, B extends ReturnsMap> = Omit<A, keyof B> & B;
12
- /** Typed reply union for statuses declared in a returns map. */
13
- export type ReplyFor<M extends ReturnsMap> = {
14
- [S in keyof M & number]: M[S] extends Schema<unknown> ? ReplyOf<S, Simplify<InferOutput<M[S]>>> : never;
15
- }[keyof M & number];
16
- export type EmptyReturns = {};
17
- /** True when no status schemas have been declared yet. */
18
- export type HasReturns<M extends ReturnsMap> = [keyof M] extends [never] ? false : true;
19
- /**
20
- * Validate a concrete reply `R` against returns map `M`.
21
- * Declared statuses must match schema output; undeclared statuses stay open
22
- * (same rule as runtime `validateReply`).
23
- */
24
- export type ValidHandlerReply<R, M extends ReturnsMap> = R extends ReplyOf<infer S, infer B> ? S extends keyof M ? M[S] extends Schema<unknown> ? B extends Simplify<InferOutput<M[S]>> ? R : never : R : R : R extends Response ? R : never;
25
- /**
26
- * Narrow a handler return so declared statuses are schema-checked without
27
- * breaking multi-status unions (avoids circular `R extends …<R>` constraints).
28
- */
29
- export type EnforceHandlerReply<R, M extends ReturnsMap> = [R] extends [ValidHandlerReply<R, M>] ? R : ValidHandlerReply<R, M>;
30
- /**
31
- * Expected `.handler` return type for a returns map.
32
- * Prefer constraining handler generics with {@link EnforceHandlerReply}.
33
- */
34
- export type HandlerReply<M extends ReturnsMap> = HasReturns<M> extends true ? ReplyFor<M> | Response : Response;
@@ -1,14 +0,0 @@
1
- import { StandardSchemaV1 } from '@standard-schema/spec';
2
- import { RequestShape } from './type-utils.js';
3
- export type { StandardSchemaV1 } from '@standard-schema/spec';
4
- /**
5
- * A Standard Schema validator.
6
- * `TOutput` is the validated/output type; `TInput` is the pre-parse input (request shape).
7
- */
8
- export type Schema<TOutput = unknown, TInput = unknown> = StandardSchemaV1<TInput, TOutput>;
9
- /** Infers the output type from a Standard Schema. */
10
- export type InferOutput<S> = S extends StandardSchemaV1<unknown, infer O> ? O : never;
11
- /** Infers the input type from a Standard Schema. */
12
- export type InferInput<S> = S extends StandardSchemaV1<infer I, unknown> ? I : never;
13
- /** Pre-parse request shape from a Standard Schema. */
14
- export type SchemaRequestShape<S> = S extends StandardSchemaV1<infer I, infer O> ? RequestShape<I, O> : S;
@@ -1,50 +0,0 @@
1
- import { TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
2
- import { HttpMethod, HttpVerb } from '@taserjs/router-utils/http';
3
- export type Method = HttpMethod;
4
- export type { HttpMethod, HttpVerb };
5
- export type MiddlewareFieldName = "query" | "params" | "body" | "state";
6
- export type MiddlewareInputFieldName = "query" | "params" | "body";
7
- export type UnwrapPart<T> = unknown extends T ? {} : T;
8
- export type MergePart<T, Base> = unknown extends T ? Base : Base & T;
9
- /** Collapse intersections so `Omit`/`keyof` treat the result as one object type. */
10
- export type Simplify<T> = [T] extends [infer U] ? {
11
- [K in keyof U]: U[K];
12
- } : never;
13
- /**
14
- * Request prop: when schema input is `unknown` (e.g. zod coerce),
15
- * fall back to the validated output type.
16
- */
17
- type RequestPropType<TIn, TOut> = [unknown] extends [Exclude<TIn, undefined>] ? TOut : TIn;
18
- /**
19
- * Pre-parse request shape. Prefer input types (defaults → optional),
20
- * but replace `unknown` input props with output types.
21
- */
22
- export type RequestShape<TIn, TOut> = unknown extends TIn ? UnwrapPart<TOut> : Simplify<{
23
- [K in keyof TIn]: K extends keyof TOut ? RequestPropType<TIn[K], TOut[K]> : TIn[K];
24
- }>;
25
- export type UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends (value: infer Value) => void ? Value : never;
26
- export type MiddlewareField<Middleware, Field extends MiddlewareFieldName> = Field extends "query" ? Middleware extends {
27
- query: infer Query;
28
- } ? Query : {} : Field extends "params" ? Middleware extends {
29
- params: infer Params;
30
- } ? Params : {} : Field extends "body" ? Middleware extends {
31
- body: infer Body;
32
- } ? Body : {} : Field extends "state" ? Middleware extends {
33
- state: infer State;
34
- } ? State : {} : {};
35
- export type MiddlewareInputField<Middleware, Field extends MiddlewareInputFieldName> = Middleware extends {
36
- input: {
37
- [K in Field]: infer V;
38
- };
39
- } ? V : {};
40
- export type MergeMiddlewareField<Middlewares extends readonly unknown[], Field extends MiddlewareFieldName> = Middlewares extends readonly [] ? {} : Middlewares extends readonly [infer Head, ...infer Tail] ? MiddlewareField<Head, Field> & MergeMiddlewareField<Tail, Field> : MiddlewareField<Middlewares[number], Field>;
41
- export type MergeMiddlewareInputField<Middlewares extends readonly unknown[], Field extends MiddlewareInputFieldName> = Middlewares extends readonly [] ? {} : Middlewares extends readonly [infer Head, ...infer Tail] ? MiddlewareInputField<Head, Field> & MergeMiddlewareInputField<Tail, Field> : MiddlewareInputField<Middlewares[number], Field>;
42
- export type RuntimeContextFields = {
43
- request: Request;
44
- method: Method;
45
- url: URL;
46
- headers: TaserHeaders;
47
- cookies: TaserCookieJar;
48
- var: Record<string, unknown>;
49
- };
50
- export type UnitRuntimeContext = Omit<RuntimeContextFields, "var">;
@@ -1,71 +0,0 @@
1
- import { MiddlewareDefinition as CoreMiddlewareDefinition, TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
2
- import { RequestShape, Simplify, UnitRuntimeContext, UnwrapPart } from './type-utils.js';
3
- import { ReturnsMap } from './returns.js';
4
- import { Schema } from './schema.js';
5
- export type { HttpMethod, Method } from './type-utils.js';
6
- export type { EmptyReturns, MergeReturns, ReturnsMap, HandlerReply, HasReturns, StatusCode, ValidHandlerReply, EnforceHandlerReply, } from './returns.js';
7
- /** Default empty app context for standalone units without a bound router instance. */
8
- export type EmptyAppContext = Record<never, never>;
9
- export type ValidatorParts = {
10
- query?: unknown;
11
- params?: unknown;
12
- body?: unknown;
13
- queryIn?: unknown;
14
- paramsIn?: unknown;
15
- bodyIn?: unknown;
16
- };
17
- export declare const StateBrand: unique symbol;
18
- export type NextResult<TState = unknown> = Response & {
19
- readonly [StateBrand]?: TState;
20
- };
21
- export type ExtractStateFromUnion<T> = T extends {
22
- readonly [StateBrand]?: infer S;
23
- } ? [S] extends [never] ? never : [unknown] extends [S] ? {} : S : never;
24
- export type ExtractState<T> = [ExtractStateFromUnion<Awaited<T>>] extends [never] ? {} : ExtractStateFromUnion<Awaited<T>>;
25
- export type IsUnknown<T> = [unknown] extends [T] ? true : false;
26
- export type NextFn<TExpectedState = unknown> = IsUnknown<TExpectedState> extends true ? <S extends Record<string, unknown> = {}>(state?: S) => Promise<NextResult<S>> : (state: TExpectedState) => Promise<NextResult<TExpectedState>>;
27
- export type MiddlewareDefinition = CoreMiddlewareDefinition<ReturnsMap>;
28
- export type MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TQueryIn = TQuery, TParamsIn = TParams, TBodyIn = TBody> = {
29
- query: UnwrapPart<TQuery>;
30
- params: UnwrapPart<TParams>;
31
- body: UnwrapPart<TBody>;
32
- state: UnwrapPart<TState>;
33
- /** Pre-parse shapes merged into route `$Infer.Input`. */
34
- input: {
35
- query: RequestShape<TQueryIn, TQuery>;
36
- params: RequestShape<TParamsIn, TParams>;
37
- body: RequestShape<TBodyIn, TBody>;
38
- };
39
- };
40
- export type MiddlewareRequirements = {
41
- query?: Record<string, unknown>;
42
- params?: Record<string, unknown>;
43
- body?: unknown;
44
- state?: Record<string, unknown>;
45
- };
46
- export type DefineMiddlewareResult<TQuery, TParams, TBody, TState, R, TQueryIn = TQuery, TParamsIn = TParams, TBodyIn = TBody, TReturns extends ReturnsMap = {}, TLayout = null, TRequires extends MiddlewareRequirements = {}> = MiddlewareUnit<MiddlewareReturnFromParts<TQuery, TParams, TBody, IsUnknown<TState> extends true ? ExtractState<R> : TState, TQueryIn, TParamsIn, TBodyIn>, TReturns, TLayout, TRequires>;
47
- export type StandaloneMiddlewareContext<TQuery = unknown, TParams = unknown, TBody = unknown, TAppContext extends Record<string, unknown> = EmptyAppContext, TState = {}, TRequires extends MiddlewareRequirements = {}> = Simplify<TAppContext & UnitRuntimeContext & {
48
- query: Simplify<UnwrapPart<TQuery> & (TRequires["query"] extends Record<string, unknown> ? TRequires["query"] : {})>;
49
- params: Simplify<UnwrapPart<TParams> & (TRequires["params"] extends Record<string, unknown> ? TRequires["params"] : {})>;
50
- body: Simplify<UnwrapPart<TBody> & (unknown extends TRequires["body"] ? {} : [TRequires["body"]] extends [undefined] ? {} : TRequires["body"])>;
51
- state: Simplify<UnwrapPart<TState> & (TRequires["state"] extends Record<string, unknown> ? TRequires["state"] : {})>;
52
- headers: TaserHeaders;
53
- cookies: TaserCookieJar;
54
- }>;
55
- export declare const MiddlewareUnitBrand: unique symbol;
56
- export type MiddlewareUnit<TAcc = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequires extends MiddlewareRequirements = {}> = MiddlewareDefinition & {
57
- readonly [MiddlewareUnitBrand]: true;
58
- readonly __middlewareAcc: TAcc;
59
- readonly __returns?: TReturns;
60
- readonly __requiredLayouts?: TRequiredLayouts;
61
- readonly __requirements?: TRequires;
62
- };
63
- export type MiddlewareUnitBuilder<TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequires extends MiddlewareRequirements = {}, TAppContext extends Record<string, unknown> = EmptyAppContext, TInheritedState = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, TExpectedState = unknown> = MiddlewareUnit<MiddlewareReturnFromParts<TQuery, TParams, TBody, IsUnknown<TExpectedState> extends true ? {} : TExpectedState, TQueryIn, TParamsIn, TBodyIn>, TReturns, TRequiredLayouts, TRequires> & {
64
- query<Q, QIn = unknown>(schema: Schema<Q, QIn>): MiddlewareUnitBuilder<Q, TParams, TBody, TReturns, TRequiredLayouts, TRequires, TAppContext, TInheritedState, QIn, TParamsIn, TBodyIn, TExpectedState>;
65
- params<P, PIn = unknown>(schema: Schema<P, PIn>): MiddlewareUnitBuilder<TQuery, P, TBody, TReturns, TRequiredLayouts, TRequires, TAppContext, TInheritedState, TQueryIn, PIn, TBodyIn, TExpectedState>;
66
- body<B, BIn = unknown>(schema: Schema<B, BIn>): MiddlewareUnitBuilder<TQuery, TParams, B, TReturns, TRequiredLayouts, TRequires, TAppContext, TInheritedState, TQueryIn, TParamsIn, BIn, TExpectedState>;
67
- body<Mode extends "json" | "form" | "urlencoded", B, BIn = unknown>(mode: Mode, schema: Schema<B, BIn>): MiddlewareUnitBuilder<TQuery, TParams, B, TReturns, TRequiredLayouts, TRequires, TAppContext, TInheritedState, TQueryIn, TParamsIn, BIn, TExpectedState>;
68
- returns<const M extends ReturnsMap>(map: M): MiddlewareUnitBuilder<TQuery, TParams, TBody, Omit<TReturns, keyof M> & M, TRequiredLayouts, TRequires, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn, TExpectedState>;
69
- requires<Requires extends MiddlewareRequirements>(): MiddlewareUnitBuilder<TQuery, TParams, TBody, TReturns, TRequiredLayouts, TRequires & Requires, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn, TExpectedState>;
70
- handler<R>(fn: (ctx: StandaloneMiddlewareContext<TQuery, TParams, TBody, TAppContext, TInheritedState, TRequires>, next: NextFn<TExpectedState>) => R): DefineMiddlewareResult<TQuery, TParams, TBody, IsUnknown<TExpectedState> extends true ? ExtractState<R> : TExpectedState, R, TQueryIn, TParamsIn, TBodyIn, TReturns, TRequiredLayouts, TRequires>;
71
- };
@@ -1,39 +0,0 @@
1
- import type { RouteManifestShape, TaserRuntime } from "@taserjs/router-core";
2
-
3
- export class TaserServeView<THasNotFound extends boolean = boolean> {
4
- readonly fetch: (
5
- request: Request,
6
- env?: unknown,
7
- executionCtx?: unknown,
8
- ) => THasNotFound extends true
9
- ? Promise<Response> | Response
10
- : Promise<Response | undefined> | Response | undefined;
11
-
12
- readonly request: (
13
- path: string,
14
- init?: RequestInit,
15
- ) => THasNotFound extends true ? Promise<Response> : Promise<Response | undefined>;
16
-
17
- constructor(protected readonly runtime: TaserRuntime<THasNotFound>) {
18
- this.fetch = (request: Request, env?: unknown, executionCtx?: unknown) => {
19
- return this.runtime.fetch(request, env, executionCtx as never);
20
- };
21
- this.request = (path: string, init?: RequestInit) => {
22
- return this.runtime.request(path, init);
23
- };
24
- }
25
- }
26
-
27
- export class TaserApp<
28
- TManifest extends RouteManifestShape = RouteManifestShape,
29
- THasNotFound extends boolean = boolean,
30
- > extends TaserServeView<THasNotFound> {
31
- readonly __manifest?: TManifest;
32
-
33
- constructor(runtime: TaserRuntime<THasNotFound>, manifest?: TManifest) {
34
- super(runtime);
35
- if (manifest !== undefined) {
36
- this.__manifest = manifest;
37
- }
38
- }
39
- }
@@ -1,4 +0,0 @@
1
- /** Input schema keys validated by middleware and route handlers. Headers/cookies are parsed only. */
2
- export const SCHEMA_KEYS = ["query", "params", "body"] as const;
3
-
4
- export type SchemaKey = (typeof SCHEMA_KEYS)[number];
@@ -1,71 +0,0 @@
1
- import type { BodyMode } from "@taserjs/router-core";
2
-
3
- import type { ReturnsMap } from "../types/returns.js";
4
- import type { Schema } from "../types/schema.js";
5
- import { pickDefinedSchemas, type SchemaValidators } from "../define/validators.js";
6
-
7
- class MiddlewareUnitBuilderImpl {
8
- private readonly validators: SchemaValidators = {};
9
- private bodyMode: BodyMode | undefined;
10
- private returnsMap: ReturnsMap | undefined;
11
- readonly __requiredLayouts: string | readonly string[] | undefined;
12
- readonly __middlewareAcc: unknown = undefined;
13
-
14
- constructor(requiredLayouts?: string | readonly string[]) {
15
- this.__requiredLayouts = requiredLayouts;
16
- }
17
-
18
- query(schema: Schema<unknown>): this {
19
- this.validators.query = schema;
20
- return this;
21
- }
22
-
23
- params(schema: Schema<unknown>): this {
24
- this.validators.params = schema;
25
- return this;
26
- }
27
-
28
- body(modeOrSchema: BodyMode | Schema<unknown>, schema?: Schema<unknown>): this {
29
- if (typeof modeOrSchema === "string") {
30
- this.bodyMode = modeOrSchema as BodyMode;
31
- if (schema !== undefined) {
32
- this.validators.body = schema;
33
- }
34
- } else {
35
- this.bodyMode = "json";
36
- this.validators.body = modeOrSchema;
37
- }
38
- return this;
39
- }
40
-
41
- returns(map: ReturnsMap): this {
42
- this.returnsMap = this.returnsMap ? { ...this.returnsMap, ...map } : { ...map };
43
- return this;
44
- }
45
-
46
- requires(): this {
47
- return this;
48
- }
49
-
50
- handler(fn: (ctx: any, next: any) => any) {
51
- return this.toUnit(fn);
52
- }
53
-
54
- toUnit(fn?: (ctx: any, next: any) => any) {
55
- const schemas = pickDefinedSchemas(this.validators);
56
- return {
57
- ...(fn ? { handler: fn } : {}),
58
- ...schemas,
59
- ...(this.bodyMode ? { bodyMode: this.bodyMode } : {}),
60
- ...(this.returnsMap ? { returns: this.returnsMap, __returns: this.returnsMap } : {}),
61
- ...(this.__requiredLayouts !== undefined
62
- ? { __requiredLayouts: this.__requiredLayouts }
63
- : {}),
64
- __middlewareAcc: undefined as unknown,
65
- };
66
- }
67
- }
68
-
69
- export function createMiddlewareUnitBuilder(requiredLayouts?: string | readonly string[]) {
70
- return new MiddlewareUnitBuilderImpl(requiredLayouts);
71
- }
@@ -1,23 +0,0 @@
1
- import type { LayoutId, MiddlewareBuilder } from "../types/index.js";
2
- import type { MiddlewareDefinition } from "../types/units.js";
3
- import { normalizeMiddlewareDefinition } from "./normalize.js";
4
-
5
- class MiddlewareBuilderImpl<Layout extends LayoutId> {
6
- readonly layout: Layout;
7
- readonly middlewares: MiddlewareDefinition[] = [];
8
-
9
- constructor(layout: Layout) {
10
- this.layout = layout;
11
- }
12
-
13
- use(definition: MiddlewareDefinition | ((ctx: any, next: any) => any)): this {
14
- this.middlewares.push(normalizeMiddlewareDefinition(definition));
15
- return this;
16
- }
17
- }
18
-
19
- export function createMiddleware<const Layout extends LayoutId>(
20
- layout: Layout,
21
- ): MiddlewareBuilder<Layout, readonly []> {
22
- return new MiddlewareBuilderImpl(layout) as unknown as MiddlewareBuilder<Layout, readonly []>;
23
- }
@@ -1,13 +0,0 @@
1
- import type { MiddlewareDefinition } from "../types/units.js";
2
-
3
- export function normalizeMiddlewareDefinition(
4
- definition: MiddlewareDefinition | ((ctx: any, next: any) => any),
5
- ): MiddlewareDefinition {
6
- if (typeof definition === "function") {
7
- return { handler: definition as any };
8
- }
9
- if (typeof (definition as any)?.toUnit === "function") {
10
- return (definition as any).toUnit();
11
- }
12
- return definition;
13
- }
@@ -1,137 +0,0 @@
1
- import type { StandardSchemaV1 } from "@standard-schema/spec";
2
- import {
3
- collectReturnsFromDefinitions,
4
- hasInputSchemas,
5
- mergeReturnsMaps,
6
- withAuto422,
7
- } from "@taserjs/router-utils";
8
- import type { BodyMode } from "@taserjs/router-core";
9
-
10
- import type {
11
- Method,
12
- RouteBuilder,
13
- RoutePath,
14
- ReturnsMap,
15
- ValidatorParts,
16
- Schema,
17
- } from "../types/index.js";
18
- import type { HttpMethod, MiddlewareDefinition } from "../types/units.js";
19
- import { pickDefinedSchemas, type SchemaValidators } from "../define/validators.js";
20
- import { normalizeMiddlewareDefinition } from "./normalize.js";
21
-
22
- function buildRouteReturnsWith422(args: {
23
- middlewareReturns: ReturnsMap;
24
- routeReturns: ReturnsMap;
25
- schemas: {
26
- query?: unknown;
27
- params?: unknown;
28
- body?: unknown;
29
- middlewares?: readonly MiddlewareDefinition[];
30
- };
31
- }): Record<number, StandardSchemaV1> | undefined {
32
- const merged = mergeReturnsMaps(
33
- args.middlewareReturns as Record<number, StandardSchemaV1>,
34
- args.routeReturns as Record<number, StandardSchemaV1>,
35
- );
36
- const with422 = withAuto422(merged, hasInputSchemas(args.schemas));
37
- return Object.keys(with422).length > 0 ? with422 : undefined;
38
- }
39
-
40
- function buildRouteBase(
41
- path: string,
42
- method: HttpMethod | "ANY" | "ALL",
43
- methods: readonly HttpMethod[] | undefined,
44
- middlewares: MiddlewareDefinition[],
45
- ) {
46
- return {
47
- path,
48
- method,
49
- ...(methods ? { methods: [...methods] } : {}),
50
- middlewares: [...middlewares],
51
- };
52
- }
53
-
54
- class RouteBuilderImpl {
55
- readonly path: string;
56
- readonly method: HttpMethod | "ANY" | "ALL";
57
- readonly methods: readonly HttpMethod[] | undefined;
58
- private readonly middlewares: MiddlewareDefinition[] = [];
59
- private readonly routeReturns: Record<number, StandardSchemaV1> = {};
60
- private readonly validators: SchemaValidators = {};
61
- private bodyMode: BodyMode | undefined;
62
-
63
- constructor(path: string, method: HttpMethod | "ANY" | "ALL", methods?: readonly HttpMethod[]) {
64
- this.path = path;
65
- this.method = method;
66
- this.methods = methods;
67
- }
68
-
69
- query(schema: Schema<unknown>): this {
70
- this.validators.query = schema;
71
- return this;
72
- }
73
-
74
- params(schema: Schema<unknown>): this {
75
- this.validators.params = schema;
76
- return this;
77
- }
78
-
79
- body(modeOrSchema: BodyMode | Schema<unknown>, schema?: Schema<unknown>): this {
80
- if (typeof modeOrSchema === "string") {
81
- this.bodyMode = modeOrSchema as BodyMode;
82
- if (schema !== undefined) {
83
- this.validators.body = schema;
84
- }
85
- } else {
86
- this.bodyMode = "json";
87
- this.validators.body = modeOrSchema;
88
- }
89
- return this;
90
- }
91
-
92
- returns(map: ReturnsMap): this {
93
- Object.assign(this.routeReturns, map);
94
- return this;
95
- }
96
-
97
- use(definition: MiddlewareDefinition | ((ctx: any, next: any) => any)): this {
98
- this.middlewares.push(normalizeMiddlewareDefinition(definition));
99
- return this;
100
- }
101
-
102
- handler(fn: (ctx: unknown) => Response | Promise<Response>) {
103
- const routeSchemas = pickDefinedSchemas(this.validators);
104
- const base = buildRouteBase(this.path, this.method, this.methods, this.middlewares);
105
-
106
- const returns = buildRouteReturnsWith422({
107
- middlewareReturns: collectReturnsFromDefinitions(this.middlewares),
108
- routeReturns: this.routeReturns,
109
- schemas: {
110
- ...this.validators,
111
- middlewares: this.middlewares,
112
- },
113
- });
114
-
115
- return {
116
- ...base,
117
- handler: fn,
118
- ...routeSchemas,
119
- ...(this.bodyMode ? { bodyMode: this.bodyMode } : {}),
120
- ...(returns ? { returns } : {}),
121
- };
122
- }
123
- }
124
-
125
- /** Shared internal builder — not part of the public `@taserjs/router` API. */
126
- export function createRouteBuilder(
127
- path: string,
128
- method: HttpMethod | "ANY" | "ALL",
129
- methods?: readonly HttpMethod[],
130
- ): RouteBuilder<RoutePath, Method, readonly [], ValidatorParts> {
131
- return new RouteBuilderImpl(path, method, methods) as unknown as RouteBuilder<
132
- RoutePath,
133
- Method,
134
- readonly [],
135
- ValidatorParts
136
- >;
137
- }
@@ -1,144 +0,0 @@
1
- import {
2
- createTaserRuntime,
3
- type NotFoundHandler,
4
- type OnErrorHandler,
5
- type RouteManifestShape,
6
- } from "@taserjs/router-core";
7
- import { isPromise, normalizeOnError } from "@taserjs/router-utils";
8
-
9
- import { TaserApp } from "./app.js";
10
- import type { ContextDefinition, CreateTaserAppOptions, OnErrorOptions } from "../types/app.js";
11
- import type { EmptyAppContext } from "../types/units.js";
12
- import type { ReturnsMap } from "../types/returns.js";
13
-
14
- function toOnErrorHandler(
15
- onErrorOptions: OnErrorOptions | OnErrorOptions["handle"],
16
- ): OnErrorHandler {
17
- return normalizeOnError(onErrorOptions);
18
- }
19
-
20
- type RouterState = {
21
- options: CreateTaserAppOptions;
22
- contextDef: ContextDefinition<Record<string, unknown>, Record<string, unknown>>;
23
- onError?: OnErrorHandler;
24
- notFound?: NotFoundHandler;
25
- };
26
-
27
- const emptyContext: ContextDefinition<Record<string, unknown>, Record<string, unknown>> = {};
28
-
29
- export class TaserRouter<
30
- TAppContext extends Record<string, unknown> = EmptyAppContext,
31
- THasNotFound extends boolean = false,
32
- > {
33
- private readonly state: RouterState;
34
- readonly $Infer!: {
35
- Context: TAppContext;
36
- };
37
-
38
- constructor(options: CreateTaserAppOptions = {}, state?: Partial<Omit<RouterState, "options">>) {
39
- this.state = {
40
- options,
41
- contextDef: state?.contextDef ?? emptyContext,
42
- ...(state?.onError !== undefined ? { onError: state.onError } : {}),
43
- ...(state?.notFound !== undefined ? { notFound: state.notFound } : {}),
44
- };
45
- }
46
-
47
- context<TBoot extends Record<string, unknown>, TReq extends Record<string, unknown>>(
48
- definition: ContextDefinition<TBoot, TReq>,
49
- ): TaserRouter<TBoot & TReq, THasNotFound> {
50
- this.state.contextDef = definition;
51
- return this as unknown as TaserRouter<TBoot & TReq, THasNotFound>;
52
- }
53
-
54
- onError<TResponses extends ReturnsMap = ReturnsMap>(
55
- options: OnErrorOptions<TResponses> | OnErrorOptions<TResponses>["handle"],
56
- ): this {
57
- this.state.onError = toOnErrorHandler(options);
58
- return this;
59
- }
60
-
61
- notFound(
62
- handler: (ctx: unknown) => Response | Promise<Response> | unknown,
63
- ): TaserRouter<TAppContext, true> {
64
- this.state.notFound = (ctx) => handler(ctx);
65
- return this as unknown as TaserRouter<TAppContext, true>;
66
- }
67
-
68
- create<const TManifest extends RouteManifestShape>(
69
- manifest: TManifest,
70
- runtimeOptions?: { basePath?: string },
71
- ): TaserApp<TManifest, THasNotFound> {
72
- const definition = this.state.contextDef;
73
- const validateResponse = this.state.options.response?.validate ?? true;
74
- const onValidationFailure = this.state.options.response?.onValidationFailure;
75
- const basePath = runtimeOptions?.basePath;
76
-
77
- const hasCustomContext = definition.boot !== undefined || definition.request !== undefined;
78
- let bootContextResolved: Record<string, unknown> | undefined;
79
- let bootPromise: Promise<Record<string, unknown>> | undefined;
80
-
81
- if (definition.boot !== undefined) {
82
- const bootResult = definition.boot();
83
- if (isPromise(bootResult)) {
84
- bootPromise = bootResult.then((ctx) => {
85
- bootContextResolved = (ctx ?? {}) as Record<string, unknown>;
86
- return bootContextResolved;
87
- });
88
- } else {
89
- bootContextResolved = (bootResult ?? {}) as Record<string, unknown>;
90
- }
91
- } else if (hasCustomContext) {
92
- bootContextResolved = {};
93
- }
94
-
95
- const contextFactory = hasCustomContext
96
- ? (req?: Request) => {
97
- if (bootPromise !== undefined && bootContextResolved === undefined) {
98
- return bootPromise.then(async (bootContext) => {
99
- if (!definition.request) {
100
- return { ...bootContext };
101
- }
102
- const requestResult = definition.request(req!);
103
- const requestContext = isPromise(requestResult) ? await requestResult : requestResult;
104
- return { ...bootContext, ...requestContext };
105
- });
106
- }
107
-
108
- const bootContext = bootContextResolved ?? {};
109
- if (!definition.request) {
110
- return { ...bootContext };
111
- }
112
-
113
- const requestResult = definition.request(req!);
114
- if (isPromise(requestResult)) {
115
- return requestResult.then((requestContext) => ({
116
- ...bootContext,
117
- ...requestContext,
118
- }));
119
- }
120
-
121
- return { ...bootContext, ...(requestResult as Record<string, unknown>) };
122
- }
123
- : () => ({});
124
-
125
- const runtime = createTaserRuntime(manifest, contextFactory, {
126
- ...(basePath !== undefined ? { basePath } : {}),
127
- response: {
128
- validate: validateResponse,
129
- ...(onValidationFailure !== undefined ? { onValidationFailure } : {}),
130
- },
131
- ...(this.state.onError !== undefined ? { onError: this.state.onError } : {}),
132
- ...(this.state.notFound !== undefined ? { notFound: this.state.notFound } : {}),
133
- ...(this.state.options.cookies !== undefined ? { cookies: this.state.options.cookies } : {}),
134
- });
135
-
136
- return new TaserApp(runtime, manifest) as unknown as TaserApp<TManifest, THasNotFound>;
137
- }
138
- }
139
-
140
- export function createTaserApp(
141
- options: CreateTaserAppOptions = {},
142
- ): TaserRouter<EmptyAppContext, false> {
143
- return new TaserRouter<EmptyAppContext, false>(options);
144
- }