alepha 0.22.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (869) hide show
  1. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  2. package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
  3. package/dist/api/audits/index.browser.js +49 -52
  4. package/dist/api/audits/index.browser.js.map +1 -1
  5. package/dist/api/audits/index.d.ts +629 -565
  6. package/dist/api/audits/index.d.ts.map +1 -1
  7. package/dist/api/audits/index.js +206 -98
  8. package/dist/api/audits/index.js.map +1 -1
  9. package/dist/api/files/index.browser.js +44 -44
  10. package/dist/api/files/index.browser.js.map +1 -1
  11. package/dist/api/files/index.d.ts +292 -293
  12. package/dist/api/files/index.d.ts.map +1 -1
  13. package/dist/api/files/index.js +61 -64
  14. package/dist/api/files/index.js.map +1 -1
  15. package/dist/api/jobs/index.browser.js +61 -59
  16. package/dist/api/jobs/index.browser.js.map +1 -1
  17. package/dist/api/jobs/index.d.ts +546 -347
  18. package/dist/api/jobs/index.d.ts.map +1 -1
  19. package/dist/api/jobs/index.js +165 -86
  20. package/dist/api/jobs/index.js.map +1 -1
  21. package/dist/api/keys/index.d.ts +242 -230
  22. package/dist/api/keys/index.d.ts.map +1 -1
  23. package/dist/api/keys/index.js +63 -66
  24. package/dist/api/keys/index.js.map +1 -1
  25. package/dist/api/notifications/index.browser.js +40 -38
  26. package/dist/api/notifications/index.browser.js.map +1 -1
  27. package/dist/api/notifications/index.d.ts +339 -209
  28. package/dist/api/notifications/index.d.ts.map +1 -1
  29. package/dist/api/notifications/index.js +108 -60
  30. package/dist/api/notifications/index.js.map +1 -1
  31. package/dist/api/oauth/index.d.ts +190 -78
  32. package/dist/api/oauth/index.d.ts.map +1 -1
  33. package/dist/api/oauth/index.js +290 -68
  34. package/dist/api/oauth/index.js.map +1 -1
  35. package/dist/api/organizations/index.browser.js +14 -14
  36. package/dist/api/organizations/index.browser.js.map +1 -1
  37. package/dist/api/organizations/index.d.ts +158 -134
  38. package/dist/api/organizations/index.d.ts.map +1 -1
  39. package/dist/api/organizations/index.js +18 -18
  40. package/dist/api/organizations/index.js.map +1 -1
  41. package/dist/api/parameters/index.browser.js +74 -53
  42. package/dist/api/parameters/index.browser.js.map +1 -1
  43. package/dist/api/parameters/index.d.ts +607 -513
  44. package/dist/api/parameters/index.d.ts.map +1 -1
  45. package/dist/api/parameters/index.js +205 -127
  46. package/dist/api/parameters/index.js.map +1 -1
  47. package/dist/api/payments/index.d.ts +652 -449
  48. package/dist/api/payments/index.d.ts.map +1 -1
  49. package/dist/api/payments/index.js +159 -93
  50. package/dist/api/payments/index.js.map +1 -1
  51. package/dist/api/subscriptions/index.d.ts +1032 -762
  52. package/dist/api/subscriptions/index.d.ts.map +1 -1
  53. package/dist/api/subscriptions/index.js +166 -185
  54. package/dist/api/subscriptions/index.js.map +1 -1
  55. package/dist/api/users/index.browser.js +48 -71
  56. package/dist/api/users/index.browser.js.map +1 -1
  57. package/dist/api/users/index.d.ts +1297 -1109
  58. package/dist/api/users/index.d.ts.map +1 -1
  59. package/dist/api/users/index.js +454 -369
  60. package/dist/api/users/index.js.map +1 -1
  61. package/dist/api/verifications/index.browser.js +17 -17
  62. package/dist/api/verifications/index.browser.js.map +1 -1
  63. package/dist/api/verifications/index.d.ts +169 -157
  64. package/dist/api/verifications/index.d.ts.map +1 -1
  65. package/dist/api/verifications/index.js +47 -95
  66. package/dist/api/verifications/index.js.map +1 -1
  67. package/dist/background/index.d.ts +0 -1
  68. package/dist/background/index.d.ts.map +1 -1
  69. package/dist/background/index.js.map +1 -1
  70. package/dist/background/index.workerd.js.map +1 -1
  71. package/dist/batch/index.d.ts +0 -1
  72. package/dist/batch/index.d.ts.map +1 -1
  73. package/dist/batch/index.js.map +1 -1
  74. package/dist/bin/index.js +1 -1
  75. package/dist/bin/index.js.map +1 -1
  76. package/dist/bucket/index.d.ts +27 -32
  77. package/dist/bucket/index.d.ts.map +1 -1
  78. package/dist/bucket/index.js +56 -26
  79. package/dist/bucket/index.js.map +1 -1
  80. package/dist/bucket/index.workerd.js +52 -24
  81. package/dist/bucket/index.workerd.js.map +1 -1
  82. package/dist/cache/core/index.d.ts +4 -6
  83. package/dist/cache/core/index.d.ts.map +1 -1
  84. package/dist/cache/core/index.js +4 -10
  85. package/dist/cache/core/index.js.map +1 -1
  86. package/dist/cache/core/index.workerd.js +4 -10
  87. package/dist/cache/core/index.workerd.js.map +1 -1
  88. package/dist/cache/database/index.d.ts +22 -23
  89. package/dist/cache/database/index.d.ts.map +1 -1
  90. package/dist/cache/database/index.js +11 -20
  91. package/dist/cache/database/index.js.map +1 -1
  92. package/dist/cache/redis/index.d.ts +3 -4
  93. package/dist/cache/redis/index.d.ts.map +1 -1
  94. package/dist/cache/redis/index.js +2 -2
  95. package/dist/cache/redis/index.js.map +1 -1
  96. package/dist/captcha/index.d.ts.map +1 -1
  97. package/dist/captcha/index.js +4 -4
  98. package/dist/captcha/index.js.map +1 -1
  99. package/dist/cli/config/index.d.ts +0 -1
  100. package/dist/cli/config/index.d.ts.map +1 -1
  101. package/dist/cli/core/index.d.ts +244 -475
  102. package/dist/cli/core/index.d.ts.map +1 -1
  103. package/dist/cli/core/index.js +308 -383
  104. package/dist/cli/core/index.js.map +1 -1
  105. package/dist/cli/devtools/index.d.ts +3 -9
  106. package/dist/cli/devtools/index.d.ts.map +1 -1
  107. package/dist/cli/devtools/index.js +3 -3
  108. package/dist/cli/devtools/index.js.map +1 -1
  109. package/dist/cli/i18n/index.d.ts +20 -39
  110. package/dist/cli/i18n/index.d.ts.map +1 -1
  111. package/dist/cli/i18n/index.js +51 -17
  112. package/dist/cli/i18n/index.js.map +1 -1
  113. package/dist/cli/platform/index.d.ts +89 -82
  114. package/dist/cli/platform/index.d.ts.map +1 -1
  115. package/dist/cli/platform/index.js +27 -33
  116. package/dist/cli/platform/index.js.map +1 -1
  117. package/dist/cli/platform-lib/index.d.ts +383 -410
  118. package/dist/cli/platform-lib/index.d.ts.map +1 -1
  119. package/dist/cli/platform-lib/index.js +300 -258
  120. package/dist/cli/platform-lib/index.js.map +1 -1
  121. package/dist/cli/vendor/index.d.ts +17 -41
  122. package/dist/cli/vendor/index.d.ts.map +1 -1
  123. package/dist/cli/vendor/index.js +10 -13
  124. package/dist/cli/vendor/index.js.map +1 -1
  125. package/dist/command/index.d.ts +82 -194
  126. package/dist/command/index.d.ts.map +1 -1
  127. package/dist/command/index.js +160 -563
  128. package/dist/command/index.js.map +1 -1
  129. package/dist/core/index.browser.js +845 -859
  130. package/dist/core/index.browser.js.map +1 -1
  131. package/dist/core/index.d.ts +787 -527
  132. package/dist/core/index.d.ts.map +1 -1
  133. package/dist/core/index.js +845 -859
  134. package/dist/core/index.js.map +1 -1
  135. package/dist/core/index.native.js +845 -859
  136. package/dist/core/index.native.js.map +1 -1
  137. package/dist/core/index.workerd.js +845 -859
  138. package/dist/core/index.workerd.js.map +1 -1
  139. package/dist/crypto/index.browser.js +1 -1
  140. package/dist/crypto/index.browser.js.map +1 -1
  141. package/dist/crypto/index.d.ts +3 -4
  142. package/dist/crypto/index.d.ts.map +1 -1
  143. package/dist/crypto/index.js +6 -3
  144. package/dist/crypto/index.js.map +1 -1
  145. package/dist/datetime/index.d.ts +12 -2
  146. package/dist/datetime/index.d.ts.map +1 -1
  147. package/dist/datetime/index.js +6 -1
  148. package/dist/datetime/index.js.map +1 -1
  149. package/dist/email/brevo/index.d.ts +0 -1
  150. package/dist/email/brevo/index.d.ts.map +1 -1
  151. package/dist/email/brevo/index.js +4 -4
  152. package/dist/email/brevo/index.js.map +1 -1
  153. package/dist/email/cloudflare/index.d.ts +0 -1
  154. package/dist/email/cloudflare/index.d.ts.map +1 -1
  155. package/dist/email/cloudflare/index.js +2 -2
  156. package/dist/email/cloudflare/index.js.map +1 -1
  157. package/dist/email/core/index.d.ts +15 -7
  158. package/dist/email/core/index.d.ts.map +1 -1
  159. package/dist/email/core/index.js +14 -5
  160. package/dist/email/core/index.js.map +1 -1
  161. package/dist/email/core/index.workerd.js +5 -1
  162. package/dist/email/core/index.workerd.js.map +1 -1
  163. package/dist/email/smtp/index.d.ts +8 -9
  164. package/dist/email/smtp/index.d.ts.map +1 -1
  165. package/dist/email/smtp/index.js +702 -479
  166. package/dist/email/smtp/index.js.map +1 -1
  167. package/dist/fake/index.d.ts +1580 -1238
  168. package/dist/fake/index.d.ts.map +1 -1
  169. package/dist/fake/index.js +11728 -32131
  170. package/dist/fake/index.js.map +1 -1
  171. package/dist/lock/core/index.d.ts +13 -9
  172. package/dist/lock/core/index.d.ts.map +1 -1
  173. package/dist/lock/core/index.js +5 -5
  174. package/dist/lock/core/index.js.map +1 -1
  175. package/dist/lock/redis/index.d.ts +0 -1
  176. package/dist/lock/redis/index.d.ts.map +1 -1
  177. package/dist/lock/redis/index.js.map +1 -1
  178. package/dist/logger/index.d.ts +81 -69
  179. package/dist/logger/index.d.ts.map +1 -1
  180. package/dist/logger/index.js +123 -56
  181. package/dist/logger/index.js.map +1 -1
  182. package/dist/mcp/index.d.ts +36 -90
  183. package/dist/mcp/index.d.ts.map +1 -1
  184. package/dist/mcp/index.js +65 -70
  185. package/dist/mcp/index.js.map +1 -1
  186. package/dist/orm/core/index.browser.js +54 -40
  187. package/dist/orm/core/index.browser.js.map +1 -1
  188. package/dist/orm/core/index.bun.js +140 -106
  189. package/dist/orm/core/index.bun.js.map +1 -1
  190. package/dist/orm/core/index.d.ts +145 -150
  191. package/dist/orm/core/index.d.ts.map +1 -1
  192. package/dist/orm/core/index.js +144 -109
  193. package/dist/orm/core/index.js.map +1 -1
  194. package/dist/orm/postgres/index.bun.js +64 -54
  195. package/dist/orm/postgres/index.bun.js.map +1 -1
  196. package/dist/orm/postgres/index.d.ts +36 -76
  197. package/dist/orm/postgres/index.d.ts.map +1 -1
  198. package/dist/orm/postgres/index.js +67 -57
  199. package/dist/orm/postgres/index.js.map +1 -1
  200. package/dist/queue/core/index.d.ts +62 -75
  201. package/dist/queue/core/index.d.ts.map +1 -1
  202. package/dist/queue/core/index.js +48 -71
  203. package/dist/queue/core/index.js.map +1 -1
  204. package/dist/queue/core/index.workerd.js +48 -71
  205. package/dist/queue/core/index.workerd.js.map +1 -1
  206. package/dist/queue/redis/index.d.ts +3 -4
  207. package/dist/queue/redis/index.d.ts.map +1 -1
  208. package/dist/queue/redis/index.js +2 -2
  209. package/dist/queue/redis/index.js.map +1 -1
  210. package/dist/react/auth/index.browser.js.map +1 -1
  211. package/dist/react/auth/index.d.ts +7 -4
  212. package/dist/react/auth/index.d.ts.map +1 -1
  213. package/dist/react/auth/index.js.map +1 -1
  214. package/dist/react/core/index.d.ts +87 -5
  215. package/dist/react/core/index.d.ts.map +1 -1
  216. package/dist/react/core/index.js +170 -23
  217. package/dist/react/core/index.js.map +1 -1
  218. package/dist/react/form/index.d.ts +4 -6
  219. package/dist/react/form/index.d.ts.map +1 -1
  220. package/dist/react/form/index.js +107 -71
  221. package/dist/react/form/index.js.map +1 -1
  222. package/dist/react/head/index.browser.js.map +1 -1
  223. package/dist/react/head/index.d.ts +0 -1
  224. package/dist/react/head/index.d.ts.map +1 -1
  225. package/dist/react/head/index.js.map +1 -1
  226. package/dist/react/i18n/index.d.ts +47 -5
  227. package/dist/react/i18n/index.d.ts.map +1 -1
  228. package/dist/react/i18n/index.js +116 -12
  229. package/dist/react/i18n/index.js.map +1 -1
  230. package/dist/react/intro/index.d.ts +1 -4
  231. package/dist/react/intro/index.d.ts.map +1 -1
  232. package/dist/react/intro/index.js.map +1 -1
  233. package/dist/react/router/index.browser.js +188 -29
  234. package/dist/react/router/index.browser.js.map +1 -1
  235. package/dist/react/router/index.d.ts +480 -372
  236. package/dist/react/router/index.d.ts.map +1 -1
  237. package/dist/react/router/index.js +261 -47
  238. package/dist/react/router/index.js.map +1 -1
  239. package/dist/react/sitemap/index.browser.js +35 -0
  240. package/dist/react/sitemap/index.browser.js.map +1 -0
  241. package/dist/react/sitemap/index.d.ts +91 -0
  242. package/dist/react/sitemap/index.d.ts.map +1 -0
  243. package/dist/react/sitemap/index.js +131 -0
  244. package/dist/react/sitemap/index.js.map +1 -0
  245. package/dist/react/testing/index.d.ts +4 -5
  246. package/dist/react/testing/index.d.ts.map +1 -1
  247. package/dist/react/testing/index.js +41 -15
  248. package/dist/react/testing/index.js.map +1 -1
  249. package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
  250. package/dist/react/ui/index.d.ts +35 -34
  251. package/dist/react/ui/index.d.ts.map +1 -1
  252. package/dist/react/ui/index.js +12 -17
  253. package/dist/react/ui/index.js.map +1 -1
  254. package/dist/redis/index.bun.js +5 -5
  255. package/dist/redis/index.bun.js.map +1 -1
  256. package/dist/redis/index.d.ts +6 -7
  257. package/dist/redis/index.d.ts.map +1 -1
  258. package/dist/redis/index.js +6 -6
  259. package/dist/redis/index.js.map +1 -1
  260. package/dist/retry/index.d.ts +0 -1
  261. package/dist/retry/index.d.ts.map +1 -1
  262. package/dist/retry/index.js.map +1 -1
  263. package/dist/router/index.d.ts.map +1 -1
  264. package/dist/router/index.js.map +1 -1
  265. package/dist/scheduler/index.d.ts +4 -12
  266. package/dist/scheduler/index.d.ts.map +1 -1
  267. package/dist/scheduler/index.js +9 -4
  268. package/dist/scheduler/index.js.map +1 -1
  269. package/dist/scheduler/index.workerd.js +9 -4
  270. package/dist/scheduler/index.workerd.js.map +1 -1
  271. package/dist/security/index.browser.js +30 -28
  272. package/dist/security/index.browser.js.map +1 -1
  273. package/dist/security/index.d.ts +113 -44
  274. package/dist/security/index.d.ts.map +1 -1
  275. package/dist/security/index.js +452 -37
  276. package/dist/security/index.js.map +1 -1
  277. package/dist/server/auth/index.browser.js +19 -19
  278. package/dist/server/auth/index.browser.js.map +1 -1
  279. package/dist/server/auth/index.d.ts +215 -187
  280. package/dist/server/auth/index.d.ts.map +1 -1
  281. package/dist/server/auth/index.js +1145 -86
  282. package/dist/server/auth/index.js.map +1 -1
  283. package/dist/server/cookies/index.browser.js +103 -5
  284. package/dist/server/cookies/index.browser.js.map +1 -1
  285. package/dist/server/cookies/index.d.ts +86 -4
  286. package/dist/server/cookies/index.d.ts.map +1 -1
  287. package/dist/server/cookies/index.js +121 -8
  288. package/dist/server/cookies/index.js.map +1 -1
  289. package/dist/server/core/index.browser.js +22 -27
  290. package/dist/server/core/index.browser.js.map +1 -1
  291. package/dist/server/core/index.d.ts +134 -85
  292. package/dist/server/core/index.d.ts.map +1 -1
  293. package/dist/server/core/index.js +130 -118
  294. package/dist/server/core/index.js.map +1 -1
  295. package/dist/server/cors/index.d.ts +9 -10
  296. package/dist/server/cors/index.d.ts.map +1 -1
  297. package/dist/server/cors/index.js +14 -26
  298. package/dist/server/cors/index.js.map +1 -1
  299. package/dist/server/etag/index.d.ts +2 -3
  300. package/dist/server/etag/index.d.ts.map +1 -1
  301. package/dist/server/etag/index.js.map +1 -1
  302. package/dist/server/health/index.d.ts +18 -19
  303. package/dist/server/health/index.d.ts.map +1 -1
  304. package/dist/server/health/index.js +6 -6
  305. package/dist/server/health/index.js.map +1 -1
  306. package/dist/server/links/index.browser.js +15 -18
  307. package/dist/server/links/index.browser.js.map +1 -1
  308. package/dist/server/links/index.d.ts +66 -67
  309. package/dist/server/links/index.d.ts.map +1 -1
  310. package/dist/server/links/index.js +29 -32
  311. package/dist/server/links/index.js.map +1 -1
  312. package/dist/server/metrics/index.d.ts +0 -1
  313. package/dist/server/metrics/index.d.ts.map +1 -1
  314. package/dist/server/metrics/index.js +10 -3
  315. package/dist/server/metrics/index.js.map +1 -1
  316. package/dist/server/proxy/index.d.ts +0 -1
  317. package/dist/server/proxy/index.d.ts.map +1 -1
  318. package/dist/server/proxy/index.js.map +1 -1
  319. package/dist/server/rate-limit/index.d.ts +8 -9
  320. package/dist/server/rate-limit/index.d.ts.map +1 -1
  321. package/dist/server/rate-limit/index.js +6 -12
  322. package/dist/server/rate-limit/index.js.map +1 -1
  323. package/dist/server/static/index.d.ts +0 -1
  324. package/dist/server/static/index.d.ts.map +1 -1
  325. package/dist/server/static/index.js.map +1 -1
  326. package/dist/server/swagger/index.d.ts +4 -4
  327. package/dist/server/swagger/index.d.ts.map +1 -1
  328. package/dist/server/swagger/index.js +37 -25
  329. package/dist/server/swagger/index.js.map +1 -1
  330. package/dist/sms/index.d.ts +0 -1
  331. package/dist/sms/index.d.ts.map +1 -1
  332. package/dist/sms/index.js.map +1 -1
  333. package/dist/system/index.browser.js.map +1 -1
  334. package/dist/system/index.d.ts +0 -1
  335. package/dist/system/index.d.ts.map +1 -1
  336. package/dist/system/index.js +2 -1
  337. package/dist/system/index.js.map +1 -1
  338. package/dist/system/index.workerd.js.map +1 -1
  339. package/dist/topic/core/index.d.ts +19 -20
  340. package/dist/topic/core/index.d.ts.map +1 -1
  341. package/dist/topic/core/index.js +8 -8
  342. package/dist/topic/core/index.js.map +1 -1
  343. package/dist/topic/redis/index.d.ts +3 -4
  344. package/dist/topic/redis/index.d.ts.map +1 -1
  345. package/dist/topic/redis/index.js +2 -2
  346. package/dist/topic/redis/index.js.map +1 -1
  347. package/package.json +36 -36
  348. package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
  349. package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
  350. package/src/api/audits/controllers/AdminAuditController.ts +41 -41
  351. package/src/api/audits/entities/audits.ts +22 -22
  352. package/src/api/audits/index.ts +6 -1
  353. package/src/api/audits/jobs/AuditJobs.ts +29 -0
  354. package/src/api/audits/parameters/AuditParameters.ts +51 -0
  355. package/src/api/audits/primitives/$audit.ts +24 -0
  356. package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
  357. package/src/api/audits/schemas/createAuditSchema.ts +18 -18
  358. package/src/api/audits/services/AuditService.ts +79 -7
  359. package/src/api/files/__tests__/FileController.spec.ts +5 -5
  360. package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
  361. package/src/api/files/controllers/FileController.ts +25 -25
  362. package/src/api/files/entities/files.ts +15 -15
  363. package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
  364. package/src/api/files/schemas/fileQuerySchema.ts +9 -9
  365. package/src/api/files/schemas/fileResourceSchema.ts +7 -9
  366. package/src/api/files/schemas/storageStatsSchema.ts +13 -13
  367. package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
  368. package/src/api/jobs/__tests__/$job.spec.ts +18 -18
  369. package/src/api/jobs/controllers/AdminJobController.ts +8 -8
  370. package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
  371. package/src/api/jobs/providers/JobProvider.ts +128 -12
  372. package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
  373. package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
  374. package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
  375. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
  376. package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
  377. package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
  378. package/src/api/jobs/services/JobService.ts +6 -6
  379. package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
  380. package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
  381. package/src/api/keys/entities/apiKeyEntity.ts +15 -15
  382. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
  383. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
  384. package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
  385. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
  386. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
  387. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
  388. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
  389. package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
  390. package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
  391. package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
  392. package/src/api/notifications/primitives/$notification.ts +43 -4
  393. package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
  394. package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
  395. package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
  396. package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
  397. package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
  398. package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
  399. package/src/api/notifications/services/NotificationSenderService.ts +38 -2
  400. package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
  401. package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
  402. package/src/api/oauth/controllers/OAuthController.ts +132 -12
  403. package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
  404. package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
  405. package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
  406. package/src/api/oauth/index.ts +1 -0
  407. package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
  408. package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
  409. package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
  410. package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
  411. package/src/api/oauth/services/OAuthClientService.ts +228 -15
  412. package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
  413. package/src/api/organizations/entities/organizations.ts +6 -6
  414. package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
  415. package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
  416. package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
  417. package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
  418. package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
  419. package/src/api/parameters/entities/parameters.ts +29 -16
  420. package/src/api/parameters/primitives/$parameter.ts +3 -3
  421. package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
  422. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
  423. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
  424. package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
  425. package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
  426. package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
  427. package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
  428. package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
  429. package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
  430. package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
  431. package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
  432. package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
  433. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
  434. package/src/api/parameters/services/ParameterProvider.ts +152 -65
  435. package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
  436. package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
  437. package/src/api/payments/controllers/PaymentController.ts +4 -4
  438. package/src/api/payments/entities/paymentIntents.ts +11 -11
  439. package/src/api/payments/entities/paymentMethods.ts +11 -11
  440. package/src/api/payments/entities/refunds.ts +9 -9
  441. package/src/api/payments/providers/PaymentProvider.ts +18 -0
  442. package/src/api/payments/schemas/intentSchemas.ts +25 -25
  443. package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
  444. package/src/api/payments/services/PaymentService.ts +60 -3
  445. package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
  446. package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
  447. package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
  448. package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
  449. package/src/api/subscriptions/entities/subscriptions.ts +22 -22
  450. package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
  451. package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
  452. package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
  453. package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
  454. package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
  455. package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
  456. package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
  457. package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
  458. package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
  459. package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
  460. package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
  461. package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
  462. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
  463. package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
  464. package/src/api/users/controllers/AdminIdentityController.ts +29 -19
  465. package/src/api/users/controllers/AdminSessionController.ts +37 -27
  466. package/src/api/users/controllers/AdminUserController.ts +75 -53
  467. package/src/api/users/controllers/MySessionController.ts +125 -0
  468. package/src/api/users/controllers/RealmController.ts +9 -9
  469. package/src/api/users/controllers/UserController.ts +55 -55
  470. package/src/api/users/entities/identities.ts +8 -8
  471. package/src/api/users/entities/sessions.ts +17 -17
  472. package/src/api/users/entities/users.ts +17 -17
  473. package/src/api/users/index.ts +3 -0
  474. package/src/api/users/notifications/UserNotifications.ts +76 -24
  475. package/src/api/users/primitives/$realm.ts +12 -0
  476. package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
  477. package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
  478. package/src/api/users/schemas/createUserSchema.ts +2 -2
  479. package/src/api/users/schemas/identityQuerySchema.ts +4 -4
  480. package/src/api/users/schemas/identityResourceSchema.ts +3 -2
  481. package/src/api/users/schemas/loginSchema.ts +4 -4
  482. package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
  483. package/src/api/users/schemas/realmConfigSchema.ts +10 -10
  484. package/src/api/users/schemas/registerQuerySchema.ts +6 -6
  485. package/src/api/users/schemas/registerRequestSchema.ts +21 -43
  486. package/src/api/users/schemas/registerResponseSchema.ts +2 -2
  487. package/src/api/users/schemas/registerSchema.ts +13 -31
  488. package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
  489. package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
  490. package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
  491. package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
  492. package/src/api/users/schemas/updateUserSchema.ts +3 -4
  493. package/src/api/users/schemas/userQuerySchema.ts +7 -7
  494. package/src/api/users/services/RegistrationService.ts +25 -11
  495. package/src/api/users/services/UserService.ts +12 -6
  496. package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
  497. package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
  498. package/src/api/verifications/controllers/VerificationController.ts +13 -27
  499. package/src/api/verifications/entities/verifications.ts +13 -14
  500. package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
  501. package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
  502. package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
  503. package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
  504. package/src/api/verifications/services/VerificationService.ts +12 -0
  505. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
  506. package/src/batch/__tests__/$batch.spec.ts +22 -22
  507. package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
  508. package/src/bin/index.ts +1 -1
  509. package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
  510. package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
  511. package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
  512. package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
  513. package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
  514. package/src/cache/core/primitives/$cache.ts +7 -10
  515. package/src/cache/database/entities/cacheEntries.ts +16 -27
  516. package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
  517. package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
  518. package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
  519. package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
  520. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
  521. package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
  522. package/src/cli/core/atoms/appEntryOptions.ts +5 -5
  523. package/src/cli/core/atoms/buildOptions.ts +76 -88
  524. package/src/cli/core/atoms/changelogOptions.ts +3 -3
  525. package/src/cli/core/atoms/devOptions.ts +3 -3
  526. package/src/cli/core/commands/build.ts +36 -49
  527. package/src/cli/core/commands/db.ts +171 -83
  528. package/src/cli/core/commands/dev.ts +8 -8
  529. package/src/cli/core/commands/gen/changelog.ts +12 -14
  530. package/src/cli/core/commands/gen/env.ts +6 -6
  531. package/src/cli/core/commands/gen/openapi.ts +6 -6
  532. package/src/cli/core/commands/init.ts +28 -33
  533. package/src/cli/core/commands/pack.ts +10 -10
  534. package/src/cli/core/commands/root.ts +7 -8
  535. package/src/cli/core/commands/test.ts +17 -20
  536. package/src/cli/core/index.ts +0 -3
  537. package/src/cli/core/tasks/BuildCloudflareTask.ts +138 -245
  538. package/src/cli/core/tasks/BuildPrerenderTask.ts +44 -7
  539. package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
  540. package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
  541. package/src/cli/i18n/__tests__/I18nCheckService.spec.ts +48 -0
  542. package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
  543. package/src/cli/i18n/services/I18nCheckService.ts +65 -11
  544. package/src/cli/platform/commands/SecretsCommand.ts +24 -25
  545. package/src/cli/platform/commands/platform.ts +40 -46
  546. package/src/cli/platform/index.ts +1 -1
  547. package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
  548. package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
  549. package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
  550. package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +141 -50
  551. package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
  552. package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
  553. package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
  554. package/src/cli/platform-lib/schemas/platform.ts +51 -51
  555. package/src/cli/platform-lib/schemas/vercel.ts +28 -28
  556. package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
  557. package/src/cli/platform-lib/services/VercelApi.ts +4 -4
  558. package/src/cli/platform-lib/services/VercelCli.ts +6 -15
  559. package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
  560. package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
  561. package/src/cli/vendor/commands/VendorCommand.ts +11 -12
  562. package/src/command/__tests__/$command.spec.ts +82 -83
  563. package/src/command/__tests__/Asker.spec.ts +6 -13
  564. package/src/command/__tests__/CliProvider.spec.ts +136 -149
  565. package/src/command/__tests__/Runner.spec.ts +86 -110
  566. package/src/command/helpers/Asker.ts +23 -58
  567. package/src/command/helpers/Runner.ts +34 -110
  568. package/src/command/index.ts +4 -9
  569. package/src/command/primitives/$command.ts +10 -10
  570. package/src/command/providers/CliProvider.ts +183 -161
  571. package/src/core/Alepha.ts +62 -13
  572. package/src/core/__tests__/$atom.spec.ts +52 -3
  573. package/src/core/__tests__/$computed.spec.ts +129 -0
  574. package/src/core/__tests__/$env.spec.ts +13 -13
  575. package/src/core/__tests__/$inject.spec.ts +4 -4
  576. package/src/core/__tests__/$module.spec.ts +1 -1
  577. package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
  578. package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
  579. package/src/core/__tests__/Alepha-start.spec.ts +3 -3
  580. package/src/core/__tests__/CodecManager.spec.ts +113 -94
  581. package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
  582. package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
  583. package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
  584. package/src/core/__tests__/StateManager.spec.ts +423 -0
  585. package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
  586. package/src/core/__tests__/TypeProvider.spec.ts +314 -309
  587. package/src/core/__tests__/dump.spec.ts +6 -6
  588. package/src/core/__tests__/pagination.spec.ts +4 -4
  589. package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
  590. package/src/core/errors/TypeBoxError.ts +10 -4
  591. package/src/core/helpers/FileLike.ts +5 -5
  592. package/src/core/helpers/coerceStrings.ts +70 -0
  593. package/src/core/helpers/jsonSchemaToZod.ts +112 -0
  594. package/src/core/index.shared.ts +4 -1
  595. package/src/core/primitives/$atom.ts +95 -27
  596. package/src/core/primitives/$computed.ts +148 -0
  597. package/src/core/primitives/$env.ts +5 -5
  598. package/src/core/primitives/$state.ts +1 -1
  599. package/src/core/providers/AlsProvider.ts +26 -0
  600. package/src/core/providers/CodecManager.ts +1 -2
  601. package/src/core/providers/JsonSchemaCodec.ts +1 -2
  602. package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
  603. package/src/core/providers/SchemaValidator.ts +48 -158
  604. package/src/core/providers/StateManager.ts +383 -9
  605. package/src/core/providers/TypeProvider.ts +80 -734
  606. package/src/core/providers/ZodProvider.ts +380 -0
  607. package/src/core/providers/zodAugment.ts +69 -0
  608. package/src/core/schemas/pageQuerySchema.ts +19 -21
  609. package/src/core/schemas/pageSchema.ts +47 -57
  610. package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
  611. package/src/crypto/providers/SecretProvider.ts +16 -10
  612. package/src/datetime/primitives/$throttle.ts +6 -1
  613. package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
  614. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
  615. package/src/email/core/index.ts +7 -2
  616. package/src/email/core/primitives/$email.ts +5 -1
  617. package/src/email/core/providers/LocalEmailProvider.ts +5 -5
  618. package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
  619. package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
  620. package/src/fake/__tests__/keyName.example.ts +21 -21
  621. package/src/fake/__tests__/keyName.spec.ts +41 -41
  622. package/src/fake/__tests__/module.example.ts +8 -8
  623. package/src/fake/providers/FakeProvider.ts +122 -121
  624. package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
  625. package/src/lock/core/index.ts +1 -0
  626. package/src/lock/core/primitives/$lock.ts +13 -6
  627. package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
  628. package/src/logger/__tests__/Logger.spec.ts +49 -0
  629. package/src/logger/index.ts +25 -18
  630. package/src/logger/providers/CliFormatterProvider.ts +75 -0
  631. package/src/logger/schemas/logEntrySchema.ts +10 -10
  632. package/src/logger/services/Logger.ts +18 -0
  633. package/src/mcp/__tests__/$prompt.spec.ts +21 -23
  634. package/src/mcp/__tests__/$tool.spec.ts +22 -22
  635. package/src/mcp/__tests__/McpServerProvider.spec.ts +82 -11
  636. package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
  637. package/src/mcp/__tests__/integration.spec.ts +33 -33
  638. package/src/mcp/primitives/$prompt.ts +11 -9
  639. package/src/mcp/primitives/$tool.ts +27 -86
  640. package/src/mcp/providers/McpServerProvider.ts +55 -0
  641. package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
  642. package/src/orm/__tests__/$repository-tests.ts +133 -27
  643. package/src/orm/__tests__/$repository.spec.ts +23 -0
  644. package/src/orm/__tests__/$transactional-tests.ts +4 -4
  645. package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
  646. package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
  647. package/src/orm/__tests__/QueryManager.spec.ts +5 -5
  648. package/src/orm/__tests__/delete-returning-tests.ts +11 -11
  649. package/src/orm/__tests__/deletedAt-tests.ts +3 -3
  650. package/src/orm/__tests__/enums.spec.ts +29 -25
  651. package/src/orm/__tests__/execute-tests.ts +8 -8
  652. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
  653. package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
  654. package/src/orm/__tests__/joins-tests.ts +30 -30
  655. package/src/orm/__tests__/organization-tests.ts +105 -3
  656. package/src/orm/__tests__/organization.spec.ts +46 -0
  657. package/src/orm/__tests__/orm-errors.spec.ts +10 -10
  658. package/src/orm/__tests__/orm-next-tests.ts +29 -29
  659. package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
  660. package/src/orm/__tests__/primaryKey.spec.ts +4 -4
  661. package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
  662. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
  663. package/src/orm/__tests__/references.spec.ts +7 -7
  664. package/src/orm/__tests__/security.spec.ts +17 -17
  665. package/src/orm/__tests__/string-operators-tests.ts +5 -5
  666. package/src/orm/__tests__/timestamps-tests.ts +14 -14
  667. package/src/orm/__tests__/validation-tests.ts +5 -5
  668. package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
  669. package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
  670. package/src/orm/core/entities/alephaSequences.ts +8 -8
  671. package/src/orm/core/helpers/pgAttr.ts +4 -4
  672. package/src/orm/core/primitives/$entity.ts +10 -6
  673. package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
  674. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
  675. package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
  676. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
  677. package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
  678. package/src/orm/core/schemas/insertSchema.ts +14 -18
  679. package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
  680. package/src/orm/core/schemas/updateSchema.ts +10 -16
  681. package/src/orm/core/services/PgRelationManager.ts +2 -2
  682. package/src/orm/core/services/QueryManager.ts +13 -2
  683. package/src/orm/core/services/Repository.ts +88 -33
  684. package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
  685. package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
  686. package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
  687. package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
  688. package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
  689. package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
  690. package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
  691. package/src/queue/core/__tests__/shared.ts +6 -6
  692. package/src/queue/core/primitives/$consumer.ts +5 -5
  693. package/src/queue/core/primitives/$queue.ts +44 -61
  694. package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
  695. package/src/queue/core/providers/WorkerProvider.ts +17 -14
  696. package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
  697. package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
  698. package/src/react/core/__tests__/Router.spec.tsx +4 -4
  699. package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
  700. package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
  701. package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
  702. package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
  703. package/src/react/core/components/ErrorBoundary.tsx +42 -0
  704. package/src/react/core/hooks/useAction.ts +56 -19
  705. package/src/react/core/hooks/useComputed.ts +91 -0
  706. package/src/react/core/hooks/useSelector.ts +67 -0
  707. package/src/react/core/hooks/useStore.ts +36 -17
  708. package/src/react/core/index.ts +3 -0
  709. package/src/react/core/utils/shallowEqual.ts +36 -0
  710. package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +71 -0
  711. package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +96 -0
  712. package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
  713. package/src/react/form/errors/FormValidationError.ts +0 -2
  714. package/src/react/form/hooks/useForm.ts +19 -4
  715. package/src/react/form/hooks/useFormQuerySync.ts +0 -0
  716. package/src/react/form/services/FormModel.ts +124 -86
  717. package/src/react/form/services/parseField.ts +66 -27
  718. package/src/react/i18n/__tests__/I18nProvider.spec.ts +89 -0
  719. package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
  720. package/src/react/i18n/__tests__/locale-routing.spec.ts +107 -0
  721. package/src/react/i18n/providers/I18nProvider.ts +173 -14
  722. package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
  723. package/src/react/router/__tests__/$page.spec.tsx +21 -21
  724. package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
  725. package/src/react/router/__tests__/RouterLocaleProvider.spec.ts +127 -0
  726. package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
  727. package/src/react/router/components/NestedView.tsx +11 -3
  728. package/src/react/router/hooks/useQueryParams.ts +1 -1
  729. package/src/react/router/index.browser.ts +4 -0
  730. package/src/react/router/index.shared.ts +1 -0
  731. package/src/react/router/index.ts +9 -0
  732. package/src/react/router/primitives/$page.ts +2 -2
  733. package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
  734. package/src/react/router/providers/ReactBrowserRouterProvider.ts +15 -1
  735. package/src/react/router/providers/ReactPageProvider.ts +38 -13
  736. package/src/react/router/providers/ReactServerProvider.ts +105 -16
  737. package/src/react/router/providers/RootComponentsProvider.ts +13 -0
  738. package/src/react/router/providers/RouterLocaleProvider.ts +125 -0
  739. package/src/react/router/providers/__tests__/RootComponentsProvider.spec.ts +15 -0
  740. package/src/react/router/providers/__tests__/rootComponents.ssr.browser.spec.tsx +67 -0
  741. package/src/react/sitemap/__tests__/$sitemap.spec.ts +131 -0
  742. package/src/react/sitemap/index.browser.ts +21 -0
  743. package/src/react/sitemap/index.ts +25 -0
  744. package/src/react/sitemap/primitives/$sitemap.browser.ts +26 -0
  745. package/src/react/sitemap/primitives/$sitemap.ts +196 -0
  746. package/src/react/ui/atoms/uiAtom.ts +6 -6
  747. package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
  748. package/src/react/ui/hooks/useColorMode.ts +11 -4
  749. package/src/react/ui/services/SchemaControl.ts +4 -4
  750. package/src/redis/providers/BunRedisProvider.ts +19 -11
  751. package/src/redis/providers/NodeRedisProvider.ts +3 -3
  752. package/src/scheduler/primitives/$scheduler.ts +21 -8
  753. package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
  754. package/src/security/atoms/currentTenantAtom.ts +6 -6
  755. package/src/security/atoms/currentUserAtom.ts +2 -2
  756. package/src/security/primitives/$issuer.ts +24 -2
  757. package/src/security/providers/JwtProvider.ts +100 -0
  758. package/src/security/providers/SecurityProvider.ts +43 -2
  759. package/src/security/schemas/permissionSchema.ts +19 -19
  760. package/src/security/schemas/roleSchema.ts +22 -28
  761. package/src/security/schemas/userAccountInfoSchema.ts +47 -37
  762. package/src/server/auth/__tests__/appleClientSecret.spec.ts +34 -0
  763. package/src/server/auth/__tests__/federationRedirectReplay.spec.ts +44 -0
  764. package/src/server/auth/helpers/appleClientSecret.ts +24 -0
  765. package/src/server/auth/helpers/jtiReplayGuard.ts +41 -0
  766. package/src/server/auth/helpers/safeRedirectPath.ts +19 -0
  767. package/src/server/auth/index.ts +1 -0
  768. package/src/server/auth/primitives/$auth.ts +6 -6
  769. package/src/server/auth/primitives/$authApple.ts +10 -10
  770. package/src/server/auth/primitives/$authFacebook.ts +10 -10
  771. package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
  772. package/src/server/auth/primitives/$authGithub.ts +10 -10
  773. package/src/server/auth/primitives/$authGoogle.ts +10 -10
  774. package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
  775. package/src/server/auth/providers/ServerAuthProvider.ts +67 -52
  776. package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
  777. package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
  778. package/src/server/auth/schemas/tokensSchema.ts +16 -16
  779. package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
  780. package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
  781. package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
  782. package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
  783. package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +82 -12
  784. package/src/server/cookies/index.browser.ts +4 -1
  785. package/src/server/cookies/index.ts +8 -1
  786. package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
  787. package/src/server/cookies/primitives/$cookie.ts +16 -0
  788. package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
  789. package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
  790. package/src/server/cookies/providers/ServerCookiesProvider.ts +32 -4
  791. package/src/server/cookies/services/CookieParser.ts +6 -1
  792. package/src/server/core/__tests__/$action.spec.ts +13 -13
  793. package/src/server/core/__tests__/$middleware.spec.ts +10 -10
  794. package/src/server/core/__tests__/$route.spec.ts +9 -9
  795. package/src/server/core/__tests__/$sse.spec.ts +26 -26
  796. package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
  797. package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
  798. package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
  799. package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
  800. package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
  801. package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
  802. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
  803. package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
  804. package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
  805. package/src/server/core/errors/ValidationError.ts +6 -3
  806. package/src/server/core/helpers/isMultipart.ts +2 -1
  807. package/src/server/core/index.ts +5 -2
  808. package/src/server/core/interfaces/ServerRequest.ts +14 -14
  809. package/src/server/core/primitives/$action.ts +26 -36
  810. package/src/server/core/primitives/$route.ts +27 -0
  811. package/src/server/core/primitives/$sse.ts +3 -3
  812. package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
  813. package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
  814. package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
  815. package/src/server/core/providers/ServerCompressProvider.ts +9 -10
  816. package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
  817. package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
  818. package/src/server/core/providers/ServerRouterProvider.ts +44 -15
  819. package/src/server/core/schemas/errorSchema.ts +20 -25
  820. package/src/server/core/schemas/okSchema.ts +9 -14
  821. package/src/server/core/services/HttpClient.ts +13 -1
  822. package/src/server/core/services/ServerRequestParser.ts +6 -6
  823. package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
  824. package/src/server/health/schemas/healthSchema.ts +6 -6
  825. package/src/server/links/__tests__/$remote.spec.ts +3 -3
  826. package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
  827. package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
  828. package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
  829. package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
  830. package/src/server/links/atoms/apiLinksAtom.ts +2 -2
  831. package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
  832. package/src/server/links/primitives/$remote.ts +3 -3
  833. package/src/server/links/providers/LinkProvider.ts +3 -3
  834. package/src/server/links/providers/ServerLinksProvider.ts +20 -20
  835. package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
  836. package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
  837. package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
  838. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
  839. package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
  840. package/src/server/swagger/__tests__/ui.spec.ts +3 -3
  841. package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
  842. package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
  843. package/src/system/providers/NodeShellProvider.ts +4 -1
  844. package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
  845. package/src/topic/core/__tests__/shared.ts +8 -8
  846. package/src/topic/core/primitives/$subscriber.ts +5 -5
  847. package/src/topic/core/primitives/$topic.ts +14 -14
  848. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  849. package/dist/container/core/index.d.ts +0 -236
  850. package/dist/container/core/index.d.ts.map +0 -1
  851. package/dist/container/core/index.js +0 -231
  852. package/dist/container/core/index.js.map +0 -1
  853. package/dist/container/core/index.workerd.js +0 -192
  854. package/dist/container/core/index.workerd.js.map +0 -1
  855. package/src/cli/core/tasks/BuildSitemapTask.ts +0 -130
  856. package/src/command/helpers/PrettyAsker.ts +0 -256
  857. package/src/command/helpers/PrettyPrint.ts +0 -332
  858. package/src/container/core/__tests__/$container.spec.ts +0 -83
  859. package/src/container/core/index.ts +0 -50
  860. package/src/container/core/index.workerd.ts +0 -53
  861. package/src/container/core/interfaces/ContainerOptions.ts +0 -69
  862. package/src/container/core/primitives/$container.ts +0 -100
  863. package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
  864. package/src/container/core/providers/ContainerProvider.ts +0 -92
  865. package/src/container/core/providers/MockContainerProvider.ts +0 -62
  866. package/src/container/core/providers/NodeContainerProvider.ts +0 -53
  867. package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
  868. package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
  869. /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
@@ -1,7 +1,11 @@
1
- import { AsyncFn, Middleware, Primitive, Static } from "alepha";
1
+ import { AlephaError, AsyncFn, Middleware, Primitive, Static } from "alepha";
2
2
  import { TopicProvider } from "alepha/topic";
3
3
  import { DateTime, DateTimeProvider, DurationLike, Timeout } from "alepha/datetime";
4
-
4
+ //#region ../../src/lock/core/errors/LockAcquireError.d.ts
5
+ declare class LockAcquireError extends AlephaError {
6
+ constructor(name: string);
7
+ }
8
+ //#endregion
5
9
  //#region ../../src/lock/core/providers/LockProvider.d.ts
6
10
  /**
7
11
  * Store Provider Interface
@@ -267,9 +271,9 @@ interface LockPrimitiveOptions<TFunc extends AsyncFn> {
267
271
  /**
268
272
  * Lock configuration atom.
269
273
  */
270
- declare const lockOptions: import("alepha").Atom<import("typebox").TObject<{
271
- prefixKey: import("typebox").TString;
272
- }>, "alepha.lock.options">;
274
+ declare const lockOptions: import("alepha").Atom<import("zod").ZodObject<{
275
+ prefixKey: import("zod").ZodString;
276
+ }, import("zod/v4/core").$strip>, "alepha.lock.options">;
273
277
  type LockAtomOptions = Static<typeof lockOptions.schema>;
274
278
  declare module "alepha" {
275
279
  interface State {
@@ -291,9 +295,9 @@ declare class LockPrimitive<TFunc extends AsyncFn> extends Primitive<LockPrimiti
291
295
  protected get id(): string;
292
296
  readonly maxDuration: import("alepha/datetime").Duration;
293
297
  protected readonly topicLockEnd: import("alepha/topic").TopicPrimitive<{
294
- payload: import("typebox").TObject<{
295
- name: import("typebox").TString;
296
- }>;
298
+ payload: import("zod").ZodObject<{
299
+ name: import("zod").ZodString;
300
+ }, import("zod/v4/core").$strip>;
297
301
  }>;
298
302
  run(...args: Parameters<TFunc>): Promise<void>;
299
303
  /**
@@ -378,5 +382,5 @@ declare module "alepha" {
378
382
  */
379
383
  declare const AlephaLock: import("alepha").Service<import("alepha").Module>;
380
384
  //#endregion
381
- export { $lock, AlephaLock, LockAtomOptions, LockMiddlewareOptions, LockPrimitive, LockPrimitiveOptions, LockProvider, LockResult, LockTopicProvider, MemoryLockProvider, lockOptions };
385
+ export { $lock, AlephaLock, LockAcquireError, LockAtomOptions, LockMiddlewareOptions, LockPrimitive, LockPrimitiveOptions, LockProvider, LockResult, LockTopicProvider, MemoryLockProvider, lockOptions };
382
386
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/lock/core/errors/LockAcquireError.ts","../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/index.ts"],"mappings":";;;;cAEa,yBAAyB;EACpC,YAAY;;;;;;;uBCAQ;;;;;;;;;WASJ,IACd,aACA,eACA,cACA,cACC;;;;;;WAOa,OAAO,iBAAiB;;;;;;;;;;;;;;;;;cCa7B,QAAK,SAAa,0BAAwB;;;;UA6GtC;;;;;EAKf,oBAAoB;;;;;;EAOpB;;;;;;EAOA,cAAc;;UAKC,qBAAqB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmClD,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CA,qBAAqB,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCtC,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgDd,mBACS,MAAM,WAAW,WAAW,4BACjC;;;;;cAQO,8BAAW,mBAAA;;;KAaZ,kBAAkB,cAAc,YAAY;;YAG5C;KACP,YAAY,MAAM;;;cAMV,cAAc,cAAc,iBAAiB,UACxD,qBAAqB;qBAEF,6BAAG;qBACH,UAAQ;qBACR,UAAQ;;;qBACR,kBAAgB;;;;;YAMzB;gBACI;WAOE,uCAAW;qBAIR,qCAAY;;;;;EAUlB,OAAO,MAAM,WAAW,SAAS;;;;YAkD9B,KAAK,cAAc,QAAQ;YAW3B,eACd,aACA,MAAM,eACH,MAAM,WAAW,SACnB;YAmBa,KAAK,aAAa,aAAa,eAAe;YAWpD,OAAO,MAAM,WAAW;YAgBxB,MAAM,gBAAgB;;UAejB;EACf;EACA,WAAW;EACX,UAAU;EACV;;;;uBC1jBoB,0BAA0B;;;;;;cCMnC,8BAA8B;qBACtB,kBAAgB;qBAChB,6BAAG;;;;YAKZ,OAAO;;;;YAKP,cAAc,eAAe;EAE1B,IACX,aACA,eACA,cACA,cACC;EAcU,OAAO,iBAAiB;YAU3B,IAAI,aAAa;;;;;YClCjB;;;;IAIR;MACE;MACA;MACA;;;;;IAKF;MACE;MACA;MACA;;;;;;IAMF;MACE;MACA;;;;;;;;;;;;;;;;cAmBO,6BAAU,yBAAA"}
@@ -1,4 +1,4 @@
1
- import { $atom, $context, $inject, $module, $state, AlephaError, Primitive, createMiddleware, t } from "alepha";
1
+ import { $atom, $context, $inject, $module, $state, AlephaError, Primitive, createMiddleware, z } from "alepha";
2
2
  import { $topic, MemoryTopicProvider, TopicProvider } from "alepha/topic";
3
3
  import { DateTimeProvider } from "alepha/datetime";
4
4
  import { $logger } from "alepha/logger";
@@ -82,9 +82,9 @@ const $lock = (options) => {
82
82
  name: "$lock",
83
83
  options,
84
84
  handler: ({ alepha, next }) => {
85
- const id = crypto.randomUUID();
86
85
  const maxDurationMs = dateTimeProvider.duration(options.maxDuration ?? [5, "minutes"]).asMilliseconds();
87
86
  return async (...args) => {
87
+ const id = crypto.randomUUID();
88
88
  const name = typeof options.name === "function" ? options.name(...args) : options.name;
89
89
  if (!name) throw new AlephaError("$lock middleware requires a name option (no class context available)");
90
90
  const [lockId, _createdAtStr, endedAtStr] = (await lockProvider.set(name, `${id},${dateTimeProvider.nowISOString()}`, true, maxDurationMs)).split(",");
@@ -136,7 +136,7 @@ const $lock = (options) => {
136
136
  */
137
137
  const lockOptions = $atom({
138
138
  name: "alepha.lock.options",
139
- schema: t.object({ prefixKey: t.text({
139
+ schema: z.object({ prefixKey: z.text({
140
140
  default: "",
141
141
  description: "Prefix for all lock keys."
142
142
  }) }),
@@ -160,7 +160,7 @@ var LockPrimitive = class extends Primitive {
160
160
  topicLockEnd = $topic({
161
161
  name: `${this.settings.prefixKey}lock:end`,
162
162
  provider: LockTopicProvider,
163
- schema: { payload: t.object({ name: t.text() }) }
163
+ schema: { payload: z.object({ name: z.text() }) }
164
164
  });
165
165
  async run(...args) {
166
166
  const key = this.key(...args);
@@ -259,6 +259,6 @@ const AlephaLock = $module({
259
259
  })
260
260
  });
261
261
  //#endregion
262
- export { $lock, AlephaLock, LockPrimitive, LockProvider, LockTopicProvider, MemoryLockProvider, lockOptions };
262
+ export { $lock, AlephaLock, LockAcquireError, LockPrimitive, LockProvider, LockTopicProvider, MemoryLockProvider, lockOptions };
263
263
 
264
264
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/errors/LockAcquireError.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/index.ts"],"sourcesContent":["/**\n * Store Provider Interface\n */\nexport abstract class LockProvider {\n /**\n * Set the string value of a key.\n *\n * @param key The key of the value to set.\n * @param value The value to set.\n * @param nx If set to true, the key will only be set if it does not already exist.\n * @param px Set the specified expire time, in milliseconds.\n */\n public abstract set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string>;\n\n /**\n * Remove the specified keys.\n *\n * @param keys The keys to delete.\n */\n public abstract del(...keys: string[]): Promise<void>;\n}\n","import { TopicProvider } from \"alepha/topic\";\n\nexport abstract class LockTopicProvider extends TopicProvider {}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type Timeout } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport type { LockProvider } from \"./LockProvider.ts\";\n\n/**\n * A simple in-memory store provider.\n */\nexport class MemoryLockProvider implements LockProvider {\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly log = $logger();\n\n /**\n * The in-memory store.\n */\n protected store: Record<string, string> = {};\n\n /**\n * Timeouts used to expire keys.\n */\n protected storeTimeout: Record<string, Timeout> = {};\n\n public async set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string> {\n if (nx && this.store[key] != null) {\n return this.store[key];\n }\n\n if (px) {\n this.ttl(key, px);\n }\n\n this.store[key] = value;\n\n return this.store[key];\n }\n\n public async del(...keys: string[]): Promise<void> {\n for (const key of keys) {\n delete this.store[key];\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n }\n }\n\n protected ttl(key: string, ms: number): void {\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n\n this.storeTimeout[key] = this.dateTimeProvider.createTimeout(() => {\n delete this.store[key];\n delete this.storeTimeout[key];\n }, ms);\n }\n}\n","import { AlephaError } from \"alepha\";\n\nexport class LockAcquireError extends AlephaError {\n constructor(name: string) {\n super(`$lock: could not acquire lock '${name}'`);\n }\n}\n","import {\n $atom,\n $context,\n $inject,\n $state,\n AlephaError,\n type AsyncFn,\n createMiddleware,\n type Middleware,\n Primitive,\n type Static,\n t,\n} from \"alepha\";\nimport {\n type DateTime,\n DateTimeProvider,\n type DurationLike,\n} from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { $topic } from \"alepha/topic\";\nimport { LockAcquireError } from \"../errors/LockAcquireError.ts\";\nimport { LockProvider } from \"../providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"../providers/LockTopicProvider.ts\";\n\n/**\n * Distributed lock middleware for `use` arrays in `$action`, `$job`, `$page`, `$pipeline`.\n *\n * Acquires a distributed lock before the handler runs and releases it after completion.\n * Throws `LockAcquireError` if the lock cannot be acquired (unless `wait: true`).\n *\n * ```ts\n * processOrder = $action({\n * use: [$lock({ name: \"process-order\" })],\n * handler: async ({ body }) => { ... },\n * });\n * ```\n */\nexport const $lock = (options: LockMiddlewareOptions): Middleware => {\n const { alepha } = $context();\n const lockProvider = alepha.inject(LockProvider);\n const dateTimeProvider = alepha.inject(DateTimeProvider);\n\n return createMiddleware({\n name: \"$lock\",\n options: options as unknown as Record<string, unknown>,\n handler: ({ alepha, next }) => {\n const id = crypto.randomUUID();\n const maxDurationMs = dateTimeProvider\n .duration(options.maxDuration ?? [5, \"minutes\"])\n .asMilliseconds();\n\n return async (...args: any[]) => {\n const name =\n typeof options.name === \"function\"\n ? options.name(...args)\n : options.name;\n if (!name) {\n throw new AlephaError(\n \"$lock middleware requires a name option (no class context available)\",\n );\n }\n\n const value = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n\n const [lockId, _createdAtStr, endedAtStr] = value.split(\",\");\n\n // Lock already ended (grace period active)\n if (endedAtStr) {\n await alepha.events.emit(\"lock:contended\", { name, id });\n throw new LockAcquireError(name);\n }\n\n // Lock held by someone else\n if (lockId !== id) {\n await alepha.events.emit(\"lock:contended\", { name, id });\n if (options.wait) {\n // Poll until lock is released\n const start = dateTimeProvider.nowMillis();\n while (dateTimeProvider.nowMillis() - start < maxDurationMs) {\n await dateTimeProvider.wait(500);\n const current = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n const [currentId] = current.split(\",\");\n if (currentId === id) {\n break;\n }\n }\n // Check if we got the lock\n const final = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n const [finalId] = final.split(\",\");\n if (finalId !== id) {\n throw new LockAcquireError(name);\n }\n } else {\n throw new LockAcquireError(name);\n }\n }\n\n // We hold the lock — execute handler\n const acquiredAt = dateTimeProvider.nowMillis();\n await alepha.events.emit(\"lock:acquired\", {\n name,\n id,\n maxDurationMs,\n });\n try {\n return await next(...args);\n } finally {\n await lockProvider.del(name);\n await alepha.events.emit(\"lock:released\", {\n name,\n id,\n heldMs: dateTimeProvider.nowMillis() - acquiredAt,\n });\n }\n };\n },\n });\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Options for $lock in middleware mode (no handler).\n */\nexport interface LockMiddlewareOptions {\n /**\n * Lock key name. Required in middleware mode (no class context available).\n * Can be a static string or a function that derives the key from handler args.\n */\n name: string | ((...args: any[]) => string);\n\n /**\n * Whether to wait for the lock to become available.\n *\n * @default false\n */\n wait?: boolean;\n\n /**\n * Maximum duration the lock can be held before automatic expiration.\n *\n * @default [5, \"minutes\"]\n */\n maxDuration?: DurationLike;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface LockPrimitiveOptions<TFunc extends AsyncFn> {\n /**\n * The function to execute when the lock is successfully acquired.\n *\n * This function:\n * - Only executes on the instance that successfully acquires the lock\n * - Has exclusive access to the protected resource during execution\n * - Should contain the critical section logic that must not run concurrently\n * - Can be async and perform any operations needed\n * - Will automatically release the lock upon completion or error\n * - Has access to the full Alepha dependency injection container\n *\n * **Handler Design Guidelines**:\n * - Keep critical sections as short as possible to minimize lock contention\n * - Include proper error handling to ensure locks are released\n * - Use timeouts for external operations to prevent deadlocks\n * - Log important operations for debugging and monitoring\n * - Consider idempotency for handlers that might be retried\n *\n * @param ...args - The arguments passed to the lock execution\n * @returns Promise that resolves when the protected operation is complete\n *\n * @example\n * ```ts\n * handler: async (batchId: string) => {\n * console.log(`Processing batch ${batchId} - only one instance will run this`);\n *\n * const batch = await this.getBatchData(batchId);\n * const results = await this.processBatchItems(batch.items);\n * await this.saveBatchResults(batchId, results);\n *\n * console.log(`Batch ${batchId} completed successfully`);\n * }\n * ```\n */\n handler: TFunc;\n\n /**\n * Whether the lock should wait for other instances to complete before giving up.\n *\n * **wait = false (default)**:\n * - Non-blocking behavior - if lock is held, immediately return without executing\n * - Perfect for scheduled tasks where you only want one execution per trigger\n * - Use when multiple triggers are acceptable but concurrent execution is not\n * - Examples: periodic cleanup, cron jobs, background maintenance\n *\n * **wait = true**:\n * - Blocking behavior - wait for the current lock holder to finish\n * - All instances will eventually execute (one after another)\n * - Perfect for initialization tasks where all instances need the work completed\n * - Examples: database migrations, cache warming, resource initialization\n *\n * **Trade-offs**:\n * - Non-waiting: Better performance, may miss executions if timing is off\n * - Waiting: Guaranteed execution order, slower overall throughput\n *\n * @default false\n *\n * @example\n * ```ts\n * // Scheduled task - don't wait, just skip if already running\n * scheduledCleanup = $lock({\n * wait: false, // Skip if cleanup already running\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Migration - wait for completion before proceeding\n * migration = $lock({\n * wait: true, // All instances wait for migration to complete\n * handler: async () => { } // perform migration\n * });\n * ```\n */\n wait?: boolean;\n\n /**\n * The unique identifier for the lock.\n *\n * Can be either:\n * - **Static string**: A fixed identifier for the lock\n * - **Dynamic function**: A function that generates the lock key based on arguments\n *\n * **Dynamic Lock Keys**:\n * - Enable per-resource locking (e.g., per-user, per-file, per-product)\n * - Allow fine-grained concurrency control\n * - Prevent unnecessary blocking between unrelated operations\n *\n * **Key Design Guidelines**:\n * - Use descriptive names that indicate the protected resource\n * - Include relevant identifiers for dynamic keys\n * - Keep keys reasonably short but unique\n * - Consider using hierarchical naming (e.g., \"service:operation:resource\")\n *\n * If not provided, defaults to `{serviceName}:{propertyKey}`.\n *\n * @example \"user-migration\"\n * @example \"daily-report-generation\"\n * @example (userId: string) => `user-profile-update:${userId}`\n * @example (fileId: string, operation: string) => `file-${operation}:${fileId}`\n *\n * @example\n * ```ts\n * // Static lock key - all instances compete for the same lock\n * globalCleanup = $lock({\n * name: \"system-cleanup\",\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Dynamic lock key - per-user locks, users don't block each other\n * updateUserProfile = $lock({\n * name: (userId: string) => `user-update:${userId}`,\n * handler: async (userId: string, data: UserData) => {\n * // Only one update per user at a time, but different users can update concurrently\n * }\n * });\n * ```\n */\n name?: string | ((...args: Parameters<TFunc>) => string);\n\n /**\n * Maximum duration the lock can be held before it expires automatically.\n *\n * This prevents deadlocks when a process dies while holding a lock or when\n * operations take longer than expected. The lock will be automatically released\n * after this duration, allowing other instances to proceed.\n *\n * **Duration Guidelines**:\n * - Set based on expected operation duration plus safety margin\n * - Too short: Operations may be interrupted by early expiration\n * - Too long: Failed processes block others for extended periods\n * - Consider worst-case scenarios and external dependency timeouts\n *\n * **Typical Values**:\n * - Quick operations: 30 seconds - 2 minutes\n * - Database operations: 5 - 15 minutes\n * - File processing: 10 - 30 minutes\n * - Large migrations: 30 minutes - 2 hours\n *\n * @default [5, \"minutes\"]\n *\n * @example [30, \"seconds\"] // Quick operations\n * @example [10, \"minutes\"] // Database migrations\n * @example [1, \"hour\"] // Long-running batch jobs\n *\n * @example\n * ```ts\n * quickTask = $lock({\n * maxDuration: [2, \"minutes\"], // Quick timeout for fast operations\n * handler: async () => { } // perform quick task\n * });\n *\n * heavyProcessing = $lock({\n * maxDuration: [30, \"minutes\"], // Longer timeout for heavy work\n * handler: async () => { } // perform heavy processing\n * });\n * ```\n */\n maxDuration?: DurationLike;\n\n /**\n * Additional time to keep the lock active after the handler completes successfully.\n *\n * This provides a \"cooling off\" period that can be useful for:\n * - Preventing immediate re-execution of the same operation\n * - Giving time for related systems to process the results\n * - Avoiding race conditions with dependent operations\n * - Providing a buffer for cleanup operations\n *\n * Can be either:\n * - **Static duration**: Fixed grace period for all executions\n * - **Dynamic function**: Grace period determined by execution arguments\n * - **undefined**: No grace period, lock released immediately after completion\n *\n * **Grace Period Use Cases**:\n * - File processing: Prevent immediate reprocessing of uploaded files\n * - Cache updates: Allow time for cache propagation\n * - Batch operations: Prevent overlapping batch processing\n * - External API calls: Respect rate limiting requirements\n *\n * @default undefined (no grace period)\n *\n * @example [5, \"minutes\"] // Fixed 5-minute grace period\n * @example [30, \"seconds\"] // Short grace for quick operations\n * @example (userId: string) => userId.startsWith(\"premium\") ? [10, \"minutes\"] : [2, \"minutes\"]\n *\n * @example\n * ```ts\n * fileProcessor = $lock({\n * gracePeriod: [10, \"minutes\"], // Prevent reprocessing same file immediately\n * handler: async (filePath: string) => {\n * await this.processFile(filePath);\n * }\n * });\n *\n * userOperation = $lock({\n * gracePeriod: (userId: string, operation: string) => {\n * // Dynamic grace based on operation type\n * return operation === 'migration' ? [30, \"minutes\"] : [5, \"minutes\"];\n * },\n * handler: async (userId: string, operation: string) => {\n * await this.performUserOperation(userId, operation);\n * }\n * });\n * ```\n */\n gracePeriod?:\n | ((...args: Parameters<TFunc>) => DurationLike | undefined)\n | DurationLike;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Lock configuration atom.\n */\nexport const lockOptions = $atom({\n name: \"alepha.lock.options\",\n schema: t.object({\n prefixKey: t.text({\n default: \"\",\n description: \"Prefix for all lock keys.\",\n }),\n }),\n default: {\n prefixKey: \"\",\n },\n});\n\nexport type LockAtomOptions = Static<typeof lockOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [lockOptions.key]: LockAtomOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class LockPrimitive<TFunc extends AsyncFn> extends Primitive<\n LockPrimitiveOptions<TFunc>\n> {\n protected readonly log = $logger();\n protected readonly provider = $inject(LockProvider);\n protected readonly settings = $state(lockOptions);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n /**\n * Lazy-initialized UUID to avoid calling crypto.randomUUID() in global scope.\n * Cloudflare Workers doesn't allow random value generation during initialization.\n */\n protected _id?: string;\n protected get id(): string {\n if (!this._id) {\n this._id = crypto.randomUUID();\n }\n return this._id;\n }\n\n public readonly maxDuration = this.dateTimeProvider.duration(\n this.options.maxDuration ?? [5, \"minutes\"],\n );\n\n protected readonly topicLockEnd = $topic({\n name: `${this.settings.prefixKey}lock:end`,\n provider: LockTopicProvider,\n schema: {\n payload: t.object({\n name: t.text(),\n }),\n },\n });\n\n public async run(...args: Parameters<TFunc>): Promise<void> {\n const key = this.key(...args);\n const handler = this.options.handler;\n\n const lock = await this.lock(key);\n if (lock.endedAt) {\n return;\n }\n\n if (lock.id !== this.id) {\n if (this.options.wait) {\n // Poll until the lock is released, then re-attempt\n const start = this.dateTimeProvider.nowMillis();\n const maxMs = this.maxDuration.as(\"milliseconds\");\n let acquired = false;\n while (this.dateTimeProvider.nowMillis() - start < maxMs) {\n await this.dateTimeProvider.wait(500);\n const current = await this.lock(key);\n if (current.id === this.id || !current.id || current.endedAt) {\n acquired = true;\n break;\n }\n }\n if (acquired) {\n return this.run(...args);\n }\n this.log.warn(`Lock wait timeout for '${key}', giving up`);\n }\n\n return;\n }\n\n this.log.debug(`Lock '${key}' ...`);\n\n try {\n await handler(...args);\n } finally {\n await this.topicLockEnd.publish({\n name: key,\n });\n\n await this.setGracePeriod(key, lock, ...args);\n\n this.log.debug(`Lock '${key}' OK`);\n }\n }\n\n /**\n * Set the lock for the given key.\n */\n protected async lock(key: string): Promise<LockResult> {\n const value = await this.provider.set(\n key,\n `${this.id},${this.dateTimeProvider.nowISOString()}`,\n true,\n this.maxDuration.as(\"milliseconds\"),\n );\n\n return this.parse(value);\n }\n\n protected async setGracePeriod(\n key: string,\n lock: LockResult,\n ...args: Parameters<TFunc>\n ): Promise<void> {\n const gracePeriod = this.options.gracePeriod\n ? this.dateTimeProvider.isDurationLike(this.options.gracePeriod)\n ? this.options.gracePeriod\n : this.options.gracePeriod(...args)\n : undefined;\n\n if (gracePeriod) {\n await this.provider.set(\n key,\n `${this.id},${lock.createdAt.toISOString()},${this.dateTimeProvider.nowISOString()}`,\n false,\n this.dateTimeProvider.duration(gracePeriod).as(\"milliseconds\"),\n );\n } else {\n await this.provider.del(key);\n }\n }\n\n protected async wait(key: string, maxDuration: DurationLike): Promise<void> {\n this.log.debug(`Wait for lock '${key}' ...`);\n\n await this.topicLockEnd.wait({\n filter: (message) => message.payload.name === key,\n timeout: maxDuration,\n });\n\n this.log.debug(`Wait for lock '${key}' OK`);\n }\n\n protected key(...args: Parameters<TFunc>) {\n let base = \"\";\n\n if (this.options.name) {\n if (typeof this.options.name === \"string\") {\n base = this.options.name;\n } else {\n base = this.options.name(...args);\n }\n } else {\n base = `${this.config.service.name}:${this.config.propertyKey}`;\n }\n\n return `${this.settings.prefixKey}${base}`;\n }\n\n protected parse(value: string): LockResult {\n const [id, createdAtStr, endedAtStr] = value.split(\",\");\n const createdAt = this.dateTimeProvider.of(createdAtStr);\n const endedAt = endedAtStr\n ? this.dateTimeProvider.of(endedAtStr)\n : undefined;\n\n return {\n id,\n createdAt,\n endedAt,\n };\n }\n}\n\nexport interface LockResult {\n id: string;\n createdAt: DateTime;\n endedAt?: DateTime;\n response?: string;\n}\n","import { $module } from \"alepha\";\nimport { MemoryTopicProvider } from \"alepha/topic\";\nimport { LockProvider } from \"./providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"./providers/LockTopicProvider.ts\";\nimport { MemoryLockProvider } from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$lock.ts\";\nexport * from \"./providers/LockProvider.ts\";\nexport * from \"./providers/LockTopicProvider.ts\";\nexport * from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface Hooks {\n /**\n * Fires when a lock is successfully acquired.\n */\n \"lock:acquired\": {\n name: string;\n id: string;\n maxDurationMs: number;\n };\n /**\n * Fires when a lock is released (handler completed or threw).\n */\n \"lock:released\": {\n name: string;\n id: string;\n heldMs: number;\n };\n /**\n * Fires when a lock acquisition contends with another holder.\n * Emitted whether the caller eventually acquires (`wait: true`) or fails.\n */\n \"lock:contended\": {\n name: string;\n id: string;\n };\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Resource locking for distributed systems.\n *\n * **Features:**\n * - Distributed locks with timeout\n * - Time-based lock expiration\n * - Automatic release on scope exit\n * - Distributed coordination via Redis\n * - Providers: Memory (dev), Redis (production)\n *\n * @module alepha.lock\n */\nexport const AlephaLock = $module({\n name: \"alepha.lock\",\n services: [LockProvider, LockTopicProvider],\n variants: [MemoryLockProvider],\n register: (alepha) =>\n alepha\n .with({\n optional: true,\n provide: LockTopicProvider,\n use: MemoryTopicProvider,\n })\n .with({\n optional: true,\n provide: LockProvider,\n use: MemoryLockProvider,\n }),\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/errors/LockAcquireError.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/index.ts"],"sourcesContent":["/**\n * Store Provider Interface\n */\nexport abstract class LockProvider {\n /**\n * Set the string value of a key.\n *\n * @param key The key of the value to set.\n * @param value The value to set.\n * @param nx If set to true, the key will only be set if it does not already exist.\n * @param px Set the specified expire time, in milliseconds.\n */\n public abstract set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string>;\n\n /**\n * Remove the specified keys.\n *\n * @param keys The keys to delete.\n */\n public abstract del(...keys: string[]): Promise<void>;\n}\n","import { TopicProvider } from \"alepha/topic\";\n\nexport abstract class LockTopicProvider extends TopicProvider {}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type Timeout } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport type { LockProvider } from \"./LockProvider.ts\";\n\n/**\n * A simple in-memory store provider.\n */\nexport class MemoryLockProvider implements LockProvider {\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly log = $logger();\n\n /**\n * The in-memory store.\n */\n protected store: Record<string, string> = {};\n\n /**\n * Timeouts used to expire keys.\n */\n protected storeTimeout: Record<string, Timeout> = {};\n\n public async set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string> {\n if (nx && this.store[key] != null) {\n return this.store[key];\n }\n\n if (px) {\n this.ttl(key, px);\n }\n\n this.store[key] = value;\n\n return this.store[key];\n }\n\n public async del(...keys: string[]): Promise<void> {\n for (const key of keys) {\n delete this.store[key];\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n }\n }\n\n protected ttl(key: string, ms: number): void {\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n\n this.storeTimeout[key] = this.dateTimeProvider.createTimeout(() => {\n delete this.store[key];\n delete this.storeTimeout[key];\n }, ms);\n }\n}\n","import { AlephaError } from \"alepha\";\n\nexport class LockAcquireError extends AlephaError {\n constructor(name: string) {\n super(`$lock: could not acquire lock '${name}'`);\n }\n}\n","import {\n $atom,\n $context,\n $inject,\n $state,\n AlephaError,\n type AsyncFn,\n createMiddleware,\n type Middleware,\n Primitive,\n type Static,\n z,\n} from \"alepha\";\nimport {\n type DateTime,\n DateTimeProvider,\n type DurationLike,\n} from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { $topic } from \"alepha/topic\";\nimport { LockAcquireError } from \"../errors/LockAcquireError.ts\";\nimport { LockProvider } from \"../providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"../providers/LockTopicProvider.ts\";\n\n/**\n * Distributed lock middleware for `use` arrays in `$action`, `$job`, `$page`, `$pipeline`.\n *\n * Acquires a distributed lock before the handler runs and releases it after completion.\n * Throws `LockAcquireError` if the lock cannot be acquired (unless `wait: true`).\n *\n * ```ts\n * processOrder = $action({\n * use: [$lock({ name: \"process-order\" })],\n * handler: async ({ body }) => { ... },\n * });\n * ```\n */\nexport const $lock = (options: LockMiddlewareOptions): Middleware => {\n const { alepha } = $context();\n const lockProvider = alepha.inject(LockProvider);\n const dateTimeProvider = alepha.inject(DateTimeProvider);\n\n return createMiddleware({\n name: \"$lock\",\n options: options as unknown as Record<string, unknown>,\n handler: ({ alepha, next }) => {\n const maxDurationMs = dateTimeProvider\n .duration(options.maxDuration ?? [5, \"minutes\"])\n .asMilliseconds();\n\n return async (...args: any[]) => {\n // Per-invocation identity. The pipeline composes this middleware once\n // and memoizes the wrapped function, so an id created in the handler\n // body (outside this closure) would be shared by every concurrent\n // invocation — `SET NX GET` would then hand each caller back that same\n // shared id, and every one would read `lockId === id` and enter the\n // critical section together. Generating it here, per call, is what makes\n // mutual exclusion actually hold within a single process.\n const id = crypto.randomUUID();\n const name =\n typeof options.name === \"function\"\n ? options.name(...args)\n : options.name;\n if (!name) {\n throw new AlephaError(\n \"$lock middleware requires a name option (no class context available)\",\n );\n }\n\n const value = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n\n const [lockId, _createdAtStr, endedAtStr] = value.split(\",\");\n\n // Lock already ended (grace period active)\n if (endedAtStr) {\n await alepha.events.emit(\"lock:contended\", { name, id });\n throw new LockAcquireError(name);\n }\n\n // Lock held by someone else\n if (lockId !== id) {\n await alepha.events.emit(\"lock:contended\", { name, id });\n if (options.wait) {\n // Poll until lock is released\n const start = dateTimeProvider.nowMillis();\n while (dateTimeProvider.nowMillis() - start < maxDurationMs) {\n await dateTimeProvider.wait(500);\n const current = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n const [currentId] = current.split(\",\");\n if (currentId === id) {\n break;\n }\n }\n // Check if we got the lock\n const final = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n const [finalId] = final.split(\",\");\n if (finalId !== id) {\n throw new LockAcquireError(name);\n }\n } else {\n throw new LockAcquireError(name);\n }\n }\n\n // We hold the lock — execute handler\n const acquiredAt = dateTimeProvider.nowMillis();\n await alepha.events.emit(\"lock:acquired\", {\n name,\n id,\n maxDurationMs,\n });\n try {\n return await next(...args);\n } finally {\n await lockProvider.del(name);\n await alepha.events.emit(\"lock:released\", {\n name,\n id,\n heldMs: dateTimeProvider.nowMillis() - acquiredAt,\n });\n }\n };\n },\n });\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Options for $lock in middleware mode (no handler).\n */\nexport interface LockMiddlewareOptions {\n /**\n * Lock key name. Required in middleware mode (no class context available).\n * Can be a static string or a function that derives the key from handler args.\n */\n name: string | ((...args: any[]) => string);\n\n /**\n * Whether to wait for the lock to become available.\n *\n * @default false\n */\n wait?: boolean;\n\n /**\n * Maximum duration the lock can be held before automatic expiration.\n *\n * @default [5, \"minutes\"]\n */\n maxDuration?: DurationLike;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface LockPrimitiveOptions<TFunc extends AsyncFn> {\n /**\n * The function to execute when the lock is successfully acquired.\n *\n * This function:\n * - Only executes on the instance that successfully acquires the lock\n * - Has exclusive access to the protected resource during execution\n * - Should contain the critical section logic that must not run concurrently\n * - Can be async and perform any operations needed\n * - Will automatically release the lock upon completion or error\n * - Has access to the full Alepha dependency injection container\n *\n * **Handler Design Guidelines**:\n * - Keep critical sections as short as possible to minimize lock contention\n * - Include proper error handling to ensure locks are released\n * - Use timeouts for external operations to prevent deadlocks\n * - Log important operations for debugging and monitoring\n * - Consider idempotency for handlers that might be retried\n *\n * @param ...args - The arguments passed to the lock execution\n * @returns Promise that resolves when the protected operation is complete\n *\n * @example\n * ```ts\n * handler: async (batchId: string) => {\n * console.log(`Processing batch ${batchId} - only one instance will run this`);\n *\n * const batch = await this.getBatchData(batchId);\n * const results = await this.processBatchItems(batch.items);\n * await this.saveBatchResults(batchId, results);\n *\n * console.log(`Batch ${batchId} completed successfully`);\n * }\n * ```\n */\n handler: TFunc;\n\n /**\n * Whether the lock should wait for other instances to complete before giving up.\n *\n * **wait = false (default)**:\n * - Non-blocking behavior - if lock is held, immediately return without executing\n * - Perfect for scheduled tasks where you only want one execution per trigger\n * - Use when multiple triggers are acceptable but concurrent execution is not\n * - Examples: periodic cleanup, cron jobs, background maintenance\n *\n * **wait = true**:\n * - Blocking behavior - wait for the current lock holder to finish\n * - All instances will eventually execute (one after another)\n * - Perfect for initialization tasks where all instances need the work completed\n * - Examples: database migrations, cache warming, resource initialization\n *\n * **Trade-offs**:\n * - Non-waiting: Better performance, may miss executions if timing is off\n * - Waiting: Guaranteed execution order, slower overall throughput\n *\n * @default false\n *\n * @example\n * ```ts\n * // Scheduled task - don't wait, just skip if already running\n * scheduledCleanup = $lock({\n * wait: false, // Skip if cleanup already running\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Migration - wait for completion before proceeding\n * migration = $lock({\n * wait: true, // All instances wait for migration to complete\n * handler: async () => { } // perform migration\n * });\n * ```\n */\n wait?: boolean;\n\n /**\n * The unique identifier for the lock.\n *\n * Can be either:\n * - **Static string**: A fixed identifier for the lock\n * - **Dynamic function**: A function that generates the lock key based on arguments\n *\n * **Dynamic Lock Keys**:\n * - Enable per-resource locking (e.g., per-user, per-file, per-product)\n * - Allow fine-grained concurrency control\n * - Prevent unnecessary blocking between unrelated operations\n *\n * **Key Design Guidelines**:\n * - Use descriptive names that indicate the protected resource\n * - Include relevant identifiers for dynamic keys\n * - Keep keys reasonably short but unique\n * - Consider using hierarchical naming (e.g., \"service:operation:resource\")\n *\n * If not provided, defaults to `{serviceName}:{propertyKey}`.\n *\n * @example \"user-migration\"\n * @example \"daily-report-generation\"\n * @example (userId: string) => `user-profile-update:${userId}`\n * @example (fileId: string, operation: string) => `file-${operation}:${fileId}`\n *\n * @example\n * ```ts\n * // Static lock key - all instances compete for the same lock\n * globalCleanup = $lock({\n * name: \"system-cleanup\",\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Dynamic lock key - per-user locks, users don't block each other\n * updateUserProfile = $lock({\n * name: (userId: string) => `user-update:${userId}`,\n * handler: async (userId: string, data: UserData) => {\n * // Only one update per user at a time, but different users can update concurrently\n * }\n * });\n * ```\n */\n name?: string | ((...args: Parameters<TFunc>) => string);\n\n /**\n * Maximum duration the lock can be held before it expires automatically.\n *\n * This prevents deadlocks when a process dies while holding a lock or when\n * operations take longer than expected. The lock will be automatically released\n * after this duration, allowing other instances to proceed.\n *\n * **Duration Guidelines**:\n * - Set based on expected operation duration plus safety margin\n * - Too short: Operations may be interrupted by early expiration\n * - Too long: Failed processes block others for extended periods\n * - Consider worst-case scenarios and external dependency timeouts\n *\n * **Typical Values**:\n * - Quick operations: 30 seconds - 2 minutes\n * - Database operations: 5 - 15 minutes\n * - File processing: 10 - 30 minutes\n * - Large migrations: 30 minutes - 2 hours\n *\n * @default [5, \"minutes\"]\n *\n * @example [30, \"seconds\"] // Quick operations\n * @example [10, \"minutes\"] // Database migrations\n * @example [1, \"hour\"] // Long-running batch jobs\n *\n * @example\n * ```ts\n * quickTask = $lock({\n * maxDuration: [2, \"minutes\"], // Quick timeout for fast operations\n * handler: async () => { } // perform quick task\n * });\n *\n * heavyProcessing = $lock({\n * maxDuration: [30, \"minutes\"], // Longer timeout for heavy work\n * handler: async () => { } // perform heavy processing\n * });\n * ```\n */\n maxDuration?: DurationLike;\n\n /**\n * Additional time to keep the lock active after the handler completes successfully.\n *\n * This provides a \"cooling off\" period that can be useful for:\n * - Preventing immediate re-execution of the same operation\n * - Giving time for related systems to process the results\n * - Avoiding race conditions with dependent operations\n * - Providing a buffer for cleanup operations\n *\n * Can be either:\n * - **Static duration**: Fixed grace period for all executions\n * - **Dynamic function**: Grace period determined by execution arguments\n * - **undefined**: No grace period, lock released immediately after completion\n *\n * **Grace Period Use Cases**:\n * - File processing: Prevent immediate reprocessing of uploaded files\n * - Cache updates: Allow time for cache propagation\n * - Batch operations: Prevent overlapping batch processing\n * - External API calls: Respect rate limiting requirements\n *\n * @default undefined (no grace period)\n *\n * @example [5, \"minutes\"] // Fixed 5-minute grace period\n * @example [30, \"seconds\"] // Short grace for quick operations\n * @example (userId: string) => userId.startsWith(\"premium\") ? [10, \"minutes\"] : [2, \"minutes\"]\n *\n * @example\n * ```ts\n * fileProcessor = $lock({\n * gracePeriod: [10, \"minutes\"], // Prevent reprocessing same file immediately\n * handler: async (filePath: string) => {\n * await this.processFile(filePath);\n * }\n * });\n *\n * userOperation = $lock({\n * gracePeriod: (userId: string, operation: string) => {\n * // Dynamic grace based on operation type\n * return operation === 'migration' ? [30, \"minutes\"] : [5, \"minutes\"];\n * },\n * handler: async (userId: string, operation: string) => {\n * await this.performUserOperation(userId, operation);\n * }\n * });\n * ```\n */\n gracePeriod?:\n | ((...args: Parameters<TFunc>) => DurationLike | undefined)\n | DurationLike;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Lock configuration atom.\n */\nexport const lockOptions = $atom({\n name: \"alepha.lock.options\",\n schema: z.object({\n prefixKey: z.text({\n default: \"\",\n description: \"Prefix for all lock keys.\",\n }),\n }),\n default: {\n prefixKey: \"\",\n },\n});\n\nexport type LockAtomOptions = Static<typeof lockOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [lockOptions.key]: LockAtomOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class LockPrimitive<TFunc extends AsyncFn> extends Primitive<\n LockPrimitiveOptions<TFunc>\n> {\n protected readonly log = $logger();\n protected readonly provider = $inject(LockProvider);\n protected readonly settings = $state(lockOptions);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n /**\n * Lazy-initialized UUID to avoid calling crypto.randomUUID() in global scope.\n * Cloudflare Workers doesn't allow random value generation during initialization.\n */\n protected _id?: string;\n protected get id(): string {\n if (!this._id) {\n this._id = crypto.randomUUID();\n }\n return this._id;\n }\n\n public readonly maxDuration = this.dateTimeProvider.duration(\n this.options.maxDuration ?? [5, \"minutes\"],\n );\n\n protected readonly topicLockEnd = $topic({\n name: `${this.settings.prefixKey}lock:end`,\n provider: LockTopicProvider,\n schema: {\n payload: z.object({\n name: z.text(),\n }),\n },\n });\n\n public async run(...args: Parameters<TFunc>): Promise<void> {\n const key = this.key(...args);\n const handler = this.options.handler;\n\n const lock = await this.lock(key);\n if (lock.endedAt) {\n return;\n }\n\n if (lock.id !== this.id) {\n if (this.options.wait) {\n // Poll until the lock is released, then re-attempt\n const start = this.dateTimeProvider.nowMillis();\n const maxMs = this.maxDuration.as(\"milliseconds\");\n let acquired = false;\n while (this.dateTimeProvider.nowMillis() - start < maxMs) {\n await this.dateTimeProvider.wait(500);\n const current = await this.lock(key);\n if (current.id === this.id || !current.id || current.endedAt) {\n acquired = true;\n break;\n }\n }\n if (acquired) {\n return this.run(...args);\n }\n this.log.warn(`Lock wait timeout for '${key}', giving up`);\n }\n\n return;\n }\n\n this.log.debug(`Lock '${key}' ...`);\n\n try {\n await handler(...args);\n } finally {\n await this.topicLockEnd.publish({\n name: key,\n });\n\n await this.setGracePeriod(key, lock, ...args);\n\n this.log.debug(`Lock '${key}' OK`);\n }\n }\n\n /**\n * Set the lock for the given key.\n */\n protected async lock(key: string): Promise<LockResult> {\n const value = await this.provider.set(\n key,\n `${this.id},${this.dateTimeProvider.nowISOString()}`,\n true,\n this.maxDuration.as(\"milliseconds\"),\n );\n\n return this.parse(value);\n }\n\n protected async setGracePeriod(\n key: string,\n lock: LockResult,\n ...args: Parameters<TFunc>\n ): Promise<void> {\n const gracePeriod = this.options.gracePeriod\n ? this.dateTimeProvider.isDurationLike(this.options.gracePeriod)\n ? this.options.gracePeriod\n : this.options.gracePeriod(...args)\n : undefined;\n\n if (gracePeriod) {\n await this.provider.set(\n key,\n `${this.id},${lock.createdAt.toISOString()},${this.dateTimeProvider.nowISOString()}`,\n false,\n this.dateTimeProvider.duration(gracePeriod).as(\"milliseconds\"),\n );\n } else {\n await this.provider.del(key);\n }\n }\n\n protected async wait(key: string, maxDuration: DurationLike): Promise<void> {\n this.log.debug(`Wait for lock '${key}' ...`);\n\n await this.topicLockEnd.wait({\n filter: (message) => message.payload.name === key,\n timeout: maxDuration,\n });\n\n this.log.debug(`Wait for lock '${key}' OK`);\n }\n\n protected key(...args: Parameters<TFunc>) {\n let base = \"\";\n\n if (this.options.name) {\n if (typeof this.options.name === \"string\") {\n base = this.options.name;\n } else {\n base = this.options.name(...args);\n }\n } else {\n base = `${this.config.service.name}:${this.config.propertyKey}`;\n }\n\n return `${this.settings.prefixKey}${base}`;\n }\n\n protected parse(value: string): LockResult {\n const [id, createdAtStr, endedAtStr] = value.split(\",\");\n const createdAt = this.dateTimeProvider.of(createdAtStr);\n const endedAt = endedAtStr\n ? this.dateTimeProvider.of(endedAtStr)\n : undefined;\n\n return {\n id,\n createdAt,\n endedAt,\n };\n }\n}\n\nexport interface LockResult {\n id: string;\n createdAt: DateTime;\n endedAt?: DateTime;\n response?: string;\n}\n","import { $module } from \"alepha\";\nimport { MemoryTopicProvider } from \"alepha/topic\";\nimport { LockProvider } from \"./providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"./providers/LockTopicProvider.ts\";\nimport { MemoryLockProvider } from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./errors/LockAcquireError.ts\";\nexport * from \"./primitives/$lock.ts\";\nexport * from \"./providers/LockProvider.ts\";\nexport * from \"./providers/LockTopicProvider.ts\";\nexport * from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface Hooks {\n /**\n * Fires when a lock is successfully acquired.\n */\n \"lock:acquired\": {\n name: string;\n id: string;\n maxDurationMs: number;\n };\n /**\n * Fires when a lock is released (handler completed or threw).\n */\n \"lock:released\": {\n name: string;\n id: string;\n heldMs: number;\n };\n /**\n * Fires when a lock acquisition contends with another holder.\n * Emitted whether the caller eventually acquires (`wait: true`) or fails.\n */\n \"lock:contended\": {\n name: string;\n id: string;\n };\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Resource locking for distributed systems.\n *\n * **Features:**\n * - Distributed locks with timeout\n * - Time-based lock expiration\n * - Automatic release on scope exit\n * - Distributed coordination via Redis\n * - Providers: Memory (dev), Redis (production)\n *\n * @module alepha.lock\n */\nexport const AlephaLock = $module({\n name: \"alepha.lock\",\n services: [LockProvider, LockTopicProvider],\n variants: [MemoryLockProvider],\n register: (alepha) =>\n alepha\n .with({\n optional: true,\n provide: LockTopicProvider,\n use: MemoryTopicProvider,\n })\n .with({\n optional: true,\n provide: LockProvider,\n use: MemoryLockProvider,\n }),\n});\n"],"mappings":";;;;;;;;AAGA,IAAsB,eAAtB,MAAmC,CAsBnC;;;ACvBA,IAAsB,oBAAtB,cAAgD,cAAc,CAAC;;;;;;ACM/D,IAAa,qBAAb,MAAwD;CACtD,mBAAsC,QAAQ,gBAAgB;CAC9D,MAAyB,QAAQ;;;;CAKjC,QAA0C,CAAC;;;;CAK3C,eAAkD,CAAC;CAEnD,MAAa,IACX,KACA,OACA,IACA,IACiB;EACjB,IAAI,MAAM,KAAK,MAAM,QAAQ,MAC3B,OAAO,KAAK,MAAM;EAGpB,IAAI,IACF,KAAK,IAAI,KAAK,EAAE;EAGlB,KAAK,MAAM,OAAO;EAElB,OAAO,KAAK,MAAM;CACpB;CAEA,MAAa,IAAI,GAAG,MAA+B;EACjD,KAAK,MAAM,OAAO,MAAM;GACtB,OAAO,KAAK,MAAM;GAClB,IAAI,KAAK,aAAa,QAAQ,MAAM;IAClC,KAAK,aAAa,IAAI,CAAC,MAAM;IAC7B,OAAO,KAAK,aAAa;GAC3B;EACF;CACF;CAEA,IAAc,KAAa,IAAkB;EAC3C,IAAI,KAAK,aAAa,QAAQ,MAAM;GAClC,KAAK,aAAa,IAAI,CAAC,MAAM;GAC7B,OAAO,KAAK,aAAa;EAC3B;EAEA,KAAK,aAAa,OAAO,KAAK,iBAAiB,oBAAoB;GACjE,OAAO,KAAK,MAAM;GAClB,OAAO,KAAK,aAAa;EAC3B,GAAG,EAAE;CACP;AACF;;;AC5DA,IAAa,mBAAb,cAAsC,YAAY;CAChD,YAAY,MAAc;EACxB,MAAM,kCAAkC,KAAK,EAAE;CACjD;AACF;;;;;;;;;;;;;;;;AC+BA,MAAa,SAAS,YAA+C;CACnE,MAAM,EAAE,WAAW,SAAS;CAC5B,MAAM,eAAe,OAAO,OAAO,YAAY;CAC/C,MAAM,mBAAmB,OAAO,OAAO,gBAAgB;CAEvD,OAAO,iBAAiB;EACtB,MAAM;EACG;EACT,UAAU,EAAE,QAAQ,WAAW;GAC7B,MAAM,gBAAgB,iBACnB,SAAS,QAAQ,eAAe,CAAC,GAAG,SAAS,CAAC,CAAC,CAC/C,eAAe;GAElB,OAAO,OAAO,GAAG,SAAgB;IAQ/B,MAAM,KAAK,OAAO,WAAW;IAC7B,MAAM,OACJ,OAAO,QAAQ,SAAS,aACpB,QAAQ,KAAK,GAAG,IAAI,IACpB,QAAQ;IACd,IAAI,CAAC,MACH,MAAM,IAAI,YACR,sEACF;IAUF,MAAM,CAAC,QAAQ,eAAe,eAAc,MAPxB,aAAa,IAC/B,MACA,GAAG,GAAG,GAAG,iBAAiB,aAAa,KACvC,MACA,aACF,EAAA,CAEkD,MAAM,GAAG;IAG3D,IAAI,YAAY;KACd,MAAM,OAAO,OAAO,KAAK,kBAAkB;MAAE;MAAM;KAAG,CAAC;KACvD,MAAM,IAAI,iBAAiB,IAAI;IACjC;IAGA,IAAI,WAAW,IAAI;KACjB,MAAM,OAAO,OAAO,KAAK,kBAAkB;MAAE;MAAM;KAAG,CAAC;KACvD,IAAI,QAAQ,MAAM;MAEhB,MAAM,QAAQ,iBAAiB,UAAU;MACzC,OAAO,iBAAiB,UAAU,IAAI,QAAQ,eAAe;OAC3D,MAAM,iBAAiB,KAAK,GAAG;OAO/B,MAAM,CAAC,cAAa,MANE,aAAa,IACjC,MACA,GAAG,GAAG,GAAG,iBAAiB,aAAa,KACvC,MACA,aACF,EAAA,CAC4B,MAAM,GAAG;OACrC,IAAI,cAAc,IAChB;MAEJ;MAQA,MAAM,CAAC,YAAW,MANE,aAAa,IAC/B,MACA,GAAG,GAAG,GAAG,iBAAiB,aAAa,KACvC,MACA,aACF,EAAA,CACwB,MAAM,GAAG;MACjC,IAAI,YAAY,IACd,MAAM,IAAI,iBAAiB,IAAI;KAEnC,OACE,MAAM,IAAI,iBAAiB,IAAI;IAEnC;IAGA,MAAM,aAAa,iBAAiB,UAAU;IAC9C,MAAM,OAAO,OAAO,KAAK,iBAAiB;KACxC;KACA;KACA;IACF,CAAC;IACD,IAAI;KACF,OAAO,MAAM,KAAK,GAAG,IAAI;IAC3B,UAAU;KACR,MAAM,aAAa,IAAI,IAAI;KAC3B,MAAM,OAAO,OAAO,KAAK,iBAAiB;MACxC;MACA;MACA,QAAQ,iBAAiB,UAAU,IAAI;KACzC,CAAC;IACH;GACF;EACF;CACF,CAAC;AACH;;;;AAsPA,MAAa,cAAc,MAAM;CAC/B,MAAM;CACN,QAAQ,EAAE,OAAO,EACf,WAAW,EAAE,KAAK;EAChB,SAAS;EACT,aAAa;CACf,CAAC,EACH,CAAC;CACD,SAAS,EACP,WAAW,GACb;AACF,CAAC;AAYD,IAAa,gBAAb,cAA0D,UAExD;CACA,MAAyB,QAAQ;CACjC,WAA8B,QAAQ,YAAY;CAClD,WAA8B,OAAO,WAAW;CAChD,mBAAsC,QAAQ,gBAAgB;;;;;CAM9D;CACA,IAAc,KAAa;EACzB,IAAI,CAAC,KAAK,KACR,KAAK,MAAM,OAAO,WAAW;EAE/B,OAAO,KAAK;CACd;CAEA,cAA8B,KAAK,iBAAiB,SAClD,KAAK,QAAQ,eAAe,CAAC,GAAG,SAAS,CAC3C;CAEA,eAAkC,OAAO;EACvC,MAAM,GAAG,KAAK,SAAS,UAAU;EACjC,UAAU;EACV,QAAQ,EACN,SAAS,EAAE,OAAO,EAChB,MAAM,EAAE,KAAK,EACf,CAAC,EACH;CACF,CAAC;CAED,MAAa,IAAI,GAAG,MAAwC;EAC1D,MAAM,MAAM,KAAK,IAAI,GAAG,IAAI;EAC5B,MAAM,UAAU,KAAK,QAAQ;EAE7B,MAAM,OAAO,MAAM,KAAK,KAAK,GAAG;EAChC,IAAI,KAAK,SACP;EAGF,IAAI,KAAK,OAAO,KAAK,IAAI;GACvB,IAAI,KAAK,QAAQ,MAAM;IAErB,MAAM,QAAQ,KAAK,iBAAiB,UAAU;IAC9C,MAAM,QAAQ,KAAK,YAAY,GAAG,cAAc;IAChD,IAAI,WAAW;IACf,OAAO,KAAK,iBAAiB,UAAU,IAAI,QAAQ,OAAO;KACxD,MAAM,KAAK,iBAAiB,KAAK,GAAG;KACpC,MAAM,UAAU,MAAM,KAAK,KAAK,GAAG;KACnC,IAAI,QAAQ,OAAO,KAAK,MAAM,CAAC,QAAQ,MAAM,QAAQ,SAAS;MAC5D,WAAW;MACX;KACF;IACF;IACA,IAAI,UACF,OAAO,KAAK,IAAI,GAAG,IAAI;IAEzB,KAAK,IAAI,KAAK,0BAA0B,IAAI,aAAa;GAC3D;GAEA;EACF;EAEA,KAAK,IAAI,MAAM,SAAS,IAAI,MAAM;EAElC,IAAI;GACF,MAAM,QAAQ,GAAG,IAAI;EACvB,UAAU;GACR,MAAM,KAAK,aAAa,QAAQ,EAC9B,MAAM,IACR,CAAC;GAED,MAAM,KAAK,eAAe,KAAK,MAAM,GAAG,IAAI;GAE5C,KAAK,IAAI,MAAM,SAAS,IAAI,KAAK;EACnC;CACF;;;;CAKA,MAAgB,KAAK,KAAkC;EACrD,MAAM,QAAQ,MAAM,KAAK,SAAS,IAChC,KACA,GAAG,KAAK,GAAG,GAAG,KAAK,iBAAiB,aAAa,KACjD,MACA,KAAK,YAAY,GAAG,cAAc,CACpC;EAEA,OAAO,KAAK,MAAM,KAAK;CACzB;CAEA,MAAgB,eACd,KACA,MACA,GAAG,MACY;EACf,MAAM,cAAc,KAAK,QAAQ,cAC7B,KAAK,iBAAiB,eAAe,KAAK,QAAQ,WAAW,IAC3D,KAAK,QAAQ,cACb,KAAK,QAAQ,YAAY,GAAG,IAAI,IAClC,KAAA;EAEJ,IAAI,aACF,MAAM,KAAK,SAAS,IAClB,KACA,GAAG,KAAK,GAAG,GAAG,KAAK,UAAU,YAAY,EAAE,GAAG,KAAK,iBAAiB,aAAa,KACjF,OACA,KAAK,iBAAiB,SAAS,WAAW,CAAC,CAAC,GAAG,cAAc,CAC/D;OAEA,MAAM,KAAK,SAAS,IAAI,GAAG;CAE/B;CAEA,MAAgB,KAAK,KAAa,aAA0C;EAC1E,KAAK,IAAI,MAAM,kBAAkB,IAAI,MAAM;EAE3C,MAAM,KAAK,aAAa,KAAK;GAC3B,SAAS,YAAY,QAAQ,QAAQ,SAAS;GAC9C,SAAS;EACX,CAAC;EAED,KAAK,IAAI,MAAM,kBAAkB,IAAI,KAAK;CAC5C;CAEA,IAAc,GAAG,MAAyB;EACxC,IAAI,OAAO;EAEX,IAAI,KAAK,QAAQ,MACf,IAAI,OAAO,KAAK,QAAQ,SAAS,UAC/B,OAAO,KAAK,QAAQ;OAEpB,OAAO,KAAK,QAAQ,KAAK,GAAG,IAAI;OAGlC,OAAO,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG,KAAK,OAAO;EAGpD,OAAO,GAAG,KAAK,SAAS,YAAY;CACtC;CAEA,MAAgB,OAA2B;EACzC,MAAM,CAAC,IAAI,cAAc,cAAc,MAAM,MAAM,GAAG;EAMtD,OAAO;GACL;GACA,WAPgB,KAAK,iBAAiB,GAAG,YAOjC;GACR,SAPc,aACZ,KAAK,iBAAiB,GAAG,UAAU,IACnC,KAAA;EAMJ;CACF;AACF;;;;;;;;;;;;;;;AC3fA,MAAa,aAAa,QAAQ;CAChC,MAAM;CACN,UAAU,CAAC,cAAc,iBAAiB;CAC1C,UAAU,CAAC,kBAAkB;CAC7B,WAAW,WACT,OACG,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;CACP,CAAC,CAAC,CACD,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;CACP,CAAC;AACP,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import { LockProvider } from "alepha/lock";
2
2
  import { RedisProvider } from "alepha/redis";
3
-
4
3
  //#region ../../src/lock/redis/providers/RedisLockProvider.d.ts
5
4
  declare class RedisLockProvider implements LockProvider {
6
5
  protected readonly log: import("alepha/logger").Logger;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/lock/redis/providers/RedisLockProvider.ts","../../../src/lock/redis/index.ts"],"mappings":";;;;cAKa,iBAAA,YAA6B,YAAA;EAAA,mBACrB,GAAA,0BAAG,MAAA;EAAA,mBACH,aAAA,EAAa,aAAA;EAEnB,GAAA,CACX,GAAA,UACA,KAAA,UACA,EAAA,YACA,EAAA,YACC,OAAA;EAqBU,GAAA,IAAO,IAAA,aAAiB,OAAA;AAAA;;;;;;AA9BvC;;;cCYa,eAAA,mBAAe,OAAA,kBAAA,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/lock/redis/providers/RedisLockProvider.ts","../../../src/lock/redis/index.ts"],"mappings":";;;cAKa,6BAA6B;qBACrB,6BAAG;qBACH,eAAa;EAEnB,IACX,aACA,eACA,cACA,cACC;EAqBU,OAAO,iBAAiB;;;;;;;;;;cClB1B,kCAAe,yBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/lock/redis/providers/RedisLockProvider.ts","../../../src/lock/redis/index.ts"],"sourcesContent":["import { $inject } from \"alepha\";\nimport type { LockProvider } from \"alepha/lock\";\nimport { $logger } from \"alepha/logger\";\nimport { RedisProvider, type RedisSetOptions } from \"alepha/redis\";\n\nexport class RedisLockProvider implements LockProvider {\n protected readonly log = $logger();\n protected readonly redisProvider = $inject(RedisProvider);\n\n public async set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string> {\n const options: RedisSetOptions = {\n GET: true, // all the secrets of $lock is based on this\n };\n\n if (px) {\n options.expiration = {\n type: \"PX\",\n value: px,\n };\n }\n\n if (nx) {\n options.condition = \"NX\";\n }\n\n const resp = await this.redisProvider.set(key, value, options);\n\n return resp.toString(\"utf-8\");\n }\n\n public async del(...keys: string[]): Promise<void> {\n await this.redisProvider.del(keys);\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaLock, LockProvider, LockTopicProvider } from \"alepha/lock\";\nimport { RedisTopicProvider } from \"alepha/topic/redis\";\nimport { RedisLockProvider } from \"./providers/RedisLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/RedisLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Plugin for Alepha that provides a locking mechanism.\n *\n * @see {@link RedisLockProvider}\n * @module alepha.lock.redis\n */\nexport const AlephaLockRedis = $module({\n name: \"alepha.lock.redis\",\n services: [RedisLockProvider, RedisTopicProvider],\n register: (alepha: Alepha) =>\n alepha\n .with({\n optional: true,\n provide: LockTopicProvider,\n use: RedisTopicProvider,\n })\n .with({\n optional: true,\n provide: LockProvider,\n use: RedisLockProvider,\n })\n .with(AlephaLock),\n});\n"],"mappings":";;;;;;AAKA,IAAa,oBAAb,MAAuD;CACrD,MAAyB,QAAQ;CACjC,gBAAmC,QAAQ,aAAa;CAExD,MAAa,IACX,KACA,OACA,IACA,IACiB;EACjB,MAAM,UAA2B,EAC/B,KAAK,KACP;EAEA,IAAI,IACF,QAAQ,aAAa;GACnB,MAAM;GACN,OAAO;EACT;EAGF,IAAI,IACF,QAAQ,YAAY;EAKtB,QAAO,MAFY,KAAK,cAAc,IAAI,KAAK,OAAO,OAAO,GAEjD,SAAS,OAAO;CAC9B;CAEA,MAAa,IAAI,GAAG,MAA+B;EACjD,MAAM,KAAK,cAAc,IAAI,IAAI;CACnC;AACF;;;;;;;;;ACrBA,MAAa,kBAAkB,QAAQ;CACrC,MAAM;CACN,UAAU,CAAC,mBAAmB,kBAAkB;CAChD,WAAW,WACT,OACG,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;CACP,CAAC,EACA,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;CACP,CAAC,EACA,KAAK,UAAU;AACtB,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/lock/redis/providers/RedisLockProvider.ts","../../../src/lock/redis/index.ts"],"sourcesContent":["import { $inject } from \"alepha\";\nimport type { LockProvider } from \"alepha/lock\";\nimport { $logger } from \"alepha/logger\";\nimport { RedisProvider, type RedisSetOptions } from \"alepha/redis\";\n\nexport class RedisLockProvider implements LockProvider {\n protected readonly log = $logger();\n protected readonly redisProvider = $inject(RedisProvider);\n\n public async set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string> {\n const options: RedisSetOptions = {\n GET: true, // all the secrets of $lock is based on this\n };\n\n if (px) {\n options.expiration = {\n type: \"PX\",\n value: px,\n };\n }\n\n if (nx) {\n options.condition = \"NX\";\n }\n\n const resp = await this.redisProvider.set(key, value, options);\n\n return resp.toString(\"utf-8\");\n }\n\n public async del(...keys: string[]): Promise<void> {\n await this.redisProvider.del(keys);\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaLock, LockProvider, LockTopicProvider } from \"alepha/lock\";\nimport { RedisTopicProvider } from \"alepha/topic/redis\";\nimport { RedisLockProvider } from \"./providers/RedisLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/RedisLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Plugin for Alepha that provides a locking mechanism.\n *\n * @see {@link RedisLockProvider}\n * @module alepha.lock.redis\n */\nexport const AlephaLockRedis = $module({\n name: \"alepha.lock.redis\",\n services: [RedisLockProvider, RedisTopicProvider],\n register: (alepha: Alepha) =>\n alepha\n .with({\n optional: true,\n provide: LockTopicProvider,\n use: RedisTopicProvider,\n })\n .with({\n optional: true,\n provide: LockProvider,\n use: RedisLockProvider,\n })\n .with(AlephaLock),\n});\n"],"mappings":";;;;;;AAKA,IAAa,oBAAb,MAAuD;CACrD,MAAyB,QAAQ;CACjC,gBAAmC,QAAQ,aAAa;CAExD,MAAa,IACX,KACA,OACA,IACA,IACiB;EACjB,MAAM,UAA2B,EAC/B,KAAK,KACP;EAEA,IAAI,IACF,QAAQ,aAAa;GACnB,MAAM;GACN,OAAO;EACT;EAGF,IAAI,IACF,QAAQ,YAAY;EAKtB,QAAO,MAFY,KAAK,cAAc,IAAI,KAAK,OAAO,OAAO,EAAA,CAEjD,SAAS,OAAO;CAC9B;CAEA,MAAa,IAAI,GAAG,MAA+B;EACjD,MAAM,KAAK,cAAc,IAAI,IAAI;CACnC;AACF;;;;;;;;;ACrBA,MAAa,kBAAkB,QAAQ;CACrC,MAAM;CACN,UAAU,CAAC,mBAAmB,kBAAkB;CAChD,WAAW,WACT,OACG,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;CACP,CAAC,CAAC,CACD,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;CACP,CAAC,CAAC,CACD,KAAK,UAAU;AACtB,CAAC"}
@@ -1,35 +1,25 @@
1
1
  import { Alepha, KIND, LogLevel, LoggerInterface, Static } from "alepha";
2
2
  import { DateTimeProvider } from "alepha/datetime";
3
-
4
3
  //#region ../../src/logger/schemas/logEntrySchema.d.ts
5
- declare const logEntrySchema: import("typebox").TObject<{
6
- level: import("typebox").TUnsafe<"DEBUG" | "SILENT" | "TRACE" | "INFO" | "WARN" | "ERROR">;
7
- message: import("typebox").TString;
8
- service: import("typebox").TString;
9
- module: import("typebox").TString;
10
- context: import("typebox").TOptional<import("typebox").TString>;
11
- app: import("typebox").TOptional<import("typebox").TString>;
12
- data: import("typebox").TOptional<import("typebox").TAny>;
13
- timestamp: import("typebox").TNumber;
14
- }>;
4
+ declare const logEntrySchema: import("zod").ZodObject<{
5
+ level: import("zod").ZodEnum<{
6
+ DEBUG: "DEBUG";
7
+ ERROR: "ERROR";
8
+ INFO: "INFO";
9
+ SILENT: "SILENT";
10
+ TRACE: "TRACE";
11
+ WARN: "WARN";
12
+ }>;
13
+ message: import("zod").ZodString;
14
+ service: import("zod").ZodString;
15
+ module: import("zod").ZodString;
16
+ context: import("zod").ZodOptional<import("zod").ZodString>;
17
+ app: import("zod").ZodOptional<import("zod").ZodString>;
18
+ data: import("zod").ZodOptional<import("zod").ZodAny>;
19
+ timestamp: import("zod").ZodNumber;
20
+ }, import("zod/v4/core").$strip>;
15
21
  type LogEntry = Static<typeof logEntrySchema>;
16
22
  //#endregion
17
- //#region ../../src/logger/providers/LogFormatterProvider.d.ts
18
- declare abstract class LogFormatterProvider {
19
- abstract format(entry: LogEntry): string;
20
- }
21
- //#endregion
22
- //#region ../../src/logger/providers/JsonFormatterProvider.d.ts
23
- declare class JsonFormatterProvider extends LogFormatterProvider {
24
- format(entry: LogEntry): string;
25
- formatJsonError(error: Error): object;
26
- }
27
- //#endregion
28
- //#region ../../src/logger/providers/LogDestinationProvider.d.ts
29
- declare abstract class LogDestinationProvider {
30
- abstract write(message: string, entry: LogEntry): void;
31
- }
32
- //#endregion
33
23
  //#region ../../src/logger/providers/ConsoleColorProvider.d.ts
34
24
  declare class ConsoleColorProvider {
35
25
  static readonly COLORS: {
@@ -64,6 +54,11 @@ declare class ConsoleColorProvider {
64
54
  set(color: keyof typeof ConsoleColorProvider.COLORS, text: string, reset?: string): string;
65
55
  }
66
56
  //#endregion
57
+ //#region ../../src/logger/providers/LogFormatterProvider.d.ts
58
+ declare abstract class LogFormatterProvider {
59
+ abstract format(entry: LogEntry): string;
60
+ }
61
+ //#endregion
67
62
  //#region ../../src/logger/providers/PrettyFormatterProvider.d.ts
68
63
  declare class PrettyFormatterProvider extends LogFormatterProvider {
69
64
  protected color: ConsoleColorProvider;
@@ -79,6 +74,36 @@ declare class PrettyFormatterProvider extends LogFormatterProvider {
79
74
  protected formatError(error: Error): string;
80
75
  }
81
76
  //#endregion
77
+ //#region ../../src/logger/providers/CliFormatterProvider.d.ts
78
+ /**
79
+ * Compact formatter for CLI output.
80
+ *
81
+ * Renders `HH:MM:SS L message {json}` — a short clock time, a single-letter
82
+ * level colored by severity, the message, and any structured data appended
83
+ * dim. Deliberately drops the `<module.service>`, app name and context UUID
84
+ * that {@link PrettyFormatterProvider} prints: in an interactive CLI session
85
+ * those are noise. Use `pretty` (or `--verbose`) when you need them, `raw`
86
+ * when you want the bare message for piping, and `json` for aggregation.
87
+ */
88
+ declare class CliFormatterProvider extends PrettyFormatterProvider {
89
+ format(entry: LogEntry): string;
90
+ /**
91
+ * Short clock time without milliseconds (HH:MM:SS).
92
+ */
93
+ protected formatClockTime(timestamp: number): string;
94
+ }
95
+ //#endregion
96
+ //#region ../../src/logger/providers/JsonFormatterProvider.d.ts
97
+ declare class JsonFormatterProvider extends LogFormatterProvider {
98
+ format(entry: LogEntry): string;
99
+ formatJsonError(error: Error): object;
100
+ }
101
+ //#endregion
102
+ //#region ../../src/logger/providers/LogDestinationProvider.d.ts
103
+ declare abstract class LogDestinationProvider {
104
+ abstract write(message: string, entry: LogEntry): void;
105
+ }
106
+ //#endregion
82
107
  //#region ../../src/logger/providers/RawFormatterProvider.d.ts
83
108
  declare class RawFormatterProvider extends LogFormatterProvider {
84
109
  format(entry: LogEntry): string;
@@ -96,6 +121,7 @@ declare class Logger implements LoggerInterface {
96
121
  protected readonly jsonFormatter: JsonFormatterProvider;
97
122
  protected readonly prettyFormatter: PrettyFormatterProvider;
98
123
  protected readonly rawFormatter: RawFormatterProvider;
124
+ protected readonly cliFormatter: CliFormatterProvider;
99
125
  protected readonly destination: LogDestinationProvider;
100
126
  protected readonly dateTimeProvider: DateTimeProvider;
101
127
  protected readonly levels: Record<string, number>;
@@ -117,6 +143,17 @@ declare class Logger implements LoggerInterface {
117
143
  parseLevel(level: string, app: string): LogLevel;
118
144
  protected matchesPattern(moduleName: string, pattern: string): boolean;
119
145
  asLogLevel(something: string): LogLevel;
146
+ /**
147
+ * Whether a message at `level` would actually be emitted given the current
148
+ * active level (read live from state). Mirrors the threshold used by
149
+ * {@link log}: a level is enabled when it sits at or above the active one.
150
+ *
151
+ * @example
152
+ * // active level = INFO
153
+ * log.isLevelEnabled("DEBUG"); // false
154
+ * log.isLevelEnabled("WARN"); // true
155
+ */
156
+ isLevelEnabled(level: LogLevel): boolean;
120
157
  error(message: string, data?: unknown): void;
121
158
  warn(message: string, data?: unknown): void;
122
159
  info(message: string, data?: unknown): void;
@@ -169,13 +206,13 @@ declare class MemoryDestinationProvider extends LogDestinationProvider {
169
206
  };
170
207
  write(formatted: string, entry: LogEntry): void;
171
208
  get logs(): ({
172
- context?: string | undefined;
173
- app?: string | undefined;
174
- data?: any;
175
- level: "DEBUG" | "SILENT" | "TRACE" | "INFO" | "WARN" | "ERROR";
209
+ level: "DEBUG" | "ERROR" | "INFO" | "SILENT" | "TRACE" | "WARN";
176
210
  message: string;
177
211
  service: string;
178
212
  module: string;
213
+ context?: string | undefined;
214
+ app?: string | undefined;
215
+ data?: any;
179
216
  timestamp: number;
180
217
  } & {
181
218
  formatted: string;
@@ -191,6 +228,7 @@ declare class MemoryDestinationProvider extends LogDestinationProvider {
191
228
  * - Global logger access
192
229
  * - JSON format
193
230
  * - Pretty colored output
231
+ * - Compact CLI format
194
232
  * - Raw text format
195
233
  * - Console destination
196
234
  * - Memory destination (for devtools)
@@ -200,42 +238,16 @@ declare class MemoryDestinationProvider extends LogDestinationProvider {
200
238
  * @module alepha.logger
201
239
  */
202
240
  declare const AlephaLogger: import("alepha").Service<import("alepha").Module>;
203
- declare const envSchema: import("alepha").TObject<{
204
- /**
205
- * Enable debug logging for specific modules using the `debug` package convention.
206
- *
207
- * @example
208
- * DEBUG=1 # Shorthand for LOG_LEVEL=trace LOG_FORMAT=pretty
209
- * DEBUG=alepha:* # Enable debug logging for all alepha modules
210
- * DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules
211
- * DEBUG=* # Enable debug logging for all modules
212
- */
213
- DEBUG: import("alepha").TOptional<import("alepha").TString>;
214
- /**
215
- * Default log level for the application.
216
- *
217
- * Default by environment:
218
- * - dev = info
219
- * - prod = info
220
- * - test = error
221
- *
222
- * Levels are: "trace" | "debug" | "info" | "warn" | "error" | "silent"
223
- *
224
- * Level can be set for a specific module:
225
- *
226
- * @example
227
- * LOG_LEVEL=my.module.name:debug,info # Set debug level for my.module.name and info for all other modules
228
- * LOG_LEVEL=alepha:trace, info # Set trace level for all alepha modules and info for all other modules
229
- */
230
- LOG_LEVEL: import("alepha").TOptional<import("alepha").TString>;
231
- /**
232
- * Built-in log formats.
233
- * - "json" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}
234
- * - "pretty" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}
235
- * - "raw" - Raw format, no formatting, just the message. {@link RawFormatterProvider}
236
- */
237
- LOG_FORMAT: import("alepha").TOptional<import("alepha").TUnsafe<"json" | "pretty" | "raw">>;
238
- }>;
241
+ declare const envSchema: import("zod").ZodObject<{
242
+ DEBUG: import("zod").ZodOptional<import("zod").ZodString>;
243
+ LOG_LEVEL: import("zod").ZodOptional<import("zod").ZodString>;
244
+ LOG_FORMAT: import("zod").ZodOptional<import("zod").ZodEnum<{
245
+ cli: "cli";
246
+ json: "json";
247
+ pretty: "pretty";
248
+ raw: "raw";
249
+ }>>;
250
+ }, import("zod/v4/core").$strip>;
239
251
  declare module "alepha" {
240
252
  interface Env extends Partial<Static<typeof envSchema>> {}
241
253
  interface State {
@@ -261,7 +273,7 @@ declare module "alepha" {
261
273
  entry: LogEntry;
262
274
  };
263
275
  }
264
- } //# sourceMappingURL=index.d.ts.map
276
+ }
265
277
  //#endregion
266
- export { $logger, AlephaLogger, ConsoleColorProvider, ConsoleDestinationProvider, JsonFormatterProvider, LogDestinationProvider, LogEntry, LogFormatterProvider, Logger, LoggerPrimitiveOptions, MemoryDestinationProvider, PrettyFormatterProvider, RawFormatterProvider, logEntrySchema };
278
+ export { $logger, AlephaLogger, CliFormatterProvider, ConsoleColorProvider, ConsoleDestinationProvider, JsonFormatterProvider, LogDestinationProvider, LogEntry, LogFormatterProvider, Logger, LoggerPrimitiveOptions, MemoryDestinationProvider, PrettyFormatterProvider, RawFormatterProvider, logEntrySchema };
267
279
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/logger/schemas/logEntrySchema.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/providers/RawFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/logger/schemas/logEntrySchema.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/providers/CliFormatterProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/RawFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/index.ts"],"mappings":";;;cAEa,8BAAc;;;;;;;;;;;;;;;;;KAaf,WAAW,cAAc;;;cCbxB;kBACK;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;;qBAGiB,QAAM;YAEf;EAEV;EAIO;EAgBA,IACL,oBAAoB,qBAAqB,QACzC,cACA;;;;uBCxDkB;WACJ,OAAO,OAAO;;;;cCEnB,gCAAgC;YACjC,OAAK;YACL,QAAM;EAET,OAAO,OAAO;EA8Ed,gBAAgB;YAUb,OAAI;YACJ,OAAI;;;;YAMJ,cAAc;YAQd,YAAY,OAAO;;;;;;;;;;;;;;cCnGlB,6BAA6B;EACxB,OAAO,OAAO;;;;YAsDpB,gBAAgB;;;;cCjEf,8BAA8B;EAClC,OAAO,OAAO;EAoBd,gBAAgB,OAAO;;;;uBCtBV;WACJ,MAAM,iBAAiB,OAAO;;;;cCAnC,6BAA6B;EACjC,OAAO,OAAO;;;;cCYV,kBAAkB;qBACV,QAAM;;;;;;qBAMN,kBAAgB;qBAChB,eAAa;qBACb,iBAAe;qBACf,cAAY;qBACZ,cAAY;qBACZ,aAAW;qBACX,kBAAgB;qBAEhB,QAAQ;qBASR;qBACA;qBACA;YAET;YACA,UAAU;EAEpB,YAAY,iBAAiB;MAMlB;MAIA;;;;;;;gBAeG,aAAa;EAepB,WAAW,eAAe,cAAc;YA4CrC,eAAe,oBAAoB;EAWtC,WAAW,oBAAoB;;;;;;;;;;;EAmB/B,eAAe,OAAO;EAMtB,MAAM,iBAAiB;EAIvB,KAAK,iBAAiB;EAItB,KAAK,iBAAiB;EAItB,MAAM,iBAAiB;EAIvB,MAAM,iBAAiB;YAIpB,IAAI,OAAO,UAAU,iBAAiB;YAsCtC,KAAK,OAAO,UAAU;;;;;;;;;;;;;;;;;;;;;;;cC3MrB;aAAoB,yBAA8B;;;UAY9C;EACf;;;;cCjCW,mCAAmC;EACvC,MAAM;;;;cCAF,kCAAkC;YACnC,SAAS,MAAM;IAAa;;WAEtB;IACd;;EAGK,MAAM,mBAAmB,OAAO;MAU5B;;;;;;;;;;;;EAIJ;;;;;;;;;;;;;;;;;;;;cCuBI,+BAAY,yBAAA;cAiHnB,yBAAS;;;;;;;;;;;YA6DI,YAAY,QAAQ,cAAc;YAElC;;;;IAIf;;;;;;;;;;;IAYA;;YAGe;IACf;MACE;MACA,OAAO"}