alepha 0.23.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (845) hide show
  1. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  2. package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
  3. package/dist/api/audits/index.browser.js +49 -52
  4. package/dist/api/audits/index.browser.js.map +1 -1
  5. package/dist/api/audits/index.d.ts +629 -565
  6. package/dist/api/audits/index.d.ts.map +1 -1
  7. package/dist/api/audits/index.js +206 -98
  8. package/dist/api/audits/index.js.map +1 -1
  9. package/dist/api/files/index.browser.js +44 -44
  10. package/dist/api/files/index.browser.js.map +1 -1
  11. package/dist/api/files/index.d.ts +292 -293
  12. package/dist/api/files/index.d.ts.map +1 -1
  13. package/dist/api/files/index.js +61 -64
  14. package/dist/api/files/index.js.map +1 -1
  15. package/dist/api/jobs/index.browser.js +61 -59
  16. package/dist/api/jobs/index.browser.js.map +1 -1
  17. package/dist/api/jobs/index.d.ts +546 -347
  18. package/dist/api/jobs/index.d.ts.map +1 -1
  19. package/dist/api/jobs/index.js +165 -86
  20. package/dist/api/jobs/index.js.map +1 -1
  21. package/dist/api/keys/index.d.ts +247 -235
  22. package/dist/api/keys/index.d.ts.map +1 -1
  23. package/dist/api/keys/index.js +63 -66
  24. package/dist/api/keys/index.js.map +1 -1
  25. package/dist/api/notifications/index.browser.js +40 -38
  26. package/dist/api/notifications/index.browser.js.map +1 -1
  27. package/dist/api/notifications/index.d.ts +339 -209
  28. package/dist/api/notifications/index.d.ts.map +1 -1
  29. package/dist/api/notifications/index.js +108 -60
  30. package/dist/api/notifications/index.js.map +1 -1
  31. package/dist/api/oauth/index.d.ts +190 -78
  32. package/dist/api/oauth/index.d.ts.map +1 -1
  33. package/dist/api/oauth/index.js +290 -68
  34. package/dist/api/oauth/index.js.map +1 -1
  35. package/dist/api/organizations/index.browser.js +14 -14
  36. package/dist/api/organizations/index.browser.js.map +1 -1
  37. package/dist/api/organizations/index.d.ts +158 -134
  38. package/dist/api/organizations/index.d.ts.map +1 -1
  39. package/dist/api/organizations/index.js +18 -18
  40. package/dist/api/organizations/index.js.map +1 -1
  41. package/dist/api/parameters/index.browser.js +74 -53
  42. package/dist/api/parameters/index.browser.js.map +1 -1
  43. package/dist/api/parameters/index.d.ts +607 -513
  44. package/dist/api/parameters/index.d.ts.map +1 -1
  45. package/dist/api/parameters/index.js +205 -127
  46. package/dist/api/parameters/index.js.map +1 -1
  47. package/dist/api/payments/index.d.ts +652 -449
  48. package/dist/api/payments/index.d.ts.map +1 -1
  49. package/dist/api/payments/index.js +159 -93
  50. package/dist/api/payments/index.js.map +1 -1
  51. package/dist/api/subscriptions/index.d.ts +1032 -762
  52. package/dist/api/subscriptions/index.d.ts.map +1 -1
  53. package/dist/api/subscriptions/index.js +166 -185
  54. package/dist/api/subscriptions/index.js.map +1 -1
  55. package/dist/api/users/index.browser.js +48 -71
  56. package/dist/api/users/index.browser.js.map +1 -1
  57. package/dist/api/users/index.d.ts +1297 -1143
  58. package/dist/api/users/index.d.ts.map +1 -1
  59. package/dist/api/users/index.js +456 -392
  60. package/dist/api/users/index.js.map +1 -1
  61. package/dist/api/verifications/index.browser.js +17 -17
  62. package/dist/api/verifications/index.browser.js.map +1 -1
  63. package/dist/api/verifications/index.d.ts +167 -155
  64. package/dist/api/verifications/index.d.ts.map +1 -1
  65. package/dist/api/verifications/index.js +47 -95
  66. package/dist/api/verifications/index.js.map +1 -1
  67. package/dist/background/index.d.ts +0 -1
  68. package/dist/background/index.d.ts.map +1 -1
  69. package/dist/background/index.js.map +1 -1
  70. package/dist/background/index.workerd.js.map +1 -1
  71. package/dist/batch/index.d.ts +0 -1
  72. package/dist/batch/index.d.ts.map +1 -1
  73. package/dist/batch/index.js.map +1 -1
  74. package/dist/bin/index.js +1 -1
  75. package/dist/bin/index.js.map +1 -1
  76. package/dist/bucket/index.d.ts +27 -32
  77. package/dist/bucket/index.d.ts.map +1 -1
  78. package/dist/bucket/index.js +56 -26
  79. package/dist/bucket/index.js.map +1 -1
  80. package/dist/bucket/index.workerd.js +52 -24
  81. package/dist/bucket/index.workerd.js.map +1 -1
  82. package/dist/cache/core/index.d.ts +4 -6
  83. package/dist/cache/core/index.d.ts.map +1 -1
  84. package/dist/cache/core/index.js +4 -10
  85. package/dist/cache/core/index.js.map +1 -1
  86. package/dist/cache/core/index.workerd.js +4 -10
  87. package/dist/cache/core/index.workerd.js.map +1 -1
  88. package/dist/cache/database/index.d.ts +22 -23
  89. package/dist/cache/database/index.d.ts.map +1 -1
  90. package/dist/cache/database/index.js +11 -20
  91. package/dist/cache/database/index.js.map +1 -1
  92. package/dist/cache/redis/index.d.ts +3 -4
  93. package/dist/cache/redis/index.d.ts.map +1 -1
  94. package/dist/cache/redis/index.js +2 -2
  95. package/dist/cache/redis/index.js.map +1 -1
  96. package/dist/captcha/index.d.ts.map +1 -1
  97. package/dist/captcha/index.js +4 -4
  98. package/dist/captcha/index.js.map +1 -1
  99. package/dist/cli/config/index.d.ts +0 -1
  100. package/dist/cli/config/index.d.ts.map +1 -1
  101. package/dist/cli/core/index.d.ts +205 -442
  102. package/dist/cli/core/index.d.ts.map +1 -1
  103. package/dist/cli/core/index.js +259 -284
  104. package/dist/cli/core/index.js.map +1 -1
  105. package/dist/cli/devtools/index.d.ts +3 -9
  106. package/dist/cli/devtools/index.d.ts.map +1 -1
  107. package/dist/cli/devtools/index.js +3 -3
  108. package/dist/cli/devtools/index.js.map +1 -1
  109. package/dist/cli/i18n/index.d.ts +8 -34
  110. package/dist/cli/i18n/index.d.ts.map +1 -1
  111. package/dist/cli/i18n/index.js +6 -6
  112. package/dist/cli/i18n/index.js.map +1 -1
  113. package/dist/cli/platform/index.d.ts +89 -82
  114. package/dist/cli/platform/index.d.ts.map +1 -1
  115. package/dist/cli/platform/index.js +27 -33
  116. package/dist/cli/platform/index.js.map +1 -1
  117. package/dist/cli/platform-lib/index.d.ts +351 -404
  118. package/dist/cli/platform-lib/index.d.ts.map +1 -1
  119. package/dist/cli/platform-lib/index.js +218 -239
  120. package/dist/cli/platform-lib/index.js.map +1 -1
  121. package/dist/cli/vendor/index.d.ts +17 -41
  122. package/dist/cli/vendor/index.d.ts.map +1 -1
  123. package/dist/cli/vendor/index.js +10 -13
  124. package/dist/cli/vendor/index.js.map +1 -1
  125. package/dist/command/index.d.ts +83 -195
  126. package/dist/command/index.d.ts.map +1 -1
  127. package/dist/command/index.js +160 -563
  128. package/dist/command/index.js.map +1 -1
  129. package/dist/core/index.browser.js +845 -859
  130. package/dist/core/index.browser.js.map +1 -1
  131. package/dist/core/index.d.ts +787 -527
  132. package/dist/core/index.d.ts.map +1 -1
  133. package/dist/core/index.js +845 -859
  134. package/dist/core/index.js.map +1 -1
  135. package/dist/core/index.native.js +845 -859
  136. package/dist/core/index.native.js.map +1 -1
  137. package/dist/core/index.workerd.js +845 -859
  138. package/dist/core/index.workerd.js.map +1 -1
  139. package/dist/crypto/index.browser.js +1 -1
  140. package/dist/crypto/index.browser.js.map +1 -1
  141. package/dist/crypto/index.d.ts +3 -4
  142. package/dist/crypto/index.d.ts.map +1 -1
  143. package/dist/crypto/index.js +6 -3
  144. package/dist/crypto/index.js.map +1 -1
  145. package/dist/datetime/index.d.ts +12 -2
  146. package/dist/datetime/index.d.ts.map +1 -1
  147. package/dist/datetime/index.js +6 -1
  148. package/dist/datetime/index.js.map +1 -1
  149. package/dist/email/brevo/index.d.ts +0 -1
  150. package/dist/email/brevo/index.d.ts.map +1 -1
  151. package/dist/email/brevo/index.js +4 -4
  152. package/dist/email/brevo/index.js.map +1 -1
  153. package/dist/email/cloudflare/index.d.ts +0 -1
  154. package/dist/email/cloudflare/index.d.ts.map +1 -1
  155. package/dist/email/cloudflare/index.js +2 -2
  156. package/dist/email/cloudflare/index.js.map +1 -1
  157. package/dist/email/core/index.d.ts +15 -7
  158. package/dist/email/core/index.d.ts.map +1 -1
  159. package/dist/email/core/index.js +14 -5
  160. package/dist/email/core/index.js.map +1 -1
  161. package/dist/email/core/index.workerd.js +5 -1
  162. package/dist/email/core/index.workerd.js.map +1 -1
  163. package/dist/email/smtp/index.d.ts +8 -9
  164. package/dist/email/smtp/index.d.ts.map +1 -1
  165. package/dist/email/smtp/index.js +702 -479
  166. package/dist/email/smtp/index.js.map +1 -1
  167. package/dist/fake/index.d.ts +1580 -1238
  168. package/dist/fake/index.d.ts.map +1 -1
  169. package/dist/fake/index.js +11728 -32131
  170. package/dist/fake/index.js.map +1 -1
  171. package/dist/lock/core/index.d.ts +13 -9
  172. package/dist/lock/core/index.d.ts.map +1 -1
  173. package/dist/lock/core/index.js +5 -5
  174. package/dist/lock/core/index.js.map +1 -1
  175. package/dist/lock/redis/index.d.ts +0 -1
  176. package/dist/lock/redis/index.d.ts.map +1 -1
  177. package/dist/lock/redis/index.js.map +1 -1
  178. package/dist/logger/index.d.ts +81 -69
  179. package/dist/logger/index.d.ts.map +1 -1
  180. package/dist/logger/index.js +123 -56
  181. package/dist/logger/index.js.map +1 -1
  182. package/dist/mcp/index.d.ts +27 -90
  183. package/dist/mcp/index.d.ts.map +1 -1
  184. package/dist/mcp/index.js +42 -70
  185. package/dist/mcp/index.js.map +1 -1
  186. package/dist/orm/core/index.browser.js +54 -40
  187. package/dist/orm/core/index.browser.js.map +1 -1
  188. package/dist/orm/core/index.bun.js +140 -106
  189. package/dist/orm/core/index.bun.js.map +1 -1
  190. package/dist/orm/core/index.d.ts +145 -150
  191. package/dist/orm/core/index.d.ts.map +1 -1
  192. package/dist/orm/core/index.js +144 -109
  193. package/dist/orm/core/index.js.map +1 -1
  194. package/dist/orm/postgres/index.bun.js +64 -54
  195. package/dist/orm/postgres/index.bun.js.map +1 -1
  196. package/dist/orm/postgres/index.d.ts +36 -76
  197. package/dist/orm/postgres/index.d.ts.map +1 -1
  198. package/dist/orm/postgres/index.js +67 -57
  199. package/dist/orm/postgres/index.js.map +1 -1
  200. package/dist/queue/core/index.d.ts +62 -75
  201. package/dist/queue/core/index.d.ts.map +1 -1
  202. package/dist/queue/core/index.js +48 -71
  203. package/dist/queue/core/index.js.map +1 -1
  204. package/dist/queue/core/index.workerd.js +48 -71
  205. package/dist/queue/core/index.workerd.js.map +1 -1
  206. package/dist/queue/redis/index.d.ts +3 -4
  207. package/dist/queue/redis/index.d.ts.map +1 -1
  208. package/dist/queue/redis/index.js +2 -2
  209. package/dist/queue/redis/index.js.map +1 -1
  210. package/dist/react/auth/index.browser.js.map +1 -1
  211. package/dist/react/auth/index.d.ts +7 -4
  212. package/dist/react/auth/index.d.ts.map +1 -1
  213. package/dist/react/auth/index.js.map +1 -1
  214. package/dist/react/core/index.d.ts +87 -5
  215. package/dist/react/core/index.d.ts.map +1 -1
  216. package/dist/react/core/index.js +170 -23
  217. package/dist/react/core/index.js.map +1 -1
  218. package/dist/react/form/index.d.ts +4 -5
  219. package/dist/react/form/index.d.ts.map +1 -1
  220. package/dist/react/form/index.js +91 -56
  221. package/dist/react/form/index.js.map +1 -1
  222. package/dist/react/head/index.browser.js.map +1 -1
  223. package/dist/react/head/index.d.ts +0 -1
  224. package/dist/react/head/index.d.ts.map +1 -1
  225. package/dist/react/head/index.js.map +1 -1
  226. package/dist/react/i18n/index.d.ts +4 -5
  227. package/dist/react/i18n/index.d.ts.map +1 -1
  228. package/dist/react/i18n/index.js +2 -2
  229. package/dist/react/i18n/index.js.map +1 -1
  230. package/dist/react/intro/index.d.ts +1 -4
  231. package/dist/react/intro/index.d.ts.map +1 -1
  232. package/dist/react/intro/index.js.map +1 -1
  233. package/dist/react/router/index.browser.js +60 -24
  234. package/dist/react/router/index.browser.js.map +1 -1
  235. package/dist/react/router/index.d.ts +378 -377
  236. package/dist/react/router/index.d.ts.map +1 -1
  237. package/dist/react/router/index.js +77 -41
  238. package/dist/react/router/index.js.map +1 -1
  239. package/dist/react/sitemap/index.d.ts +0 -1
  240. package/dist/react/sitemap/index.d.ts.map +1 -1
  241. package/dist/react/sitemap/index.js.map +1 -1
  242. package/dist/react/testing/index.d.ts +4 -5
  243. package/dist/react/testing/index.d.ts.map +1 -1
  244. package/dist/react/testing/index.js +41 -15
  245. package/dist/react/testing/index.js.map +1 -1
  246. package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
  247. package/dist/react/ui/index.d.ts +35 -34
  248. package/dist/react/ui/index.d.ts.map +1 -1
  249. package/dist/react/ui/index.js +12 -17
  250. package/dist/react/ui/index.js.map +1 -1
  251. package/dist/redis/index.bun.js +5 -5
  252. package/dist/redis/index.bun.js.map +1 -1
  253. package/dist/redis/index.d.ts +6 -7
  254. package/dist/redis/index.d.ts.map +1 -1
  255. package/dist/redis/index.js +6 -6
  256. package/dist/redis/index.js.map +1 -1
  257. package/dist/retry/index.d.ts +0 -1
  258. package/dist/retry/index.d.ts.map +1 -1
  259. package/dist/retry/index.js.map +1 -1
  260. package/dist/router/index.d.ts.map +1 -1
  261. package/dist/router/index.js.map +1 -1
  262. package/dist/scheduler/index.d.ts +4 -12
  263. package/dist/scheduler/index.d.ts.map +1 -1
  264. package/dist/scheduler/index.js +9 -4
  265. package/dist/scheduler/index.js.map +1 -1
  266. package/dist/scheduler/index.workerd.js +9 -4
  267. package/dist/scheduler/index.workerd.js.map +1 -1
  268. package/dist/security/index.browser.js +30 -28
  269. package/dist/security/index.browser.js.map +1 -1
  270. package/dist/security/index.d.ts +113 -44
  271. package/dist/security/index.d.ts.map +1 -1
  272. package/dist/security/index.js +452 -37
  273. package/dist/security/index.js.map +1 -1
  274. package/dist/server/auth/index.browser.js +19 -19
  275. package/dist/server/auth/index.browser.js.map +1 -1
  276. package/dist/server/auth/index.d.ts +198 -274
  277. package/dist/server/auth/index.d.ts.map +1 -1
  278. package/dist/server/auth/index.js +83 -621
  279. package/dist/server/auth/index.js.map +1 -1
  280. package/dist/server/cookies/index.browser.js +103 -5
  281. package/dist/server/cookies/index.browser.js.map +1 -1
  282. package/dist/server/cookies/index.d.ts +72 -5
  283. package/dist/server/cookies/index.d.ts.map +1 -1
  284. package/dist/server/cookies/index.js +103 -9
  285. package/dist/server/cookies/index.js.map +1 -1
  286. package/dist/server/core/index.browser.js +22 -27
  287. package/dist/server/core/index.browser.js.map +1 -1
  288. package/dist/server/core/index.d.ts +116 -85
  289. package/dist/server/core/index.d.ts.map +1 -1
  290. package/dist/server/core/index.js +105 -118
  291. package/dist/server/core/index.js.map +1 -1
  292. package/dist/server/cors/index.d.ts +9 -10
  293. package/dist/server/cors/index.d.ts.map +1 -1
  294. package/dist/server/cors/index.js +14 -26
  295. package/dist/server/cors/index.js.map +1 -1
  296. package/dist/server/etag/index.d.ts +2 -3
  297. package/dist/server/etag/index.d.ts.map +1 -1
  298. package/dist/server/etag/index.js.map +1 -1
  299. package/dist/server/health/index.d.ts +18 -19
  300. package/dist/server/health/index.d.ts.map +1 -1
  301. package/dist/server/health/index.js +6 -6
  302. package/dist/server/health/index.js.map +1 -1
  303. package/dist/server/links/index.browser.js +15 -18
  304. package/dist/server/links/index.browser.js.map +1 -1
  305. package/dist/server/links/index.d.ts +66 -67
  306. package/dist/server/links/index.d.ts.map +1 -1
  307. package/dist/server/links/index.js +29 -32
  308. package/dist/server/links/index.js.map +1 -1
  309. package/dist/server/metrics/index.d.ts +0 -1
  310. package/dist/server/metrics/index.d.ts.map +1 -1
  311. package/dist/server/metrics/index.js +10 -3
  312. package/dist/server/metrics/index.js.map +1 -1
  313. package/dist/server/proxy/index.d.ts +0 -1
  314. package/dist/server/proxy/index.d.ts.map +1 -1
  315. package/dist/server/proxy/index.js.map +1 -1
  316. package/dist/server/rate-limit/index.d.ts +8 -9
  317. package/dist/server/rate-limit/index.d.ts.map +1 -1
  318. package/dist/server/rate-limit/index.js +6 -12
  319. package/dist/server/rate-limit/index.js.map +1 -1
  320. package/dist/server/static/index.d.ts +0 -1
  321. package/dist/server/static/index.d.ts.map +1 -1
  322. package/dist/server/static/index.js.map +1 -1
  323. package/dist/server/swagger/index.d.ts +4 -4
  324. package/dist/server/swagger/index.d.ts.map +1 -1
  325. package/dist/server/swagger/index.js +37 -25
  326. package/dist/server/swagger/index.js.map +1 -1
  327. package/dist/sms/index.d.ts +0 -1
  328. package/dist/sms/index.d.ts.map +1 -1
  329. package/dist/sms/index.js.map +1 -1
  330. package/dist/system/index.browser.js.map +1 -1
  331. package/dist/system/index.d.ts +0 -1
  332. package/dist/system/index.d.ts.map +1 -1
  333. package/dist/system/index.js +2 -1
  334. package/dist/system/index.js.map +1 -1
  335. package/dist/system/index.workerd.js.map +1 -1
  336. package/dist/topic/core/index.d.ts +19 -20
  337. package/dist/topic/core/index.d.ts.map +1 -1
  338. package/dist/topic/core/index.js +8 -8
  339. package/dist/topic/core/index.js.map +1 -1
  340. package/dist/topic/redis/index.d.ts +3 -4
  341. package/dist/topic/redis/index.d.ts.map +1 -1
  342. package/dist/topic/redis/index.js +2 -2
  343. package/dist/topic/redis/index.js.map +1 -1
  344. package/package.json +22 -35
  345. package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
  346. package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
  347. package/src/api/audits/controllers/AdminAuditController.ts +41 -41
  348. package/src/api/audits/entities/audits.ts +22 -22
  349. package/src/api/audits/index.ts +6 -1
  350. package/src/api/audits/jobs/AuditJobs.ts +29 -0
  351. package/src/api/audits/parameters/AuditParameters.ts +51 -0
  352. package/src/api/audits/primitives/$audit.ts +24 -0
  353. package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
  354. package/src/api/audits/schemas/createAuditSchema.ts +18 -18
  355. package/src/api/audits/services/AuditService.ts +79 -7
  356. package/src/api/files/__tests__/FileController.spec.ts +5 -5
  357. package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
  358. package/src/api/files/controllers/FileController.ts +25 -25
  359. package/src/api/files/entities/files.ts +15 -15
  360. package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
  361. package/src/api/files/schemas/fileQuerySchema.ts +9 -9
  362. package/src/api/files/schemas/fileResourceSchema.ts +7 -9
  363. package/src/api/files/schemas/storageStatsSchema.ts +13 -13
  364. package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
  365. package/src/api/jobs/__tests__/$job.spec.ts +18 -18
  366. package/src/api/jobs/controllers/AdminJobController.ts +8 -8
  367. package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
  368. package/src/api/jobs/providers/JobProvider.ts +128 -12
  369. package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
  370. package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
  371. package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
  372. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
  373. package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
  374. package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
  375. package/src/api/jobs/services/JobService.ts +6 -6
  376. package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
  377. package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
  378. package/src/api/keys/entities/apiKeyEntity.ts +15 -15
  379. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
  380. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
  381. package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
  382. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
  383. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
  384. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
  385. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
  386. package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
  387. package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
  388. package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
  389. package/src/api/notifications/primitives/$notification.ts +43 -4
  390. package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
  391. package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
  392. package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
  393. package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
  394. package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
  395. package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
  396. package/src/api/notifications/services/NotificationSenderService.ts +38 -2
  397. package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
  398. package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
  399. package/src/api/oauth/controllers/OAuthController.ts +132 -12
  400. package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
  401. package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
  402. package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
  403. package/src/api/oauth/index.ts +1 -0
  404. package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
  405. package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
  406. package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
  407. package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
  408. package/src/api/oauth/services/OAuthClientService.ts +228 -15
  409. package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
  410. package/src/api/organizations/entities/organizations.ts +6 -6
  411. package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
  412. package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
  413. package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
  414. package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
  415. package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
  416. package/src/api/parameters/entities/parameters.ts +29 -16
  417. package/src/api/parameters/primitives/$parameter.ts +3 -3
  418. package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
  419. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
  420. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
  421. package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
  422. package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
  423. package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
  424. package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
  425. package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
  426. package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
  427. package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
  428. package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
  429. package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
  430. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
  431. package/src/api/parameters/services/ParameterProvider.ts +152 -65
  432. package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
  433. package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
  434. package/src/api/payments/controllers/PaymentController.ts +4 -4
  435. package/src/api/payments/entities/paymentIntents.ts +11 -11
  436. package/src/api/payments/entities/paymentMethods.ts +11 -11
  437. package/src/api/payments/entities/refunds.ts +9 -9
  438. package/src/api/payments/providers/PaymentProvider.ts +18 -0
  439. package/src/api/payments/schemas/intentSchemas.ts +25 -25
  440. package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
  441. package/src/api/payments/services/PaymentService.ts +60 -3
  442. package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
  443. package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
  444. package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
  445. package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
  446. package/src/api/subscriptions/entities/subscriptions.ts +22 -22
  447. package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
  448. package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
  449. package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
  450. package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
  451. package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
  452. package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
  453. package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
  454. package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
  455. package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
  456. package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
  457. package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
  458. package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
  459. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
  460. package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
  461. package/src/api/users/controllers/AdminIdentityController.ts +29 -19
  462. package/src/api/users/controllers/AdminSessionController.ts +37 -27
  463. package/src/api/users/controllers/AdminUserController.ts +75 -53
  464. package/src/api/users/controllers/MySessionController.ts +125 -0
  465. package/src/api/users/controllers/RealmController.ts +9 -10
  466. package/src/api/users/controllers/UserController.ts +55 -55
  467. package/src/api/users/entities/identities.ts +8 -8
  468. package/src/api/users/entities/sessions.ts +17 -17
  469. package/src/api/users/entities/users.ts +17 -17
  470. package/src/api/users/index.ts +3 -0
  471. package/src/api/users/notifications/UserNotifications.ts +76 -24
  472. package/src/api/users/primitives/$realm.ts +12 -26
  473. package/src/api/users/providers/RealmProvider.ts +0 -15
  474. package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
  475. package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
  476. package/src/api/users/schemas/createUserSchema.ts +2 -2
  477. package/src/api/users/schemas/identityQuerySchema.ts +4 -4
  478. package/src/api/users/schemas/identityResourceSchema.ts +3 -2
  479. package/src/api/users/schemas/loginSchema.ts +4 -4
  480. package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
  481. package/src/api/users/schemas/realmConfigSchema.ts +10 -24
  482. package/src/api/users/schemas/registerQuerySchema.ts +6 -6
  483. package/src/api/users/schemas/registerRequestSchema.ts +21 -43
  484. package/src/api/users/schemas/registerResponseSchema.ts +2 -2
  485. package/src/api/users/schemas/registerSchema.ts +13 -31
  486. package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
  487. package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
  488. package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
  489. package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
  490. package/src/api/users/schemas/updateUserSchema.ts +3 -4
  491. package/src/api/users/schemas/userQuerySchema.ts +7 -7
  492. package/src/api/users/services/RegistrationService.ts +25 -11
  493. package/src/api/users/services/UserService.ts +12 -6
  494. package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
  495. package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
  496. package/src/api/verifications/controllers/VerificationController.ts +13 -27
  497. package/src/api/verifications/entities/verifications.ts +13 -14
  498. package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
  499. package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
  500. package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
  501. package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
  502. package/src/api/verifications/services/VerificationService.ts +12 -0
  503. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
  504. package/src/batch/__tests__/$batch.spec.ts +22 -22
  505. package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
  506. package/src/bin/index.ts +1 -1
  507. package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
  508. package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
  509. package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
  510. package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
  511. package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
  512. package/src/cache/core/primitives/$cache.ts +7 -10
  513. package/src/cache/database/entities/cacheEntries.ts +16 -27
  514. package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
  515. package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
  516. package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
  517. package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
  518. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
  519. package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
  520. package/src/cli/core/atoms/appEntryOptions.ts +5 -5
  521. package/src/cli/core/atoms/buildOptions.ts +76 -76
  522. package/src/cli/core/atoms/changelogOptions.ts +3 -3
  523. package/src/cli/core/atoms/devOptions.ts +3 -3
  524. package/src/cli/core/commands/build.ts +36 -39
  525. package/src/cli/core/commands/db.ts +171 -83
  526. package/src/cli/core/commands/dev.ts +8 -8
  527. package/src/cli/core/commands/gen/changelog.ts +12 -14
  528. package/src/cli/core/commands/gen/env.ts +6 -6
  529. package/src/cli/core/commands/gen/openapi.ts +6 -6
  530. package/src/cli/core/commands/init.ts +28 -33
  531. package/src/cli/core/commands/pack.ts +10 -10
  532. package/src/cli/core/commands/root.ts +7 -8
  533. package/src/cli/core/commands/test.ts +17 -20
  534. package/src/cli/core/tasks/BuildCloudflareTask.ts +103 -230
  535. package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
  536. package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
  537. package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
  538. package/src/cli/platform/commands/SecretsCommand.ts +24 -25
  539. package/src/cli/platform/commands/platform.ts +40 -46
  540. package/src/cli/platform/index.ts +1 -1
  541. package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
  542. package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
  543. package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
  544. package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +13 -14
  545. package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
  546. package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
  547. package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
  548. package/src/cli/platform-lib/schemas/platform.ts +51 -51
  549. package/src/cli/platform-lib/schemas/vercel.ts +28 -28
  550. package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
  551. package/src/cli/platform-lib/services/VercelApi.ts +4 -4
  552. package/src/cli/platform-lib/services/VercelCli.ts +6 -15
  553. package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
  554. package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
  555. package/src/cli/vendor/commands/VendorCommand.ts +11 -12
  556. package/src/command/__tests__/$command.spec.ts +82 -83
  557. package/src/command/__tests__/Asker.spec.ts +6 -13
  558. package/src/command/__tests__/CliProvider.spec.ts +136 -149
  559. package/src/command/__tests__/Runner.spec.ts +86 -110
  560. package/src/command/helpers/Asker.ts +23 -58
  561. package/src/command/helpers/Runner.ts +34 -110
  562. package/src/command/index.ts +4 -9
  563. package/src/command/primitives/$command.ts +10 -10
  564. package/src/command/providers/CliProvider.ts +183 -161
  565. package/src/core/Alepha.ts +62 -13
  566. package/src/core/__tests__/$atom.spec.ts +52 -3
  567. package/src/core/__tests__/$computed.spec.ts +129 -0
  568. package/src/core/__tests__/$env.spec.ts +13 -13
  569. package/src/core/__tests__/$inject.spec.ts +4 -4
  570. package/src/core/__tests__/$module.spec.ts +1 -1
  571. package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
  572. package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
  573. package/src/core/__tests__/Alepha-start.spec.ts +3 -3
  574. package/src/core/__tests__/CodecManager.spec.ts +113 -94
  575. package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
  576. package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
  577. package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
  578. package/src/core/__tests__/StateManager.spec.ts +423 -0
  579. package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
  580. package/src/core/__tests__/TypeProvider.spec.ts +314 -309
  581. package/src/core/__tests__/dump.spec.ts +6 -6
  582. package/src/core/__tests__/pagination.spec.ts +4 -4
  583. package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
  584. package/src/core/errors/TypeBoxError.ts +10 -4
  585. package/src/core/helpers/FileLike.ts +5 -5
  586. package/src/core/helpers/coerceStrings.ts +70 -0
  587. package/src/core/helpers/jsonSchemaToZod.ts +112 -0
  588. package/src/core/index.shared.ts +4 -1
  589. package/src/core/primitives/$atom.ts +95 -27
  590. package/src/core/primitives/$computed.ts +148 -0
  591. package/src/core/primitives/$env.ts +5 -5
  592. package/src/core/primitives/$state.ts +1 -1
  593. package/src/core/providers/AlsProvider.ts +26 -0
  594. package/src/core/providers/CodecManager.ts +1 -2
  595. package/src/core/providers/JsonSchemaCodec.ts +1 -2
  596. package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
  597. package/src/core/providers/SchemaValidator.ts +48 -158
  598. package/src/core/providers/StateManager.ts +383 -9
  599. package/src/core/providers/TypeProvider.ts +80 -734
  600. package/src/core/providers/ZodProvider.ts +380 -0
  601. package/src/core/providers/zodAugment.ts +69 -0
  602. package/src/core/schemas/pageQuerySchema.ts +19 -21
  603. package/src/core/schemas/pageSchema.ts +47 -57
  604. package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
  605. package/src/crypto/providers/SecretProvider.ts +16 -10
  606. package/src/datetime/primitives/$throttle.ts +6 -1
  607. package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
  608. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
  609. package/src/email/core/index.ts +7 -2
  610. package/src/email/core/primitives/$email.ts +5 -1
  611. package/src/email/core/providers/LocalEmailProvider.ts +5 -5
  612. package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
  613. package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
  614. package/src/fake/__tests__/keyName.example.ts +21 -21
  615. package/src/fake/__tests__/keyName.spec.ts +41 -41
  616. package/src/fake/__tests__/module.example.ts +8 -8
  617. package/src/fake/providers/FakeProvider.ts +122 -121
  618. package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
  619. package/src/lock/core/index.ts +1 -0
  620. package/src/lock/core/primitives/$lock.ts +13 -6
  621. package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
  622. package/src/logger/__tests__/Logger.spec.ts +49 -0
  623. package/src/logger/index.ts +25 -18
  624. package/src/logger/providers/CliFormatterProvider.ts +75 -0
  625. package/src/logger/schemas/logEntrySchema.ts +10 -10
  626. package/src/logger/services/Logger.ts +18 -0
  627. package/src/mcp/__tests__/$prompt.spec.ts +21 -23
  628. package/src/mcp/__tests__/$tool.spec.ts +22 -22
  629. package/src/mcp/__tests__/McpServerProvider.spec.ts +11 -11
  630. package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
  631. package/src/mcp/__tests__/integration.spec.ts +33 -33
  632. package/src/mcp/primitives/$prompt.ts +11 -9
  633. package/src/mcp/primitives/$tool.ts +27 -86
  634. package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
  635. package/src/orm/__tests__/$repository-tests.ts +133 -27
  636. package/src/orm/__tests__/$repository.spec.ts +23 -0
  637. package/src/orm/__tests__/$transactional-tests.ts +4 -4
  638. package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
  639. package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
  640. package/src/orm/__tests__/QueryManager.spec.ts +5 -5
  641. package/src/orm/__tests__/delete-returning-tests.ts +11 -11
  642. package/src/orm/__tests__/deletedAt-tests.ts +3 -3
  643. package/src/orm/__tests__/enums.spec.ts +29 -25
  644. package/src/orm/__tests__/execute-tests.ts +8 -8
  645. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
  646. package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
  647. package/src/orm/__tests__/joins-tests.ts +30 -30
  648. package/src/orm/__tests__/organization-tests.ts +105 -3
  649. package/src/orm/__tests__/organization.spec.ts +46 -0
  650. package/src/orm/__tests__/orm-errors.spec.ts +10 -10
  651. package/src/orm/__tests__/orm-next-tests.ts +29 -29
  652. package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
  653. package/src/orm/__tests__/primaryKey.spec.ts +4 -4
  654. package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
  655. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
  656. package/src/orm/__tests__/references.spec.ts +7 -7
  657. package/src/orm/__tests__/security.spec.ts +17 -17
  658. package/src/orm/__tests__/string-operators-tests.ts +5 -5
  659. package/src/orm/__tests__/timestamps-tests.ts +14 -14
  660. package/src/orm/__tests__/validation-tests.ts +5 -5
  661. package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
  662. package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
  663. package/src/orm/core/entities/alephaSequences.ts +8 -8
  664. package/src/orm/core/helpers/pgAttr.ts +4 -4
  665. package/src/orm/core/primitives/$entity.ts +10 -6
  666. package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
  667. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
  668. package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
  669. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
  670. package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
  671. package/src/orm/core/schemas/insertSchema.ts +14 -18
  672. package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
  673. package/src/orm/core/schemas/updateSchema.ts +10 -16
  674. package/src/orm/core/services/PgRelationManager.ts +2 -2
  675. package/src/orm/core/services/QueryManager.ts +13 -2
  676. package/src/orm/core/services/Repository.ts +88 -33
  677. package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
  678. package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
  679. package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
  680. package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
  681. package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
  682. package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
  683. package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
  684. package/src/queue/core/__tests__/shared.ts +6 -6
  685. package/src/queue/core/primitives/$consumer.ts +5 -5
  686. package/src/queue/core/primitives/$queue.ts +44 -61
  687. package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
  688. package/src/queue/core/providers/WorkerProvider.ts +17 -14
  689. package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
  690. package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
  691. package/src/react/core/__tests__/Router.spec.tsx +4 -4
  692. package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
  693. package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
  694. package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
  695. package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
  696. package/src/react/core/components/ErrorBoundary.tsx +42 -0
  697. package/src/react/core/hooks/useAction.ts +56 -19
  698. package/src/react/core/hooks/useComputed.ts +91 -0
  699. package/src/react/core/hooks/useSelector.ts +67 -0
  700. package/src/react/core/hooks/useStore.ts +36 -17
  701. package/src/react/core/index.ts +3 -0
  702. package/src/react/core/utils/shallowEqual.ts +36 -0
  703. package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +2 -2
  704. package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +5 -5
  705. package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
  706. package/src/react/form/errors/FormValidationError.ts +0 -2
  707. package/src/react/form/hooks/useForm.ts +19 -4
  708. package/src/react/form/hooks/useFormQuerySync.ts +0 -0
  709. package/src/react/form/services/FormModel.ts +67 -47
  710. package/src/react/form/services/parseField.ts +66 -27
  711. package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
  712. package/src/react/i18n/providers/I18nProvider.ts +2 -2
  713. package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
  714. package/src/react/router/__tests__/$page.spec.tsx +21 -21
  715. package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
  716. package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
  717. package/src/react/router/components/NestedView.tsx +11 -3
  718. package/src/react/router/hooks/useQueryParams.ts +1 -1
  719. package/src/react/router/primitives/$page.ts +2 -2
  720. package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
  721. package/src/react/router/providers/ReactPageProvider.ts +26 -12
  722. package/src/react/router/providers/ReactServerProvider.ts +13 -15
  723. package/src/react/sitemap/__tests__/$sitemap.spec.ts +2 -2
  724. package/src/react/ui/atoms/uiAtom.ts +6 -6
  725. package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
  726. package/src/react/ui/hooks/useColorMode.ts +11 -4
  727. package/src/react/ui/services/SchemaControl.ts +4 -4
  728. package/src/redis/providers/BunRedisProvider.ts +19 -11
  729. package/src/redis/providers/NodeRedisProvider.ts +3 -3
  730. package/src/scheduler/primitives/$scheduler.ts +21 -8
  731. package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
  732. package/src/security/atoms/currentTenantAtom.ts +6 -6
  733. package/src/security/atoms/currentUserAtom.ts +2 -2
  734. package/src/security/primitives/$issuer.ts +24 -2
  735. package/src/security/providers/JwtProvider.ts +100 -0
  736. package/src/security/providers/SecurityProvider.ts +43 -2
  737. package/src/security/schemas/permissionSchema.ts +19 -19
  738. package/src/security/schemas/roleSchema.ts +22 -28
  739. package/src/security/schemas/userAccountInfoSchema.ts +47 -37
  740. package/src/server/auth/index.ts +0 -3
  741. package/src/server/auth/primitives/$auth.ts +6 -6
  742. package/src/server/auth/primitives/$authApple.ts +10 -10
  743. package/src/server/auth/primitives/$authFacebook.ts +10 -10
  744. package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
  745. package/src/server/auth/primitives/$authGithub.ts +10 -10
  746. package/src/server/auth/primitives/$authGoogle.ts +10 -10
  747. package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
  748. package/src/server/auth/providers/ServerAuthProvider.ts +49 -48
  749. package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
  750. package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
  751. package/src/server/auth/schemas/tokensSchema.ts +16 -16
  752. package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
  753. package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
  754. package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
  755. package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
  756. package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +14 -14
  757. package/src/server/cookies/index.browser.ts +4 -1
  758. package/src/server/cookies/index.ts +8 -1
  759. package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
  760. package/src/server/cookies/primitives/$cookie.ts +16 -0
  761. package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
  762. package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
  763. package/src/server/cookies/providers/ServerCookiesProvider.ts +13 -5
  764. package/src/server/cookies/services/CookieParser.ts +6 -1
  765. package/src/server/core/__tests__/$action.spec.ts +13 -13
  766. package/src/server/core/__tests__/$middleware.spec.ts +10 -10
  767. package/src/server/core/__tests__/$route.spec.ts +9 -9
  768. package/src/server/core/__tests__/$sse.spec.ts +26 -26
  769. package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
  770. package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
  771. package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
  772. package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
  773. package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
  774. package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
  775. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
  776. package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
  777. package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
  778. package/src/server/core/errors/ValidationError.ts +6 -3
  779. package/src/server/core/helpers/isMultipart.ts +2 -1
  780. package/src/server/core/index.ts +5 -2
  781. package/src/server/core/interfaces/ServerRequest.ts +6 -14
  782. package/src/server/core/primitives/$action.ts +26 -36
  783. package/src/server/core/primitives/$sse.ts +3 -3
  784. package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
  785. package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
  786. package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
  787. package/src/server/core/providers/ServerCompressProvider.ts +9 -10
  788. package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
  789. package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
  790. package/src/server/core/providers/ServerRouterProvider.ts +44 -15
  791. package/src/server/core/schemas/errorSchema.ts +20 -25
  792. package/src/server/core/schemas/okSchema.ts +9 -14
  793. package/src/server/core/services/HttpClient.ts +13 -1
  794. package/src/server/core/services/ServerRequestParser.ts +6 -6
  795. package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
  796. package/src/server/health/schemas/healthSchema.ts +6 -6
  797. package/src/server/links/__tests__/$remote.spec.ts +3 -3
  798. package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
  799. package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
  800. package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
  801. package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
  802. package/src/server/links/atoms/apiLinksAtom.ts +2 -2
  803. package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
  804. package/src/server/links/primitives/$remote.ts +3 -3
  805. package/src/server/links/providers/LinkProvider.ts +3 -3
  806. package/src/server/links/providers/ServerLinksProvider.ts +20 -20
  807. package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
  808. package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
  809. package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
  810. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
  811. package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
  812. package/src/server/swagger/__tests__/ui.spec.ts +3 -3
  813. package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
  814. package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
  815. package/src/system/providers/NodeShellProvider.ts +4 -1
  816. package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
  817. package/src/topic/core/__tests__/shared.ts +8 -8
  818. package/src/topic/core/primitives/$subscriber.ts +5 -5
  819. package/src/topic/core/primitives/$topic.ts +14 -14
  820. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  821. package/dist/container/core/index.d.ts +0 -236
  822. package/dist/container/core/index.d.ts.map +0 -1
  823. package/dist/container/core/index.js +0 -231
  824. package/dist/container/core/index.js.map +0 -1
  825. package/dist/container/core/index.workerd.js +0 -192
  826. package/dist/container/core/index.workerd.js.map +0 -1
  827. package/src/command/helpers/PrettyAsker.ts +0 -256
  828. package/src/command/helpers/PrettyPrint.ts +0 -332
  829. package/src/container/core/__tests__/$container.spec.ts +0 -83
  830. package/src/container/core/index.ts +0 -50
  831. package/src/container/core/index.workerd.ts +0 -53
  832. package/src/container/core/interfaces/ContainerOptions.ts +0 -69
  833. package/src/container/core/primitives/$container.ts +0 -100
  834. package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
  835. package/src/container/core/providers/ContainerProvider.ts +0 -92
  836. package/src/container/core/providers/MockContainerProvider.ts +0 -62
  837. package/src/container/core/providers/NodeContainerProvider.ts +0 -53
  838. package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
  839. package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
  840. package/src/server/auth/__tests__/authFederationClient.spec.ts +0 -40
  841. package/src/server/auth/__tests__/federationAssertion.spec.ts +0 -146
  842. package/src/server/auth/helpers/federationAssertion.ts +0 -74
  843. package/src/server/auth/primitives/$authFederationBroker.ts +0 -273
  844. package/src/server/auth/primitives/$authFederationClient.ts +0 -89
  845. /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
@@ -11,6 +11,6 @@ var __exportAll = (all, no_symbols) => {
11
11
  if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
12
12
  return target;
13
13
  };
14
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
14
+ var __require = /* #__PURE__ */ (() => createRequire(import.meta.url))();
15
15
  //#endregion
16
16
  export { __exportAll as n, __require as r, __commonJSMin as t };
@@ -1,6 +1,5 @@
1
1
  import { Static } from "alepha";
2
2
  import { FormModel } from "alepha/react/form";
3
-
4
3
  //#region ../../src/react/ui/atoms/uiAtom.d.ts
5
4
  /**
6
5
  * Persisted UI state — color mode, theme palette, sidebar collapsed state, etc.
@@ -8,13 +7,17 @@ import { FormModel } from "alepha/react/form";
8
7
  * The atom is bound to a single `alepha-ui` cookie via {@link UiPersistence},
9
8
  * so values survive page reloads and are available during SSR.
10
9
  */
11
- declare const uiAtom: import("alepha").Atom<import("typebox").TObject<{
12
- /** Color mode preference. `"system"` follows the OS-level setting. */mode: import("typebox").TUnsafe<"light" | "dark" | "system">; /** Theme palette name. UI consumers map this to a CSS class on the root. */
13
- theme: import("typebox").TString; /** Sidebar UI state. */
14
- sidebar: import("typebox").TObject<{
15
- collapsed: import("typebox").TBoolean;
10
+ declare const uiAtom: import("alepha").Atom<import("zod").ZodObject<{
11
+ mode: import("zod").ZodEnum<{
12
+ dark: "dark";
13
+ light: "light";
14
+ system: "system";
16
15
  }>;
17
- }>, "alepha.react.ui">;
16
+ theme: import("zod").ZodString;
17
+ sidebar: import("zod").ZodObject<{
18
+ collapsed: import("zod").ZodBoolean;
19
+ }, import("zod/v4/core").$strip>;
20
+ }, import("zod/v4/core").$strip>, "alepha.react.ui">;
18
21
  type UiState = Static<typeof uiAtom.schema>;
19
22
  //#endregion
20
23
  //#region ../../src/react/ui/atoms/uiThemeListAtom.d.ts
@@ -27,20 +30,12 @@ type UiState = Static<typeof uiAtom.schema>;
27
30
  * Defaults to a single `"default"` entry so the registry stays usable when
28
31
  * an app doesn't declare its own list.
29
32
  */
30
- declare const uiThemeListAtom: import("alepha").Atom<import("typebox").TArray<import("typebox").TObject<{
31
- /** Stable id stored in `uiAtom.theme`. Mapped to a CSS class on `<html>`. */id: import("typebox").TString; /** Human-readable label shown in the picker. */
32
- label: import("typebox").TString;
33
- /**
34
- * Optional 4-color preview swatch in 2×2 order (TL, TR, BL, BR). Any
35
- * CSS-valid color string.
36
- */
37
- swatch: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
38
- /**
39
- * Optional stylesheet URL (typically Google Fonts) loaded lazily when
40
- * the theme is selected.
41
- */
42
- fontHref: import("typebox").TOptional<import("typebox").TString>;
43
- }>>, "alepha.react.ui.themes">;
33
+ declare const uiThemeListAtom: import("alepha").Atom<import("zod").ZodArray<import("zod").ZodObject<{
34
+ id: import("zod").ZodString;
35
+ label: import("zod").ZodString;
36
+ swatch: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
37
+ fontHref: import("zod").ZodOptional<import("zod").ZodString>;
38
+ }, import("zod/v4/core").$strip>>, "alepha.react.ui.themes">;
44
39
  type UiThemeList = Static<typeof uiThemeListAtom.schema>;
45
40
  type UiTheme = UiThemeList[number];
46
41
  //#endregion
@@ -113,12 +108,12 @@ declare const useTheme: () => {
113
108
  *
114
109
  * 1. **Object** — static configuration baked into the schema:
115
110
  * ```ts
116
- * t.string({ $control: { password: true, icon: "key" } })
111
+ * z.string({ $control: { password: true, icon: "key" } })
117
112
  * ```
118
113
  *
119
114
  * 2. **Function** — dynamic, computed from current form state:
120
115
  * ```ts
121
- * t.string({
116
+ * z.string({
122
117
  * $control: ({ form, value }) => {
123
118
  * if (form.currentValues.kind !== "advanced") return false; // hide
124
119
  * return { items: () => fetchOptions(form.currentValues.kind) };
@@ -225,10 +220,12 @@ interface SchemaControl {
225
220
  confirmDelete?: boolean | {
226
221
  title?: string;
227
222
  message?: string;
228
- }; /** Computed label for each tab when an array uses tabs mode. */
223
+ };
224
+ /** Computed label for each tab when an array uses tabs mode. */
229
225
  renderTabName?: (i: number, value: unknown) => string;
230
226
  sortable?: boolean;
231
- collapsible?: boolean; /** Force grouped (CreateForm-style) tabs even for short arrays. */
227
+ collapsible?: boolean;
228
+ /** Force grouped (CreateForm-style) tabs even for short arrays. */
232
229
  forceTabs?: boolean;
233
230
  };
234
231
  [key: string]: unknown;
@@ -258,15 +255,15 @@ declare const resolveSchemaControl: (raw: unknown, context: {
258
255
  form: FormModel<any>;
259
256
  value: unknown;
260
257
  }) => Partial<SchemaControl> | null;
261
- declare module "typebox" {
262
- interface TSchemaOptions {
258
+ declare module "alepha" {
259
+ interface SchemaOptions {
263
260
  /**
264
261
  * UI metadata read by `<Control>` from `@alepha/ui`. See
265
262
  * {@link SchemaControl}.
266
263
  */
267
264
  $control?: SchemaControlOption;
268
265
  }
269
- } //# sourceMappingURL=SchemaControl.d.ts.map
266
+ }
270
267
  //#endregion
271
268
  //#region ../../src/react/ui/services/UiPersistence.d.ts
272
269
  /**
@@ -282,13 +279,17 @@ declare module "typebox" {
282
279
  * but not on cross-origin requests.
283
280
  */
284
281
  declare class UiPersistence {
285
- ui: import("alepha/server/cookies").AbstractCookiePrimitive<import("typebox").TObject<{
286
- mode: import("typebox").TUnsafe<"light" | "dark" | "system">;
287
- theme: import("typebox").TString;
288
- sidebar: import("typebox").TObject<{
289
- collapsed: import("typebox").TBoolean;
282
+ ui: import("alepha/server/cookies").AbstractCookiePrimitive<import("zod").ZodObject<{
283
+ mode: import("zod").ZodEnum<{
284
+ dark: "dark";
285
+ light: "light";
286
+ system: "system";
290
287
  }>;
291
- }>>;
288
+ theme: import("zod").ZodString;
289
+ sidebar: import("zod").ZodObject<{
290
+ collapsed: import("zod").ZodBoolean;
291
+ }, import("zod/v4/core").$strip>;
292
+ }, import("zod/v4/core").$strip>>;
292
293
  head: import("alepha/react/head").HeadPrimitive;
293
294
  }
294
295
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/react/ui/atoms/uiAtom.ts","../../../src/react/ui/atoms/uiThemeListAtom.ts","../../../src/react/ui/components/ColorScheme.tsx","../../../src/react/ui/hooks/useColorMode.ts","../../../src/react/ui/hooks/useSidebarState.ts","../../../src/react/ui/hooks/useTheme.ts","../../../src/react/ui/services/SchemaControl.ts","../../../src/react/ui/services/UiPersistence.ts","../../../src/react/ui/index.ts"],"mappings":";;;;;;;AAQA;;;cAAa,MAAA,mBAAM,IAAA,mBAAA,OAAA;EAAA;;;;;;KAmBP,OAAA,GAAU,MAAM,QAAQ,MAAA,CAAO,MAAA;;;;;;AAnB3C;;;;;;cCGa,eAAA,mBAAe,IAAA,mBAAA,MAAA,mBAAA,OAAA;;;;;;;;EDgBhB;;;;;;KCOA,WAAA,GAAc,MAAM,QAAQ,eAAA,CAAgB,MAAA;AAAA,KAC5C,OAAA,GAAU,WAAW;;;;;;;AD3BjC;;;;;;iBEMgB,WAAA;;;KCVJ,SAAA;AAAA,KACA,iBAAA;;;AHGZ;;;;;;;cGQa,YAAA;;;kBAQO,SAAA;AAAA;;;;;;;AHhBpB;;;;cIGa,eAAA;;;;;;;;;;;AJHb;;;;cKGa,QAAA;;;;;;;;;ALHb;;;;;;;;;;;;;;;;AAmBA;;;;;;;UMCiB,aAAA;EAEf,IAAA;EACA,IAAA;EACA,QAAA;EACA,MAAA;EACA,MAAA;EACA,IAAA;EACA,IAAA;EACA,QAAA;EACA,IAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,MAAA;EACA,MAAA;EACA,KAAA;;;;;EAOA,IAAA;EACA,KAAA;EACA,WAAA;EACA,WAAA;;ALpBF;;;;;;EK4BE,YAAA;EL5B4D;AAAA;AAC9D;;;EKmCE,KAAA,GAAQ,KAAA,UAAe,iBAAA,IAAqB,oBAAA;ELnCb;;;;EKyC/B,UAAA;EJ9DyB;;;AAAA;;EIqEzB,cAAA,eAEM,KAAA;IAAoB,KAAA;IAAe,KAAA;EAAA;;;AHjFtB;AACrB;;;;AAA6B;AAW7B;EGiFE,KAAA;;;;;EAOA,MAAA;EACA,QAAA;EACA,QAAA;;;;;EAOA,GAAA;EACA,MAAA;EH1F2B;AAAA;;;;ACb7B;;;;EEmHE,MAAA;IAGM,KAAA;IACA,MAAA;IACA,OAAA;IACA,MAAA;EAAA;EAIN,UAAA;IACE,aAAA;MAA4B,KAAA;MAAgB,OAAA;IAAA,GDpH/C;ICsHG,aAAA,IAAiB,CAAA,UAAW,KAAA;IAC5B,QAAA;IACA,WAAA;IAEA,SAAA;EAAA;EAAA,CAID,GAAA;AAAA;AAAA,UAGc,iBAAA;EACf,KAAA;EACA,KAAA;EACA,WAAA;EACA,GAAA;AAAA;AAAA,KAGU,oBAAA,IACV,KAAA,aAEE,KAAA,UAAe,iBAAA,IACf,OAAA,CAAQ,KAAA,UAAe,iBAAA;;;;;;KAOf,eAAA,IAAmB,OAAA;EAC7B,IAAA,EAAM,SAAA;EACN,KAAA;AAAA,MACI,OAAA,CAAQ,aAAA;AAAA,KAEF,mBAAA,GAAsB,aAAA,GAAgB,eAAe;;;;;cAMpD,oBAAA,GACX,GAAA,WACA,OAAA;EAAW,IAAA,EAAM,SAAA;EAAgB,KAAA;AAAA,MAChC,OAAA,CAAQ,aAAA;AAAA;EAAA,UAkBC,cAAA;IAlJV;;;;IAuJE,QAAA,GAAW,mBAAmB;EAAA;AAAA;;;;;;;ANrMlC;;;;;;;;cOoBa,aAAA;EACX,EAAA,kCAAE,uBAAA,mBAAA,OAAA;;;;;;;EAQF,IAAA,8BAAI,aAAA;AAAA;;;;YCjBa,KAAA;IACf,iBAAA,EAAmB,OAAA;IACnB,wBAAA,EAA0B,WAAW;EAAA;AAAA;;;;;ARKzC;;;;cQSa,aAAA,mBAAa,OAAA,kBAAA,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/react/ui/atoms/uiAtom.ts","../../../src/react/ui/atoms/uiThemeListAtom.ts","../../../src/react/ui/components/ColorScheme.tsx","../../../src/react/ui/hooks/useColorMode.ts","../../../src/react/ui/hooks/useSidebarState.ts","../../../src/react/ui/hooks/useTheme.ts","../../../src/react/ui/services/SchemaControl.ts","../../../src/react/ui/services/UiPersistence.ts","../../../src/react/ui/index.ts"],"mappings":";;;;;;;;;cAQa,yBAAM,mBAAA;;;;;;;;;;;KAmBP,UAAU,cAAc,OAAO;;;;;;;;;;;;cChB9B,kCAAe,mBAAA,uBAAA;;;;;;KAuBhB,cAAc,cAAc,gBAAgB;KAC5C,UAAU;;;;;;;;;;;;;iBCrBN;;;KCVJ;KACA;;;;;;;;;;cAWC;;;kBAQO;;;;;;;;;;;;cCbP;;;;;;;;;;;;;;;cCAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UCiBI;EAEf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;;;EAOA;EACA;EACA;EACA;;;;;;;;EAQA;;;;;;EAQA,QAAQ,eAAe,qBAAqB;;;;;EAM5C;;;;;;EAOA,6BAEM;IAAoB;IAAe;;;;;;;;;;;EAYzC;;;;;EAOA;EACA;EACA;;;;;EAOA;EACA;;;;;;;;;;EAYA;IAGM;IACA;IACA;IACA;;EAIN;IACE;MAA4B;MAAgB;;;IAE5C,iBAAiB,WAAW;IAC5B;IACA;;IAEA;;GAID;;UAGc;EACf;EACA;EACA;EACA;;KAGU,wBACV,kBAEE,eAAe,qBACf,QAAQ,eAAe;;;;;;KAOf,mBAAmB;EAC7B,MAAM;EACN;MACI,QAAQ;KAEF,sBAAsB,gBAAgB;;;;;cAMrC,uBAAoB,cACnB;EACD,MAAM;EAAgB;MAChC,QAAQ;;YAkBC;;;;;IAKR,WAAW;;;;;;;;;;;;;;;;;cCjLF;EACX,oCAAE,sCAAA;;;;;;;;;;;EAQF,kCAAI;;;;;YCjBa;IACf,mBAAmB;IACnB,0BAA0B;;;;;;;;;;;cAcjB,gCAAa,yBAAA"}
@@ -1,4 +1,4 @@
1
- import { $atom, $module, t } from "alepha";
1
+ import { $atom, $module, z } from "alepha";
2
2
  import { $head } from "alepha/react/head";
3
3
  import { $cookie } from "alepha/server/cookies";
4
4
  import { useEffect, useState } from "react";
@@ -15,24 +15,21 @@ import { useStore } from "alepha/react";
15
15
  */
16
16
  const uiThemeListAtom = $atom({
17
17
  name: "alepha.react.ui.themes",
18
- schema: t.array(t.object({
18
+ schema: z.array(z.object({
19
19
  /** Stable id stored in `uiAtom.theme`. Mapped to a CSS class on `<html>`. */
20
- id: t.string(),
20
+ id: z.string(),
21
21
  /** Human-readable label shown in the picker. */
22
- label: t.string(),
22
+ label: z.string(),
23
23
  /**
24
24
  * Optional 4-color preview swatch in 2×2 order (TL, TR, BL, BR). Any
25
25
  * CSS-valid color string.
26
26
  */
27
- swatch: t.optional(t.array(t.string(), {
28
- minItems: 4,
29
- maxItems: 4
30
- })),
27
+ swatch: z.array(z.string()).min(4).max(4).optional(),
31
28
  /**
32
29
  * Optional stylesheet URL (typically Google Fonts) loaded lazily when
33
30
  * the theme is selected.
34
31
  */
35
- fontHref: t.optional(t.string())
32
+ fontHref: z.string().optional()
36
33
  })),
37
34
  default: [{
38
35
  id: "default",
@@ -49,17 +46,17 @@ const uiThemeListAtom = $atom({
49
46
  */
50
47
  const uiAtom = $atom({
51
48
  name: "alepha.react.ui",
52
- schema: t.object({
49
+ schema: z.object({
53
50
  /** Color mode preference. `"system"` follows the OS-level setting. */
54
- mode: t.enum([
51
+ mode: z.enum([
55
52
  "light",
56
53
  "dark",
57
54
  "system"
58
55
  ]),
59
56
  /** Theme palette name. UI consumers map this to a CSS class on the root. */
60
- theme: t.string(),
57
+ theme: z.string(),
61
58
  /** Sidebar UI state. */
62
- sidebar: t.object({ collapsed: t.boolean() })
59
+ sidebar: z.object({ collapsed: z.boolean() })
63
60
  }),
64
61
  default: {
65
62
  mode: "system",
@@ -128,14 +125,12 @@ const useColorMode = () => {
128
125
  };
129
126
  };
130
127
  const useResolvedColorMode = (mode) => {
131
- const [systemDark, setSystemDark] = useState(() => {
132
- if (typeof window === "undefined") return false;
133
- return window.matchMedia?.("(prefers-color-scheme: dark)").matches ?? false;
134
- });
128
+ const [systemDark, setSystemDark] = useState(false);
135
129
  useEffect(() => {
136
130
  if (typeof window === "undefined") return;
137
131
  const mq = window.matchMedia?.("(prefers-color-scheme: dark)");
138
132
  if (!mq) return;
133
+ setSystemDark(mq.matches);
139
134
  const onChange = (ev) => setSystemDark(ev.matches);
140
135
  mq.addEventListener("change", onChange);
141
136
  return () => mq.removeEventListener("change", onChange);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/react/ui/atoms/uiThemeListAtom.ts","../../../src/react/ui/atoms/uiAtom.ts","../../../src/react/ui/services/UiPersistence.ts","../../../src/react/ui/hooks/useColorMode.ts","../../../src/react/ui/hooks/useTheme.ts","../../../src/react/ui/components/ColorScheme.tsx","../../../src/react/ui/hooks/useSidebarState.ts","../../../src/react/ui/services/SchemaControl.ts","../../../src/react/ui/index.ts"],"sourcesContent":["import { $atom, type Static, t } from \"alepha\";\n\n/**\n * Available themes the user can pick from. Apps populate this atom on boot\n * (e.g. `alepha.store.set(uiThemeListAtom, MY_THEMES)`); UI consumers like\n * `<ButtonTheme/>` read it to render a picker. The selected theme id is\n * persisted separately in `uiAtom.theme`.\n *\n * Defaults to a single `\"default\"` entry so the registry stays usable when\n * an app doesn't declare its own list.\n */\nexport const uiThemeListAtom = $atom({\n name: \"alepha.react.ui.themes\",\n schema: t.array(\n t.object({\n /** Stable id stored in `uiAtom.theme`. Mapped to a CSS class on `<html>`. */\n id: t.string(),\n /** Human-readable label shown in the picker. */\n label: t.string(),\n /**\n * Optional 4-color preview swatch in 2×2 order (TL, TR, BL, BR). Any\n * CSS-valid color string.\n */\n swatch: t.optional(t.array(t.string(), { minItems: 4, maxItems: 4 })),\n /**\n * Optional stylesheet URL (typically Google Fonts) loaded lazily when\n * the theme is selected.\n */\n fontHref: t.optional(t.string()),\n }),\n ),\n default: [{ id: \"default\", label: \"Default\" }],\n});\n\nexport type UiThemeList = Static<typeof uiThemeListAtom.schema>;\nexport type UiTheme = UiThemeList[number];\n","import { $atom, type Static, t } from \"alepha\";\n\n/**\n * Persisted UI state — color mode, theme palette, sidebar collapsed state, etc.\n *\n * The atom is bound to a single `alepha-ui` cookie via {@link UiPersistence},\n * so values survive page reloads and are available during SSR.\n */\nexport const uiAtom = $atom({\n name: \"alepha.react.ui\",\n schema: t.object({\n /** Color mode preference. `\"system\"` follows the OS-level setting. */\n mode: t.enum([\"light\", \"dark\", \"system\"]),\n /** Theme palette name. UI consumers map this to a CSS class on the root. */\n theme: t.string(),\n /** Sidebar UI state. */\n sidebar: t.object({\n collapsed: t.boolean(),\n }),\n }),\n default: {\n mode: \"system\",\n theme: \"default\",\n sidebar: { collapsed: false },\n },\n});\n\nexport type UiState = Static<typeof uiAtom.schema>;\n","import { $head } from \"alepha/react/head\";\nimport { $cookie } from \"alepha/server/cookies\";\nimport { uiAtom } from \"../atoms/uiAtom.ts\";\n\n/**\n * Inline `<script>` rendered by SSR into the document `<head>`. Runs\n * synchronously before any CSS or React hydration: reads the `alepha-ui`\n * cookie, resolves `mode === \"system\"` via `prefers-color-scheme`, and\n * applies `class=\"dark\"` (and optional `theme-<name>`) on `<html>`.\n *\n * This is what kills the flash-of-wrong-theme (FOUC) you'd otherwise get\n * with React-effect-based theming. Failures are swallowed silently — at\n * worst the page paints in light mode for one frame.\n */\nconst colorSchemeBoot = `(function(){try{var m=document.cookie.match(/(?:^|;\\\\s*)alepha-ui=([^;]+)/);var s=m?JSON.parse(decodeURIComponent(m[1])):{};var mode=s.mode||\"system\";var dark=mode===\"dark\"||(mode===\"system\"&&window.matchMedia&&window.matchMedia(\"(prefers-color-scheme: dark)\").matches);var r=document.documentElement;if(dark)r.classList.add(\"dark\");if(s.theme&&s.theme!==\"default\")r.classList.add(\"theme-\"+s.theme);}catch(e){}})();`;\n\n/**\n * Binds the {@link uiAtom} to an `alepha-ui` cookie + injects an inline\n * boot script into the SSR head to prevent FOUC on first paint.\n *\n * Reading flow: on app boot the cookie is parsed and pushed into the atom\n * (via the `key` option on `$cookie`). Writing flow: every time the atom\n * mutates, the cookie is rewritten — a single `useStore(uiAtom)` call is\n * enough to persist UI preferences across reloads.\n *\n * Persists for 365 days; SameSite=lax so it travels on top-level navigation\n * but not on cross-origin requests.\n */\nexport class UiPersistence {\n ui = $cookie({\n name: \"alepha-ui\",\n key: uiAtom.key,\n schema: uiAtom.schema,\n ttl: [365, \"days\"],\n sameSite: \"lax\",\n });\n\n head = $head({\n script: [{ content: colorSchemeBoot }],\n });\n}\n","import { useStore } from \"alepha/react\";\nimport { useEffect, useState } from \"react\";\nimport { uiAtom } from \"../atoms/uiAtom.ts\";\n\nexport type ColorMode = \"light\" | \"dark\" | \"system\";\nexport type ResolvedColorMode = \"light\" | \"dark\";\n\n/**\n * Read and update the user's color-mode preference. `\"system\"` resolves to\n * the OS preference and updates live as the OS toggles between light/dark.\n *\n * @example\n * const { mode, setMode, resolved } = useColorMode();\n * setMode(\"dark\");\n * document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n */\nexport const useColorMode = () => {\n const [state, set] = useStore(uiAtom);\n const mode = (state?.mode ?? \"system\") as ColorMode;\n const resolved = useResolvedColorMode(mode);\n\n return {\n mode,\n resolved,\n setMode: (next: ColorMode) => {\n set({ ...(state ?? uiAtom.options.default!), mode: next });\n },\n };\n};\n\nconst useResolvedColorMode = (mode: ColorMode): ResolvedColorMode => {\n const [systemDark, setSystemDark] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches ?? false;\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n if (!mq) return;\n const onChange = (ev: MediaQueryListEvent) => setSystemDark(ev.matches);\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n }, []);\n\n if (mode === \"dark\") return \"dark\";\n if (mode === \"light\") return \"light\";\n return systemDark ? \"dark\" : \"light\";\n};\n","import { useStore } from \"alepha/react\";\nimport { uiAtom } from \"../atoms/uiAtom.ts\";\n\n/**\n * Read and update the active theme palette name. UI consumers typically map\n * the value to a class on the document root (e.g. `theme-claude`).\n *\n * @example\n * const { theme, setTheme } = useTheme();\n * setTheme(\"claude\");\n */\nexport const useTheme = () => {\n const [state, set] = useStore(uiAtom);\n const theme = state?.theme ?? \"default\";\n\n return {\n theme,\n setTheme: (next: string) => {\n set({ ...(state ?? uiAtom.options.default!), theme: next });\n },\n };\n};\n","import { useEffect } from \"react\";\nimport { useColorMode } from \"../hooks/useColorMode.ts\";\nimport { useTheme } from \"../hooks/useTheme.ts\";\n\n/**\n * Applies `class=\"dark\"` and an optional theme palette class\n * (`theme-<name>`) to the document root, syncing whenever the underlying\n * atom mutates.\n *\n * Mount once near the root of your tree (typically inside the layout).\n *\n * @example\n * <ColorScheme />\n */\nexport function ColorScheme() {\n const { resolved } = useColorMode();\n const { theme } = useTheme();\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n }, [resolved]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const previous: string[] = [];\n root.classList.forEach((cls) => {\n if (cls.startsWith(\"theme-\")) previous.push(cls);\n });\n for (const cls of previous) root.classList.remove(cls);\n if (theme && theme !== \"default\") root.classList.add(`theme-${theme}`);\n }, [theme]);\n\n return null;\n}\n","import { useStore } from \"alepha/react\";\nimport { uiAtom } from \"../atoms/uiAtom.ts\";\n\n/**\n * Read and update the sidebar collapsed state. The value is persisted via the\n * `alepha-ui` cookie so it survives reloads and is available during SSR — no\n * flash of expanded-then-collapsed when the user prefers a collapsed shell.\n *\n * @example\n * const { collapsed, setCollapsed, toggle } = useSidebarState();\n */\nexport const useSidebarState = () => {\n const [state, set] = useStore(uiAtom);\n const collapsed = state?.sidebar.collapsed ?? false;\n\n const setCollapsed = (next: boolean) => {\n const base = state ?? uiAtom.options.default!;\n set({ ...base, sidebar: { ...base.sidebar, collapsed: next } });\n };\n\n return {\n collapsed,\n setCollapsed,\n toggle: () => setCollapsed(!collapsed),\n };\n};\n","import type { FormModel } from \"alepha/react/form\";\n\n/**\n * Schema-bound metadata read by `<Control>` (in `@alepha/ui`) to configure\n * how a field renders. Place under `$control` on any TypeBox schema option.\n *\n * Two forms:\n *\n * 1. **Object** — static configuration baked into the schema:\n * ```ts\n * t.string({ $control: { password: true, icon: \"key\" } })\n * ```\n *\n * 2. **Function** — dynamic, computed from current form state:\n * ```ts\n * t.string({\n * $control: ({ form, value }) => {\n * if (form.currentValues.kind !== \"advanced\") return false; // hide\n * return { items: () => fetchOptions(form.currentValues.kind) };\n * },\n * })\n * ```\n *\n * The function may return:\n * - a partial `SchemaControl` to merge with explicit `<Control>` props\n * - `false` to hide the control entirely\n * - `undefined` to leave the field as-is\n */\nexport interface SchemaControl {\n // ── Variant forcing ────────────────────────────────────────────────\n text?: boolean;\n area?: boolean;\n password?: boolean;\n switch?: boolean;\n number?: boolean;\n file?: boolean;\n date?: boolean;\n datetime?: boolean;\n time?: boolean;\n select?: boolean;\n combobox?: boolean;\n segmented?: boolean;\n slider?: boolean;\n object?: boolean;\n array?: boolean;\n\n // ── Labels / hints ────────────────────────────────────────────────\n /**\n * Icon name. The registry control maps this to its icon set\n * (lucide-react). Pass `null` to suppress the schema-inferred icon.\n */\n icon?: string | null;\n label?: string;\n description?: string;\n placeholder?: string;\n /**\n * HTML `autocomplete` attribute. Use standard tokens like\n * `\"username\"`, `\"email\"`, `\"new-password\"`, `\"current-password\"`,\n * `\"street-address\"`, `\"address-line1\"`, `\"address-level2\"` (city),\n * `\"postal-code\"`, `\"country\"`, `\"cc-number\"`, `\"cc-exp\"`,\n * `\"cc-csc\"`, `\"cc-name\"`, `\"tel\"`, etc.\n */\n autoComplete?: string;\n\n // ── Data ──────────────────────────────────────────────────────────\n /**\n * Static or async option list for select / combobox / multi-select.\n * Each item is either a bare string (used as both value & label) or a\n * `{ value, label, description?, tag? }` object.\n */\n items?: Array<string | SchemaControlItem> | SchemaControlItemsFn;\n\n /**\n * Re-fetch `items` (when async) whenever any of these reference values\n * change. Useful for cascading selects.\n */\n itemsWatch?: unknown[];\n\n /**\n * Allow the user to create a new option by typing into a select /\n * multi-select. Pass `true` for `{ value: query, label: query }`, or a\n * function returning a custom option built from the query.\n */\n createNewEntry?:\n | boolean\n | ((query: string) => { value: string; label: string });\n\n // ── Layout ────────────────────────────────────────────────────────\n /**\n * Width slot inside an `<AutoForm>` group. Mapped to a grid column span.\n * - `100` → full row\n * - `75` → 3/4 row\n * - `66` → 2/3 row\n * - `50` → half\n * - `33` → one third (default for plain primitives)\n * - `25` → one quarter\n */\n width?: 100 | 75 | 66 | 50 | 33 | 25;\n\n // ── Behavior ─────────────────────────────────────────────────────\n /**\n * Render `null` (hide) when truthy. Equivalent to a function `$control`\n * returning `false`, but available as a static value.\n */\n hidden?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n\n // ── Slots ─────────────────────────────────────────────────────────\n /**\n * Render before/after the field. Both receive the resolved input.\n * Typed loosely — UI layer narrows to `ReactNode`.\n */\n top?: unknown;\n bottom?: unknown;\n\n // ── File upload ───────────────────────────────────────────────────\n /**\n * Render a managed upload control (image preview, multi, drag-drop)\n * that posts to the file API and stores the resulting file ID(s) in\n * the form. Pass `true` for defaults or an options object:\n *\n * ```ts\n * $control: { upload: { multi: true, accept: \"image/*\", maxSize: 5_000_000 } }\n * ```\n */\n upload?:\n | boolean\n | {\n multi?: boolean;\n accept?: string;\n maxSize?: number;\n bucket?: string;\n };\n\n // ── Array specifics ───────────────────────────────────────────────\n arrayProps?: {\n confirmDelete?: boolean | { title?: string; message?: string };\n /** Computed label for each tab when an array uses tabs mode. */\n renderTabName?: (i: number, value: unknown) => string;\n sortable?: boolean;\n collapsible?: boolean;\n /** Force grouped (CreateForm-style) tabs even for short arrays. */\n forceTabs?: boolean;\n };\n\n // ── Open extension ────────────────────────────────────────────────\n [key: string]: unknown;\n}\n\nexport interface SchemaControlItem {\n value: string | number | boolean;\n label: string;\n description?: string;\n tag?: string;\n}\n\nexport type SchemaControlItemsFn = (\n query: string,\n) =>\n | Array<string | SchemaControlItem>\n | Promise<Array<string | SchemaControlItem>>;\n\n/**\n * Function form of `$control`. Receives the live form model + the current\n * field value, and returns a partial config (merged with explicit props),\n * `false` to hide, or `undefined` to leave as-is.\n */\nexport type SchemaControlFn = (context: {\n form: FormModel<any>;\n value: unknown;\n}) => Partial<SchemaControl> | false | undefined;\n\nexport type SchemaControlOption = SchemaControl | SchemaControlFn;\n\n/**\n * Resolve a raw `$control` value (object or function) into a concrete\n * partial config. Returns `null` when the field should be hidden.\n */\nexport const resolveSchemaControl = (\n raw: unknown,\n context: { form: FormModel<any>; value: unknown },\n): Partial<SchemaControl> | null => {\n if (raw == null) return {};\n if (typeof raw === \"function\") {\n const result = (raw as SchemaControlFn)(context);\n if (result === false) return null;\n if (!result) return {};\n if (result.hidden) return null;\n return result;\n }\n if (typeof raw === \"object\") {\n const obj = raw as SchemaControl;\n if (obj.hidden) return null;\n return obj;\n }\n return {};\n};\n\ndeclare module \"typebox\" {\n interface TSchemaOptions {\n /**\n * UI metadata read by `<Control>` from `@alepha/ui`. See\n * {@link SchemaControl}.\n */\n $control?: SchemaControlOption;\n }\n}\n","import { $module } from \"alepha\";\nimport type { UiState } from \"./atoms/uiAtom.ts\";\nimport type { UiThemeList } from \"./atoms/uiThemeListAtom.ts\";\nimport { uiThemeListAtom } from \"./atoms/uiThemeListAtom.ts\";\nimport { UiPersistence } from \"./services/UiPersistence.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./atoms/uiAtom.ts\";\nexport * from \"./atoms/uiThemeListAtom.ts\";\nexport * from \"./components/ColorScheme.tsx\";\nexport * from \"./hooks/useColorMode.ts\";\nexport * from \"./hooks/useSidebarState.ts\";\nexport * from \"./hooks/useTheme.ts\";\nexport * from \"./services/SchemaControl.ts\";\nexport * from \"./services/UiPersistence.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n export interface State {\n \"alepha.react.ui\": UiState;\n \"alepha.react.ui.themes\": UiThemeList;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Persisted UI state: color mode, theme palette, sidebar collapsed state.\n *\n * Backed by an `alepha-ui` cookie so preferences survive reloads and are\n * available during SSR (no flash of wrong theme).\n *\n * @module alepha.react.ui\n */\nexport const AlephaReactUi = $module({\n name: \"alepha.react.ui\",\n atoms: [uiThemeListAtom],\n services: [UiPersistence],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/react/ui/atoms/uiThemeListAtom.ts","../../../src/react/ui/atoms/uiAtom.ts","../../../src/react/ui/services/UiPersistence.ts","../../../src/react/ui/hooks/useColorMode.ts","../../../src/react/ui/hooks/useTheme.ts","../../../src/react/ui/components/ColorScheme.tsx","../../../src/react/ui/hooks/useSidebarState.ts","../../../src/react/ui/services/SchemaControl.ts","../../../src/react/ui/index.ts"],"sourcesContent":["import { $atom, type Static, z } from \"alepha\";\n\n/**\n * Available themes the user can pick from. Apps populate this atom on boot\n * (e.g. `alepha.store.set(uiThemeListAtom, MY_THEMES)`); UI consumers like\n * `<ButtonTheme/>` read it to render a picker. The selected theme id is\n * persisted separately in `uiAtom.theme`.\n *\n * Defaults to a single `\"default\"` entry so the registry stays usable when\n * an app doesn't declare its own list.\n */\nexport const uiThemeListAtom = $atom({\n name: \"alepha.react.ui.themes\",\n schema: z.array(\n z.object({\n /** Stable id stored in `uiAtom.theme`. Mapped to a CSS class on `<html>`. */\n id: z.string(),\n /** Human-readable label shown in the picker. */\n label: z.string(),\n /**\n * Optional 4-color preview swatch in 2×2 order (TL, TR, BL, BR). Any\n * CSS-valid color string.\n */\n swatch: z.array(z.string()).min(4).max(4).optional(),\n /**\n * Optional stylesheet URL (typically Google Fonts) loaded lazily when\n * the theme is selected.\n */\n fontHref: z.string().optional(),\n }),\n ),\n default: [{ id: \"default\", label: \"Default\" }],\n});\n\nexport type UiThemeList = Static<typeof uiThemeListAtom.schema>;\nexport type UiTheme = UiThemeList[number];\n","import { $atom, type Static, z } from \"alepha\";\n\n/**\n * Persisted UI state — color mode, theme palette, sidebar collapsed state, etc.\n *\n * The atom is bound to a single `alepha-ui` cookie via {@link UiPersistence},\n * so values survive page reloads and are available during SSR.\n */\nexport const uiAtom = $atom({\n name: \"alepha.react.ui\",\n schema: z.object({\n /** Color mode preference. `\"system\"` follows the OS-level setting. */\n mode: z.enum([\"light\", \"dark\", \"system\"]),\n /** Theme palette name. UI consumers map this to a CSS class on the root. */\n theme: z.string(),\n /** Sidebar UI state. */\n sidebar: z.object({\n collapsed: z.boolean(),\n }),\n }),\n default: {\n mode: \"system\",\n theme: \"default\",\n sidebar: { collapsed: false },\n },\n});\n\nexport type UiState = Static<typeof uiAtom.schema>;\n","import { $head } from \"alepha/react/head\";\nimport { $cookie } from \"alepha/server/cookies\";\nimport { uiAtom } from \"../atoms/uiAtom.ts\";\n\n/**\n * Inline `<script>` rendered by SSR into the document `<head>`. Runs\n * synchronously before any CSS or React hydration: reads the `alepha-ui`\n * cookie, resolves `mode === \"system\"` via `prefers-color-scheme`, and\n * applies `class=\"dark\"` (and optional `theme-<name>`) on `<html>`.\n *\n * This is what kills the flash-of-wrong-theme (FOUC) you'd otherwise get\n * with React-effect-based theming. Failures are swallowed silently — at\n * worst the page paints in light mode for one frame.\n */\nconst colorSchemeBoot = `(function(){try{var m=document.cookie.match(/(?:^|;\\\\s*)alepha-ui=([^;]+)/);var s=m?JSON.parse(decodeURIComponent(m[1])):{};var mode=s.mode||\"system\";var dark=mode===\"dark\"||(mode===\"system\"&&window.matchMedia&&window.matchMedia(\"(prefers-color-scheme: dark)\").matches);var r=document.documentElement;if(dark)r.classList.add(\"dark\");if(s.theme&&s.theme!==\"default\")r.classList.add(\"theme-\"+s.theme);}catch(e){}})();`;\n\n/**\n * Binds the {@link uiAtom} to an `alepha-ui` cookie + injects an inline\n * boot script into the SSR head to prevent FOUC on first paint.\n *\n * Reading flow: on app boot the cookie is parsed and pushed into the atom\n * (via the `key` option on `$cookie`). Writing flow: every time the atom\n * mutates, the cookie is rewritten — a single `useStore(uiAtom)` call is\n * enough to persist UI preferences across reloads.\n *\n * Persists for 365 days; SameSite=lax so it travels on top-level navigation\n * but not on cross-origin requests.\n */\nexport class UiPersistence {\n ui = $cookie({\n name: \"alepha-ui\",\n key: uiAtom.key,\n schema: uiAtom.schema,\n ttl: [365, \"days\"],\n sameSite: \"lax\",\n });\n\n head = $head({\n script: [{ content: colorSchemeBoot }],\n });\n}\n","import { useStore } from \"alepha/react\";\nimport { useEffect, useState } from \"react\";\nimport { uiAtom } from \"../atoms/uiAtom.ts\";\n\nexport type ColorMode = \"light\" | \"dark\" | \"system\";\nexport type ResolvedColorMode = \"light\" | \"dark\";\n\n/**\n * Read and update the user's color-mode preference. `\"system\"` resolves to\n * the OS preference and updates live as the OS toggles between light/dark.\n *\n * @example\n * const { mode, setMode, resolved } = useColorMode();\n * setMode(\"dark\");\n * document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n */\nexport const useColorMode = () => {\n const [state, set] = useStore(uiAtom);\n const mode = (state?.mode ?? \"system\") as ColorMode;\n const resolved = useResolvedColorMode(mode);\n\n return {\n mode,\n resolved,\n setMode: (next: ColorMode) => {\n set({ ...(state ?? uiAtom.options.default!), mode: next });\n },\n };\n};\n\nconst useResolvedColorMode = (mode: ColorMode): ResolvedColorMode => {\n // Must start `false` on BOTH the server and the client's first (hydration)\n // render — `window.matchMedia` is client-only, so a lazy initializer reading\n // it would make the first client render disagree with the server for\n // `mode === \"system\"` (server resolves \"light\", a dark-OS client resolves\n // \"dark\"), tripping a React hydration mismatch (#418) on any SSR'd page that\n // renders off `resolved` (e.g. the color-mode toggle icon). The real OS\n // preference is synced in the effect below, immediately after mount. No-flash\n // CSS is handled separately by the boot script, so this costs at most a\n // one-frame icon correction, never a color flash.\n const [systemDark, setSystemDark] = useState(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n if (!mq) return;\n setSystemDark(mq.matches);\n const onChange = (ev: MediaQueryListEvent) => setSystemDark(ev.matches);\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n }, []);\n\n if (mode === \"dark\") return \"dark\";\n if (mode === \"light\") return \"light\";\n return systemDark ? \"dark\" : \"light\";\n};\n","import { useStore } from \"alepha/react\";\nimport { uiAtom } from \"../atoms/uiAtom.ts\";\n\n/**\n * Read and update the active theme palette name. UI consumers typically map\n * the value to a class on the document root (e.g. `theme-claude`).\n *\n * @example\n * const { theme, setTheme } = useTheme();\n * setTheme(\"claude\");\n */\nexport const useTheme = () => {\n const [state, set] = useStore(uiAtom);\n const theme = state?.theme ?? \"default\";\n\n return {\n theme,\n setTheme: (next: string) => {\n set({ ...(state ?? uiAtom.options.default!), theme: next });\n },\n };\n};\n","import { useEffect } from \"react\";\nimport { useColorMode } from \"../hooks/useColorMode.ts\";\nimport { useTheme } from \"../hooks/useTheme.ts\";\n\n/**\n * Applies `class=\"dark\"` and an optional theme palette class\n * (`theme-<name>`) to the document root, syncing whenever the underlying\n * atom mutates.\n *\n * Mount once near the root of your tree (typically inside the layout).\n *\n * @example\n * <ColorScheme />\n */\nexport function ColorScheme() {\n const { resolved } = useColorMode();\n const { theme } = useTheme();\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n }, [resolved]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const previous: string[] = [];\n root.classList.forEach((cls) => {\n if (cls.startsWith(\"theme-\")) previous.push(cls);\n });\n for (const cls of previous) root.classList.remove(cls);\n if (theme && theme !== \"default\") root.classList.add(`theme-${theme}`);\n }, [theme]);\n\n return null;\n}\n","import { useStore } from \"alepha/react\";\nimport { uiAtom } from \"../atoms/uiAtom.ts\";\n\n/**\n * Read and update the sidebar collapsed state. The value is persisted via the\n * `alepha-ui` cookie so it survives reloads and is available during SSR — no\n * flash of expanded-then-collapsed when the user prefers a collapsed shell.\n *\n * @example\n * const { collapsed, setCollapsed, toggle } = useSidebarState();\n */\nexport const useSidebarState = () => {\n const [state, set] = useStore(uiAtom);\n const collapsed = state?.sidebar.collapsed ?? false;\n\n const setCollapsed = (next: boolean) => {\n const base = state ?? uiAtom.options.default!;\n set({ ...base, sidebar: { ...base.sidebar, collapsed: next } });\n };\n\n return {\n collapsed,\n setCollapsed,\n toggle: () => setCollapsed(!collapsed),\n };\n};\n","import type { FormModel } from \"alepha/react/form\";\n\n/**\n * Schema-bound metadata read by `<Control>` (in `@alepha/ui`) to configure\n * how a field renders. Place under `$control` on any TypeBox schema option.\n *\n * Two forms:\n *\n * 1. **Object** — static configuration baked into the schema:\n * ```ts\n * z.string({ $control: { password: true, icon: \"key\" } })\n * ```\n *\n * 2. **Function** — dynamic, computed from current form state:\n * ```ts\n * z.string({\n * $control: ({ form, value }) => {\n * if (form.currentValues.kind !== \"advanced\") return false; // hide\n * return { items: () => fetchOptions(form.currentValues.kind) };\n * },\n * })\n * ```\n *\n * The function may return:\n * - a partial `SchemaControl` to merge with explicit `<Control>` props\n * - `false` to hide the control entirely\n * - `undefined` to leave the field as-is\n */\nexport interface SchemaControl {\n // ── Variant forcing ────────────────────────────────────────────────\n text?: boolean;\n area?: boolean;\n password?: boolean;\n switch?: boolean;\n number?: boolean;\n file?: boolean;\n date?: boolean;\n datetime?: boolean;\n time?: boolean;\n select?: boolean;\n combobox?: boolean;\n segmented?: boolean;\n slider?: boolean;\n object?: boolean;\n array?: boolean;\n\n // ── Labels / hints ────────────────────────────────────────────────\n /**\n * Icon name. The registry control maps this to its icon set\n * (lucide-react). Pass `null` to suppress the schema-inferred icon.\n */\n icon?: string | null;\n label?: string;\n description?: string;\n placeholder?: string;\n /**\n * HTML `autocomplete` attribute. Use standard tokens like\n * `\"username\"`, `\"email\"`, `\"new-password\"`, `\"current-password\"`,\n * `\"street-address\"`, `\"address-line1\"`, `\"address-level2\"` (city),\n * `\"postal-code\"`, `\"country\"`, `\"cc-number\"`, `\"cc-exp\"`,\n * `\"cc-csc\"`, `\"cc-name\"`, `\"tel\"`, etc.\n */\n autoComplete?: string;\n\n // ── Data ──────────────────────────────────────────────────────────\n /**\n * Static or async option list for select / combobox / multi-select.\n * Each item is either a bare string (used as both value & label) or a\n * `{ value, label, description?, tag? }` object.\n */\n items?: Array<string | SchemaControlItem> | SchemaControlItemsFn;\n\n /**\n * Re-fetch `items` (when async) whenever any of these reference values\n * change. Useful for cascading selects.\n */\n itemsWatch?: unknown[];\n\n /**\n * Allow the user to create a new option by typing into a select /\n * multi-select. Pass `true` for `{ value: query, label: query }`, or a\n * function returning a custom option built from the query.\n */\n createNewEntry?:\n | boolean\n | ((query: string) => { value: string; label: string });\n\n // ── Layout ────────────────────────────────────────────────────────\n /**\n * Width slot inside an `<AutoForm>` group. Mapped to a grid column span.\n * - `100` → full row\n * - `75` → 3/4 row\n * - `66` → 2/3 row\n * - `50` → half\n * - `33` → one third (default for plain primitives)\n * - `25` → one quarter\n */\n width?: 100 | 75 | 66 | 50 | 33 | 25;\n\n // ── Behavior ─────────────────────────────────────────────────────\n /**\n * Render `null` (hide) when truthy. Equivalent to a function `$control`\n * returning `false`, but available as a static value.\n */\n hidden?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n\n // ── Slots ─────────────────────────────────────────────────────────\n /**\n * Render before/after the field. Both receive the resolved input.\n * Typed loosely — UI layer narrows to `ReactNode`.\n */\n top?: unknown;\n bottom?: unknown;\n\n // ── File upload ───────────────────────────────────────────────────\n /**\n * Render a managed upload control (image preview, multi, drag-drop)\n * that posts to the file API and stores the resulting file ID(s) in\n * the form. Pass `true` for defaults or an options object:\n *\n * ```ts\n * $control: { upload: { multi: true, accept: \"image/*\", maxSize: 5_000_000 } }\n * ```\n */\n upload?:\n | boolean\n | {\n multi?: boolean;\n accept?: string;\n maxSize?: number;\n bucket?: string;\n };\n\n // ── Array specifics ───────────────────────────────────────────────\n arrayProps?: {\n confirmDelete?: boolean | { title?: string; message?: string };\n /** Computed label for each tab when an array uses tabs mode. */\n renderTabName?: (i: number, value: unknown) => string;\n sortable?: boolean;\n collapsible?: boolean;\n /** Force grouped (CreateForm-style) tabs even for short arrays. */\n forceTabs?: boolean;\n };\n\n // ── Open extension ────────────────────────────────────────────────\n [key: string]: unknown;\n}\n\nexport interface SchemaControlItem {\n value: string | number | boolean;\n label: string;\n description?: string;\n tag?: string;\n}\n\nexport type SchemaControlItemsFn = (\n query: string,\n) =>\n | Array<string | SchemaControlItem>\n | Promise<Array<string | SchemaControlItem>>;\n\n/**\n * Function form of `$control`. Receives the live form model + the current\n * field value, and returns a partial config (merged with explicit props),\n * `false` to hide, or `undefined` to leave as-is.\n */\nexport type SchemaControlFn = (context: {\n form: FormModel<any>;\n value: unknown;\n}) => Partial<SchemaControl> | false | undefined;\n\nexport type SchemaControlOption = SchemaControl | SchemaControlFn;\n\n/**\n * Resolve a raw `$control` value (object or function) into a concrete\n * partial config. Returns `null` when the field should be hidden.\n */\nexport const resolveSchemaControl = (\n raw: unknown,\n context: { form: FormModel<any>; value: unknown },\n): Partial<SchemaControl> | null => {\n if (raw == null) return {};\n if (typeof raw === \"function\") {\n const result = (raw as SchemaControlFn)(context);\n if (result === false) return null;\n if (!result) return {};\n if (result.hidden) return null;\n return result;\n }\n if (typeof raw === \"object\") {\n const obj = raw as SchemaControl;\n if (obj.hidden) return null;\n return obj;\n }\n return {};\n};\n\ndeclare module \"alepha\" {\n interface SchemaOptions {\n /**\n * UI metadata read by `<Control>` from `@alepha/ui`. See\n * {@link SchemaControl}.\n */\n $control?: SchemaControlOption;\n }\n}\n","import { $module } from \"alepha\";\nimport type { UiState } from \"./atoms/uiAtom.ts\";\nimport type { UiThemeList } from \"./atoms/uiThemeListAtom.ts\";\nimport { uiThemeListAtom } from \"./atoms/uiThemeListAtom.ts\";\nimport { UiPersistence } from \"./services/UiPersistence.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./atoms/uiAtom.ts\";\nexport * from \"./atoms/uiThemeListAtom.ts\";\nexport * from \"./components/ColorScheme.tsx\";\nexport * from \"./hooks/useColorMode.ts\";\nexport * from \"./hooks/useSidebarState.ts\";\nexport * from \"./hooks/useTheme.ts\";\nexport * from \"./services/SchemaControl.ts\";\nexport * from \"./services/UiPersistence.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n export interface State {\n \"alepha.react.ui\": UiState;\n \"alepha.react.ui.themes\": UiThemeList;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Persisted UI state: color mode, theme palette, sidebar collapsed state.\n *\n * Backed by an `alepha-ui` cookie so preferences survive reloads and are\n * available during SSR (no flash of wrong theme).\n *\n * @module alepha.react.ui\n */\nexport const AlephaReactUi = $module({\n name: \"alepha.react.ui\",\n atoms: [uiThemeListAtom],\n services: [UiPersistence],\n});\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { $env, $hook, $inject, $module, Alepha, AlephaError, t } from "alepha";
1
+ import { $env, $hook, $inject, $module, Alepha, AlephaError, z } from "alepha";
2
2
  import { $logger } from "alepha/logger";
3
3
  //#region ../../src/redis/providers/RedisProvider.ts
4
4
  /**
@@ -22,7 +22,7 @@ import { $logger } from "alepha/logger";
22
22
  var RedisProvider = class {};
23
23
  //#endregion
24
24
  //#region ../../src/redis/providers/BunRedisProvider.ts
25
- const envSchema = t.object({ REDIS_URL: t.text({
25
+ const envSchema = z.object({ REDIS_URL: z.text({
26
26
  default: "redis://localhost:6379",
27
27
  description: "Redis connection URL"
28
28
  }) });
@@ -130,9 +130,9 @@ var BunRedisProvider = class extends RedisProvider {
130
130
  if (options?.NX) args.push("NX");
131
131
  if (options?.XX) args.push("XX");
132
132
  if (options?.GET) args.push("GET");
133
- if (args.length === 2) await this.publisher.set(key, buf);
134
- else await this.publisher.send("SET", args);
135
- return buf;
133
+ const resp = args.length === 2 ? await this.publisher.set(key, buf) : await this.publisher.send("SET", args);
134
+ if (resp == null || resp === "OK") return buf;
135
+ return Buffer.isBuffer(resp) ? resp : Buffer.from(String(resp), "binary");
136
136
  }
137
137
  async has(key) {
138
138
  return this.publisher.exists(key);
@@ -1 +1 @@
1
- {"version":3,"file":"index.bun.js","names":[],"sources":["../../src/redis/providers/RedisProvider.ts","../../src/redis/providers/BunRedisProvider.ts","../../src/redis/providers/RedisSubscriberProvider.ts","../../src/redis/providers/BunRedisSubscriberProvider.ts","../../src/redis/index.bun.ts"],"sourcesContent":["/**\n * Abstract Redis provider interface.\n *\n * This abstract class defines the common interface for Redis operations.\n * Implementations include:\n * - {@link NodeRedisProvider} - Uses `@redis/client` for Node.js runtime\n * - {@link BunRedisProvider} - Uses Bun's native `RedisClient` for Bun runtime\n *\n * @example\n * ```ts\n * // Inject the abstract provider - runtime selects the implementation\n * const redis = alepha.inject(RedisProvider);\n *\n * // Use common operations\n * await redis.set(\"key\", \"value\");\n * const value = await redis.get(\"key\");\n * ```\n */\nexport abstract class RedisProvider {\n /**\n * Whether the Redis client is ready to accept commands.\n */\n public abstract readonly isReady: boolean;\n\n /**\n * Connect to the Redis server.\n */\n public abstract connect(): Promise<void>;\n\n /**\n * Close the connection to the Redis server.\n */\n public abstract close(): Promise<void>;\n\n /**\n * Get the value of a key.\n *\n * @param key The key to get.\n * @returns The value as a Buffer, or undefined if the key does not exist.\n */\n public abstract get(key: string): Promise<Buffer | undefined>;\n\n /**\n * Set the value of a key.\n *\n * @param key The key to set.\n * @param value The value to set (Buffer or string).\n * @param options Optional set options (EX, PX, NX, XX, etc.).\n * @returns The value as a Buffer.\n */\n public abstract set(\n key: string,\n value: Buffer | string,\n options?: RedisSetOptions,\n ): Promise<Buffer>;\n\n /**\n * Check if a key exists.\n *\n * @param key The key to check.\n * @returns True if the key exists.\n */\n public abstract has(key: string): Promise<boolean>;\n\n /**\n * Get all keys matching a pattern.\n *\n * @param pattern The glob-style pattern to match.\n * @returns Array of matching key names.\n */\n public abstract keys(pattern: string): Promise<string[]>;\n\n /**\n * Delete one or more keys.\n *\n * @param keys The keys to delete.\n */\n public abstract del(keys: string[]): Promise<void>;\n\n // ---------------------------------------------------------\n // Queue operations (for alepha/queue-redis)\n // ---------------------------------------------------------\n\n /**\n * Push a value to the left (head) of a list.\n *\n * @param key The list key.\n * @param value The value to push.\n */\n public abstract lpush(key: string, value: string): Promise<void>;\n\n /**\n * Pop a value from the right (tail) of a list.\n *\n * @param key The list key.\n * @returns The value, or undefined if the list is empty.\n */\n public abstract rpop(key: string): Promise<string | undefined>;\n\n // ---------------------------------------------------------\n // Pub/Sub operations (for alepha/topic-redis)\n // ---------------------------------------------------------\n\n /**\n * Publish a message to a channel.\n *\n * @param channel The channel name.\n * @param message The message to publish.\n */\n public abstract publish(channel: string, message: string): Promise<void>;\n\n // ---------------------------------------------------------\n // Counter operations\n // ---------------------------------------------------------\n\n /**\n * Increment the integer value of a key by the given amount.\n *\n * If the key does not exist, it is set to 0 before performing the operation.\n * This operation is atomic.\n *\n * @param key The key to increment.\n * @param amount The amount to increment by.\n * @returns The new value after incrementing.\n */\n public abstract incr(key: string, amount: number): Promise<number>;\n}\n\n/**\n * Common Redis SET command options.\n * Compatible with @redis/client SetOptions format.\n */\nexport interface RedisSetOptions {\n /**\n * Set the specified expire time, in seconds.\n */\n EX?: number;\n /**\n * Set the specified expire time, in milliseconds.\n */\n PX?: number;\n /**\n * Set the specified Unix time at which the key will expire, in seconds.\n */\n EXAT?: number;\n /**\n * Set the specified Unix time at which the key will expire, in milliseconds.\n */\n PXAT?: number;\n /**\n * Only set the key if it does not already exist.\n */\n NX?: boolean;\n /**\n * Only set the key if it already exists.\n */\n XX?: boolean;\n /**\n * Retain the time to live associated with the key.\n */\n KEEPTTL?: boolean;\n /**\n * Return the old string stored at key, or nil if key did not exist.\n */\n GET?: boolean;\n /**\n * Alternative expiration format (compatible with @redis/client).\n */\n expiration?: {\n type: \"EX\" | \"PX\" | \"EXAT\" | \"PXAT\" | \"KEEPTTL\";\n value: number;\n };\n /**\n * Alternative condition format (compatible with @redis/client).\n */\n condition?: \"NX\" | \"XX\";\n}\n","import {\n $env,\n $hook,\n $inject,\n Alepha,\n AlephaError,\n type Static,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { RedisProvider, type RedisSetOptions } from \"./RedisProvider.ts\";\n\nconst envSchema = t.object({\n REDIS_URL: t.text({\n default: \"redis://localhost:6379\",\n description: \"Redis connection URL\",\n }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * Bun Redis client provider using Bun's native Redis client.\n *\n * This provider uses Bun's built-in `RedisClient` class for Redis connections,\n * which provides excellent performance (7.9x faster than ioredis) on the Bun runtime.\n *\n * @example\n * ```ts\n * // Set REDIS_URL environment variable (default: redis://localhost:6379)\n * // REDIS_URL=redis://:password@myredis.example.com:6379\n *\n * // Or configure programmatically\n * alepha.with({\n * provide: RedisProvider,\n * use: BunRedisProvider,\n * });\n * ```\n */\nexport class BunRedisProvider extends RedisProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly env = $env(envSchema);\n protected client?: Bun.RedisClient;\n\n public get publisher(): Bun.RedisClient {\n if (!this.client?.connected) {\n throw new AlephaError(\"Redis client is not ready\");\n }\n\n return this.client;\n }\n\n public override get isReady(): boolean {\n return this.client?.connected ?? false;\n }\n\n protected readonly start = $hook({\n on: \"start\",\n handler: () => this.connect(),\n });\n\n protected readonly stop = $hook({\n on: \"stop\",\n handler: () => this.close(),\n });\n\n /**\n * Connect to the Redis server.\n */\n public override async connect(): Promise<void> {\n // Check if we're running in Bun\n if (!this.alepha.isBun()) {\n throw new AlephaError(\n \"BunRedisProvider requires the Bun runtime. Use NodeRedisProvider for Node.js.\",\n );\n }\n\n this.log.debug(\"Connecting...\");\n\n this.client = new Bun.RedisClient(this.getUrl(), {\n autoReconnect: true,\n enableAutoPipelining: true,\n });\n\n this.client.onconnect = () => {\n this.log.trace(\"Redis connected\");\n };\n\n this.client.onclose = (error) => {\n if (this.alepha.isStarted() && error) {\n this.log.error(\"Redis connection closed\", error);\n }\n };\n\n await this.client.connect();\n\n this.log.info(\"Connection OK\");\n }\n\n /**\n * Close the connection to the Redis server.\n */\n public override async close(): Promise<void> {\n if (this.client) {\n this.log.debug(\"Closing connection...\");\n this.client.close();\n this.client = undefined;\n this.log.info(\"Connection closed\");\n }\n }\n\n /**\n * Create a duplicate connection for pub/sub or other isolated operations.\n */\n public async duplicate(): Promise<Bun.RedisClient> {\n if (typeof Bun === \"undefined\") {\n throw new AlephaError(\"BunRedisProvider requires the Bun runtime.\");\n }\n\n const client = new Bun.RedisClient(this.getUrl(), {\n autoReconnect: true,\n enableAutoPipelining: true,\n });\n\n client.onclose = (error) => {\n if (this.alepha.isStarted() && error) {\n this.log.error(\"Redis duplicate connection closed\", error);\n }\n };\n\n await client.connect();\n\n return client;\n }\n\n public override async get(key: string): Promise<Buffer | undefined> {\n this.log.trace(`Getting key ${key}`);\n const resp = await this.publisher.getBuffer(key);\n\n if (resp === null) {\n return undefined;\n }\n\n return Buffer.from(resp);\n }\n\n public override async set(\n key: string,\n value: Buffer | string,\n options?: RedisSetOptions,\n ): Promise<Buffer> {\n const buf = Buffer.isBuffer(value) ? value : Buffer.from(value, \"utf-8\");\n\n // Build SET command arguments\n const args: string[] = [key, buf.toString(\"binary\")];\n\n // Handle expiration object format (from alepha/cache-redis, alepha/lock-redis)\n if (options?.expiration) {\n if (options.expiration.type === \"KEEPTTL\") {\n args.push(\"KEEPTTL\");\n } else {\n args.push(options.expiration.type, String(options.expiration.value));\n }\n }\n\n // Handle direct expiration properties\n if (options?.EX !== undefined) {\n args.push(\"EX\", String(options.EX));\n }\n if (options?.PX !== undefined) {\n args.push(\"PX\", String(options.PX));\n }\n if (options?.EXAT !== undefined) {\n args.push(\"EXAT\", String(options.EXAT));\n }\n if (options?.PXAT !== undefined) {\n args.push(\"PXAT\", String(options.PXAT));\n }\n if (options?.KEEPTTL) {\n args.push(\"KEEPTTL\");\n }\n\n // Handle condition object format\n if (options?.condition === \"NX\") {\n args.push(\"NX\");\n } else if (options?.condition === \"XX\") {\n args.push(\"XX\");\n }\n\n // Handle direct condition properties\n if (options?.NX) {\n args.push(\"NX\");\n }\n if (options?.XX) {\n args.push(\"XX\");\n }\n if (options?.GET) {\n args.push(\"GET\");\n }\n\n if (args.length === 2) {\n // Simple set without options\n await this.publisher.set(key, buf);\n } else {\n // Set with options via raw command\n await this.publisher.send(\"SET\", args);\n }\n\n return buf;\n }\n\n public override async has(key: string): Promise<boolean> {\n return this.publisher.exists(key);\n }\n\n public override async keys(pattern: string): Promise<string[]> {\n const keys = await this.publisher.send(\"KEYS\", [pattern]);\n if (!Array.isArray(keys)) {\n return [];\n }\n return keys.map((key) =>\n key instanceof Uint8Array ? Buffer.from(key).toString() : String(key),\n );\n }\n\n public override async del(keys: string[]): Promise<void> {\n if (keys.length === 0) {\n return;\n }\n\n await this.publisher.send(\"DEL\", keys);\n }\n\n // ---------------------------------------------------------\n // Queue operations\n // ---------------------------------------------------------\n\n public override async lpush(key: string, value: string): Promise<void> {\n await this.publisher.send(\"LPUSH\", [key, value]);\n }\n\n public override async rpop(key: string): Promise<string | undefined> {\n const value = await this.publisher.send(\"RPOP\", [key]);\n if (value == null) {\n return undefined;\n }\n if (value instanceof Uint8Array) {\n return Buffer.from(value).toString();\n }\n return String(value);\n }\n\n // ---------------------------------------------------------\n // Pub/Sub operations\n // ---------------------------------------------------------\n\n public override async publish(\n channel: string,\n message: string,\n ): Promise<void> {\n await this.publisher.publish(channel, message);\n }\n\n // ---------------------------------------------------------\n // Counter operations\n // ---------------------------------------------------------\n\n public override async incr(key: string, amount: number): Promise<number> {\n const result = await this.publisher.send(\"INCRBY\", [key, String(amount)]);\n return Number(result);\n }\n\n /**\n * Get the Redis connection URL.\n */\n protected getUrl(): string {\n return this.env.REDIS_URL;\n }\n}\n","/**\n * Abstract Redis subscriber provider interface.\n *\n * This abstract class defines the common interface for Redis pub/sub subscriptions.\n * Implementations include:\n * - {@link NodeRedisSubscriberProvider} - Uses `@redis/client` for Node.js runtime\n * - {@link BunRedisSubscriberProvider} - Uses Bun's native `RedisClient` for Bun runtime\n *\n * Redis requires separate connections for pub/sub operations, so this provider\n * creates a dedicated connection for subscriptions.\n *\n * @example\n * ```ts\n * // Inject the abstract provider - runtime selects the implementation\n * const subscriber = alepha.inject(RedisSubscriberProvider);\n *\n * // Subscribe to a channel\n * await subscriber.subscribe(\"my-channel\", (message, channel) => {\n * console.log(`Received: ${message} on ${channel}`);\n * });\n * ```\n */\nexport abstract class RedisSubscriberProvider {\n /**\n * Whether the Redis subscriber client is ready to accept commands.\n */\n public abstract readonly isReady: boolean;\n\n /**\n * Connect to the Redis server for subscriptions.\n */\n public abstract connect(): Promise<void>;\n\n /**\n * Close the subscriber connection.\n */\n public abstract close(): Promise<void>;\n\n /**\n * Subscribe to a channel.\n *\n * @param channel The channel name.\n * @param callback The callback to invoke when a message is received.\n */\n public abstract subscribe(\n channel: string,\n callback: SubscribeCallback,\n ): Promise<void>;\n\n /**\n * Unsubscribe from a channel.\n *\n * @param channel The channel name.\n * @param callback Optional specific callback to remove.\n */\n public abstract unsubscribe(\n channel: string,\n callback?: SubscribeCallback,\n ): Promise<void>;\n}\n\n/**\n * Callback for subscription messages.\n */\nexport type SubscribeCallback = (message: string, channel: string) => void;\n","import { $hook, $inject, Alepha, AlephaError } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { BunRedisProvider } from \"./BunRedisProvider.ts\";\nimport {\n RedisSubscriberProvider,\n type SubscribeCallback,\n} from \"./RedisSubscriberProvider.ts\";\n\n/**\n * Bun Redis subscriber provider for pub/sub operations.\n *\n * This provider creates a dedicated Redis connection for subscriptions,\n * as Redis requires separate connections for pub/sub operations.\n *\n * @example\n * ```ts\n * const subscriber = alepha.inject(RedisSubscriberProvider);\n * await subscriber.subscribe(\"channel\", (message, channel) => {\n * console.log(`Received: ${message} on ${channel}`);\n * });\n * ```\n */\nexport class BunRedisSubscriberProvider extends RedisSubscriberProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly redisProvider = $inject(BunRedisProvider);\n protected client?: Bun.RedisClient;\n\n public get subscriber(): Bun.RedisClient {\n if (!this.client?.connected) {\n throw new AlephaError(\"Redis subscriber client is not ready\");\n }\n\n return this.client;\n }\n\n public override get isReady(): boolean {\n return this.client?.connected ?? false;\n }\n\n protected readonly start = $hook({\n on: \"start\",\n handler: () => this.connect(),\n });\n\n protected readonly stop = $hook({\n on: \"stop\",\n handler: () => this.close(),\n });\n\n /**\n * Connect to the Redis server for subscriptions.\n */\n public override async connect(): Promise<void> {\n this.log.debug(\"Connecting subscriber...\");\n this.client = await this.redisProvider.duplicate();\n this.log.info(\"Subscriber connection OK\");\n }\n\n /**\n * Close the subscriber connection.\n */\n public override async close(): Promise<void> {\n if (this.client) {\n this.log.debug(\"Closing subscriber connection...\");\n this.client.close();\n this.client = undefined;\n this.log.info(\"Subscriber connection closed\");\n }\n }\n\n public override async subscribe(\n channel: string,\n callback: SubscribeCallback,\n ): Promise<void> {\n await this.subscriber.subscribe(channel, (message, ch) => {\n // Bun's callback provides Buffer or string, normalize to string\n const msg =\n typeof message === \"object\" && message !== null\n ? Buffer.from(message as Uint8Array).toString()\n : String(message);\n callback(msg, ch);\n });\n }\n\n public override async unsubscribe(\n channel: string,\n _callback?: SubscribeCallback,\n ): Promise<void> {\n // Bun's unsubscribe doesn't support callback filtering\n await this.subscriber.unsubscribe(channel);\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { BunRedisProvider } from \"./providers/BunRedisProvider.ts\";\nimport { BunRedisSubscriberProvider } from \"./providers/BunRedisSubscriberProvider.ts\";\nimport { RedisProvider } from \"./providers/RedisProvider.ts\";\nimport { RedisSubscriberProvider } from \"./providers/RedisSubscriberProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/BunRedisProvider.ts\";\nexport * from \"./providers/BunRedisSubscriberProvider.ts\";\nexport * from \"./providers/RedisProvider.ts\";\nexport * from \"./providers/RedisSubscriberProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaRedis = $module({\n name: \"alepha.redis\",\n services: [RedisProvider, RedisSubscriberProvider],\n variants: [BunRedisProvider, BunRedisSubscriberProvider],\n register: (alepha: Alepha) => {\n alepha\n .with({\n provide: RedisProvider,\n use: BunRedisProvider,\n })\n .with({\n provide: RedisSubscriberProvider,\n use: BunRedisSubscriberProvider,\n });\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.bun.js","names":[],"sources":["../../src/redis/providers/RedisProvider.ts","../../src/redis/providers/BunRedisProvider.ts","../../src/redis/providers/RedisSubscriberProvider.ts","../../src/redis/providers/BunRedisSubscriberProvider.ts","../../src/redis/index.bun.ts"],"sourcesContent":["/**\n * Abstract Redis provider interface.\n *\n * This abstract class defines the common interface for Redis operations.\n * Implementations include:\n * - {@link NodeRedisProvider} - Uses `@redis/client` for Node.js runtime\n * - {@link BunRedisProvider} - Uses Bun's native `RedisClient` for Bun runtime\n *\n * @example\n * ```ts\n * // Inject the abstract provider - runtime selects the implementation\n * const redis = alepha.inject(RedisProvider);\n *\n * // Use common operations\n * await redis.set(\"key\", \"value\");\n * const value = await redis.get(\"key\");\n * ```\n */\nexport abstract class RedisProvider {\n /**\n * Whether the Redis client is ready to accept commands.\n */\n public abstract readonly isReady: boolean;\n\n /**\n * Connect to the Redis server.\n */\n public abstract connect(): Promise<void>;\n\n /**\n * Close the connection to the Redis server.\n */\n public abstract close(): Promise<void>;\n\n /**\n * Get the value of a key.\n *\n * @param key The key to get.\n * @returns The value as a Buffer, or undefined if the key does not exist.\n */\n public abstract get(key: string): Promise<Buffer | undefined>;\n\n /**\n * Set the value of a key.\n *\n * @param key The key to set.\n * @param value The value to set (Buffer or string).\n * @param options Optional set options (EX, PX, NX, XX, etc.).\n * @returns The value as a Buffer.\n */\n public abstract set(\n key: string,\n value: Buffer | string,\n options?: RedisSetOptions,\n ): Promise<Buffer>;\n\n /**\n * Check if a key exists.\n *\n * @param key The key to check.\n * @returns True if the key exists.\n */\n public abstract has(key: string): Promise<boolean>;\n\n /**\n * Get all keys matching a pattern.\n *\n * @param pattern The glob-style pattern to match.\n * @returns Array of matching key names.\n */\n public abstract keys(pattern: string): Promise<string[]>;\n\n /**\n * Delete one or more keys.\n *\n * @param keys The keys to delete.\n */\n public abstract del(keys: string[]): Promise<void>;\n\n // ---------------------------------------------------------\n // Queue operations (for alepha/queue-redis)\n // ---------------------------------------------------------\n\n /**\n * Push a value to the left (head) of a list.\n *\n * @param key The list key.\n * @param value The value to push.\n */\n public abstract lpush(key: string, value: string): Promise<void>;\n\n /**\n * Pop a value from the right (tail) of a list.\n *\n * @param key The list key.\n * @returns The value, or undefined if the list is empty.\n */\n public abstract rpop(key: string): Promise<string | undefined>;\n\n // ---------------------------------------------------------\n // Pub/Sub operations (for alepha/topic-redis)\n // ---------------------------------------------------------\n\n /**\n * Publish a message to a channel.\n *\n * @param channel The channel name.\n * @param message The message to publish.\n */\n public abstract publish(channel: string, message: string): Promise<void>;\n\n // ---------------------------------------------------------\n // Counter operations\n // ---------------------------------------------------------\n\n /**\n * Increment the integer value of a key by the given amount.\n *\n * If the key does not exist, it is set to 0 before performing the operation.\n * This operation is atomic.\n *\n * @param key The key to increment.\n * @param amount The amount to increment by.\n * @returns The new value after incrementing.\n */\n public abstract incr(key: string, amount: number): Promise<number>;\n}\n\n/**\n * Common Redis SET command options.\n * Compatible with @redis/client SetOptions format.\n */\nexport interface RedisSetOptions {\n /**\n * Set the specified expire time, in seconds.\n */\n EX?: number;\n /**\n * Set the specified expire time, in milliseconds.\n */\n PX?: number;\n /**\n * Set the specified Unix time at which the key will expire, in seconds.\n */\n EXAT?: number;\n /**\n * Set the specified Unix time at which the key will expire, in milliseconds.\n */\n PXAT?: number;\n /**\n * Only set the key if it does not already exist.\n */\n NX?: boolean;\n /**\n * Only set the key if it already exists.\n */\n XX?: boolean;\n /**\n * Retain the time to live associated with the key.\n */\n KEEPTTL?: boolean;\n /**\n * Return the old string stored at key, or nil if key did not exist.\n */\n GET?: boolean;\n /**\n * Alternative expiration format (compatible with @redis/client).\n */\n expiration?: {\n type: \"EX\" | \"PX\" | \"EXAT\" | \"PXAT\" | \"KEEPTTL\";\n value: number;\n };\n /**\n * Alternative condition format (compatible with @redis/client).\n */\n condition?: \"NX\" | \"XX\";\n}\n","import {\n $env,\n $hook,\n $inject,\n Alepha,\n AlephaError,\n type Static,\n z,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { RedisProvider, type RedisSetOptions } from \"./RedisProvider.ts\";\n\nconst envSchema = z.object({\n REDIS_URL: z.text({\n default: \"redis://localhost:6379\",\n description: \"Redis connection URL\",\n }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * Bun Redis client provider using Bun's native Redis client.\n *\n * This provider uses Bun's built-in `RedisClient` class for Redis connections,\n * which provides excellent performance (7.9x faster than ioredis) on the Bun runtime.\n *\n * @example\n * ```ts\n * // Set REDIS_URL environment variable (default: redis://localhost:6379)\n * // REDIS_URL=redis://:password@myredis.example.com:6379\n *\n * // Or configure programmatically\n * alepha.with({\n * provide: RedisProvider,\n * use: BunRedisProvider,\n * });\n * ```\n */\nexport class BunRedisProvider extends RedisProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly env = $env(envSchema);\n protected client?: Bun.RedisClient;\n\n public get publisher(): Bun.RedisClient {\n if (!this.client?.connected) {\n throw new AlephaError(\"Redis client is not ready\");\n }\n\n return this.client;\n }\n\n public override get isReady(): boolean {\n return this.client?.connected ?? false;\n }\n\n protected readonly start = $hook({\n on: \"start\",\n handler: () => this.connect(),\n });\n\n protected readonly stop = $hook({\n on: \"stop\",\n handler: () => this.close(),\n });\n\n /**\n * Connect to the Redis server.\n */\n public override async connect(): Promise<void> {\n // Check if we're running in Bun\n if (!this.alepha.isBun()) {\n throw new AlephaError(\n \"BunRedisProvider requires the Bun runtime. Use NodeRedisProvider for Node.js.\",\n );\n }\n\n this.log.debug(\"Connecting...\");\n\n this.client = new Bun.RedisClient(this.getUrl(), {\n autoReconnect: true,\n enableAutoPipelining: true,\n });\n\n this.client.onconnect = () => {\n this.log.trace(\"Redis connected\");\n };\n\n this.client.onclose = (error) => {\n if (this.alepha.isStarted() && error) {\n this.log.error(\"Redis connection closed\", error);\n }\n };\n\n await this.client.connect();\n\n this.log.info(\"Connection OK\");\n }\n\n /**\n * Close the connection to the Redis server.\n */\n public override async close(): Promise<void> {\n if (this.client) {\n this.log.debug(\"Closing connection...\");\n this.client.close();\n this.client = undefined;\n this.log.info(\"Connection closed\");\n }\n }\n\n /**\n * Create a duplicate connection for pub/sub or other isolated operations.\n */\n public async duplicate(): Promise<Bun.RedisClient> {\n if (typeof Bun === \"undefined\") {\n throw new AlephaError(\"BunRedisProvider requires the Bun runtime.\");\n }\n\n const client = new Bun.RedisClient(this.getUrl(), {\n autoReconnect: true,\n enableAutoPipelining: true,\n });\n\n client.onclose = (error) => {\n if (this.alepha.isStarted() && error) {\n this.log.error(\"Redis duplicate connection closed\", error);\n }\n };\n\n await client.connect();\n\n return client;\n }\n\n public override async get(key: string): Promise<Buffer | undefined> {\n this.log.trace(`Getting key ${key}`);\n const resp = await this.publisher.getBuffer(key);\n\n if (resp === null) {\n return undefined;\n }\n\n return Buffer.from(resp);\n }\n\n public override async set(\n key: string,\n value: Buffer | string,\n options?: RedisSetOptions,\n ): Promise<Buffer> {\n const buf = Buffer.isBuffer(value) ? value : Buffer.from(value, \"utf-8\");\n\n // Build SET command arguments\n const args: string[] = [key, buf.toString(\"binary\")];\n\n // Handle expiration object format (from alepha/cache-redis, alepha/lock-redis)\n if (options?.expiration) {\n if (options.expiration.type === \"KEEPTTL\") {\n args.push(\"KEEPTTL\");\n } else {\n args.push(options.expiration.type, String(options.expiration.value));\n }\n }\n\n // Handle direct expiration properties\n if (options?.EX !== undefined) {\n args.push(\"EX\", String(options.EX));\n }\n if (options?.PX !== undefined) {\n args.push(\"PX\", String(options.PX));\n }\n if (options?.EXAT !== undefined) {\n args.push(\"EXAT\", String(options.EXAT));\n }\n if (options?.PXAT !== undefined) {\n args.push(\"PXAT\", String(options.PXAT));\n }\n if (options?.KEEPTTL) {\n args.push(\"KEEPTTL\");\n }\n\n // Handle condition object format\n if (options?.condition === \"NX\") {\n args.push(\"NX\");\n } else if (options?.condition === \"XX\") {\n args.push(\"XX\");\n }\n\n // Handle direct condition properties\n if (options?.NX) {\n args.push(\"NX\");\n }\n if (options?.XX) {\n args.push(\"XX\");\n }\n if (options?.GET) {\n args.push(\"GET\");\n }\n\n // Capture the reply. With the `GET` option the reply carries the *prior*\n // value, and the entire `$lock` protocol (`SET … NX GET`) depends on reading\n // it. Previously this discarded the reply and always returned the value it\n // just wrote, so under Bun every lock contender saw its own id back and\n // believed it had acquired the lock — RedisLockProvider (and therefore every\n // scheduler dedup / migration guard) became a silent no-op across instances.\n const resp =\n args.length === 2\n ? await this.publisher.set(key, buf)\n : await this.publisher.send(\"SET\", args);\n\n // Mirror NodeRedisProvider: \"OK\"/nil means \"applied, no prior value\" → echo\n // the value we wrote; any other reply is the prior value returned by GET.\n if (resp == null || resp === \"OK\") {\n return buf;\n }\n return Buffer.isBuffer(resp) ? resp : Buffer.from(String(resp), \"binary\");\n }\n\n public override async has(key: string): Promise<boolean> {\n return this.publisher.exists(key);\n }\n\n public override async keys(pattern: string): Promise<string[]> {\n const keys = await this.publisher.send(\"KEYS\", [pattern]);\n if (!Array.isArray(keys)) {\n return [];\n }\n return keys.map((key) =>\n key instanceof Uint8Array ? Buffer.from(key).toString() : String(key),\n );\n }\n\n public override async del(keys: string[]): Promise<void> {\n if (keys.length === 0) {\n return;\n }\n\n await this.publisher.send(\"DEL\", keys);\n }\n\n // ---------------------------------------------------------\n // Queue operations\n // ---------------------------------------------------------\n\n public override async lpush(key: string, value: string): Promise<void> {\n await this.publisher.send(\"LPUSH\", [key, value]);\n }\n\n public override async rpop(key: string): Promise<string | undefined> {\n const value = await this.publisher.send(\"RPOP\", [key]);\n if (value == null) {\n return undefined;\n }\n if (value instanceof Uint8Array) {\n return Buffer.from(value).toString();\n }\n return String(value);\n }\n\n // ---------------------------------------------------------\n // Pub/Sub operations\n // ---------------------------------------------------------\n\n public override async publish(\n channel: string,\n message: string,\n ): Promise<void> {\n await this.publisher.publish(channel, message);\n }\n\n // ---------------------------------------------------------\n // Counter operations\n // ---------------------------------------------------------\n\n public override async incr(key: string, amount: number): Promise<number> {\n const result = await this.publisher.send(\"INCRBY\", [key, String(amount)]);\n return Number(result);\n }\n\n /**\n * Get the Redis connection URL.\n */\n protected getUrl(): string {\n return this.env.REDIS_URL;\n }\n}\n","/**\n * Abstract Redis subscriber provider interface.\n *\n * This abstract class defines the common interface for Redis pub/sub subscriptions.\n * Implementations include:\n * - {@link NodeRedisSubscriberProvider} - Uses `@redis/client` for Node.js runtime\n * - {@link BunRedisSubscriberProvider} - Uses Bun's native `RedisClient` for Bun runtime\n *\n * Redis requires separate connections for pub/sub operations, so this provider\n * creates a dedicated connection for subscriptions.\n *\n * @example\n * ```ts\n * // Inject the abstract provider - runtime selects the implementation\n * const subscriber = alepha.inject(RedisSubscriberProvider);\n *\n * // Subscribe to a channel\n * await subscriber.subscribe(\"my-channel\", (message, channel) => {\n * console.log(`Received: ${message} on ${channel}`);\n * });\n * ```\n */\nexport abstract class RedisSubscriberProvider {\n /**\n * Whether the Redis subscriber client is ready to accept commands.\n */\n public abstract readonly isReady: boolean;\n\n /**\n * Connect to the Redis server for subscriptions.\n */\n public abstract connect(): Promise<void>;\n\n /**\n * Close the subscriber connection.\n */\n public abstract close(): Promise<void>;\n\n /**\n * Subscribe to a channel.\n *\n * @param channel The channel name.\n * @param callback The callback to invoke when a message is received.\n */\n public abstract subscribe(\n channel: string,\n callback: SubscribeCallback,\n ): Promise<void>;\n\n /**\n * Unsubscribe from a channel.\n *\n * @param channel The channel name.\n * @param callback Optional specific callback to remove.\n */\n public abstract unsubscribe(\n channel: string,\n callback?: SubscribeCallback,\n ): Promise<void>;\n}\n\n/**\n * Callback for subscription messages.\n */\nexport type SubscribeCallback = (message: string, channel: string) => void;\n","import { $hook, $inject, Alepha, AlephaError } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { BunRedisProvider } from \"./BunRedisProvider.ts\";\nimport {\n RedisSubscriberProvider,\n type SubscribeCallback,\n} from \"./RedisSubscriberProvider.ts\";\n\n/**\n * Bun Redis subscriber provider for pub/sub operations.\n *\n * This provider creates a dedicated Redis connection for subscriptions,\n * as Redis requires separate connections for pub/sub operations.\n *\n * @example\n * ```ts\n * const subscriber = alepha.inject(RedisSubscriberProvider);\n * await subscriber.subscribe(\"channel\", (message, channel) => {\n * console.log(`Received: ${message} on ${channel}`);\n * });\n * ```\n */\nexport class BunRedisSubscriberProvider extends RedisSubscriberProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly redisProvider = $inject(BunRedisProvider);\n protected client?: Bun.RedisClient;\n\n public get subscriber(): Bun.RedisClient {\n if (!this.client?.connected) {\n throw new AlephaError(\"Redis subscriber client is not ready\");\n }\n\n return this.client;\n }\n\n public override get isReady(): boolean {\n return this.client?.connected ?? false;\n }\n\n protected readonly start = $hook({\n on: \"start\",\n handler: () => this.connect(),\n });\n\n protected readonly stop = $hook({\n on: \"stop\",\n handler: () => this.close(),\n });\n\n /**\n * Connect to the Redis server for subscriptions.\n */\n public override async connect(): Promise<void> {\n this.log.debug(\"Connecting subscriber...\");\n this.client = await this.redisProvider.duplicate();\n this.log.info(\"Subscriber connection OK\");\n }\n\n /**\n * Close the subscriber connection.\n */\n public override async close(): Promise<void> {\n if (this.client) {\n this.log.debug(\"Closing subscriber connection...\");\n this.client.close();\n this.client = undefined;\n this.log.info(\"Subscriber connection closed\");\n }\n }\n\n public override async subscribe(\n channel: string,\n callback: SubscribeCallback,\n ): Promise<void> {\n await this.subscriber.subscribe(channel, (message, ch) => {\n // Bun's callback provides Buffer or string, normalize to string\n const msg =\n typeof message === \"object\" && message !== null\n ? Buffer.from(message as Uint8Array).toString()\n : String(message);\n callback(msg, ch);\n });\n }\n\n public override async unsubscribe(\n channel: string,\n _callback?: SubscribeCallback,\n ): Promise<void> {\n // Bun's unsubscribe doesn't support callback filtering\n await this.subscriber.unsubscribe(channel);\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { BunRedisProvider } from \"./providers/BunRedisProvider.ts\";\nimport { BunRedisSubscriberProvider } from \"./providers/BunRedisSubscriberProvider.ts\";\nimport { RedisProvider } from \"./providers/RedisProvider.ts\";\nimport { RedisSubscriberProvider } from \"./providers/RedisSubscriberProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/BunRedisProvider.ts\";\nexport * from \"./providers/BunRedisSubscriberProvider.ts\";\nexport * from \"./providers/RedisProvider.ts\";\nexport * from \"./providers/RedisSubscriberProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaRedis = $module({\n name: \"alepha.redis\",\n services: [RedisProvider, RedisSubscriberProvider],\n variants: [BunRedisProvider, BunRedisSubscriberProvider],\n register: (alepha: Alepha) => {\n alepha\n .with({\n provide: RedisProvider,\n use: BunRedisProvider,\n })\n .with({\n provide: RedisSubscriberProvider,\n use: BunRedisSubscriberProvider,\n });\n },\n});\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { Alepha, Static } from "alepha";
2
2
  import { RedisClientType, createClient } from "@redis/client";
3
-
4
3
  //#region ../../src/redis/providers/RedisProvider.d.ts
5
4
  /**
6
5
  * Abstract Redis provider interface.
@@ -153,9 +152,9 @@ interface RedisSetOptions {
153
152
  }
154
153
  //#endregion
155
154
  //#region ../../src/redis/providers/BunRedisProvider.d.ts
156
- declare const envSchema$1: import("alepha").TObject<{
157
- REDIS_URL: import("alepha").TString;
158
- }>;
155
+ declare const envSchema$1: import("zod").ZodObject<{
156
+ REDIS_URL: import("zod").ZodString;
157
+ }, import("zod/v4/core").$strip>;
159
158
  declare module "alepha" {
160
159
  interface Env extends Partial<Static<typeof envSchema$1>> {}
161
160
  }
@@ -308,9 +307,9 @@ declare class BunRedisSubscriberProvider extends RedisSubscriberProvider {
308
307
  }
309
308
  //#endregion
310
309
  //#region ../../src/redis/providers/NodeRedisProvider.d.ts
311
- declare const envSchema: import("alepha").TObject<{
312
- REDIS_URL: import("alepha").TString;
313
- }>;
310
+ declare const envSchema: import("zod").ZodObject<{
311
+ REDIS_URL: import("zod").ZodString;
312
+ }, import("zod/v4/core").$strip>;
314
313
  declare module "alepha" {
315
314
  interface Env extends Partial<Static<typeof envSchema>> {}
316
315
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/redis/providers/RedisProvider.ts","../../src/redis/providers/BunRedisProvider.ts","../../src/redis/providers/RedisSubscriberProvider.ts","../../src/redis/providers/BunRedisSubscriberProvider.ts","../../src/redis/providers/NodeRedisProvider.ts","../../src/redis/providers/NodeRedisSubscriberProvider.ts","../../src/redis/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/redis/providers/RedisProvider.ts","../../src/redis/providers/BunRedisProvider.ts","../../src/redis/providers/RedisSubscriberProvider.ts","../../src/redis/providers/BunRedisSubscriberProvider.ts","../../src/redis/providers/NodeRedisProvider.ts","../../src/redis/providers/NodeRedisSubscriberProvider.ts","../../src/redis/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;uBAkBsB;;;;oBAIK;;;;WAKT,WAAW;;;;WAKX,SAAS;;;;;;;WAQT,IAAI,cAAc,QAAQ;;;;;;;;;WAU1B,IACd,aACA,OAAO,iBACP,UAAU,kBACT,QAAQ;;;;;;;WAQK,IAAI,cAAc;;;;;;;WAQlB,KAAK,kBAAkB;;;;;;WAOvB,IAAI,iBAAiB;;;;;;;WAYrB,MAAM,aAAa,gBAAgB;;;;;;;WAQnC,KAAK,cAAc;;;;;;;WAYnB,QAAQ,iBAAiB,kBAAkB;;;;;;;;;;;WAgB3C,KAAK,aAAa,iBAAiB;;;;;;UAOpC;;;;EAIf;;;;EAIA;;;;EAIA;;;;EAIA;;;;EAIA;;;;EAIA;;;;EAIA;;;;EAIA;;;;EAIA;IACE;IACA;;;;;EAKF;;;;cCnKI,2BAAS;;;;YAQH,YAAY,QAAQ,cAAc;;;;;;;;;;;;;;;;;;;;cAqBjC,yBAAyB;qBACjB,6BAAG;qBACH,QAAM;qBACN;;;YACT,SAAS,IAAI;MAEZ,aAAa,IAAI;MAQR;qBAID,wBAAK;qBAKL,uBAAI;;;;EAQD,WAAW;;;;EAiCX,SAAS;;;;EAYlB,aAAa,QAAQ,IAAI;EAqBhB,IAAI,cAAc,QAAQ;EAW1B,IACpB,aACA,OAAO,iBACP,UAAU,kBACT,QAAQ;EAqEW,IAAI,cAAc;EAIlB,KAAK,kBAAkB;EAUvB,IAAI,iBAAiB;EAYrB,MAAM,aAAa,gBAAgB;EAInC,KAAK,cAAc;EAenB,QACpB,iBACA,kBACC;EAQmB,KAAK,aAAa,iBAAiB;;;;YAQ/C;;;;;;;;;;;;;;;;;;;;;;;;;;uBCxQU;;;;oBAIK;;;;WAKT,WAAW;;;;WAKX,SAAS;;;;;;;WAQT,UACd,iBACA,UAAU,oBACT;;;;;;;WAQa,YACd,iBACA,WAAW,oBACV;;;;;KAMO,qBAAqB,iBAAiB;;;;;;;;;;;;;;;;;cC1CrC,mCAAmC;qBAC3B,6BAAG;qBACH,QAAM;qBACN,eAAa;YACtB,SAAS,IAAI;MAEZ,cAAc,IAAI;MAQT;qBAID,wBAAK;qBAKL,uBAAI;;;;EAQD,WAAW;;;;EASX,SAAS;EAST,UACpB,iBACA,UAAU,oBACT;EAWmB,YACpB,iBACA,YAAY,oBACX;;;;cCtEC,yBAAS;;;;YAQH,YAAY,QAAQ,cAAc;;KAGlC,kBAAkB;EAK1B,IAAI;;KAEI,yBAAyB,kBAAkB;;;;;;;;;;;;;;;;;;cAmB1C,0BAA0B;qBAClB,6BAAG;qBACH,QAAM;qBACN;;;qBACA,QAAM;MAEd,aAAa;MAQJ;qBAID,wBAAK;qBAKL,uBAAI;;;;EAQD,WAAW;;;;EASX,SAAS;EAMxB,UAAU,UAAU,QAAQ,0BAA0B;EAWvC,IAAI,cAAc,QAAQ;EAW1B,IACpB,aACA,OAAO,iBACP,UAAU,kBACT,QAAQ;EA+DW,IAAI,cAAc;EAKlB,KAAK,kBAAkB;EAKvB,IAAI,iBAAiB;EAYrB,MAAM,aAAa,gBAAgB;EAInC,KAAK,cAAc;EAYnB,QACpB,iBACA,kBACC;EAQmB,KAAK,aAAa,iBAAiB;;;;YAO/C;;;;YAOA,gBAAgB;;;;;;;;;;;;;;;;;;cCpOf,oCAAoC;qBAC5B,6BAAG;qBACH,QAAM;qBACN,eAAa;qBACb,QAAQ;MAEhB,cAAc;MAQL;qBAID,wBAAK;qBAKL,uBAAI;EAKD,WAAW;EAMX,SAAS;EAUT,UACpB,iBACA,UAAU,oBACT;EAImB,YACpB,iBACA,WAAW,oBACV;;;;YAOO,gBAAgB;;;;;;;;;;;;;;;cCxDf,8BAAW,yBAAA"}
@@ -1,4 +1,4 @@
1
- import { $env, $hook, $inject, $module, Alepha, AlephaError, t } from "alepha";
1
+ import { $env, $hook, $inject, $module, Alepha, AlephaError, z } from "alepha";
2
2
  import { $logger } from "alepha/logger";
3
3
  import { RESP_TYPES, createClient } from "@redis/client";
4
4
  //#region ../../src/redis/providers/RedisProvider.ts
@@ -23,7 +23,7 @@ import { RESP_TYPES, createClient } from "@redis/client";
23
23
  var RedisProvider = class {};
24
24
  //#endregion
25
25
  //#region ../../src/redis/providers/BunRedisProvider.ts
26
- const envSchema$1 = t.object({ REDIS_URL: t.text({
26
+ const envSchema$1 = z.object({ REDIS_URL: z.text({
27
27
  default: "redis://localhost:6379",
28
28
  description: "Redis connection URL"
29
29
  }) });
@@ -131,9 +131,9 @@ var BunRedisProvider = class extends RedisProvider {
131
131
  if (options?.NX) args.push("NX");
132
132
  if (options?.XX) args.push("XX");
133
133
  if (options?.GET) args.push("GET");
134
- if (args.length === 2) await this.publisher.set(key, buf);
135
- else await this.publisher.send("SET", args);
136
- return buf;
134
+ const resp = args.length === 2 ? await this.publisher.set(key, buf) : await this.publisher.send("SET", args);
135
+ if (resp == null || resp === "OK") return buf;
136
+ return Buffer.isBuffer(resp) ? resp : Buffer.from(String(resp), "binary");
137
137
  }
138
138
  async has(key) {
139
139
  return this.publisher.exists(key);
@@ -261,7 +261,7 @@ var BunRedisSubscriberProvider = class extends RedisSubscriberProvider {
261
261
  };
262
262
  //#endregion
263
263
  //#region ../../src/redis/providers/NodeRedisProvider.ts
264
- const envSchema = t.object({ REDIS_URL: t.text({
264
+ const envSchema = z.object({ REDIS_URL: z.text({
265
265
  default: "redis://localhost:6379",
266
266
  description: "Redis connection URL"
267
267
  }) });