@forinda/kickjs 6.4.0 → 6.5.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 (218) hide show
  1. package/dist/{adapter-BjxEv8oW.d.mts → adapter-CbMq-NBf.d.mts} +95 -341
  2. package/dist/adapter-CbMq-NBf.d.mts.map +1 -0
  3. package/dist/{app-module-BwYtACD6.d.mts → app-module-DtoySG6l.d.mts} +153 -31
  4. package/dist/app-module-DtoySG6l.d.mts.map +1 -0
  5. package/dist/application-Cl0JlmNY.mjs +12 -0
  6. package/dist/application-Cl0JlmNY.mjs.map +1 -0
  7. package/dist/{application-Bo3jSfmL.d.mts → application-zlzYGgKD.d.mts} +6 -6
  8. package/dist/application-zlzYGgKD.d.mts.map +1 -0
  9. package/dist/{bootstrap-DW2yzKh6.mjs → bootstrap-DzyWLYpU.mjs} +3 -3
  10. package/dist/{bootstrap-DW2yzKh6.mjs.map → bootstrap-DzyWLYpU.mjs.map} +1 -1
  11. package/dist/{bootstrap-DUUxZXvF.d.mts → bootstrap-Nzgi7K2d.d.mts} +2 -3
  12. package/dist/bootstrap-Nzgi7K2d.d.mts.map +1 -0
  13. package/dist/{cache-CwZzIH0D.d.mts → cache-C0qL0NSD.d.mts} +2 -1
  14. package/dist/cache-C0qL0NSD.d.mts.map +1 -0
  15. package/dist/config/index.d.mts +1 -1
  16. package/dist/config/index.mjs +2 -2
  17. package/dist/{config-BTDTXaeZ.mjs → config-CwFPFwsN.mjs} +3 -3
  18. package/dist/{config-BTDTXaeZ.mjs.map → config-CwFPFwsN.mjs.map} +1 -1
  19. package/dist/{container-iED1swkd.d.mts → container-BW_MlgLj.d.mts} +3 -2
  20. package/dist/container-BW_MlgLj.d.mts.map +1 -0
  21. package/dist/{container-Da9BLMHy.mjs → container-C7kmdVwh.mjs} +3 -3
  22. package/dist/{container-Da9BLMHy.mjs.map → container-C7kmdVwh.mjs.map} +1 -1
  23. package/dist/context-DQaUwwQM.mjs +12 -0
  24. package/dist/context-DQaUwwQM.mjs.map +1 -0
  25. package/dist/context-errors-97x9siRx.mjs +13 -0
  26. package/dist/context-errors-97x9siRx.mjs.map +1 -0
  27. package/dist/core/adapter.d.mts +1 -1
  28. package/dist/core/adapter.mjs +1 -1
  29. package/dist/core/app-module.d.mts +1 -1
  30. package/dist/core/app-module.mjs +1 -1
  31. package/dist/core/cache.d.mts +1 -1
  32. package/dist/core/cache.mjs +1 -1
  33. package/dist/core/container.d.mts +1 -1
  34. package/dist/core/container.mjs +2 -2
  35. package/dist/core/cron.mjs +2 -2
  36. package/dist/core/decorators.d.mts +1 -1
  37. package/dist/core/decorators.mjs +2 -2
  38. package/dist/core/errors.d.mts +1 -1
  39. package/dist/core/errors.mjs +1 -1
  40. package/dist/core/interfaces.d.mts +1 -1
  41. package/dist/core/interfaces.mjs +1 -1
  42. package/dist/core/logger.d.mts +2 -2
  43. package/dist/core/logger.mjs +2 -2
  44. package/dist/core/logger.mjs.map +1 -1
  45. package/dist/core/path.mjs +1 -1
  46. package/dist/core/plugin.d.mts +1 -1
  47. package/dist/core/plugin.mjs +1 -1
  48. package/dist/core/reactivity.d.mts +1 -1
  49. package/dist/core/reactivity.mjs +1 -1
  50. package/dist/core-CLmwVWlw.mjs +12 -0
  51. package/dist/core-CLmwVWlw.mjs.map +1 -0
  52. package/dist/{cors-C4aSCD3J.d.mts → cors-BuDU9CpA.d.mts} +1 -2
  53. package/dist/cors-BuDU9CpA.d.mts.map +1 -0
  54. package/dist/cron-DOOtTY4q.d.mts.map +1 -1
  55. package/dist/{csrf-Dlo-P8Il.mjs → csrf-BsrsObK-.mjs} +2 -2
  56. package/dist/{csrf-Dlo-P8Il.mjs.map → csrf-BsrsObK-.mjs.map} +1 -1
  57. package/dist/{csrf-7nUXGTuz.d.mts → csrf-vR23CJas.d.mts} +1 -2
  58. package/dist/csrf-vR23CJas.d.mts.map +1 -0
  59. package/dist/{decorators-wEJBqXHg.d.mts → decorators-Bks7cgBJ.d.mts} +12 -7
  60. package/dist/decorators-Bks7cgBJ.d.mts.map +1 -0
  61. package/dist/{disposables-rPSyh69r.mjs → disposables-D46xX96x.mjs} +2 -2
  62. package/dist/{disposables-rPSyh69r.mjs.map → disposables-D46xX96x.mjs.map} +1 -1
  63. package/dist/env-Biq_60jq.mjs +13 -0
  64. package/dist/{env-Ce-aYRxQ.mjs.map → env-Biq_60jq.mjs.map} +1 -1
  65. package/dist/{error-handler-3ih4E-QZ.d.mts → error-handler-Cr6Yt9as.d.mts} +5 -2
  66. package/dist/error-handler-Cr6Yt9as.d.mts.map +1 -0
  67. package/dist/{errors-n0H96eEz.d.mts → errors-By6UueCm.d.mts} +18 -9
  68. package/dist/errors-By6UueCm.d.mts.map +1 -0
  69. package/dist/handler-Ci1NMv-9.mjs +13 -0
  70. package/dist/handler-Ci1NMv-9.mjs.map +1 -0
  71. package/dist/{helmet-CKzZzeNl.d.mts → helmet-CFQUTVig.d.mts} +1 -2
  72. package/dist/helmet-CFQUTVig.d.mts.map +1 -0
  73. package/dist/http/application.d.mts +1 -1
  74. package/dist/http/application.mjs +2 -2
  75. package/dist/http/bootstrap.d.mts +1 -1
  76. package/dist/http/bootstrap.mjs +2 -2
  77. package/dist/http/context.d.mts +2 -2
  78. package/dist/http/context.mjs +2 -2
  79. package/dist/http/middleware/cors.d.mts +1 -1
  80. package/dist/http/middleware/cors.mjs +1 -1
  81. package/dist/http/middleware/csrf.d.mts +1 -1
  82. package/dist/http/middleware/csrf.mjs +2 -2
  83. package/dist/http/middleware/error-handler.d.mts +1 -1
  84. package/dist/http/middleware/error-handler.mjs +3 -2
  85. package/dist/http/middleware/error-handler.mjs.map +1 -1
  86. package/dist/http/middleware/helmet.d.mts +1 -1
  87. package/dist/http/middleware/helmet.mjs +1 -1
  88. package/dist/http/middleware/rate-limit.d.mts +1 -1
  89. package/dist/http/middleware/rate-limit.mjs +2 -2
  90. package/dist/http/middleware/request-id.d.mts +1 -1
  91. package/dist/http/middleware/request-id.mjs +1 -1
  92. package/dist/http/middleware/request-logger.d.mts +1 -1
  93. package/dist/http/middleware/request-logger.mjs +2 -2
  94. package/dist/http/middleware/session.d.mts +1 -1
  95. package/dist/http/middleware/session.mjs +2 -2
  96. package/dist/http/middleware/spa.d.mts +1 -1
  97. package/dist/http/middleware/spa.mjs +2 -2
  98. package/dist/http/middleware/spa.mjs.map +1 -1
  99. package/dist/http/middleware/upload.d.mts +1 -1
  100. package/dist/http/middleware/upload.mjs +2 -2
  101. package/dist/http/middleware/upload.mjs.map +1 -1
  102. package/dist/http/middleware/validate.d.mts +1 -1
  103. package/dist/http/middleware/validate.mjs +1 -1
  104. package/dist/http/middleware/views.d.mts +1 -1
  105. package/dist/http/middleware/views.mjs +2 -3
  106. package/dist/http/query/index.d.mts +1 -1
  107. package/dist/http/query/index.mjs +2 -2
  108. package/dist/http/router-builder.d.mts +1 -1
  109. package/dist/http/router-builder.mjs +2 -3
  110. package/dist/http/runtimes/fastify.d.mts +1 -2
  111. package/dist/http/runtimes/fastify.d.mts.map +1 -1
  112. package/dist/http/runtimes/fastify.mjs +3 -3
  113. package/dist/http/runtimes/fastify.mjs.map +1 -1
  114. package/dist/http/runtimes/h3-web.d.mts +1 -2
  115. package/dist/http/runtimes/h3-web.d.mts.map +1 -1
  116. package/dist/http/runtimes/h3-web.mjs +2 -2
  117. package/dist/http/runtimes/h3-web.mjs.map +1 -1
  118. package/dist/http/runtimes/h3.d.mts +1 -2
  119. package/dist/http/runtimes/h3.d.mts.map +1 -1
  120. package/dist/http/runtimes/h3.mjs +2 -2
  121. package/dist/{index-BtWJ9SLP.d.mts → index-BfT5KZ-M.d.mts} +2 -2
  122. package/dist/index-BfT5KZ-M.d.mts.map +1 -0
  123. package/dist/{index-D98NLfS5.d.mts → index-M6TF75MS.d.mts} +2 -3
  124. package/dist/index-M6TF75MS.d.mts.map +1 -0
  125. package/dist/index.d.mts +28 -28
  126. package/dist/index.mjs +2 -2
  127. package/dist/index.mjs.map +1 -1
  128. package/dist/{interfaces-CayXPOAf.d.mts → interfaces-BTTBdkvG.d.mts} +3 -2
  129. package/dist/interfaces-BTTBdkvG.d.mts.map +1 -0
  130. package/dist/{kv-stores-CAYc5VKm.mjs → kv-stores-BLJdf3Fn.mjs} +2 -2
  131. package/dist/{kv-stores-CAYc5VKm.mjs.map → kv-stores-BLJdf3Fn.mjs.map} +1 -1
  132. package/dist/{kv-stores-gQrfH0KQ.d.mts → kv-stores-CHowq8VP.d.mts} +5 -6
  133. package/dist/kv-stores-CHowq8VP.d.mts.map +1 -0
  134. package/dist/{logger-COlEkn_C.d.mts → logger-DA43DvNY.d.mts} +18 -3
  135. package/dist/logger-DA43DvNY.d.mts.map +1 -0
  136. package/dist/{metadata-BhKXlN2F.mjs → metadata-DUBbuHqY.mjs} +2 -2
  137. package/dist/{metadata-BhKXlN2F.mjs.map → metadata-DUBbuHqY.mjs.map} +1 -1
  138. package/dist/{module-registry-CvP9mee-.mjs → module-registry-aIt66if2.mjs} +2 -2
  139. package/dist/{module-registry-CvP9mee-.mjs.map → module-registry-aIt66if2.mjs.map} +1 -1
  140. package/dist/path-BVA9MfN1.d.mts.map +1 -1
  141. package/dist/query-CXN52dzy.mjs +12 -0
  142. package/dist/{query-Cs_Llg77.mjs.map → query-CXN52dzy.mjs.map} +1 -1
  143. package/dist/{rate-limit-oLL5EPUf.d.mts → rate-limit-Dme747JJ.d.mts} +1 -2
  144. package/dist/rate-limit-Dme747JJ.d.mts.map +1 -0
  145. package/dist/{reactivity-XL0fFDvG.d.mts → reactivity-BkMNA0kp.d.mts} +2 -2
  146. package/dist/reactivity-BkMNA0kp.d.mts.map +1 -0
  147. package/dist/{reply-edT8RGBB.mjs → reply-C1ljl6xS.mjs} +3 -3
  148. package/dist/{reply-edT8RGBB.mjs.map → reply-C1ljl6xS.mjs.map} +1 -1
  149. package/dist/{request-id-IDobbxU-.d.mts → request-id-CVzJ1uHD.d.mts} +1 -2
  150. package/dist/request-id-CVzJ1uHD.d.mts.map +1 -0
  151. package/dist/{request-logger-DZVW6VNI.d.mts → request-logger-BU4ulKLp.d.mts} +1 -2
  152. package/dist/request-logger-BU4ulKLp.d.mts.map +1 -0
  153. package/dist/router-builder-BbgVXuy3.mjs +12 -0
  154. package/dist/router-builder-BbgVXuy3.mjs.map +1 -0
  155. package/dist/{router-builder-CiS2ASTJ.d.mts → router-builder-CMGhEBU2.d.mts} +2 -3
  156. package/dist/router-builder-CMGhEBU2.d.mts.map +1 -0
  157. package/dist/{session-DSRA-PUX.d.mts → session-z9iewOXA.d.mts} +1 -2
  158. package/dist/session-z9iewOXA.d.mts.map +1 -0
  159. package/dist/{spa-Dp9onKJt.d.mts → spa-DsRUrm69.d.mts} +4 -9
  160. package/dist/spa-DsRUrm69.d.mts.map +1 -0
  161. package/dist/{upload-CIZc803m.d.mts → upload-XVTyQcNN.d.mts} +3 -3
  162. package/dist/upload-XVTyQcNN.d.mts.map +1 -0
  163. package/dist/{upload-config-C3MSF7RF.mjs → upload-config-Dd_QvlpC.mjs} +2 -2
  164. package/dist/{upload-config-C3MSF7RF.mjs.map → upload-config-Dd_QvlpC.mjs.map} +1 -1
  165. package/dist/{validate-DoZDOhCi.d.mts → validate-DMYpUnrf.d.mts} +1 -2
  166. package/dist/validate-DMYpUnrf.d.mts.map +1 -0
  167. package/dist/views-Dj6XFaca.mjs +12 -0
  168. package/dist/views-Dj6XFaca.mjs.map +1 -0
  169. package/dist/views-DsfBT1fR.d.mts +659 -0
  170. package/dist/views-DsfBT1fR.d.mts.map +1 -0
  171. package/dist/web.d.mts +4 -5
  172. package/dist/web.d.mts.map +1 -1
  173. package/dist/web.mjs +2 -2
  174. package/dist/web.mjs.map +1 -1
  175. package/package.json +10 -10
  176. package/dist/adapter-BjxEv8oW.d.mts.map +0 -1
  177. package/dist/app-module-BwYtACD6.d.mts.map +0 -1
  178. package/dist/application-Bo3jSfmL.d.mts.map +0 -1
  179. package/dist/application-TiHVcGRL.mjs +0 -12
  180. package/dist/application-TiHVcGRL.mjs.map +0 -1
  181. package/dist/bootstrap-DUUxZXvF.d.mts.map +0 -1
  182. package/dist/cache-CwZzIH0D.d.mts.map +0 -1
  183. package/dist/container-iED1swkd.d.mts.map +0 -1
  184. package/dist/context-Cs0939u1.mjs +0 -12
  185. package/dist/context-Cs0939u1.mjs.map +0 -1
  186. package/dist/contributor-runner-B3Z3Q7J5.mjs +0 -13
  187. package/dist/contributor-runner-B3Z3Q7J5.mjs.map +0 -1
  188. package/dist/core-CQ6u5kOq.mjs +0 -12
  189. package/dist/core-CQ6u5kOq.mjs.map +0 -1
  190. package/dist/cors-C4aSCD3J.d.mts.map +0 -1
  191. package/dist/csrf-7nUXGTuz.d.mts.map +0 -1
  192. package/dist/decorators-wEJBqXHg.d.mts.map +0 -1
  193. package/dist/env-Ce-aYRxQ.mjs +0 -13
  194. package/dist/error-handler-3ih4E-QZ.d.mts.map +0 -1
  195. package/dist/errors-n0H96eEz.d.mts.map +0 -1
  196. package/dist/handler-D8Zyie-B.mjs +0 -12
  197. package/dist/handler-D8Zyie-B.mjs.map +0 -1
  198. package/dist/helmet-CKzZzeNl.d.mts.map +0 -1
  199. package/dist/http/middleware/views.mjs.map +0 -1
  200. package/dist/http/router-builder.mjs.map +0 -1
  201. package/dist/index-BtWJ9SLP.d.mts.map +0 -1
  202. package/dist/index-D98NLfS5.d.mts.map +0 -1
  203. package/dist/interfaces-CayXPOAf.d.mts.map +0 -1
  204. package/dist/kv-stores-gQrfH0KQ.d.mts.map +0 -1
  205. package/dist/logger-COlEkn_C.d.mts.map +0 -1
  206. package/dist/query-Cs_Llg77.mjs +0 -12
  207. package/dist/rate-limit-oLL5EPUf.d.mts.map +0 -1
  208. package/dist/reactivity-XL0fFDvG.d.mts.map +0 -1
  209. package/dist/request-id-IDobbxU-.d.mts.map +0 -1
  210. package/dist/request-logger-DZVW6VNI.d.mts.map +0 -1
  211. package/dist/rolldown-runtime-Bzotz84Y.mjs +0 -11
  212. package/dist/router-builder-CiS2ASTJ.d.mts.map +0 -1
  213. package/dist/session-DSRA-PUX.d.mts.map +0 -1
  214. package/dist/spa-Dp9onKJt.d.mts.map +0 -1
  215. package/dist/upload-CIZc803m.d.mts.map +0 -1
  216. package/dist/validate-DoZDOhCi.d.mts.map +0 -1
  217. package/dist/views-DjgUXRdu.d.mts +0 -275
  218. package/dist/views-DjgUXRdu.d.mts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"handler-D8Zyie-B.mjs","names":[],"sources":["../src/http/web/driver.ts","../src/http/web/handler.ts"],"sourcesContent":["// Web-standard driver pair — the request/response bridge between web\n// primitives (WHATWG Request/Response) and the KickJS RequestContext surface.\n//\n// Deliberately imports NOTHING from node: this module is the edge-safe core\n// shared by the h3 v2 runtime (`runtimes/h3-web.ts`, node bootstrap) and the\n// `@forinda/kickjs/web` fetch entry (edge/Bun/Deno). See\n// `web-standards-edge-design.md` §3.1.\n\nimport type { RuntimeResponse } from '../runtime'\n\n/**\n * Presents a web `Request` as the express-shaped `req` object that\n * `RequestContext` (and route validation) reads: plain-object `headers`,\n * assignable `body`/`params`/`query`, and `on/once('close')` bridged from\n * the request's `AbortSignal` — the only EventEmitter surface the context\n * layer uses (`ctx.signal`, SSE close).\n */\nexport class WebRequestShim {\n readonly method: string\n readonly url: string\n /** Lower-cased plain header object (RequestContext indexes it directly). */\n readonly headers: Record<string, string>\n body: unknown\n params: Record<string, string> = {}\n query: Record<string, unknown> = {}\n requestId?: string\n file?: unknown\n files?: unknown;\n // Ad-hoc props middleware may set (session, user, ...) — index signature\n // keeps assignment open like a node req object.\n [key: string]: unknown\n\n private readonly signal: AbortSignal\n\n constructor(request: Request, url: URL) {\n this.method = request.method\n // Express-shaped `req.url` is path + search, not the absolute URL.\n this.url = url.pathname + url.search\n this.signal = request.signal\n const headers: Record<string, string> = {}\n request.headers.forEach((value, key) => {\n headers[key] = value\n })\n this.headers = headers\n const query: Record<string, unknown> = {}\n for (const key of url.searchParams.keys()) {\n const all = url.searchParams.getAll(key)\n query[key] = all.length > 1 ? all : all[0]\n }\n this.query = query\n }\n\n /** `req.once('close')` — abort of the underlying request signal. */\n once(event: string, listener: () => void): this {\n if (event === 'close') this.signal.addEventListener('abort', listener, { once: true })\n return this\n }\n\n /** `req.on('close')` — same bridge; signals only abort once anyway. */\n on(event: string, listener: () => void): this {\n return this.once(event, listener)\n }\n}\n\nconst encoder = new TextEncoder()\n\nfunction toBytes(chunk: unknown): Uint8Array {\n if (chunk instanceof Uint8Array) return chunk\n return encoder.encode(String(chunk))\n}\n\n/**\n * `RuntimeResponse` over a web `Response`.\n *\n * Two modes:\n * - **Buffered** (default): `status/json/send/type/setHeader` record state;\n * the terminal call resolves {@link ready} with a complete `Response`.\n * - **Streaming**: the first `writeHead`/`flushHeaders`/`write` call switches\n * to a `TransformStream` and resolves {@link ready} IMMEDIATELY with a\n * streamed `Response` — SSE works on edge this way; `write` feeds the\n * writer, `end` closes it.\n *\n * A class so the method table lives on a shared prototype (one allocation\n * per request — same rationale as the Fastify/h3 driver classes).\n */\nexport class WebResponseDriver implements RuntimeResponse {\n /** Resolves with the final (or streamed) Response. */\n readonly ready: Promise<Response>\n /** True once a terminal/streaming action produced the Response. */\n settled = false\n\n private _status = 200\n private readonly headers = new Headers()\n private _headersSent = false\n private writer?: WritableStreamDefaultWriter<Uint8Array>\n private resolveReady!: (response: Response) => void\n\n constructor(private readonly signal?: AbortSignal) {\n this.ready = new Promise<Response>((resolve) => {\n this.resolveReady = resolve\n })\n }\n\n status(code: number): this {\n this._status = code\n return this\n }\n\n json(data: unknown): this {\n if (!this.headers.has('content-type'))\n this.headers.set('content-type', 'application/json; charset=utf-8')\n return this.finish(JSON.stringify(data))\n }\n\n send(data: unknown): this {\n if (\n data !== undefined &&\n data !== null &&\n typeof data === 'object' &&\n !(data instanceof Uint8Array)\n ) {\n return this.json(data)\n }\n return this.finish(data as string | Uint8Array | null | undefined)\n }\n\n type(contentType: string): this {\n this.headers.set('content-type', contentType)\n return this\n }\n\n setHeader(name: string, value: unknown): this {\n if (Array.isArray(value)) {\n this.headers.delete(name)\n for (const v of value) this.headers.append(name, String(v))\n } else {\n this.headers.set(name, String(value))\n }\n return this\n }\n\n render(): never {\n throw new Error('ctx.render() is not supported on the web runtime (no view engine).')\n }\n\n writeHead(statusCode: number, headers?: Record<string, string | number | string[]>): this {\n this._status = statusCode\n if (headers) {\n for (const [name, value] of Object.entries(headers)) this.setHeader(name, value)\n }\n this.startStream()\n return this\n }\n\n flushHeaders(): this {\n this.startStream()\n return this\n }\n\n write(chunk: unknown): boolean {\n this.startStream()\n // Fire-and-forget: backpressure is absorbed by the stream's queue. Write\n // failures (client gone) surface via the abort listener, not here.\n void this.writer!.write(toBytes(chunk)).catch(() => {})\n return true\n }\n\n end(data?: unknown): this {\n if (this.writer) {\n if (data !== undefined) this.write(data)\n void this.writer.close().catch(() => {})\n this.writer = undefined\n return this\n }\n return this.finish(data as string | Uint8Array | null | undefined)\n }\n\n once(event: string, listener: (...args: unknown[]) => void): this {\n if (event === 'close' && this.signal)\n this.signal.addEventListener('abort', listener as () => void, { once: true })\n return this\n }\n\n get headersSent(): boolean {\n return this._headersSent\n }\n\n /** Buffered terminal: build the final Response exactly once. */\n private finish(body?: string | Uint8Array | null): this {\n if (this.settled) return this\n this.settled = true\n this._headersSent = true\n // 204/304 must not carry a body per the Response constructor contract.\n const bodyAllowed = this._status !== 204 && this._status !== 304\n this.resolveReady(\n new Response(bodyAllowed ? (body ?? null) : null, {\n status: this._status,\n headers: this.headers,\n }),\n )\n return this\n }\n\n /** Switch to streaming mode and resolve `ready` with the streamed Response. */\n private startStream(): void {\n if (this.writer || this.settled) return\n const { readable, writable } = new TransformStream<Uint8Array, Uint8Array>()\n this.writer = writable.getWriter()\n this.settled = true\n this._headersSent = true\n // Abort from the client tears the stream down so the writer stops queueing.\n this.signal?.addEventListener(\n 'abort',\n () => {\n void this.writer?.abort().catch(() => {})\n this.writer = undefined\n },\n { once: true },\n )\n this.resolveReady(new Response(readable, { status: this._status, headers: this.headers }))\n }\n}\n","// Engine-neutral web pipeline: run one KickJS RouteEntry against a WHATWG\n// Request and produce a WHATWG Response. Shared by the h3 v2 runtime\n// (node bootstrap) and the `@forinda/kickjs/web` fetch entry (edge/Bun/Deno).\n// Edge-safe: no node imports beyond the sanctioned ALS request store.\n\nimport { RequestContext } from '../context'\nimport { applyHandlerResult } from '../reply'\nimport { requestStore } from '../request-store'\nimport { createRequestStore, disposeRequestStore } from '../middleware/request-scope'\nimport { validate } from '../middleware/validate'\nimport { applyUploadConfig, type RawUploadPart } from '../middleware/upload-config'\nimport type { RouteEntry, RuntimeResponse } from '../runtime'\nimport { WebRequestShim, WebResponseDriver } from './driver'\n\nconst NOOP_NEXT = (): void => {}\nconst BODY_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE'])\n\nexport interface WebRouteInvocation {\n request: Request\n url: URL\n params: Record<string, string>\n}\n\nexport interface WebRouteHooks {\n /**\n * Error bridge — receives pipeline rejections (validation failures,\n * handler throws) with the shim + driver so an engine can dispatch the\n * framework's connect-style error handler. When absent (or when it\n * doesn't settle the driver), a minimal JSON error is produced from\n * `err.status`/`err.statusCode` (500 default).\n */\n onError?: (err: unknown, req: WebRequestShim, res: WebResponseDriver) => void | Promise<void>\n}\n\n/** Fallback error shape when no engine error handler settles the response. */\nfunction defaultErrorResponse(err: unknown, driver: WebResponseDriver): void {\n const status =\n typeof (err as { status?: number })?.status === 'number'\n ? (err as { status: number }).status\n : typeof (err as { statusCode?: number })?.statusCode === 'number'\n ? (err as { statusCode: number }).statusCode\n : 500\n const message =\n status >= 500 ? 'Internal Server Error' : ((err as Error)?.message ?? 'Request failed')\n driver.status(status).json({ error: message })\n}\n\n/**\n * Compile a RouteEntry into a `(invocation) => Promise<Response>` function.\n * Everything derivable at route-build time (validator, upload config) is\n * hoisted here — per-request work is shim + store + pipeline only.\n */\nexport function compileWebRoute(\n entry: RouteEntry,\n hooks?: WebRouteHooks,\n): (invocation: WebRouteInvocation) => Promise<Response> {\n const validator = entry.meta.validation ? validate(entry.meta.validation) : undefined\n const upload = entry.meta.upload && entry.meta.upload.mode !== 'none' ? entry.meta.upload : null\n\n return async ({ request, url, params }) => {\n const req = new WebRequestShim(request, url)\n req.params = params\n\n // Body: uploads consume the stream as FormData; everything else parses\n // by content-type. A failed parse leaves body undefined (validation\n // rejects it downstream if the route demands a shape).\n if (upload) {\n const form = await request.formData().catch(() => undefined)\n if (form) {\n const rawParts: RawUploadPart[] = []\n const fields: Record<string, unknown> = {}\n for (const [name, value] of form.entries()) {\n if (typeof value === 'string') {\n fields[name] = value\n } else {\n rawParts.push({\n fieldname: name,\n filename: value.name ?? '',\n mimetype: value.type || 'application/octet-stream',\n buffer: new Uint8Array(await value.arrayBuffer()) as unknown as Buffer,\n })\n }\n }\n const { file, files } = applyUploadConfig(rawParts, entry.meta.upload!)\n req.file = file\n req.files = files\n req.body = fields\n }\n } else if (BODY_METHODS.has(request.method)) {\n const contentType = req.headers['content-type'] ?? ''\n if (contentType.includes('application/json')) {\n req.body = await request.json().catch(() => undefined)\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n const text = await request.text().catch(() => '')\n req.body = Object.fromEntries(new URLSearchParams(text))\n } else if (contentType.startsWith('text/')) {\n req.body = await request.text().catch(() => undefined)\n }\n }\n\n const store = createRequestStore(req.headers['x-request-id'])\n req.requestId = store.requestId\n\n const driver = new WebResponseDriver(request.signal)\n driver.setHeader('x-request-id', store.requestId)\n\n const pipeline = requestStore.run(store, async () => {\n const ctx = new RequestContext(\n req as never,\n driver as never,\n NOOP_NEXT,\n driver as RuntimeResponse,\n )\n\n if (validator) {\n await new Promise<void>((resolve, reject) => {\n validator(req as never, undefined as never, (err?: unknown) =>\n err ? reject(err) : resolve(),\n )\n })\n }\n\n for (const mw of entry.middlewares) {\n let advanced = false\n await new Promise<void>((resolve, reject) => {\n const next = (err?: unknown): void => {\n advanced = true\n if (err) reject(err)\n else resolve()\n }\n Promise.resolve(mw(ctx, next)).catch(reject)\n })\n if (!advanced || driver.settled) return\n }\n\n if (entry.contributorRunner) await entry.contributorRunner(ctx)\n if (driver.settled) return\n const result = await entry.handler(ctx)\n // Return-value handlers (reply.ts): auto-send when nothing was written.\n // `undefined` falls through to the canonical 404 below.\n if (!driver.settled) applyHandlerResult(ctx, result)\n })\n\n try {\n // Streaming responses resolve `ready` mid-pipeline (SSE); buffered ones\n // resolve at the terminal ctx call. Race so both shapes return promptly.\n try {\n await Promise.race([pipeline, driver.ready])\n } catch (err) {\n if (!driver.settled) {\n if (hooks?.onError) await hooks.onError(err, req, driver)\n if (!driver.settled) defaultErrorResponse(err, driver)\n }\n }\n if (!driver.settled) {\n // Pipeline finished without responding — canonical 404 shape.\n driver.status(404).json({ error: 'Not Found' })\n }\n return await driver.ready\n } finally {\n // @PreDestroy teardown. For buffered responses this runs post-response;\n // for streams it runs when the pipeline (not the stream) completes —\n // stream lifetime is governed by the client abort signal.\n void Promise.resolve(pipeline)\n .catch(() => {})\n .then(() => disposeRequestStore(store))\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"helmet-CKzZzeNl.d.mts","names":[],"sources":["../src/http/middleware/helmet.ts"],"mappings":";;;;UAEiB,aAAA;;EAEf,qBAAA,aAAkC,MAAM;EAFZ;EAI5B,OAAA;EAFwC;EAIxC,UAAA;EAJkC;EAMlC,IAAA;IAAiB,MAAA;IAAiB,iBAAA;IAA6B,OAAA;EAAA;EAAA;EAE/D,WAAA;EAEA;EAAA,aAAA;EAIA;EAFA,cAAA;EAES;EAAT,SAAA;AAAA;;;;;;;;;;;;iBAcc,MAAA,CAAO,OAAA,GAAS,aAAA,IAAkB,GAAA,EAYnC,OAAA,EAAO,GAAA,EAAO,QAAA,EAAQ,IAAA,EAAQ,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"views.mjs","names":[],"sources":["../../../src/http/middleware/views.ts"],"sourcesContent":["import { resolve } from 'node:path'\nimport { Logger, defineAdapter } from '../../core'\n\nconst log = Logger.for('ViewEngine')\n\nexport interface ViewAdapterOptions {\n /**\n * Template engine — pass the engine module or a render function.\n * Supported engines: ejs, pug, handlebars, nunjucks, or any\n * Express-compatible engine with a __express property.\n *\n * @example\n * ```ts\n * import ejs from 'ejs'\n * ViewAdapter({ engine: ejs, ext: 'ejs' })\n *\n * import pug from 'pug'\n * ViewAdapter({ engine: pug, ext: 'pug' })\n * ```\n */\n engine: any\n\n /** File extension for templates (e.g., 'ejs', 'pug', 'hbs') */\n ext: string\n\n /** Directory containing template files (default: 'src/views') */\n viewsDir?: string\n\n /** Default layout template (optional — depends on engine) */\n layout?: string\n}\n\n/**\n * View/template adapter — pluggable template engine support for KickJS.\n *\n * Registers an Express view engine and sets the views directory.\n * Use `ctx.render()` in controllers to render templates.\n *\n * Migrated to the `defineAdapter()` factory in v4 — call without `new`.\n * The pre-v4 `new ViewAdapter({...})` form is gone; see\n * `docs/guide/migration-v3-to-v4.md` for the rename.\n *\n * @example\n * ```ts\n * import ejs from 'ejs'\n * import { ViewAdapter } from '@forinda/kickjs'\n *\n * bootstrap({\n * modules,\n * adapters: [\n * ViewAdapter({ engine: ejs, ext: 'ejs', viewsDir: 'src/views' }),\n * ],\n * })\n *\n * // In a controller:\n * @Get('/dashboard')\n * async dashboard(ctx: RequestContext) {\n * ctx.render('dashboard', { user: currentUser, title: 'Dashboard' })\n * }\n * ```\n */\nexport const ViewAdapter = defineAdapter<ViewAdapterOptions>({\n name: 'ViewAdapter',\n build: (options) => ({\n beforeMount({ app }) {\n const { engine, ext, viewsDir = 'src/views' } = options\n\n // Register the engine. Three resolution paths cover every\n // mainstream template engine + a fall-through for custom ones.\n if (engine.__express) {\n // EJS, Pug — have __express method\n app.engine(ext, engine.__express)\n } else if (typeof engine.renderFile === 'function') {\n // Engines with renderFile (nunjucks-style)\n app.engine(\n ext,\n (path: string, opts: any, callback: (err: Error | null, html?: string) => void) => {\n engine.renderFile(path, opts, callback)\n },\n )\n } else if (typeof engine === 'function') {\n // Custom render function: (path, options, callback) => void\n app.engine(ext, engine)\n } else {\n log.warn(`Engine for .${ext} does not have __express or renderFile. Trying as-is.`)\n app.engine(ext, engine)\n }\n\n app.set('view engine', ext)\n app.set('views', resolve(viewsDir))\n\n log.debug(`View engine: ${ext} (${resolve(viewsDir)})`)\n },\n }),\n})\n"],"mappings":";;;;;;;;;;iIAGA,MAAM,IAAM,OAAO,IAAI,YAAY,EA0DtB,YAAc,cAAkC,CAC3D,KAAM,cACN,MAAQ,UAAa,CACnB,YAAY,CAAE,KAAO,CACnB,GAAM,CAAE,OAAQ,IAAK,SAAW,aAAgB,QAI5C,OAAO,UAET,IAAI,OAAO,IAAK,OAAO,SAAS,EACvB,OAAO,OAAO,YAAe,WAEtC,IAAI,OACF,KACC,KAAc,KAAW,WAAyD,CACjF,OAAO,WAAW,KAAM,KAAM,QAAQ,CACxC,CACF,GACS,OAAO,QAAW,YAI3B,IAAI,KAAK,eAAe,IAAI,sDAAsD,EAFlF,IAAI,OAAO,IAAK,MAAM,GAMxB,IAAI,IAAI,cAAe,GAAG,EAC1B,IAAI,IAAI,QAAS,QAAQ,QAAQ,CAAC,EAElC,IAAI,MAAM,gBAAgB,IAAI,IAAI,QAAQ,QAAQ,EAAE,EAAE,CACxD,CACF,EACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"router-builder.mjs","names":[],"sources":["../../src/http/router-builder.ts"],"sourcesContent":["// Concrete-module imports (NOT the `../core` barrel): the barrel re-exports\n// the asset manager, whose eager `node:fs` import would poison the edge-safe\n// `@forinda/kickjs/web` entry graph that flows through this file.\nimport { buildPipeline, type SourcedRegistration } from '../core/contributor-pipeline'\nimport { runContributors } from '../core/contributor-runner'\nimport { Container } from '../core/container'\nimport { METADATA } from '../core/interfaces'\nimport type { ContributorRegistration } from '../core/context-decorator'\nimport type { FileUploadConfig, MiddlewareHandler, RouteDefinition } from '../core/decorators'\nimport { getClassMeta, getMethodMeta, getMethodMetaOrUndefined } from '../core/metadata'\nimport { duplicateRouteError } from '../core/kick-errors'\nimport type { CtxHandler, RouteEntry, RouteMethod } from './runtime'\n\n/**\n * Per-module SourcedRegistration[] threaded through the route-mount loop by\n * Application.setup(). Carries module + adapter + global contributors so\n * buildRouteTable() can merge them with class + method ones into a single pipeline.\n *\n * Module setup is sequential, so this slot is race-free. Cleared in a finally\n * block after each module mounts. Outside of Application setup the slot is\n * empty — direct buildRouteTable()/buildRoutes() callers (mostly tests) see only\n * class + method contributors unless they pass `externalSources` explicitly.\n *\n * Same idiom as `Container._requestStoreProvider`: an internal escape hatch for\n * cross-module wiring without inversion-of-control gymnastics.\n *\n * @internal\n */\nlet _externalContributorSources: readonly SourcedRegistration[] = []\n\n/** @internal — set by Application.setup() before each `mod.routes()` call. */\nexport function _setExternalContributorSources(sources: readonly SourcedRegistration[]): void {\n _externalContributorSources = sources\n}\n\n/**\n * Boot-time duplicate-route guard shared by the node and web mount loops.\n *\n * Registers `METHOD /mounted/path` into `registry` and throws\n * {@link duplicateRouteError} (KICK006) if another handler already claimed\n * it. Param *names* are ignored — `/tasks/:id` and `/tasks/:taskId` are the\n * same route at dispatch time, so they collide here too.\n *\n * @internal\n */\nexport function assertRouteUnique(\n registry: Map<string, string>,\n method: string,\n fullPath: string,\n owner: string,\n): void {\n const key = `${method.toUpperCase()} ${fullPath.replace(/:[^/]+/g, ':*')}`\n const prior = registry.get(key)\n if (prior !== undefined) {\n throw duplicateRouteError(method.toUpperCase(), fullPath, owner, prior)\n }\n registry.set(key, owner)\n}\n\nexport interface BuildRoutesOptions {\n /**\n * Extra contributors to merge into the per-route pipeline at their declared\n * precedence levels. Pass explicitly when calling buildRouteTable/buildRoutes\n * outside the Application route-mount loop (typically in tests). When omitted,\n * falls back to the slot set by Application.setup().\n */\n externalSources?: readonly SourcedRegistration[]\n}\n\n/**\n * Turn a controller class decorated with @Get, @Post, etc. into a plain-data\n * {@link RouteEntry}[] — the engine-neutral route table an {@link HttpRuntime}\n * materializes (see `docs/http/spec-http-runtimes.md`, Avenue B).\n *\n * What used to be per-handler Express `(req, res, next)` closures is now\n * captured as data: `middlewares` keep their `(ctx, next)` shape, the contributor\n * pipeline is pre-built into a `contributorRunner` closure, validation / upload\n * stay as metadata, and the terminal `handler` resolves the controller per-request\n * (to respect DI scoping) and invokes it. The runtime owns how these get wrapped\n * onto its engine.\n *\n * Routes use only the method-level decorator paths (e.g. @Get('/me') → '/me').\n * The @Controller path is NOT baked in — it is metadata for Swagger/introspection.\n * The module's routes().path is the single source of truth for the mount prefix,\n * which avoids path doubling when both the module and controller specify the path.\n *\n * The contributor pipeline is built here, so a cycle or missing `dependsOn`\n * throws at table-build time (boot) rather than on first request.\n */\nexport function buildRouteTable(\n controllerClass: any,\n options: BuildRoutesOptions = {},\n): RouteEntry[] {\n const container = Container.getInstance()\n const externalSources = options.externalSources ?? _externalContributorSources\n const routes: RouteDefinition[] = getClassMeta<RouteDefinition[]>(\n METADATA.ROUTES,\n controllerClass,\n [],\n )\n\n // Class-level middleware\n const classMiddlewares: MiddlewareHandler[] = getClassMeta<MiddlewareHandler[]>(\n METADATA.CLASS_MIDDLEWARES,\n controllerClass,\n [],\n )\n\n // Class-level Context Contributors (#107) — applied to every method on the\n // controller. Method-level contributors are added per-route below.\n const classContributors: ContributorRegistration[] = getClassMeta<ContributorRegistration[]>(\n METADATA.CLASS_CONTRIBUTORS,\n controllerClass,\n [],\n )\n\n const entries: RouteEntry[] = []\n\n for (const route of routes) {\n const method = route.method.toUpperCase() as RouteMethod\n const fullPath = route.path || '/'\n\n // Method-level middleware\n const methodMiddlewares: MiddlewareHandler[] = getMethodMeta<MiddlewareHandler[]>(\n METADATA.METHOD_MIDDLEWARES,\n controllerClass,\n route.handlerName,\n [],\n )\n\n // @FileUpload decorator — runtime supplies the upload backend.\n const fileUploadConfig = getMethodMetaOrUndefined<FileUploadConfig>(\n METADATA.FILE_UPLOAD,\n controllerClass,\n route.handlerName,\n )\n\n // Context Contributor pipeline (#107) — class + method contributors,\n // built once at mount time so cycle/missing-dep failures abort boot.\n const methodContributors: ContributorRegistration[] = getMethodMeta<ContributorRegistration[]>(\n METADATA.METHOD_CONTRIBUTORS,\n controllerClass,\n route.handlerName,\n [],\n )\n\n let contributorRunner: CtxHandler | null = null\n if (\n classContributors.length > 0 ||\n methodContributors.length > 0 ||\n externalSources.length > 0\n ) {\n // Labels are surfaced in DuplicateContributorError messages — include\n // the registration's key + the original index so a same-key collision\n // at one precedence level points at the conflicting decorator slot,\n // not just the host method/class.\n const sources: SourcedRegistration[] = [\n ...methodContributors.map(\n (registration, i): SourcedRegistration => ({\n source: 'method',\n registration,\n label: `${controllerClass.name}.${String(route.handlerName)}#${i}(${registration.key})`,\n }),\n ),\n ...classContributors.map(\n (registration, i): SourcedRegistration => ({\n source: 'class',\n registration,\n label: `${controllerClass.name}.@class#${i}(${registration.key})`,\n }),\n ),\n ...externalSources,\n ]\n const pipeline = buildPipeline(sources, {\n route: `${method} ${fullPath}`,\n })\n contributorRunner = (ctx) => runContributors({ pipeline, ctx, container })\n }\n\n // Terminal handler — resolve controller per-request to respect DI scoping.\n const handler: CtxHandler = (ctx) => container.resolve(controllerClass)[route.handlerName](ctx)\n\n entries.push({\n method,\n path: fullPath,\n middlewares: [...classMiddlewares, ...methodMiddlewares],\n contributorRunner,\n handler,\n meta: {\n controller: controllerClass,\n handlerName: route.handlerName,\n validation: route.validation,\n upload: fileUploadConfig,\n },\n })\n }\n\n return entries\n}\n"],"mappings":";;;;;;;;;;6TA4BA,IAAI,4BAA8D,CAAC,EAGnE,SAAgB,+BAA+B,QAA+C,CAC5F,4BAA8B,OAChC,CAYA,SAAgB,kBACd,SACA,OACA,SACA,MACM,CACN,IAAM,IAAM,GAAG,OAAO,YAAY,EAAE,GAAG,SAAS,QAAQ,UAAW,IAAI,IACjE,MAAQ,SAAS,IAAI,GAAG,EAC9B,GAAI,QAAU,IAAA,GACZ,MAAM,oBAAoB,OAAO,YAAY,EAAG,SAAU,MAAO,KAAK,EAExE,SAAS,IAAI,IAAK,KAAK,CACzB,CAgCA,SAAgB,gBACd,gBACA,QAA8B,CAAC,EACjB,CACd,IAAM,UAAY,UAAU,YAAY,EAClC,gBAAkB,QAAQ,iBAAmB,4BAC7C,OAA4B,aAChC,SAAS,OACT,gBACA,CAAC,CACH,EAGM,iBAAwC,aAC5C,SAAS,kBACT,gBACA,CAAC,CACH,EAIM,kBAA+C,aACnD,SAAS,mBACT,gBACA,CAAC,CACH,EAEM,QAAwB,CAAC,EAE/B,IAAK,IAAM,SAAS,OAAQ,CAC1B,IAAM,OAAS,MAAM,OAAO,YAAY,EAClC,SAAW,MAAM,MAAQ,IAGzB,kBAAyC,cAC7C,SAAS,mBACT,gBACA,MAAM,YACN,CAAC,CACH,EAGM,iBAAmB,yBACvB,SAAS,YACT,gBACA,MAAM,WACR,EAIM,mBAAgD,cACpD,SAAS,oBACT,gBACA,MAAM,YACN,CAAC,CACH,EAEI,kBAAuC,KAC3C,GACE,kBAAkB,OAAS,GAC3B,mBAAmB,OAAS,GAC5B,gBAAgB,OAAS,EACzB,CAsBA,IAAM,SAAW,cAAc,CAhB7B,GAAG,mBAAmB,KACnB,aAAc,KAA4B,CACzC,OAAQ,SACR,aACA,MAAO,GAAG,gBAAgB,KAAK,GAAG,OAAO,MAAM,WAAW,EAAE,GAAG,EAAE,GAAG,aAAa,IAAI,EACvF,EACF,EACA,GAAG,kBAAkB,KAClB,aAAc,KAA4B,CACzC,OAAQ,QACR,aACA,MAAO,GAAG,gBAAgB,KAAK,UAAU,EAAE,GAAG,aAAa,IAAI,EACjE,EACF,EACA,GAAG,eAEgC,EAAG,CACtC,MAAO,GAAG,OAAO,GAAG,UACtB,CAAC,EACD,kBAAqB,KAAQ,gBAAgB,CAAE,SAAU,IAAK,SAAU,CAAC,CAC3E,CAGA,IAAM,QAAuB,KAAQ,UAAU,QAAQ,eAAe,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAE9F,QAAQ,KAAK,CACX,OACA,KAAM,SACN,YAAa,CAAC,GAAG,iBAAkB,GAAG,iBAAiB,EACvD,kBACA,QACA,KAAM,CACJ,WAAY,gBACZ,YAAa,MAAM,YACnB,WAAY,MAAM,WAClB,OAAQ,gBACV,CACF,CAAC,CACH,CAEA,OAAO,OACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BtWJ9SLP.d.mts","names":[],"sources":["../src/http/query/types.ts","../src/http/query/parse-query.ts"],"mappings":";;;KACY,cAAA;AAAA,cAaC,gBAAA,EAAgB,GAAA;AAAA,UAcZ,UAAA;EACf,KAAA;EACA,QAAA,EAAU,cAAc;EACxB,KAAA;AAAA;AAAA,UAGe,QAAA;EACf,KAAA;EACA,SAAS;AAAA;AAAA,UAGM,gBAAA;EACf,IAAA;EACA,KAAA;EACA,MAAA;AAAA;;;;AAXK;AAGP;UAgBiB,WAAA;EACf,OAAA,EAAS,UAAA;EACT,IAAA,EAAM,QAAA;EACN,UAAA,EAAY,gBAAA;EACZ,MAAA;AAAA;;;;;;;AAZM;AAQR;KAeY,QAAA,iBACM,gBAAA,oEAEd,OAAA,0BAAiC,CAAA,4BACjC,CAAA,kBACE,CAAA,YAEF,OAAA;EAAkB,OAAA;AAAA,IAChB,CAAA,8BACQ,CAAA;;;;;;;;;;;AApBN;AAWR;;;;;;UA8BiB,gBAAA,iBACC,gBAAA,sBACR,WAAA;EACR,OAAA,EAAS,KAAA,CAAM,UAAA;IAAe,KAAA,EAAO,QAAA,CAAS,OAAA;EAAA;EAC9C,IAAA,EAAM,KAAA,CAAM,QAAA;IAAa,KAAA,EAAO,QAAA,CAAS,OAAA;EAAA;AAAA;;;;;;;;;;;KAa/B,gBAAA,GAAmB,sBAAA,GAAyB,sBAAsB;AAAA,UAE7D,sBAAA;EACf,UAAA;EACA,QAAA;EACA,UAAA;AAAA;;;;;UAOe,sBAAA;EACf,OAAA,EAAS,MAAA;EACT,QAAA,GAAW,MAAM;EACjB,aAAA;EAAA,CACC,GAAA;AAAA;;UAIc,iBAAA;EACf,IAAA,EAAM,CAAC;EACP,IAAA;IACE,IAAA;IACA,KAAA;IACA,KAAA;IACA,UAAA;IACA,OAAA;IACA,OAAA;EAAA;AAAA;;;;;;;AAzC8C;AAalD;;;;AAA8E;AAE9E;;;;;;;;AAGY;AAOZ;;UA2CiB,mBAAA;EAzCE;EAAA,SA2CR,IAAA;EA5CA;;;;;EAmDT,KAAA,CAAM,MAAA,EAAQ,WAAA,EAAa,MAAA,EAAQ,OAAA,GAAU,OAAA;AAAA;;;AA/K/C;;;;AAA0B;AAA1B,KCkBY,iBAAA;AAAA,UAEK,cAAA;EACf,IAAA;EACA,KAAA;EACA,MAAA,EAAQ,iBAAiB;AAAA;AAAA,UAGV,iBAAA;;EAEf,QAAA;EDAA;ECEA,YAAA;EDDU;ECGV,eAAA;EDFK;AAAA;AAGP;;;ECKE,QAAA,IAAY,SAAA,EAAW,cAAc;AAAA;AAAA,UAG7B,oBAAA;EACR,QAAA;EACA,YAAA;EACA,eAAA;EACA,WAAA;AAAA;;;ADJM;AAQR;iBCYgB,uBAAA,CACd,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,oBAAA;;iBAQR,uBAAA,IAA2B,QAAQ,CAAC,oBAAA;;;;;;;iBAUpC,yBAAA;;iBAOA,YAAA,CACd,WAAA,iCACA,aAAA,aACA,OAAA,GAAU,IAAA,CAAK,iBAAA,gBACd,UAAA;;iBAqCa,SAAA,CACd,SAAA,iCACA,aAAA,aACA,OAAA,GAAU,IAAA,CAAK,iBAAA,gBACd,QAAA;;iBA8Ba,eAAA,CACd,MAAA;EACE,IAAA;EACA,KAAA;AAAA,GAEF,OAAA,GAAU,IAAA,CAAK,iBAAA,iCACd,gBAAA;;iBAqBa,gBAAA,CACd,CAAA,sBACA,OAAA,GAAU,IAAI,CAAC,iBAAA;;;;;;;;;;;;;;;;;;;;;;ADtHF;AAqBf;;;;;;;iBCmKgB,UAAA,iBAA2B,gBAAA,0BACzC,KAAA,EAAO,MAAA,eACP,WAAA,GAAc,OAAA,EACd,OAAA,GAAU,iBAAA,GACT,gBAAA,CAAiB,OAAA;;iBAcJ,gBAAA,CACd,MAAA,EAAQ,OAAA,CAAQ,WAAA,IACf,MAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-D98NLfS5.d.mts","names":[],"sources":["../src/config/env.ts","../src/config/config-service.ts"],"mappings":";;;;;;;;AAGgD;;;iBA6EvC,kBAAA,IAAkB,CAAA,CAAA,SAAA;;;;;;;;;;KAWf,aAAA,GAAgB,UAAU,QAAQ,kBAAA;;;;;;;;;;;cAsBjC,aAAA,EAAe,aAUT;;;;;;;;;;;;;AAhCnB;;;;AAAgE;AAsBhE;;;;AAUmB;AAoCnB;;;;;;;;iBAAgB,SAAA,WAAoB,CAAA,CAAE,WAAA,EACpC,MAAA,GAAS,IAAA,SAAa,aAAA,KAAkB,CAAA,CAAE,SAAA,CAAU,CAAA,IACnD,CAAA,CAAE,SAAA,QAAiB,aAAA,CAAc,KAAA,GAAQ,CAAA;;;;;;;;;;;;;;;;;;;AAAC;AAgC7C;;;;iBAAgB,OAAA,WAAkB,CAAA,CAAE,SAAA,OAAgB,MAAA,EAAQ,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA;AAAA,iBACxD,OAAA,KAAY,MAAA,oBAA0B,GAAA,GAAM,OAAA;;;;;;;;;;;;;AADa;AACzE;;;;;;;;iBAqCgB,MAAA,WAAiB,MAAA,EAAQ,GAAA,EAAK,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,iBAC1C,MAAA,WAAiB,CAAA,CAAE,SAAA,gCAAyC,CAAA,CAAE,KAAA,CAAM,CAAA,GAClF,GAAA,EAAK,CAAA,EACL,MAAA,EAAQ,CAAA,GACP,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAA;;;AAzCqD;AAqCnE;;;;;;;;;;;;iBAyBgB,SAAA;;;;AAzB2C;AAC3D;;iBAuDgB,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AApDD;AAqBf;;;;AAAyB;AA+BzB;iBAsCgB,iBAAA,UACd,MAAA,EAAQ,OAAA,mBACS,OAAA,GAAU,MAAA,oBAA0B,iBAAA,CAAkB,OAAA;;;AAxC5C;AAsC7B;;;;KAyBY,GAAA;EACV,IAAA;EACA,QAAA;EACA,SAAA;AAAA;;;;;;AA9V8C;;;;KCS3C,SAAA,sBAA+B,MAAA,oBAA0B,CAAA,GAAI,CAAA,GAAI,MAAA;;;;;;;KAQjE,WAAA,wBAAmC,CAAA,SAAU,MAAA,GAAS,OAAA,CAAQ,CAAA,IAAK,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;cA2B3D,aAAA;;AD4Cb;;;;AAAgE;AAsBhE;;;;AAUmB;AAoCnB;;cClGc,GAAA;EDkGwB;;;;;;;;;ECrFpC,GAAA,4BAA+B,GAAA,EAAK,SAAA,CAAU,CAAA,IAAK,WAAA,CAAY,CAAA,EAAG,CAAA;EDqFhC;;;;;EC5ElC,MAAA,KAAW,MAAA,oBAA0B,QAAA,CAAS,MAAA,iBAAuB,QAAA,CAAS,OAAA;ED6E1B;ECxEpD,MAAA;EAMA,YAAA;EAIA,aAAA;EAIA,MAAA;AAAA;;;AD2D2C;AAgC7C;UClFiB,kBAAA,cAAgC,MAAA;EAC/C,GAAA,0BAA6B,IAAA,EAAM,GAAA,EAAK,CAAA,GAAI,IAAA,CAAK,CAAA;EACjD,MAAA,IAAU,QAAA,CAAS,IAAA;EACnB,MAAA;EACA,YAAA;EACA,aAAA;EACA,MAAA;AAAA;;;;;;;;;;AD4EuE;AACzE;;;;;;;;;;;;AAAmE;AAqCnE;;;;;iBCnFgB,mBAAA,WAA8B,CAAA,CAAE,SAAA,OAAgB,MAAA,EAAQ,CAAA;EAAA,QAqC5D,kBAAA,CAAkB,CAAA,CAAA,MAAA,CAAA,CAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"interfaces-CayXPOAf.d.mts","names":[],"sources":["../src/core/interfaces.ts"],"mappings":";;;aAGY,KAAA;EACV,SAAA;EACA,SAAA;;EAEA,OAAA;AAAA;;KAIU,WAAA,oBAA+B,IAAA,YAAgB,CAAC;;KAGhD,YAAA,aAAyB,CAAA,GAAI,OAAA,CAAQ,CAAA;AAHjD;AAAA,UAMiB,cAAA;EACf,KAAA,GAAQ,KAAK;AAAA;;KAIH,SAAA,oBACE,CAAA,IAAK,CAAA,CAAE,CAAA,UAAW,QAAA,WAAmB,CAAA,MAAO,KAAA,EAAO,CAAA,CAAE,CAAA,MAAO,SAAA,CAAU,CAAA;EAC9E,KAAA,IAAS,CAAA;AAAA;;UAGE,SAAA;EACf,OAAA,IAAW,SAAS,CAAC,CAAA;AAAA;;KAIX,SAAA;;KAWA,mBAAA;;;;;AA7BsC;AAGlD;;;;AACe;AAIf;;;;;;;;cAyCa,QAAA;EAAA,SACX,UAAA;EAAA,SACA,KAAA;EAAA,SACA,UAAA;EAAA,SACA,SAAA;EAAA,SACA,MAAA;EAAA,SACA,cAAA;EAAA,SACA,WAAA;EAAA,SACA,OAAA;EAAA,SACA,YAAA;EAAA,SACA,MAAA;EAAA,SACA,iBAAA;EAAA,SACA,kBAAA;EAAA,SACA,kBAAA;EAAA,SACA,mBAAA;EAAA,SACA,WAAA;EAAA,SACA,KAAA;EAAA,SACA,KAAA;EAAA,SAEA,WAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kv-stores-gQrfH0KQ.d.mts","names":[],"sources":["../src/http/reply.ts","../src/http/middleware/rate-limit-guard.ts","../src/http/middleware/kv-stores.ts"],"mappings":";;;;;;;cAeM,WAAA;;;;;AALyC;UAY9B,KAAA;EAAA,UACL,WAAA;EAAA,SACD,MAAA,EAAQ,CAAA;EAAA,SACR,IAAA,EAAM,CAAA;AAAA;;;;;;;;;;;iBAaD,KAAA,sBAA2B,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,GAAI,KAAA,CAAM,CAAA,EAAG,CAAA;AAAA,kBAAzD,KAAA;EAAA,iBAKE,IAAA,EAAQ,CAAA,KAAI,KAAA,MAAW,CAAA;EAAA,kBAEtB,IAAA,EAAQ,CAAA,KAAI,KAAA,MAAW,CAAA;EAAA,qBAEpB,KAAA;AAAA;AATtB;;;;;;;;;;;;;;AAAA,KAyBY,oBAAA,MAA0B,CAAA,cAAc,IAAA,0BAC/C,OAAA,CAAQ,OAAA,CAAQ,CAAA,kDAEf,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,CAAA;AAAA,KAG7B,WAAA,MAAiB,CAAA,SAAU,KAAA,oBAAyB,CAAA,GAAI,CAAA;AAAA,iBAE7C,OAAA,CAAQ,KAAA,YAAiB,KAAA,IAAS,KAAK;;;;AAjCmB;;;;;;;;iBAoD1D,kBAAA,CAAmB,GAAA,EAAK,cAAc,EAAE,MAAA;;;UCjFvC,qBAAA;;EAEf,GAAA;EDII;ECFJ,QAAA;;EAEA,OAAA;EDA4C;ECE5C,UAAA;EDKoB;;;;;ECCpB,YAAA,IAAgB,GAAA,EAAK,cAAA;EDEL;ECAhB,OAAA;EDHgD;;;;;ECShD,KAAA,GAAQ,cAAA;EDNQ;ECQhB,IAAA,IAAQ,GAAA,EAAK,cAAA;AAAA;;;;;;;;;;;;;;;;iBAkEC,cAAA,CAAe,OAAA,GAAS,qBAAA,GAA6B,iBAAiB;;;;;;;ADzFvC;;;;AAKD;AAO9C;;;;;;;UEDiB,MAAA;EACf,GAAA,CAAI,GAAA,WAAc,OAAA;EAClB,GAAA,CAAI,GAAA,UAAa,KAAA,UAAe,OAAA;IAAY,aAAA;EAAA,IAA2B,OAAA;EACvE,MAAA,CAAO,GAAA,WAAc,OAAA;AAAA;AAAA,UAQN,uBAAA;EFPC;EEShB,QAAA;EFIc;EEFd,MAAM;AAAA;;;;;;;;;;;cAaK,gBAAA,YAA4B,cAAA;EAAA,iBAKpB,EAAA;EAAA,iBAJF,MAAA;EAAA,iBACA,QAAA;EAEjB,WAAA,CACmB,EAAA,EAAI,MAAA,EACrB,OAAA,EAAS,uBAAA;EAML,SAAA,CAAU,GAAA,WAAc,OAAA;IAAU,SAAA;IAAmB,SAAA,EAAW,IAAA;EAAA;EAahE,SAAA,CAAU,GAAA,WAAc,OAAA;EAQxB,KAAA,CAAM,GAAA,WAAc,OAAA;EAAA,QAIZ,IAAA;EAAA,QAUA,KAAA;AAAA;AAAA,UAOC,qBAAA;EF1DyB;EE4DxC,MAAM;AAAA;;;;;;;;;;;cAaK,cAAA,YAA0B,YAAA;EAAA,iBAIlB,EAAA;EAAA,iBAHF,MAAA;EAEjB,WAAA,CACmB,EAAA,EAAI,MAAA,EACrB,OAAA,GAAS,qBAAA;EAKL,GAAA,CAAI,GAAA,WAAc,OAAA,CAAQ,WAAA;EAU1B,GAAA,CAAI,GAAA,UAAa,IAAA,EAAM,WAAA,EAAa,MAAA,WAAiB,OAAA;EAMrD,OAAA,CAAQ,GAAA,WAAc,OAAA;EAItB,KAAA,CAAM,GAAA,UAAa,MAAA,WAAiB,OAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger-COlEkn_C.d.mts","names":[],"sources":["../src/core/logger.ts"],"mappings":";;;AA+BA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQwD;UARvC,cAAA;EACf,IAAA,CAAK,GAAA,aAAgB,IAAA;EACrB,IAAA,CAAK,GAAA,aAAgB,IAAA;EACrB,KAAA,CAAM,GAAA,aAAgB,IAAA;EACtB,KAAA,CAAM,GAAA,aAAgB,IAAA;EACtB,KAAA,EAAO,GAAA,aAAgB,IAAA;EACvB,KAAA,EAAO,GAAA,aAAgB,IAAA;EA+CvB;EA7CA,KAAA,CAAM,QAAA;IAAY,SAAA;EAAA,IAAsB,cAAc;AAAA;;;;;;;;;;;;;;cAyC3C,qBAAA,YAAiC,cAAc;EAAA,QAClD,MAAA;EAAA,QACA,QAAA;EAER,WAAA,CAAY,MAAA;EAAA,QAMJ,GAAA;EAgCU;EAAA,QAvBV,OAAA;EAIR,IAAA,CAAK,GAAA,aAAgB,IAAA;EAGrB,IAAA,CAAK,GAAA,aAAgB,IAAA;EAGrB,KAAA,CAAM,GAAA,aAAgB,IAAA;EAGtB,KAAA,CAAM,GAAA,aAAgB,IAAA;EAGtB,KAAA,CAAM,GAAA,aAAgB,IAAA;EAGtB,KAAA,CAAM,GAAA,aAAgB,IAAA;EAItB,KAAA,CAAM,QAAA;IAAY,SAAA;EAAA,IAAsB,cAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;cAoC7B,MAAA;EAAA,QACH,SAAA;EAAA,QACA,gBAAA;EAAA,QACA,KAAA;EA0EF;EAAA,eAvES,gBAAA;EAEf,WAAA,CAAY,IAAA;EA+EZ;EAAA,YAxEY,QAAA;EAwEU;;;;;;;;AASI;AAO5B;EAhBwB,OAtDf,WAAA,CAAY,QAAA,EAAU,cAAA;;SAOtB,WAAA,IAAe,cAAA;EA+D0B;;;;EAAA,OAvDzC,aAAA;;SAOA,GAAA,CAAI,IAAA,WAAe,MAAA;;EAU1B,KAAA,CAAM,IAAA,WAAe,MAAA;EAIrB,IAAA,CAAK,GAAA,aAAgB,IAAA;EAIrB,IAAA,CAAK,GAAA,aAAgB,IAAA;EAIrB,KAAA,CAAM,QAAA,OAAe,GAAA,cAAiB,IAAA;EAUtC,KAAA,CAAM,GAAA,aAAgB,IAAA;EAItB,KAAA,CAAM,GAAA,aAAgB,IAAA;EAKtB,KAAA,CAAM,GAAA,aAAgB,IAAA;AAAA;;iBAOR,YAAA,CAAa,IAAA,WAAe,MAAM"}
@@ -1,12 +0,0 @@
1
- /**
2
- * @forinda/kickjs v6.4.0
3
- *
4
- * Copyright (c) Felix Orinda
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE file in the root directory of this source tree.
8
- *
9
- * @license MIT
10
- */
11
- const FILTER_OPERATORS=new Set([`eq`,`neq`,`gt`,`gte`,`lt`,`lte`,`between`,`in`,`contains`,`starts`,`ends`]),BUILTIN_DEFAULTS={maxLimit:100,defaultLimit:20,maxSearchLength:200,defaultPage:1},defaults={...BUILTIN_DEFAULTS};function setQueryParsingDefaults(partial){partial.maxLimit!==void 0&&(defaults.maxLimit=partial.maxLimit),partial.defaultLimit!==void 0&&(defaults.defaultLimit=partial.defaultLimit),partial.maxSearchLength!==void 0&&(defaults.maxSearchLength=partial.maxSearchLength)}function getQueryParsingDefaults(){return{...defaults}}function resetQueryParsingDefaults(){Object.assign(defaults,BUILTIN_DEFAULTS)}function parseFilters(filterParam,allowedFields,options){if(!filterParam)return[];let items=Array.isArray(filterParam)?filterParam:[filterParam],results=[],allowed=allowedFields?new Set(allowedFields):null,onReject=options?.onReject;for(let item of items){let firstColon=item.indexOf(`:`);if(firstColon===-1)continue;let secondColon=item.indexOf(`:`,firstColon+1);if(secondColon===-1)continue;let field=item.slice(0,firstColon),operator=item.slice(firstColon+1,secondColon),value=item.slice(secondColon+1);if(!(!field||!value)){if(!FILTER_OPERATORS.has(operator)){onReject?.({kind:`filter`,field,reason:`unknown-operator`});continue}if(allowed&&!allowed.has(field)){onReject?.({kind:`filter`,field,reason:`field-not-allowed`});continue}results.push({field,operator,value})}}return results}function parseSort(sortParam,allowedFields,options){if(!sortParam)return[];let items=Array.isArray(sortParam)?sortParam:[sortParam],results=[],allowed=allowedFields?new Set(allowedFields):null,onReject=options?.onReject;for(let item of items){let lastColon=item.lastIndexOf(`:`);if(lastColon===-1)continue;let field=item.slice(0,lastColon),dir=item.slice(lastColon+1).toLowerCase();if(field&&!(dir!==`asc`&&dir!==`desc`)){if(allowed&&!allowed.has(field)){onReject?.({kind:`sort`,field,reason:`field-not-allowed`});continue}results.push({field,direction:dir})}}return results}function parsePagination(params,options){let defaultLimit=options?.defaultLimit??defaults.defaultLimit,maxLimit=options?.maxLimit??defaults.maxLimit,page=typeof params.page==`string`?Number.parseInt(params.page,10):params.page??defaults.defaultPage,limit=typeof params.limit==`string`?Number.parseInt(params.limit,10):params.limit??defaultLimit;return(Number.isNaN(page)||page<1)&&(page=defaults.defaultPage),(Number.isNaN(limit)||limit<1)&&(limit=defaultLimit),limit>maxLimit&&(limit=maxLimit),{page,limit,offset:(page-1)*limit}}function parseSearchQuery(q,options){if(!q)return``;let maxLen=options?.maxSearchLength??defaults.maxSearchLength,trimmed=q.trim();return trimmed.length>maxLen?(options?.onReject?.({kind:`search`,field:`q`,reason:`truncated`}),trimmed.slice(0,maxLen)):trimmed}function normalizeFieldConfig(config){if(config)return`columns`in config&&config.columns&&typeof config.columns==`object`?{filterable:Object.keys(config.columns),sortable:config.sortable?Object.keys(config.sortable):void 0,searchable:void 0}:config}function parseQuery(query,fieldConfig,options){let normalized=normalizeFieldConfig(fieldConfig),rejectOpts=options?.onReject?{onReject:options.onReject}:void 0;return{filters:parseFilters(query.filter,normalized?.filterable,rejectOpts),sort:parseSort(query.sort,normalized?.sortable,rejectOpts),pagination:parsePagination({page:query.page,limit:query.limit},options),search:parseSearchQuery(query.q,options)}}function buildQueryParams(parsed){let params={};return parsed.filters?.length&&(params.filter=parsed.filters.map(f=>`${f.field}:${f.operator}:${f.value}`)),parsed.sort?.length&&(params.sort=parsed.sort.map(s=>`${s.field}:${s.direction}`)),parsed.pagination&&(params.page=parsed.pagination.page,params.limit=parsed.pagination.limit),parsed.search&&(params.q=parsed.search),params}export{parseQuery as a,resetQueryParsingDefaults as c,parsePagination as i,setQueryParsingDefaults as l,getQueryParsingDefaults as n,parseSearchQuery as o,parseFilters as r,parseSort as s,buildQueryParams as t,FILTER_OPERATORS as u};
12
- //# sourceMappingURL=query-Cs_Llg77.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limit-oLL5EPUf.d.mts","names":[],"sources":["../src/http/middleware/rate-limit.ts"],"mappings":";;;;UAIiB,cAAA;EACf,SAAA,CAAU,GAAA,WAAc,OAAA;IAAU,SAAA;IAAmB,SAAA,EAAW,IAAA;EAAA;EAChE,SAAA,CAAU,GAAA,WAAc,OAAA;EACxB,KAAA,CAAM,GAAA,WAAc,OAAA;AAAA;AAAA,UAGL,gBAAA;EAHY;EAK3B,GAAA;EAPA;EASA,QAAA;EATwB;EAWxB,OAAA;EAXqD;EAarD,UAAA;EAZA;EAcA,YAAA,IAAgB,GAAA,EAAK,OAAA;EAdG;EAgBxB,OAAA;EAfM;EAiBN,KAAA,GAAQ,cAAA;EAjBmB;EAmB3B,IAAA,IAAQ,GAAA,EAAK,OAAA;EAhBE;EAkBf,SAAA;AAAA;;;;;;;;;;;;;;;;;;;;;iBAsFc,SAAA,CAAU,OAAA,GAAS,gBAAA,IAAqB,GAAA,EAWnC,OAAA,EAAO,GAAA,EAAO,QAAA,EAAQ,IAAA,EAAQ,YAAA,KAAY,OAAA,QAAA,QAAA,MAAA,MAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"reactivity-XL0fFDvG.d.mts","names":[],"sources":["../src/core/reactivity.ts"],"mappings":";;;AAgFA;;;;UAAiB,GAAA;EACf,KAAA,EAAO,CAAA;EASG;EAPV,SAAA,CAAU,EAAA,GAAK,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,CAAA;EAO3B;;;;;;EAAX,MAAA,IAAU,CAAA;AAAA;;;;;;AAAC;AAab;;;;iBAAgB,GAAA,IAAO,YAAA,EAAc,CAAA,GAAI,GAAA,CAAI,CAAA;AAAA,UAuC5B,WAAA;EAAA,SACN,KAAA,EAAO,CAAA;EAxC0B;;;;;EA8C1C,MAAA,IAAU,CAAC;EA9CiC;AAAA;AAuC9C;;;;;;EAgBE,OAAA;AAAA;;;;AAAO;AAeT;;;;;;;;iBAAgB,QAAA,IAAY,MAAA,QAAc,CAAA,GAAI,WAAA,CAAY,CAAA;AAAA,UA4DzC,YAAA;EA5DW;EA8D1B,SAAS;AAAA;AAAA,KAGN,WAAA,MAAiB,GAAA,CAAI,CAAA,IAAK,WAAA,CAAY,CAAA,WAAY,CAAA;AAjEI;AA4D3D;;;;AAEW;AACV;;;;;;;;AA/D0D,iBAiF3C,KAAA,IACd,MAAA,EAAQ,WAAA,CAAY,CAAA,GACpB,QAAA,GAAW,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,CAAA,WAClC,OAAA,GAAU,YAAA;AAAA,iBAwDI,QAAA,WAAmB,MAAA,eAAqB,MAAA,EAAQ,CAAA,GAAI,CAAA;;iBA8BpD,KAAA,CAAM,KAAA,QAAa,KAAA,IAAS,GAAG;;iBAK/B,KAAA,IAAS,KAAA,EAAO,GAAA,CAAI,CAAA,IAAK,CAAA,GAAI,CAAA;;iBAK7B,MAAA,WAAiB,MAAA,eAAqB,GAAA,EAAK,CAAA,iBAAkB,CAAA,GAAI,GAAA,CAAI,CAAA,CAAE,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-id-IDobbxU-.d.mts","names":[],"sources":["../src/http/middleware/request-id.ts"],"mappings":";;;;cAEa,iBAAA;;AAAb;;;;AAA8B;AAY9B;;;;iBAAgB,SAAA,KAAS,GAAA,EACV,OAAA,EAAO,GAAA,EAAO,QAAA,EAAQ,IAAA,EAAQ,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-logger-DZVW6VNI.d.mts","names":[],"sources":["../src/http/middleware/request-logger.ts"],"mappings":";;;;UAGiB,oBAAA;;EAEf,IAAA;EAFmC;EAInC,KAAA;EAJmC;EAMnC,IAAA;AAAA;;;AAAI;AAmBN;;;;;;;;;;;;;iBAAgB,aAAA,CAAc,OAAA,GAAS,oBAAA,IAAyB,GAAA,EAKjD,OAAA,EAAO,GAAA,EAAO,QAAA,EAAQ,IAAA,EAAQ,YAAA"}
@@ -1,11 +0,0 @@
1
- /**
2
- * @forinda/kickjs v6.4.0
3
- *
4
- * Copyright (c) Felix Orinda
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE file in the root directory of this source tree.
8
- *
9
- * @license MIT
10
- */
11
- import{createRequire}from"node:module";var __require=createRequire(import.meta.url);export{__require as t};
@@ -1 +0,0 @@
1
- {"version":3,"file":"router-builder-CiS2ASTJ.d.mts","names":[],"sources":["../src/http/router-builder.ts"],"mappings":";;;;;iBA+BgB,8BAAA,CAA+B,OAAuC,WAArB,mBAAmB;;;;AAAE;AActF;;;;;;iBAAgB,iBAAA,CACd,QAAA,EAAU,GAAG,kBACb,MAAA,UACA,QAAA,UACA,KAAA;AAAA,UAUe,kBAAA;EAVf;;AAAa;AAUf;;;EAOE,eAAA,YAA2B,mBAAmB;AAAA;AAuBhD;;;;;;;;;AAGa;;;;;;;;;;;AAHb,iBAAgB,eAAA,CACd,eAAA,OACA,OAAA,GAAS,kBAAA,GACR,UAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-DSRA-PUX.d.mts","names":[],"sources":["../src/http/middleware/session.ts"],"mappings":";;;;UAKiB,WAAA;EAAA,CACd,GAAW;AAAA;AAAA,UAGG,YAAA;EACf,GAAA,CAAI,GAAA,WAAc,OAAA,CAAQ,WAAA;EAC1B,GAAA,CAAI,GAAA,UAAa,IAAA,EAAM,WAAA,EAAa,MAAA,WAAiB,OAAA;EACrD,OAAA,CAAQ,GAAA,WAAc,OAAA;EACtB,KAAA,EAAO,GAAA,UAAa,MAAA,WAAiB,OAAA;AAAA;AAAA,UAGtB,OAAA;EACf,EAAA;EACA,IAAA,EAAM,WAAA;EACN,UAAA,IAAc,OAAA;EACd,OAAA,IAAW,OAAA;EACX,IAAA,IAAQ,OAAA;AAAA;AAAA,UAGO,cAAA;EAX6B;EAa5C,MAAA;EAhBI;EAkBJ,UAAA;EAlB0B;EAoB1B,MAAA;EAnBI;EAqBJ,OAAA;EArBiB;EAuBjB,iBAAA;EAvBqD;EAyBrD,MAAA;IACE,QAAA;IACA,MAAA;IACA,QAAA;IACA,IAAA;IACA,MAAA;EAAA;EA5B0C;EA+B5C,KAAA,GAAQ,YAAY;AAAA;;;;;;;;;;;;;;;;;;;AAvBL;AAGjB;;;;;iBA2JgB,OAAA,CAAQ,OAAA,EAAS,cAAA,IAAc,GAAA,EAoB1B,OAAA,EAAO,GAAA,EAAO,QAAA,EAAQ,IAAA,EAAQ,YAAA,KAAY,OAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spa-Dp9onKJt.d.mts","names":[],"sources":["../src/http/middleware/spa.ts"],"mappings":";;;;UAMiB,iBAAA;;AAAjB;;;;;;;;;;AAiDmB;AAkCnB;EArEE,SAAA;;;;;;;;;;;EAYA,SAAA;EA0DA;;;;;;;;;EA/CA,OAAA;EAiEA;;;;EA3DA,YAAA;EAoGc;;;;EA9Fd,iBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAkCW,UAAA,YAAsB,UAAA;EAAA,QASb,OAAA;EARpB,IAAA;EAAA,QACQ,SAAA;EAAA,QACA,WAAA;EAAA,QACA,YAAA;EAAA,QACA,YAAA;EAAA,QACA,iBAAA;EAAA,QACA,SAAA;EAER,WAAA,CAAoB,OAAA,GAAS,iBAAA;EAU7B,WAAA;IAAc;EAAA,GAAO,cAAA;EAyCrB,WAAA;IAAc;EAAA,GAAO,cAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"upload-CIZc803m.d.mts","names":[],"sources":["../src/http/middleware/upload-config.ts","../src/http/middleware/upload.ts"],"mappings":";;;;;;;;;;AAuEA;;;;AAAgD;AAchD;iBAdgB,gBAAA,CAAiB,KAAe;;;;;;;;iBAchC,mBAAA,CACd,YAAA,EAAc,iBAAA,kBACd,aAAA,GAAgB,MAAM,oBACpB,QAAA,UAAkB,QAAA;;UAYL,gBAAA;EACf,SAAA;EACA,YAAA;EACA,QAAA;EACA,QAAA;EACA,IAAA;EACA,MAAA,EAAQ,MAAM;AAAA;;UAIC,aAAA;EACf,SAAA;EACA,QAAA;EACA,QAAA;EACA,MAAA,EAAQ,MAAM;AAAA;;;;;;;;iBAYA,iBAAA,CACd,KAAA,EAAO,aAAA,IACP,MAAA,EAAQ,gBAAA;EACL,IAAA,GAAO,gBAAA;EAAkB,KAAA,GAAQ,gBAAA;AAAA;;;;;AA1DtC;;;UCtBiB,aAAA,SAAsB,iBAAiB;EDsBR;ECpB9C,OAAA,GAAU,OAAA;EDkCuB;EChCjC,IAAA;AAAA;;;;;;;;ADmCoC;AAYtC;;;;iBCLS,MAAA,CAAO,SAAA,UAAmB,OAAA,GAAS,aAAA,GAAqB,cAAc;;;;iBAQtE,KAAA,CAAM,SAAA,UAAmB,QAAA,WAAe,OAAA,GAAS,aAAA,GAAqB,cAAc;;;;iBAQpF,IAAA,CAAK,OAAA,GAAS,aAAA,GAAqB,cAAc;ADD1D;;;;;;;;;;AAIgB;AAYhB;;;AAhBA,iBCoBgB,YAAA,KAAY,GAAA,EACb,OAAA,EAAO,GAAA,EAAO,QAAA,EAAQ,IAAA,EAAQ,YAAA;;;;;;iBA+B7B,qBAAA,CAAsB,MAAA,EAAQ,gBAAA,GAAmB,cAAc;;cAmBlE,MAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-DoZDOhCi.d.mts","names":[],"sources":["../src/http/middleware/validate.ts"],"mappings":";;;;UAMiB,gBAAA;EACf,IAAA;EACA,KAAA;EACA,MAAA;AAAA;;;;;;AAAM;AAgDR;;;;;;;iBAAgB,QAAA,CAAS,MAAA,EAAQ,gBAAA,IAAgB,GAAA,EAClC,OAAA,EAAO,IAAA,EAAQ,QAAA,EAAQ,IAAA,EAAQ,YAAA"}
@@ -1,275 +0,0 @@
1
-
2
- import { f as DepValue, o as ContextDecorator, s as ContextDecoratorSpec, v as MetaValue } from "./app-module-BwYtACD6.mjs";
3
- import { F as AdapterFactory, T as RequestContext, f as HttpRuntime, m as RouteEntry } from "./adapter-BjxEv8oW.mjs";
4
- import { t as BuildRoutesOptions } from "./router-builder-CiS2ASTJ.mjs";
5
- import { Express, NextFunction, Request, Response, Router } from "express";
6
- import { AsyncLocalStorage } from "node:async_hooks";
7
-
8
- //#region src/http/cluster.d.ts
9
- interface ClusterOptions {
10
- /** Number of worker processes (default: os.cpus().length) */
11
- workers?: number;
12
- /** Delay before forcefully killing a worker during shutdown (ms), default: 5000 */
13
- gracefulShutdownTimeout?: number;
14
- /** Delay between worker restarts (ms), default: 1000 */
15
- restartDelay?: number;
16
- /** Max failures in restartWindow before refusing to restart, default: 5 */
17
- maxFailures?: number;
18
- /** Time window for counting failures (ms), default: 30000 */
19
- restartWindow?: number;
20
- }
21
- /** Returns true if the current process is the cluster primary */
22
- declare function isClusterPrimary(): boolean;
23
- //#endregion
24
- //#region src/http/define-http-context-decorator.d.ts
25
- /**
26
- * Curried form returned by {@link DefineHttpContextDecoratorFn.withParams}.
27
- * Spell only the per-call params shape `P`; `K` and `D` are inferred
28
- * from the spec, and `Ctx` is locked to `RequestContext`.
29
- */
30
- interface DefineHttpContextDecoratorWithParams<P extends Record<string, unknown>> {
31
- <K extends string, D extends Record<string, DepValue> = Record<string, never>>(spec: ContextDecoratorSpec<K, D, P, RequestContext>): ContextDecorator<K, D, P, RequestContext>;
32
- }
33
- /**
34
- * Public shape of {@link defineHttpContextDecorator} — the positional
35
- * call signature plus the curried `.withParams<P>()` helper that fixes
36
- * partial-inference for the parameterised case.
37
- */
38
- interface DefineHttpContextDecoratorFn {
39
- <K extends string, D extends Record<string, DepValue> = Record<string, never>, P extends Record<string, unknown> = Record<string, never>>(spec: ContextDecoratorSpec<K, D, P, RequestContext>): ContextDecorator<K, D, P, RequestContext>;
40
- /**
41
- * Curried entry point. Spell only `P`; `K` and `D` infer from the
42
- * spec. `Ctx` is locked to `RequestContext`.
43
- *
44
- * ```ts
45
- * const LoadTenant = defineHttpContextDecorator.withParams<{
46
- * source: 'header' | 'subdomain'
47
- * }>()({
48
- * key: 'tenant',
49
- * deps: { repo: TENANT_REPO }, // D inferred
50
- * paramDefaults: { source: 'header' },
51
- * resolve: (ctx, { repo }, params) => repo.findFor(ctx, params),
52
- * })
53
- * ```
54
- */
55
- withParams<P extends Record<string, unknown>>(): DefineHttpContextDecoratorWithParams<P>;
56
- }
57
- declare const defineHttpContextDecorator: DefineHttpContextDecoratorFn;
58
- //#endregion
59
- //#region src/http/runtimes/express.d.ts
60
- /**
61
- * Materialize a controller's {@link RouteEntry}[] onto a fresh `express.Router`.
62
- * Reproduces the legacy handler ordering precisely: validation → upload →
63
- * `(ctx, next)` middleware → contributor runner → terminal handler. Each step
64
- * constructs its own `RequestContext` over the same `req`/`res` — request-scoped
65
- * state lives in the AsyncLocalStorage store, not on the ctx instance, so the
66
- * per-step instances share state exactly as before.
67
- */
68
- declare function materializeRouter(entries: RouteEntry[]): Router;
69
- /**
70
- * Build an Express Router from a controller class decorated with @Get, @Post,
71
- * etc. The public, back-compatible entry point: a thin shim over
72
- * {@link buildRouteTable} + {@link materializeRouter}. Returns an
73
- * `express.Router` exactly as before — modules pass it to `app.use(path, router)`.
74
- *
75
- * @see buildRouteTable for the engine-neutral route-table form.
76
- */
77
- declare function buildRoutes(controllerClass: any, options?: BuildRoutesOptions): Router;
78
- /**
79
- * The default HTTP runtime. Express stays a peer dependency of `@forinda/kickjs`;
80
- * apps that pass no `runtime` get this and behave exactly as before.
81
- */
82
- declare function expressRuntime(): HttpRuntime<Express>;
83
- //#endregion
84
- //#region src/http/request-store.d.ts
85
- /** Per-request storage for REQUEST-scoped DI and request context propagation */
86
- interface RequestStore {
87
- /** Unique request identifier */
88
- requestId: string;
89
- /**
90
- * Per-request singleton cache for REQUEST-scoped services. Keys are
91
- * heterogeneous (class constructors, `InjectionToken` objects, raw
92
- * strings), so the map type stays `Map<any, any>`.
93
- */
94
- instances: Map<any, any>;
95
- /**
96
- * Per-request key/value bag. Canonical backing store for
97
- * `RequestContext.set/get` and the Context Contributor pipeline (#107)
98
- * since Phase 3. Anything written here is visible to every concrete
99
- * execution context constructed for the same request, regardless of
100
- * which middleware/contributor wrote it.
101
- *
102
- * Keys are constrained to `string` per the locked decision in
103
- * `architecture.md` §20.12 (#4); the value type is `unknown` because
104
- * the concrete shape at each key is determined by the consumer's
105
- * `ContextMeta` augmentation, not by the store itself.
106
- *
107
- * Prefer the {@link getRequestValue} helper over reaching into this
108
- * map directly — it threads the augmented `ContextMeta` shape through
109
- * `MetaValue<K>` so consumers get typed reads without an `as` cast.
110
- * Writes should flow through `ctx.set(key, value)` or a Context
111
- * Contributor's return value — see the `setRequestValue` note below
112
- * for why this package intentionally does NOT ship a service-level
113
- * write helper.
114
- */
115
- values: Map<string, unknown>;
116
- /** Set once {@link disposeRequestStore} has run — guards double-dispose. */
117
- disposed?: boolean;
118
- }
119
- /** AsyncLocalStorage instance shared across the framework */
120
- declare const requestStore: AsyncLocalStorage<RequestStore>;
121
- /**
122
- * Get the current request store. Throws if called outside a request context.
123
- * Used by the Container to resolve REQUEST-scoped dependencies.
124
- */
125
- declare function getRequestStore(): RequestStore;
126
- /**
127
- * Read a per-request `ContextMeta`-keyed value from outside a controller
128
- * (services, repositories, anywhere with no `ctx` reference). Returns
129
- * the augmented type for the key — `MetaValue<K>` — so consumers get the
130
- * same static safety as `ctx.get(key)` without holding the context.
131
- *
132
- * Returns `undefined` outside an active request frame (background jobs,
133
- * startup code, tests without `requestScopeMiddleware()`) — the helper
134
- * is intentionally null-tolerant so calling it from a service that
135
- * runs in both request and non-request paths doesn't throw.
136
- *
137
- * @example
138
- * ```ts
139
- * declare module '@forinda/kickjs' {
140
- * interface ContextMeta { tenant: { id: string; name: string } }
141
- * }
142
- *
143
- * @Service()
144
- * class AuditService {
145
- * log(action: string) {
146
- * const tenant = getRequestValue('tenant') // typed: { id; name } | undefined
147
- * db.audit.insert({ action, tenantId: tenant?.id })
148
- * }
149
- * }
150
- * ```
151
- */
152
- declare function getRequestValue<K extends string>(key: K): MetaValue<K> | undefined;
153
- //#endregion
154
- //#region src/http/middleware/request-scope.d.ts
155
- /**
156
- * Wraps each request in an AsyncLocalStorage context.
157
- * Enables REQUEST-scoped DI and automatic requestId propagation to logs.
158
- *
159
- * Should be mounted early in the middleware pipeline (before route handlers).
160
- * `Application` mounts this automatically unless `contextStore: 'manual'` is set
161
- * or the user already includes one in their middleware list.
162
- */
163
- declare function requestScopeMiddleware(): (req: Request, res: Response, next: NextFunction) => void;
164
- //#endregion
165
- //#region src/http/middleware/trace-context.d.ts
166
- /**
167
- * W3C Trace Context header name.
168
- * @see https://www.w3.org/TR/trace-context/#traceparent-header
169
- */
170
- declare const TRACEPARENT_HEADER = "traceparent";
171
- interface TraceContextOptions {
172
- /**
173
- * When true, respond with a `traceresponse` header containing the trace ID.
174
- * Useful for debugging. Default: false.
175
- */
176
- propagateResponse?: boolean;
177
- }
178
- /**
179
- * Parsed W3C trace context fields.
180
- */
181
- interface TraceContext {
182
- /** W3C traceparent version (usually '00') */
183
- version: string;
184
- /** 32-hex-char distributed trace ID */
185
- traceId: string;
186
- /** 16-hex-char parent span ID */
187
- parentSpanId: string;
188
- /** 2-hex-char trace flags */
189
- flags: string;
190
- }
191
- /**
192
- * Parse a W3C traceparent header value.
193
- * Returns null if the format is invalid.
194
- */
195
- declare function parseTraceparent(header: string): TraceContext | null;
196
- /**
197
- * Middleware that extracts W3C `traceparent` header and stores trace context
198
- * in the request's AsyncLocalStorage store.
199
- *
200
- * If no valid `traceparent` header is present, a new traceId is generated
201
- * so that every request always has a trace ID available for correlation.
202
- *
203
- * Must be mounted **after** `requestScopeMiddleware()` (which creates the store).
204
- *
205
- * @example
206
- * ```ts
207
- * bootstrap({
208
- * middleware: [
209
- * requestScopeMiddleware(),
210
- * traceContext(), // extracts or generates traceId
211
- * requestLogger(),
212
- * express.json(),
213
- * ],
214
- * })
215
- * ```
216
- */
217
- declare function traceContext(options?: TraceContextOptions): (req: Request, res: Response, next: NextFunction) => void;
218
- //#endregion
219
- //#region src/http/middleware/views.d.ts
220
- interface ViewAdapterOptions {
221
- /**
222
- * Template engine — pass the engine module or a render function.
223
- * Supported engines: ejs, pug, handlebars, nunjucks, or any
224
- * Express-compatible engine with a __express property.
225
- *
226
- * @example
227
- * ```ts
228
- * import ejs from 'ejs'
229
- * ViewAdapter({ engine: ejs, ext: 'ejs' })
230
- *
231
- * import pug from 'pug'
232
- * ViewAdapter({ engine: pug, ext: 'pug' })
233
- * ```
234
- */
235
- engine: any;
236
- /** File extension for templates (e.g., 'ejs', 'pug', 'hbs') */
237
- ext: string;
238
- /** Directory containing template files (default: 'src/views') */
239
- viewsDir?: string;
240
- /** Default layout template (optional — depends on engine) */
241
- layout?: string;
242
- }
243
- /**
244
- * View/template adapter — pluggable template engine support for KickJS.
245
- *
246
- * Registers an Express view engine and sets the views directory.
247
- * Use `ctx.render()` in controllers to render templates.
248
- *
249
- * Migrated to the `defineAdapter()` factory in v4 — call without `new`.
250
- * The pre-v4 `new ViewAdapter({...})` form is gone; see
251
- * `docs/guide/migration-v3-to-v4.md` for the rename.
252
- *
253
- * @example
254
- * ```ts
255
- * import ejs from 'ejs'
256
- * import { ViewAdapter } from '@forinda/kickjs'
257
- *
258
- * bootstrap({
259
- * modules,
260
- * adapters: [
261
- * ViewAdapter({ engine: ejs, ext: 'ejs', viewsDir: 'src/views' }),
262
- * ],
263
- * })
264
- *
265
- * // In a controller:
266
- * @Get('/dashboard')
267
- * async dashboard(ctx: RequestContext) {
268
- * ctx.render('dashboard', { user: currentUser, title: 'Dashboard' })
269
- * }
270
- * ```
271
- */
272
- declare const ViewAdapter: AdapterFactory<ViewAdapterOptions, unknown>;
273
- //#endregion
274
- export { ClusterOptions as _, TraceContextOptions as a, requestScopeMiddleware as c, getRequestValue as d, requestStore as f, defineHttpContextDecorator as g, materializeRouter as h, TraceContext as i, RequestStore as l, expressRuntime as m, ViewAdapterOptions as n, parseTraceparent as o, buildRoutes as p, TRACEPARENT_HEADER as r, traceContext as s, ViewAdapter as t, getRequestStore as u, isClusterPrimary as v };
275
- //# sourceMappingURL=views-DjgUXRdu.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"views-DjgUXRdu.d.mts","names":[],"sources":["../src/http/cluster.ts","../src/http/define-http-context-decorator.ts","../src/http/runtimes/express.ts","../src/http/request-store.ts","../src/http/middleware/request-scope.ts","../src/http/middleware/trace-context.ts","../src/http/middleware/views.ts"],"mappings":";;;;;;;;UAOiB,cAAA;;EAEf,OAAA;;EAEA,uBAAA;;EAEA,YAAA;;EAEA,WAAA;;EAEA,aAAA;AAAA;;iBAIc,gBAAA;;;;;;;;UCuDC,oCAAA,WAA+C,MAAA;EAAA,6BACjC,MAAA,SAAe,QAAA,IAAY,MAAA,iBACtD,IAAA,EAAM,oBAAA,CAAqB,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,cAAA,IACnC,gBAAA,CAAiB,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,cAAA;AAAA;;;;;;UAQd,4BAAA;EAAA,6BAGH,MAAA,SAAe,QAAA,IAAY,MAAA,2BAC3B,MAAA,oBAA0B,MAAA,iBAEpC,IAAA,EAAM,oBAAA,CAAqB,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,cAAA,IACnC,gBAAA,CAAiB,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,cAAA;EAfc;AAQ7C;;;;;;;;;;;;;;EAwBE,UAAA,WAAqB,MAAA,sBAA4B,oCAAA,CAAqC,CAAA;AAAA;AAAA,cAW3E,0BAAA,EAA4B,4BAQR;;;;;;;;;;;iBC3FjB,iBAAA,CAAkB,OAAA,EAAS,UAAA,KAAe,MAAM;;;;;;;;;iBAiEhD,WAAA,CAAY,eAAA,OAAsB,OAAA,GAAS,kBAAA,GAA0B,MAAM;;AFjG3F;;;iBEyGgB,cAAA,IAAkB,WAAW,CAAC,OAAA;;;;UC5G7B,YAAA;;EAEf,SAAA;;;;;;EAMA,SAAA,EAAW,GAAA;;;;;;;;;;;AHLb;;;;;;;;;;EG0BE,MAAA,EAAQ,GAAG;EHZG;EGcd,QAAA;AAAA;;cAIW,YAAA,EAAY,iBAAA,CAAA,YAAA;;;;AFqCzB;iBE/BgB,eAAA,IAAmB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoC/B,eAAA,mBAAkC,GAAA,EAAK,CAAA,GAAI,SAAA,CAAU,CAAA;;;;;AH1ErE;;;;;;iBIyFgB,sBAAA,KAAsB,GAAA,EACnB,OAAA,EAAO,GAAA,EAAO,QAAA,EAAQ,IAAA,EAAQ,YAAA;;;;;;;cCxFpC,kBAAA;AAAA,UAKI,mBAAA;;;;;EAKf,iBAAiB;AAAA;;;;UAMF,YAAA;;EAEf,OAAA;;EAEA,OAAA;;EAEA,YAAA;ELxB6B;EK0B7B,KAAA;AAAA;;;;;iBAqBc,gBAAA,CAAiB,MAAA,WAAiB,YAAY;;ALrC/C;AAIf;;;;AAAgC;;;;ACuDhC;;;;;;;;;;;iBIoBgB,YAAA,CAAa,OAAA,GAAS,mBAAA,IAAwB,GAAA,EAC/C,OAAA,EAAO,GAAA,EAAO,QAAA,EAAQ,IAAA,EAAQ,YAAA;;;UC5F5B,kBAAA;;;;;;;;;;;;;;;EAef,MAAA;;EAGA,GAAA;;EAGA,QAAA;;EAGA,MAAA;AAAA;;;;;;;;;;ANZa;AAIf;;;;AAAgC;;;;ACuDhC;;;;;;;;;;;cKfa,WAAA,EAAW,cAAA,CAAA,kBAAA"}