alepha 0.21.2 → 0.22.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 (463) hide show
  1. package/README.md +0 -1
  2. package/dist/api/audits/index.browser.js.map +1 -1
  3. package/dist/api/audits/index.d.ts +393 -403
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/audits/index.js +25 -56
  6. package/dist/api/audits/index.js.map +1 -1
  7. package/dist/api/files/index.browser.js +31 -1
  8. package/dist/api/files/index.browser.js.map +1 -1
  9. package/dist/api/files/index.d.ts +313 -208
  10. package/dist/api/files/index.d.ts.map +1 -1
  11. package/dist/api/files/index.js +152 -42
  12. package/dist/api/files/index.js.map +1 -1
  13. package/dist/api/jobs/index.browser.js +2 -2
  14. package/dist/api/jobs/index.browser.js.map +1 -1
  15. package/dist/api/jobs/index.d.ts +289 -292
  16. package/dist/api/jobs/index.d.ts.map +1 -1
  17. package/dist/api/jobs/index.js +39 -33
  18. package/dist/api/jobs/index.js.map +1 -1
  19. package/dist/api/keys/index.d.ts +211 -216
  20. package/dist/api/keys/index.d.ts.map +1 -1
  21. package/dist/api/keys/index.js.map +1 -1
  22. package/dist/api/notifications/index.browser.js.map +1 -1
  23. package/dist/api/notifications/index.d.ts +188 -195
  24. package/dist/api/notifications/index.d.ts.map +1 -1
  25. package/dist/api/notifications/index.js.map +1 -1
  26. package/dist/api/oauth/index.d.ts +71 -76
  27. package/dist/api/oauth/index.d.ts.map +1 -1
  28. package/dist/api/oauth/index.js.map +1 -1
  29. package/dist/api/organizations/index.browser.js.map +1 -1
  30. package/dist/api/organizations/index.d.ts +104 -109
  31. package/dist/api/organizations/index.d.ts.map +1 -1
  32. package/dist/api/organizations/index.js.map +1 -1
  33. package/dist/api/parameters/index.browser.js +43 -16
  34. package/dist/api/parameters/index.browser.js.map +1 -1
  35. package/dist/api/parameters/index.d.ts +488 -344
  36. package/dist/api/parameters/index.d.ts.map +1 -1
  37. package/dist/api/parameters/index.js +175 -35
  38. package/dist/api/parameters/index.js.map +1 -1
  39. package/dist/api/payments/index.d.ts +396 -402
  40. package/dist/api/payments/index.d.ts.map +1 -1
  41. package/dist/api/payments/index.js.map +1 -1
  42. package/dist/api/subscriptions/index.d.ts +644 -652
  43. package/dist/api/subscriptions/index.d.ts.map +1 -1
  44. package/dist/api/subscriptions/index.js +1 -1
  45. package/dist/api/subscriptions/index.js.map +1 -1
  46. package/dist/api/users/index.browser.js +7 -0
  47. package/dist/api/users/index.browser.js.map +1 -1
  48. package/dist/api/users/index.d.ts +1073 -1006
  49. package/dist/api/users/index.d.ts.map +1 -1
  50. package/dist/api/users/index.js +283 -61
  51. package/dist/api/users/index.js.map +1 -1
  52. package/dist/api/verifications/index.browser.js.map +1 -1
  53. package/dist/api/verifications/index.d.ts +134 -140
  54. package/dist/api/verifications/index.d.ts.map +1 -1
  55. package/dist/api/verifications/index.js.map +1 -1
  56. package/dist/background/index.d.ts +95 -0
  57. package/dist/background/index.d.ts.map +1 -0
  58. package/dist/background/index.js +121 -0
  59. package/dist/background/index.js.map +1 -0
  60. package/dist/background/index.workerd.js +110 -0
  61. package/dist/background/index.workerd.js.map +1 -0
  62. package/dist/batch/index.d.ts +5 -7
  63. package/dist/batch/index.d.ts.map +1 -1
  64. package/dist/batch/index.js.map +1 -1
  65. package/dist/bin/index.js.map +1 -1
  66. package/dist/bucket/index.d.ts +76 -54
  67. package/dist/bucket/index.d.ts.map +1 -1
  68. package/dist/bucket/index.js +58 -11
  69. package/dist/bucket/index.js.map +1 -1
  70. package/dist/bucket/index.workerd.js +200 -5
  71. package/dist/bucket/index.workerd.js.map +1 -1
  72. package/dist/cache/core/index.d.ts +7 -10
  73. package/dist/cache/core/index.d.ts.map +1 -1
  74. package/dist/cache/core/index.js.map +1 -1
  75. package/dist/cache/core/index.workerd.js.map +1 -1
  76. package/dist/cache/database/index.d.ts +22 -26
  77. package/dist/cache/database/index.d.ts.map +1 -1
  78. package/dist/cache/database/index.js.map +1 -1
  79. package/dist/cache/redis/index.d.ts +4 -7
  80. package/dist/cache/redis/index.d.ts.map +1 -1
  81. package/dist/cache/redis/index.js.map +1 -1
  82. package/dist/captcha/index.d.ts +3 -6
  83. package/dist/captcha/index.d.ts.map +1 -1
  84. package/dist/captcha/index.js.map +1 -1
  85. package/dist/cli/config/index.d.ts.map +1 -1
  86. package/dist/cli/config/index.js.map +1 -1
  87. package/dist/cli/core/index.d.ts +417 -214
  88. package/dist/cli/core/index.d.ts.map +1 -1
  89. package/dist/cli/core/index.js +325 -563
  90. package/dist/cli/core/index.js.map +1 -1
  91. package/dist/cli/devtools/index.d.ts +3 -5
  92. package/dist/cli/devtools/index.d.ts.map +1 -1
  93. package/dist/cli/devtools/index.js.map +1 -1
  94. package/dist/cli/i18n/index.d.ts +8 -12
  95. package/dist/cli/i18n/index.d.ts.map +1 -1
  96. package/dist/cli/i18n/index.js.map +1 -1
  97. package/dist/cli/platform/index.d.ts +126 -1342
  98. package/dist/cli/platform/index.d.ts.map +1 -1
  99. package/dist/cli/platform/index.js +136 -2374
  100. package/dist/cli/platform/index.js.map +1 -1
  101. package/dist/cli/platform-lib/index.d.ts +1446 -0
  102. package/dist/cli/platform-lib/index.d.ts.map +1 -0
  103. package/dist/cli/platform-lib/index.js +2597 -0
  104. package/dist/cli/platform-lib/index.js.map +1 -0
  105. package/dist/cli/vendor/index.d.ts +17 -21
  106. package/dist/cli/vendor/index.d.ts.map +1 -1
  107. package/dist/cli/vendor/index.js.map +1 -1
  108. package/dist/command/index.d.ts +21 -20
  109. package/dist/command/index.d.ts.map +1 -1
  110. package/dist/command/index.js +39 -10
  111. package/dist/command/index.js.map +1 -1
  112. package/dist/{containers → container}/core/index.d.ts +13 -15
  113. package/dist/container/core/index.d.ts.map +1 -0
  114. package/dist/{containers → container}/core/index.js +23 -14
  115. package/dist/container/core/index.js.map +1 -0
  116. package/dist/{containers → container}/core/index.workerd.js +37 -22
  117. package/dist/container/core/index.workerd.js.map +1 -0
  118. package/dist/core/index.browser.js +27 -1
  119. package/dist/core/index.browser.js.map +1 -1
  120. package/dist/core/index.d.ts +48 -24
  121. package/dist/core/index.d.ts.map +1 -1
  122. package/dist/core/index.js +27 -1
  123. package/dist/core/index.js.map +1 -1
  124. package/dist/core/index.native.js +27 -1
  125. package/dist/core/index.native.js.map +1 -1
  126. package/dist/core/index.workerd.js +27 -1
  127. package/dist/core/index.workerd.js.map +1 -1
  128. package/dist/crypto/index.browser.js.map +1 -1
  129. package/dist/crypto/index.d.ts +5 -8
  130. package/dist/crypto/index.d.ts.map +1 -1
  131. package/dist/crypto/index.js.map +1 -1
  132. package/dist/datetime/index.d.ts +3 -4
  133. package/dist/datetime/index.d.ts.map +1 -1
  134. package/dist/datetime/index.js.map +1 -1
  135. package/dist/email/brevo/index.d.ts +2 -4
  136. package/dist/email/brevo/index.d.ts.map +1 -1
  137. package/dist/email/brevo/index.js.map +1 -1
  138. package/dist/email/cloudflare/index.d.ts +20 -7
  139. package/dist/email/cloudflare/index.d.ts.map +1 -1
  140. package/dist/email/cloudflare/index.js +46 -9
  141. package/dist/email/cloudflare/index.js.map +1 -1
  142. package/dist/email/core/index.d.ts +6 -9
  143. package/dist/email/core/index.d.ts.map +1 -1
  144. package/dist/email/core/index.js.map +1 -1
  145. package/dist/email/core/index.workerd.js.map +1 -1
  146. package/dist/email/smtp/index.d.ts +10 -13
  147. package/dist/email/smtp/index.d.ts.map +1 -1
  148. package/dist/email/smtp/index.js +107 -32
  149. package/dist/email/smtp/index.js.map +1 -1
  150. package/dist/fake/index.d.ts +1 -2
  151. package/dist/fake/index.d.ts.map +1 -1
  152. package/dist/fake/index.js.map +1 -1
  153. package/dist/lock/core/index.d.ts +9 -14
  154. package/dist/lock/core/index.d.ts.map +1 -1
  155. package/dist/lock/core/index.js.map +1 -1
  156. package/dist/lock/redis/index.d.ts +2 -4
  157. package/dist/lock/redis/index.d.ts.map +1 -1
  158. package/dist/lock/redis/index.js.map +1 -1
  159. package/dist/logger/index.d.ts +105 -76
  160. package/dist/logger/index.d.ts.map +1 -1
  161. package/dist/logger/index.js +196 -174
  162. package/dist/logger/index.js.map +1 -1
  163. package/dist/mcp/index.d.ts +16 -20
  164. package/dist/mcp/index.d.ts.map +1 -1
  165. package/dist/mcp/index.js.map +1 -1
  166. package/dist/orm/core/index.browser.js.map +1 -1
  167. package/dist/orm/core/index.bun.js +19 -1
  168. package/dist/orm/core/index.bun.js.map +1 -1
  169. package/dist/orm/core/index.d.ts +76 -62
  170. package/dist/orm/core/index.d.ts.map +1 -1
  171. package/dist/orm/core/index.js +20 -2
  172. package/dist/orm/core/index.js.map +1 -1
  173. package/dist/orm/postgres/index.bun.js.map +1 -1
  174. package/dist/orm/postgres/index.d.ts +28 -20
  175. package/dist/orm/postgres/index.d.ts.map +1 -1
  176. package/dist/orm/postgres/index.js.map +1 -1
  177. package/dist/queue/core/index.d.ts +12 -15
  178. package/dist/queue/core/index.d.ts.map +1 -1
  179. package/dist/queue/core/index.js.map +1 -1
  180. package/dist/queue/core/index.workerd.js.map +1 -1
  181. package/dist/queue/redis/index.d.ts +3 -5
  182. package/dist/queue/redis/index.d.ts.map +1 -1
  183. package/dist/queue/redis/index.js.map +1 -1
  184. package/dist/react/auth/index.browser.js +9 -2
  185. package/dist/react/auth/index.browser.js.map +1 -1
  186. package/dist/react/auth/index.d.ts +14 -9
  187. package/dist/react/auth/index.d.ts.map +1 -1
  188. package/dist/react/auth/index.js +9 -2
  189. package/dist/react/auth/index.js.map +1 -1
  190. package/dist/react/core/index.d.ts +7 -8
  191. package/dist/react/core/index.d.ts.map +1 -1
  192. package/dist/react/core/index.js +6 -3
  193. package/dist/react/core/index.js.map +1 -1
  194. package/dist/react/form/index.d.ts +2 -4
  195. package/dist/react/form/index.d.ts.map +1 -1
  196. package/dist/react/form/index.js.map +1 -1
  197. package/dist/react/head/index.browser.js.map +1 -1
  198. package/dist/react/head/index.d.ts +2 -4
  199. package/dist/react/head/index.d.ts.map +1 -1
  200. package/dist/react/head/index.js.map +1 -1
  201. package/dist/react/i18n/index.d.ts +47 -11
  202. package/dist/react/i18n/index.d.ts.map +1 -1
  203. package/dist/react/i18n/index.js +33 -1
  204. package/dist/react/i18n/index.js.map +1 -1
  205. package/dist/react/intro/index.d.ts +1 -2
  206. package/dist/react/intro/index.d.ts.map +1 -1
  207. package/dist/react/intro/index.js +2 -2
  208. package/dist/react/intro/index.js.map +1 -1
  209. package/dist/react/router/index.browser.js +65 -19
  210. package/dist/react/router/index.browser.js.map +1 -1
  211. package/dist/react/router/index.d.ts +327 -222
  212. package/dist/react/router/index.d.ts.map +1 -1
  213. package/dist/react/router/index.js +65 -29
  214. package/dist/react/router/index.js.map +1 -1
  215. package/dist/react/testing/index.d.ts +1 -2
  216. package/dist/react/testing/index.d.ts.map +1 -1
  217. package/dist/react/testing/index.js +16 -17
  218. package/dist/react/testing/index.js.map +1 -1
  219. package/dist/react/ui/index.d.ts +20 -25
  220. package/dist/react/ui/index.d.ts.map +1 -1
  221. package/dist/react/ui/index.js.map +1 -1
  222. package/dist/redis/index.bun.js.map +1 -1
  223. package/dist/redis/index.d.ts +17 -19
  224. package/dist/redis/index.d.ts.map +1 -1
  225. package/dist/redis/index.js.map +1 -1
  226. package/dist/retry/index.d.ts +2 -4
  227. package/dist/retry/index.d.ts.map +1 -1
  228. package/dist/retry/index.js.map +1 -1
  229. package/dist/router/index.d.ts.map +1 -1
  230. package/dist/router/index.js.map +1 -1
  231. package/dist/scheduler/index.d.ts +10 -13
  232. package/dist/scheduler/index.d.ts.map +1 -1
  233. package/dist/scheduler/index.js.map +1 -1
  234. package/dist/scheduler/index.workerd.js.map +1 -1
  235. package/dist/security/index.browser.js.map +1 -1
  236. package/dist/security/index.d.ts +45 -48
  237. package/dist/security/index.d.ts.map +1 -1
  238. package/dist/security/index.js.map +1 -1
  239. package/dist/server/auth/index.browser.js.map +1 -1
  240. package/dist/server/auth/index.d.ts +167 -172
  241. package/dist/server/auth/index.d.ts.map +1 -1
  242. package/dist/server/auth/index.js +4 -8
  243. package/dist/server/auth/index.js.map +1 -1
  244. package/dist/server/cookies/index.browser.js.map +1 -1
  245. package/dist/server/cookies/index.d.ts +5 -7
  246. package/dist/server/cookies/index.d.ts.map +1 -1
  247. package/dist/server/cookies/index.js.map +1 -1
  248. package/dist/server/core/index.browser.js.map +1 -1
  249. package/dist/server/core/index.d.ts +88 -73
  250. package/dist/server/core/index.d.ts.map +1 -1
  251. package/dist/server/core/index.js +19 -0
  252. package/dist/server/core/index.js.map +1 -1
  253. package/dist/server/cors/index.d.ts +11 -14
  254. package/dist/server/cors/index.d.ts.map +1 -1
  255. package/dist/server/cors/index.js.map +1 -1
  256. package/dist/server/etag/index.d.ts +6 -9
  257. package/dist/server/etag/index.d.ts.map +1 -1
  258. package/dist/server/etag/index.js.map +1 -1
  259. package/dist/server/health/index.d.ts +18 -21
  260. package/dist/server/health/index.d.ts.map +1 -1
  261. package/dist/server/health/index.js.map +1 -1
  262. package/dist/server/links/index.browser.js +2 -0
  263. package/dist/server/links/index.browser.js.map +1 -1
  264. package/dist/server/links/index.d.ts +63 -67
  265. package/dist/server/links/index.d.ts.map +1 -1
  266. package/dist/server/links/index.js +2 -0
  267. package/dist/server/links/index.js.map +1 -1
  268. package/dist/server/metrics/index.d.ts +5 -7
  269. package/dist/server/metrics/index.d.ts.map +1 -1
  270. package/dist/server/metrics/index.js.map +1 -1
  271. package/dist/server/proxy/index.d.ts +3 -5
  272. package/dist/server/proxy/index.d.ts.map +1 -1
  273. package/dist/server/proxy/index.js.map +1 -1
  274. package/dist/server/rate-limit/index.d.ts +10 -13
  275. package/dist/server/rate-limit/index.d.ts.map +1 -1
  276. package/dist/server/rate-limit/index.js.map +1 -1
  277. package/dist/server/static/index.d.ts +3 -5
  278. package/dist/server/static/index.d.ts.map +1 -1
  279. package/dist/server/static/index.js.map +1 -1
  280. package/dist/server/swagger/index.d.ts +5 -8
  281. package/dist/server/swagger/index.d.ts.map +1 -1
  282. package/dist/server/swagger/index.js.map +1 -1
  283. package/dist/sms/index.d.ts +3 -5
  284. package/dist/sms/index.d.ts.map +1 -1
  285. package/dist/sms/index.js.map +1 -1
  286. package/dist/system/index.browser.js.map +1 -1
  287. package/dist/system/index.d.ts +2 -4
  288. package/dist/system/index.d.ts.map +1 -1
  289. package/dist/system/index.js.map +1 -1
  290. package/dist/system/index.workerd.js.map +1 -1
  291. package/dist/topic/core/index.d.ts +4 -6
  292. package/dist/topic/core/index.d.ts.map +1 -1
  293. package/dist/topic/core/index.js.map +1 -1
  294. package/dist/topic/redis/index.d.ts +5 -8
  295. package/dist/topic/redis/index.d.ts.map +1 -1
  296. package/dist/topic/redis/index.js.map +1 -1
  297. package/package.json +45 -22
  298. package/src/api/audits/__tests__/AuditService.spec.ts +18 -110
  299. package/src/api/audits/controllers/AdminAuditController.ts +14 -0
  300. package/src/api/audits/services/AuditService.ts +21 -88
  301. package/src/api/files/__tests__/FileService.spec.ts +207 -2
  302. package/src/api/files/index.ts +3 -0
  303. package/src/api/files/schemas/fileCreatorSummarySchema.ts +22 -0
  304. package/src/api/files/schemas/fileResourceSchema.ts +10 -1
  305. package/src/api/files/services/FileService.ts +170 -72
  306. package/src/api/jobs/__tests__/$job.spec.ts +24 -1
  307. package/src/api/jobs/index.ts +4 -3
  308. package/src/api/jobs/primitives/$job.ts +7 -3
  309. package/src/api/jobs/providers/DirectJobDispatcher.ts +17 -36
  310. package/src/api/jobs/providers/JobProvider.ts +53 -24
  311. package/src/api/jobs/schemas/jobConfigAtom.ts +1 -1
  312. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +4 -1
  313. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +3 -1
  314. package/src/api/parameters/__tests__/$parameter.spec.ts +19 -2
  315. package/src/api/parameters/audits/ParameterAudits.ts +17 -0
  316. package/src/api/parameters/controllers/AdminParameterController.ts +95 -19
  317. package/src/api/parameters/index.ts +3 -0
  318. package/src/api/parameters/schemas/activateParameterBodySchema.ts +3 -3
  319. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +3 -2
  320. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +25 -0
  321. package/src/api/parameters/schemas/parameterResponseSchema.ts +5 -0
  322. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +4 -2
  323. package/src/api/parameters/services/ParameterProvider.ts +69 -6
  324. package/src/api/subscriptions/jobs/SubscriptionJobs.ts +1 -1
  325. package/src/api/users/__tests__/AdminSessionController.spec.ts +37 -0
  326. package/src/api/users/audits/SessionAudits.ts +33 -0
  327. package/src/api/users/audits/UserAudits.ts +19 -43
  328. package/src/api/users/controllers/AdminUserController.ts +66 -1
  329. package/src/api/users/entities/sessions.ts +6 -0
  330. package/src/api/users/entities/users.ts +2 -0
  331. package/src/api/users/index.ts +9 -1
  332. package/src/api/users/primitives/$realm.ts +3 -0
  333. package/src/api/users/schemas/sessionResourceSchema.ts +16 -0
  334. package/src/api/users/schemas/updateUserSchema.ts +1 -8
  335. package/src/api/users/schemas/userQuerySchema.ts +7 -0
  336. package/src/api/users/services/CredentialService.ts +15 -6
  337. package/src/api/users/services/IdentityService.ts +2 -1
  338. package/src/api/users/services/RegistrationService.ts +2 -1
  339. package/src/api/users/services/SessionCrudService.ts +19 -2
  340. package/src/api/users/services/SessionService.ts +39 -19
  341. package/src/api/users/services/UserService.ts +106 -8
  342. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +96 -0
  343. package/src/background/index.ts +37 -0
  344. package/src/background/index.workerd.ts +28 -0
  345. package/src/background/providers/BackgroundTaskProvider.ts +70 -0
  346. package/src/background/providers/WorkerdBackgroundTaskProvider.ts +43 -0
  347. package/src/bucket/__tests__/$bucket.spec.ts +18 -0
  348. package/src/bucket/__tests__/LocalFileStorageProvider.spec.ts +5 -0
  349. package/src/bucket/__tests__/MemoryFileStorageProvider.spec.ts +5 -0
  350. package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +23 -4
  351. package/src/bucket/__tests__/shared.ts +30 -0
  352. package/src/bucket/index.ts +5 -5
  353. package/src/bucket/index.workerd.ts +11 -4
  354. package/src/bucket/primitives/$bucket.ts +27 -0
  355. package/src/bucket/providers/FileStorageProvider.ts +13 -0
  356. package/src/bucket/providers/LocalFileStorageProvider.ts +17 -1
  357. package/src/bucket/providers/MemoryFileStorageProvider.ts +7 -0
  358. package/src/bucket/providers/{CloudflareR2Provider.ts → R2FileStorageProvider.ts} +10 -1
  359. package/src/bucket/providers/{NodeS3BucketProvider.ts → S3FileStorageProvider.ts} +27 -5
  360. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +25 -1
  361. package/src/cli/core/__tests__/init.spec.ts +0 -219
  362. package/src/cli/core/commands/__tests__/BuildCommand.spec.ts +43 -0
  363. package/src/cli/core/commands/build.ts +108 -30
  364. package/src/cli/core/commands/init.ts +0 -12
  365. package/src/cli/core/commands/pack.ts +133 -0
  366. package/src/cli/core/index.ts +3 -0
  367. package/src/cli/core/providers/ViteDevServerProvider.ts +40 -16
  368. package/src/cli/core/services/PackageManagerUtils.ts +0 -16
  369. package/src/cli/core/services/ProjectScaffolder.ts +29 -291
  370. package/src/cli/core/tasks/BuildCloudflareTask.ts +353 -47
  371. package/src/cli/core/tasks/BuildDockerTask.ts +33 -3
  372. package/src/cli/core/tasks/BuildTask.ts +34 -0
  373. package/src/cli/core/templates/apiIndexTs.ts +1 -22
  374. package/src/cli/core/templates/mainCss.ts +0 -1
  375. package/src/cli/core/templates/webAppRouterTs.ts +0 -99
  376. package/src/cli/core/templates/webIndexTs.ts +1 -22
  377. package/src/cli/platform/__tests__/SecretsCommand.spec.ts +5 -3
  378. package/src/cli/platform/commands/SecretsCommand.ts +8 -6
  379. package/src/cli/platform/commands/platform.ts +192 -46
  380. package/src/cli/platform/index.ts +12 -52
  381. package/src/cli/{platform → platform-lib}/__tests__/CloudflareAdapter.spec.ts +426 -169
  382. package/src/cli/{platform → platform-lib}/__tests__/NamingService.spec.ts +91 -4
  383. package/src/cli/{platform → platform-lib}/__tests__/VercelAdapter.spec.ts +56 -85
  384. package/src/cli/{platform → platform-lib}/adapters/CloudflareAdapter.ts +402 -165
  385. package/src/cli/{platform → platform-lib}/adapters/PlatformAdapter.ts +62 -35
  386. package/src/cli/{platform → platform-lib}/adapters/VercelAdapter.ts +6 -10
  387. package/src/cli/{platform → platform-lib}/atoms/platformOptions.ts +34 -1
  388. package/src/cli/platform-lib/index.ts +67 -0
  389. package/src/cli/platform-lib/services/NamingService.ts +136 -0
  390. package/src/cli/{platform → platform-lib}/services/PlatformInspector.ts +60 -13
  391. package/src/cli/{platform → platform-lib}/services/PlatformOrchestrator.ts +54 -43
  392. package/src/cli/{platform → platform-lib}/services/WranglerApi.ts +4 -2
  393. package/src/command/__tests__/Runner.spec.ts +20 -0
  394. package/src/command/helpers/EnvUtils.ts +19 -3
  395. package/src/command/helpers/Runner.ts +12 -2
  396. package/src/command/providers/CliProvider.ts +34 -1
  397. package/src/{containers → container}/core/__tests__/$container.spec.ts +5 -5
  398. package/src/{containers → container}/core/index.ts +4 -4
  399. package/src/{containers → container}/core/index.workerd.ts +19 -3
  400. package/src/{containers → container}/core/primitives/$container.ts +1 -1
  401. package/src/{containers → container}/core/providers/CloudflareContainerProvider.ts +17 -19
  402. package/src/{containers → container}/core/providers/ContainerProvider.ts +16 -2
  403. package/src/{containers → container}/core/providers/MockContainerProvider.ts +1 -1
  404. package/src/core/Alepha.ts +49 -1
  405. package/src/core/__tests__/$env.spec.ts +42 -0
  406. package/src/core/__tests__/dump.spec.ts +47 -0
  407. package/src/email/cloudflare/__tests__/CloudflareEmailProvider.spec.ts +42 -10
  408. package/src/email/cloudflare/index.ts +14 -5
  409. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +54 -9
  410. package/src/logger/__tests__/Logger.spec.ts +55 -0
  411. package/src/logger/index.ts +13 -0
  412. package/src/logger/services/Logger.ts +31 -1
  413. package/src/orm/__tests__/orm-showcase-tests.ts +27 -0
  414. package/src/orm/__tests__/orm-showcase.spec.ts +12 -0
  415. package/src/orm/core/interfaces/PgQuery.ts +4 -1
  416. package/src/orm/core/services/Repository.ts +27 -11
  417. package/src/react/auth/hooks/useAuth.ts +10 -5
  418. package/src/react/core/__tests__/useQuery.browser.spec.tsx +25 -0
  419. package/src/react/core/hooks/useAction.ts +14 -3
  420. package/src/react/core/hooks/useQuery.ts +24 -4
  421. package/src/react/i18n/components/Translate.tsx +47 -0
  422. package/src/react/i18n/index.ts +2 -0
  423. package/src/react/intro/components/GettingStartedAdminSlide.tsx +2 -2
  424. package/src/react/router/__tests__/$page.spec.tsx +3 -2
  425. package/src/react/router/__tests__/page-can.spec.ts +18 -13
  426. package/src/react/router/hooks/useQueryParams.ts +114 -14
  427. package/src/react/router/primitives/$page.ts +85 -4
  428. package/src/react/router/providers/ReactBrowserRouterProvider.ts +3 -7
  429. package/src/react/router/providers/ReactServerProvider.ts +4 -13
  430. package/src/react/ui/services/SchemaControl.ts +3 -4
  431. package/src/server/core/providers/ServerMultipartProvider.ts +19 -0
  432. package/src/server/links/providers/LinkProvider.ts +10 -0
  433. package/dist/containers/core/index.d.ts.map +0 -1
  434. package/dist/containers/core/index.js.map +0 -1
  435. package/dist/containers/core/index.workerd.js.map +0 -1
  436. package/src/cli/core/templates/componentsJsonTs.ts +0 -39
  437. package/src/cli/core/templates/saasAdminLayoutTsx.ts +0 -77
  438. package/src/cli/core/templates/saasAdminPagesTsx.ts +0 -26
  439. package/src/cli/core/templates/saasAuthLayoutTsx.ts +0 -22
  440. package/src/cli/core/templates/saasAuthPagesTsx.ts +0 -62
  441. package/src/cli/core/templates/saasRealmProviderTs.ts +0 -52
  442. package/src/cli/platform/services/NamingService.ts +0 -54
  443. /package/dist/orm/core/{chunk-o8xxKEmq.js → chunk-B4FMCO8f.js} +0 -0
  444. /package/dist/react/testing/{chunk-6Ep1yQYe.js → chunk-BpyX8vjI.js} +0 -0
  445. /package/src/cli/{platform → platform-lib}/__tests__/GitHubSecretStore.spec.ts +0 -0
  446. /package/src/cli/{platform → platform-lib}/__tests__/PlatformCacheProvider.spec.ts +0 -0
  447. /package/src/cli/{platform → platform-lib}/__tests__/PlatformInspector.spec.ts +0 -0
  448. /package/src/cli/{platform → platform-lib}/__tests__/PlatformOrchestrator.spec.ts +0 -0
  449. /package/src/cli/{platform → platform-lib}/__tests__/SecretFilterService.spec.ts +0 -0
  450. /package/src/cli/{platform → platform-lib}/__tests__/detectResources.spec.ts +0 -0
  451. /package/src/cli/{platform → platform-lib}/providers/GitHubSecretStore.ts +0 -0
  452. /package/src/cli/{platform → platform-lib}/providers/MemorySecretStore.ts +0 -0
  453. /package/src/cli/{platform → platform-lib}/providers/PlatformCacheProvider.ts +0 -0
  454. /package/src/cli/{platform → platform-lib}/providers/SecretStoreProvider.ts +0 -0
  455. /package/src/cli/{platform → platform-lib}/schemas/cloudflare.ts +0 -0
  456. /package/src/cli/{platform → platform-lib}/schemas/platform.ts +0 -0
  457. /package/src/cli/{platform → platform-lib}/schemas/vercel.ts +0 -0
  458. /package/src/cli/{platform → platform-lib}/services/CloudflareApi.ts +0 -0
  459. /package/src/cli/{platform → platform-lib}/services/SecretFilterService.ts +0 -0
  460. /package/src/cli/{platform → platform-lib}/services/VercelApi.ts +0 -0
  461. /package/src/cli/{platform → platform-lib}/services/VercelCli.ts +0 -0
  462. /package/src/{containers → container}/core/interfaces/ContainerOptions.ts +0 -0
  463. /package/src/{containers → container}/core/providers/NodeContainerProvider.ts +0 -0
@@ -1,11 +1,6 @@
1
- import * as _$alepha from "alepha";
2
1
  import { AsyncFn, Middleware, Primitive, Static } from "alepha";
3
- import * as _$alepha_topic0 from "alepha/topic";
4
2
  import { TopicProvider } from "alepha/topic";
5
- import * as _$alepha_datetime0 from "alepha/datetime";
6
3
  import { DateTime, DateTimeProvider, DurationLike, Timeout } from "alepha/datetime";
7
- import * as _$alepha_logger0 from "alepha/logger";
8
- import * as _$typebox from "typebox";
9
4
 
10
5
  //#region ../../src/lock/core/providers/LockProvider.d.ts
11
6
  /**
@@ -272,8 +267,8 @@ interface LockPrimitiveOptions<TFunc extends AsyncFn> {
272
267
  /**
273
268
  * Lock configuration atom.
274
269
  */
275
- declare const lockOptions: _$alepha.Atom<_$typebox.TObject<{
276
- prefixKey: _$typebox.TString;
270
+ declare const lockOptions: import("alepha").Atom<import("typebox").TObject<{
271
+ prefixKey: import("typebox").TString;
277
272
  }>, "alepha.lock.options">;
278
273
  type LockAtomOptions = Static<typeof lockOptions.schema>;
279
274
  declare module "alepha" {
@@ -282,7 +277,7 @@ declare module "alepha" {
282
277
  }
283
278
  }
284
279
  declare class LockPrimitive<TFunc extends AsyncFn> extends Primitive<LockPrimitiveOptions<TFunc>> {
285
- protected readonly log: _$alepha_logger0.Logger;
280
+ protected readonly log: import("alepha/logger").Logger;
286
281
  protected readonly provider: LockProvider;
287
282
  protected readonly settings: Readonly<{
288
283
  prefixKey: string;
@@ -294,10 +289,10 @@ declare class LockPrimitive<TFunc extends AsyncFn> extends Primitive<LockPrimiti
294
289
  */
295
290
  protected _id?: string;
296
291
  protected get id(): string;
297
- readonly maxDuration: _$alepha_datetime0.Duration;
298
- protected readonly topicLockEnd: _$alepha_topic0.TopicPrimitive<{
299
- payload: _$typebox.TObject<{
300
- name: _$typebox.TString;
292
+ readonly maxDuration: import("alepha/datetime").Duration;
293
+ protected readonly topicLockEnd: import("alepha/topic").TopicPrimitive<{
294
+ payload: import("typebox").TObject<{
295
+ name: import("typebox").TString;
301
296
  }>;
302
297
  }>;
303
298
  run(...args: Parameters<TFunc>): Promise<void>;
@@ -326,7 +321,7 @@ declare abstract class LockTopicProvider extends TopicProvider {}
326
321
  */
327
322
  declare class MemoryLockProvider implements LockProvider {
328
323
  protected readonly dateTimeProvider: DateTimeProvider;
329
- protected readonly log: _$alepha_logger0.Logger;
324
+ protected readonly log: import("alepha/logger").Logger;
330
325
  /**
331
326
  * The in-memory store.
332
327
  */
@@ -381,7 +376,7 @@ declare module "alepha" {
381
376
  *
382
377
  * @module alepha.lock
383
378
  */
384
- declare const AlephaLock: _$alepha.Service<_$alepha.Module>;
379
+ declare const AlephaLock: import("alepha").Service<import("alepha").Module>;
385
380
  //#endregion
386
381
  export { $lock, AlephaLock, LockAtomOptions, LockMiddlewareOptions, LockPrimitive, LockPrimitiveOptions, LockProvider, LockResult, LockTopicProvider, MemoryLockProvider, lockOptions };
387
382
  //# 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/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 +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 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,11 +1,9 @@
1
- import * as _$alepha from "alepha";
2
1
  import { LockProvider } from "alepha/lock";
3
- import * as _$alepha_logger0 from "alepha/logger";
4
2
  import { RedisProvider } from "alepha/redis";
5
3
 
6
4
  //#region ../../src/lock/redis/providers/RedisLockProvider.d.ts
7
5
  declare class RedisLockProvider implements LockProvider {
8
- protected readonly log: _$alepha_logger0.Logger;
6
+ protected readonly log: import("alepha/logger").Logger;
9
7
  protected readonly redisProvider: RedisProvider;
10
8
  set(key: string, value: string, nx?: boolean, px?: number): Promise<string>;
11
9
  del(...keys: string[]): Promise<void>;
@@ -18,7 +16,7 @@ declare class RedisLockProvider implements LockProvider {
18
16
  * @see {@link RedisLockProvider}
19
17
  * @module alepha.lock.redis
20
18
  */
21
- declare const AlephaLockRedis: _$alepha.Service<_$alepha.Module>;
19
+ declare const AlephaLockRedis: import("alepha").Service<import("alepha").Module>;
22
20
  //#endregion
23
21
  export { AlephaLockRedis, RedisLockProvider };
24
22
  //# sourceMappingURL=index.d.ts.map
@@ -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,EADU,gBAAA,CACP,MAAA;EAAA,mBACH,aAAA,EAAa,aAAA;EAEnB,GAAA,CACX,GAAA,UACA,KAAA,UACA,EAAA,YACA,EAAA,YACC,OAAA;EAqBU,GAAA,CAAA,GAAO,IAAA,aAAiB,OAAA;AAAA;;;;;;;;AA9BvC;cCYa,eAAA,EAAe,QAAA,CAAA,OAAA,CAgB1B,QAAA,CAhB0B,MAAA"}
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 +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,SAAS;CAClC,gBAAmC,QAAQ,cAAc;CAEzD,MAAa,IACX,KACA,OACA,IACA,IACiB;EACjB,MAAM,UAA2B,EAC/B,KAAK,MACN;EAED,IAAI,IACF,QAAQ,aAAa;GACnB,MAAM;GACN,OAAO;GACR;EAGH,IAAI,IACF,QAAQ,YAAY;EAKtB,QAAO,MAFY,KAAK,cAAc,IAAI,KAAK,OAAO,QAAQ,EAElD,SAAS,QAAQ;;CAG/B,MAAa,IAAI,GAAG,MAA+B;EACjD,MAAM,KAAK,cAAc,IAAI,KAAK;;;;;;;;;;;ACnBtC,MAAa,kBAAkB,QAAQ;CACrC,MAAM;CACN,UAAU,CAAC,mBAAmB,mBAAmB;CACjD,WAAW,WACT,OACG,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;EACN,CAAC,CACD,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;EACN,CAAC,CACD,KAAK,WAAW;CACtB,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,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,35 +1,101 @@
1
- import * as _$alepha from "alepha";
2
1
  import { Alepha, KIND, LogLevel, LoggerInterface, Static } from "alepha";
3
2
  import { DateTimeProvider } from "alepha/datetime";
4
- import * as _$typebox from "typebox";
5
3
 
6
4
  //#region ../../src/logger/schemas/logEntrySchema.d.ts
7
- declare const logEntrySchema: _$typebox.TObject<{
8
- level: _$typebox.TUnsafe<"DEBUG" | "SILENT" | "TRACE" | "INFO" | "WARN" | "ERROR">;
9
- message: _$typebox.TString;
10
- service: _$typebox.TString;
11
- module: _$typebox.TString;
12
- context: _$typebox.TOptional<_$typebox.TString>;
13
- app: _$typebox.TOptional<_$typebox.TString>;
14
- data: _$typebox.TOptional<_$typebox.TAny>;
15
- timestamp: _$typebox.TNumber;
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;
16
14
  }>;
17
15
  type LogEntry = Static<typeof logEntrySchema>;
18
16
  //#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
19
28
  //#region ../../src/logger/providers/LogDestinationProvider.d.ts
20
29
  declare abstract class LogDestinationProvider {
21
30
  abstract write(message: string, entry: LogEntry): void;
22
31
  }
23
32
  //#endregion
24
- //#region ../../src/logger/providers/LogFormatterProvider.d.ts
25
- declare abstract class LogFormatterProvider {
26
- abstract format(entry: LogEntry): string;
33
+ //#region ../../src/logger/providers/ConsoleColorProvider.d.ts
34
+ declare class ConsoleColorProvider {
35
+ static readonly COLORS: {
36
+ RESET: string;
37
+ BLACK: string;
38
+ RED: string;
39
+ GREEN: string;
40
+ ORANGE: string;
41
+ BLUE: string;
42
+ PURPLE: string;
43
+ CYAN: string;
44
+ GREY_LIGHT: string;
45
+ GREY_LIGHT_BOLD: string;
46
+ GREY_DARK: string;
47
+ GREY_DARK_BOLD: string;
48
+ WHITE: string;
49
+ WHITE_BOLD: string;
50
+ DIM: string;
51
+ BOLD: string;
52
+ INVERSE: string;
53
+ SILENT: string;
54
+ ERROR: string;
55
+ WARN: string;
56
+ INFO: string;
57
+ DEBUG: string;
58
+ TRACE: string;
59
+ };
60
+ protected readonly alepha: Alepha;
61
+ protected enabled: boolean;
62
+ constructor();
63
+ isEnabled(): boolean;
64
+ set(color: keyof typeof ConsoleColorProvider.COLORS, text: string, reset?: string): string;
65
+ }
66
+ //#endregion
67
+ //#region ../../src/logger/providers/PrettyFormatterProvider.d.ts
68
+ declare class PrettyFormatterProvider extends LogFormatterProvider {
69
+ protected color: ConsoleColorProvider;
70
+ protected alepha: Alepha;
71
+ format(entry: LogEntry): string;
72
+ formatTimestamp(timestamp: number): string;
73
+ protected pad2: (n: number) => string;
74
+ protected pad3: (n: number) => string;
75
+ /**
76
+ * Avoid to display the whole UUID in development mode
77
+ */
78
+ protected formatContext(context: string): string;
79
+ protected formatError(error: Error): string;
80
+ }
81
+ //#endregion
82
+ //#region ../../src/logger/providers/RawFormatterProvider.d.ts
83
+ declare class RawFormatterProvider extends LogFormatterProvider {
84
+ format(entry: LogEntry): string;
27
85
  }
28
86
  //#endregion
29
87
  //#region ../../src/logger/services/Logger.d.ts
30
88
  declare class Logger implements LoggerInterface {
31
89
  protected readonly alepha: Alepha;
32
- protected readonly formatter: LogFormatterProvider;
90
+ /**
91
+ * Formatter chosen at register time (from `LOG_FORMAT`, honoring any
92
+ * custom `LogFormatterProvider` substitution). Used unless a runtime
93
+ * `alepha.logger.format` override is set — see {@link formatter}.
94
+ */
95
+ protected readonly defaultFormatter: LogFormatterProvider;
96
+ protected readonly jsonFormatter: JsonFormatterProvider;
97
+ protected readonly prettyFormatter: PrettyFormatterProvider;
98
+ protected readonly rawFormatter: RawFormatterProvider;
33
99
  protected readonly destination: LogDestinationProvider;
34
100
  protected readonly dateTimeProvider: DateTimeProvider;
35
101
  protected readonly levels: Record<string, number>;
@@ -41,6 +107,13 @@ declare class Logger implements LoggerInterface {
41
107
  constructor(service: string, module: string);
42
108
  get context(): string | undefined;
43
109
  get level(): string;
110
+ /**
111
+ * Active formatter. Honors a runtime `alepha.logger.format` override
112
+ * (read live, like {@link level}); otherwise falls back to the
113
+ * register-time {@link defaultFormatter} so custom substitutions and the
114
+ * `LOG_FORMAT` default keep working.
115
+ */
116
+ protected get formatter(): LogFormatterProvider;
44
117
  parseLevel(level: string, app: string): LogLevel;
45
118
  protected matchesPattern(moduleName: string, pattern: string): boolean;
46
119
  asLogLevel(something: string): LogLevel;
@@ -81,51 +154,11 @@ interface LoggerPrimitiveOptions {
81
154
  name?: string;
82
155
  }
83
156
  //#endregion
84
- //#region ../../src/logger/providers/ConsoleColorProvider.d.ts
85
- declare class ConsoleColorProvider {
86
- static readonly COLORS: {
87
- RESET: string;
88
- BLACK: string;
89
- RED: string;
90
- GREEN: string;
91
- ORANGE: string;
92
- BLUE: string;
93
- PURPLE: string;
94
- CYAN: string;
95
- GREY_LIGHT: string;
96
- GREY_LIGHT_BOLD: string;
97
- GREY_DARK: string;
98
- GREY_DARK_BOLD: string;
99
- WHITE: string;
100
- WHITE_BOLD: string;
101
- DIM: string;
102
- BOLD: string;
103
- INVERSE: string;
104
- SILENT: string;
105
- ERROR: string;
106
- WARN: string;
107
- INFO: string;
108
- DEBUG: string;
109
- TRACE: string;
110
- };
111
- protected readonly alepha: Alepha;
112
- protected enabled: boolean;
113
- constructor();
114
- isEnabled(): boolean;
115
- set(color: keyof typeof ConsoleColorProvider.COLORS, text: string, reset?: string): string;
116
- }
117
- //#endregion
118
157
  //#region ../../src/logger/providers/ConsoleDestinationProvider.d.ts
119
158
  declare class ConsoleDestinationProvider extends LogDestinationProvider {
120
159
  write(message: string): void;
121
160
  }
122
161
  //#endregion
123
- //#region ../../src/logger/providers/JsonFormatterProvider.d.ts
124
- declare class JsonFormatterProvider extends LogFormatterProvider {
125
- format(entry: LogEntry): string;
126
- formatJsonError(error: Error): object;
127
- }
128
- //#endregion
129
162
  //#region ../../src/logger/providers/MemoryDestinationProvider.d.ts
130
163
  declare class MemoryDestinationProvider extends LogDestinationProvider {
131
164
  protected entries: Array<LogEntry & {
@@ -150,21 +183,6 @@ declare class MemoryDestinationProvider extends LogDestinationProvider {
150
183
  clear(): void;
151
184
  }
152
185
  //#endregion
153
- //#region ../../src/logger/providers/PrettyFormatterProvider.d.ts
154
- declare class PrettyFormatterProvider extends LogFormatterProvider {
155
- protected color: ConsoleColorProvider;
156
- protected alepha: Alepha;
157
- format(entry: LogEntry): string;
158
- formatTimestamp(timestamp: number): string;
159
- protected pad2: (n: number) => string;
160
- protected pad3: (n: number) => string;
161
- /**
162
- * Avoid to display the whole UUID in development mode
163
- */
164
- protected formatContext(context: string): string;
165
- protected formatError(error: Error): string;
166
- }
167
- //#endregion
168
186
  //#region ../../src/logger/index.d.ts
169
187
  /**
170
188
  * Configurable logging with multiple outputs.
@@ -181,8 +199,8 @@ declare class PrettyFormatterProvider extends LogFormatterProvider {
181
199
  *
182
200
  * @module alepha.logger
183
201
  */
184
- declare const AlephaLogger: _$alepha.Service<_$alepha.Module>;
185
- declare const envSchema: _$alepha.TObject<{
202
+ declare const AlephaLogger: import("alepha").Service<import("alepha").Module>;
203
+ declare const envSchema: import("alepha").TObject<{
186
204
  /**
187
205
  * Enable debug logging for specific modules using the `debug` package convention.
188
206
  *
@@ -192,7 +210,7 @@ declare const envSchema: _$alepha.TObject<{
192
210
  * DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules
193
211
  * DEBUG=* # Enable debug logging for all modules
194
212
  */
195
- DEBUG: _$alepha.TOptional<_$alepha.TString>;
213
+ DEBUG: import("alepha").TOptional<import("alepha").TString>;
196
214
  /**
197
215
  * Default log level for the application.
198
216
  *
@@ -209,14 +227,14 @@ declare const envSchema: _$alepha.TObject<{
209
227
  * LOG_LEVEL=my.module.name:debug,info # Set debug level for my.module.name and info for all other modules
210
228
  * LOG_LEVEL=alepha:trace, info # Set trace level for all alepha modules and info for all other modules
211
229
  */
212
- LOG_LEVEL: _$alepha.TOptional<_$alepha.TString>;
230
+ LOG_LEVEL: import("alepha").TOptional<import("alepha").TString>;
213
231
  /**
214
232
  * Built-in log formats.
215
233
  * - "json" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}
216
234
  * - "pretty" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}
217
235
  * - "raw" - Raw format, no formatting, just the message. {@link RawFormatterProvider}
218
236
  */
219
- LOG_FORMAT: _$alepha.TOptional<_$alepha.TUnsafe<"json" | "pretty" | "raw">>;
237
+ LOG_FORMAT: import("alepha").TOptional<import("alepha").TUnsafe<"json" | "pretty" | "raw">>;
220
238
  }>;
221
239
  declare module "alepha" {
222
240
  interface Env extends Partial<Static<typeof envSchema>> {}
@@ -225,6 +243,17 @@ declare module "alepha" {
225
243
  * Current log level for the application or specific modules.
226
244
  */
227
245
  "alepha.logger.level"?: string;
246
+ /**
247
+ * Runtime override for the log format (`json` | `pretty` | `raw`).
248
+ *
249
+ * Unset → the formatter chosen at register time from `LOG_FORMAT`
250
+ * (honoring any custom `LogFormatterProvider` substitution) is used.
251
+ * When set, it overrides both the active formatter and the CLI's
252
+ * dynamic/"stylish" task UI (which is enabled only for `raw`). Set it
253
+ * to flip output at runtime — e.g. the CLI `--verbose` flag forces
254
+ * `pretty`.
255
+ */
256
+ "alepha.logger.format"?: string;
228
257
  }
229
258
  interface Hooks {
230
259
  log: {
@@ -234,5 +263,5 @@ declare module "alepha" {
234
263
  }
235
264
  } //# sourceMappingURL=index.d.ts.map
236
265
  //#endregion
237
- export { $logger, AlephaLogger, ConsoleColorProvider, ConsoleDestinationProvider, JsonFormatterProvider, LogDestinationProvider, LogEntry, LogFormatterProvider, Logger, LoggerPrimitiveOptions, MemoryDestinationProvider, PrettyFormatterProvider, logEntrySchema };
266
+ export { $logger, AlephaLogger, ConsoleColorProvider, ConsoleDestinationProvider, JsonFormatterProvider, LogDestinationProvider, LogEntry, LogFormatterProvider, Logger, LoggerPrimitiveOptions, MemoryDestinationProvider, PrettyFormatterProvider, RawFormatterProvider, logEntrySchema };
238
267
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/logger/schemas/logEntrySchema.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.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/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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"}