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
@@ -10,7 +10,7 @@ import {
10
10
  OPTIONS,
11
11
  PipelineHandler,
12
12
  type Static,
13
- t,
13
+ z,
14
14
  } from "alepha";
15
15
  import { $logger } from "alepha/logger";
16
16
  import { ServerHeadProvider } from "alepha/react/head";
@@ -686,13 +686,13 @@ export class ReactServerProvider {
686
686
 
687
687
  // ---------------------------------------------------------------------------------------------------------------------
688
688
 
689
- const envSchema = t.object({
690
- REACT_SSR_ENABLED: t.optional(
691
- t.boolean({
692
- description:
693
- "Enable or disable server-side rendering (SSR) for React pages. When set to false, pages are rendered client-side only.",
694
- }),
695
- ),
689
+ const envSchema = z.object({
690
+ REACT_SSR_ENABLED: z
691
+ .boolean()
692
+ .describe(
693
+ "Enable or disable server-side rendering (SSR) for React pages. When set to false, pages are rendered client-side only.",
694
+ )
695
+ .optional(),
696
696
  });
697
697
 
698
698
  declare module "alepha" {
@@ -713,13 +713,11 @@ export const DEFAULT_STATIC_FILE_PATTERN = "\\.[a-zA-Z0-9]{1,10}$";
713
713
 
714
714
  export const reactServerOptions = $atom({
715
715
  name: "alepha.react.server.options",
716
- schema: t.object({
717
- publicDir: t.string(),
718
- staticServer: t.object({
719
- disabled: t.boolean(),
720
- path: t.string({
721
- description: "URL path where static files will be served.",
722
- }),
716
+ schema: z.object({
717
+ publicDir: z.string(),
718
+ staticServer: z.object({
719
+ disabled: z.boolean(),
720
+ path: z.string().describe("URL path where static files will be served."),
723
721
  }),
724
722
  }),
725
723
  default: {
@@ -1,4 +1,4 @@
1
- import { Alepha, t } from "alepha";
1
+ import { Alepha, z } from "alepha";
2
2
  import { DateTimeProvider } from "alepha/datetime";
3
3
  import { $page, AlephaReactRouter } from "alepha/react/router";
4
4
  import { ServerRouterProvider } from "alepha/server";
@@ -35,7 +35,7 @@ describe("$sitemap", () => {
35
35
 
36
36
  blog = $page({
37
37
  path: "/blog/:slug",
38
- schema: { params: t.object({ slug: t.text() }) },
38
+ schema: { params: z.object({ slug: z.text() }) },
39
39
  static: { entries: [{ params: { slug: "hello" } }] },
40
40
  component: () => "post",
41
41
  });
@@ -1,4 +1,4 @@
1
- import { $atom, type Static, t } from "alepha";
1
+ import { $atom, type Static, z } from "alepha";
2
2
 
3
3
  /**
4
4
  * Persisted UI state — color mode, theme palette, sidebar collapsed state, etc.
@@ -8,14 +8,14 @@ import { $atom, type Static, t } from "alepha";
8
8
  */
9
9
  export const uiAtom = $atom({
10
10
  name: "alepha.react.ui",
11
- schema: t.object({
11
+ schema: z.object({
12
12
  /** Color mode preference. `"system"` follows the OS-level setting. */
13
- mode: t.enum(["light", "dark", "system"]),
13
+ mode: z.enum(["light", "dark", "system"]),
14
14
  /** Theme palette name. UI consumers map this to a CSS class on the root. */
15
- theme: t.string(),
15
+ theme: z.string(),
16
16
  /** Sidebar UI state. */
17
- sidebar: t.object({
18
- collapsed: t.boolean(),
17
+ sidebar: z.object({
18
+ collapsed: z.boolean(),
19
19
  }),
20
20
  }),
21
21
  default: {
@@ -1,4 +1,4 @@
1
- import { $atom, type Static, t } from "alepha";
1
+ import { $atom, type Static, z } from "alepha";
2
2
 
3
3
  /**
4
4
  * Available themes the user can pick from. Apps populate this atom on boot
@@ -11,22 +11,22 @@ import { $atom, type Static, t } from "alepha";
11
11
  */
12
12
  export const uiThemeListAtom = $atom({
13
13
  name: "alepha.react.ui.themes",
14
- schema: t.array(
15
- t.object({
14
+ schema: z.array(
15
+ z.object({
16
16
  /** Stable id stored in `uiAtom.theme`. Mapped to a CSS class on `<html>`. */
17
- id: t.string(),
17
+ id: z.string(),
18
18
  /** Human-readable label shown in the picker. */
19
- label: t.string(),
19
+ label: z.string(),
20
20
  /**
21
21
  * Optional 4-color preview swatch in 2×2 order (TL, TR, BL, BR). Any
22
22
  * CSS-valid color string.
23
23
  */
24
- swatch: t.optional(t.array(t.string(), { minItems: 4, maxItems: 4 })),
24
+ swatch: z.array(z.string()).min(4).max(4).optional(),
25
25
  /**
26
26
  * Optional stylesheet URL (typically Google Fonts) loaded lazily when
27
27
  * the theme is selected.
28
28
  */
29
- fontHref: t.optional(t.string()),
29
+ fontHref: z.string().optional(),
30
30
  }),
31
31
  ),
32
32
  default: [{ id: "default", label: "Default" }],
@@ -29,15 +29,22 @@ export const useColorMode = () => {
29
29
  };
30
30
 
31
31
  const useResolvedColorMode = (mode: ColorMode): ResolvedColorMode => {
32
- const [systemDark, setSystemDark] = useState<boolean>(() => {
33
- if (typeof window === "undefined") return false;
34
- return window.matchMedia?.("(prefers-color-scheme: dark)").matches ?? false;
35
- });
32
+ // Must start `false` on BOTH the server and the client's first (hydration)
33
+ // render — `window.matchMedia` is client-only, so a lazy initializer reading
34
+ // it would make the first client render disagree with the server for
35
+ // `mode === "system"` (server resolves "light", a dark-OS client resolves
36
+ // "dark"), tripping a React hydration mismatch (#418) on any SSR'd page that
37
+ // renders off `resolved` (e.g. the color-mode toggle icon). The real OS
38
+ // preference is synced in the effect below, immediately after mount. No-flash
39
+ // CSS is handled separately by the boot script, so this costs at most a
40
+ // one-frame icon correction, never a color flash.
41
+ const [systemDark, setSystemDark] = useState(false);
36
42
 
37
43
  useEffect(() => {
38
44
  if (typeof window === "undefined") return;
39
45
  const mq = window.matchMedia?.("(prefers-color-scheme: dark)");
40
46
  if (!mq) return;
47
+ setSystemDark(mq.matches);
41
48
  const onChange = (ev: MediaQueryListEvent) => setSystemDark(ev.matches);
42
49
  mq.addEventListener("change", onChange);
43
50
  return () => mq.removeEventListener("change", onChange);
@@ -8,12 +8,12 @@ import type { FormModel } from "alepha/react/form";
8
8
  *
9
9
  * 1. **Object** — static configuration baked into the schema:
10
10
  * ```ts
11
- * t.string({ $control: { password: true, icon: "key" } })
11
+ * z.string({ $control: { password: true, icon: "key" } })
12
12
  * ```
13
13
  *
14
14
  * 2. **Function** — dynamic, computed from current form state:
15
15
  * ```ts
16
- * t.string({
16
+ * z.string({
17
17
  * $control: ({ form, value }) => {
18
18
  * if (form.currentValues.kind !== "advanced") return false; // hide
19
19
  * return { items: () => fetchOptions(form.currentValues.kind) };
@@ -197,8 +197,8 @@ export const resolveSchemaControl = (
197
197
  return {};
198
198
  };
199
199
 
200
- declare module "typebox" {
201
- interface TSchemaOptions {
200
+ declare module "alepha" {
201
+ interface SchemaOptions {
202
202
  /**
203
203
  * UI metadata read by `<Control>` from `@alepha/ui`. See
204
204
  * {@link SchemaControl}.
@@ -5,13 +5,13 @@ import {
5
5
  Alepha,
6
6
  AlephaError,
7
7
  type Static,
8
- t,
8
+ z,
9
9
  } from "alepha";
10
10
  import { $logger } from "alepha/logger";
11
11
  import { RedisProvider, type RedisSetOptions } from "./RedisProvider.ts";
12
12
 
13
- const envSchema = t.object({
14
- REDIS_URL: t.text({
13
+ const envSchema = z.object({
14
+ REDIS_URL: z.text({
15
15
  default: "redis://localhost:6379",
16
16
  description: "Redis connection URL",
17
17
  }),
@@ -201,15 +201,23 @@ export class BunRedisProvider extends RedisProvider {
201
201
  args.push("GET");
202
202
  }
203
203
 
204
- if (args.length === 2) {
205
- // Simple set without options
206
- await this.publisher.set(key, buf);
207
- } else {
208
- // Set with options via raw command
209
- await this.publisher.send("SET", args);
204
+ // Capture the reply. With the `GET` option the reply carries the *prior*
205
+ // value, and the entire `$lock` protocol (`SET … NX GET`) depends on reading
206
+ // it. Previously this discarded the reply and always returned the value it
207
+ // just wrote, so under Bun every lock contender saw its own id back and
208
+ // believed it had acquired the lock — RedisLockProvider (and therefore every
209
+ // scheduler dedup / migration guard) became a silent no-op across instances.
210
+ const resp =
211
+ args.length === 2
212
+ ? await this.publisher.set(key, buf)
213
+ : await this.publisher.send("SET", args);
214
+
215
+ // Mirror NodeRedisProvider: "OK"/nil means "applied, no prior value" → echo
216
+ // the value we wrote; any other reply is the prior value returned by GET.
217
+ if (resp == null || resp === "OK") {
218
+ return buf;
210
219
  }
211
-
212
- return buf;
220
+ return Buffer.isBuffer(resp) ? resp : Buffer.from(String(resp), "binary");
213
221
  }
214
222
 
215
223
  public override async has(key: string): Promise<boolean> {
@@ -11,13 +11,13 @@ import {
11
11
  Alepha,
12
12
  AlephaError,
13
13
  type Static,
14
- t,
14
+ z,
15
15
  } from "alepha";
16
16
  import { $logger } from "alepha/logger";
17
17
  import { RedisProvider, type RedisSetOptions } from "./RedisProvider.ts";
18
18
 
19
- const envSchema = t.object({
20
- REDIS_URL: t.text({
19
+ const envSchema = z.object({
20
+ REDIS_URL: z.text({
21
21
  default: "redis://localhost:6379",
22
22
  description: "Redis connection URL",
23
23
  }),
@@ -9,14 +9,14 @@ import {
9
9
  KIND,
10
10
  Primitive,
11
11
  type Static,
12
- t,
12
+ z,
13
13
  } from "alepha";
14
14
  import {
15
15
  type DateTime,
16
16
  DateTimeProvider,
17
17
  type DurationLike,
18
18
  } from "alepha/datetime";
19
- import { $lock } from "alepha/lock";
19
+ import { $lock, LockAcquireError } from "alepha/lock";
20
20
  import { $logger } from "alepha/logger";
21
21
  import { CronProvider } from "../providers/CronProvider.ts";
22
22
 
@@ -73,12 +73,12 @@ export type SchedulerPrimitiveOptions = {
73
73
  */
74
74
  export const schedulerOptions = $atom({
75
75
  name: "alepha.scheduler.options",
76
- schema: t.object({
77
- prefix: t.optional(
78
- t.text({
76
+ schema: z.object({
77
+ prefix: z
78
+ .text({
79
79
  description: "Prefix for scheduler lock keys.",
80
- }),
81
- ),
80
+ })
81
+ .optional(),
82
82
  }),
83
83
  default: {},
84
84
  });
@@ -138,7 +138,20 @@ export class SchedulerPrimitive extends Primitive<SchedulerPrimitiveOptions> {
138
138
  });
139
139
 
140
140
  if (this.options.lock !== false) {
141
- await this.schedulerLock.run({ now });
141
+ try {
142
+ await this.schedulerLock.run({ now });
143
+ } catch (error) {
144
+ // A held lock means another instance (or an overlapping run) is
145
+ // already handling this tick — that is exactly what the lock is
146
+ // for (dedup), not a failure. Skip this tick quietly rather than
147
+ // surfacing it as a `scheduler:error`. Other errors still bubble.
148
+ if (!(error instanceof LockAcquireError)) {
149
+ throw error;
150
+ }
151
+ this.log.debug(
152
+ `Scheduler '${this.name}' tick skipped — lock held by another runner`,
153
+ );
154
+ }
142
155
  } else {
143
156
  await this.options.handler({ now });
144
157
  }
@@ -0,0 +1,29 @@
1
+ import { Alepha } from "alepha";
2
+ import { ForbiddenError } from "alepha/server";
3
+ import { describe, expect, it } from "vitest";
4
+ import { SecurityProvider } from "../providers/SecurityProvider.ts";
5
+
6
+ describe("SecurityProvider.assertRealmScope", () => {
7
+ const security = () => Alepha.create().inject(SecurityProvider);
8
+
9
+ it("returns the caller's realm when no target realm is requested", () => {
10
+ expect(security().assertRealmScope({ realm: "acme" }, undefined)).toBe(
11
+ "acme",
12
+ );
13
+ });
14
+
15
+ it("allows a target realm that matches the caller's realm", () => {
16
+ expect(security().assertRealmScope({ realm: "acme" }, "acme")).toBe("acme");
17
+ });
18
+
19
+ it("rejects a target realm different from the caller's realm (P0-7)", () => {
20
+ // A realm-A admin must not be able to act on realm B via ?userRealmName=B.
21
+ expect(() =>
22
+ security().assertRealmScope({ realm: "acme" }, "victim-tenant"),
23
+ ).toThrow(ForbiddenError);
24
+ });
25
+
26
+ it("is a no-op for single-realm apps (no caller realm claim)", () => {
27
+ expect(security().assertRealmScope(undefined, undefined)).toBeUndefined();
28
+ });
29
+ });
@@ -1,4 +1,4 @@
1
- import { $atom, t } from "alepha";
1
+ import { $atom, z } from "alepha";
2
2
 
3
3
  /**
4
4
  * Atom storing the active tenant for the current request.
@@ -24,11 +24,11 @@ import { $atom, t } from "alepha";
24
24
  */
25
25
  export const currentTenantAtom = $atom({
26
26
  name: "alepha.security.tenant",
27
- schema: t.optional(
28
- t.object({
29
- id: t.text({
27
+ schema: z
28
+ .object({
29
+ id: z.text({
30
30
  description: "Tenant identifier (slug, UUID, or composite).",
31
31
  }),
32
- }),
33
- ),
32
+ })
33
+ .optional(),
34
34
  });
@@ -1,4 +1,4 @@
1
- import { $atom, t } from "alepha";
1
+ import { $atom } from "alepha";
2
2
  import { userAccountInfoSchema } from "../schemas/userAccountInfoSchema.ts";
3
3
 
4
4
  /**
@@ -9,5 +9,5 @@ import { userAccountInfoSchema } from "../schemas/userAccountInfoSchema.ts";
9
9
  */
10
10
  export const currentUserAtom = $atom({
11
11
  name: "alepha.security.user",
12
- schema: t.optional(userAccountInfoSchema),
12
+ schema: userAccountInfoSchema.optional(),
13
13
  });
@@ -17,7 +17,7 @@ import type { JSONWebKeySet, JWTPayload } from "jose";
17
17
  import { currentTenantAtom } from "../atoms/currentTenantAtom.ts";
18
18
  import { SecurityError } from "../errors/SecurityError.ts";
19
19
  import type { IssuerResolver } from "../interfaces/IssuerResolver.ts";
20
- import { JwtProvider } from "../providers/JwtProvider.ts";
20
+ import { JwtProvider, type SigningConfig } from "../providers/JwtProvider.ts";
21
21
  import { SecurityProvider } from "../providers/SecurityProvider.ts";
22
22
  import type { Role } from "../schemas/roleSchema.ts";
23
23
  import type { UserAccount } from "../schemas/userAccountInfoSchema.ts";
@@ -65,6 +65,13 @@ export type IssuerPrimitiveOptions = {
65
65
  * Custom resolvers (in addition to default JWT resolver).
66
66
  */
67
67
  resolvers?: IssuerResolver[];
68
+
69
+ /**
70
+ * Asymmetric signing config. When set, this issuer's tokens are signed with
71
+ * the given alg + kid and its public keys are published via JWKS. When
72
+ * omitted, the HS256 `secret` path is used (default, backward compatible).
73
+ */
74
+ signing?: SigningConfig;
68
75
  } & (IssuerInternal | IssuerExternal);
69
76
 
70
77
  export interface IssuerSettings {
@@ -173,6 +180,7 @@ export class IssuerPrimitive extends Primitive<IssuerPrimitiveOptions> {
173
180
  name: this.name,
174
181
  profile: this.options.profile,
175
182
  secret: "jwks" in this.options ? this.options.jwks : this.options.secret,
183
+ signing: this.options.signing,
176
184
  roles,
177
185
  resolvers: [],
178
186
  });
@@ -331,6 +339,18 @@ export class IssuerPrimitive extends Primitive<IssuerPrimitiveOptions> {
331
339
  // `viska.club.alepha.dev` even when the user belongs to both.
332
340
  const tenant = this.alepha.store.get(currentTenantAtom)?.id;
333
341
 
342
+ // Resilient display name: compose from first/last when the caller didn't
343
+ // provide one (credentials users register with first+last but no `name`),
344
+ // and carry the OIDC given/family claims so consumers can re-derive it —
345
+ // otherwise such users surface as "Anonymous User".
346
+ const composedName =
347
+ user.name ??
348
+ ([user.firstName, user.lastName]
349
+ .filter((s): s is string => !!s?.trim())
350
+ .join(" ")
351
+ .trim() ||
352
+ undefined);
353
+
334
354
  const access_token = await this.jwt.create(
335
355
  {
336
356
  // jwt
@@ -340,7 +360,9 @@ export class IssuerPrimitive extends Primitive<IssuerPrimitiveOptions> {
340
360
  aud: this.name,
341
361
  sid, // session id, if available
342
362
  // oidc
343
- name: user.name,
363
+ name: composedName,
364
+ given_name: user.firstName,
365
+ family_name: user.lastName,
344
366
  email: user.email,
345
367
  preferred_username: user.username,
346
368
  picture: user.picture,
@@ -6,8 +6,12 @@ import {
6
6
  type CryptoKey,
7
7
  createLocalJWKSet,
8
8
  createRemoteJWKSet,
9
+ exportJWK,
9
10
  type FlattenedJWSInput,
11
+ generateKeyPair,
12
+ importPKCS8,
10
13
  type JSONWebKeySet,
14
+ type JWK,
11
15
  type JWSHeaderParameters,
12
16
  type JWTHeaderParameters,
13
17
  type JWTPayload,
@@ -26,6 +30,7 @@ import { SecurityError } from "../errors/SecurityError.ts";
26
30
  export class JwtProvider {
27
31
  protected readonly log = $logger();
28
32
  protected readonly keystore: KeyLoaderHolder[] = [];
33
+ protected readonly signers = new Map<string, SignerHolder>();
29
34
  protected readonly dateTimeProvider = $inject(DateTimeProvider);
30
35
  protected readonly encoder = new TextEncoder();
31
36
 
@@ -61,6 +66,65 @@ export class JwtProvider {
61
66
  }
62
67
  }
63
68
 
69
+ /**
70
+ * Configure an asymmetric signing key for a realm/issuer. Tokens minted for
71
+ * `name` are then signed with `alg` + `kid`, and a local verify loader is
72
+ * registered so this process can verify its own tokens (refresh tokens,
73
+ * authorization codes, id_tokens). Public keys are published via `getJwks`.
74
+ *
75
+ * `privateKey` is a PKCS#8 PEM (from env). When it is empty/undefined an
76
+ * **ephemeral per-process keypair** is generated so dev/test work with no env
77
+ * key configured — the published JWKS still resolves; tokens just don't
78
+ * survive a restart. Additive: realms without a signing key keep the HS256
79
+ * path untouched.
80
+ */
81
+ public async setSigningKey(
82
+ name: string,
83
+ signing: SigningConfig,
84
+ ): Promise<void> {
85
+ const key = signing.privateKey
86
+ ? await importPKCS8(signing.privateKey, signing.alg, {
87
+ extractable: true,
88
+ })
89
+ : (await generateKeyPair(signing.alg, { extractable: true })).privateKey;
90
+ const exported = await exportJWK(key);
91
+ // Strip every private member so the published JWK is public-only.
92
+ const { d, p, q, dp, dq, qi, ...pub } = exported as Record<string, unknown>;
93
+ const publicJwk: JWK = {
94
+ ...(pub as JWK),
95
+ kid: signing.kid,
96
+ use: "sig",
97
+ alg: signing.alg,
98
+ };
99
+
100
+ this.signers.set(name, {
101
+ alg: signing.alg,
102
+ kid: signing.kid,
103
+ key,
104
+ publicJwk,
105
+ });
106
+
107
+ this.log.debug(`will sign + verify JWTs for '${name}'`, {
108
+ alg: signing.alg,
109
+ kid: signing.kid,
110
+ });
111
+
112
+ // Register a local verify loader so tokens we sign can be verified.
113
+ this.keystore.push({
114
+ name,
115
+ keyLoader: createLocalJWKSet({ keys: [publicJwk] }),
116
+ });
117
+ }
118
+
119
+ /**
120
+ * Public JWK Set for a realm/issuer configured with an asymmetric signing
121
+ * key. Returns an empty set for HS256 / external (URL-based) realms.
122
+ */
123
+ public async getJwks(name: string): Promise<JSONWebKeySet> {
124
+ const signer = this.signers.get(name);
125
+ return { keys: signer ? [signer.publicJwk] : [] };
126
+ }
127
+
64
128
  /**
65
129
  * Retrieves the payload from a JSON Web Token (JWT).
66
130
  *
@@ -133,6 +197,21 @@ export class JwtProvider {
133
197
  keyName?: string,
134
198
  signOptions?: JwtSignOptions,
135
199
  ): Promise<string> {
200
+ // Asymmetric path: when a signing key is configured for this realm, sign
201
+ // with its alg + kid so the token verifies against the published JWKS.
202
+ const signerName = keyName ?? this.keystore[0]?.name;
203
+ const signer = signerName ? this.signers.get(signerName) : undefined;
204
+ if (signer) {
205
+ const signJwt = new SignJWT(payload);
206
+ signJwt.setProtectedHeader({
207
+ alg: signer.alg,
208
+ kid: signer.kid,
209
+ ...signOptions?.header,
210
+ });
211
+ return await signJwt.sign(signer.key);
212
+ }
213
+
214
+ // HS256 path (unchanged default).
136
215
  const secretKey = keyName
137
216
  ? this.keystore.find((it) => it.name === keyName)?.secretKey
138
217
  : this.keystore[0]?.secretKey;
@@ -173,6 +252,27 @@ export interface KeyLoaderHolder {
173
252
  secretKey?: string;
174
253
  }
175
254
 
255
+ export interface SignerHolder {
256
+ alg: string;
257
+ kid: string;
258
+ key: CryptoKey | KeyObject;
259
+ publicJwk: JWK;
260
+ }
261
+
262
+ /**
263
+ * Asymmetric signing config for a realm/issuer. `privateKey` is a PKCS#8 PEM
264
+ * (typically injected from env). EdDSA preferred; RS256 acceptable.
265
+ */
266
+ export interface SigningConfig {
267
+ alg: "EdDSA" | "RS256";
268
+ /**
269
+ * PKCS#8 PEM private key. Empty/undefined → an ephemeral per-process keypair
270
+ * is generated (dev/test convenience; tokens don't survive a restart).
271
+ */
272
+ privateKey?: string;
273
+ kid: string;
274
+ }
275
+
176
276
  export interface JwtSignOptions {
177
277
  header?: Partial<JWTHeaderParameters>;
178
278
  }
@@ -24,7 +24,7 @@ import {
24
24
  type UserAccount,
25
25
  userAccountInfoSchema,
26
26
  } from "../schemas/userAccountInfoSchema.ts";
27
- import { JwtProvider } from "./JwtProvider.ts";
27
+ import { JwtProvider, type SigningConfig } from "./JwtProvider.ts";
28
28
 
29
29
  export class SecurityProvider {
30
30
  protected readonly UNKNOWN_USER_NAME = "Anonymous User";
@@ -72,7 +72,9 @@ export class SecurityProvider {
72
72
  on: "start",
73
73
  handler: async () => {
74
74
  for (const realm of this.realms) {
75
- if (realm.secret) {
75
+ if (realm.signing) {
76
+ await this.jwt.setSigningKey(realm.name, realm.signing);
77
+ } else if (realm.secret) {
76
78
  const secret =
77
79
  typeof realm.secret === "function" ? realm.secret() : realm.secret;
78
80
  this.jwt.setKeyLoader(realm.name, secret);
@@ -313,6 +315,10 @@ export class SecurityProvider {
313
315
  const username = this.getUsernameFromPayload(payload);
314
316
  const picture = this.getPictureFromPayload(payload);
315
317
  const name = this.getNameFromPayload(payload);
318
+ const firstName =
319
+ typeof payload.given_name === "string" ? payload.given_name : undefined;
320
+ const lastName =
321
+ typeof payload.family_name === "string" ? payload.family_name : undefined;
316
322
  const organization = this.getOrganizationFromPayload(payload);
317
323
  const rolesFromSystem = this.getRoles(realmName);
318
324
  const roles = rolesFromPayload
@@ -332,6 +338,8 @@ export class SecurityProvider {
332
338
  id,
333
339
  roles,
334
340
  name,
341
+ firstName,
342
+ lastName,
335
343
  email,
336
344
  username,
337
345
  picture,
@@ -703,6 +711,32 @@ export class SecurityProvider {
703
711
  return this.realms;
704
712
  }
705
713
 
714
+ /**
715
+ * Resolve the realm an authenticated admin action is allowed to operate on.
716
+ *
717
+ * Admin endpoints accept a client-supplied target realm (e.g. a
718
+ * `userRealmName` query param). Without scoping, a realm-A admin could act on
719
+ * realm-B resources by simply naming realm B — a cross-tenant escalation
720
+ * whenever realms are used as tenant boundaries. This binds the target realm
721
+ * to the caller's own realm: omitting the target means "my realm"; naming a
722
+ * *different* realm than the caller's is refused.
723
+ *
724
+ * Returns the effective realm to use (may be `undefined` in single-realm apps
725
+ * where neither the caller nor the request carries a realm).
726
+ */
727
+ public assertRealmScope(
728
+ user: { realm?: string } | undefined,
729
+ requestedRealm: string | undefined,
730
+ ): string | undefined {
731
+ const callerRealm = user?.realm;
732
+ if (requestedRealm && callerRealm && requestedRealm !== callerRealm) {
733
+ throw new ForbiddenError(
734
+ `Cross-realm access denied: authenticated in realm '${callerRealm}', requested realm '${requestedRealm}'.`,
735
+ );
736
+ }
737
+ return requestedRealm ?? callerRealm;
738
+ }
739
+
706
740
  /**
707
741
  * Retrieves the user account from the provided user ID.
708
742
  *
@@ -983,6 +1017,13 @@ export interface Realm {
983
1017
  */
984
1018
  secret?: string | JSONWebKeySet | (() => string);
985
1019
 
1020
+ /**
1021
+ * Asymmetric signing config. When set, this realm signs its tokens with an
1022
+ * asymmetric key and publishes the public keys via JWKS (see
1023
+ * `JwtProvider.getJwks`). Takes precedence over `secret`.
1024
+ */
1025
+ signing?: SigningConfig;
1026
+
986
1027
  /**
987
1028
  * Create the user account info based on the raw JWT payload.
988
1029
  * By default, SecurityProvider has his own implementation, but this method allow to override it.