@c9up/ream 0.1.3

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 (451) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/Application.d.ts +71 -0
  4. package/dist/Application.d.ts.map +1 -0
  5. package/dist/Application.js +151 -0
  6. package/dist/Application.js.map +1 -0
  7. package/dist/Codemods.d.ts +16 -0
  8. package/dist/Codemods.d.ts.map +1 -0
  9. package/dist/Codemods.js +277 -0
  10. package/dist/Codemods.js.map +1 -0
  11. package/dist/ConfigLoader.d.ts +29 -0
  12. package/dist/ConfigLoader.d.ts.map +1 -0
  13. package/dist/ConfigLoader.js +43 -0
  14. package/dist/ConfigLoader.js.map +1 -0
  15. package/dist/ErrorBoundary.d.ts +51 -0
  16. package/dist/ErrorBoundary.d.ts.map +1 -0
  17. package/dist/ErrorBoundary.js +122 -0
  18. package/dist/ErrorBoundary.js.map +1 -0
  19. package/dist/GracefulShutdown.d.ts +28 -0
  20. package/dist/GracefulShutdown.d.ts.map +1 -0
  21. package/dist/GracefulShutdown.js +55 -0
  22. package/dist/GracefulShutdown.js.map +1 -0
  23. package/dist/HealthCheck.d.ts +42 -0
  24. package/dist/HealthCheck.d.ts.map +1 -0
  25. package/dist/HealthCheck.js +65 -0
  26. package/dist/HealthCheck.js.map +1 -0
  27. package/dist/HotReload.d.ts +28 -0
  28. package/dist/HotReload.d.ts.map +1 -0
  29. package/dist/HotReload.js +60 -0
  30. package/dist/HotReload.js.map +1 -0
  31. package/dist/HttpKernel.d.ts +62 -0
  32. package/dist/HttpKernel.d.ts.map +1 -0
  33. package/dist/HttpKernel.js +210 -0
  34. package/dist/HttpKernel.js.map +1 -0
  35. package/dist/Ignitor.d.ts +195 -0
  36. package/dist/Ignitor.d.ts.map +1 -0
  37. package/dist/Ignitor.js +505 -0
  38. package/dist/Ignitor.js.map +1 -0
  39. package/dist/Provider.d.ts +54 -0
  40. package/dist/Provider.d.ts.map +1 -0
  41. package/dist/Provider.js +37 -0
  42. package/dist/Provider.js.map +1 -0
  43. package/dist/bodyparser/BodyParserMiddleware.d.ts +38 -0
  44. package/dist/bodyparser/BodyParserMiddleware.d.ts.map +1 -0
  45. package/dist/bodyparser/BodyParserMiddleware.js +143 -0
  46. package/dist/bodyparser/BodyParserMiddleware.js.map +1 -0
  47. package/dist/bodyparser/MultipartFile.d.ts +77 -0
  48. package/dist/bodyparser/MultipartFile.d.ts.map +1 -0
  49. package/dist/bodyparser/MultipartFile.js +138 -0
  50. package/dist/bodyparser/MultipartFile.js.map +1 -0
  51. package/dist/bodyparser/parseSize.d.ts +6 -0
  52. package/dist/bodyparser/parseSize.d.ts.map +1 -0
  53. package/dist/bodyparser/parseSize.js +21 -0
  54. package/dist/bodyparser/parseSize.js.map +1 -0
  55. package/dist/bootstrap/hyper-server.d.ts +27 -0
  56. package/dist/bootstrap/hyper-server.d.ts.map +1 -0
  57. package/dist/bootstrap/hyper-server.js +63 -0
  58. package/dist/bootstrap/hyper-server.js.map +1 -0
  59. package/dist/console/CommandRunner.d.ts +18 -0
  60. package/dist/console/CommandRunner.d.ts.map +1 -0
  61. package/dist/console/CommandRunner.js +65 -0
  62. package/dist/console/CommandRunner.js.map +1 -0
  63. package/dist/container/Container.d.ts +60 -0
  64. package/dist/container/Container.d.ts.map +1 -0
  65. package/dist/container/Container.js +329 -0
  66. package/dist/container/Container.js.map +1 -0
  67. package/dist/container/types.d.ts +25 -0
  68. package/dist/container/types.d.ts.map +1 -0
  69. package/dist/container/types.js +6 -0
  70. package/dist/container/types.js.map +1 -0
  71. package/dist/decorators/Lazy.d.ts +19 -0
  72. package/dist/decorators/Lazy.d.ts.map +1 -0
  73. package/dist/decorators/Lazy.js +53 -0
  74. package/dist/decorators/Lazy.js.map +1 -0
  75. package/dist/decorators/Service.d.ts +48 -0
  76. package/dist/decorators/Service.d.ts.map +1 -0
  77. package/dist/decorators/Service.js +70 -0
  78. package/dist/decorators/Service.js.map +1 -0
  79. package/dist/errors/FuzzyMatcher.d.ts +41 -0
  80. package/dist/errors/FuzzyMatcher.d.ts.map +1 -0
  81. package/dist/errors/FuzzyMatcher.js +81 -0
  82. package/dist/errors/FuzzyMatcher.js.map +1 -0
  83. package/dist/errors/ModuleErrors.d.ts +41 -0
  84. package/dist/errors/ModuleErrors.d.ts.map +1 -0
  85. package/dist/errors/ModuleErrors.js +65 -0
  86. package/dist/errors/ModuleErrors.js.map +1 -0
  87. package/dist/errors/PipelineStageError.d.ts +31 -0
  88. package/dist/errors/PipelineStageError.d.ts.map +1 -0
  89. package/dist/errors/PipelineStageError.js +77 -0
  90. package/dist/errors/PipelineStageError.js.map +1 -0
  91. package/dist/errors/ReamError.d.ts +50 -0
  92. package/dist/errors/ReamError.d.ts.map +1 -0
  93. package/dist/errors/ReamError.js +108 -0
  94. package/dist/errors/ReamError.js.map +1 -0
  95. package/dist/events/Emitter.d.ts +124 -0
  96. package/dist/events/Emitter.d.ts.map +1 -0
  97. package/dist/events/Emitter.js +271 -0
  98. package/dist/events/Emitter.js.map +1 -0
  99. package/dist/events/EventsProvider.d.ts +28 -0
  100. package/dist/events/EventsProvider.d.ts.map +1 -0
  101. package/dist/events/EventsProvider.js +36 -0
  102. package/dist/events/EventsProvider.js.map +1 -0
  103. package/dist/events/config.d.ts +8 -0
  104. package/dist/events/config.d.ts.map +1 -0
  105. package/dist/events/config.js +4 -0
  106. package/dist/events/config.js.map +1 -0
  107. package/dist/events/configure.d.ts +10 -0
  108. package/dist/events/configure.d.ts.map +1 -0
  109. package/dist/events/configure.js +11 -0
  110. package/dist/events/configure.js.map +1 -0
  111. package/dist/events/helix/helpers.d.ts +62 -0
  112. package/dist/events/helix/helpers.d.ts.map +1 -0
  113. package/dist/events/helix/helpers.js +187 -0
  114. package/dist/events/helix/helpers.js.map +1 -0
  115. package/dist/events/index.d.ts +17 -0
  116. package/dist/events/index.d.ts.map +1 -0
  117. package/dist/events/index.js +15 -0
  118. package/dist/events/index.js.map +1 -0
  119. package/dist/events/native.d.ts +21 -0
  120. package/dist/events/native.d.ts.map +1 -0
  121. package/dist/events/native.js +17 -0
  122. package/dist/events/native.js.map +1 -0
  123. package/dist/events/services/main.d.ts +18 -0
  124. package/dist/events/services/main.d.ts.map +1 -0
  125. package/dist/events/services/main.js +31 -0
  126. package/dist/events/services/main.js.map +1 -0
  127. package/dist/events/testing/FakeBus.d.ts +66 -0
  128. package/dist/events/testing/FakeBus.d.ts.map +1 -0
  129. package/dist/events/testing/FakeBus.js +356 -0
  130. package/dist/events/testing/FakeBus.js.map +1 -0
  131. package/dist/graphql/GraphQLEngine.d.ts +69 -0
  132. package/dist/graphql/GraphQLEngine.d.ts.map +1 -0
  133. package/dist/graphql/GraphQLEngine.js +309 -0
  134. package/dist/graphql/GraphQLEngine.js.map +1 -0
  135. package/dist/graphql/GraphQLProvider.d.ts +32 -0
  136. package/dist/graphql/GraphQLProvider.d.ts.map +1 -0
  137. package/dist/graphql/GraphQLProvider.js +49 -0
  138. package/dist/graphql/GraphQLProvider.js.map +1 -0
  139. package/dist/helpers/base64.d.ts +40 -0
  140. package/dist/helpers/base64.d.ts.map +1 -0
  141. package/dist/helpers/base64.js +70 -0
  142. package/dist/helpers/base64.js.map +1 -0
  143. package/dist/helpers/index.d.ts +7 -0
  144. package/dist/helpers/index.d.ts.map +1 -0
  145. package/dist/helpers/index.js +5 -0
  146. package/dist/helpers/index.js.map +1 -0
  147. package/dist/helpers/is.d.ts +101 -0
  148. package/dist/helpers/is.d.ts.map +1 -0
  149. package/dist/helpers/is.js +151 -0
  150. package/dist/helpers/is.js.map +1 -0
  151. package/dist/helpers/napi-loader.d.ts +46 -0
  152. package/dist/helpers/napi-loader.d.ts.map +1 -0
  153. package/dist/helpers/napi-loader.js +69 -0
  154. package/dist/helpers/napi-loader.js.map +1 -0
  155. package/dist/helpers/safeEqual.d.ts +9 -0
  156. package/dist/helpers/safeEqual.d.ts.map +1 -0
  157. package/dist/helpers/safeEqual.js +16 -0
  158. package/dist/helpers/safeEqual.js.map +1 -0
  159. package/dist/helpers/string.d.ts +161 -0
  160. package/dist/helpers/string.d.ts.map +1 -0
  161. package/dist/helpers/string.js +429 -0
  162. package/dist/helpers/string.js.map +1 -0
  163. package/dist/helpers/types.d.ts +83 -0
  164. package/dist/helpers/types.d.ts.map +1 -0
  165. package/dist/helpers/types.js +6 -0
  166. package/dist/helpers/types.js.map +1 -0
  167. package/dist/http/Exception.d.ts +103 -0
  168. package/dist/http/Exception.d.ts.map +1 -0
  169. package/dist/http/Exception.js +228 -0
  170. package/dist/http/Exception.js.map +1 -0
  171. package/dist/http/HttpContext.d.ts +69 -0
  172. package/dist/http/HttpContext.d.ts.map +1 -0
  173. package/dist/http/HttpContext.js +55 -0
  174. package/dist/http/HttpContext.js.map +1 -0
  175. package/dist/http/RedirectBuilder.d.ts +31 -0
  176. package/dist/http/RedirectBuilder.d.ts.map +1 -0
  177. package/dist/http/RedirectBuilder.js +75 -0
  178. package/dist/http/RedirectBuilder.js.map +1 -0
  179. package/dist/http/Request.d.ts +160 -0
  180. package/dist/http/Request.d.ts.map +1 -0
  181. package/dist/http/Request.js +484 -0
  182. package/dist/http/Request.js.map +1 -0
  183. package/dist/http/Response.d.ts +114 -0
  184. package/dist/http/Response.d.ts.map +1 -0
  185. package/dist/http/Response.js +303 -0
  186. package/dist/http/Response.js.map +1 -0
  187. package/dist/http/SseStream.d.ts +89 -0
  188. package/dist/http/SseStream.d.ts.map +1 -0
  189. package/dist/http/SseStream.js +228 -0
  190. package/dist/http/SseStream.js.map +1 -0
  191. package/dist/http/urlDecode.d.ts +8 -0
  192. package/dist/http/urlDecode.d.ts.map +1 -0
  193. package/dist/http/urlDecode.js +18 -0
  194. package/dist/http/urlDecode.js.map +1 -0
  195. package/dist/index.d.ts +92 -0
  196. package/dist/index.d.ts.map +1 -0
  197. package/dist/index.js +67 -0
  198. package/dist/index.js.map +1 -0
  199. package/dist/middleware/Pipeline.d.ts +36 -0
  200. package/dist/middleware/Pipeline.d.ts.map +1 -0
  201. package/dist/middleware/Pipeline.js +104 -0
  202. package/dist/middleware/Pipeline.js.map +1 -0
  203. package/dist/openapi/OpenApiGenerator.d.ts +58 -0
  204. package/dist/openapi/OpenApiGenerator.d.ts.map +1 -0
  205. package/dist/openapi/OpenApiGenerator.js +192 -0
  206. package/dist/openapi/OpenApiGenerator.js.map +1 -0
  207. package/dist/openapi/OpenApiMiddleware.d.ts +24 -0
  208. package/dist/openapi/OpenApiMiddleware.d.ts.map +1 -0
  209. package/dist/openapi/OpenApiMiddleware.js +78 -0
  210. package/dist/openapi/OpenApiMiddleware.js.map +1 -0
  211. package/dist/openapi/OpenApiProvider.d.ts +36 -0
  212. package/dist/openapi/OpenApiProvider.d.ts.map +1 -0
  213. package/dist/openapi/OpenApiProvider.js +42 -0
  214. package/dist/openapi/OpenApiProvider.js.map +1 -0
  215. package/dist/resources/ApiResource.d.ts +45 -0
  216. package/dist/resources/ApiResource.d.ts.map +1 -0
  217. package/dist/resources/ApiResource.js +58 -0
  218. package/dist/resources/ApiResource.js.map +1 -0
  219. package/dist/router/Router.d.ts +205 -0
  220. package/dist/router/Router.d.ts.map +1 -0
  221. package/dist/router/Router.js +552 -0
  222. package/dist/router/Router.js.map +1 -0
  223. package/dist/rpc/RpcProvider.d.ts +34 -0
  224. package/dist/rpc/RpcProvider.d.ts.map +1 -0
  225. package/dist/rpc/RpcProvider.js +37 -0
  226. package/dist/rpc/RpcProvider.js.map +1 -0
  227. package/dist/rpc/RpcRouter.d.ts +61 -0
  228. package/dist/rpc/RpcRouter.d.ts.map +1 -0
  229. package/dist/rpc/RpcRouter.js +187 -0
  230. package/dist/rpc/RpcRouter.js.map +1 -0
  231. package/dist/scheduler/Schedule.d.ts +53 -0
  232. package/dist/scheduler/Schedule.d.ts.map +1 -0
  233. package/dist/scheduler/Schedule.js +76 -0
  234. package/dist/scheduler/Schedule.js.map +1 -0
  235. package/dist/scheduler/ScheduleProvider.d.ts +56 -0
  236. package/dist/scheduler/ScheduleProvider.d.ts.map +1 -0
  237. package/dist/scheduler/ScheduleProvider.js +145 -0
  238. package/dist/scheduler/ScheduleProvider.js.map +1 -0
  239. package/dist/scheduler/Scheduler.d.ts +209 -0
  240. package/dist/scheduler/Scheduler.d.ts.map +1 -0
  241. package/dist/scheduler/Scheduler.js +432 -0
  242. package/dist/scheduler/Scheduler.js.map +1 -0
  243. package/dist/scheduler/index.d.ts +14 -0
  244. package/dist/scheduler/index.d.ts.map +1 -0
  245. package/dist/scheduler/index.js +6 -0
  246. package/dist/scheduler/index.js.map +1 -0
  247. package/dist/scheduler/locks/LockBackend.d.ts +37 -0
  248. package/dist/scheduler/locks/LockBackend.d.ts.map +1 -0
  249. package/dist/scheduler/locks/LockBackend.js +13 -0
  250. package/dist/scheduler/locks/LockBackend.js.map +1 -0
  251. package/dist/scheduler/locks/MemoryLockBackend.d.ts +39 -0
  252. package/dist/scheduler/locks/MemoryLockBackend.d.ts.map +1 -0
  253. package/dist/scheduler/locks/MemoryLockBackend.js +71 -0
  254. package/dist/scheduler/locks/MemoryLockBackend.js.map +1 -0
  255. package/dist/scheduler/observability/ErrorReporter.d.ts +15 -0
  256. package/dist/scheduler/observability/ErrorReporter.d.ts.map +1 -0
  257. package/dist/scheduler/observability/ErrorReporter.js +13 -0
  258. package/dist/scheduler/observability/ErrorReporter.js.map +1 -0
  259. package/dist/scheduler/observability/ScheduleEvent.d.ts +57 -0
  260. package/dist/scheduler/observability/ScheduleEvent.d.ts.map +1 -0
  261. package/dist/scheduler/observability/ScheduleEvent.js +12 -0
  262. package/dist/scheduler/observability/ScheduleEvent.js.map +1 -0
  263. package/dist/scheduler/observability/ScheduleEventSink.d.ts +20 -0
  264. package/dist/scheduler/observability/ScheduleEventSink.d.ts.map +1 -0
  265. package/dist/scheduler/observability/ScheduleEventSink.js +17 -0
  266. package/dist/scheduler/observability/ScheduleEventSink.js.map +1 -0
  267. package/dist/scheduler/observability/StatsTracker.d.ts +50 -0
  268. package/dist/scheduler/observability/StatsTracker.d.ts.map +1 -0
  269. package/dist/scheduler/observability/StatsTracker.js +96 -0
  270. package/dist/scheduler/observability/StatsTracker.js.map +1 -0
  271. package/dist/security/CookieSigner.d.ts +13 -0
  272. package/dist/security/CookieSigner.d.ts.map +1 -0
  273. package/dist/security/CookieSigner.js +51 -0
  274. package/dist/security/CookieSigner.js.map +1 -0
  275. package/dist/security/SignedUrl.d.ts +17 -0
  276. package/dist/security/SignedUrl.d.ts.map +1 -0
  277. package/dist/security/SignedUrl.js +63 -0
  278. package/dist/security/SignedUrl.js.map +1 -0
  279. package/dist/security/crypto.d.ts +25 -0
  280. package/dist/security/crypto.d.ts.map +1 -0
  281. package/dist/security/crypto.js +82 -0
  282. package/dist/security/crypto.js.map +1 -0
  283. package/dist/server/HyperServer.d.ts +64 -0
  284. package/dist/server/HyperServer.d.ts.map +1 -0
  285. package/dist/server/HyperServer.js +54 -0
  286. package/dist/server/HyperServer.js.map +1 -0
  287. package/dist/server/Server.d.ts +68 -0
  288. package/dist/server/Server.d.ts.map +1 -0
  289. package/dist/server/Server.js +113 -0
  290. package/dist/server/Server.js.map +1 -0
  291. package/dist/services/app.d.ts +14 -0
  292. package/dist/services/app.d.ts.map +1 -0
  293. package/dist/services/app.js +27 -0
  294. package/dist/services/app.js.map +1 -0
  295. package/dist/services/router.d.ts +21 -0
  296. package/dist/services/router.d.ts.map +1 -0
  297. package/dist/services/router.js +36 -0
  298. package/dist/services/router.js.map +1 -0
  299. package/dist/services/server.d.ts +16 -0
  300. package/dist/services/server.d.ts.map +1 -0
  301. package/dist/services/server.js +32 -0
  302. package/dist/services/server.js.map +1 -0
  303. package/dist/session/Session.d.ts +88 -0
  304. package/dist/session/Session.d.ts.map +1 -0
  305. package/dist/session/Session.js +186 -0
  306. package/dist/session/Session.js.map +1 -0
  307. package/dist/session/SessionMiddleware.d.ts +16 -0
  308. package/dist/session/SessionMiddleware.d.ts.map +1 -0
  309. package/dist/session/SessionMiddleware.js +132 -0
  310. package/dist/session/SessionMiddleware.js.map +1 -0
  311. package/dist/session/drivers/CookieDriver.d.ts +17 -0
  312. package/dist/session/drivers/CookieDriver.d.ts.map +1 -0
  313. package/dist/session/drivers/CookieDriver.js +42 -0
  314. package/dist/session/drivers/CookieDriver.js.map +1 -0
  315. package/dist/session/drivers/MemoryDriver.d.ts +9 -0
  316. package/dist/session/drivers/MemoryDriver.d.ts.map +1 -0
  317. package/dist/session/drivers/MemoryDriver.js +24 -0
  318. package/dist/session/drivers/MemoryDriver.js.map +1 -0
  319. package/dist/storage/S3Driver.d.ts +27 -0
  320. package/dist/storage/S3Driver.d.ts.map +1 -0
  321. package/dist/storage/S3Driver.js +135 -0
  322. package/dist/storage/S3Driver.js.map +1 -0
  323. package/dist/storage/StaticMiddleware.d.ts +27 -0
  324. package/dist/storage/StaticMiddleware.d.ts.map +1 -0
  325. package/dist/storage/StaticMiddleware.js +153 -0
  326. package/dist/storage/StaticMiddleware.js.map +1 -0
  327. package/dist/storage/StaticProvider.d.ts +26 -0
  328. package/dist/storage/StaticProvider.d.ts.map +1 -0
  329. package/dist/storage/StaticProvider.js +31 -0
  330. package/dist/storage/StaticProvider.js.map +1 -0
  331. package/dist/storage/StorageManager.d.ts +31 -0
  332. package/dist/storage/StorageManager.d.ts.map +1 -0
  333. package/dist/storage/StorageManager.js +120 -0
  334. package/dist/storage/StorageManager.js.map +1 -0
  335. package/dist/testing/RequestBuilder.d.ts +67 -0
  336. package/dist/testing/RequestBuilder.d.ts.map +1 -0
  337. package/dist/testing/RequestBuilder.js +202 -0
  338. package/dist/testing/RequestBuilder.js.map +1 -0
  339. package/dist/testing/TestClient.d.ts +96 -0
  340. package/dist/testing/TestClient.d.ts.map +1 -0
  341. package/dist/testing/TestClient.js +263 -0
  342. package/dist/testing/TestClient.js.map +1 -0
  343. package/dist/types/helpers.d.ts +47 -0
  344. package/dist/types/helpers.d.ts.map +1 -0
  345. package/dist/types/helpers.js +5 -0
  346. package/dist/types/helpers.js.map +1 -0
  347. package/events.darwin-arm64.node +0 -0
  348. package/events.darwin-x64.node +0 -0
  349. package/events.linux-arm64-gnu.node +0 -0
  350. package/events.linux-x64-gnu.node +0 -0
  351. package/events.win32-x64-msvc.node +0 -0
  352. package/index.darwin-arm64.node +0 -0
  353. package/index.darwin-x64.node +0 -0
  354. package/index.linux-arm64-gnu.node +0 -0
  355. package/index.linux-x64-gnu.node +0 -0
  356. package/index.win32-x64-msvc.node +0 -0
  357. package/package.json +106 -0
  358. package/scheduler.darwin-arm64.node +0 -0
  359. package/scheduler.darwin-x64.node +0 -0
  360. package/scheduler.linux-arm64-gnu.node +0 -0
  361. package/scheduler.linux-x64-gnu.node +0 -0
  362. package/scheduler.win32-x64-msvc.node +0 -0
  363. package/scripts/copy-napi.mjs +113 -0
  364. package/src/Application.ts +177 -0
  365. package/src/Codemods.ts +343 -0
  366. package/src/ConfigLoader.ts +49 -0
  367. package/src/ErrorBoundary.ts +157 -0
  368. package/src/GracefulShutdown.ts +80 -0
  369. package/src/HealthCheck.ts +96 -0
  370. package/src/HotReload.ts +78 -0
  371. package/src/HttpKernel.ts +305 -0
  372. package/src/Ignitor.ts +656 -0
  373. package/src/Provider.ts +74 -0
  374. package/src/bodyparser/BodyParserMiddleware.ts +183 -0
  375. package/src/bodyparser/MultipartFile.ts +181 -0
  376. package/src/bodyparser/parseSize.ts +19 -0
  377. package/src/bootstrap/hyper-server.ts +78 -0
  378. package/src/console/CommandRunner.ts +82 -0
  379. package/src/container/Container.ts +383 -0
  380. package/src/container/types.ts +30 -0
  381. package/src/decorators/Lazy.ts +57 -0
  382. package/src/decorators/Service.ts +85 -0
  383. package/src/errors/FuzzyMatcher.ts +93 -0
  384. package/src/errors/ModuleErrors.ts +73 -0
  385. package/src/errors/PipelineStageError.ts +97 -0
  386. package/src/errors/ReamError.ts +138 -0
  387. package/src/events/Emitter.ts +333 -0
  388. package/src/events/EventsProvider.ts +58 -0
  389. package/src/events/config.ts +10 -0
  390. package/src/events/configure.ts +19 -0
  391. package/src/events/helix/helpers.ts +260 -0
  392. package/src/events/index.ts +22 -0
  393. package/src/events/native.ts +37 -0
  394. package/src/events/services/main.ts +39 -0
  395. package/src/events/testing/FakeBus.ts +420 -0
  396. package/src/graphql/GraphQLEngine.ts +421 -0
  397. package/src/graphql/GraphQLProvider.ts +59 -0
  398. package/src/helpers/base64.ts +72 -0
  399. package/src/helpers/index.ts +6 -0
  400. package/src/helpers/is.ts +162 -0
  401. package/src/helpers/napi-loader.ts +106 -0
  402. package/src/helpers/safeEqual.ts +15 -0
  403. package/src/helpers/string.ts +469 -0
  404. package/src/helpers/types.ts +100 -0
  405. package/src/http/Exception.ts +272 -0
  406. package/src/http/HttpContext.ts +108 -0
  407. package/src/http/RedirectBuilder.ts +89 -0
  408. package/src/http/Request.ts +540 -0
  409. package/src/http/Response.ts +351 -0
  410. package/src/http/SseStream.ts +250 -0
  411. package/src/http/urlDecode.ts +18 -0
  412. package/src/index.ts +263 -0
  413. package/src/middleware/Pipeline.ts +136 -0
  414. package/src/openapi/OpenApiGenerator.ts +254 -0
  415. package/src/openapi/OpenApiMiddleware.ts +101 -0
  416. package/src/openapi/OpenApiProvider.ts +67 -0
  417. package/src/resources/ApiResource.ts +79 -0
  418. package/src/router/Router.ts +733 -0
  419. package/src/rpc/RpcProvider.ts +54 -0
  420. package/src/rpc/RpcRouter.ts +243 -0
  421. package/src/scheduler/Schedule.ts +96 -0
  422. package/src/scheduler/ScheduleProvider.ts +177 -0
  423. package/src/scheduler/Scheduler.ts +601 -0
  424. package/src/scheduler/index.ts +24 -0
  425. package/src/scheduler/locks/LockBackend.ts +38 -0
  426. package/src/scheduler/locks/MemoryLockBackend.ts +85 -0
  427. package/src/scheduler/observability/ErrorReporter.ts +13 -0
  428. package/src/scheduler/observability/ScheduleEvent.ts +61 -0
  429. package/src/scheduler/observability/ScheduleEventSink.ts +21 -0
  430. package/src/scheduler/observability/StatsTracker.ts +134 -0
  431. package/src/security/CookieSigner.ts +54 -0
  432. package/src/security/SignedUrl.ts +71 -0
  433. package/src/security/crypto.ts +98 -0
  434. package/src/server/HyperServer.ts +121 -0
  435. package/src/server/Server.ts +147 -0
  436. package/src/services/app.ts +34 -0
  437. package/src/services/router.ts +44 -0
  438. package/src/services/server.ts +40 -0
  439. package/src/session/Session.ts +231 -0
  440. package/src/session/SessionMiddleware.ts +153 -0
  441. package/src/session/drivers/CookieDriver.ts +48 -0
  442. package/src/session/drivers/MemoryDriver.ts +29 -0
  443. package/src/storage/S3Driver.ts +171 -0
  444. package/src/storage/StaticMiddleware.ts +182 -0
  445. package/src/storage/StaticProvider.ts +40 -0
  446. package/src/storage/StorageManager.ts +142 -0
  447. package/src/testing/RequestBuilder.ts +275 -0
  448. package/src/testing/TestClient.ts +344 -0
  449. package/src/types/helpers.ts +52 -0
  450. package/swcrc.app.json +17 -0
  451. package/tsconfig.app.json +21 -0
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Configuration loader — reads config/*.ts + .env files.
3
+ *
4
+ * @implements FR18, FR19
5
+ */
6
+ /**
7
+ * In-memory config store. In production this is populated from config/*.ts
8
+ * files via `defineConfig()`. The class is its own contract — `AppContext.config`
9
+ * is typed against it directly (structural).
10
+ */
11
+ export declare class ConfigStore {
12
+ private store;
13
+ get<T = unknown>(key: string): T | undefined;
14
+ set(key: string, value: unknown): void;
15
+ has(key: string): boolean;
16
+ /** Load config from an object (used for testing and initial setup). */
17
+ loadFromObject(config: Record<string, unknown>): void;
18
+ }
19
+ /**
20
+ * Read an environment variable with optional default.
21
+ * @implements FR19
22
+ */
23
+ export declare function env(key: string, defaultValue?: string): string | undefined;
24
+ /**
25
+ * Define typed configuration for a module.
26
+ * Returns the config object as-is (type-checked by the module's defineConfig).
27
+ */
28
+ export declare function defineModuleConfig<T>(config: T): T;
29
+ //# sourceMappingURL=ConfigLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../src/ConfigLoader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAkC;IAE/C,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI5C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAItC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,uEAAuE;IACvE,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAKtD;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAElD"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Configuration loader — reads config/*.ts + .env files.
3
+ *
4
+ * @implements FR18, FR19
5
+ */
6
+ /**
7
+ * In-memory config store. In production this is populated from config/*.ts
8
+ * files via `defineConfig()`. The class is its own contract — `AppContext.config`
9
+ * is typed against it directly (structural).
10
+ */
11
+ export class ConfigStore {
12
+ store = new Map();
13
+ get(key) {
14
+ return this.store.get(key);
15
+ }
16
+ set(key, value) {
17
+ this.store.set(key, value);
18
+ }
19
+ has(key) {
20
+ return this.store.has(key);
21
+ }
22
+ /** Load config from an object (used for testing and initial setup). */
23
+ loadFromObject(config) {
24
+ for (const [key, value] of Object.entries(config)) {
25
+ this.store.set(key, value);
26
+ }
27
+ }
28
+ }
29
+ /**
30
+ * Read an environment variable with optional default.
31
+ * @implements FR19
32
+ */
33
+ export function env(key, defaultValue) {
34
+ return process.env[key] ?? defaultValue;
35
+ }
36
+ /**
37
+ * Define typed configuration for a module.
38
+ * Returns the config object as-is (type-checked by the module's defineConfig).
39
+ */
40
+ export function defineModuleConfig(config) {
41
+ return config;
42
+ }
43
+ //# sourceMappingURL=ConfigLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigLoader.js","sourceRoot":"","sources":["../src/ConfigLoader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACd,KAAK,GAAyB,IAAI,GAAG,EAAE,CAAA;IAE/C,GAAG,CAAc,GAAW;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAkB,CAAA;IAC7C,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAc;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC5B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAED,uEAAuE;IACvE,cAAc,CAAC,MAA+B;QAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,YAAqB;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,YAAY,CAAA;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAI,MAAS;IAC7C,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Root Error Boundary — all errors flow through the bus.
3
+ *
4
+ * @implements Story 4.8
5
+ *
6
+ * Catches all uncaught errors and emits them as event-bus events:
7
+ * - service.error — handler/business logic failures
8
+ * - security.rejected — Blackhole rejections
9
+ * - system.error — infrastructure failures (NAPI, DB)
10
+ * - system.fatal — unrecoverable process-level errors
11
+ */
12
+ export type ErrorSeverity = 'info' | 'warning' | 'critical';
13
+ export interface ErrorEvent {
14
+ type: 'service.error' | 'security.rejected' | 'system.error' | 'system.fatal' | 'system.info';
15
+ source: string;
16
+ message: string;
17
+ severity: ErrorSeverity;
18
+ correlationId?: string;
19
+ originalError?: string;
20
+ timestamp: string;
21
+ }
22
+ export type ErrorEmitter = (event: ErrorEvent) => void;
23
+ /**
24
+ * Root Error Boundary.
25
+ *
26
+ * Wraps the entire application lifecycle:
27
+ * - Catches unhandledRejection and uncaughtException
28
+ * - Emits structured error events via the provided emitter (event bus)
29
+ * - In dev mode, also logs to console
30
+ */
31
+ export declare class ErrorBoundary {
32
+ private emitter;
33
+ private devMode;
34
+ private installed;
35
+ private rejectionHandler?;
36
+ private exceptionHandler?;
37
+ constructor(emitter: ErrorEmitter, devMode?: boolean);
38
+ /** Install global error handlers. */
39
+ install(): void;
40
+ /** Uninstall global error handlers (for testing). Only removes OUR handlers. */
41
+ uninstall(): void;
42
+ /** Emit a service error (handler failure). */
43
+ serviceError(source: string, error: unknown, correlationId?: string): void;
44
+ /** Emit a security rejection. */
45
+ securityRejected(source: string, reason: string, correlationId?: string): void;
46
+ /** Emit a system error (infrastructure failure). */
47
+ systemError(source: string, error: unknown, correlationId?: string): void;
48
+ private handleError;
49
+ private emit;
50
+ }
51
+ //# sourceMappingURL=ErrorBoundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../src/ErrorBoundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;AAE3D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,eAAe,GAAG,mBAAmB,GAAG,cAAc,GAAG,cAAc,GAAG,aAAa,CAAA;IAC7F,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,aAAa,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;AAEtD;;;;;;;GAOG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,gBAAgB,CAAC,CAA2B;IACpD,OAAO,CAAC,gBAAgB,CAAC,CAAwB;gBAErC,OAAO,EAAE,YAAY,EAAE,OAAO,UAAQ;IAKlD,qCAAqC;IACrC,OAAO,IAAI,IAAI;IA8Bf,gFAAgF;IAChF,SAAS,IAAI,IAAI;IAYjB,8CAA8C;IAC9C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1E,iCAAiC;IACjC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAY9E,oDAAoD;IACpD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAIzE,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,IAAI;CAoBb"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Root Error Boundary — all errors flow through the bus.
3
+ *
4
+ * @implements Story 4.8
5
+ *
6
+ * Catches all uncaught errors and emits them as event-bus events:
7
+ * - service.error — handler/business logic failures
8
+ * - security.rejected — Blackhole rejections
9
+ * - system.error — infrastructure failures (NAPI, DB)
10
+ * - system.fatal — unrecoverable process-level errors
11
+ */
12
+ /**
13
+ * Root Error Boundary.
14
+ *
15
+ * Wraps the entire application lifecycle:
16
+ * - Catches unhandledRejection and uncaughtException
17
+ * - Emits structured error events via the provided emitter (event bus)
18
+ * - In dev mode, also logs to console
19
+ */
20
+ export class ErrorBoundary {
21
+ emitter;
22
+ devMode;
23
+ installed = false;
24
+ rejectionHandler;
25
+ exceptionHandler;
26
+ constructor(emitter, devMode = false) {
27
+ this.emitter = emitter;
28
+ this.devMode = devMode;
29
+ }
30
+ /** Install global error handlers. */
31
+ install() {
32
+ if (this.installed)
33
+ return;
34
+ // Skip global install under vitest — each test instantiates its own
35
+ // Ignitor and rarely calls `.stop()`, so per-test listeners pile up on
36
+ // the singleton `process` and trigger Node's MaxListenersExceeded
37
+ // warning. Production code-paths still get coverage via direct
38
+ // `handleError`/`serviceError` calls; only the Node-level signal
39
+ // bridging is suppressed.
40
+ if (process.env.VITEST === 'true' || process.env.NODE_ENV === 'test') {
41
+ this.installed = true;
42
+ return;
43
+ }
44
+ this.rejectionHandler = (reason) => {
45
+ this.handleError('system.fatal', 'UnhandledRejection', reason);
46
+ };
47
+ this.exceptionHandler = (error) => {
48
+ this.handleError('system.fatal', 'UncaughtException', error);
49
+ // Node.js is in undefined state after uncaughtException — must exit
50
+ process.exit(1);
51
+ };
52
+ process.on('unhandledRejection', this.rejectionHandler);
53
+ process.on('uncaughtException', this.exceptionHandler);
54
+ this.installed = true;
55
+ }
56
+ /** Uninstall global error handlers (for testing). Only removes OUR handlers. */
57
+ uninstall() {
58
+ if (this.rejectionHandler) {
59
+ process.removeListener('unhandledRejection', this.rejectionHandler);
60
+ }
61
+ if (this.exceptionHandler) {
62
+ process.removeListener('uncaughtException', this.exceptionHandler);
63
+ }
64
+ this.rejectionHandler = undefined;
65
+ this.exceptionHandler = undefined;
66
+ this.installed = false;
67
+ }
68
+ /** Emit a service error (handler failure). */
69
+ serviceError(source, error, correlationId) {
70
+ this.handleError('service.error', source, error, correlationId);
71
+ }
72
+ /** Emit a security rejection. */
73
+ securityRejected(source, reason, correlationId) {
74
+ const event = {
75
+ type: 'security.rejected',
76
+ source,
77
+ message: reason,
78
+ severity: 'warning',
79
+ correlationId,
80
+ timestamp: new Date().toISOString(),
81
+ };
82
+ this.emit(event);
83
+ }
84
+ /** Emit a system error (infrastructure failure). */
85
+ systemError(source, error, correlationId) {
86
+ this.handleError('system.error', source, error, correlationId);
87
+ }
88
+ handleError(type, source, error, correlationId) {
89
+ const message = error instanceof Error ? error.message : String(error);
90
+ const stack = error instanceof Error ? error.stack : undefined;
91
+ const event = {
92
+ type,
93
+ source,
94
+ message,
95
+ severity: type === 'system.fatal' ? 'critical' : type === 'system.error' ? 'critical' : 'warning',
96
+ correlationId,
97
+ originalError: stack ?? message,
98
+ timestamp: new Date().toISOString(),
99
+ };
100
+ this.emit(event);
101
+ }
102
+ emit(event) {
103
+ try {
104
+ this.emitter(event);
105
+ }
106
+ catch {
107
+ // If the emitter itself fails, log to stderr as last resort
108
+ process.stderr.write(`[ErrorBoundary] Failed to emit: ${JSON.stringify(event)}\n`);
109
+ }
110
+ if (this.devMode) {
111
+ const prefix = event.type === 'system.fatal'
112
+ ? '✗ FATAL'
113
+ : event.type === 'system.error'
114
+ ? '✗ ERROR'
115
+ : event.type === 'security.rejected'
116
+ ? '⚠ SECURITY'
117
+ : '✗ SERVICE';
118
+ process.stderr.write(`${prefix} [${event.source}] ${event.message}\n`);
119
+ }
120
+ }
121
+ }
122
+ //# sourceMappingURL=ErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../src/ErrorBoundary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Graceful Shutdown — handles SIGTERM/SIGINT with drain timeout.
3
+ *
4
+ * @implements FR82
5
+ */
6
+ export interface ShutdownOptions {
7
+ /** Maximum time to wait for drain in ms (default: 30000). */
8
+ drainTimeout?: number;
9
+ /** Callback to execute during shutdown. */
10
+ onShutdown: () => Promise<void>;
11
+ /** Optional logger. */
12
+ logger?: {
13
+ info: (msg: string) => void;
14
+ error: (msg: string) => void;
15
+ };
16
+ }
17
+ export interface ShutdownHandle {
18
+ /** Manually trigger shutdown (for testing). */
19
+ trigger: () => Promise<void>;
20
+ /** Remove signal listeners (for testing cleanup). */
21
+ cleanup: () => void;
22
+ }
23
+ /**
24
+ * Install graceful shutdown handlers for SIGTERM and SIGINT.
25
+ * Returns a handle to manually trigger shutdown or clean up listeners.
26
+ */
27
+ export declare function installGracefulShutdown(options: ShutdownOptions): ShutdownHandle;
28
+ //# sourceMappingURL=GracefulShutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GracefulShutdown.d.ts","sourceRoot":"","sources":["../src/GracefulShutdown.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,uBAAuB;IACvB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAA;CACvE;AAED,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,qDAAqD;IACrD,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAqDhF"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Graceful Shutdown — handles SIGTERM/SIGINT with drain timeout.
3
+ *
4
+ * @implements FR82
5
+ */
6
+ /**
7
+ * Install graceful shutdown handlers for SIGTERM and SIGINT.
8
+ * Returns a handle to manually trigger shutdown or clean up listeners.
9
+ */
10
+ export function installGracefulShutdown(options) {
11
+ const drainTimeout = options.drainTimeout ?? 30_000;
12
+ const logger = options.logger ?? { info: () => { }, error: () => { } };
13
+ let shutdownInProgress = false;
14
+ const shutdown = async () => {
15
+ if (shutdownInProgress)
16
+ return;
17
+ shutdownInProgress = true;
18
+ logger.info('Graceful shutdown initiated...');
19
+ let timeoutHandle;
20
+ const drainPromise = options.onShutdown().catch((err) => {
21
+ logger.error(`Shutdown error: ${err instanceof Error ? err.message : String(err)}`);
22
+ });
23
+ const timeoutPromise = new Promise((resolve) => {
24
+ timeoutHandle = setTimeout(() => {
25
+ logger.error(`Drain timeout exceeded (${drainTimeout}ms) — forcing shutdown`);
26
+ resolve();
27
+ }, drainTimeout);
28
+ });
29
+ await Promise.race([drainPromise, timeoutPromise]);
30
+ if (timeoutHandle)
31
+ clearTimeout(timeoutHandle);
32
+ logger.info('Shutdown complete');
33
+ process.exit(0);
34
+ };
35
+ const onSigterm = () => {
36
+ shutdown().catch((err) => {
37
+ logger.error(`Fatal: ${err}`);
38
+ process.exit(1);
39
+ });
40
+ };
41
+ const onSigint = () => {
42
+ shutdown().catch((err) => {
43
+ logger.error(`Fatal: ${err}`);
44
+ process.exit(1);
45
+ });
46
+ };
47
+ process.on('SIGTERM', onSigterm);
48
+ process.on('SIGINT', onSigint);
49
+ const cleanup = () => {
50
+ process.off('SIGTERM', onSigterm);
51
+ process.off('SIGINT', onSigint);
52
+ };
53
+ return { trigger: shutdown, cleanup };
54
+ }
55
+ //# sourceMappingURL=GracefulShutdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GracefulShutdown.js","sourceRoot":"","sources":["../src/GracefulShutdown.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAwB;IAC9D,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,MAAM,CAAA;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAA;IACpE,IAAI,kBAAkB,GAAG,KAAK,CAAA;IAE9B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,kBAAkB;YAAE,OAAM;QAC9B,kBAAkB,GAAG,IAAI,CAAA;QAEzB,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;QAE7C,IAAI,aAAwD,CAAA;QAE5D,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACtD,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACrF,CAAC,CAAC,CAAA;QAEF,MAAM,cAAc,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnD,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,MAAM,CAAC,KAAK,CAAC,2BAA2B,YAAY,wBAAwB,CAAC,CAAA;gBAC7E,OAAO,EAAE,CAAA;YACX,CAAC,EAAE,YAAY,CAAC,CAAA;QAClB,CAAC,CAAC,CAAA;QAEF,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAA;QAClD,IAAI,aAAa;YAAE,YAAY,CAAC,aAAa,CAAC,CAAA;QAE9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAA;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IACD,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAA;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAE9B,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QACjC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACjC,CAAC,CAAA;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;AACvC,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Health Check — built-in /health endpoint compatible with Kubernetes liveness/readiness probes.
3
+ *
4
+ * @implements FR81
5
+ */
6
+ export interface HealthStatus {
7
+ status: 'ok' | 'degraded' | 'error';
8
+ uptime: number;
9
+ timestamp: string;
10
+ checks: HealthCheckResult[];
11
+ }
12
+ export interface HealthCheckResult {
13
+ name: string;
14
+ status: 'ok' | 'warn' | 'error';
15
+ message?: string;
16
+ latency?: number;
17
+ }
18
+ export type HealthChecker = () => Promise<HealthCheckResult> | HealthCheckResult;
19
+ /**
20
+ * Manages health check registrations and produces aggregated status.
21
+ */
22
+ export declare class HealthCheck {
23
+ private checkers;
24
+ private startTime;
25
+ private checkTimeout;
26
+ constructor(options?: {
27
+ checkTimeout?: number;
28
+ });
29
+ /** Register a health checker. */
30
+ register(name: string, checker: HealthChecker): void;
31
+ /** Run all health checks and return aggregated status. */
32
+ check(): Promise<HealthStatus>;
33
+ /** Create the /health route handler. Returns 200 for ok, 503 for degraded/error. */
34
+ handler(): (ctx: {
35
+ response: {
36
+ status: number;
37
+ headers: Record<string, string>;
38
+ body: string;
39
+ };
40
+ }) => Promise<void>;
41
+ }
42
+ //# sourceMappingURL=HealthCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HealthCheck.d.ts","sourceRoot":"","sources":["../src/HealthCheck.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,OAAO,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAA;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAA;AAKhF;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,YAAY,CAAQ;gBAEhB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;IAI/C,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAIpD,0DAA0D;IACpD,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;IAyCpC,oFAAoF;IACpF,OAAO,IAAI,CAAC,GAAG,EAAE;QACf,QAAQ,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAC5E,KAAK,OAAO,CAAC,IAAI,CAAC;CAQpB"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Health Check — built-in /health endpoint compatible with Kubernetes liveness/readiness probes.
3
+ *
4
+ * @implements FR81
5
+ */
6
+ /** Default per-checker timeout in ms. */
7
+ const DEFAULT_CHECK_TIMEOUT = 5000;
8
+ /**
9
+ * Manages health check registrations and produces aggregated status.
10
+ */
11
+ export class HealthCheck {
12
+ checkers = new Map();
13
+ startTime = Date.now();
14
+ checkTimeout;
15
+ constructor(options) {
16
+ this.checkTimeout = options?.checkTimeout ?? DEFAULT_CHECK_TIMEOUT;
17
+ }
18
+ /** Register a health checker. */
19
+ register(name, checker) {
20
+ this.checkers.set(name, checker);
21
+ }
22
+ /** Run all health checks and return aggregated status. */
23
+ async check() {
24
+ const checks = [];
25
+ for (const [name, checker] of this.checkers) {
26
+ const start = Date.now();
27
+ try {
28
+ const result = await Promise.race([
29
+ Promise.resolve(checker()),
30
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Health check '${name}' timed out after ${this.checkTimeout}ms`)), this.checkTimeout)),
31
+ ]);
32
+ // Enforce authoritative name from registration key
33
+ result.name = name;
34
+ result.latency = Date.now() - start;
35
+ checks.push(result);
36
+ }
37
+ catch (err) {
38
+ checks.push({
39
+ name,
40
+ status: 'error',
41
+ message: err instanceof Error ? err.message : String(err),
42
+ latency: Date.now() - start,
43
+ });
44
+ }
45
+ }
46
+ const hasError = checks.some((c) => c.status === 'error');
47
+ const hasWarn = checks.some((c) => c.status === 'warn');
48
+ return {
49
+ status: hasError ? 'error' : hasWarn ? 'degraded' : 'ok',
50
+ uptime: Math.floor((Date.now() - this.startTime) / 1000),
51
+ timestamp: new Date().toISOString(),
52
+ checks,
53
+ };
54
+ }
55
+ /** Create the /health route handler. Returns 200 for ok, 503 for degraded/error. */
56
+ handler() {
57
+ return async (ctx) => {
58
+ const health = await this.check();
59
+ ctx.response.status = health.status === 'ok' ? 200 : 503;
60
+ ctx.response.headers['content-type'] = 'application/json';
61
+ ctx.response.body = JSON.stringify(health);
62
+ };
63
+ }
64
+ }
65
+ //# sourceMappingURL=HealthCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HealthCheck.js","sourceRoot":"","sources":["../src/HealthCheck.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * HotReload — re-registers routes and middleware when TS files change.
3
+ *
4
+ * The Hyper server (Rust) stays alive. Only the TypeScript handlers are swapped.
5
+ * This gives sub-100ms reload times since no Rust recompilation is needed.
6
+ *
7
+ * @implements FR75, FR76
8
+ */
9
+ export interface HotReloadOptions {
10
+ /** Directories to watch for changes. */
11
+ watchDirs: string[];
12
+ /** File extensions to watch (default: ['.ts', '.js']). */
13
+ extensions?: string[];
14
+ /** Callback to execute on reload. */
15
+ onReload: () => Promise<void> | void;
16
+ /** Debounce delay in ms (default: 50). */
17
+ debounce?: number;
18
+ /** Logger (optional). */
19
+ logger?: {
20
+ info: (msg: string) => void;
21
+ };
22
+ }
23
+ /**
24
+ * Watch TypeScript files and trigger handler re-registration on changes.
25
+ * Returns a cleanup function to stop watching.
26
+ */
27
+ export declare function startHotReload(options: HotReloadOptions): () => void;
28
+ //# sourceMappingURL=HotReload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HotReload.d.ts","sourceRoot":"","sources":["../src/HotReload.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACpC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yBAAyB;IACzB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAA;CACzC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAgDpE"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * HotReload — re-registers routes and middleware when TS files change.
3
+ *
4
+ * The Hyper server (Rust) stays alive. Only the TypeScript handlers are swapped.
5
+ * This gives sub-100ms reload times since no Rust recompilation is needed.
6
+ *
7
+ * @implements FR75, FR76
8
+ */
9
+ import * as fs from 'node:fs';
10
+ import * as path from 'node:path';
11
+ /**
12
+ * Watch TypeScript files and trigger handler re-registration on changes.
13
+ * Returns a cleanup function to stop watching.
14
+ */
15
+ export function startHotReload(options) {
16
+ const extensions = options.extensions ?? ['.ts', '.js'];
17
+ const debounceMs = options.debounce ?? 50;
18
+ const logger = options.logger ?? { info: () => { } };
19
+ let debounceTimer;
20
+ const watchers = [];
21
+ const handleChange = (filename) => {
22
+ if (!filename || !extensions.some((ext) => filename.endsWith(ext)))
23
+ return;
24
+ if (debounceTimer)
25
+ clearTimeout(debounceTimer);
26
+ debounceTimer = setTimeout(async () => {
27
+ const start = Date.now();
28
+ try {
29
+ await options.onReload();
30
+ const duration = Date.now() - start;
31
+ logger.info(`Hot reload: ${duration}ms`);
32
+ }
33
+ catch (err) {
34
+ logger.info(`Hot reload failed: ${err instanceof Error ? err.message : String(err)}`);
35
+ }
36
+ }, debounceMs);
37
+ };
38
+ for (const dir of options.watchDirs) {
39
+ const resolved = path.resolve(dir);
40
+ if (!fs.existsSync(resolved))
41
+ continue;
42
+ try {
43
+ const watcher = fs.watch(resolved, { recursive: true }, (_event, filename) => {
44
+ handleChange(filename);
45
+ });
46
+ watchers.push(watcher);
47
+ }
48
+ catch {
49
+ // fs.watch with recursive may not be supported on all platforms
50
+ }
51
+ }
52
+ logger.info(`Hot reload watching: ${options.watchDirs.join(', ')}`);
53
+ return () => {
54
+ if (debounceTimer)
55
+ clearTimeout(debounceTimer);
56
+ for (const w of watchers)
57
+ w.close();
58
+ };
59
+ }
60
+ //# sourceMappingURL=HotReload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HotReload.js","sourceRoot":"","sources":["../src/HotReload.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAejC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAyB;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAA;IAEnD,IAAI,aAAwD,CAAA;IAC5D,MAAM,QAAQ,GAAmB,EAAE,CAAA;IAEnC,MAAM,YAAY,GAAG,CAAC,QAAuB,EAAE,EAAE;QAC/C,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,OAAM;QAE1E,IAAI,aAAa;YAAE,YAAY,CAAC,aAAa,CAAC,CAAA;QAC9C,aAAa,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACxB,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAA;gBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;gBACnC,MAAM,CAAC,IAAI,CAAC,eAAe,QAAQ,IAAI,CAAC,CAAA;YAC1C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACvF,CAAC;QACH,CAAC,EAAE,UAAU,CAAC,CAAA;IAChB,CAAC,CAAA;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAQ;QAEtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CACtB,QAAQ,EACR,EAAE,SAAS,EAAE,IAAI,EAAE,EACnB,CAAC,MAAc,EAAE,QAAuB,EAAE,EAAE;gBAC1C,YAAY,CAAC,QAAQ,CAAC,CAAA;YACxB,CAAC,CACF,CAAA;YACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;QAClE,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEnE,OAAO,GAAG,EAAE;QACV,IAAI,aAAa;YAAE,YAAY,CAAC,aAAa,CAAC,CAAA;QAC9C,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,CAAC,CAAC,KAAK,EAAE,CAAA;IACrC,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * HttpKernel — bridges HyperServer NAPI with Router + Middleware Pipeline + ExceptionHandler.
3
+ *
4
+ * Request flow (like AdonisJS):
5
+ * 1. Parse JSON from Rust NAPI
6
+ * 2. Create HttpContext
7
+ * 3. Onion pipeline: Server MW → Router MW → Route MW → Guards → Handler
8
+ * 4. ExceptionHandler for any errors
9
+ *
10
+ * @implements FR21, FR22, FR23, FR24
11
+ */
12
+ import type { Container } from './container/Container.js';
13
+ import { ExceptionHandler } from './http/Exception.js';
14
+ import { HttpContext } from './http/HttpContext.js';
15
+ import type { MiddlewareFunction, MiddlewareRegistry } from './middleware/Pipeline.js';
16
+ import type { Router } from './router/Router.js';
17
+ import type { Dict } from './types/helpers.js';
18
+ export interface HttpKernelConfig {
19
+ router: Router;
20
+ middleware: MiddlewareRegistry;
21
+ container?: Container;
22
+ exceptionHandler?: ExceptionHandler;
23
+ serverMiddleware?: MiddlewareFunction[];
24
+ routerMiddleware?: MiddlewareFunction[];
25
+ onError?: (error: unknown, ctx: HttpContext) => void;
26
+ debug?: boolean;
27
+ /**
28
+ * Lazily-resolved streaming backend. The Ignitor wires this so that
29
+ * `ctx.response.sse()` can register / push / close streams against the
30
+ * Rust HyperServer registry. Returning `undefined` short-circuits the
31
+ * SSE path with a clean error — used by mock servers in unit tests.
32
+ */
33
+ streamBackend?: () => import('./http/SseStream.js').StreamBackend | undefined;
34
+ }
35
+ export interface HttpKernelResponse {
36
+ status: number;
37
+ headers: Dict;
38
+ body: string;
39
+ /**
40
+ * Streaming-response handle. Present when the route handler opened
41
+ * an `SseStream` (`response.sse()`). The HyperServer NAPI matches
42
+ * this id against its stream registry to keep the connection open
43
+ * and feed the body from JS-pushed chunks.
44
+ */
45
+ streamId?: string;
46
+ }
47
+ /**
48
+ * Shape the kernel expects when called with an already-parsed object — the
49
+ * NAPI bridge passes this directly to skip a JSON round-trip. The string
50
+ * form is the legacy entrypoint kept for serverless / fixture use.
51
+ */
52
+ export interface HttpKernelRequest {
53
+ method: string;
54
+ path: string;
55
+ query: string;
56
+ headers: Dict;
57
+ body: string;
58
+ bodyEncoding?: 'utf8' | 'base64';
59
+ remoteAddr?: string;
60
+ }
61
+ export declare function createHttpKernel(config: HttpKernelConfig): (request: HttpKernelRequest) => Promise<HttpKernelResponse>;
62
+ //# sourceMappingURL=HttpKernel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpKernel.d.ts","sourceRoot":"","sources":["../src/HttpKernel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEzD,OAAO,EAAqB,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAEtF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,kBAAkB,CAAA;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,CAAA;IACvC,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,CAAA;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,KAAK,IAAI,CAAA;IACpD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,OAAO,qBAAqB,EAAE,aAAa,GAAG,SAAS,CAAA;CAC9E;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,IAAI,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,IAAI,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IAChC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,gBAAgB,GACvB,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAyL7D"}