@kabyeon/nexusjs 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (669) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +860 -0
  3. package/dist/auth/auth.controller.d.ts +175 -0
  4. package/dist/auth/auth.controller.d.ts.map +1 -0
  5. package/dist/auth/auth.d.ts +47 -0
  6. package/dist/auth/auth.d.ts.map +1 -0
  7. package/dist/auth/auth.module.d.ts +34 -0
  8. package/dist/auth/auth.module.d.ts.map +1 -0
  9. package/dist/auth/auth.service.d.ts +192 -0
  10. package/dist/auth/auth.service.d.ts.map +1 -0
  11. package/dist/auth/decorators/current-user.d.ts +58 -0
  12. package/dist/auth/decorators/current-user.d.ts.map +1 -0
  13. package/dist/auth/index.d.ts +43 -0
  14. package/dist/auth/index.d.ts.map +1 -0
  15. package/dist/auth/index.js +730 -0
  16. package/dist/auth/index.js.map +25 -0
  17. package/dist/auth/middleware.d.ts +50 -0
  18. package/dist/auth/middleware.d.ts.map +1 -0
  19. package/dist/auth/types.d.ts +135 -0
  20. package/dist/auth/types.d.ts.map +1 -0
  21. package/dist/cache/cache.module.d.ts +22 -0
  22. package/dist/cache/cache.module.d.ts.map +1 -0
  23. package/dist/cache/cache.service.d.ts +37 -0
  24. package/dist/cache/cache.service.d.ts.map +1 -0
  25. package/dist/cache/index.d.ts +9 -0
  26. package/dist/cache/index.d.ts.map +1 -0
  27. package/dist/cache/index.js +814 -0
  28. package/dist/cache/index.js.map +25 -0
  29. package/dist/cache/stores/drizzle.d.ts +76 -0
  30. package/dist/cache/stores/drizzle.d.ts.map +1 -0
  31. package/dist/cache/stores/index.d.ts +10 -0
  32. package/dist/cache/stores/index.d.ts.map +1 -0
  33. package/dist/cache/stores/memory.d.ts +34 -0
  34. package/dist/cache/stores/memory.d.ts.map +1 -0
  35. package/dist/cache/stores/redis.d.ts +46 -0
  36. package/dist/cache/stores/redis.d.ts.map +1 -0
  37. package/dist/cache/types.d.ts +88 -0
  38. package/dist/cache/types.d.ts.map +1 -0
  39. package/dist/cli/commands/config.d.ts +44 -0
  40. package/dist/cli/commands/config.d.ts.map +1 -0
  41. package/dist/cli/commands/db-generate.d.ts +20 -0
  42. package/dist/cli/commands/db-generate.d.ts.map +1 -0
  43. package/dist/cli/commands/db-migrate.d.ts +33 -0
  44. package/dist/cli/commands/db-migrate.d.ts.map +1 -0
  45. package/dist/cli/commands/db-seed.d.ts +43 -0
  46. package/dist/cli/commands/db-seed.d.ts.map +1 -0
  47. package/dist/cli/commands/index.d.ts +11 -0
  48. package/dist/cli/commands/index.d.ts.map +1 -0
  49. package/dist/cli/commands/info.d.ts +11 -0
  50. package/dist/cli/commands/info.d.ts.map +1 -0
  51. package/dist/cli/commands/init.d.ts +38 -0
  52. package/dist/cli/commands/init.d.ts.map +1 -0
  53. package/dist/cli/commands/make-auth.d.ts +17 -0
  54. package/dist/cli/commands/make-auth.d.ts.map +1 -0
  55. package/dist/cli/commands/make-controller.d.ts +16 -0
  56. package/dist/cli/commands/make-controller.d.ts.map +1 -0
  57. package/dist/cli/commands/make-crud.d.ts +28 -0
  58. package/dist/cli/commands/make-crud.d.ts.map +1 -0
  59. package/dist/cli/commands/make-listener.d.ts +15 -0
  60. package/dist/cli/commands/make-listener.d.ts.map +1 -0
  61. package/dist/cli/commands/make-middleware.d.ts +7 -0
  62. package/dist/cli/commands/make-middleware.d.ts.map +1 -0
  63. package/dist/cli/commands/make-migration.d.ts +21 -0
  64. package/dist/cli/commands/make-migration.d.ts.map +1 -0
  65. package/dist/cli/commands/make-model.d.ts +22 -0
  66. package/dist/cli/commands/make-model.d.ts.map +1 -0
  67. package/dist/cli/commands/make-module.d.ts +11 -0
  68. package/dist/cli/commands/make-module.d.ts.map +1 -0
  69. package/dist/cli/commands/make-queue.d.ts +17 -0
  70. package/dist/cli/commands/make-queue.d.ts.map +1 -0
  71. package/dist/cli/commands/make-schedule.d.ts +17 -0
  72. package/dist/cli/commands/make-schedule.d.ts.map +1 -0
  73. package/dist/cli/commands/make-service.d.ts +7 -0
  74. package/dist/cli/commands/make-service.d.ts.map +1 -0
  75. package/dist/cli/commands/make-session.d.ts +15 -0
  76. package/dist/cli/commands/make-session.d.ts.map +1 -0
  77. package/dist/cli/commands/make-validator.d.ts +7 -0
  78. package/dist/cli/commands/make-validator.d.ts.map +1 -0
  79. package/dist/cli/commands/new.d.ts +14 -0
  80. package/dist/cli/commands/new.d.ts.map +1 -0
  81. package/dist/cli/commands/repl.d.ts +42 -0
  82. package/dist/cli/commands/repl.d.ts.map +1 -0
  83. package/dist/cli/commands/route-list.d.ts +12 -0
  84. package/dist/cli/commands/route-list.d.ts.map +1 -0
  85. package/dist/cli/core/args.d.ts +29 -0
  86. package/dist/cli/core/args.d.ts.map +1 -0
  87. package/dist/cli/core/config.d.ts +137 -0
  88. package/dist/cli/core/config.d.ts.map +1 -0
  89. package/dist/cli/core/fs.d.ts +38 -0
  90. package/dist/cli/core/fs.d.ts.map +1 -0
  91. package/dist/cli/core/index.d.ts +42 -0
  92. package/dist/cli/core/index.d.ts.map +1 -0
  93. package/dist/cli/core/logger.d.ts +46 -0
  94. package/dist/cli/core/logger.d.ts.map +1 -0
  95. package/dist/cli/core/loose-json.d.ts +26 -0
  96. package/dist/cli/core/loose-json.d.ts.map +1 -0
  97. package/dist/cli/core/prompts.d.ts +22 -0
  98. package/dist/cli/core/prompts.d.ts.map +1 -0
  99. package/dist/cli/core/template.d.ts +26 -0
  100. package/dist/cli/core/template.d.ts.map +1 -0
  101. package/dist/cli/index.d.ts +1 -0
  102. package/dist/cli/index.d.ts.map +1 -0
  103. package/dist/cli/index.js +6136 -0
  104. package/dist/cli/index.js.map +91 -0
  105. package/dist/cli/templates/controller/adonis.d.ts +10 -0
  106. package/dist/cli/templates/controller/adonis.d.ts.map +1 -0
  107. package/dist/cli/templates/controller/functional.d.ts +9 -0
  108. package/dist/cli/templates/controller/functional.d.ts.map +1 -0
  109. package/dist/cli/templates/controller/nest.d.ts +17 -0
  110. package/dist/cli/templates/controller/nest.d.ts.map +1 -0
  111. package/dist/cli/templates/crud/controller.d.ts +8 -0
  112. package/dist/cli/templates/crud/controller.d.ts.map +1 -0
  113. package/dist/cli/templates/crud/dto.d.ts +8 -0
  114. package/dist/cli/templates/crud/dto.d.ts.map +1 -0
  115. package/dist/cli/templates/crud/index.d.ts +33 -0
  116. package/dist/cli/templates/crud/index.d.ts.map +1 -0
  117. package/dist/cli/templates/crud/module.d.ts +6 -0
  118. package/dist/cli/templates/crud/module.d.ts.map +1 -0
  119. package/dist/cli/templates/crud/test.d.ts +10 -0
  120. package/dist/cli/templates/crud/test.d.ts.map +1 -0
  121. package/dist/cli/templates/index.d.ts +39 -0
  122. package/dist/cli/templates/index.d.ts.map +1 -0
  123. package/dist/cli/templates/middleware/middleware.d.ts +8 -0
  124. package/dist/cli/templates/middleware/middleware.d.ts.map +1 -0
  125. package/dist/cli/templates/migration/drizzle.d.ts +12 -0
  126. package/dist/cli/templates/migration/drizzle.d.ts.map +1 -0
  127. package/dist/cli/templates/migration/sql.d.ts +10 -0
  128. package/dist/cli/templates/migration/sql.d.ts.map +1 -0
  129. package/dist/cli/templates/model/drizzle-dialect.d.ts +29 -0
  130. package/dist/cli/templates/model/drizzle-dialect.d.ts.map +1 -0
  131. package/dist/cli/templates/model/drizzle.d.ts +14 -0
  132. package/dist/cli/templates/model/drizzle.d.ts.map +1 -0
  133. package/dist/cli/templates/model/kysely.d.ts +12 -0
  134. package/dist/cli/templates/model/kysely.d.ts.map +1 -0
  135. package/dist/cli/templates/model/prisma.d.ts +12 -0
  136. package/dist/cli/templates/model/prisma.d.ts.map +1 -0
  137. package/dist/cli/templates/module/module.d.ts +16 -0
  138. package/dist/cli/templates/module/module.d.ts.map +1 -0
  139. package/dist/cli/templates/project/drizzle.config.d.ts +12 -0
  140. package/dist/cli/templates/project/drizzle.config.d.ts.map +1 -0
  141. package/dist/cli/templates/project/nx.config.d.ts +7 -0
  142. package/dist/cli/templates/project/nx.config.d.ts.map +1 -0
  143. package/dist/cli/templates/repository/repository.d.ts +13 -0
  144. package/dist/cli/templates/repository/repository.d.ts.map +1 -0
  145. package/dist/cli/templates/service/service.d.ts +12 -0
  146. package/dist/cli/templates/service/service.d.ts.map +1 -0
  147. package/dist/cli/templates/validator/validator.d.ts +8 -0
  148. package/dist/cli/templates/validator/validator.d.ts.map +1 -0
  149. package/dist/config/config.module.d.ts +39 -0
  150. package/dist/config/config.module.d.ts.map +1 -0
  151. package/dist/config/config.service.d.ts +47 -0
  152. package/dist/config/config.service.d.ts.map +1 -0
  153. package/dist/config/index.d.ts +39 -0
  154. package/dist/config/index.d.ts.map +1 -0
  155. package/dist/config/index.js +436 -0
  156. package/dist/config/index.js.map +21 -0
  157. package/dist/config/types.d.ts +78 -0
  158. package/dist/config/types.d.ts.map +1 -0
  159. package/dist/core/application.d.ts +77 -0
  160. package/dist/core/application.d.ts.map +1 -0
  161. package/dist/core/constants.d.ts +48 -0
  162. package/dist/core/constants.d.ts.map +1 -0
  163. package/dist/core/decorators/controller.d.ts +21 -0
  164. package/dist/core/decorators/controller.d.ts.map +1 -0
  165. package/dist/core/decorators/http-methods.d.ts +33 -0
  166. package/dist/core/decorators/http-methods.d.ts.map +1 -0
  167. package/dist/core/decorators/index.d.ts +12 -0
  168. package/dist/core/decorators/index.d.ts.map +1 -0
  169. package/dist/core/decorators/injectable.d.ts +42 -0
  170. package/dist/core/decorators/injectable.d.ts.map +1 -0
  171. package/dist/core/decorators/metadata.d.ts +7 -0
  172. package/dist/core/decorators/metadata.d.ts.map +1 -0
  173. package/dist/core/decorators/module.d.ts +23 -0
  174. package/dist/core/decorators/module.d.ts.map +1 -0
  175. package/dist/core/decorators/params.d.ts +33 -0
  176. package/dist/core/decorators/params.d.ts.map +1 -0
  177. package/dist/core/decorators/repository.d.ts +24 -0
  178. package/dist/core/decorators/repository.d.ts.map +1 -0
  179. package/dist/core/decorators/validate.d.ts +21 -0
  180. package/dist/core/decorators/validate.d.ts.map +1 -0
  181. package/dist/core/di/container.d.ts +70 -0
  182. package/dist/core/di/container.d.ts.map +1 -0
  183. package/dist/core/di/index.d.ts +9 -0
  184. package/dist/core/di/index.d.ts.map +1 -0
  185. package/dist/core/di/request-middleware.d.ts +36 -0
  186. package/dist/core/di/request-middleware.d.ts.map +1 -0
  187. package/dist/core/di/request-scope.d.ts +45 -0
  188. package/dist/core/di/request-scope.d.ts.map +1 -0
  189. package/dist/core/di/scanner.d.ts +36 -0
  190. package/dist/core/di/scanner.d.ts.map +1 -0
  191. package/dist/core/di/tokens.d.ts +98 -0
  192. package/dist/core/di/tokens.d.ts.map +1 -0
  193. package/dist/core/http/context.d.ts +30 -0
  194. package/dist/core/http/context.d.ts.map +1 -0
  195. package/dist/core/http/index.d.ts +8 -0
  196. package/dist/core/http/index.d.ts.map +1 -0
  197. package/dist/core/http/middleware.d.ts +31 -0
  198. package/dist/core/http/middleware.d.ts.map +1 -0
  199. package/dist/core/http/router.d.ts +46 -0
  200. package/dist/core/http/router.d.ts.map +1 -0
  201. package/dist/core/http/server.d.ts +58 -0
  202. package/dist/core/http/server.d.ts.map +1 -0
  203. package/dist/core/index.d.ts +20 -0
  204. package/dist/core/index.d.ts.map +1 -0
  205. package/dist/core/orm/drizzle-adapter.d.ts +73 -0
  206. package/dist/core/orm/drizzle-adapter.d.ts.map +1 -0
  207. package/dist/core/orm/index.d.ts +5 -0
  208. package/dist/core/orm/index.d.ts.map +1 -0
  209. package/dist/core/runtime/bun.d.ts +13 -0
  210. package/dist/core/runtime/bun.d.ts.map +1 -0
  211. package/dist/core/runtime/cloudflare.d.ts +18 -0
  212. package/dist/core/runtime/cloudflare.d.ts.map +1 -0
  213. package/dist/core/runtime/index.d.ts +11 -0
  214. package/dist/core/runtime/index.d.ts.map +1 -0
  215. package/dist/core/runtime/node.d.ts +10 -0
  216. package/dist/core/runtime/node.d.ts.map +1 -0
  217. package/dist/core/validation/index.d.ts +5 -0
  218. package/dist/core/validation/index.d.ts.map +1 -0
  219. package/dist/core/validation/validator.d.ts +46 -0
  220. package/dist/core/validation/validator.d.ts.map +1 -0
  221. package/dist/crypto/encryption.d.ts +71 -0
  222. package/dist/crypto/encryption.d.ts.map +1 -0
  223. package/dist/crypto/hash.d.ts +52 -0
  224. package/dist/crypto/hash.d.ts.map +1 -0
  225. package/dist/crypto/index.d.ts +49 -0
  226. package/dist/crypto/index.d.ts.map +1 -0
  227. package/dist/crypto/index.js +533 -0
  228. package/dist/crypto/index.js.map +14 -0
  229. package/dist/crypto/module.d.ts +28 -0
  230. package/dist/crypto/module.d.ts.map +1 -0
  231. package/dist/crypto/types.d.ts +81 -0
  232. package/dist/crypto/types.d.ts.map +1 -0
  233. package/dist/drive/drive.module.d.ts +20 -0
  234. package/dist/drive/drive.module.d.ts.map +1 -0
  235. package/dist/drive/drive.service.d.ts +21 -0
  236. package/dist/drive/drive.service.d.ts.map +1 -0
  237. package/dist/drive/drivers/index.d.ts +9 -0
  238. package/dist/drive/drivers/index.d.ts.map +1 -0
  239. package/dist/drive/drivers/local.d.ts +24 -0
  240. package/dist/drive/drivers/local.d.ts.map +1 -0
  241. package/dist/drive/drivers/memory.d.ts +19 -0
  242. package/dist/drive/drivers/memory.d.ts.map +1 -0
  243. package/dist/drive/drivers/s3.d.ts +44 -0
  244. package/dist/drive/drivers/s3.d.ts.map +1 -0
  245. package/dist/drive/index.d.ts +9 -0
  246. package/dist/drive/index.d.ts.map +1 -0
  247. package/dist/drive/index.js +714 -0
  248. package/dist/drive/index.js.map +25 -0
  249. package/dist/drive/types.d.ts +97 -0
  250. package/dist/drive/types.d.ts.map +1 -0
  251. package/dist/drizzle/decorators/columns.d.ts +16 -0
  252. package/dist/drizzle/decorators/columns.d.ts.map +1 -0
  253. package/dist/drizzle/decorators/index.d.ts +6 -0
  254. package/dist/drizzle/decorators/index.d.ts.map +1 -0
  255. package/dist/drizzle/drivers/base.d.ts +32 -0
  256. package/dist/drizzle/drivers/base.d.ts.map +1 -0
  257. package/dist/drizzle/drivers/bun-sqlite.d.ts +6 -0
  258. package/dist/drizzle/drivers/bun-sqlite.d.ts.map +1 -0
  259. package/dist/drizzle/drivers/d1.d.ts +7 -0
  260. package/dist/drizzle/drivers/d1.d.ts.map +1 -0
  261. package/dist/drizzle/drivers/index.d.ts +14 -0
  262. package/dist/drizzle/drivers/index.d.ts.map +1 -0
  263. package/dist/drizzle/drivers/mysql.d.ts +6 -0
  264. package/dist/drizzle/drivers/mysql.d.ts.map +1 -0
  265. package/dist/drizzle/drivers/postgres.d.ts +12 -0
  266. package/dist/drizzle/drivers/postgres.d.ts.map +1 -0
  267. package/dist/drizzle/drivers/sqlite.d.ts +8 -0
  268. package/dist/drizzle/drivers/sqlite.d.ts.map +1 -0
  269. package/dist/drizzle/drizzle.module.d.ts +29 -0
  270. package/dist/drizzle/drizzle.module.d.ts.map +1 -0
  271. package/dist/drizzle/drizzle.service.d.ts +52 -0
  272. package/dist/drizzle/drizzle.service.d.ts.map +1 -0
  273. package/dist/drizzle/index.d.ts +13 -0
  274. package/dist/drizzle/index.d.ts.map +1 -0
  275. package/dist/drizzle/index.js +979 -0
  276. package/dist/drizzle/index.js.map +32 -0
  277. package/dist/drizzle/model.d.ts +26 -0
  278. package/dist/drizzle/model.d.ts.map +1 -0
  279. package/dist/drizzle/raw-query.d.ts +41 -0
  280. package/dist/drizzle/raw-query.d.ts.map +1 -0
  281. package/dist/drizzle/repository/index.d.ts +6 -0
  282. package/dist/drizzle/repository/index.d.ts.map +1 -0
  283. package/dist/drizzle/repository/repository.d.ts +60 -0
  284. package/dist/drizzle/repository/repository.d.ts.map +1 -0
  285. package/dist/drizzle/types.d.ts +160 -0
  286. package/dist/drizzle/types.d.ts.map +1 -0
  287. package/dist/events/decorators/on-event.d.ts +49 -0
  288. package/dist/events/decorators/on-event.d.ts.map +1 -0
  289. package/dist/events/emitter.d.ts +52 -0
  290. package/dist/events/emitter.d.ts.map +1 -0
  291. package/dist/events/event.service.d.ts +27 -0
  292. package/dist/events/event.service.d.ts.map +1 -0
  293. package/dist/events/events.module.d.ts +35 -0
  294. package/dist/events/events.module.d.ts.map +1 -0
  295. package/dist/events/index.d.ts +43 -0
  296. package/dist/events/index.d.ts.map +1 -0
  297. package/dist/events/index.js +646 -0
  298. package/dist/events/index.js.map +23 -0
  299. package/dist/events/types.d.ts +120 -0
  300. package/dist/events/types.d.ts.map +1 -0
  301. package/dist/grpc/decorators.d.ts +34 -0
  302. package/dist/grpc/decorators.d.ts.map +1 -0
  303. package/dist/grpc/index.d.ts +70 -0
  304. package/dist/grpc/index.d.ts.map +1 -0
  305. package/dist/grpc/index.js +528 -0
  306. package/dist/grpc/index.js.map +22 -0
  307. package/dist/grpc/module.d.ts +32 -0
  308. package/dist/grpc/module.d.ts.map +1 -0
  309. package/dist/grpc/service.d.ts +60 -0
  310. package/dist/grpc/service.d.ts.map +1 -0
  311. package/dist/grpc/types.d.ts +79 -0
  312. package/dist/grpc/types.d.ts.map +1 -0
  313. package/dist/health/health.controller.d.ts +61 -0
  314. package/dist/health/health.controller.d.ts.map +1 -0
  315. package/dist/health/health.module.d.ts +29 -0
  316. package/dist/health/health.module.d.ts.map +1 -0
  317. package/dist/health/health.service.d.ts +34 -0
  318. package/dist/health/health.service.d.ts.map +1 -0
  319. package/dist/health/index.d.ts +38 -0
  320. package/dist/health/index.d.ts.map +1 -0
  321. package/dist/health/index.js +599 -0
  322. package/dist/health/index.js.map +25 -0
  323. package/dist/health/indicators/drizzle.d.ts +18 -0
  324. package/dist/health/indicators/drizzle.d.ts.map +1 -0
  325. package/dist/health/indicators/index.d.ts +59 -0
  326. package/dist/health/indicators/index.d.ts.map +1 -0
  327. package/dist/health/types.d.ts +105 -0
  328. package/dist/health/types.d.ts.map +1 -0
  329. package/dist/i18n/decorators.d.ts +14 -0
  330. package/dist/i18n/decorators.d.ts.map +1 -0
  331. package/dist/i18n/index.d.ts +48 -0
  332. package/dist/i18n/index.d.ts.map +1 -0
  333. package/dist/i18n/index.js +589 -0
  334. package/dist/i18n/index.js.map +17 -0
  335. package/dist/i18n/middleware.d.ts +26 -0
  336. package/dist/i18n/middleware.d.ts.map +1 -0
  337. package/dist/i18n/module.d.ts +39 -0
  338. package/dist/i18n/module.d.ts.map +1 -0
  339. package/dist/i18n/service.d.ts +130 -0
  340. package/dist/i18n/service.d.ts.map +1 -0
  341. package/dist/i18n/types.d.ts +65 -0
  342. package/dist/i18n/types.d.ts.map +1 -0
  343. package/dist/index.d.ts +2 -0
  344. package/dist/index.js +2056 -0
  345. package/dist/index.js.map +53 -0
  346. package/dist/limiter/backends/drizzle.d.ts +40 -0
  347. package/dist/limiter/backends/drizzle.d.ts.map +1 -0
  348. package/dist/limiter/backends/index.d.ts +6 -0
  349. package/dist/limiter/backends/index.d.ts.map +1 -0
  350. package/dist/limiter/backends/memory.d.ts +28 -0
  351. package/dist/limiter/backends/memory.d.ts.map +1 -0
  352. package/dist/limiter/index.d.ts +9 -0
  353. package/dist/limiter/index.d.ts.map +1 -0
  354. package/dist/limiter/index.js +640 -0
  355. package/dist/limiter/index.js.map +25 -0
  356. package/dist/limiter/limiter.middleware.d.ts +11 -0
  357. package/dist/limiter/limiter.middleware.d.ts.map +1 -0
  358. package/dist/limiter/limiter.module.d.ts +23 -0
  359. package/dist/limiter/limiter.module.d.ts.map +1 -0
  360. package/dist/limiter/limiter.service.d.ts +18 -0
  361. package/dist/limiter/limiter.service.d.ts.map +1 -0
  362. package/dist/limiter/types.d.ts +99 -0
  363. package/dist/limiter/types.d.ts.map +1 -0
  364. package/dist/logger/index.d.ts +36 -0
  365. package/dist/logger/index.d.ts.map +1 -0
  366. package/dist/logger/index.js +538 -0
  367. package/dist/logger/index.js.map +22 -0
  368. package/dist/logger/logger.module.d.ts +35 -0
  369. package/dist/logger/logger.module.d.ts.map +1 -0
  370. package/dist/logger/logger.service.d.ts +55 -0
  371. package/dist/logger/logger.service.d.ts.map +1 -0
  372. package/dist/logger/transports/index.d.ts +35 -0
  373. package/dist/logger/transports/index.d.ts.map +1 -0
  374. package/dist/logger/types.d.ts +58 -0
  375. package/dist/logger/types.d.ts.map +1 -0
  376. package/dist/mail/index.d.ts +9 -0
  377. package/dist/mail/index.d.ts.map +1 -0
  378. package/dist/mail/index.js +479 -0
  379. package/dist/mail/index.js.map +25 -0
  380. package/dist/mail/mail.module.d.ts +21 -0
  381. package/dist/mail/mail.module.d.ts.map +1 -0
  382. package/dist/mail/mail.service.d.ts +18 -0
  383. package/dist/mail/mail.service.d.ts.map +1 -0
  384. package/dist/mail/transports/file.d.ts +19 -0
  385. package/dist/mail/transports/file.d.ts.map +1 -0
  386. package/dist/mail/transports/index.d.ts +9 -0
  387. package/dist/mail/transports/index.d.ts.map +1 -0
  388. package/dist/mail/transports/null.d.ts +11 -0
  389. package/dist/mail/transports/null.d.ts.map +1 -0
  390. package/dist/mail/transports/smtp.d.ts +40 -0
  391. package/dist/mail/transports/smtp.d.ts.map +1 -0
  392. package/dist/mail/types.d.ts +73 -0
  393. package/dist/mail/types.d.ts.map +1 -0
  394. package/dist/metrics/controller.d.ts +27 -0
  395. package/dist/metrics/controller.d.ts.map +1 -0
  396. package/dist/metrics/counter.d.ts +36 -0
  397. package/dist/metrics/counter.d.ts.map +1 -0
  398. package/dist/metrics/decorators/counted.d.ts +26 -0
  399. package/dist/metrics/decorators/counted.d.ts.map +1 -0
  400. package/dist/metrics/decorators/index.d.ts +3 -0
  401. package/dist/metrics/decorators/index.d.ts.map +1 -0
  402. package/dist/metrics/decorators/timed.d.ts +25 -0
  403. package/dist/metrics/decorators/timed.d.ts.map +1 -0
  404. package/dist/metrics/gauge.d.ts +38 -0
  405. package/dist/metrics/gauge.d.ts.map +1 -0
  406. package/dist/metrics/histogram.d.ts +52 -0
  407. package/dist/metrics/histogram.d.ts.map +1 -0
  408. package/dist/metrics/index.d.ts +35 -0
  409. package/dist/metrics/index.d.ts.map +1 -0
  410. package/dist/metrics/index.js +1033 -0
  411. package/dist/metrics/index.js.map +21 -0
  412. package/dist/metrics/module.d.ts +33 -0
  413. package/dist/metrics/module.d.ts.map +1 -0
  414. package/dist/metrics/registry.d.ts +52 -0
  415. package/dist/metrics/registry.d.ts.map +1 -0
  416. package/dist/metrics/service.d.ts +42 -0
  417. package/dist/metrics/service.d.ts.map +1 -0
  418. package/dist/metrics/summary.d.ts +50 -0
  419. package/dist/metrics/summary.d.ts.map +1 -0
  420. package/dist/metrics/types.d.ts +115 -0
  421. package/dist/metrics/types.d.ts.map +1 -0
  422. package/dist/openapi/decorators/body.d.ts +9 -0
  423. package/dist/openapi/decorators/body.d.ts.map +1 -0
  424. package/dist/openapi/decorators/index.d.ts +11 -0
  425. package/dist/openapi/decorators/index.d.ts.map +1 -0
  426. package/dist/openapi/decorators/operation.d.ts +9 -0
  427. package/dist/openapi/decorators/operation.d.ts.map +1 -0
  428. package/dist/openapi/decorators/param.d.ts +17 -0
  429. package/dist/openapi/decorators/param.d.ts.map +1 -0
  430. package/dist/openapi/decorators/property.d.ts +24 -0
  431. package/dist/openapi/decorators/property.d.ts.map +1 -0
  432. package/dist/openapi/decorators/response.d.ts +10 -0
  433. package/dist/openapi/decorators/response.d.ts.map +1 -0
  434. package/dist/openapi/decorators/security.d.ts +9 -0
  435. package/dist/openapi/decorators/security.d.ts.map +1 -0
  436. package/dist/openapi/decorators/tags.d.ts +2 -0
  437. package/dist/openapi/decorators/tags.d.ts.map +1 -0
  438. package/dist/openapi/index.d.ts +10 -0
  439. package/dist/openapi/index.d.ts.map +1 -0
  440. package/dist/openapi/index.js +974 -0
  441. package/dist/openapi/index.js.map +31 -0
  442. package/dist/openapi/openapi.module.d.ts +46 -0
  443. package/dist/openapi/openapi.module.d.ts.map +1 -0
  444. package/dist/openapi/openapi.service.d.ts +55 -0
  445. package/dist/openapi/openapi.service.d.ts.map +1 -0
  446. package/dist/openapi/scalar.d.ts +16 -0
  447. package/dist/openapi/scalar.d.ts.map +1 -0
  448. package/dist/openapi/types.d.ts +266 -0
  449. package/dist/openapi/types.d.ts.map +1 -0
  450. package/dist/openapi/zod-to-json-schema.d.ts +34 -0
  451. package/dist/openapi/zod-to-json-schema.d.ts.map +1 -0
  452. package/dist/package.json +59 -0
  453. package/dist/queue/backends/bullmq.d.ts +41 -0
  454. package/dist/queue/backends/bullmq.d.ts.map +1 -0
  455. package/dist/queue/backends/cloudflare.d.ts +84 -0
  456. package/dist/queue/backends/cloudflare.d.ts.map +1 -0
  457. package/dist/queue/backends/index.d.ts +7 -0
  458. package/dist/queue/backends/index.d.ts.map +1 -0
  459. package/dist/queue/backends/memory.d.ts +24 -0
  460. package/dist/queue/backends/memory.d.ts.map +1 -0
  461. package/dist/queue/decorators/on-queue-ready.d.ts +43 -0
  462. package/dist/queue/decorators/on-queue-ready.d.ts.map +1 -0
  463. package/dist/queue/index.d.ts +57 -0
  464. package/dist/queue/index.d.ts.map +1 -0
  465. package/dist/queue/index.js +961 -0
  466. package/dist/queue/index.js.map +25 -0
  467. package/dist/queue/queue.module.d.ts +46 -0
  468. package/dist/queue/queue.module.d.ts.map +1 -0
  469. package/dist/queue/queue.service.d.ts +61 -0
  470. package/dist/queue/queue.service.d.ts.map +1 -0
  471. package/dist/queue/types.d.ts +204 -0
  472. package/dist/queue/types.d.ts.map +1 -0
  473. package/dist/redis/adapters/bun.d.ts +27 -0
  474. package/dist/redis/adapters/bun.d.ts.map +1 -0
  475. package/dist/redis/adapters/cloudflare.d.ts +51 -0
  476. package/dist/redis/adapters/cloudflare.d.ts.map +1 -0
  477. package/dist/redis/adapters/index.d.ts +29 -0
  478. package/dist/redis/adapters/index.d.ts.map +1 -0
  479. package/dist/redis/adapters/memory.d.ts +28 -0
  480. package/dist/redis/adapters/memory.d.ts.map +1 -0
  481. package/dist/redis/adapters/node.d.ts +36 -0
  482. package/dist/redis/adapters/node.d.ts.map +1 -0
  483. package/dist/redis/index.d.ts +33 -0
  484. package/dist/redis/index.d.ts.map +1 -0
  485. package/dist/redis/index.js +667 -0
  486. package/dist/redis/index.js.map +25 -0
  487. package/dist/redis/module.d.ts +32 -0
  488. package/dist/redis/module.d.ts.map +1 -0
  489. package/dist/redis/types.d.ts +146 -0
  490. package/dist/redis/types.d.ts.map +1 -0
  491. package/dist/schedule/backends/cloudflare.d.ts +55 -0
  492. package/dist/schedule/backends/cloudflare.d.ts.map +1 -0
  493. package/dist/schedule/backends/index.d.ts +3 -0
  494. package/dist/schedule/backends/index.d.ts.map +1 -0
  495. package/dist/schedule/backends/memory.d.ts +39 -0
  496. package/dist/schedule/backends/memory.d.ts.map +1 -0
  497. package/dist/schedule/cron-parser.d.ts +48 -0
  498. package/dist/schedule/cron-parser.d.ts.map +1 -0
  499. package/dist/schedule/decorators/cron.d.ts +71 -0
  500. package/dist/schedule/decorators/cron.d.ts.map +1 -0
  501. package/dist/schedule/index.d.ts +51 -0
  502. package/dist/schedule/index.d.ts.map +1 -0
  503. package/dist/schedule/index.js +1108 -0
  504. package/dist/schedule/index.js.map +25 -0
  505. package/dist/schedule/schedule.module.d.ts +44 -0
  506. package/dist/schedule/schedule.module.d.ts.map +1 -0
  507. package/dist/schedule/schedule.service.d.ts +51 -0
  508. package/dist/schedule/schedule.service.d.ts.map +1 -0
  509. package/dist/schedule/types.d.ts +150 -0
  510. package/dist/schedule/types.d.ts.map +1 -0
  511. package/dist/session/backends/cookie.d.ts +56 -0
  512. package/dist/session/backends/cookie.d.ts.map +1 -0
  513. package/dist/session/backends/drizzle.d.ts +65 -0
  514. package/dist/session/backends/drizzle.d.ts.map +1 -0
  515. package/dist/session/backends/index.d.ts +6 -0
  516. package/dist/session/backends/index.d.ts.map +1 -0
  517. package/dist/session/backends/memory.d.ts +32 -0
  518. package/dist/session/backends/memory.d.ts.map +1 -0
  519. package/dist/session/backends/redis.d.ts +53 -0
  520. package/dist/session/backends/redis.d.ts.map +1 -0
  521. package/dist/session/decorators/current-session.d.ts +56 -0
  522. package/dist/session/decorators/current-session.d.ts.map +1 -0
  523. package/dist/session/index.d.ts +42 -0
  524. package/dist/session/index.d.ts.map +1 -0
  525. package/dist/session/index.js +1498 -0
  526. package/dist/session/index.js.map +28 -0
  527. package/dist/session/session-middleware.d.ts +29 -0
  528. package/dist/session/session-middleware.d.ts.map +1 -0
  529. package/dist/session/session.module.d.ts +35 -0
  530. package/dist/session/session.module.d.ts.map +1 -0
  531. package/dist/session/session.service.d.ts +49 -0
  532. package/dist/session/session.service.d.ts.map +1 -0
  533. package/dist/session/types.d.ts +201 -0
  534. package/dist/session/types.d.ts.map +1 -0
  535. package/dist/shield/guards/csrf.d.ts +33 -0
  536. package/dist/shield/guards/csrf.d.ts.map +1 -0
  537. package/dist/shield/guards/headers.d.ts +22 -0
  538. package/dist/shield/guards/headers.d.ts.map +1 -0
  539. package/dist/shield/guards/index.d.ts +6 -0
  540. package/dist/shield/guards/index.d.ts.map +1 -0
  541. package/dist/shield/index.d.ts +8 -0
  542. package/dist/shield/index.d.ts.map +1 -0
  543. package/dist/shield/index.js +728 -0
  544. package/dist/shield/index.js.map +25 -0
  545. package/dist/shield/shield.module.d.ts +25 -0
  546. package/dist/shield/shield.module.d.ts.map +1 -0
  547. package/dist/shield/shield.service.d.ts +21 -0
  548. package/dist/shield/shield.service.d.ts.map +1 -0
  549. package/dist/shield/types.d.ts +95 -0
  550. package/dist/shield/types.d.ts.map +1 -0
  551. package/dist/sse/index.d.ts +7 -0
  552. package/dist/sse/index.d.ts.map +1 -0
  553. package/dist/sse/index.js +214 -0
  554. package/dist/sse/index.js.map +13 -0
  555. package/dist/sse/sse-stream.d.ts +46 -0
  556. package/dist/sse/sse-stream.d.ts.map +1 -0
  557. package/dist/sse/sse.d.ts +24 -0
  558. package/dist/sse/sse.d.ts.map +1 -0
  559. package/dist/sse/types.d.ts +84 -0
  560. package/dist/sse/types.d.ts.map +1 -0
  561. package/dist/static/index.d.ts +41 -0
  562. package/dist/static/index.d.ts.map +1 -0
  563. package/dist/static/index.js +313 -0
  564. package/dist/static/index.js.map +13 -0
  565. package/dist/static/static.module.d.ts +41 -0
  566. package/dist/static/static.module.d.ts.map +1 -0
  567. package/dist/static/static.service.d.ts +38 -0
  568. package/dist/static/static.service.d.ts.map +1 -0
  569. package/dist/tracing/decorators/index.d.ts +2 -0
  570. package/dist/tracing/decorators/index.d.ts.map +1 -0
  571. package/dist/tracing/decorators/trace.d.ts +37 -0
  572. package/dist/tracing/decorators/trace.d.ts.map +1 -0
  573. package/dist/tracing/hono-instrumentation.d.ts +21 -0
  574. package/dist/tracing/hono-instrumentation.d.ts.map +1 -0
  575. package/dist/tracing/index.d.ts +29 -0
  576. package/dist/tracing/index.d.ts.map +1 -0
  577. package/dist/tracing/index.js +782 -0
  578. package/dist/tracing/index.js.map +24 -0
  579. package/dist/tracing/module.d.ts +45 -0
  580. package/dist/tracing/module.d.ts.map +1 -0
  581. package/dist/tracing/propagation.d.ts +53 -0
  582. package/dist/tracing/propagation.d.ts.map +1 -0
  583. package/dist/tracing/service.d.ts +95 -0
  584. package/dist/tracing/service.d.ts.map +1 -0
  585. package/dist/tracing/types.d.ts +90 -0
  586. package/dist/tracing/types.d.ts.map +1 -0
  587. package/dist/upload/decorators/index.d.ts +6 -0
  588. package/dist/upload/decorators/index.d.ts.map +1 -0
  589. package/dist/upload/decorators/upload.d.ts +16 -0
  590. package/dist/upload/decorators/upload.d.ts.map +1 -0
  591. package/dist/upload/decorators/uploaded-file.d.ts +10 -0
  592. package/dist/upload/decorators/uploaded-file.d.ts.map +1 -0
  593. package/dist/upload/index.d.ts +9 -0
  594. package/dist/upload/index.d.ts.map +1 -0
  595. package/dist/upload/index.js +553 -0
  596. package/dist/upload/index.js.map +25 -0
  597. package/dist/upload/types.d.ts +103 -0
  598. package/dist/upload/types.d.ts.map +1 -0
  599. package/dist/upload/upload.middleware.d.ts +15 -0
  600. package/dist/upload/upload.middleware.d.ts.map +1 -0
  601. package/dist/upload/upload.module.d.ts +33 -0
  602. package/dist/upload/upload.module.d.ts.map +1 -0
  603. package/dist/upload/upload.service.d.ts +29 -0
  604. package/dist/upload/upload.service.d.ts.map +1 -0
  605. package/dist/view/edge.d.ts +23 -0
  606. package/dist/view/edge.d.ts.map +1 -0
  607. package/dist/view/eta.d.ts +30 -0
  608. package/dist/view/eta.d.ts.map +1 -0
  609. package/dist/view/index.d.ts +34 -0
  610. package/dist/view/index.d.ts.map +1 -0
  611. package/dist/view/index.js +240 -0
  612. package/dist/view/index.js.map +14 -0
  613. package/dist/view/inertia/default-ssr.d.ts +15 -0
  614. package/dist/view/inertia/default-ssr.d.ts.map +1 -0
  615. package/dist/view/inertia/form-helper.d.ts +102 -0
  616. package/dist/view/inertia/form-helper.d.ts.map +1 -0
  617. package/dist/view/inertia/form-middleware.d.ts +53 -0
  618. package/dist/view/inertia/form-middleware.d.ts.map +1 -0
  619. package/dist/view/inertia/helpers.d.ts +149 -0
  620. package/dist/view/inertia/helpers.d.ts.map +1 -0
  621. package/dist/view/inertia/index.d.ts +18 -0
  622. package/dist/view/inertia/index.d.ts.map +1 -0
  623. package/dist/view/inertia/inertia-adapter.d.ts +93 -0
  624. package/dist/view/inertia/inertia-adapter.d.ts.map +1 -0
  625. package/dist/view/inertia/inertia-response.d.ts +51 -0
  626. package/dist/view/inertia/inertia-response.d.ts.map +1 -0
  627. package/dist/view/inertia/ssr/index.d.ts +13 -0
  628. package/dist/view/inertia/ssr/index.d.ts.map +1 -0
  629. package/dist/view/inertia/ssr/react-adapter.d.ts +33 -0
  630. package/dist/view/inertia/ssr/react-adapter.d.ts.map +1 -0
  631. package/dist/view/inertia/ssr/registry.d.ts +42 -0
  632. package/dist/view/inertia/ssr/registry.d.ts.map +1 -0
  633. package/dist/view/inertia/ssr/solid-adapter.d.ts +31 -0
  634. package/dist/view/inertia/ssr/solid-adapter.d.ts.map +1 -0
  635. package/dist/view/inertia/ssr/svelte-adapter.d.ts +31 -0
  636. package/dist/view/inertia/ssr/svelte-adapter.d.ts.map +1 -0
  637. package/dist/view/inertia/ssr/vue-adapter.d.ts +26 -0
  638. package/dist/view/inertia/ssr/vue-adapter.d.ts.map +1 -0
  639. package/dist/view/inertia/types.d.ts +131 -0
  640. package/dist/view/inertia/types.d.ts.map +1 -0
  641. package/dist/view/rendu.d.ts +11 -0
  642. package/dist/view/rendu.d.ts.map +1 -0
  643. package/dist/view/types.d.ts +52 -0
  644. package/dist/view/types.d.ts.map +1 -0
  645. package/dist/view/view-engine.d.ts +28 -0
  646. package/dist/view/view-engine.d.ts.map +1 -0
  647. package/dist/ws/client.d.ts +42 -0
  648. package/dist/ws/client.d.ts.map +1 -0
  649. package/dist/ws/decorators.d.ts +44 -0
  650. package/dist/ws/decorators.d.ts.map +1 -0
  651. package/dist/ws/index.d.ts +57 -0
  652. package/dist/ws/index.d.ts.map +1 -0
  653. package/dist/ws/index.js +796 -0
  654. package/dist/ws/index.js.map +26 -0
  655. package/dist/ws/module.d.ts +48 -0
  656. package/dist/ws/module.d.ts.map +1 -0
  657. package/dist/ws/runtime/bun.d.ts +41 -0
  658. package/dist/ws/runtime/bun.d.ts.map +1 -0
  659. package/dist/ws/runtime/index.d.ts +14 -0
  660. package/dist/ws/runtime/index.d.ts.map +1 -0
  661. package/dist/ws/runtime/node.d.ts +46 -0
  662. package/dist/ws/runtime/node.d.ts.map +1 -0
  663. package/dist/ws/runtime/types.d.ts +18 -0
  664. package/dist/ws/runtime/types.d.ts.map +1 -0
  665. package/dist/ws/service.d.ts +65 -0
  666. package/dist/ws/service.d.ts.map +1 -0
  667. package/dist/ws/types.d.ts +77 -0
  668. package/dist/ws/types.d.ts.map +1 -0
  669. package/package.json +262 -0
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/constants.ts", "../src/metrics/counter.ts", "../src/metrics/gauge.ts", "../src/metrics/histogram.ts", "../src/metrics/summary.ts", "../src/metrics/registry.ts", "../src/metrics/service.ts", "../src/core/decorators/module.ts", "../src/metrics/controller.ts", "../src/metrics/module.ts", "../src/metrics/decorators/counted.ts", "../src/metrics/decorators/timed.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Metadata keys used by reflect-metadata for storing decorator data.\n *\n * These constants are the contract between decorators and the framework\n * core (DI container, router, validator).\n */\nexport const METADATA_KEY = {\n\t/** Marks a class as a Nest-style controller, stores route prefix. */\n\tCONTROLLER: \"nexus:controller\",\n\n\t/** Marks a class as an injectable provider. */\n\tINJECTABLE: \"nexus:injectable\",\n\n\t/** Marks a class as a repository. */\n\tREPOSITORY: \"nexus:repository\",\n\n\t/** Marks a class as a module. Stores module options. */\n\tMODULE: \"nexus:module\",\n\n\t/** HTTP method routes registered on a controller (Get/Post/...). */\n\tROUTES: \"nexus:routes\",\n\n\t/** Method parameter type metadata (body/query/param/headers/ctx). */\n\tPARAMS: \"nexus:params\",\n\n\t/** Validation schema per method (Zod schema or class). */\n\tVALIDATE: \"nexus:validate\",\n\n\t/** Class-level design:paramtypes (built-in). */\n\tPARAMTYPES: \"design:paramtypes\",\n\n\t/** Class-level design:type (built-in). */\n\tTYPE: \"design:type\",\n\n\t/** Class-level design:returntype (built-in). */\n\tRETURNTYPE: \"design:returntype\",\n\n\t/** Provider token to inject for a parameter (for custom tokens). */\n\tINJECT: \"nexus:inject\",\n} as const;\n\nexport type MetadataKey = (typeof METADATA_KEY)[keyof typeof METADATA_KEY];\n\n/** Available parameter decorator locations. */\nexport const PARAM_TYPES = {\n\tREQUEST: 0,\n\tRESPONSE: 1,\n\tNEXT: 2,\n\tBODY: 3,\n\tQUERY: 4,\n\tPARAM: 5,\n\tHEADERS: 6,\n\tCTX: 7,\n\tUSER: 8,\n} as const;\n\nexport type ParamType = (typeof PARAM_TYPES)[keyof typeof PARAM_TYPES];\n\n/** HTTP methods supported by the router. */\nexport const HTTP_METHODS = [\n\t\"GET\",\n\t\"POST\",\n\t\"PUT\",\n\t\"DELETE\",\n\t\"PATCH\",\n\t\"OPTIONS\",\n\t\"HEAD\",\n] as const;\nexport type HttpMethod = (typeof HTTP_METHODS)[number];\n",
6
+ "/**\n * `Counter` — monotonically increasing value.\n *\n * Counters can only go up (use `Gauge` for values that can decrease).\n * They're ideal for: request counts, error counts, bytes sent, etc.\n *\n * The standard Prometheus naming convention is to suffix counters\n * with `_total`.\n *\n * Example:\n * const c = new Counter({ name: \"http_requests_total\" });\n * c.inc();\n * c.incBy(5, { method: \"GET\" });\n */\n\nimport type { CounterOptions, Counter as ICounter, MetricSample } from \"./types.js\";\n\n/** Internal helper used by all metric types. */\nexport function renderLabels(\n\tdeclared: string[],\n\tvalues: Record<string, string>,\n): string {\n\tif (declared.length === 0) return \"\";\n\treturn declared\n\t\t.map((n) => `${n}=\"${escapeLabelValue(values[n] ?? \"\")}\"`)\n\t\t.join(\",\");\n}\n\nexport class CounterImpl implements ICounter {\n\treadonly name: string;\n\treadonly help?: string;\n\treadonly labelNames: string[];\n\t/** Map from \"label1=value1,label2=value2\" -> value. */\n\tprivate values = new Map<string, number>();\n\n\tconstructor(opts: CounterOptions) {\n\t\tthis.name = opts.name;\n\t\tthis.help = opts.help;\n\t\tthis.labelNames = opts.labelNames ?? [];\n\t}\n\n\tinc(labels?: Record<string, string>): void {\n\t\tthis.incBy(1, labels);\n\t}\n\n\tincBy(n: number, labels?: Record<string, string>): void {\n\t\tif (n < 0) {\n\t\t\tthrow new Error(`Counter ${this.name} can only increase (got ${n})`);\n\t\t}\n\t\tthis.assertLabels(labels);\n\t\tconst key = this.key(labels);\n\t\tthis.values.set(key, (this.values.get(key) ?? 0) + n);\n\t}\n\n\treset(): void {\n\t\tthis.values.clear();\n\t}\n\n\tgetSamples(): MetricSample[] {\n\t\tconst out: MetricSample[] = [];\n\t\tfor (const [k, v] of this.values) {\n\t\t\tout.push({ labels: this.parseKey(k), value: v });\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Render this counter in Prometheus exposition format. */\n\trenderPrometheus(): string {\n\t\tconst lines: string[] = [];\n\t\tif (this.help) lines.push(`# HELP ${this.name} ${this.help}`);\n\t\tlines.push(`# TYPE ${this.name} counter`);\n\t\tfor (const [k, v] of this.values) {\n\t\t\tconst labels = this.parseKey(k);\n\t\t\tconst lbl = renderLabels(this.labelNames, labels);\n\t\t\tlines.push(lbl ? `${this.name}{${lbl}} ${v}` : `${this.name} ${v}`);\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tprivate assertLabels(labels?: Record<string, string>): void {\n\t\tif (!labels && this.labelNames.length === 0) return;\n\t\tif (this.labelNames.length === 0) {\n\t\t\tthrow new Error(`Counter ${this.name} has no labels declared`);\n\t\t}\n\t\tif (!labels) {\n\t\t\tthrow new Error(`Counter ${this.name} requires labels: ${this.labelNames.join(\", \")}`);\n\t\t}\n\t\tfor (const required of this.labelNames) {\n\t\t\tif (!(required in labels)) {\n\t\t\t\tthrow new Error(`Counter ${this.name} missing label \"${required}\"`);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate key(labels?: Record<string, string>): string {\n\t\tif (!labels) return \"\";\n\t\treturn this.labelNames.map((n) => `${n}=${escapeLabelValue(labels[n] ?? \"\")}`).join(\",\");\n\t}\n\n\tprivate parseKey(key: string): Record<string, string> {\n\t\tif (!key) return {};\n\t\tconst out: Record<string, string> = {};\n\t\tfor (const part of key.split(\",\")) {\n\t\t\tconst [k, ...rest] = part.split(\"=\");\n\t\t\tout[k] = rest.join(\"=\");\n\t\t}\n\t\treturn out;\n\t}\n}\n\nexport function escapeLabelValue(v: string): string {\n\treturn v.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\"/g, \"\\\\\\\"\");\n}\n",
7
+ "/**\n * `Gauge` — point-in-time value that can go up or down.\n *\n * Ideal for: queue size, memory usage, active connections, in-flight\n * requests, etc.\n *\n * The value is stored per label combination. `inc()` and `dec()` are\n * convenience helpers; `set()` replaces the value outright.\n *\n * Example:\n * const g = new Gauge({\n * name: \"active_connections\",\n * collect: () => { return; },\n * });\n * g.inc();\n * g.dec(2);\n * g.set(42);\n */\n\nimport type { GaugeOptions, Gauge as IGauge, MetricSample } from \"./types.js\";\nimport { escapeLabelValue, renderLabels } from \"./counter.js\";\n\nexport class GaugeImpl implements IGauge {\n\treadonly name: string;\n\treadonly help?: string;\n\treadonly labelNames: string[];\n\tprivate values = new Map<string, number>();\n\n\tconstructor(opts: GaugeOptions) {\n\t\tthis.name = opts.name;\n\t\tthis.help = opts.help;\n\t\tthis.labelNames = opts.labelNames ?? [];\n\t}\n\n\tset(value: number, labels?: Record<string, string>): void {\n\t\tthis.assertLabels(labels);\n\t\tthis.values.set(this.key(labels), value);\n\t}\n\n\tinc(n: number = 1, labels?: Record<string, string>): void {\n\t\tthis.assertLabels(labels);\n\t\tconst k = this.key(labels);\n\t\tthis.values.set(k, (this.values.get(k) ?? 0) + n);\n\t}\n\n\tdec(n: number = 1, labels?: Record<string, string>): void {\n\t\tthis.assertLabels(labels);\n\t\tconst k = this.key(labels);\n\t\tthis.values.set(k, (this.values.get(k) ?? 0) - n);\n\t}\n\n\tsetToCurrentTime(labels?: Record<string, string>): void {\n\t\tthis.set(Date.now() / 1000, labels);\n\t}\n\n\treset(): void {\n\t\tthis.values.clear();\n\t}\n\n\tgetSamples(): MetricSample[] {\n\t\tconst out: MetricSample[] = [];\n\t\tfor (const [k, v] of this.values) {\n\t\t\tout.push({ labels: this.parseKey(k), value: v });\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Render this gauge in Prometheus exposition format. */\n\trenderPrometheus(): string {\n\t\tconst lines: string[] = [];\n\t\tif (this.help) lines.push(`# HELP ${this.name} ${this.help}`);\n\t\tlines.push(`# TYPE ${this.name} gauge`);\n\t\tfor (const [k, v] of this.values) {\n\t\t\tconst labels = this.parseKey(k);\n\t\t\tconst lbl = renderLabels(this.labelNames, labels);\n\t\t\tlines.push(lbl ? `${this.name}{${lbl}} ${v}` : `${this.name} ${v}`);\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tprivate assertLabels(labels?: Record<string, string>): void {\n\t\tif (!labels && this.labelNames.length === 0) return;\n\t\tif (this.labelNames.length === 0) {\n\t\t\tthrow new Error(`Gauge ${this.name} has no labels declared`);\n\t\t}\n\t\tif (!labels) {\n\t\t\tthrow new Error(`Gauge ${this.name} requires labels: ${this.labelNames.join(\", \")}`);\n\t\t}\n\t\tfor (const required of this.labelNames) {\n\t\t\tif (!(required in labels)) {\n\t\t\t\tthrow new Error(`Gauge ${this.name} missing label \"${required}\"`);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate key(labels?: Record<string, string>): string {\n\t\tif (!labels) return \"\";\n\t\treturn this.labelNames.map((n) => `${n}=${escapeLabelValue(labels[n] ?? \"\")}`).join(\",\");\n\t}\n\n\tprivate parseKey(key: string): Record<string, string> {\n\t\tif (!key) return {};\n\t\tconst out: Record<string, string> = {};\n\t\tfor (const part of key.split(\",\")) {\n\t\t\tconst [k, ...rest] = part.split(\"=\");\n\t\t\tout[k] = rest.join(\"=\");\n\t\t}\n\t\treturn out;\n\t}\n}\n",
8
+ "/**\n * `Histogram` — distribution of observed values into buckets.\n *\n * Each `observe()` adds the value to every bucket whose upper bound\n * is >= value. The metric exposes:\n * - `<name>_bucket{le=\"...\"}` — cumulative count per bucket\n * - `<name>_sum` — total sum of all observed values\n * - `<name>_count` — total count\n *\n * Default buckets (Prometheus convention): [0.005, 0.01, 0.025,\n * 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10] seconds.\n *\n * Example:\n * const h = new Histogram({ name: \"http_duration_seconds\" });\n * h.observe(0.123);\n * await h.time(async () => fetch(\"/slow\"));\n */\n\nimport type { HistogramOptions, Histogram as IHistogram, MetricSample } from \"./types.js\";\nimport { escapeLabelValue, renderLabels } from \"./counter.js\";\n\n/** Prometheus default buckets (seconds). */\nexport const DEFAULT_BUCKETS = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10];\n\ninterface HistogramState {\n\tbuckets: number[]; // count per upper bound\n\tsum: number;\n\tcount: number;\n}\n\nexport class HistogramImpl implements IHistogram {\n\treadonly name: string;\n\treadonly help?: string;\n\treadonly labelNames: string[];\n\tprivate readonly upperBounds: number[];\n\t/** Map from \"label1=v1,label2=v2\" -> state. */\n\tprivate states = new Map<string, HistogramState>();\n\n\tconstructor(opts: HistogramOptions) {\n\t\tthis.name = opts.name;\n\t\tthis.help = opts.help;\n\t\tthis.labelNames = opts.labelNames ?? [];\n\t\tconst buckets = opts.buckets ?? DEFAULT_BUCKETS;\n\t\t// Copy and sort, ensure monotonic increasing\n\t\tthis.upperBounds = [...buckets].sort((a, b) => a - b);\n\t\tif (this.upperBounds.length === 0) {\n\t\t\tthrow new Error(`Histogram ${this.name} requires at least one bucket`);\n\t\t}\n\t}\n\n\tobserve(value: number, labels?: Record<string, string>): void {\n\t\tthis.assertLabels(labels);\n\t\tconst k = this.key(labels);\n\t\tlet s = this.states.get(k);\n\t\tif (!s) {\n\t\t\ts = { buckets: new Array(this.upperBounds.length).fill(0), sum: 0, count: 0 };\n\t\t\tthis.states.set(k, s);\n\t\t}\n\t\ts.sum += value;\n\t\ts.count++;\n\t\tfor (let i = 0; i < this.upperBounds.length; i++) {\n\t\t\tif (value <= this.upperBounds[i]) s.buckets[i]++;\n\t\t}\n\t}\n\n\tasync time<T>(\n\t\tfn: (start: number) => Promise<T> | T,\n\t\tlabels?: Record<string, string>,\n\t): Promise<T> {\n\t\tconst start = performance.now();\n\t\ttry {\n\t\t\treturn await fn(start);\n\t\t} finally {\n\t\t\tconst elapsedMs = performance.now() - start;\n\t\t\tthis.observe(elapsedMs / 1000, labels);\n\t\t}\n\t}\n\n\treset(): void {\n\t\tthis.states.clear();\n\t}\n\n\tgetSamples(): MetricSample[] {\n\t\tconst out: MetricSample[] = [];\n\t\tfor (const [k, s] of this.states) {\n\t\t\tconst labels = this.parseKey(k);\n\t\t\tfor (let i = 0; i < this.upperBounds.length; i++) {\n\t\t\t\tout.push({\n\t\t\t\t\tlabels: { ...labels, le: String(this.upperBounds[i]) },\n\t\t\t\t\tvalue: s.buckets[i],\n\t\t\t\t});\n\t\t\t}\n\t\t\tout.push({ labels: { ...labels, le: \"+Inf\" }, value: s.count });\n\t\t\tout.push({ labels: { ...labels }, value: s.sum });\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Render this histogram in Prometheus exposition format. */\n\trenderPrometheus(): string {\n\t\tconst lines: string[] = [];\n\t\tif (this.help) lines.push(`# HELP ${this.name} ${this.help}`);\n\t\tlines.push(`# TYPE ${this.name} histogram`);\n\t\tfor (const { labels, state } of this.enumerateStates()) {\n\t\t\tlines.push(this.renderState(labels, state));\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\t/** Internal: produce Prometheus-formatted lines for a single state. */\n\trenderState(labels: Record<string, string>, state: HistogramState): string {\n\t\tconst baseLabels = renderLabels(this.labelNames, labels);\n\t\tconst lines: string[] = [];\n\n\t\tlet cumulative = 0;\n\t\tfor (let i = 0; i < this.upperBounds.length; i++) {\n\t\t\tcumulative = state.buckets[i];\n\t\t\tconst le = this.upperBounds[i];\n\t\t\tconst leStr = String(le);\n\t\t\tconst lbl = baseLabels ? `${baseLabels},le=\"${leStr}\"` : `le=\"${leStr}\"`;\n\t\t\tlines.push(`${this.name}_bucket{${lbl}} ${cumulative}`);\n\t\t}\n\t\t{\n\t\t\tconst lbl = baseLabels ? `${baseLabels},le=\"+Inf\"` : `le=\"+Inf\"`;\n\t\t\tlines.push(`${this.name}_bucket{${lbl}} ${state.count}`);\n\t\t}\n\t\t{\n\t\t\tconst lbl = baseLabels ? `{${baseLabels}}` : \"\";\n\t\t\tlines.push(`${this.name}_sum${lbl} ${state.sum}`);\n\t\t}\n\t\t{\n\t\t\tconst lbl = baseLabels ? `{${baseLabels}}` : \"\";\n\t\t\tlines.push(`${this.name}_count${lbl} ${state.count}`);\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\t/** Internal: enumerate all states for the registry. */\n\tenumerateStates(): Array<{ labels: Record<string, string>; state: HistogramState }> {\n\t\tconst out: Array<{ labels: Record<string, string>; state: HistogramState }> = [];\n\t\tfor (const [k, s] of this.states) {\n\t\t\tout.push({ labels: this.parseKey(k), state: s });\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate assertLabels(labels?: Record<string, string>): void {\n\t\tif (!labels && this.labelNames.length === 0) return;\n\t\tif (this.labelNames.length === 0) {\n\t\t\tthrow new Error(`Histogram ${this.name} has no labels declared`);\n\t\t}\n\t\tif (!labels) {\n\t\t\tthrow new Error(`Histogram ${this.name} requires labels: ${this.labelNames.join(\", \")}`);\n\t\t}\n\t\tfor (const required of this.labelNames) {\n\t\t\tif (!(required in labels)) {\n\t\t\t\tthrow new Error(`Histogram ${this.name} missing label \"${required}\"`);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate key(labels?: Record<string, string>): string {\n\t\tif (!labels) return \"\";\n\t\treturn this.labelNames.map((n) => `${n}=${escapeLabelValue(labels[n] ?? \"\")}`).join(\",\");\n\t}\n\n\tprivate parseKey(key: string): Record<string, string> {\n\t\tif (!key) return {};\n\t\tconst out: Record<string, string> = {};\n\t\tfor (const part of key.split(\",\")) {\n\t\t\tconst [k, ...rest] = part.split(\"=\");\n\t\t\tout[k] = rest.join(\"=\");\n\t\t}\n\t\treturn out;\n\t}\n}\n",
9
+ "/**\n * `Summary` — quantile estimation over a sliding window of values.\n *\n * Summary is similar to Histogram but computes client-side quantiles\n * (via t-digest-style sorting). It's useful when you need a small\n * number of percentiles (50/90/99) without the storage cost of\n * histograms.\n *\n * Quantile computation uses a simple sorted-window approach: each\n * label combination keeps a circular buffer of the last N values.\n *\n * Example:\n * const s = new Summary({\n * name: \"http_request_size_bytes\",\n * percentiles: [0.5, 0.9, 0.99],\n * });\n * s.observe(1024);\n */\n\nimport type { SummaryOptions, Summary as ISummary, MetricSample } from \"./types.js\";\nimport { escapeLabelValue, renderLabels } from \"./counter.js\";\n\n/** Default percentiles. */\nexport const DEFAULT_PERCENTILES = [0.5, 0.9, 0.99];\n/** Default sliding window size. */\nexport const DEFAULT_MAX_AGE_SECONDS = 600;\nexport const DEFAULT_AGE_BUCKETS = 5;\n\ninterface SummaryState {\n\t/** For each age bucket, an array of (sum, count) pairs. */\n\tbuckets: Array<{ values: number[]; sum: number; count: number }>;\n\t/** Index of the next bucket to rotate. */\n\tcurrentBucket: number;\n\t/** Last rotation time. */\n\tlastRotation: number;\n}\n\nexport class SummaryImpl implements ISummary {\n\treadonly name: string;\n\treadonly help?: string;\n\treadonly labelNames: string[];\n\tprivate readonly percentiles: number[];\n\tprivate readonly maxAgeSeconds: number;\n\tprivate readonly ageBuckets: number;\n\tprivate readonly bucketSize: number;\n\t/** Map from \"label1=v1,label2=v2\" -> state. */\n\tprivate states = new Map<string, SummaryState>();\n\n\tconstructor(opts: SummaryOptions) {\n\t\tthis.name = opts.name;\n\t\tthis.help = opts.help;\n\t\tthis.labelNames = opts.labelNames ?? [];\n\t\tthis.percentiles = opts.percentiles ?? DEFAULT_PERCENTILES;\n\t\tthis.maxAgeSeconds = opts.maxAgeSeconds ?? DEFAULT_MAX_AGE_SECONDS;\n\t\tthis.ageBuckets = opts.ageBuckets ?? DEFAULT_AGE_BUCKETS;\n\t\tthis.bucketSize = Math.ceil(this.maxAgeSeconds / this.ageBuckets);\n\t}\n\n\tobserve(value: number, labels?: Record<string, string>): void {\n\t\tthis.assertLabels(labels);\n\t\tconst k = this.key(labels);\n\t\tlet s = this.states.get(k);\n\t\tif (!s) {\n\t\t\ts = this.newState();\n\t\t\tthis.states.set(k, s);\n\t\t}\n\t\tthis.maybeRotate(s);\n\t\tconst b = s.buckets[s.currentBucket];\n\t\tb.values.push(value);\n\t\tb.sum += value;\n\t\tb.count++;\n\t}\n\n\tasync time<T>(\n\t\tfn: () => Promise<T> | T,\n\t\tlabels?: Record<string, string>,\n\t): Promise<T> {\n\t\tconst start = performance.now();\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} finally {\n\t\t\tconst elapsedMs = performance.now() - start;\n\t\t\tthis.observe(elapsedMs / 1000, labels);\n\t\t}\n\t}\n\n\treset(): void {\n\t\tthis.states.clear();\n\t}\n\n\tgetSamples(): MetricSample[] {\n\t\tconst out: MetricSample[] = [];\n\t\tfor (const [k] of this.states) {\n\t\t\tout.push({ labels: this.parseKey(k), value: 0 });\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Render this summary in Prometheus exposition format. */\n\trenderPrometheus(): string {\n\t\tconst lines: string[] = [];\n\t\tif (this.help) lines.push(`# HELP ${this.name} ${this.help}`);\n\t\tlines.push(`# TYPE ${this.name} summary`);\n\n\t\tfor (const [k, s] of this.states) {\n\t\t\tconst labels = this.parseKey(k);\n\t\t\tthis.maybeRotate(s);\n\t\t\tconst totals = this.totals(s);\n\n\t\t\tfor (const q of this.percentiles) {\n\t\t\t\tconst qval = this.quantile(s, q);\n\t\t\t\tconst qstr = clampQuantileLabel(q);\n\t\t\t\t// The \"quantile\" label is always present, even if no\n\t\t\t\t// labelNames are declared. It's a special summary label.\n\t\t\t\tconst fullLabels: Record<string, string> = { ...labels, quantile: qstr };\n\t\t\t\tconst baseStr = renderLabels(this.labelNames, fullLabels);\n\t\t\t\tconst lbl = baseStr ? `${baseStr},quantile=\"${qstr}\"` : `quantile=\"${qstr}\"`;\n\t\t\t\tlines.push(`${this.name}{${lbl}} ${qval}`);\n\t\t\t}\n\t\t\t{\n\t\t\t\tconst lbl = renderLabels(this.labelNames, labels);\n\t\t\t\tlines.push(`${this.name}_sum${lbl ? `{${lbl}}` : \"\"} ${totals.sum}`);\n\t\t\t\tlines.push(`${this.name}_count${lbl ? `{${lbl}}` : \"\"} ${totals.count}`);\n\t\t\t}\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\t/* ----------------- internals ----------------- */\n\n\tprivate newState(): SummaryState {\n\t\tconst buckets: SummaryState[\"buckets\"] = [];\n\t\tfor (let i = 0; i < this.ageBuckets; i++) {\n\t\t\tbuckets.push({ values: [], sum: 0, count: 0 });\n\t\t}\n\t\treturn { buckets, currentBucket: 0, lastRotation: Date.now() };\n\t}\n\n\tprivate maybeRotate(s: SummaryState): void {\n\t\tconst now = Date.now();\n\t\tconst elapsed = (now - s.lastRotation) / 1000;\n\t\tif (elapsed >= this.bucketSize) {\n\t\t\tconst rotations = Math.floor(elapsed / this.bucketSize);\n\t\t\tfor (let i = 0; i < rotations; i++) {\n\t\t\t\ts.currentBucket = (s.currentBucket + 1) % this.ageBuckets;\n\t\t\t\ts.buckets[s.currentBucket] = { values: [], sum: 0, count: 0 };\n\t\t\t}\n\t\t\ts.lastRotation = now;\n\t\t}\n\t}\n\n\tprivate totals(s: SummaryState): { sum: number; count: number } {\n\t\tlet sum = 0;\n\t\tlet count = 0;\n\t\tfor (const b of s.buckets) {\n\t\t\tsum += b.sum;\n\t\t\tcount += b.count;\n\t\t}\n\t\treturn { sum, count };\n\t}\n\n\tprivate quantile(s: SummaryState, q: number): number {\n\t\t// Collect all values across buckets\n\t\tconst all: number[] = [];\n\t\tfor (const b of s.buckets) {\n\t\t\tfor (const v of b.values) all.push(v);\n\t\t}\n\t\tif (all.length === 0) return 0;\n\t\tall.sort((a, b) => a - b);\n\t\tconst idx = Math.min(all.length - 1, Math.max(0, Math.floor(q * all.length)));\n\t\treturn all[idx];\n\t}\n\n\tprivate assertLabels(labels?: Record<string, string>): void {\n\t\tif (!labels && this.labelNames.length === 0) return;\n\t\tif (this.labelNames.length === 0) {\n\t\t\tthrow new Error(`Summary ${this.name} has no labels declared`);\n\t\t}\n\t\tif (!labels) {\n\t\t\tthrow new Error(`Summary ${this.name} requires labels: ${this.labelNames.join(\", \")}`);\n\t\t}\n\t\tfor (const required of this.labelNames) {\n\t\t\tif (!(required in labels)) {\n\t\t\t\tthrow new Error(`Summary ${this.name} missing label \"${required}\"`);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate key(labels?: Record<string, string>): string {\n\t\tif (!labels) return \"\";\n\t\treturn this.labelNames.map((n) => `${n}=${escapeLabelValue(labels[n] ?? \"\")}`).join(\",\");\n\t}\n\n\tprivate parseKey(key: string): Record<string, string> {\n\t\tif (!key) return {};\n\t\tconst out: Record<string, string> = {};\n\t\tfor (const part of key.split(\",\")) {\n\t\t\tconst [k, ...rest] = part.split(\"=\");\n\t\t\tout[k] = rest.join(\"=\");\n\t\t}\n\t\treturn out;\n\t}\n}\n\nfunction clampQuantileLabel(q: number): string {\n\t// Use Number's default string representation, which handles JS\n\t// float precision better than toFixed(17). E.g. 0.9 -> \"0.9\",\n\t// 0.99 -> \"0.99\", 0.5 -> \"0.5\".\n\tconst s = String(q);\n\t// If JS gives us a long decimal like \"0.90000000000000002\",\n\t// round it to a reasonable precision.\n\tif (s.includes(\".\") && s.length > 8) {\n\t\treturn q.toFixed(6).replace(/0+$/, \"\").replace(/\\.$/, \"\");\n\t}\n\treturn s;\n}\n",
10
+ "/**\n * `MetricsRegistry` — collection of all metrics registered in the app.\n *\n * The registry is the source of truth for `MetricsService`. It:\n * - Holds every metric (counter / gauge / histogram / summary) by name.\n * - Serializes them to the Prometheus text exposition format.\n * - Supports content negotiation (OpenMetrics vs. Prometheus).\n *\n * Each metric is stored as a unified `RegisteredMetric` so the\n * registry can iterate and call `renderPrometheus()` on each.\n */\n\nimport { CounterImpl } from \"./counter.js\";\nimport { GaugeImpl } from \"./gauge.js\";\nimport { HistogramImpl } from \"./histogram.js\";\nimport { SummaryImpl } from \"./summary.js\";\nimport type {\n\tCounter,\n\tCounterOptions,\n\tExpositionFormat,\n\tExpositionResult,\n\tGauge,\n\tGaugeOptions,\n\tHistogram,\n\tHistogramOptions,\n\tSummary,\n\tSummaryOptions,\n} from \"./types.js\";\n\ninterface RegisteredMetric {\n\tname: string;\n\ttype: \"counter\" | \"gauge\" | \"histogram\" | \"summary\";\n\timpl: { renderPrometheus(): string; reset(): void };\n}\n\nexport class MetricsRegistry {\n\tprivate metrics = new Map<string, RegisteredMetric>();\n\tprivate globalLabels: Record<string, string> = {};\n\n\t/** Add a global label that's prepended to every metric line. */\n\tsetGlobalLabels(labels: Record<string, string>): void {\n\t\tthis.globalLabels = { ...labels };\n\t}\n\n\tgetGlobalLabels(): Record<string, string> {\n\t\treturn { ...this.globalLabels };\n\t}\n\n\t/** Register a counter; returns the same instance for chaining. */\n\tregisterCounter(opts: CounterOptions): Counter {\n\t\tif (this.metrics.has(opts.name)) {\n\t\t\tthrow new Error(`Metric ${opts.name} is already registered`);\n\t\t}\n\t\tconst c = new CounterImpl(opts);\n\t\tthis.metrics.set(opts.name, { name: opts.name, type: \"counter\", impl: c });\n\t\treturn c;\n\t}\n\n\tregisterGauge(opts: GaugeOptions): Gauge {\n\t\tif (this.metrics.has(opts.name)) {\n\t\t\tthrow new Error(`Metric ${opts.name} is already registered`);\n\t\t}\n\t\tconst g = new GaugeImpl(opts);\n\t\tthis.metrics.set(opts.name, { name: opts.name, type: \"gauge\", impl: g });\n\t\treturn g;\n\t}\n\n\tregisterHistogram(opts: HistogramOptions): Histogram {\n\t\tif (this.metrics.has(opts.name)) {\n\t\t\tthrow new Error(`Metric ${opts.name} is already registered`);\n\t\t}\n\t\tconst h = new HistogramImpl(opts);\n\t\tthis.metrics.set(opts.name, { name: opts.name, type: \"histogram\", impl: h });\n\t\treturn h;\n\t}\n\n\tregisterSummary(opts: SummaryOptions): Summary {\n\t\tif (this.metrics.has(opts.name)) {\n\t\t\tthrow new Error(`Metric ${opts.name} is already registered`);\n\t\t}\n\t\tconst s = new SummaryImpl(opts);\n\t\tthis.metrics.set(opts.name, { name: opts.name, type: \"summary\", impl: s });\n\t\treturn s;\n\t}\n\n\t/** Return a metric by name, regardless of type. */\n\tget(name: string): RegisteredMetric | undefined {\n\t\treturn this.metrics.get(name);\n\t}\n\n\t/** Return a counter by name. Throws if it isn't a counter. */\n\tgetCounter(name: string): Counter {\n\t\tconst m = this.metrics.get(name);\n\t\tif (!m) throw new Error(`Counter ${name} is not registered`);\n\t\tif (m.type !== \"counter\") throw new Error(`Metric ${name} is a ${m.type}, not a counter`);\n\t\treturn m.impl as unknown as Counter;\n\t}\n\n\t/** Return a gauge by name. */\n\tgetGauge(name: string): Gauge {\n\t\tconst m = this.metrics.get(name);\n\t\tif (!m) throw new Error(`Gauge ${name} is not registered`);\n\t\tif (m.type !== \"gauge\") throw new Error(`Metric ${name} is a ${m.type}, not a gauge`);\n\t\treturn m.impl as unknown as Gauge;\n\t}\n\n\t/** Return a histogram by name. */\n\tgetHistogram(name: string): Histogram {\n\t\tconst m = this.metrics.get(name);\n\t\tif (!m) throw new Error(`Histogram ${name} is not registered`);\n\t\tif (m.type !== \"histogram\") throw new Error(`Metric ${name} is a ${m.type}, not a histogram`);\n\t\treturn m.impl as unknown as Histogram;\n\t}\n\n\t/** Return a summary by name. */\n\tgetSummary(name: string): Summary {\n\t\tconst m = this.metrics.get(name);\n\t\tif (!m) throw new Error(`Summary ${name} is not registered`);\n\t\tif (m.type !== \"summary\") throw new Error(`Metric ${name} is a ${m.type}, not a summary`);\n\t\treturn m.impl as unknown as Summary;\n\t}\n\n\t/** Number of registered metrics. */\n\tget size(): number {\n\t\treturn this.metrics.size;\n\t}\n\n\t/** Names of all registered metrics, sorted. */\n\tnames(): string[] {\n\t\treturn [...this.metrics.keys()].sort();\n\t}\n\n\t/** Reset all metrics (clear values). */\n\tresetAll(): void {\n\t\tfor (const m of this.metrics.values()) {\n\t\t\tm.impl.reset();\n\t\t}\n\t}\n\n\t/** Serialize all metrics to the requested exposition format. */\n\texpose(format: ExpositionFormat = \"prometheus\"): ExpositionResult {\n\t\tconst sections: string[] = [];\n\t\tconst globalLabelsStr = renderGlobalLabels(this.globalLabels);\n\n\t\tfor (const m of this.metrics.values()) {\n\t\t\tconst out = m.impl.renderPrometheus();\n\t\t\tif (globalLabelsStr) {\n\t\t\t\tsections.push(applyGlobalLabels(out, this.globalLabels));\n\t\t\t} else {\n\t\t\t\tsections.push(out);\n\t\t\t}\n\t\t}\n\n\t\tconst body = sections.filter((s) => s.length > 0).join(\"\\n\\n\");\n\t\tconst contentType =\n\t\t\tformat === \"openmetrics\"\n\t\t\t\t? \"application/openmetrics-text; version=1.0.0; charset=utf-8\"\n\t\t\t\t: \"text/plain; version=0.0.4; charset=utf-8\";\n\t\treturn { body: body + (body.endsWith(\"\\n\") ? \"\" : \"\\n\"), contentType };\n\t}\n}\n\nfunction renderGlobalLabels(labels: Record<string, string>): string {\n\tconst keys = Object.keys(labels);\n\tif (keys.length === 0) return \"\";\n\treturn keys.map((k) => `${k}=\"${labels[k]}\"`).join(\",\");\n}\n\nfunction applyGlobalLabels(block: string, labels: Record<string, string>): string {\n\tconst keys = Object.keys(labels);\n\tif (keys.length === 0) return block;\n\tconst prefix = keys.map((k) => `${k}=\"${labels[k]}\"`).join(\",\");\n\treturn block\n\t\t.split(\"\\n\")\n\t\t.map((line) => {\n\t\t\tif (line.startsWith(\"#\")) return line;\n\t\t\tconst openBrace = line.indexOf(\"{\");\n\t\t\tif (openBrace === -1) {\n\t\t\t\tconst space = line.indexOf(\" \");\n\t\t\t\tif (space === -1) return line;\n\t\t\t\tconst metric = line.slice(0, space);\n\t\t\t\tconst rest = line.slice(space);\n\t\t\t\treturn `${metric}{${prefix}}${rest}`;\n\t\t\t}\n\t\t\tconst closeBrace = line.indexOf(\"}\", openBrace);\n\t\t\tif (closeBrace === -1) return line;\n\t\t\tconst existing = line.slice(openBrace + 1, closeBrace);\n\t\t\treturn `${line.slice(0, openBrace + 1)}${prefix},${existing}${line.slice(closeBrace)}`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n",
11
+ "/**\n * `MetricsService` — DI-friendly facade over `MetricsRegistry`.\n *\n * The service is always available; you can call `counter()`,\n * `gauge()`, `histogram()`, `summary()` at any time. Registered\n * metrics live for the lifetime of the application.\n *\n * Default Node.js process metrics are registered when\n * `MetricsModule.forRoot({ enableDefaultMetrics: true })` is\n * called. Without `forRoot()`, the service is fully functional\n * but no default metrics are registered.\n */\n\nimport { MetricsRegistry } from \"./registry.js\";\nimport type {\n\tCounter,\n\tCounterOptions,\n\tExpositionFormat,\n\tExpositionResult,\n\tGauge,\n\tGaugeOptions,\n\tHistogram,\n\tHistogramOptions,\n\tSummary,\n\tSummaryOptions,\n} from \"./types.js\";\n\nexport const METRICS_SERVICE_TOKEN = Symbol.for(\"nexus:MetricsService\");\n\n/**\n * Global registry of the active `MetricsService` instance.\n * Set by `MetricsModule.forRoot()`. Read by `@Counted()` and\n * `@Timed()` decorators.\n */\nlet _current: MetricsService | undefined;\n\nexport function setMetricsService(service: MetricsService): void {\n\t_current = service;\n}\n\nexport function getMetricsService(): MetricsService | undefined {\n\treturn _current;\n}\n\nexport class MetricsService {\n\treadonly registry: MetricsRegistry = new MetricsRegistry();\n\n\t/* ---------------- factory methods ---------------- */\n\n\tcounter(opts: CounterOptions): Counter {\n\t\treturn this.registry.registerCounter(opts);\n\t}\n\n\tgauge(opts: GaugeOptions): Gauge {\n\t\treturn this.registry.registerGauge(opts);\n\t}\n\n\thistogram(opts: HistogramOptions): Histogram {\n\t\treturn this.registry.registerHistogram(opts);\n\t}\n\n\tsummary(opts: SummaryOptions): Summary {\n\t\treturn this.registry.registerSummary(opts);\n\t}\n\n\t/* ---------------- lookup ---------------- */\n\n\tgetCounter(name: string): Counter {\n\t\treturn this.registry.getCounter(name);\n\t}\n\n\t/**\n\t * Get an existing counter or create a new one with the given\n\t * label names. Used by the `@Counted()` decorator.\n\t */\n\tgetOrCreateCounter(name: string, help: string | undefined, labelNames: string[] | undefined): Counter {\n\t\ttry {\n\t\t\treturn this.registry.getCounter(name);\n\t\t} catch {\n\t\t\treturn this.registry.registerCounter({ name, help, labelNames });\n\t\t}\n\t}\n\n\t/**\n\t * Get an existing histogram or create a new one. Used by the\n\t * `@Timed()` decorator.\n\t */\n\tgetOrCreateHistogram(name: string, help: string | undefined, labelNames: string[] | undefined, buckets: number[] | undefined): Histogram {\n\t\ttry {\n\t\t\treturn this.registry.getHistogram(name);\n\t\t} catch {\n\t\t\treturn this.registry.registerHistogram({ name, help, labelNames, buckets });\n\t\t}\n\t}\n\n\tgetGauge(name: string): Gauge {\n\t\treturn this.registry.getGauge(name);\n\t}\n\n\tgetHistogram(name: string): Histogram {\n\t\treturn this.registry.getHistogram(name);\n\t}\n\n\tgetSummary(name: string): Summary {\n\t\treturn this.registry.getSummary(name);\n\t}\n\n\t/* ---------------- exposition ---------------- */\n\n\texpose(format: ExpositionFormat = \"prometheus\"): ExpositionResult {\n\t\treturn this.registry.expose(format);\n\t}\n\n\t/** Number of registered metrics. */\n\tget size(): number {\n\t\treturn this.registry.size;\n\t}\n}\n",
12
+ "/**\n * @Module decorator.\n *\n * Marks a class as a Nest-style module: a logical grouping of\n * controllers and providers with explicit imports/exports.\n *\n * @example\n * ```ts\n * @Module({\n * imports: [UserModule],\n * controllers: [UserController],\n * providers: [UserService],\n * exports: [UserService],\n * })\n * class AppModule {}\n * ```\n */\nimport \"reflect-metadata\";\nimport { METADATA_KEY } from \"../constants.js\";\nimport type { ModuleOptions, Type } from \"../di/tokens.js\";\n\nexport function Module(options: ModuleOptions = {}): ClassDecorator {\n\treturn (target: object) => {\n\t\tReflect.defineMetadata(METADATA_KEY.MODULE, options, target);\n\t};\n}\n\n/** Read the @Module options from a class. */\nexport function getModuleOptions(target: Type<any>): ModuleOptions {\n\treturn Reflect.getMetadata(METADATA_KEY.MODULE, target) ?? {};\n}\n",
13
+ "/**\n * `MetricsController` — exposes `GET /metrics` for Prometheus\n * scrapers. Supports content negotiation: the response format is\n * `text/plain` (Prometheus 0.0.4) by default, or\n * `application/openmetrics-text` if the request asks for it.\n *\n * The controller is auto-mounted by `MetricsModule.forRoot()`. If\n * you want to mount it manually (e.g. on a different path), call\n * `MetricsController.handler(service)` and wire it up yourself.\n */\n\nimport type { Context } from \"hono\";\nimport type { MetricsService } from \"./service.js\";\n\nexport class MetricsController {\n\tstatic readonly PATH = \"/metrics\";\n\n\t/**\n\t * Returns a Hono handler that serves the /metrics endpoint.\n\t *\n\t * @example\n\t * app.get(\"/metrics\", MetricsController.handler(svc));\n\t */\n\tstatic handler(service: MetricsService) {\n\t\treturn (c: Context) => {\n\t\t\tconst accept = c.req.header(\"accept\") ?? \"\";\n\t\t\tconst format = accept.includes(\"application/openmetrics-text\") ? \"openmetrics\" : \"prometheus\";\n\t\t\tconst { contentType, body } = service.expose(format);\n\t\t\treturn c.body(body, 200, {\n\t\t\t\t\"content-type\": contentType,\n\t\t\t\t\"cache-control\": \"no-store\",\n\t\t\t});\n\t\t};\n\t}\n\n\t/** Mount the controller on the given Hono app at `path`. */\n\tstatic mount(app: { get: (path: string, ...handlers: unknown[]) => unknown }, service: MetricsService, path: string = MetricsController.PATH): void {\n\t\tapp.get(path, MetricsController.handler(service));\n\t}\n}",
14
+ "/**\n * `MetricsModule` — wires up the metrics service into the DI\n * container, registers default Node.js process metrics, and mounts\n * the `GET /metrics` controller.\n *\n * Usage:\n * @Module({\n * imports: [\n * MetricsModule.forRoot({\n * enableDefaultMetrics: true,\n * path: \"/metrics\",\n * globalLabels: { service: \"my-app\" },\n * }),\n * ],\n * })\n * class AppModule {}\n *\n * Without `forRoot()`, `MetricsService` is still available (it's\n * a no-op-friendly singleton), but no metrics are pre-registered\n * and the controller is not mounted. Apps can register their own\n * metrics and mount the controller manually.\n */\n\nimport { Module } from \"../core/decorators/module.js\";\nimport { MetricsService, METRICS_SERVICE_TOKEN } from \"./service.js\";\nimport { MetricsController } from \"./controller.js\";\nimport type { MetricsConfig } from \"./types.js\";\n\n@Module({\n\tproviders: [\n\t\tMetricsService,\n\t\t{ provide: METRICS_SERVICE_TOKEN, useExisting: MetricsService },\n\t],\n\texports: [MetricsService, METRICS_SERVICE_TOKEN],\n})\nexport class MetricsModule {\n\tstatic forRoot(config: MetricsConfig = {}) {\n\t\tconst fullConfig: Required<MetricsConfig> = {\n\t\t\tdefaultBuckets: config.defaultBuckets ?? [],\n\t\t\tdefaultPercentiles: config.defaultPercentiles ?? [],\n\t\t\tpath: config.path ?? \"/metrics\",\n\t\t\tenableDefaultMetrics: config.enableDefaultMetrics ?? true,\n\t\t\tmountController: config.mountController ?? true,\n\t\t\tglobalLabels: config.globalLabels ?? {},\n\t\t};\n\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\tMetricsService,\n\t\t\t\t{ provide: METRICS_SERVICE_TOKEN, useExisting: MetricsService },\n\t\t\t\t{ provide: \"METRICS_CONFIG\", useValue: fullConfig },\n\t\t\t],\n\t\t\texports: [MetricsService, METRICS_SERVICE_TOKEN, \"METRICS_CONFIG\"],\n\t\t})\n\t\tclass ConfiguredMetricsModule {\n\t\t\tconstructor(private svc: MetricsService = new MetricsService()) {\n\t\t\t\tif (Object.keys(fullConfig.globalLabels).length > 0) {\n\t\t\t\t\tsvc.registry.setGlobalLabels(fullConfig.globalLabels);\n\t\t\t\t}\n\t\t\t\tif (fullConfig.enableDefaultMetrics) {\n\t\t\t\t\tregisterDefaultMetrics(svc);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstatic get path(): string {\n\t\t\t\treturn fullConfig.path;\n\t\t\t}\n\n\t\t\tstatic get service(): MetricsService {\n\t\t\t\treturn new MetricsService();\n\t\t\t}\n\n\t\t\tstatic get controllerPath(): string {\n\t\t\t\treturn fullConfig.path;\n\t\t\t}\n\t\t}\n\t\tObject.defineProperty(ConfiguredMetricsModule, \"name\", {\n\t\t\tvalue: \"ConfiguredMetricsModule\",\n\t\t});\n\n\t\t// Attach helpers as static methods on the module class.\n\t\t(ConfiguredMetricsModule as unknown as { mount: (app: unknown, service: MetricsService) => void }).mount = (\n\t\t\tapp: unknown,\n\t\t\tservice: MetricsService,\n\t\t) => {\n\t\t\tMetricsController.mount(\n\t\t\t\tapp as { get: (path: string, ...handlers: unknown[]) => unknown },\n\t\t\t\tservice,\n\t\t\t\tfullConfig.path,\n\t\t\t);\n\t\t};\n\n\t\treturn ConfiguredMetricsModule as unknown as typeof MetricsModule & {\n\t\t\tmount: (app: unknown, service: MetricsService) => void;\n\t\t\tpath: string;\n\t\t\tcontrollerPath: string;\n\t\t\tservice: MetricsService;\n\t\t};\n\t}\n}\n\n/* ------------------------------------------------------------------ *\n * Default Node.js process metrics\n * ------------------------------------------------------------------ */\n\nfunction registerDefaultMetrics(service: MetricsService): void {\n\t// Process metrics\n\tconst processStartTime = service.gauge({\n\t\tname: \"process_start_time_seconds\",\n\t\thelp: \"Start time of the process since unix epoch in seconds.\",\n\t\tlabelNames: [],\n\t\tcollect: () => {\n\t\t\tprocessStartTime.set(Math.floor(Date.now() / 1000));\n\t\t},\n\t});\n\n\tconst processResidentMemory = service.gauge({\n\t\tname: \"process_resident_memory_bytes\",\n\t\thelp: \"Resident memory size in bytes.\",\n\t\tlabelNames: [],\n\t\tcollect: () => {\n\t\t\tconst mem = process.memoryUsage();\n\t\t\tprocessResidentMemory.set(mem.rss);\n\t\t},\n\t});\n\n\tconst processHeapUsed = service.gauge({\n\t\tname: \"nodejs_heap_size_used_bytes\",\n\t\thelp: \"Node.js heap size used in bytes.\",\n\t\tlabelNames: [],\n\t\tcollect: () => {\n\t\t\tconst mem = process.memoryUsage();\n\t\t\tprocessHeapUsed.set(mem.heapUsed);\n\t\t},\n\t});\n\n\tconst processHeapTotal = service.gauge({\n\t\tname: \"nodejs_heap_size_total_bytes\",\n\t\thelp: \"Node.js heap size total in bytes.\",\n\t\tlabelNames: [],\n\t\tcollect: () => {\n\t\t\tconst mem = process.memoryUsage();\n\t\t\tprocessHeapTotal.set(mem.heapTotal);\n\t\t},\n\t});\n\n\tconst processExternalMemory = service.gauge({\n\t\tname: \"nodejs_external_memory_bytes\",\n\t\thelp: \"Node.js external memory size in bytes.\",\n\t\tlabelNames: [],\n\t\tcollect: () => {\n\t\t\tconst mem = process.memoryUsage();\n\t\t\tprocessExternalMemory.set(mem.external);\n\t\t},\n\t});\n\n\tconst processCpuUser = service.gauge({\n\t\tname: \"process_cpu_user_seconds_total\",\n\t\thelp: \"Total user CPU time spent in seconds.\",\n\t\tlabelNames: [],\n\t\tcollect: () => {\n\t\t\tconst cpu = process.cpuUsage();\n\t\t\tprocessCpuUser.set(cpu.user / 1_000_000);\n\t\t},\n\t});\n\n\tconst processCpuSystem = service.gauge({\n\t\tname: \"process_cpu_system_seconds_total\",\n\t\thelp: \"Total system CPU time spent in seconds.\",\n\t\tlabelNames: [],\n\t\tcollect: () => {\n\t\t\tconst cpu = process.cpuUsage();\n\t\t\tprocessCpuSystem.set(cpu.system / 1_000_000);\n\t\t},\n\t});\n\n\tconst eventLoopLag = service.gauge({\n\t\tname: \"nodejs_eventloop_lag_seconds\",\n\t\thelp: \"Lag of the event loop in seconds.\",\n\t\tlabelNames: [],\n\t\tcollect: () => {\n\t\t\t// Sample event loop lag using a setImmediate.\n\t\t\tconst start = process.hrtime.bigint();\n\t\t\tsetImmediate(() => {\n\t\t\t\tconst lagNs = Number(process.hrtime.bigint() - start);\n\t\t\t\teventLoopLag.set(lagNs / 1e9);\n\t\t\t});\n\t\t},\n\t});\n\n\tconst processActiveHandles = service.gauge({\n\t\tname: \"nodejs_active_handles_total\",\n\t\thelp: \"Number of active handles.\",\n\t\tlabelNames: [],\n\t\tcollect: () => {\n\t\t\t// @ts-ignore - Bun may or may not expose this\n\t\t\tconst handles = (process as any)._getActiveHandles?.() ?? [];\n\t\t\tprocessActiveHandles.set(handles.length);\n\t\t},\n\t});\n\n\tconst processActiveRequests = service.gauge({\n\t\tname: \"nodejs_active_requests_total\",\n\t\thelp: \"Number of active requests.\",\n\t\tlabelNames: [],\n\t\tcollect: () => {\n\t\t\t// @ts-ignore - Bun may or may not expose this\n\t\t\tconst reqs = (process as any)._getActiveRequests?.() ?? [];\n\t\t\tprocessActiveRequests.set(reqs.length);\n\t\t},\n\t});\n\n\t// Touch all gauges to make sure they're eagerly evaluated once\n\tvoid processStartTime;\n\tvoid processResidentMemory;\n\tvoid processHeapUsed;\n\tvoid processHeapTotal;\n\tvoid processExternalMemory;\n\tvoid processCpuUser;\n\tvoid processCpuSystem;\n\tvoid eventLoopLag;\n\tvoid processActiveHandles;\n\tvoid processActiveRequests;\n}\n",
15
+ "/**\n * `@Counted()` — class-method decorator that increments a counter\n * on each call.\n *\n * Usage:\n * class UserController {\n * @Counted('http_requests_total', { labels: () => ({ method: 'GET' }) })\n * list() { ... }\n * }\n *\n * The decorator reads the `MetricsService` from the global registry\n * (set by `MetricsModule.forRoot()`). When no service is registered\n * the decorator is a pass-through.\n */\n\nimport { getMetricsService } from \"../service.js\";\n\nexport interface CountedOptions {\n\t/** Optional label values, computed at call time. */\n\tlabels?: () => Record<string, string>;\n}\n\n/**\n * Method decorator: increment a counter on each invocation.\n *\n * The counter is registered lazily the first time the method is\n * called, using the service from the global registry.\n */\nexport function Counted(metricName: string, options: CountedOptions = {}) {\n\treturn function (_target: object, _propertyKey: string | symbol, descriptor: PropertyDescriptor) {\n\t\tconst original = descriptor.value as (...args: unknown[]) => unknown;\n\t\tif (typeof original !== \"function\") {\n\t\t\tthrow new Error(`@Counted() can only be applied to methods, got ${typeof original}`);\n\t\t}\n\n\t\tconst isAsync = (original as any).constructor?.name === \"AsyncFunction\";\n\n\t\tif (isAsync) {\n\t\t\tdescriptor.value = async function wrapped(this: unknown, ...args: unknown[]) {\n\t\t\t\tconst svc = getMetricsService();\n\t\t\t\tif (svc) {\n\t\t\t\t\tconst labels = options.labels?.();\n\t\t\t\t\tsvc.getOrCreateCounter(\n\t\t\t\t\t\tmetricName,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tlabels ? Object.keys(labels) : undefined,\n\t\t\t\t\t).inc(labels);\n\t\t\t\t}\n\t\t\t\treturn original.apply(this, args);\n\t\t\t};\n\t\t} else {\n\t\t\tdescriptor.value = function wrapped(this: unknown, ...args: unknown[]) {\n\t\t\t\tconst svc = getMetricsService();\n\t\t\t\tif (svc) {\n\t\t\t\t\tconst labels = options.labels?.();\n\t\t\t\t\tsvc.getOrCreateCounter(\n\t\t\t\t\t\tmetricName,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tlabels ? Object.keys(labels) : undefined,\n\t\t\t\t\t).inc(labels);\n\t\t\t\t}\n\t\t\t\treturn original.apply(this, args);\n\t\t\t};\n\t\t}\n\t\treturn descriptor;\n\t};\n}",
16
+ "/**\n * `@Timed()` — class-method decorator that records a method's\n * duration in a histogram.\n *\n * Usage:\n * class UserController {\n * @Timed('http_request_duration_seconds', { labels: () => ({ method: 'GET' }) })\n * list() { ... }\n * }\n *\n * The decorator reads the `MetricsService` from the global registry.\n * When no service is registered the decorator is a pass-through.\n */\n\nimport { getMetricsService } from \"../service.js\";\n\nexport interface TimedOptions {\n\t/** Optional buckets override. */\n\tbuckets?: number[];\n\t/** Optional label values, computed at call time. */\n\tlabels?: () => Record<string, string>;\n}\n\n/**\n * Method decorator: observe a method's duration (in seconds) in a\n * histogram. Async methods are timed across their full await.\n */\nexport function Timed(metricName: string, options: TimedOptions = {}) {\n\treturn function (_target: object, _propertyKey: string | symbol, descriptor: PropertyDescriptor) {\n\t\tconst original = descriptor.value as (...args: unknown[]) => unknown;\n\t\tif (typeof original !== \"function\") {\n\t\t\tthrow new Error(`@Timed() can only be applied to methods, got ${typeof original}`);\n\t\t}\n\n\t\tconst isAsync = (original as any).constructor?.name === \"AsyncFunction\";\n\n\t\tif (isAsync) {\n\t\t\tdescriptor.value = async function wrapped(this: unknown, ...args: unknown[]) {\n\t\t\t\tconst svc = getMetricsService();\n\t\t\t\tconst start = performance.now();\n\t\t\t\ttry {\n\t\t\t\t\treturn await original.apply(this, args);\n\t\t\t\t} finally {\n\t\t\t\t\tif (svc) {\n\t\t\t\t\t\tconst elapsedMs = performance.now() - start;\n\t\t\t\t\t\tconst labels = options.labels?.();\n\t\t\t\t\t\tsvc.getOrCreateHistogram(\n\t\t\t\t\t\t\tmetricName,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tlabels ? Object.keys(labels) : undefined,\n\t\t\t\t\t\t\toptions.buckets,\n\t\t\t\t\t\t).observe(elapsedMs / 1000, labels);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\tdescriptor.value = function wrapped(this: unknown, ...args: unknown[]) {\n\t\t\t\tconst svc = getMetricsService();\n\t\t\t\tconst start = performance.now();\n\t\t\t\ttry {\n\t\t\t\t\treturn original.apply(this, args);\n\t\t\t\t} finally {\n\t\t\t\t\tif (svc) {\n\t\t\t\t\t\tconst elapsedMs = performance.now() - start;\n\t\t\t\t\t\tconst labels = options.labels?.();\n\t\t\t\t\t\tsvc.getOrCreateHistogram(\n\t\t\t\t\t\t\tmetricName,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tlabels ? Object.keys(labels) : undefined,\n\t\t\t\t\t\t\toptions.buckets,\n\t\t\t\t\t\t).observe(elapsedMs / 1000, labels);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\treturn descriptor;\n\t};\n}\n"
17
+ ],
18
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAMa,cAsCA,aAeA;AAAA;AAAA,EArDA,eAAe;AAAA,IAE3B,YAAY;AAAA,IAGZ,YAAY;AAAA,IAGZ,YAAY;AAAA,IAGZ,QAAQ;AAAA,IAGR,QAAQ;AAAA,IAGR,QAAQ;AAAA,IAGR,UAAU;AAAA,IAGV,YAAY;AAAA,IAGZ,MAAM;AAAA,IAGN,YAAY;AAAA,IAGZ,QAAQ;AAAA,EACT;AAAA,EAKa,cAAc;AAAA,IAC1B,SAAS;AAAA,IACT,UAAU;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,EACP;AAAA,EAKa,eAAe;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;;;ACjDO,SAAS,YAAY,CAC3B,UACA,QACS;AAAA,EACT,IAAI,SAAS,WAAW;AAAA,IAAG,OAAO;AAAA,EAClC,OAAO,SACL,IAAI,CAAC,MAAM,GAAG,MAAM,iBAAiB,OAAO,MAAM,EAAE,IAAI,EACxD,KAAK,GAAG;AAAA;AAAA;AAGJ,MAAM,YAAgC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EAED,SAAS,IAAI;AAAA,EAErB,WAAW,CAAC,MAAsB;AAAA,IACjC,KAAK,OAAO,KAAK;AAAA,IACjB,KAAK,OAAO,KAAK;AAAA,IACjB,KAAK,aAAa,KAAK,cAAc,CAAC;AAAA;AAAA,EAGvC,GAAG,CAAC,QAAuC;AAAA,IAC1C,KAAK,MAAM,GAAG,MAAM;AAAA;AAAA,EAGrB,KAAK,CAAC,GAAW,QAAuC;AAAA,IACvD,IAAI,IAAI,GAAG;AAAA,MACV,MAAM,IAAI,MAAM,WAAW,KAAK,+BAA+B,IAAI;AAAA,IACpE;AAAA,IACA,KAAK,aAAa,MAAM;AAAA,IACxB,MAAM,MAAM,KAAK,IAAI,MAAM;AAAA,IAC3B,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA;AAAA,EAGrD,KAAK,GAAS;AAAA,IACb,KAAK,OAAO,MAAM;AAAA;AAAA,EAGnB,UAAU,GAAmB;AAAA,IAC5B,MAAM,MAAsB,CAAC;AAAA,IAC7B,YAAY,GAAG,MAAM,KAAK,QAAQ;AAAA,MACjC,IAAI,KAAK,EAAE,QAAQ,KAAK,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,IAChD;AAAA,IACA,OAAO;AAAA;AAAA,EAIR,gBAAgB,GAAW;AAAA,IAC1B,MAAM,QAAkB,CAAC;AAAA,IACzB,IAAI,KAAK;AAAA,MAAM,MAAM,KAAK,UAAU,KAAK,QAAQ,KAAK,MAAM;AAAA,IAC5D,MAAM,KAAK,UAAU,KAAK,cAAc;AAAA,IACxC,YAAY,GAAG,MAAM,KAAK,QAAQ;AAAA,MACjC,MAAM,SAAS,KAAK,SAAS,CAAC;AAAA,MAC9B,MAAM,MAAM,aAAa,KAAK,YAAY,MAAM;AAAA,MAChD,MAAM,KAAK,MAAM,GAAG,KAAK,QAAQ,QAAQ,MAAM,GAAG,KAAK,QAAQ,GAAG;AAAA,IACnE;AAAA,IACA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;AAAA,EAGf,YAAY,CAAC,QAAuC;AAAA,IAC3D,IAAI,CAAC,UAAU,KAAK,WAAW,WAAW;AAAA,MAAG;AAAA,IAC7C,IAAI,KAAK,WAAW,WAAW,GAAG;AAAA,MACjC,MAAM,IAAI,MAAM,WAAW,KAAK,6BAA6B;AAAA,IAC9D;AAAA,IACA,IAAI,CAAC,QAAQ;AAAA,MACZ,MAAM,IAAI,MAAM,WAAW,KAAK,yBAAyB,KAAK,WAAW,KAAK,IAAI,GAAG;AAAA,IACtF;AAAA,IACA,WAAW,YAAY,KAAK,YAAY;AAAA,MACvC,IAAI,EAAE,YAAY,SAAS;AAAA,QAC1B,MAAM,IAAI,MAAM,WAAW,KAAK,uBAAuB,WAAW;AAAA,MACnE;AAAA,IACD;AAAA;AAAA,EAGO,GAAG,CAAC,QAAyC;AAAA,IACpD,IAAI,CAAC;AAAA,MAAQ,OAAO;AAAA,IACpB,OAAO,KAAK,WAAW,IAAI,CAAC,MAAM,GAAG,KAAK,iBAAiB,OAAO,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG;AAAA;AAAA,EAGhF,QAAQ,CAAC,KAAqC;AAAA,IACrD,IAAI,CAAC;AAAA,MAAK,OAAO,CAAC;AAAA,IAClB,MAAM,MAA8B,CAAC;AAAA,IACrC,WAAW,QAAQ,IAAI,MAAM,GAAG,GAAG;AAAA,MAClC,OAAO,MAAM,QAAQ,KAAK,MAAM,GAAG;AAAA,MACnC,IAAI,KAAK,KAAK,KAAK,GAAG;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAET;AAEO,SAAS,gBAAgB,CAAC,GAAmB;AAAA,EACnD,OAAO,EAAE,QAAQ,OAAO,MAAM,EAAE,QAAQ,OAAO,KAAK,EAAE,QAAQ,MAAM,MAAM;AAAA;;ACzFpE,MAAM,UAA4B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACD,SAAS,IAAI;AAAA,EAErB,WAAW,CAAC,MAAoB;AAAA,IAC/B,KAAK,OAAO,KAAK;AAAA,IACjB,KAAK,OAAO,KAAK;AAAA,IACjB,KAAK,aAAa,KAAK,cAAc,CAAC;AAAA;AAAA,EAGvC,GAAG,CAAC,OAAe,QAAuC;AAAA,IACzD,KAAK,aAAa,MAAM;AAAA,IACxB,KAAK,OAAO,IAAI,KAAK,IAAI,MAAM,GAAG,KAAK;AAAA;AAAA,EAGxC,GAAG,CAAC,IAAY,GAAG,QAAuC;AAAA,IACzD,KAAK,aAAa,MAAM;AAAA,IACxB,MAAM,IAAI,KAAK,IAAI,MAAM;AAAA,IACzB,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA;AAAA,EAGjD,GAAG,CAAC,IAAY,GAAG,QAAuC;AAAA,IACzD,KAAK,aAAa,MAAM;AAAA,IACxB,MAAM,IAAI,KAAK,IAAI,MAAM;AAAA,IACzB,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA;AAAA,EAGjD,gBAAgB,CAAC,QAAuC;AAAA,IACvD,KAAK,IAAI,KAAK,IAAI,IAAI,MAAM,MAAM;AAAA;AAAA,EAGnC,KAAK,GAAS;AAAA,IACb,KAAK,OAAO,MAAM;AAAA;AAAA,EAGnB,UAAU,GAAmB;AAAA,IAC5B,MAAM,MAAsB,CAAC;AAAA,IAC7B,YAAY,GAAG,MAAM,KAAK,QAAQ;AAAA,MACjC,IAAI,KAAK,EAAE,QAAQ,KAAK,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,IAChD;AAAA,IACA,OAAO;AAAA;AAAA,EAIR,gBAAgB,GAAW;AAAA,IAC1B,MAAM,QAAkB,CAAC;AAAA,IACzB,IAAI,KAAK;AAAA,MAAM,MAAM,KAAK,UAAU,KAAK,QAAQ,KAAK,MAAM;AAAA,IAC5D,MAAM,KAAK,UAAU,KAAK,YAAY;AAAA,IACtC,YAAY,GAAG,MAAM,KAAK,QAAQ;AAAA,MACjC,MAAM,SAAS,KAAK,SAAS,CAAC;AAAA,MAC9B,MAAM,MAAM,aAAa,KAAK,YAAY,MAAM;AAAA,MAChD,MAAM,KAAK,MAAM,GAAG,KAAK,QAAQ,QAAQ,MAAM,GAAG,KAAK,QAAQ,GAAG;AAAA,IACnE;AAAA,IACA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;AAAA,EAGf,YAAY,CAAC,QAAuC;AAAA,IAC3D,IAAI,CAAC,UAAU,KAAK,WAAW,WAAW;AAAA,MAAG;AAAA,IAC7C,IAAI,KAAK,WAAW,WAAW,GAAG;AAAA,MACjC,MAAM,IAAI,MAAM,SAAS,KAAK,6BAA6B;AAAA,IAC5D;AAAA,IACA,IAAI,CAAC,QAAQ;AAAA,MACZ,MAAM,IAAI,MAAM,SAAS,KAAK,yBAAyB,KAAK,WAAW,KAAK,IAAI,GAAG;AAAA,IACpF;AAAA,IACA,WAAW,YAAY,KAAK,YAAY;AAAA,MACvC,IAAI,EAAE,YAAY,SAAS;AAAA,QAC1B,MAAM,IAAI,MAAM,SAAS,KAAK,uBAAuB,WAAW;AAAA,MACjE;AAAA,IACD;AAAA;AAAA,EAGO,GAAG,CAAC,QAAyC;AAAA,IACpD,IAAI,CAAC;AAAA,MAAQ,OAAO;AAAA,IACpB,OAAO,KAAK,WAAW,IAAI,CAAC,MAAM,GAAG,KAAK,iBAAiB,OAAO,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG;AAAA;AAAA,EAGhF,QAAQ,CAAC,KAAqC;AAAA,IACrD,IAAI,CAAC;AAAA,MAAK,OAAO,CAAC;AAAA,IAClB,MAAM,MAA8B,CAAC;AAAA,IACrC,WAAW,QAAQ,IAAI,MAAM,GAAG,GAAG;AAAA,MAClC,OAAO,MAAM,QAAQ,KAAK,MAAM,GAAG;AAAA,MACnC,IAAI,KAAK,KAAK,KAAK,GAAG;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAET;;ACvFO,IAAM,kBAAkB,CAAC,OAAO,MAAM,OAAO,MAAM,KAAK,MAAM,KAAK,GAAG,KAAK,GAAG,EAAE;AAAA;AAQhF,MAAM,cAAoC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EAET,SAAS,IAAI;AAAA,EAErB,WAAW,CAAC,MAAwB;AAAA,IACnC,KAAK,OAAO,KAAK;AAAA,IACjB,KAAK,OAAO,KAAK;AAAA,IACjB,KAAK,aAAa,KAAK,cAAc,CAAC;AAAA,IACtC,MAAM,UAAU,KAAK,WAAW;AAAA,IAEhC,KAAK,cAAc,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,IACpD,IAAI,KAAK,YAAY,WAAW,GAAG;AAAA,MAClC,MAAM,IAAI,MAAM,aAAa,KAAK,mCAAmC;AAAA,IACtE;AAAA;AAAA,EAGD,OAAO,CAAC,OAAe,QAAuC;AAAA,IAC7D,KAAK,aAAa,MAAM;AAAA,IACxB,MAAM,IAAI,KAAK,IAAI,MAAM;AAAA,IACzB,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC;AAAA,IACzB,IAAI,CAAC,GAAG;AAAA,MACP,IAAI,EAAE,SAAS,IAAI,MAAM,KAAK,YAAY,MAAM,EAAE,KAAK,CAAC,GAAG,KAAK,GAAG,OAAO,EAAE;AAAA,MAC5E,KAAK,OAAO,IAAI,GAAG,CAAC;AAAA,IACrB;AAAA,IACA,EAAE,OAAO;AAAA,IACT,EAAE;AAAA,IACF,SAAS,IAAI,EAAG,IAAI,KAAK,YAAY,QAAQ,KAAK;AAAA,MACjD,IAAI,SAAS,KAAK,YAAY;AAAA,QAAI,EAAE,QAAQ;AAAA,IAC7C;AAAA;AAAA,OAGK,KAAO,CACZ,IACA,QACa;AAAA,IACb,MAAM,QAAQ,YAAY,IAAI;AAAA,IAC9B,IAAI;AAAA,MACH,OAAO,MAAM,GAAG,KAAK;AAAA,cACpB;AAAA,MACD,MAAM,YAAY,YAAY,IAAI,IAAI;AAAA,MACtC,KAAK,QAAQ,YAAY,MAAM,MAAM;AAAA;AAAA;AAAA,EAIvC,KAAK,GAAS;AAAA,IACb,KAAK,OAAO,MAAM;AAAA;AAAA,EAGnB,UAAU,GAAmB;AAAA,IAC5B,MAAM,MAAsB,CAAC;AAAA,IAC7B,YAAY,GAAG,MAAM,KAAK,QAAQ;AAAA,MACjC,MAAM,SAAS,KAAK,SAAS,CAAC;AAAA,MAC9B,SAAS,IAAI,EAAG,IAAI,KAAK,YAAY,QAAQ,KAAK;AAAA,QACjD,IAAI,KAAK;AAAA,UACR,QAAQ,KAAK,QAAQ,IAAI,OAAO,KAAK,YAAY,EAAE,EAAE;AAAA,UACrD,OAAO,EAAE,QAAQ;AAAA,QAClB,CAAC;AAAA,MACF;AAAA,MACA,IAAI,KAAK,EAAE,QAAQ,KAAK,QAAQ,IAAI,OAAO,GAAG,OAAO,EAAE,MAAM,CAAC;AAAA,MAC9D,IAAI,KAAK,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,EAAE,IAAI,CAAC;AAAA,IACjD;AAAA,IACA,OAAO;AAAA;AAAA,EAIR,gBAAgB,GAAW;AAAA,IAC1B,MAAM,QAAkB,CAAC;AAAA,IACzB,IAAI,KAAK;AAAA,MAAM,MAAM,KAAK,UAAU,KAAK,QAAQ,KAAK,MAAM;AAAA,IAC5D,MAAM,KAAK,UAAU,KAAK,gBAAgB;AAAA,IAC1C,aAAa,QAAQ,WAAW,KAAK,gBAAgB,GAAG;AAAA,MACvD,MAAM,KAAK,KAAK,YAAY,QAAQ,KAAK,CAAC;AAAA,IAC3C;AAAA,IACA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;AAAA,EAIvB,WAAW,CAAC,QAAgC,OAA+B;AAAA,IAC1E,MAAM,aAAa,aAAa,KAAK,YAAY,MAAM;AAAA,IACvD,MAAM,QAAkB,CAAC;AAAA,IAEzB,IAAI,aAAa;AAAA,IACjB,SAAS,IAAI,EAAG,IAAI,KAAK,YAAY,QAAQ,KAAK;AAAA,MACjD,aAAa,MAAM,QAAQ;AAAA,MAC3B,MAAM,KAAK,KAAK,YAAY;AAAA,MAC5B,MAAM,QAAQ,OAAO,EAAE;AAAA,MACvB,MAAM,MAAM,aAAa,GAAG,kBAAkB,WAAW,OAAO;AAAA,MAChE,MAAM,KAAK,GAAG,KAAK,eAAe,QAAQ,YAAY;AAAA,IACvD;AAAA,IACA;AAAA,MACC,MAAM,MAAM,aAAa,GAAG,yBAAyB;AAAA,MACrD,MAAM,KAAK,GAAG,KAAK,eAAe,QAAQ,MAAM,OAAO;AAAA,IACxD;AAAA,IACA;AAAA,MACC,MAAM,MAAM,aAAa,IAAI,gBAAgB;AAAA,MAC7C,MAAM,KAAK,GAAG,KAAK,WAAW,OAAO,MAAM,KAAK;AAAA,IACjD;AAAA,IACA;AAAA,MACC,MAAM,MAAM,aAAa,IAAI,gBAAgB;AAAA,MAC7C,MAAM,KAAK,GAAG,KAAK,aAAa,OAAO,MAAM,OAAO;AAAA,IACrD;AAAA,IACA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;AAAA,EAIvB,eAAe,GAAqE;AAAA,IACnF,MAAM,MAAwE,CAAC;AAAA,IAC/E,YAAY,GAAG,MAAM,KAAK,QAAQ;AAAA,MACjC,IAAI,KAAK,EAAE,QAAQ,KAAK,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,IAChD;AAAA,IACA,OAAO;AAAA;AAAA,EAGA,YAAY,CAAC,QAAuC;AAAA,IAC3D,IAAI,CAAC,UAAU,KAAK,WAAW,WAAW;AAAA,MAAG;AAAA,IAC7C,IAAI,KAAK,WAAW,WAAW,GAAG;AAAA,MACjC,MAAM,IAAI,MAAM,aAAa,KAAK,6BAA6B;AAAA,IAChE;AAAA,IACA,IAAI,CAAC,QAAQ;AAAA,MACZ,MAAM,IAAI,MAAM,aAAa,KAAK,yBAAyB,KAAK,WAAW,KAAK,IAAI,GAAG;AAAA,IACxF;AAAA,IACA,WAAW,YAAY,KAAK,YAAY;AAAA,MACvC,IAAI,EAAE,YAAY,SAAS;AAAA,QAC1B,MAAM,IAAI,MAAM,aAAa,KAAK,uBAAuB,WAAW;AAAA,MACrE;AAAA,IACD;AAAA;AAAA,EAGO,GAAG,CAAC,QAAyC;AAAA,IACpD,IAAI,CAAC;AAAA,MAAQ,OAAO;AAAA,IACpB,OAAO,KAAK,WAAW,IAAI,CAAC,MAAM,GAAG,KAAK,iBAAiB,OAAO,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG;AAAA;AAAA,EAGhF,QAAQ,CAAC,KAAqC;AAAA,IACrD,IAAI,CAAC;AAAA,MAAK,OAAO,CAAC;AAAA,IAClB,MAAM,MAA8B,CAAC;AAAA,IACrC,WAAW,QAAQ,IAAI,MAAM,GAAG,GAAG;AAAA,MAClC,OAAO,MAAM,QAAQ,KAAK,MAAM,GAAG;AAAA,MACnC,IAAI,KAAK,KAAK,KAAK,GAAG;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAET;;ACxJO,IAAM,sBAAsB,CAAC,KAAK,KAAK,IAAI;AAE3C,IAAM,0BAA0B;AAChC,IAAM,sBAAsB;AAAA;AAW5B,MAAM,YAAgC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,SAAS,IAAI;AAAA,EAErB,WAAW,CAAC,MAAsB;AAAA,IACjC,KAAK,OAAO,KAAK;AAAA,IACjB,KAAK,OAAO,KAAK;AAAA,IACjB,KAAK,aAAa,KAAK,cAAc,CAAC;AAAA,IACtC,KAAK,cAAc,KAAK,eAAe;AAAA,IACvC,KAAK,gBAAgB,KAAK,iBAAiB;AAAA,IAC3C,KAAK,aAAa,KAAK,cAAc;AAAA,IACrC,KAAK,aAAa,KAAK,KAAK,KAAK,gBAAgB,KAAK,UAAU;AAAA;AAAA,EAGjE,OAAO,CAAC,OAAe,QAAuC;AAAA,IAC7D,KAAK,aAAa,MAAM;AAAA,IACxB,MAAM,IAAI,KAAK,IAAI,MAAM;AAAA,IACzB,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC;AAAA,IACzB,IAAI,CAAC,GAAG;AAAA,MACP,IAAI,KAAK,SAAS;AAAA,MAClB,KAAK,OAAO,IAAI,GAAG,CAAC;AAAA,IACrB;AAAA,IACA,KAAK,YAAY,CAAC;AAAA,IAClB,MAAM,IAAI,EAAE,QAAQ,EAAE;AAAA,IACtB,EAAE,OAAO,KAAK,KAAK;AAAA,IACnB,EAAE,OAAO;AAAA,IACT,EAAE;AAAA;AAAA,OAGG,KAAO,CACZ,IACA,QACa;AAAA,IACb,MAAM,QAAQ,YAAY,IAAI;AAAA,IAC9B,IAAI;AAAA,MACH,OAAO,MAAM,GAAG;AAAA,cACf;AAAA,MACD,MAAM,YAAY,YAAY,IAAI,IAAI;AAAA,MACtC,KAAK,QAAQ,YAAY,MAAM,MAAM;AAAA;AAAA;AAAA,EAIvC,KAAK,GAAS;AAAA,IACb,KAAK,OAAO,MAAM;AAAA;AAAA,EAGnB,UAAU,GAAmB;AAAA,IAC5B,MAAM,MAAsB,CAAC;AAAA,IAC7B,YAAY,MAAM,KAAK,QAAQ;AAAA,MAC9B,IAAI,KAAK,EAAE,QAAQ,KAAK,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,IAChD;AAAA,IACA,OAAO;AAAA;AAAA,EAIR,gBAAgB,GAAW;AAAA,IAC1B,MAAM,QAAkB,CAAC;AAAA,IACzB,IAAI,KAAK;AAAA,MAAM,MAAM,KAAK,UAAU,KAAK,QAAQ,KAAK,MAAM;AAAA,IAC5D,MAAM,KAAK,UAAU,KAAK,cAAc;AAAA,IAExC,YAAY,GAAG,MAAM,KAAK,QAAQ;AAAA,MACjC,MAAM,SAAS,KAAK,SAAS,CAAC;AAAA,MAC9B,KAAK,YAAY,CAAC;AAAA,MAClB,MAAM,SAAS,KAAK,OAAO,CAAC;AAAA,MAE5B,WAAW,KAAK,KAAK,aAAa;AAAA,QACjC,MAAM,OAAO,KAAK,SAAS,GAAG,CAAC;AAAA,QAC/B,MAAM,OAAO,mBAAmB,CAAC;AAAA,QAGjC,MAAM,aAAqC,KAAK,QAAQ,UAAU,KAAK;AAAA,QACvE,MAAM,UAAU,aAAa,KAAK,YAAY,UAAU;AAAA,QACxD,MAAM,MAAM,UAAU,GAAG,qBAAqB,UAAU,aAAa;AAAA,QACrE,MAAM,KAAK,GAAG,KAAK,QAAQ,QAAQ,MAAM;AAAA,MAC1C;AAAA,MACA;AAAA,QACC,MAAM,MAAM,aAAa,KAAK,YAAY,MAAM;AAAA,QAChD,MAAM,KAAK,GAAG,KAAK,WAAW,MAAM,IAAI,SAAS,MAAM,OAAO,KAAK;AAAA,QACnE,MAAM,KAAK,GAAG,KAAK,aAAa,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO;AAAA,MACxE;AAAA,IACD;AAAA,IACA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;AAAA,EAKf,QAAQ,GAAiB;AAAA,IAChC,MAAM,UAAmC,CAAC;AAAA,IAC1C,SAAS,IAAI,EAAG,IAAI,KAAK,YAAY,KAAK;AAAA,MACzC,QAAQ,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,GAAG,OAAO,EAAE,CAAC;AAAA,IAC9C;AAAA,IACA,OAAO,EAAE,SAAS,eAAe,GAAG,cAAc,KAAK,IAAI,EAAE;AAAA;AAAA,EAGtD,WAAW,CAAC,GAAuB;AAAA,IAC1C,MAAM,MAAM,KAAK,IAAI;AAAA,IACrB,MAAM,WAAW,MAAM,EAAE,gBAAgB;AAAA,IACzC,IAAI,WAAW,KAAK,YAAY;AAAA,MAC/B,MAAM,YAAY,KAAK,MAAM,UAAU,KAAK,UAAU;AAAA,MACtD,SAAS,IAAI,EAAG,IAAI,WAAW,KAAK;AAAA,QACnC,EAAE,iBAAiB,EAAE,gBAAgB,KAAK,KAAK;AAAA,QAC/C,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,CAAC,GAAG,KAAK,GAAG,OAAO,EAAE;AAAA,MAC7D;AAAA,MACA,EAAE,eAAe;AAAA,IAClB;AAAA;AAAA,EAGO,MAAM,CAAC,GAAiD;AAAA,IAC/D,IAAI,MAAM;AAAA,IACV,IAAI,QAAQ;AAAA,IACZ,WAAW,KAAK,EAAE,SAAS;AAAA,MAC1B,OAAO,EAAE;AAAA,MACT,SAAS,EAAE;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,KAAK,MAAM;AAAA;AAAA,EAGb,QAAQ,CAAC,GAAiB,GAAmB;AAAA,IAEpD,MAAM,MAAgB,CAAC;AAAA,IACvB,WAAW,KAAK,EAAE,SAAS;AAAA,MAC1B,WAAW,KAAK,EAAE;AAAA,QAAQ,IAAI,KAAK,CAAC;AAAA,IACrC;AAAA,IACA,IAAI,IAAI,WAAW;AAAA,MAAG,OAAO;AAAA,IAC7B,IAAI,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,IACxB,MAAM,MAAM,KAAK,IAAI,IAAI,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,CAAC;AAAA,IAC5E,OAAO,IAAI;AAAA;AAAA,EAGJ,YAAY,CAAC,QAAuC;AAAA,IAC3D,IAAI,CAAC,UAAU,KAAK,WAAW,WAAW;AAAA,MAAG;AAAA,IAC7C,IAAI,KAAK,WAAW,WAAW,GAAG;AAAA,MACjC,MAAM,IAAI,MAAM,WAAW,KAAK,6BAA6B;AAAA,IAC9D;AAAA,IACA,IAAI,CAAC,QAAQ;AAAA,MACZ,MAAM,IAAI,MAAM,WAAW,KAAK,yBAAyB,KAAK,WAAW,KAAK,IAAI,GAAG;AAAA,IACtF;AAAA,IACA,WAAW,YAAY,KAAK,YAAY;AAAA,MACvC,IAAI,EAAE,YAAY,SAAS;AAAA,QAC1B,MAAM,IAAI,MAAM,WAAW,KAAK,uBAAuB,WAAW;AAAA,MACnE;AAAA,IACD;AAAA;AAAA,EAGO,GAAG,CAAC,QAAyC;AAAA,IACpD,IAAI,CAAC;AAAA,MAAQ,OAAO;AAAA,IACpB,OAAO,KAAK,WAAW,IAAI,CAAC,MAAM,GAAG,KAAK,iBAAiB,OAAO,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG;AAAA;AAAA,EAGhF,QAAQ,CAAC,KAAqC;AAAA,IACrD,IAAI,CAAC;AAAA,MAAK,OAAO,CAAC;AAAA,IAClB,MAAM,MAA8B,CAAC;AAAA,IACrC,WAAW,QAAQ,IAAI,MAAM,GAAG,GAAG;AAAA,MAClC,OAAO,MAAM,QAAQ,KAAK,MAAM,GAAG;AAAA,MACnC,IAAI,KAAK,KAAK,KAAK,GAAG;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAET;AAEA,SAAS,kBAAkB,CAAC,GAAmB;AAAA,EAI9C,MAAM,IAAI,OAAO,CAAC;AAAA,EAGlB,IAAI,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,GAAG;AAAA,IACpC,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AAAA,EACzD;AAAA,EACA,OAAO;AAAA;;ACnLD,MAAM,gBAAgB;AAAA,EACpB,UAAU,IAAI;AAAA,EACd,eAAuC,CAAC;AAAA,EAGhD,eAAe,CAAC,QAAsC;AAAA,IACrD,KAAK,eAAe,KAAK,OAAO;AAAA;AAAA,EAGjC,eAAe,GAA2B;AAAA,IACzC,OAAO,KAAK,KAAK,aAAa;AAAA;AAAA,EAI/B,eAAe,CAAC,MAA+B;AAAA,IAC9C,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG;AAAA,MAChC,MAAM,IAAI,MAAM,UAAU,KAAK,4BAA4B;AAAA,IAC5D;AAAA,IACA,MAAM,IAAI,IAAI,YAAY,IAAI;AAAA,IAC9B,KAAK,QAAQ,IAAI,KAAK,MAAM,EAAE,MAAM,KAAK,MAAM,MAAM,WAAW,MAAM,EAAE,CAAC;AAAA,IACzE,OAAO;AAAA;AAAA,EAGR,aAAa,CAAC,MAA2B;AAAA,IACxC,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG;AAAA,MAChC,MAAM,IAAI,MAAM,UAAU,KAAK,4BAA4B;AAAA,IAC5D;AAAA,IACA,MAAM,IAAI,IAAI,UAAU,IAAI;AAAA,IAC5B,KAAK,QAAQ,IAAI,KAAK,MAAM,EAAE,MAAM,KAAK,MAAM,MAAM,SAAS,MAAM,EAAE,CAAC;AAAA,IACvE,OAAO;AAAA;AAAA,EAGR,iBAAiB,CAAC,MAAmC;AAAA,IACpD,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG;AAAA,MAChC,MAAM,IAAI,MAAM,UAAU,KAAK,4BAA4B;AAAA,IAC5D;AAAA,IACA,MAAM,IAAI,IAAI,cAAc,IAAI;AAAA,IAChC,KAAK,QAAQ,IAAI,KAAK,MAAM,EAAE,MAAM,KAAK,MAAM,MAAM,aAAa,MAAM,EAAE,CAAC;AAAA,IAC3E,OAAO;AAAA;AAAA,EAGR,eAAe,CAAC,MAA+B;AAAA,IAC9C,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG;AAAA,MAChC,MAAM,IAAI,MAAM,UAAU,KAAK,4BAA4B;AAAA,IAC5D;AAAA,IACA,MAAM,IAAI,IAAI,YAAY,IAAI;AAAA,IAC9B,KAAK,QAAQ,IAAI,KAAK,MAAM,EAAE,MAAM,KAAK,MAAM,MAAM,WAAW,MAAM,EAAE,CAAC;AAAA,IACzE,OAAO;AAAA;AAAA,EAIR,GAAG,CAAC,MAA4C;AAAA,IAC/C,OAAO,KAAK,QAAQ,IAAI,IAAI;AAAA;AAAA,EAI7B,UAAU,CAAC,MAAuB;AAAA,IACjC,MAAM,IAAI,KAAK,QAAQ,IAAI,IAAI;AAAA,IAC/B,IAAI,CAAC;AAAA,MAAG,MAAM,IAAI,MAAM,WAAW,wBAAwB;AAAA,IAC3D,IAAI,EAAE,SAAS;AAAA,MAAW,MAAM,IAAI,MAAM,UAAU,aAAa,EAAE,qBAAqB;AAAA,IACxF,OAAO,EAAE;AAAA;AAAA,EAIV,QAAQ,CAAC,MAAqB;AAAA,IAC7B,MAAM,IAAI,KAAK,QAAQ,IAAI,IAAI;AAAA,IAC/B,IAAI,CAAC;AAAA,MAAG,MAAM,IAAI,MAAM,SAAS,wBAAwB;AAAA,IACzD,IAAI,EAAE,SAAS;AAAA,MAAS,MAAM,IAAI,MAAM,UAAU,aAAa,EAAE,mBAAmB;AAAA,IACpF,OAAO,EAAE;AAAA;AAAA,EAIV,YAAY,CAAC,MAAyB;AAAA,IACrC,MAAM,IAAI,KAAK,QAAQ,IAAI,IAAI;AAAA,IAC/B,IAAI,CAAC;AAAA,MAAG,MAAM,IAAI,MAAM,aAAa,wBAAwB;AAAA,IAC7D,IAAI,EAAE,SAAS;AAAA,MAAa,MAAM,IAAI,MAAM,UAAU,aAAa,EAAE,uBAAuB;AAAA,IAC5F,OAAO,EAAE;AAAA;AAAA,EAIV,UAAU,CAAC,MAAuB;AAAA,IACjC,MAAM,IAAI,KAAK,QAAQ,IAAI,IAAI;AAAA,IAC/B,IAAI,CAAC;AAAA,MAAG,MAAM,IAAI,MAAM,WAAW,wBAAwB;AAAA,IAC3D,IAAI,EAAE,SAAS;AAAA,MAAW,MAAM,IAAI,MAAM,UAAU,aAAa,EAAE,qBAAqB;AAAA,IACxF,OAAO,EAAE;AAAA;AAAA,MAIN,IAAI,GAAW;AAAA,IAClB,OAAO,KAAK,QAAQ;AAAA;AAAA,EAIrB,KAAK,GAAa;AAAA,IACjB,OAAO,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC,EAAE,KAAK;AAAA;AAAA,EAItC,QAAQ,GAAS;AAAA,IAChB,WAAW,KAAK,KAAK,QAAQ,OAAO,GAAG;AAAA,MACtC,EAAE,KAAK,MAAM;AAAA,IACd;AAAA;AAAA,EAID,MAAM,CAAC,SAA2B,cAAgC;AAAA,IACjE,MAAM,WAAqB,CAAC;AAAA,IAC5B,MAAM,kBAAkB,mBAAmB,KAAK,YAAY;AAAA,IAE5D,WAAW,KAAK,KAAK,QAAQ,OAAO,GAAG;AAAA,MACtC,MAAM,MAAM,EAAE,KAAK,iBAAiB;AAAA,MACpC,IAAI,iBAAiB;AAAA,QACpB,SAAS,KAAK,kBAAkB,KAAK,KAAK,YAAY,CAAC;AAAA,MACxD,EAAO;AAAA,QACN,SAAS,KAAK,GAAG;AAAA;AAAA,IAEnB;AAAA,IAEA,MAAM,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK;AAAA;AAAA,CAAM;AAAA,IAC7D,MAAM,cACL,WAAW,gBACR,+DACA;AAAA,IACJ,OAAO,EAAE,MAAM,QAAQ,KAAK,SAAS;AAAA,CAAI,IAAI,KAAK;AAAA,IAAO,YAAY;AAAA;AAEvE;AAEA,SAAS,kBAAkB,CAAC,QAAwC;AAAA,EACnE,MAAM,OAAO,OAAO,KAAK,MAAM;AAAA,EAC/B,IAAI,KAAK,WAAW;AAAA,IAAG,OAAO;AAAA,EAC9B,OAAO,KAAK,IAAI,CAAC,MAAM,GAAG,MAAM,OAAO,KAAK,EAAE,KAAK,GAAG;AAAA;AAGvD,SAAS,iBAAiB,CAAC,OAAe,QAAwC;AAAA,EACjF,MAAM,OAAO,OAAO,KAAK,MAAM;AAAA,EAC/B,IAAI,KAAK,WAAW;AAAA,IAAG,OAAO;AAAA,EAC9B,MAAM,SAAS,KAAK,IAAI,CAAC,MAAM,GAAG,MAAM,OAAO,KAAK,EAAE,KAAK,GAAG;AAAA,EAC9D,OAAO,MACL,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,SAAS;AAAA,IACd,IAAI,KAAK,WAAW,GAAG;AAAA,MAAG,OAAO;AAAA,IACjC,MAAM,YAAY,KAAK,QAAQ,GAAG;AAAA,IAClC,IAAI,cAAc,IAAI;AAAA,MACrB,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAAA,MAC9B,IAAI,UAAU;AAAA,QAAI,OAAO;AAAA,MACzB,MAAM,SAAS,KAAK,MAAM,GAAG,KAAK;AAAA,MAClC,MAAM,OAAO,KAAK,MAAM,KAAK;AAAA,MAC7B,OAAO,GAAG,UAAU,UAAU;AAAA,IAC/B;AAAA,IACA,MAAM,aAAa,KAAK,QAAQ,KAAK,SAAS;AAAA,IAC9C,IAAI,eAAe;AAAA,MAAI,OAAO;AAAA,IAC9B,MAAM,WAAW,KAAK,MAAM,YAAY,GAAG,UAAU;AAAA,IACrD,OAAO,GAAG,KAAK,MAAM,GAAG,YAAY,CAAC,IAAI,UAAU,WAAW,KAAK,MAAM,UAAU;AAAA,GACnF,EACA,KAAK;AAAA,CAAI;AAAA;;AClKL,IAAM,wBAAwB,OAAO,IAAI,sBAAsB;AAOtE,IAAI;AAEG,SAAS,iBAAiB,CAAC,SAA+B;AAAA,EAChE,WAAW;AAAA;AAGL,SAAS,iBAAiB,GAA+B;AAAA,EAC/D,OAAO;AAAA;AAAA;AAGD,MAAM,eAAe;AAAA,EAClB,WAA4B,IAAI;AAAA,EAIzC,OAAO,CAAC,MAA+B;AAAA,IACtC,OAAO,KAAK,SAAS,gBAAgB,IAAI;AAAA;AAAA,EAG1C,KAAK,CAAC,MAA2B;AAAA,IAChC,OAAO,KAAK,SAAS,cAAc,IAAI;AAAA;AAAA,EAGxC,SAAS,CAAC,MAAmC;AAAA,IAC5C,OAAO,KAAK,SAAS,kBAAkB,IAAI;AAAA;AAAA,EAG5C,OAAO,CAAC,MAA+B;AAAA,IACtC,OAAO,KAAK,SAAS,gBAAgB,IAAI;AAAA;AAAA,EAK1C,UAAU,CAAC,MAAuB;AAAA,IACjC,OAAO,KAAK,SAAS,WAAW,IAAI;AAAA;AAAA,EAOrC,kBAAkB,CAAC,MAAc,MAA0B,YAA2C;AAAA,IACrG,IAAI;AAAA,MACH,OAAO,KAAK,SAAS,WAAW,IAAI;AAAA,MACnC,MAAM;AAAA,MACP,OAAO,KAAK,SAAS,gBAAgB,EAAE,MAAM,MAAM,WAAW,CAAC;AAAA;AAAA;AAAA,EAQjE,oBAAoB,CAAC,MAAc,MAA0B,YAAkC,SAA0C;AAAA,IACxI,IAAI;AAAA,MACH,OAAO,KAAK,SAAS,aAAa,IAAI;AAAA,MACrC,MAAM;AAAA,MACP,OAAO,KAAK,SAAS,kBAAkB,EAAE,MAAM,MAAM,YAAY,QAAQ,CAAC;AAAA;AAAA;AAAA,EAI5E,QAAQ,CAAC,MAAqB;AAAA,IAC7B,OAAO,KAAK,SAAS,SAAS,IAAI;AAAA;AAAA,EAGnC,YAAY,CAAC,MAAyB;AAAA,IACrC,OAAO,KAAK,SAAS,aAAa,IAAI;AAAA;AAAA,EAGvC,UAAU,CAAC,MAAuB;AAAA,IACjC,OAAO,KAAK,SAAS,WAAW,IAAI;AAAA;AAAA,EAKrC,MAAM,CAAC,SAA2B,cAAgC;AAAA,IACjE,OAAO,KAAK,SAAS,OAAO,MAAM;AAAA;AAAA,MAI/B,IAAI,GAAW;AAAA,IAClB,OAAO,KAAK,SAAS;AAAA;AAEvB;;ACnGA;AADA;AAIO,SAAS,MAAM,CAAC,UAAyB,CAAC,GAAmB;AAAA,EACnE,OAAO,CAAC,WAAmB;AAAA,IAC1B,QAAQ,eAAe,aAAa,QAAQ,SAAS,MAAM;AAAA;AAAA;AAKtD,SAAS,gBAAgB,CAAC,QAAkC;AAAA,EAClE,OAAO,QAAQ,YAAY,aAAa,QAAQ,MAAM,KAAK,CAAC;AAAA;;;ACftD,MAAM,kBAAkB;AAAA,SACd,OAAO;AAAA,SAQhB,OAAO,CAAC,SAAyB;AAAA,IACvC,OAAO,CAAC,MAAe;AAAA,MACtB,MAAM,SAAS,EAAE,IAAI,OAAO,QAAQ,KAAK;AAAA,MACzC,MAAM,SAAS,OAAO,SAAS,8BAA8B,IAAI,gBAAgB;AAAA,MACjF,QAAQ,aAAa,SAAS,QAAQ,OAAO,MAAM;AAAA,MACnD,OAAO,EAAE,KAAK,MAAM,KAAK;AAAA,QACxB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MAClB,CAAC;AAAA;AAAA;AAAA,SAKI,KAAK,CAAC,KAAiE,SAAyB,OAAe,kBAAkB,MAAY;AAAA,IACnJ,IAAI,IAAI,MAAM,kBAAkB,QAAQ,OAAO,CAAC;AAAA;AAElD;;;ACJO,MAAM,cAAc;AAAA,SACnB,OAAO,CAAC,SAAwB,CAAC,GAAG;AAAA,IAC1C,MAAM,aAAsC;AAAA,MAC3C,gBAAgB,OAAO,kBAAkB,CAAC;AAAA,MAC1C,oBAAoB,OAAO,sBAAsB,CAAC;AAAA,MAClD,MAAM,OAAO,QAAQ;AAAA,MACrB,sBAAsB,OAAO,wBAAwB;AAAA,MACrD,iBAAiB,OAAO,mBAAmB;AAAA,MAC3C,cAAc,OAAO,gBAAgB,CAAC;AAAA,IACvC;AAAA;AAAA,IAUA,MAAM,wBAAwB;AAAA,MACT;AAAA,MAApB,WAAW,CAAS,MAAsB,IAAI,gBAAkB;AAAA,QAA5C;AAAA,QACnB,IAAI,OAAO,KAAK,WAAW,YAAY,EAAE,SAAS,GAAG;AAAA,UACpD,IAAI,SAAS,gBAAgB,WAAW,YAAY;AAAA,QACrD;AAAA,QACA,IAAI,WAAW,sBAAsB;AAAA,UACpC,uBAAuB,GAAG;AAAA,QAC3B;AAAA;AAAA,iBAGU,IAAI,GAAW;AAAA,QACzB,OAAO,WAAW;AAAA;AAAA,iBAGR,OAAO,GAAmB;AAAA,QACpC,OAAO,IAAI;AAAA;AAAA,iBAGD,cAAc,GAAW;AAAA,QACnC,OAAO,WAAW;AAAA;AAAA,IAEpB;AAAA,IArBM,0BAAN;AAAA,MARC,OAAO;AAAA,QACP,WAAW;AAAA,UACV;AAAA,UACA,EAAE,SAAS,uBAAuB,aAAa,eAAe;AAAA,UAC9D,EAAE,SAAS,kBAAkB,UAAU,WAAW;AAAA,QACnD;AAAA,QACA,SAAS,CAAC,gBAAgB,uBAAuB,gBAAgB;AAAA,MAClE,CAAC;AAAA,MACD;AAAA;AAAA;AAAA,OAAM;AAAA,IAsBN,OAAO,eAAe,yBAAyB,QAAQ;AAAA,MACtD,OAAO;AAAA,IACR,CAAC;AAAA,IAGA,wBAAkG,QAAQ,CAC1G,KACA,YACI;AAAA,MACJ,kBAAkB,MACjB,KACA,SACA,WAAW,IACZ;AAAA;AAAA,IAGD,OAAO;AAAA;AAOT;AAhEa,gBAAN;AAAA,EAPN,OAAO;AAAA,IACP,WAAW;AAAA,MACV;AAAA,MACA,EAAE,SAAS,uBAAuB,aAAa,eAAe;AAAA,IAC/D;AAAA,IACA,SAAS,CAAC,gBAAgB,qBAAqB;AAAA,EAChD,CAAC;AAAA,GACY;AAsEb,SAAS,sBAAsB,CAAC,SAA+B;AAAA,EAE9D,MAAM,mBAAmB,QAAQ,MAAM;AAAA,IACtC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,SAAS,MAAM;AAAA,MACd,iBAAiB,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA;AAAA,EAEpD,CAAC;AAAA,EAED,MAAM,wBAAwB,QAAQ,MAAM;AAAA,IAC3C,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,SAAS,MAAM;AAAA,MACd,MAAM,MAAM,QAAQ,YAAY;AAAA,MAChC,sBAAsB,IAAI,IAAI,GAAG;AAAA;AAAA,EAEnC,CAAC;AAAA,EAED,MAAM,kBAAkB,QAAQ,MAAM;AAAA,IACrC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,SAAS,MAAM;AAAA,MACd,MAAM,MAAM,QAAQ,YAAY;AAAA,MAChC,gBAAgB,IAAI,IAAI,QAAQ;AAAA;AAAA,EAElC,CAAC;AAAA,EAED,MAAM,mBAAmB,QAAQ,MAAM;AAAA,IACtC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,SAAS,MAAM;AAAA,MACd,MAAM,MAAM,QAAQ,YAAY;AAAA,MAChC,iBAAiB,IAAI,IAAI,SAAS;AAAA;AAAA,EAEpC,CAAC;AAAA,EAED,MAAM,wBAAwB,QAAQ,MAAM;AAAA,IAC3C,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,SAAS,MAAM;AAAA,MACd,MAAM,MAAM,QAAQ,YAAY;AAAA,MAChC,sBAAsB,IAAI,IAAI,QAAQ;AAAA;AAAA,EAExC,CAAC;AAAA,EAED,MAAM,iBAAiB,QAAQ,MAAM;AAAA,IACpC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,SAAS,MAAM;AAAA,MACd,MAAM,MAAM,QAAQ,SAAS;AAAA,MAC7B,eAAe,IAAI,IAAI,OAAO,GAAS;AAAA;AAAA,EAEzC,CAAC;AAAA,EAED,MAAM,mBAAmB,QAAQ,MAAM;AAAA,IACtC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,SAAS,MAAM;AAAA,MACd,MAAM,MAAM,QAAQ,SAAS;AAAA,MAC7B,iBAAiB,IAAI,IAAI,SAAS,GAAS;AAAA;AAAA,EAE7C,CAAC;AAAA,EAED,MAAM,eAAe,QAAQ,MAAM;AAAA,IAClC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,SAAS,MAAM;AAAA,MAEd,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAAA,MACpC,aAAa,MAAM;AAAA,QAClB,MAAM,QAAQ,OAAO,QAAQ,OAAO,OAAO,IAAI,KAAK;AAAA,QACpD,aAAa,IAAI,QAAQ,GAAG;AAAA,OAC5B;AAAA;AAAA,EAEH,CAAC;AAAA,EAED,MAAM,uBAAuB,QAAQ,MAAM;AAAA,IAC1C,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,SAAS,MAAM;AAAA,MAEd,MAAM,UAAW,QAAgB,oBAAoB,KAAK,CAAC;AAAA,MAC3D,qBAAqB,IAAI,QAAQ,MAAM;AAAA;AAAA,EAEzC,CAAC;AAAA,EAED,MAAM,wBAAwB,QAAQ,MAAM;AAAA,IAC3C,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,SAAS,MAAM;AAAA,MAEd,MAAM,OAAQ,QAAgB,qBAAqB,KAAK,CAAC;AAAA,MACzD,sBAAsB,IAAI,KAAK,MAAM;AAAA;AAAA,EAEvC,CAAC;AAAA;;ACtLK,SAAS,OAAO,CAAC,YAAoB,UAA0B,CAAC,GAAG;AAAA,EACzE,OAAO,QAAS,CAAC,SAAiB,cAA+B,YAAgC;AAAA,IAChG,MAAM,WAAW,WAAW;AAAA,IAC5B,IAAI,OAAO,aAAa,YAAY;AAAA,MACnC,MAAM,IAAI,MAAM,kDAAkD,OAAO,UAAU;AAAA,IACpF;AAAA,IAEA,MAAM,UAAW,SAAiB,aAAa,SAAS;AAAA,IAExD,IAAI,SAAS;AAAA,MACZ,WAAW,QAAQ,eAAe,OAAO,IAAmB,MAAiB;AAAA,QAC5E,MAAM,MAAM,kBAAkB;AAAA,QAC9B,IAAI,KAAK;AAAA,UACR,MAAM,SAAS,QAAQ,SAAS;AAAA,UAChC,IAAI,mBACH,YACA,WACA,SAAS,OAAO,KAAK,MAAM,IAAI,SAChC,EAAE,IAAI,MAAM;AAAA,QACb;AAAA,QACA,OAAO,SAAS,MAAM,MAAM,IAAI;AAAA;AAAA,IAElC,EAAO;AAAA,MACN,WAAW,QAAQ,SAAS,OAAO,IAAmB,MAAiB;AAAA,QACtE,MAAM,MAAM,kBAAkB;AAAA,QAC9B,IAAI,KAAK;AAAA,UACR,MAAM,SAAS,QAAQ,SAAS;AAAA,UAChC,IAAI,mBACH,YACA,WACA,SAAS,OAAO,KAAK,MAAM,IAAI,SAChC,EAAE,IAAI,MAAM;AAAA,QACb;AAAA,QACA,OAAO,SAAS,MAAM,MAAM,IAAI;AAAA;AAAA;AAAA,IAGlC,OAAO;AAAA;AAAA;;ACrCF,SAAS,KAAK,CAAC,YAAoB,UAAwB,CAAC,GAAG;AAAA,EACrE,OAAO,QAAS,CAAC,SAAiB,cAA+B,YAAgC;AAAA,IAChG,MAAM,WAAW,WAAW;AAAA,IAC5B,IAAI,OAAO,aAAa,YAAY;AAAA,MACnC,MAAM,IAAI,MAAM,gDAAgD,OAAO,UAAU;AAAA,IAClF;AAAA,IAEA,MAAM,UAAW,SAAiB,aAAa,SAAS;AAAA,IAExD,IAAI,SAAS;AAAA,MACZ,WAAW,QAAQ,eAAe,OAAO,IAAmB,MAAiB;AAAA,QAC5E,MAAM,MAAM,kBAAkB;AAAA,QAC9B,MAAM,QAAQ,YAAY,IAAI;AAAA,QAC9B,IAAI;AAAA,UACH,OAAO,MAAM,SAAS,MAAM,MAAM,IAAI;AAAA,kBACrC;AAAA,UACD,IAAI,KAAK;AAAA,YACR,MAAM,YAAY,YAAY,IAAI,IAAI;AAAA,YACtC,MAAM,SAAS,QAAQ,SAAS;AAAA,YAChC,IAAI,qBACH,YACA,WACA,SAAS,OAAO,KAAK,MAAM,IAAI,WAC/B,QAAQ,OACT,EAAE,QAAQ,YAAY,MAAM,MAAM;AAAA,UACnC;AAAA;AAAA;AAAA,IAGH,EAAO;AAAA,MACN,WAAW,QAAQ,SAAS,OAAO,IAAmB,MAAiB;AAAA,QACtE,MAAM,MAAM,kBAAkB;AAAA,QAC9B,MAAM,QAAQ,YAAY,IAAI;AAAA,QAC9B,IAAI;AAAA,UACH,OAAO,SAAS,MAAM,MAAM,IAAI;AAAA,kBAC/B;AAAA,UACD,IAAI,KAAK;AAAA,YACR,MAAM,YAAY,YAAY,IAAI,IAAI;AAAA,YACtC,MAAM,SAAS,QAAQ,SAAS;AAAA,YAChC,IAAI,qBACH,YACA,WACA,SAAS,OAAO,KAAK,MAAM,IAAI,WAC/B,QAAQ,OACT,EAAE,QAAQ,YAAY,MAAM,MAAM;AAAA,UACnC;AAAA;AAAA;AAAA;AAAA,IAIH,OAAO;AAAA;AAAA;",
19
+ "debugId": "96828E90AF3AE4CC64756E2164756E21",
20
+ "names": []
21
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `MetricsModule` — wires up the metrics service into the DI
3
+ * container, registers default Node.js process metrics, and mounts
4
+ * the `GET /metrics` controller.
5
+ *
6
+ * Usage:
7
+ * @Module({
8
+ * imports: [
9
+ * MetricsModule.forRoot({
10
+ * enableDefaultMetrics: true,
11
+ * path: "/metrics",
12
+ * globalLabels: { service: "my-app" },
13
+ * }),
14
+ * ],
15
+ * })
16
+ * class AppModule {}
17
+ *
18
+ * Without `forRoot()`, `MetricsService` is still available (it's
19
+ * a no-op-friendly singleton), but no metrics are pre-registered
20
+ * and the controller is not mounted. Apps can register their own
21
+ * metrics and mount the controller manually.
22
+ */
23
+ import { MetricsService } from "./service.js";
24
+ import type { MetricsConfig } from "./types.js";
25
+ export declare class MetricsModule {
26
+ static forRoot(config?: MetricsConfig): typeof MetricsModule & {
27
+ mount: (app: unknown, service: MetricsService) => void;
28
+ path: string;
29
+ controllerPath: string;
30
+ service: MetricsService;
31
+ };
32
+ }
33
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/metrics/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,cAAc,EAAyB,MAAM,cAAc,CAAC;AAErE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qBAOa,aAAa;IACzB,MAAM,CAAC,OAAO,CAAC,MAAM,GAAE,aAAkB,GAwDK,OAAO,aAAa,GAAG;QACnE,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;QACvD,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,cAAc,CAAC;KACxB;CAEF"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * `MetricsRegistry` — collection of all metrics registered in the app.
3
+ *
4
+ * The registry is the source of truth for `MetricsService`. It:
5
+ * - Holds every metric (counter / gauge / histogram / summary) by name.
6
+ * - Serializes them to the Prometheus text exposition format.
7
+ * - Supports content negotiation (OpenMetrics vs. Prometheus).
8
+ *
9
+ * Each metric is stored as a unified `RegisteredMetric` so the
10
+ * registry can iterate and call `renderPrometheus()` on each.
11
+ */
12
+ import type { Counter, CounterOptions, ExpositionFormat, ExpositionResult, Gauge, GaugeOptions, Histogram, HistogramOptions, Summary, SummaryOptions } from "./types.js";
13
+ interface RegisteredMetric {
14
+ name: string;
15
+ type: "counter" | "gauge" | "histogram" | "summary";
16
+ impl: {
17
+ renderPrometheus(): string;
18
+ reset(): void;
19
+ };
20
+ }
21
+ export declare class MetricsRegistry {
22
+ private metrics;
23
+ private globalLabels;
24
+ /** Add a global label that's prepended to every metric line. */
25
+ setGlobalLabels(labels: Record<string, string>): void;
26
+ getGlobalLabels(): Record<string, string>;
27
+ /** Register a counter; returns the same instance for chaining. */
28
+ registerCounter(opts: CounterOptions): Counter;
29
+ registerGauge(opts: GaugeOptions): Gauge;
30
+ registerHistogram(opts: HistogramOptions): Histogram;
31
+ registerSummary(opts: SummaryOptions): Summary;
32
+ /** Return a metric by name, regardless of type. */
33
+ get(name: string): RegisteredMetric | undefined;
34
+ /** Return a counter by name. Throws if it isn't a counter. */
35
+ getCounter(name: string): Counter;
36
+ /** Return a gauge by name. */
37
+ getGauge(name: string): Gauge;
38
+ /** Return a histogram by name. */
39
+ getHistogram(name: string): Histogram;
40
+ /** Return a summary by name. */
41
+ getSummary(name: string): Summary;
42
+ /** Number of registered metrics. */
43
+ get size(): number;
44
+ /** Names of all registered metrics, sorted. */
45
+ names(): string[];
46
+ /** Reset all metrics (clear values). */
47
+ resetAll(): void;
48
+ /** Serialize all metrics to the requested exposition format. */
49
+ expose(format?: ExpositionFormat): ExpositionResult;
50
+ }
51
+ export {};
52
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/metrics/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EACX,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,MAAM,YAAY,CAAC;AAEpB,UAAU,gBAAgB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IACpD,IAAI,EAAE;QAAE,gBAAgB,IAAI,MAAM,CAAC;QAAC,KAAK,IAAI,IAAI,CAAA;KAAE,CAAC;CACpD;AAED,qBAAa,eAAe;IAC3B,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,YAAY,CAA8B;IAElD,gEAAgE;IAChE,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAIrD,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIzC,kEAAkE;IAClE,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAS9C,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,KAAK;IASxC,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS;IASpD,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAS9C,mDAAmD;IACnD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI/C,8DAA8D;IAC9D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAOjC,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;IAO7B,kCAAkC;IAClC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAOrC,gCAAgC;IAChC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAOjC,oCAAoC;IACpC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,+CAA+C;IAC/C,KAAK,IAAI,MAAM,EAAE;IAIjB,wCAAwC;IACxC,QAAQ,IAAI,IAAI;IAMhB,gEAAgE;IAChE,MAAM,CAAC,MAAM,GAAE,gBAA+B,GAAG,gBAAgB;CAoBjE"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * `MetricsService` — DI-friendly facade over `MetricsRegistry`.
3
+ *
4
+ * The service is always available; you can call `counter()`,
5
+ * `gauge()`, `histogram()`, `summary()` at any time. Registered
6
+ * metrics live for the lifetime of the application.
7
+ *
8
+ * Default Node.js process metrics are registered when
9
+ * `MetricsModule.forRoot({ enableDefaultMetrics: true })` is
10
+ * called. Without `forRoot()`, the service is fully functional
11
+ * but no default metrics are registered.
12
+ */
13
+ import { MetricsRegistry } from "./registry.js";
14
+ import type { Counter, CounterOptions, ExpositionFormat, ExpositionResult, Gauge, GaugeOptions, Histogram, HistogramOptions, Summary, SummaryOptions } from "./types.js";
15
+ export declare const METRICS_SERVICE_TOKEN: unique symbol;
16
+ export declare function setMetricsService(service: MetricsService): void;
17
+ export declare function getMetricsService(): MetricsService | undefined;
18
+ export declare class MetricsService {
19
+ readonly registry: MetricsRegistry;
20
+ counter(opts: CounterOptions): Counter;
21
+ gauge(opts: GaugeOptions): Gauge;
22
+ histogram(opts: HistogramOptions): Histogram;
23
+ summary(opts: SummaryOptions): Summary;
24
+ getCounter(name: string): Counter;
25
+ /**
26
+ * Get an existing counter or create a new one with the given
27
+ * label names. Used by the `@Counted()` decorator.
28
+ */
29
+ getOrCreateCounter(name: string, help: string | undefined, labelNames: string[] | undefined): Counter;
30
+ /**
31
+ * Get an existing histogram or create a new one. Used by the
32
+ * `@Timed()` decorator.
33
+ */
34
+ getOrCreateHistogram(name: string, help: string | undefined, labelNames: string[] | undefined, buckets: number[] | undefined): Histogram;
35
+ getGauge(name: string): Gauge;
36
+ getHistogram(name: string): Histogram;
37
+ getSummary(name: string): Summary;
38
+ expose(format?: ExpositionFormat): ExpositionResult;
39
+ /** Number of registered metrics. */
40
+ get size(): number;
41
+ }
42
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/metrics/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EACX,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,qBAAqB,eAAqC,CAAC;AASxE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAE/D;AAED,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D;AAED,qBAAa,cAAc;IAC1B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAyB;IAI3D,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAItC,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,KAAK;IAIhC,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS;IAI5C,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAMtC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;;OAGG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO;IAQrG;;;OAGG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS;IAQxI,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;IAI7B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAIrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAMjC,MAAM,CAAC,MAAM,GAAE,gBAA+B,GAAG,gBAAgB;IAIjE,oCAAoC;IACpC,IAAI,IAAI,IAAI,MAAM,CAEjB;CACD"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * `Summary` — quantile estimation over a sliding window of values.
3
+ *
4
+ * Summary is similar to Histogram but computes client-side quantiles
5
+ * (via t-digest-style sorting). It's useful when you need a small
6
+ * number of percentiles (50/90/99) without the storage cost of
7
+ * histograms.
8
+ *
9
+ * Quantile computation uses a simple sorted-window approach: each
10
+ * label combination keeps a circular buffer of the last N values.
11
+ *
12
+ * Example:
13
+ * const s = new Summary({
14
+ * name: "http_request_size_bytes",
15
+ * percentiles: [0.5, 0.9, 0.99],
16
+ * });
17
+ * s.observe(1024);
18
+ */
19
+ import type { SummaryOptions, Summary as ISummary, MetricSample } from "./types.js";
20
+ /** Default percentiles. */
21
+ export declare const DEFAULT_PERCENTILES: number[];
22
+ /** Default sliding window size. */
23
+ export declare const DEFAULT_MAX_AGE_SECONDS = 600;
24
+ export declare const DEFAULT_AGE_BUCKETS = 5;
25
+ export declare class SummaryImpl implements ISummary {
26
+ readonly name: string;
27
+ readonly help?: string;
28
+ readonly labelNames: string[];
29
+ private readonly percentiles;
30
+ private readonly maxAgeSeconds;
31
+ private readonly ageBuckets;
32
+ private readonly bucketSize;
33
+ /** Map from "label1=v1,label2=v2" -> state. */
34
+ private states;
35
+ constructor(opts: SummaryOptions);
36
+ observe(value: number, labels?: Record<string, string>): void;
37
+ time<T>(fn: () => Promise<T> | T, labels?: Record<string, string>): Promise<T>;
38
+ reset(): void;
39
+ getSamples(): MetricSample[];
40
+ /** Render this summary in Prometheus exposition format. */
41
+ renderPrometheus(): string;
42
+ private newState;
43
+ private maybeRotate;
44
+ private totals;
45
+ private quantile;
46
+ private assertLabels;
47
+ private key;
48
+ private parseKey;
49
+ }
50
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/metrics/summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,IAAI,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGpF,2BAA2B;AAC3B,eAAO,MAAM,mBAAmB,UAAmB,CAAC;AACpD,mCAAmC;AACnC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAWrC,qBAAa,WAAY,YAAW,QAAQ;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAW;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,+CAA+C;IAC/C,OAAO,CAAC,MAAM,CAAmC;gBAErC,IAAI,EAAE,cAAc;IAUhC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAevD,IAAI,CAAC,CAAC,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACxB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC;IAUb,KAAK,IAAI,IAAI;IAIb,UAAU,IAAI,YAAY,EAAE;IAQ5B,2DAA2D;IAC3D,gBAAgB,IAAI,MAAM;IA+B1B,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,QAAQ;CAShB"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Public types for `nexusjs/metrics`.
3
+ *
4
+ * `nexusjs/metrics` is a Prometheus-compatible metrics collection
5
+ * library. It implements the four standard metric types (counter,
6
+ * gauge, histogram, summary), label support, and the Prometheus /
7
+ * OpenMetrics text exposition formats.
8
+ *
9
+ * No external dependencies. ~5kb gzipped.
10
+ */
11
+ /** A single sample recorded against a metric. */
12
+ export interface MetricSample {
13
+ /** Optional label values. The keys must match the metric's `labelNames`. */
14
+ labels?: Record<string, string>;
15
+ /** Numeric value. */
16
+ value: number;
17
+ /** Optional timestamp (epoch ms). */
18
+ timestamp?: number;
19
+ }
20
+ export interface CounterOptions {
21
+ /** Human-readable metric name (e.g. "http_requests_total"). */
22
+ name: string;
23
+ /** Help text shown in /metrics. */
24
+ help?: string;
25
+ /** Label names (dimensions). Order is significant. */
26
+ labelNames?: string[];
27
+ }
28
+ export interface Counter {
29
+ /** Read-only metric name. */
30
+ readonly name: string;
31
+ /** Increment by 1. */
32
+ inc(labels?: Record<string, string>): void;
33
+ /** Increment by `n` (must be >= 0). */
34
+ incBy(n: number, labels?: Record<string, string>): void;
35
+ /** Reset to 0. */
36
+ reset(): void;
37
+ /** Return all samples. */
38
+ getSamples(): MetricSample[];
39
+ }
40
+ export interface GaugeOptions {
41
+ name: string;
42
+ help?: string;
43
+ labelNames?: string[];
44
+ /** Optional collect() callback for time-varying values. */
45
+ collect?: () => void;
46
+ }
47
+ export interface Gauge {
48
+ readonly name: string;
49
+ /** Set the value. */
50
+ set(value: number, labels?: Record<string, string>): void;
51
+ /** Increment by `n` (can be negative). */
52
+ inc(n?: number, labels?: Record<string, string>): void;
53
+ /** Decrement by `n` (defaults to 1). */
54
+ dec(n?: number, labels?: Record<string, string>): void;
55
+ /** Set the value to current unix epoch seconds. */
56
+ setToCurrentTime(labels?: Record<string, string>): void;
57
+ reset(): void;
58
+ getSamples(): MetricSample[];
59
+ }
60
+ export interface HistogramOptions {
61
+ name: string;
62
+ help?: string;
63
+ labelNames?: string[];
64
+ /** Bucket upper bounds. Default: Prometheus default. */
65
+ buckets?: number[];
66
+ }
67
+ export interface Histogram {
68
+ readonly name: string;
69
+ /** Observe a value. */
70
+ observe(value: number, labels?: Record<string, string>): void;
71
+ /** Time an async function and observe its duration in seconds. */
72
+ time<T>(fn: (start: number) => Promise<T> | T, labels?: Record<string, string>): Promise<T>;
73
+ reset(): void;
74
+ getSamples(): MetricSample[];
75
+ }
76
+ export interface SummaryOptions {
77
+ name: string;
78
+ help?: string;
79
+ labelNames?: string[];
80
+ /** Percentiles to compute. Default: [0.5, 0.9, 0.99]. */
81
+ percentiles?: number[];
82
+ /** Max number of samples to keep per label combination. Default: 100. */
83
+ maxAgeSeconds?: number;
84
+ /** Number of buckets for sliding window. Default: 5. */
85
+ ageBuckets?: number;
86
+ }
87
+ export interface Summary {
88
+ readonly name: string;
89
+ observe(value: number, labels?: Record<string, string>): void;
90
+ time<T>(fn: () => Promise<T> | T, labels?: Record<string, string>): Promise<T>;
91
+ reset(): void;
92
+ getSamples(): MetricSample[];
93
+ }
94
+ export interface MetricsConfig {
95
+ /** Default histogram buckets. Default: Prometheus default. */
96
+ defaultBuckets?: number[];
97
+ /** Default summary percentiles. Default: [0.5, 0.9, 0.99]. */
98
+ defaultPercentiles?: number[];
99
+ /** Mount path for the /metrics endpoint. Default: "/metrics". */
100
+ path?: string;
101
+ /** Whether to collect default Node.js process metrics. Default: true. */
102
+ enableDefaultMetrics?: boolean;
103
+ /** Whether to auto-mount the controller. Default: true. */
104
+ mountController?: boolean;
105
+ /** Custom labels added to every metric. */
106
+ globalLabels?: Record<string, string>;
107
+ }
108
+ export type ExpositionFormat = "prometheus" | "openmetrics";
109
+ export interface ExpositionResult {
110
+ /** Content type for the HTTP response. */
111
+ contentType: string;
112
+ /** Body. */
113
+ body: string;
114
+ }
115
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metrics/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `@ApiBody({ description, required, schema })` — document the request
3
+ * body. Auto-derivation from `@Validate({ body })` runs first; explicit
4
+ * `@ApiBody` decorators take precedence.
5
+ */
6
+ import "reflect-metadata";
7
+ import { type ApiBodyOptions } from "../types.js";
8
+ export declare function ApiBody(options: ApiBodyOptions): MethodDecorator;
9
+ //# sourceMappingURL=body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../../src/openapi/decorators/body.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe,CAIhE"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Decorator barrel.
3
+ */
4
+ export { ApiTags } from "./tags.js";
5
+ export { ApiOperation } from "./operation.js";
6
+ export { ApiResponse } from "./response.js";
7
+ export { ApiParam, ApiQuery } from "./param.js";
8
+ export { ApiBody } from "./body.js";
9
+ export { ApiProperty, ApiSchema } from "./property.js";
10
+ export { ApiSecurity, ApiExclude } from "./security.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/openapi/decorators/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `@ApiOperation({ summary, description, operationId, tags, deprecated })`
3
+ *
4
+ * Decorate a controller method to describe the operation in the spec.
5
+ */
6
+ import "reflect-metadata";
7
+ import { type ApiOperationOptions } from "../types.js";
8
+ export declare function ApiOperation(options: ApiOperationOptions): MethodDecorator;
9
+ //# sourceMappingURL=operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../../src/openapi/decorators/operation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAErE,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,eAAe,CAI1E"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `@ApiParam({ name, description, required, schema })` — document a
3
+ * path parameter. The decorator is optional — the spec builder
4
+ * auto-derives path params from the route pattern (`/users/:id` → `id`).
5
+ * Use this when you want to override the schema or add a description.
6
+ */
7
+ import "reflect-metadata";
8
+ import { type ApiParamOptions } from "../types.js";
9
+ export declare function ApiParam(options: ApiParamOptions): MethodDecorator;
10
+ /**
11
+ * `@ApiQuery({ name: 'q', description: '...', schema: z.string() })`
12
+ *
13
+ * Document a query parameter. Auto-derivation from `@Validate({ query })`
14
+ * runs first; explicit `@ApiQuery` decorators take precedence.
15
+ */
16
+ export declare function ApiQuery(options: ApiParamOptions): MethodDecorator;
17
+ //# sourceMappingURL=param.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param.d.ts","sourceRoot":"","sources":["../../../src/openapi/decorators/param.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,CAOlE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,CAOlE"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `@ApiProperty({ description, required, schema, example })` — document
3
+ * a property on a request / response DTO.
4
+ *
5
+ * ```ts
6
+ * class UserDto {
7
+ * @ApiProperty({ description: 'Unique user id', example: 42 })
8
+ * id!: number;
9
+ *
10
+ * @ApiProperty({ description: 'Email address', required: true })
11
+ * email!: string;
12
+ * }
13
+ * ```
14
+ *
15
+ * The `schema` field accepts either a Zod schema or a pre-computed
16
+ * `JSONSchema`. Without a `schema`, the type is inferred from the
17
+ * TypeScript reflection of the property's design:type metadata.
18
+ */
19
+ import "reflect-metadata";
20
+ import { type ApiPropertyOptions } from "../types.js";
21
+ export declare function ApiProperty(options?: ApiPropertyOptions): PropertyDecorator;
22
+ /** Class-level: mark a DTO class so its properties can be lifted into a schema. */
23
+ export declare function ApiSchema(name: string): ClassDecorator;
24
+ //# sourceMappingURL=property.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property.d.ts","sourceRoot":"","sources":["../../../src/openapi/decorators/property.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEpE,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CAO/E;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAItD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `@ApiResponse(200, { description: 'OK', schema: UserSchema })`
3
+ *
4
+ * Decorate a controller method to describe one of its responses.
5
+ * Multiple `@ApiResponse` calls accumulate.
6
+ */
7
+ import "reflect-metadata";
8
+ import { type ApiResponseOptions } from "../types.js";
9
+ export declare function ApiResponse(status: number | string, options: ApiResponseOptions): MethodDecorator;
10
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/openapi/decorators/response.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEpE,wBAAgB,WAAW,CAC1B,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,OAAO,EAAE,kBAAkB,GACzB,eAAe,CAOjB"}