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
@@ -1,16 +1,16 @@
1
- import { $atom, $context, $inject, $module, Alepha, AlephaError, t } from "alepha";
1
+ import { $atom, $context, $inject, $module, Alepha, AlephaError, z } from "alepha";
2
2
  import { $audit } from "alepha/api/audits";
3
3
  import { $bucket } from "alepha/bucket";
4
4
  import { $issuer, $permission, $secure, CryptoProvider, InvalidCredentialsError, SecurityProvider } from "alepha/security";
5
- import { $action, BadRequestError, ConflictError, HttpError, UnauthorizedError, okSchema } from "alepha/server";
5
+ import { $action, BadRequestError, ConflictError, HttpError, NotFoundError, UnauthorizedError, okSchema } from "alepha/server";
6
6
  import { $entity, $repository, db, pageQuerySchema, sql } from "alepha/orm";
7
7
  import { $logger } from "alepha/logger";
8
+ import { AlephaApiVerification, VerificationService } from "alepha/api/verifications";
8
9
  import { $client } from "alepha/server/links";
9
10
  import { $notification } from "alepha/api/notifications";
10
11
  import { CaptchaProvider } from "alepha/captcha";
11
- import { $authApple, $authCredentials, $authFacebook, $authFederationClient, $authFranceConnect, $authGithub, $authGoogle, $authMicrosoft, ServerAuthProvider, authenticationProviderSchema } from "alepha/server/auth";
12
+ import { $authApple, $authCredentials, $authFacebook, $authFranceConnect, $authGithub, $authGoogle, $authMicrosoft, ServerAuthProvider, authenticationProviderSchema } from "alepha/server/auth";
12
13
  import { $etag } from "alepha/server/etag";
13
- import { AlephaApiVerification, VerificationService } from "alepha/api/verifications";
14
14
  import { $cache, CacheProvider } from "alepha/cache";
15
15
  import { DatabaseCacheProvider } from "alepha/cache/database";
16
16
  import { DateTimeProvider } from "alepha/datetime";
@@ -108,34 +108,34 @@ var UserBuckets = class {
108
108
  };
109
109
  //#endregion
110
110
  //#region ../../src/api/users/schemas/identityQuerySchema.ts
111
- const identityQuerySchema = t.extend(pageQuerySchema, {
112
- userId: t.optional(t.uuid()),
113
- provider: t.optional(t.string())
111
+ const identityQuerySchema = pageQuerySchema.extend({
112
+ userId: z.uuid().optional(),
113
+ provider: z.string().optional()
114
114
  });
115
115
  //#endregion
116
116
  //#region ../../src/api/users/entities/users.ts
117
117
  const DEFAULT_USER_REALM_NAME = "default";
118
118
  const users = $entity({
119
119
  name: "users",
120
- schema: t.object({
121
- id: db.primaryKey(t.uuid()),
120
+ schema: z.object({
121
+ id: db.primaryKey(z.uuid()),
122
122
  version: db.version(),
123
123
  createdAt: db.createdAt(),
124
124
  updatedAt: db.updatedAt(),
125
- realm: db.default(t.text(), DEFAULT_USER_REALM_NAME),
126
- username: t.optional(t.shortText({
125
+ realm: db.default(z.text(), DEFAULT_USER_REALM_NAME),
126
+ username: z.shortText({
127
127
  minLength: 3,
128
128
  maxLength: 30
129
- })),
130
- email: t.optional(t.string({ format: "email" })),
131
- phoneNumber: t.optional(t.e164()),
132
- roles: db.default(t.array(t.string()), []),
133
- firstName: t.optional(t.string()),
134
- lastName: t.optional(t.string()),
135
- picture: t.optional(t.string()),
136
- enabled: db.default(t.boolean(), true),
137
- emailVerified: db.default(t.boolean(), false),
138
- lastLoginAt: t.optional(t.datetime()),
129
+ }).optional(),
130
+ email: z.string().meta({ format: "email" }).optional(),
131
+ phoneNumber: z.e164().optional(),
132
+ roles: db.default(z.array(z.string()), []),
133
+ firstName: z.string().optional(),
134
+ lastName: z.string().optional(),
135
+ picture: z.string().optional(),
136
+ enabled: db.default(z.boolean(), true),
137
+ emailVerified: db.default(z.boolean(), false),
138
+ lastLoginAt: z.datetime().optional(),
139
139
  organizationId: db.organization()
140
140
  }),
141
141
  indexes: [
@@ -158,16 +158,16 @@ const users = $entity({
158
158
  //#region ../../src/api/users/entities/identities.ts
159
159
  const identities = $entity({
160
160
  name: "identities",
161
- schema: t.object({
162
- id: db.primaryKey(t.uuid()),
161
+ schema: z.object({
162
+ id: db.primaryKey(z.uuid()),
163
163
  version: db.version(),
164
164
  createdAt: db.createdAt(),
165
165
  updatedAt: db.updatedAt(),
166
- userId: db.ref(t.uuid(), () => users.cols.id),
167
- password: t.optional(t.text()),
168
- provider: t.text(),
169
- providerUserId: t.optional(t.text()),
170
- providerData: t.optional(t.json())
166
+ userId: db.ref(z.uuid(), () => users.cols.id),
167
+ password: z.text().optional(),
168
+ provider: z.text(),
169
+ providerUserId: z.text().optional(),
170
+ providerData: z.json().optional()
171
171
  }),
172
172
  indexes: [
173
173
  "userId",
@@ -181,78 +181,55 @@ const identities = $entity({
181
181
  });
182
182
  //#endregion
183
183
  //#region ../../src/api/users/schemas/identityResourceSchema.ts
184
- const identityResourceSchema = t.omit(identities.schema, ["password"]);
184
+ const identityResourceSchema = identities.schema.omit({ password: true });
185
185
  //#endregion
186
186
  //#region ../../src/api/users/atoms/realmAuthSettingsAtom.ts
187
- const fieldRequirement = (description) => t.union([
188
- t.const("none"),
189
- t.const("optional"),
190
- t.const("required")
191
- ], { description });
192
- const usernameFieldRequirement = (description) => t.union([
193
- t.const("none"),
194
- t.const("optional"),
195
- t.const("required"),
196
- t.const("email")
197
- ], { description });
187
+ const fieldRequirement = (description) => z.union([
188
+ z.const("none"),
189
+ z.const("optional"),
190
+ z.const("required")
191
+ ]).describe(description);
192
+ const usernameFieldRequirement = (description) => z.union([
193
+ z.const("none"),
194
+ z.const("optional"),
195
+ z.const("required"),
196
+ z.const("email")
197
+ ]).describe(description);
198
198
  const realmAuthSettingsAtom = $atom({
199
199
  name: "alepha.api.users.realmAuthSettings",
200
- schema: t.object({
201
- displayName: t.optional(t.string({ description: "Display name shown on auth pages (e.g., 'Customer Portal')" })),
202
- description: t.optional(t.string({ description: "Description shown on auth pages" })),
203
- logoUrl: t.optional(t.string({ description: "Logo URL for auth pages" })),
204
- registrationAllowed: t.boolean({ description: "Enable user self-registration" }),
200
+ schema: z.object({
201
+ displayName: z.string().describe("Display name shown on auth pages (e.g., 'Customer Portal')").optional(),
202
+ description: z.string().describe("Description shown on auth pages").optional(),
203
+ logoUrl: z.string().describe("Logo URL for auth pages").optional(),
204
+ registrationAllowed: z.boolean().describe("Enable user self-registration"),
205
205
  email: fieldRequirement("Email address field requirement for user accounts"),
206
206
  username: usernameFieldRequirement("Username field requirement for user accounts"),
207
- usernameRegExp: t.string({ description: "Regular expression that usernames must match (if username is enabled)" }),
208
- usernameBlocklist: t.array(t.text(), { description: "Usernames that the slugger / manual registration must reject. Default empty so apps can register `admin`/`root`/`me`/etc. if they want; populate it explicitly for handles you want to keep off-limits." }),
207
+ usernameRegExp: z.string().describe("Regular expression that usernames must match (if username is enabled)"),
208
+ usernameBlocklist: z.array(z.text()).describe("Usernames that the slugger / manual registration must reject. Default empty so apps can register `admin`/`root`/`me`/etc. if they want; populate it explicitly for handles you want to keep off-limits."),
209
209
  phoneNumber: fieldRequirement("Phone number field requirement for user accounts"),
210
- verifyEmailRequired: t.boolean({ description: "Require email verification for user accounts" }),
211
- verifyPhoneRequired: t.boolean({ description: "Require phone verification for user accounts" }),
210
+ verifyEmailRequired: z.boolean().describe("Require email verification for user accounts"),
211
+ verifyPhoneRequired: z.boolean().describe("Require phone verification for user accounts"),
212
212
  firstNameLastName: fieldRequirement("First and last name field requirement for user accounts"),
213
- resetPasswordAllowed: t.boolean({ description: "Enable forgot password functionality" }),
214
- captchaRequired: t.boolean({ description: "Require captcha verification on registration (needs a CaptchaProvider registered, e.g. TurnstileCaptchaProvider)" }),
215
- adminEmails: t.array(t.email(), { description: "List of email addresses that are automatically promoted to admin role on login" }),
216
- adminUsernames: t.array(t.text(), { description: "List of usernames that are automatically promoted to admin role on login" }),
217
- defaultRoles: t.array(t.string(), { description: "Default roles assigned to newly registered users" }),
218
- verifyEmailUrl: t.optional(t.string({ description: "Base URL for email verification links (used when verification method is 'link'). Token and email are appended as query params." })),
219
- passwordPolicy: t.object({
220
- minLength: t.integer({
221
- description: "Minimum password length",
222
- default: 8,
223
- minimum: 1
224
- }),
225
- requireUppercase: t.boolean({ description: "Require at least one uppercase letter" }),
226
- requireLowercase: t.boolean({ description: "Require at least one lowercase letter" }),
227
- requireNumbers: t.boolean({ description: "Require at least one number" }),
228
- requireSpecialCharacters: t.boolean({ description: "Require at least one special character" })
229
- }),
230
- loginRateLimit: t.object({
231
- ipMaxAttempts: t.integer({
232
- description: "Max failed login attempts per IP before temporary lockout",
233
- default: 15,
234
- minimum: 1
235
- }),
236
- accountMaxAttempts: t.integer({
237
- description: "Max failed login attempts per account before temporary lockout",
238
- default: 5,
239
- minimum: 1
240
- }),
241
- windowMs: t.integer({
242
- description: "Rate limit window duration in milliseconds",
243
- default: 900 * 1e3,
244
- minimum: 1e3
245
- })
213
+ resetPasswordAllowed: z.boolean().describe("Enable forgot password functionality"),
214
+ captchaRequired: z.boolean().describe("Require captcha verification on registration (needs a CaptchaProvider registered, e.g. TurnstileCaptchaProvider)"),
215
+ adminEmails: z.array(z.email()).describe("List of email addresses that are automatically promoted to admin role on login"),
216
+ adminUsernames: z.array(z.text()).describe("List of usernames that are automatically promoted to admin role on login"),
217
+ defaultRoles: z.array(z.string()).describe("Default roles assigned to newly registered users"),
218
+ verifyEmailUrl: z.string().describe("Base URL for email verification links (used when verification method is 'link'). Token and email are appended as query params.").optional(),
219
+ passwordPolicy: z.object({
220
+ minLength: z.integer().min(1).describe("Minimum password length").default(8),
221
+ requireUppercase: z.boolean().describe("Require at least one uppercase letter"),
222
+ requireLowercase: z.boolean().describe("Require at least one lowercase letter"),
223
+ requireNumbers: z.boolean().describe("Require at least one number"),
224
+ requireSpecialCharacters: z.boolean().describe("Require at least one special character")
246
225
  }),
247
- registrationIpMaxAttempts: t.integer({
248
- description: "Max registration attempts per IP before temporary lockout. Default 10 protects against signup abuse; raise it in dev/e2e environments where a single localhost IP spawns many test users.",
249
- default: 10,
250
- minimum: 1
226
+ loginRateLimit: z.object({
227
+ ipMaxAttempts: z.integer().min(1).describe("Max failed login attempts per IP before temporary lockout").default(15),
228
+ accountMaxAttempts: z.integer().min(1).describe("Max failed login attempts per account before temporary lockout").default(5),
229
+ windowMs: z.integer().min(1e3).describe("Rate limit window duration in milliseconds").default(900 * 1e3)
251
230
  }),
252
- refreshToken: t.object({ expirationIdle: t.optional(t.integer({
253
- description: "Maximum time in milliseconds a refresh token may stay unused before being invalidated. When set, sessions whose last refresh is older than this window are rejected and deleted, even if the absolute `expiresAt` has not been reached. Recommended for SaaS auth posture (SOC2/ISO27001). Leave undefined to disable idle invalidation (default).",
254
- minimum: 1e3
255
- })) })
231
+ registrationIpMaxAttempts: z.integer().min(1).describe("Max registration attempts per IP before temporary lockout. Default 10 protects against signup abuse; raise it in dev/e2e environments where a single localhost IP spawns many test users.").default(10),
232
+ refreshToken: z.object({ expirationIdle: z.integer().min(1e3).describe("Maximum time in milliseconds a refresh token may stay unused before being invalidated. When set, sessions whose last refresh is older than this window are rejected and deleted, even if the absolute `expiresAt` has not been reached. Recommended for SaaS auth posture (SOC2/ISO27001). Leave undefined to disable idle invalidation (default).").optional() })
256
233
  }),
257
234
  default: {
258
235
  registrationAllowed: true,
@@ -289,13 +266,13 @@ const realmAuthSettingsAtom = $atom({
289
266
  //#region ../../src/api/users/entities/sessions.ts
290
267
  const sessions = $entity({
291
268
  name: "sessions",
292
- schema: t.object({
293
- id: db.primaryKey(t.uuid()),
269
+ schema: z.object({
270
+ id: db.primaryKey(z.uuid()),
294
271
  version: db.version(),
295
272
  createdAt: db.createdAt(),
296
273
  updatedAt: db.updatedAt(),
297
- refreshToken: t.uuid(),
298
- userId: db.ref(t.uuid(), () => users.cols.id),
274
+ refreshToken: z.uuid(),
275
+ userId: db.ref(z.uuid(), () => users.cols.id),
299
276
  /**
300
277
  * OAuth client this session was minted for, when it was created via the
301
278
  * OAuth 2.1 authorization flow — the `client_id` of an `oauth_clients`
@@ -303,30 +280,30 @@ const sessions = $entity({
303
280
  * key: `sessions` is a core entity and must not depend on the optional
304
281
  * OAuth module's table; the join to `oauth_clients` is done at query time.
305
282
  */
306
- clientId: t.optional(t.text({ maxLength: 64 })),
307
- expiresAt: t.datetime(),
283
+ clientId: z.text({ maxLength: 64 }).optional(),
284
+ expiresAt: z.datetime(),
308
285
  /**
309
286
  * Last time the session was used to refresh an access token.
310
287
  * Used by realm `refreshToken.expirationIdle` to invalidate idle sessions.
311
288
  * `null` on existing rows pre-migration — falls back to `createdAt`.
312
289
  */
313
- lastUsedAt: t.optional(t.datetime()),
314
- ip: t.optional(t.text()),
290
+ lastUsedAt: z.datetime().optional(),
291
+ ip: z.text().optional(),
315
292
  /**
316
293
  * ISO 3166-1 alpha-2 country code derived from the request geo headers
317
294
  * (`cf-ipcountry` on Cloudflare, CDN equivalents elsewhere) at login time.
318
295
  * `null` on pre-migration rows and where geo isn't available.
319
296
  */
320
- country: t.optional(t.text({ maxLength: 2 })),
321
- userAgent: t.optional(t.object({
322
- os: t.text(),
323
- browser: t.text(),
324
- device: t.enum([
297
+ country: z.text({ maxLength: 2 }).optional(),
298
+ userAgent: z.object({
299
+ os: z.text(),
300
+ browser: z.text(),
301
+ device: z.enum([
325
302
  "MOBILE",
326
303
  "DESKTOP",
327
304
  "TABLET"
328
305
  ])
329
- }))
306
+ }).optional()
330
307
  }),
331
308
  indexes: [
332
309
  "userId",
@@ -380,10 +357,6 @@ var RealmProvider = class {
380
357
  }
381
358
  },
382
359
  features,
383
- federated: realmOptions.identities?.federated ? {
384
- brokerUrl: realmOptions.identities.federated.brokerUrl,
385
- providers: realmOptions.identities.federated.providers
386
- } : void 0,
387
360
  getSettings: async function() {
388
361
  if (this.settingsParameter) return await this.settingsParameter.get();
389
362
  return this.settings;
@@ -497,6 +470,7 @@ var AdminIdentityController = class {
497
470
  url = "/identities";
498
471
  group = "admin:identities";
499
472
  identityService = $inject(IdentityService);
473
+ securityProvider = $inject(SecurityProvider);
500
474
  /**
501
475
  * Find identities with pagination and filtering.
502
476
  */
@@ -506,12 +480,12 @@ var AdminIdentityController = class {
506
480
  use: [$secure({ permissions: ["admin:identity:read"] })],
507
481
  description: "Find identities with pagination and filtering",
508
482
  schema: {
509
- query: t.extend(identityQuerySchema, { userRealmName: t.optional(t.string()) }),
510
- response: t.page(identityResourceSchema)
483
+ query: identityQuerySchema.extend({ userRealmName: z.string().optional() }),
484
+ response: z.page(identityResourceSchema)
511
485
  },
512
- handler: ({ query }) => {
486
+ handler: ({ query, user }) => {
513
487
  const { userRealmName, ...q } = query;
514
- return this.identityService.findIdentities(q, userRealmName);
488
+ return this.identityService.findIdentities(q, this.securityProvider.assertRealmScope(user, userRealmName));
515
489
  }
516
490
  });
517
491
  /**
@@ -523,11 +497,11 @@ var AdminIdentityController = class {
523
497
  use: [$secure({ permissions: ["admin:identity:read"] })],
524
498
  description: "Get an identity by ID",
525
499
  schema: {
526
- params: t.object({ id: t.uuid() }),
527
- query: t.object({ userRealmName: t.optional(t.string()) }),
500
+ params: z.object({ id: z.uuid() }),
501
+ query: z.object({ userRealmName: z.string().optional() }),
528
502
  response: identityResourceSchema
529
503
  },
530
- handler: ({ params, query }) => this.identityService.getIdentityById(params.id, query.userRealmName)
504
+ handler: ({ params, query, user }) => this.identityService.getIdentityById(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName))
531
505
  });
532
506
  /**
533
507
  * Delete an identity.
@@ -539,12 +513,12 @@ var AdminIdentityController = class {
539
513
  use: [$secure({ permissions: ["admin:identity:delete"] })],
540
514
  description: "Delete an identity",
541
515
  schema: {
542
- params: t.object({ id: t.uuid() }),
543
- query: t.object({ userRealmName: t.optional(t.string()) }),
516
+ params: z.object({ id: z.uuid() }),
517
+ query: z.object({ userRealmName: z.string().optional() }),
544
518
  response: okSchema
545
519
  },
546
- handler: async ({ params, query }) => {
547
- await this.identityService.deleteIdentity(params.id, query.userRealmName);
520
+ handler: async ({ params, query, user }) => {
521
+ await this.identityService.deleteIdentity(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName));
548
522
  return {
549
523
  ok: true,
550
524
  id: params.id
@@ -554,7 +528,7 @@ var AdminIdentityController = class {
554
528
  };
555
529
  //#endregion
556
530
  //#region ../../src/api/users/schemas/sessionQuerySchema.ts
557
- const sessionQuerySchema = t.extend(pageQuerySchema, { userId: t.optional(t.uuid()) });
531
+ const sessionQuerySchema = pageQuerySchema.extend({ userId: z.uuid().optional() });
558
532
  //#endregion
559
533
  //#region ../../src/api/users/schemas/sessionResourceSchema.ts
560
534
  /**
@@ -563,36 +537,36 @@ const sessionQuerySchema = t.extend(pageQuerySchema, { userId: t.optional(t.uuid
563
537
  * back via a left join, so it's optional (a session whose user was deleted
564
538
  * still returns; `user` is undefined).
565
539
  */
566
- const sessionUserSummarySchema = t.object({
567
- id: t.uuid(),
568
- email: t.optional(t.string({ format: "email" })),
569
- username: t.optional(t.shortText({
540
+ const sessionUserSummarySchema = z.object({
541
+ id: z.uuid(),
542
+ email: z.string().meta({ format: "email" }).optional(),
543
+ username: z.shortText({
570
544
  minLength: 3,
571
545
  maxLength: 30
572
- })),
573
- firstName: t.optional(t.string()),
574
- lastName: t.optional(t.string())
546
+ }).optional(),
547
+ firstName: z.string().optional(),
548
+ lastName: z.string().optional()
575
549
  });
576
- const sessionResourceSchema = t.object({
577
- id: t.uuid(),
578
- version: t.number(),
579
- createdAt: t.datetime(),
580
- updatedAt: t.datetime(),
581
- refreshToken: t.uuid(),
582
- userId: t.uuid(),
583
- expiresAt: t.datetime(),
584
- ip: t.optional(t.string()),
585
- country: t.optional(t.string()),
586
- userAgent: t.optional(t.object({
587
- os: t.string(),
588
- browser: t.string(),
589
- device: t.enum([
550
+ const sessionResourceSchema = z.object({
551
+ id: z.uuid(),
552
+ version: z.number(),
553
+ createdAt: z.datetime(),
554
+ updatedAt: z.datetime(),
555
+ refreshToken: z.uuid(),
556
+ userId: z.uuid(),
557
+ expiresAt: z.datetime(),
558
+ ip: z.string().optional(),
559
+ country: z.string().optional(),
560
+ userAgent: z.object({
561
+ os: z.string(),
562
+ browser: z.string(),
563
+ device: z.enum([
590
564
  "MOBILE",
591
565
  "DESKTOP",
592
566
  "TABLET"
593
567
  ])
594
- })),
595
- user: t.optional(sessionUserSummarySchema)
568
+ }).optional(),
569
+ user: sessionUserSummarySchema.optional()
596
570
  });
597
571
  //#endregion
598
572
  //#region ../../src/api/users/services/SessionCrudService.ts
@@ -683,6 +657,7 @@ var AdminSessionController = class {
683
657
  url = "/sessions";
684
658
  group = "admin:sessions";
685
659
  sessionService = $inject(SessionCrudService);
660
+ securityProvider = $inject(SecurityProvider);
686
661
  /**
687
662
  * Find sessions with pagination and filtering.
688
663
  */
@@ -692,12 +667,12 @@ var AdminSessionController = class {
692
667
  use: [$secure({ permissions: ["admin:session:read"] })],
693
668
  description: "Find sessions with pagination and filtering",
694
669
  schema: {
695
- query: t.extend(sessionQuerySchema, { userRealmName: t.optional(t.string()) }),
696
- response: t.page(sessionResourceSchema)
670
+ query: sessionQuerySchema.extend({ userRealmName: z.string().optional() }),
671
+ response: z.page(sessionResourceSchema)
697
672
  },
698
- handler: ({ query }) => {
673
+ handler: ({ query, user }) => {
699
674
  const { userRealmName, ...q } = query;
700
- return this.sessionService.findSessions(q, userRealmName);
675
+ return this.sessionService.findSessions(q, this.securityProvider.assertRealmScope(user, userRealmName));
701
676
  }
702
677
  });
703
678
  /**
@@ -709,11 +684,11 @@ var AdminSessionController = class {
709
684
  use: [$secure({ permissions: ["admin:session:read"] })],
710
685
  description: "Get a session by ID",
711
686
  schema: {
712
- params: t.object({ id: t.uuid() }),
713
- query: t.object({ userRealmName: t.optional(t.string()) }),
687
+ params: z.object({ id: z.uuid() }),
688
+ query: z.object({ userRealmName: z.string().optional() }),
714
689
  response: sessionResourceSchema
715
690
  },
716
- handler: ({ params, query }) => this.sessionService.getSessionById(params.id, query.userRealmName)
691
+ handler: ({ params, query, user }) => this.sessionService.getSessionById(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName))
717
692
  });
718
693
  /**
719
694
  * Delete a session.
@@ -725,12 +700,12 @@ var AdminSessionController = class {
725
700
  use: [$secure({ permissions: ["admin:session:delete"] })],
726
701
  description: "Delete a session",
727
702
  schema: {
728
- params: t.object({ id: t.uuid() }),
729
- query: t.object({ userRealmName: t.optional(t.string()) }),
703
+ params: z.object({ id: z.uuid() }),
704
+ query: z.object({ userRealmName: z.string().optional() }),
730
705
  response: okSchema
731
706
  },
732
- handler: async ({ params, query }) => {
733
- await this.sessionService.deleteSession(params.id, query.userRealmName);
707
+ handler: async ({ params, query, user }) => {
708
+ await this.sessionService.deleteSession(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName));
734
709
  return {
735
710
  ok: true,
736
711
  id: params.id
@@ -747,43 +722,40 @@ var AdminSessionController = class {
747
722
  use: [$secure({ permissions: ["admin:session:delete"] })],
748
723
  description: "Delete many sessions",
749
724
  schema: {
750
- query: t.object({ userRealmName: t.optional(t.string()) }),
751
- body: t.object({ ids: t.array(t.uuid(), {
752
- minItems: 1,
753
- maxItems: 1e3
754
- }) }),
755
- response: t.object({ deleted: t.array(t.string()) })
725
+ query: z.object({ userRealmName: z.string().optional() }),
726
+ body: z.object({ ids: z.array(z.uuid()).min(1).max(1e3) }),
727
+ response: z.object({ deleted: z.array(z.string()) })
756
728
  },
757
- handler: async ({ body, query }) => {
758
- return { deleted: await this.sessionService.deleteSessions(body.ids, query.userRealmName) };
729
+ handler: async ({ body, query, user }) => {
730
+ return { deleted: await this.sessionService.deleteSessions(body.ids, this.securityProvider.assertRealmScope(user, query.userRealmName)) };
759
731
  }
760
732
  });
761
733
  };
762
734
  //#endregion
763
735
  //#region ../../src/api/users/schemas/createUserSchema.ts
764
- const createUserSchema = t.omit(users.insertSchema, ["realm"]);
736
+ const createUserSchema = users.insertSchema.omit({ realm: true });
765
737
  //#endregion
766
738
  //#region ../../src/api/users/schemas/updateUserSchema.ts
767
- const updateUserSchema = t.partial(t.omit(users.insertSchema, [
768
- "id",
769
- "version",
770
- "createdAt",
771
- "updatedAt"
772
- ]));
739
+ const updateUserSchema = users.insertSchema.omit({
740
+ id: true,
741
+ version: true,
742
+ createdAt: true,
743
+ updatedAt: true
744
+ }).partial();
773
745
  //#endregion
774
746
  //#region ../../src/api/users/schemas/userQuerySchema.ts
775
- const userQuerySchema = t.extend(pageQuerySchema, {
747
+ const userQuerySchema = pageQuerySchema.extend({
776
748
  /**
777
749
  * Free-text search applied (case-insensitive) across `email`,
778
750
  * `username`, `firstName`, and `lastName`. Matches with a leading and
779
751
  * trailing wildcard, so `?search=foo` finds any user whose email,
780
752
  * username, or name contains `foo`.
781
753
  */
782
- search: t.optional(t.string()),
783
- email: t.optional(t.string()),
784
- enabled: t.optional(t.boolean()),
785
- emailVerified: t.optional(t.boolean()),
786
- roles: t.optional(t.array(t.string()))
754
+ search: z.string().optional(),
755
+ email: z.string().optional(),
756
+ enabled: z.boolean().optional(),
757
+ emailVerified: z.boolean().optional(),
758
+ roles: z.array(z.string()).optional()
787
759
  });
788
760
  //#endregion
789
761
  //#region ../../src/api/users/schemas/userResourceSchema.ts
@@ -812,10 +784,25 @@ var UserNotifications = class {
812
784
  <p>Best regards,<br>The Team</p>
813
785
  `
814
786
  },
815
- schema: t.object({
816
- email: t.string({ format: "email" }),
817
- code: t.string(),
818
- expiresInMinutes: t.number()
787
+ translations: { fr: { email: {
788
+ subject: "Réinitialisez votre mot de passe",
789
+ body: (it) => `
790
+ <h1>Réinitialisez votre mot de passe</h1>
791
+ <p>Bonjour,</p>
792
+ <p>Nous avons reçu une demande de réinitialisation de votre mot de passe. Utilisez le code ci-dessous pour confirmer votre identité :</p>
793
+ <p style="margin: 30px 0; text-align: center;">
794
+ <span style="font-size: 32px; font-weight: bold; letter-spacing: 8px; font-family: monospace; background-color: #f5f5f5; padding: 16px 24px; border-radius: 8px; display: inline-block;">
795
+ ${it.code}
796
+ </span>
797
+ </p>
798
+ <p>Ce code expire dans ${it.expiresInMinutes} minutes.</p>
799
+ <p>Si vous n'avez pas demandé de réinitialisation, vous pouvez ignorer cet e-mail : votre mot de passe restera inchangé.</p>
800
+ `
801
+ } } },
802
+ schema: z.object({
803
+ email: z.string().meta({ format: "email" }),
804
+ code: z.string(),
805
+ expiresInMinutes: z.number()
819
806
  })
820
807
  });
821
808
  emailVerification = $notification({
@@ -839,10 +826,25 @@ var UserNotifications = class {
839
826
  <p>Best regards,<br>The Team</p>
840
827
  `
841
828
  },
842
- schema: t.object({
843
- email: t.string({ format: "email" }),
844
- code: t.string(),
845
- expiresInMinutes: t.number()
829
+ translations: { fr: { email: {
830
+ subject: "Vérifiez votre adresse e-mail",
831
+ body: (it) => `
832
+ <h1>Vérifiez votre adresse e-mail</h1>
833
+ <p>Bonjour,</p>
834
+ <p>Merci de votre inscription ! Utilisez le code ci-dessous pour vérifier votre adresse e-mail :</p>
835
+ <p style="margin: 30px 0; text-align: center;">
836
+ <span style="font-size: 32px; font-weight: bold; letter-spacing: 8px; font-family: monospace; background-color: #f5f5f5; padding: 16px 24px; border-radius: 8px; display: inline-block;">
837
+ ${it.code}
838
+ </span>
839
+ </p>
840
+ <p>Ce code expire dans ${it.expiresInMinutes} minutes.</p>
841
+ <p>Si vous n'avez pas créé de compte, ignorez cet e-mail.</p>
842
+ `
843
+ } } },
844
+ schema: z.object({
845
+ email: z.string().meta({ format: "email" }),
846
+ code: z.string(),
847
+ expiresInMinutes: z.number()
846
848
  })
847
849
  });
848
850
  phoneVerification = $notification({
@@ -851,10 +853,10 @@ var UserNotifications = class {
851
853
  critical: true,
852
854
  sensitive: true,
853
855
  sms: { message: (it) => `Your verification code is: ${it.code}. This code expires in ${it.expiresInMinutes} minutes.` },
854
- schema: t.object({
855
- phoneNumber: t.string(),
856
- code: t.string(),
857
- expiresInMinutes: t.number()
856
+ schema: z.object({
857
+ phoneNumber: z.string(),
858
+ code: z.string(),
859
+ expiresInMinutes: z.number()
858
860
  })
859
861
  });
860
862
  passwordResetLink = $notification({
@@ -880,10 +882,10 @@ var UserNotifications = class {
880
882
  <p>Best regards,<br>The Team</p>
881
883
  `
882
884
  },
883
- schema: t.object({
884
- email: t.string({ format: "email" }),
885
- resetUrl: t.string(),
886
- expiresInMinutes: t.number()
885
+ schema: z.object({
886
+ email: z.string().meta({ format: "email" }),
887
+ resetUrl: z.string(),
888
+ expiresInMinutes: z.number()
887
889
  })
888
890
  });
889
891
  accountLockout = $notification({
@@ -902,9 +904,19 @@ var UserNotifications = class {
902
904
  <p>Best regards,<br>The Team</p>
903
905
  `
904
906
  },
905
- schema: t.object({
906
- email: t.string({ format: "email" }),
907
- lockoutMinutes: t.number()
907
+ translations: { fr: { email: {
908
+ subject: "Compte temporairement verrouillé",
909
+ body: (it) => `
910
+ <h1>Compte temporairement verrouillé</h1>
911
+ <p>Bonjour,</p>
912
+ <p>Votre compte a été temporairement verrouillé suite à un trop grand nombre de tentatives de connexion échouées.</p>
913
+ <p>Si c'était bien vous, patientez ${it.lockoutMinutes} minutes avant de réessayer. Mot de passe oublié ? Utilisez la réinitialisation de mot de passe.</p>
914
+ <p>Si ce n'était pas vous, quelqu'un essaie peut-être d'accéder à votre compte. Nous vous recommandons de changer votre mot de passe au plus vite.</p>
915
+ `
916
+ } } },
917
+ schema: z.object({
918
+ email: z.string().meta({ format: "email" }),
919
+ lockoutMinutes: z.number()
908
920
  })
909
921
  });
910
922
  emailVerificationLink = $notification({
@@ -930,10 +942,10 @@ var UserNotifications = class {
930
942
  <p>Best regards,<br>The Team</p>
931
943
  `
932
944
  },
933
- schema: t.object({
934
- email: t.string({ format: "email" }),
935
- verifyUrl: t.string(),
936
- expiresInMinutes: t.number()
945
+ schema: z.object({
946
+ email: z.string().meta({ format: "email" }),
947
+ verifyUrl: z.string(),
948
+ expiresInMinutes: z.number()
937
949
  })
938
950
  });
939
951
  };
@@ -943,6 +955,7 @@ var UserService = class {
943
955
  alepha = $inject(Alepha);
944
956
  log = $logger();
945
957
  verificationController = $client();
958
+ verificationService = $inject(VerificationService);
946
959
  realmProvider = $inject(RealmProvider);
947
960
  cryptoProvider = $inject(CryptoProvider);
948
961
  userAudits(realmName) {
@@ -980,9 +993,9 @@ var UserService = class {
980
993
  return true;
981
994
  }
982
995
  try {
983
- const verification = await this.verificationController.requestVerificationCode({
984
- params: { type: method },
985
- body: { target: email }
996
+ const verification = await this.verificationService.createVerification({
997
+ type: method,
998
+ target: email
986
999
  });
987
1000
  if (method === "link") {
988
1001
  const realmSettings = await this.realmProvider.getRealm(userRealmName).getSettings();
@@ -1310,15 +1323,15 @@ var AdminUserController = class {
1310
1323
  use: [$secure({ permissions: ["admin:user:read"] })],
1311
1324
  description: "List roles available in a realm",
1312
1325
  schema: {
1313
- query: t.object({ userRealmName: t.optional(t.string()) }),
1314
- response: t.array(t.object({
1315
- name: t.string(),
1316
- default: t.optional(t.boolean()),
1317
- description: t.optional(t.string())
1326
+ query: z.object({ userRealmName: z.string().optional() }),
1327
+ response: z.array(z.object({
1328
+ name: z.string(),
1329
+ default: z.boolean().optional(),
1330
+ description: z.string().optional()
1318
1331
  }))
1319
1332
  },
1320
- handler: ({ query }) => {
1321
- return this.securityProvider.getRoles(query.userRealmName).map((r) => ({
1333
+ handler: ({ query, user }) => {
1334
+ return this.securityProvider.getRoles(this.securityProvider.assertRealmScope(user, query.userRealmName)).map((r) => ({
1322
1335
  name: r.name,
1323
1336
  default: r.default,
1324
1337
  description: r.description
@@ -1334,12 +1347,12 @@ var AdminUserController = class {
1334
1347
  use: [$secure({ permissions: ["admin:user:read"] })],
1335
1348
  description: "Find users with pagination and filtering",
1336
1349
  schema: {
1337
- query: t.extend(userQuerySchema, { userRealmName: t.optional(t.string()) }),
1338
- response: t.page(userResourceSchema)
1350
+ query: userQuerySchema.extend({ userRealmName: z.string().optional() }),
1351
+ response: z.page(userResourceSchema)
1339
1352
  },
1340
- handler: ({ query }) => {
1353
+ handler: ({ query, user }) => {
1341
1354
  const { userRealmName, ...q } = query;
1342
- return this.userService.findUsers(q, userRealmName);
1355
+ return this.userService.findUsers(q, this.securityProvider.assertRealmScope(user, userRealmName));
1343
1356
  }
1344
1357
  });
1345
1358
  /**
@@ -1351,11 +1364,11 @@ var AdminUserController = class {
1351
1364
  use: [$secure({ permissions: ["admin:user:read"] })],
1352
1365
  description: "Get a user by ID",
1353
1366
  schema: {
1354
- params: t.object({ id: t.uuid() }),
1355
- query: t.object({ userRealmName: t.optional(t.string()) }),
1367
+ params: z.object({ id: z.uuid() }),
1368
+ query: z.object({ userRealmName: z.string().optional() }),
1356
1369
  response: userResourceSchema
1357
1370
  },
1358
- handler: ({ params, query }) => this.userService.getUserById(params.id, query.userRealmName)
1371
+ handler: ({ params, query, user }) => this.userService.getUserById(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName))
1359
1372
  });
1360
1373
  /**
1361
1374
  * Create a new user.
@@ -1367,11 +1380,11 @@ var AdminUserController = class {
1367
1380
  use: [$secure({ permissions: ["admin:user:create"] })],
1368
1381
  description: "Create a new user",
1369
1382
  schema: {
1370
- query: t.object({ userRealmName: t.optional(t.string()) }),
1383
+ query: z.object({ userRealmName: z.string().optional() }),
1371
1384
  body: createUserSchema,
1372
1385
  response: userResourceSchema
1373
1386
  },
1374
- handler: ({ body, query }) => this.userService.createUser(body, query.userRealmName)
1387
+ handler: ({ body, query, user }) => this.userService.createUser(body, this.securityProvider.assertRealmScope(user, query.userRealmName))
1375
1388
  });
1376
1389
  /**
1377
1390
  * Update a user.
@@ -1383,12 +1396,12 @@ var AdminUserController = class {
1383
1396
  use: [$secure({ permissions: ["admin:user:update"] })],
1384
1397
  description: "Update a user",
1385
1398
  schema: {
1386
- params: t.object({ id: t.uuid() }),
1387
- query: t.object({ userRealmName: t.optional(t.string()) }),
1399
+ params: z.object({ id: z.uuid() }),
1400
+ query: z.object({ userRealmName: z.string().optional() }),
1388
1401
  body: updateUserSchema,
1389
1402
  response: userResourceSchema
1390
1403
  },
1391
- handler: ({ params, body, query }) => this.userService.updateUser(params.id, body, query.userRealmName)
1404
+ handler: ({ params, body, query, user }) => this.userService.updateUser(params.id, body, this.securityProvider.assertRealmScope(user, query.userRealmName))
1392
1405
  });
1393
1406
  /**
1394
1407
  * Set (or reset) a user's password. Admin-only flow — does NOT
@@ -1402,13 +1415,13 @@ var AdminUserController = class {
1402
1415
  use: [$secure({ permissions: ["admin:user:update"] })],
1403
1416
  description: "Set a user's password",
1404
1417
  schema: {
1405
- params: t.object({ id: t.uuid() }),
1406
- query: t.object({ userRealmName: t.optional(t.string()) }),
1407
- body: t.object({ password: t.string({ minLength: 1 }) }),
1418
+ params: z.object({ id: z.uuid() }),
1419
+ query: z.object({ userRealmName: z.string().optional() }),
1420
+ body: z.object({ password: z.string().min(1) }),
1408
1421
  response: okSchema
1409
1422
  },
1410
- handler: async ({ params, body, query }) => {
1411
- await this.userService.setPassword(params.id, body.password, query.userRealmName);
1423
+ handler: async ({ params, body, query, user }) => {
1424
+ await this.userService.setPassword(params.id, body.password, this.securityProvider.assertRealmScope(user, query.userRealmName));
1412
1425
  return {
1413
1426
  ok: true,
1414
1427
  id: params.id
@@ -1425,12 +1438,12 @@ var AdminUserController = class {
1425
1438
  use: [$secure({ permissions: ["admin:user:delete"] })],
1426
1439
  description: "Delete a user",
1427
1440
  schema: {
1428
- params: t.object({ id: t.uuid() }),
1429
- query: t.object({ userRealmName: t.optional(t.string()) }),
1441
+ params: z.object({ id: z.uuid() }),
1442
+ query: z.object({ userRealmName: z.string().optional() }),
1430
1443
  response: okSchema
1431
1444
  },
1432
- handler: async ({ params, query }) => {
1433
- await this.userService.deleteUser(params.id, query.userRealmName);
1445
+ handler: async ({ params, query, user }) => {
1446
+ await this.userService.deleteUser(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName));
1434
1447
  return {
1435
1448
  ok: true,
1436
1449
  id: params.id
@@ -1449,17 +1462,15 @@ var AdminUserController = class {
1449
1462
  use: [$secure({ permissions: ["admin:user:delete"] })],
1450
1463
  description: "Delete many users",
1451
1464
  schema: {
1452
- query: t.object({ userRealmName: t.optional(t.string()) }),
1453
- body: t.object({ ids: t.array(t.uuid(), {
1454
- minItems: 1,
1455
- maxItems: 1e3
1456
- }) }),
1457
- response: t.object({ deleted: t.array(t.uuid()) })
1465
+ query: z.object({ userRealmName: z.string().optional() }),
1466
+ body: z.object({ ids: z.array(z.uuid()).min(1).max(1e3) }),
1467
+ response: z.object({ deleted: z.array(z.uuid()) })
1458
1468
  },
1459
- handler: async ({ body, query }) => {
1469
+ handler: async ({ body, query, user }) => {
1470
+ const realm = this.securityProvider.assertRealmScope(user, query.userRealmName);
1460
1471
  const deleted = [];
1461
1472
  for (const id of body.ids) {
1462
- await this.userService.deleteUser(id, query.userRealmName);
1473
+ await this.userService.deleteUser(id, realm);
1463
1474
  deleted.push(id);
1464
1475
  }
1465
1476
  return { deleted };
@@ -1467,20 +1478,110 @@ var AdminUserController = class {
1467
1478
  });
1468
1479
  };
1469
1480
  //#endregion
1481
+ //#region ../../src/api/users/controllers/MySessionController.ts
1482
+ /**
1483
+ * A session as exposed to ITS OWNER — `refreshToken` is deliberately
1484
+ * omitted (returning it would let any XSS exfiltrate a long-lived
1485
+ * credential); `current` flags the session backing the calling request.
1486
+ */
1487
+ const mySessionSchema = z.object({
1488
+ id: z.uuid(),
1489
+ createdAt: z.datetime(),
1490
+ expiresAt: z.datetime(),
1491
+ lastUsedAt: z.datetime().optional(),
1492
+ ip: z.string().optional(),
1493
+ country: z.string().optional(),
1494
+ userAgent: z.object({
1495
+ os: z.string(),
1496
+ browser: z.string(),
1497
+ device: z.enum([
1498
+ "MOBILE",
1499
+ "DESKTOP",
1500
+ "TABLET"
1501
+ ])
1502
+ }).optional(),
1503
+ current: z.boolean()
1504
+ });
1505
+ /**
1506
+ * Self-service session management — the "where am I signed in?" page of an
1507
+ * account area. Counterpart of {@link AdminSessionController}, scoped to the
1508
+ * CALLER's own sessions: list them, revoke one (a stolen laptop), or revoke
1509
+ * everything except the current one.
1510
+ */
1511
+ var MySessionController = class {
1512
+ realmProvider = $inject(RealmProvider);
1513
+ sessions(realm) {
1514
+ return this.realmProvider.sessionRepository(realm);
1515
+ }
1516
+ toMySession(session, currentSessionId) {
1517
+ return {
1518
+ id: session.id,
1519
+ createdAt: session.createdAt,
1520
+ expiresAt: session.expiresAt,
1521
+ lastUsedAt: session.lastUsedAt,
1522
+ ip: session.ip,
1523
+ country: session.country,
1524
+ userAgent: session.userAgent,
1525
+ current: session.id === currentSessionId
1526
+ };
1527
+ }
1528
+ listMySessions = $action({
1529
+ method: "GET",
1530
+ path: "/users/me/sessions",
1531
+ use: [$secure()],
1532
+ description: "List the caller's active sessions",
1533
+ schema: { response: z.array(mySessionSchema) },
1534
+ handler: async ({ user }) => {
1535
+ return (await this.sessions(user.realm).findMany({
1536
+ where: { userId: { eq: user.id } },
1537
+ orderBy: [{
1538
+ column: "createdAt",
1539
+ direction: "desc"
1540
+ }]
1541
+ })).map((s) => this.toMySession(s, user.sessionId));
1542
+ }
1543
+ });
1544
+ deleteMySession = $action({
1545
+ method: "DELETE",
1546
+ path: "/users/me/sessions/:id",
1547
+ use: [$secure()],
1548
+ description: "Revoke one of the caller's sessions",
1549
+ schema: {
1550
+ params: z.object({ id: z.uuid() }),
1551
+ response: z.object({ ok: z.boolean() })
1552
+ },
1553
+ handler: async ({ params, user }) => {
1554
+ const repo = this.sessions(user.realm);
1555
+ const session = await repo.findOne({ where: {
1556
+ id: { eq: params.id },
1557
+ userId: { eq: user.id }
1558
+ } });
1559
+ if (!session) throw new NotFoundError("Session not found");
1560
+ await repo.deleteById(session.id);
1561
+ return { ok: true };
1562
+ }
1563
+ });
1564
+ deleteMyOtherSessions = $action({
1565
+ method: "POST",
1566
+ path: "/users/me/sessions/revoke-others",
1567
+ use: [$secure()],
1568
+ description: "Revoke every caller session except the current one",
1569
+ schema: { response: z.object({ revoked: z.integer() }) },
1570
+ handler: async ({ user }) => {
1571
+ const repo = this.sessions(user.realm);
1572
+ const others = (await repo.findMany({ where: { userId: { eq: user.id } } })).filter((s) => s.id !== user.sessionId);
1573
+ for (const s of others) await repo.deleteById(s.id);
1574
+ return { revoked: others.length };
1575
+ }
1576
+ });
1577
+ };
1578
+ //#endregion
1470
1579
  //#region ../../src/api/users/schemas/realmConfigSchema.ts
1471
- const realmConfigSchema = t.object({
1580
+ const realmConfigSchema = z.object({
1472
1581
  settings: realmAuthSettingsAtom.schema,
1473
- realmName: t.string(),
1474
- authenticationMethods: t.array(authenticationProviderSchema),
1475
- captchaSiteKey: t.optional(t.string({ description: "Public site key for the captcha widget (when settings.captchaRequired is true)" })),
1476
- /**
1477
- * Federated (broker) social login. When present, the login UI renders one
1478
- * button per provider linking to `{brokerUrl}/auth/federated/start`.
1479
- */
1480
- federated: t.optional(t.object({
1481
- brokerUrl: t.string({ description: "Broker origin that performs the OIDC dance." }),
1482
- providers: t.array(t.union([t.const("google"), t.const("apple")]), { description: "Federated providers to surface as login buttons." })
1483
- }))
1582
+ realmName: z.string(),
1583
+ authenticationMethods: z.array(authenticationProviderSchema),
1584
+ captchaSiteKey: z.string().describe("Public site key for the captcha widget (when settings.captchaRequired is true)").optional()
1484
1585
  });
1485
1586
  //#endregion
1486
1587
  //#region ../../src/api/users/controllers/RealmController.ts
@@ -1504,7 +1605,7 @@ var RealmController = class {
1504
1605
  path: `${this.url}/config`,
1505
1606
  use: [$etag()],
1506
1607
  schema: {
1507
- query: t.object({ realmName: t.optional(t.string()) }),
1608
+ query: z.object({ realmName: z.string().optional() }),
1508
1609
  response: realmConfigSchema
1509
1610
  },
1510
1611
  handler: async ({ query }) => {
@@ -1515,8 +1616,7 @@ var RealmController = class {
1515
1616
  settings,
1516
1617
  realmName,
1517
1618
  authenticationMethods: this.serverAuthProvider.getAuthenticationProviders({ realmName }),
1518
- captchaSiteKey: settings.captchaRequired ? this.captchaProvider.getSiteKey() : void 0,
1519
- federated: realm.federated
1619
+ captchaSiteKey: settings.captchaRequired ? this.captchaProvider.getSiteKey() : void 0
1520
1620
  };
1521
1621
  }
1522
1622
  });
@@ -1524,9 +1624,9 @@ var RealmController = class {
1524
1624
  group: this.group,
1525
1625
  path: `${this.url}/check-username`,
1526
1626
  schema: {
1527
- query: t.object({ realmName: t.optional(t.text()) }),
1528
- body: t.object({ username: t.text() }),
1529
- response: t.object({ available: t.boolean() })
1627
+ query: z.object({ realmName: z.text().optional() }),
1628
+ body: z.object({ username: z.text() }),
1629
+ response: z.object({ available: z.boolean() })
1530
1630
  },
1531
1631
  handler: async ({ query, body }) => {
1532
1632
  const realmName = query.realmName;
@@ -1542,21 +1642,18 @@ var RealmController = class {
1542
1642
  * Requires the intent ID from Phase 1, the verification code,
1543
1643
  * and the new password.
1544
1644
  */
1545
- const completePasswordResetRequestSchema = t.object({
1546
- intentId: t.uuid({ description: "The intent ID from createPasswordResetIntent" }),
1547
- code: t.string({ description: "6-digit verification code sent via email" }),
1548
- newPassword: t.string({
1549
- minLength: 8,
1550
- description: "New password (minimum 8 characters)"
1551
- })
1645
+ const completePasswordResetRequestSchema = z.object({
1646
+ intentId: z.uuid().describe("The intent ID from createPasswordResetIntent"),
1647
+ code: z.string().describe("6-digit verification code sent via email"),
1648
+ newPassword: z.string().min(8).describe("New password (minimum 8 characters)")
1552
1649
  });
1553
1650
  //#endregion
1554
1651
  //#region ../../src/api/users/schemas/completeRegistrationRequestSchema.ts
1555
- const completeRegistrationRequestSchema = t.object({
1556
- intentId: t.uuid({ description: "The registration intent ID from the first phase" }),
1557
- emailCode: t.optional(t.string({ description: "Email verification code (if email verification required)" })),
1558
- phoneCode: t.optional(t.string({ description: "Phone verification code (if phone verification required)" })),
1559
- captchaToken: t.optional(t.string({ description: "Captcha token (if captcha required)" }))
1652
+ const completeRegistrationRequestSchema = z.object({
1653
+ intentId: z.uuid().describe("The registration intent ID from the first phase"),
1654
+ emailCode: z.string().describe("Email verification code (if email verification required)").optional(),
1655
+ phoneCode: z.string().describe("Phone verification code (if phone verification required)").optional(),
1656
+ captchaToken: z.string().describe("Captcha token (if captcha required)").optional()
1560
1657
  });
1561
1658
  //#endregion
1562
1659
  //#region ../../src/api/users/schemas/passwordResetIntentResponseSchema.ts
@@ -1566,9 +1663,9 @@ const completeRegistrationRequestSchema = t.object({
1566
1663
  * Contains the intent ID needed for Phase 2 completion,
1567
1664
  * along with expiration time.
1568
1665
  */
1569
- const passwordResetIntentResponseSchema = t.object({
1570
- intentId: t.uuid({ description: "Unique identifier for this password reset intent" }),
1571
- expiresAt: t.datetime({ description: "ISO timestamp when this intent expires" })
1666
+ const passwordResetIntentResponseSchema = z.object({
1667
+ intentId: z.uuid().describe("Unique identifier for this password reset intent"),
1668
+ expiresAt: z.datetime().describe("ISO timestamp when this intent expires")
1572
1669
  });
1573
1670
  //#endregion
1574
1671
  //#region ../../src/api/users/schemas/registerQuerySchema.ts
@@ -1576,41 +1673,32 @@ const passwordResetIntentResponseSchema = t.object({
1576
1673
  * Schema for user registration query parameters.
1577
1674
  * Allows specifying a custom user realm.
1578
1675
  */
1579
- const registerQuerySchema = t.object({ userRealmName: t.optional(t.text({ description: "The user realm to register the user in (defaults to 'default')" })) });
1676
+ const registerQuerySchema = z.object({ userRealmName: z.text({ description: "The user realm to register the user in (defaults to 'default')" }).optional() });
1580
1677
  //#endregion
1581
1678
  //#region ../../src/api/users/schemas/registerRequestSchema.ts
1582
1679
  /**
1583
1680
  * Schema for user registration request body.
1584
1681
  * Password is always required, other fields depend on realm settings.
1585
1682
  */
1586
- const registerRequestSchema = t.object({
1587
- password: t.string({
1588
- minLength: 8,
1589
- description: "Password for the account"
1590
- }),
1591
- username: t.optional(t.string({
1592
- minLength: 3,
1593
- description: "Unique username for the account"
1594
- })),
1595
- email: t.optional(t.string({
1596
- format: "email",
1597
- description: "User's email address"
1598
- })),
1599
- phoneNumber: t.optional(t.string({ description: "User's phone number" })),
1600
- firstName: t.optional(t.string({ description: "User's first name" })),
1601
- lastName: t.optional(t.string({ description: "User's last name" })),
1602
- picture: t.optional(t.string({ description: "User's profile picture URL" })),
1603
- captchaToken: t.optional(t.string({ description: "Captcha response token (if captcha is required)" }))
1683
+ const registerRequestSchema = z.object({
1684
+ password: z.string().min(8).describe("Password for the account"),
1685
+ username: z.string().min(3).describe("Unique username for the account").optional(),
1686
+ email: z.string().meta({ format: "email" }).describe("User's email address").optional(),
1687
+ phoneNumber: z.string().describe("User's phone number").optional(),
1688
+ firstName: z.string().describe("User's first name").optional(),
1689
+ lastName: z.string().describe("User's last name").optional(),
1690
+ picture: z.string().describe("User's profile picture URL").optional(),
1691
+ captchaToken: z.string().describe("Captcha response token (if captcha is required)").optional()
1604
1692
  });
1605
1693
  //#endregion
1606
1694
  //#region ../../src/api/users/schemas/registrationIntentResponseSchema.ts
1607
- const registrationIntentResponseSchema = t.object({
1608
- intentId: t.uuid({ description: "Unique identifier for the registration intent" }),
1609
- expectCaptcha: t.boolean({ description: "Whether captcha verification is required" }),
1610
- captchaSiteKey: t.optional(t.string({ description: "Public site key the client should render (when expectCaptcha is true)" })),
1611
- expectEmailVerification: t.boolean({ description: "Whether email verification is required" }),
1612
- expectPhoneVerification: t.boolean({ description: "Whether phone verification is required" }),
1613
- expiresAt: t.datetime({ description: "When the registration intent expires" })
1695
+ const registrationIntentResponseSchema = z.object({
1696
+ intentId: z.uuid().describe("Unique identifier for the registration intent"),
1697
+ expectCaptcha: z.boolean().describe("Whether captcha verification is required"),
1698
+ captchaSiteKey: z.string().describe("Public site key the client should render (when expectCaptcha is true)").optional(),
1699
+ expectEmailVerification: z.boolean().describe("Whether email verification is required"),
1700
+ expectPhoneVerification: z.boolean().describe("Whether phone verification is required"),
1701
+ expiresAt: z.datetime().describe("When the registration intent expires")
1614
1702
  });
1615
1703
  //#endregion
1616
1704
  //#region ../../src/api/users/services/CredentialService.ts
@@ -2005,6 +2093,7 @@ var RegistrationService = class {
2005
2093
  dateTimeProvider = $inject(DateTimeProvider);
2006
2094
  cryptoProvider = $inject(CryptoProvider);
2007
2095
  verificationController = $client();
2096
+ verificationService = $inject(VerificationService);
2008
2097
  realmProvider = $inject(RealmProvider);
2009
2098
  credentialService = $inject(CredentialService);
2010
2099
  captchaProvider = $inject(CaptchaProvider);
@@ -2085,6 +2174,10 @@ var RegistrationService = class {
2085
2174
  this.log.debug("Registration rejected: phone required", { userRealmName });
2086
2175
  throw new BadRequestError("Phone number is required");
2087
2176
  }
2177
+ if (realmSettings?.firstNameLastName === "required" && (!body.firstName?.trim() || !body.lastName?.trim())) {
2178
+ this.log.debug("Registration rejected: first/last name required", { userRealmName });
2179
+ throw new BadRequestError("First name and last name are required");
2180
+ }
2088
2181
  if (realmSettings?.username === "email") {
2089
2182
  if (!body.email) throw new BadRequestError("Email is required to derive a username from email");
2090
2183
  const base = this.usernameSlugger.slug(body.email);
@@ -2257,9 +2350,9 @@ var RegistrationService = class {
2257
2350
  */
2258
2351
  async sendEmailVerification(email, realmName) {
2259
2352
  this.log.debug("Sending email verification code", { email });
2260
- const verification = await this.verificationController.requestVerificationCode({
2261
- params: { type: "code" },
2262
- body: { target: email }
2353
+ const verification = await this.verificationService.createVerification({
2354
+ type: "code",
2355
+ target: email
2263
2356
  });
2264
2357
  await this.userNotifications(realmName).emailVerification.push({
2265
2358
  contact: email,
@@ -2277,9 +2370,9 @@ var RegistrationService = class {
2277
2370
  async sendPhoneVerification(phoneNumber, realmName) {
2278
2371
  this.log.debug("Sending phone verification code", { phoneNumber });
2279
2372
  try {
2280
- const verification = await this.verificationController.requestVerificationCode({
2281
- params: { type: "code" },
2282
- body: { target: phoneNumber }
2373
+ const verification = await this.verificationService.createVerification({
2374
+ type: "code",
2375
+ target: phoneNumber
2283
2376
  });
2284
2377
  await this.userNotifications(realmName).phoneVerification.push({
2285
2378
  contact: phoneNumber,
@@ -2380,8 +2473,8 @@ var UserController = class {
2380
2473
  method: "POST",
2381
2474
  path: `${this.url}/password-reset`,
2382
2475
  schema: {
2383
- query: t.object({ userRealmName: t.optional(t.string()) }),
2384
- body: t.object({ email: t.email() }),
2476
+ query: z.object({ userRealmName: z.string().optional() }),
2477
+ body: z.object({ email: z.email() }),
2385
2478
  response: passwordResetIntentResponseSchema
2386
2479
  },
2387
2480
  handler: ({ body, query }) => this.credentialService.createPasswordResetIntent(body.email, query.userRealmName)
@@ -2410,11 +2503,11 @@ var UserController = class {
2410
2503
  path: "/users/password-reset/request",
2411
2504
  group: this.group,
2412
2505
  schema: {
2413
- query: t.object({ userRealmName: t.optional(t.string()) }),
2414
- body: t.object({ email: t.email() }),
2415
- response: t.object({
2416
- success: t.boolean(),
2417
- message: t.string()
2506
+ query: z.object({ userRealmName: z.string().optional() }),
2507
+ body: z.object({ email: z.email() }),
2508
+ response: z.object({
2509
+ success: z.boolean(),
2510
+ message: z.string()
2418
2511
  })
2419
2512
  },
2420
2513
  handler: async ({ body, query }) => {
@@ -2432,14 +2525,14 @@ var UserController = class {
2432
2525
  path: "/users/password-reset/validate",
2433
2526
  group: this.group,
2434
2527
  schema: {
2435
- query: t.object({
2436
- email: t.email(),
2437
- token: t.string(),
2438
- userRealmName: t.optional(t.string())
2528
+ query: z.object({
2529
+ email: z.email(),
2530
+ token: z.string(),
2531
+ userRealmName: z.string().optional()
2439
2532
  }),
2440
- response: t.object({
2441
- valid: t.boolean(),
2442
- email: t.optional(t.email())
2533
+ response: z.object({
2534
+ valid: z.boolean(),
2535
+ email: z.email().optional()
2443
2536
  })
2444
2537
  },
2445
2538
  handler: async ({ query }) => {
@@ -2460,15 +2553,15 @@ var UserController = class {
2460
2553
  path: "/users/password-reset/reset",
2461
2554
  group: this.group,
2462
2555
  schema: {
2463
- query: t.object({ userRealmName: t.optional(t.string()) }),
2464
- body: t.object({
2465
- email: t.email(),
2466
- token: t.string(),
2467
- newPassword: t.string({ minLength: 8 })
2556
+ query: z.object({ userRealmName: z.string().optional() }),
2557
+ body: z.object({
2558
+ email: z.email(),
2559
+ token: z.string(),
2560
+ newPassword: z.string().min(8)
2468
2561
  }),
2469
- response: t.object({
2470
- success: t.boolean(),
2471
- message: t.string()
2562
+ response: z.object({
2563
+ success: z.boolean(),
2564
+ message: z.string()
2472
2565
  })
2473
2566
  },
2474
2567
  handler: async ({ body, query }) => {
@@ -2489,17 +2582,14 @@ var UserController = class {
2489
2582
  path: "/users/email-verification/request",
2490
2583
  group: this.group,
2491
2584
  schema: {
2492
- query: t.object({
2493
- userRealmName: t.optional(t.string()),
2494
- method: t.optional(t.enum(["code", "link"], {
2495
- default: "code",
2496
- description: "Verification method: \"code\" sends a 6-digit code, \"link\" sends a clickable verification link. When using \"link\", configure verifyEmailUrl in realm settings."
2497
- }))
2585
+ query: z.object({
2586
+ userRealmName: z.string().optional(),
2587
+ method: z.enum(["code", "link"]).describe("Verification method: \"code\" sends a 6-digit code, \"link\" sends a clickable verification link. When using \"link\", configure verifyEmailUrl in realm settings.").default("code").optional()
2498
2588
  }),
2499
- body: t.object({ email: t.email() }),
2500
- response: t.object({
2501
- success: t.boolean(),
2502
- message: t.string()
2589
+ body: z.object({ email: z.email() }),
2590
+ response: z.object({
2591
+ success: z.boolean(),
2592
+ message: z.string()
2503
2593
  })
2504
2594
  },
2505
2595
  handler: async ({ body, query }) => {
@@ -2519,14 +2609,14 @@ var UserController = class {
2519
2609
  path: "/users/email-verification/verify",
2520
2610
  group: this.group,
2521
2611
  schema: {
2522
- query: t.object({ userRealmName: t.optional(t.string()) }),
2523
- body: t.object({
2524
- email: t.email(),
2525
- token: t.string()
2612
+ query: z.object({ userRealmName: z.string().optional() }),
2613
+ body: z.object({
2614
+ email: z.email(),
2615
+ token: z.string()
2526
2616
  }),
2527
- response: t.object({
2528
- success: t.boolean(),
2529
- message: t.string()
2617
+ response: z.object({
2618
+ success: z.boolean(),
2619
+ message: z.string()
2530
2620
  })
2531
2621
  },
2532
2622
  handler: async ({ body, query }) => {
@@ -2545,11 +2635,11 @@ var UserController = class {
2545
2635
  group: this.group,
2546
2636
  use: [$secure()],
2547
2637
  schema: {
2548
- query: t.object({
2549
- email: t.email(),
2550
- userRealmName: t.optional(t.string())
2638
+ query: z.object({
2639
+ email: z.email(),
2640
+ userRealmName: z.string().optional()
2551
2641
  }),
2552
- response: t.object({ verified: t.boolean() })
2642
+ response: z.object({ verified: z.boolean() })
2553
2643
  },
2554
2644
  handler: async ({ query }) => {
2555
2645
  return { verified: await this.userService.isEmailVerified(query.email, query.userRealmName) };
@@ -3235,6 +3325,7 @@ const $realm = (options = {}) => {
3235
3325
  ...options.issuer,
3236
3326
  name,
3237
3327
  secret: options.secret ?? securityProvider.secretKey,
3328
+ signing: options.signing,
3238
3329
  resolvers: customResolvers,
3239
3330
  roles: options.issuer?.roles ?? [{
3240
3331
  name: "admin",
@@ -3283,7 +3374,10 @@ const $realm = (options = {}) => {
3283
3374
  id: user.id,
3284
3375
  roles: user.roles,
3285
3376
  name: composedName,
3377
+ firstName: user.firstName,
3378
+ lastName: user.lastName,
3286
3379
  email: user.email,
3380
+ emailVerified: user.emailVerified,
3287
3381
  username: user.username,
3288
3382
  picture: user.picture,
3289
3383
  organization: user.organizationId ?? void 0,
@@ -3322,14 +3416,6 @@ const $realm = (options = {}) => {
3322
3416
  if (identities.microsoft) auth.microsoft = $authMicrosoft(realm);
3323
3417
  if (identities.franceconnect) auth.franceconnect = $authFranceConnect(realm);
3324
3418
  alepha.with(() => auth);
3325
- if (identities.federated) {
3326
- const fed = $authFederationClient({
3327
- realm,
3328
- brokerUrl: identities.federated.brokerUrl,
3329
- publicKeyPem: identities.federated.publicKey
3330
- });
3331
- alepha.with(() => ({ federationCallback: fed.callback }));
3332
- }
3333
3419
  }
3334
3420
  if (features.parameters) {
3335
3421
  alepha.with(AlephaApiParameters);
@@ -3346,57 +3432,34 @@ const $realm = (options = {}) => {
3346
3432
  };
3347
3433
  //#endregion
3348
3434
  //#region ../../src/api/users/schemas/loginSchema.ts
3349
- const loginSchema = t.object({
3350
- username: t.text({
3435
+ const loginSchema = z.object({
3436
+ username: z.text({
3351
3437
  minLength: 3,
3352
3438
  maxLength: 100,
3353
3439
  description: "Username or email address for login"
3354
3440
  }),
3355
- password: t.text({
3441
+ password: z.text({
3356
3442
  minLength: 8,
3357
3443
  description: "User password"
3358
3444
  })
3359
3445
  });
3360
3446
  //#endregion
3361
3447
  //#region ../../src/api/users/schemas/registerSchema.ts
3362
- const registerSchema = t.object({
3363
- username: t.string({
3364
- minLength: 3,
3365
- maxLength: 20,
3366
- pattern: /^[a-zA-Z0-9_]+$/,
3367
- description: "Username for the new account"
3368
- }),
3369
- email: t.email({ description: "Email address for the new account" }),
3370
- password: t.string({
3371
- minLength: 8,
3372
- description: "Password for the new account"
3373
- }),
3374
- confirmPassword: t.string({
3375
- minLength: 8,
3376
- description: "Confirmation of the password"
3377
- }),
3378
- firstName: t.optional(t.string({
3379
- maxLength: 100,
3380
- description: "User's first name"
3381
- })),
3382
- lastName: t.optional(t.string({
3383
- maxLength: 100,
3384
- description: "User's last name"
3385
- }))
3448
+ const registerSchema = z.object({
3449
+ username: z.string().min(3).max(20).regex(/^[a-zA-Z0-9_]+$/).describe("Username for the new account"),
3450
+ email: z.email().describe("Email address for the new account"),
3451
+ password: z.string().min(8).describe("Password for the new account"),
3452
+ confirmPassword: z.string().min(8).describe("Confirmation of the password"),
3453
+ firstName: z.string().max(100).describe("User's first name").optional(),
3454
+ lastName: z.string().max(100).describe("User's last name").optional()
3386
3455
  });
3387
3456
  //#endregion
3388
3457
  //#region ../../src/api/users/schemas/resetPasswordSchema.ts
3389
- const resetPasswordRequestSchema = t.object({ email: t.email({ description: "Email address to send password reset link" }) });
3390
- const resetPasswordSchema = t.object({
3391
- token: t.string({ description: "Password reset token from email" }),
3392
- password: t.string({
3393
- minLength: 8,
3394
- description: "New password"
3395
- }),
3396
- confirmPassword: t.string({
3397
- minLength: 8,
3398
- description: "Confirmation of the new password"
3399
- })
3458
+ const resetPasswordRequestSchema = z.object({ email: z.email().describe("Email address to send password reset link") });
3459
+ const resetPasswordSchema = z.object({
3460
+ token: z.string().describe("Password reset token from email"),
3461
+ password: z.string().min(8).describe("New password"),
3462
+ confirmPassword: z.string().min(8).describe("Confirmation of the new password")
3400
3463
  });
3401
3464
  //#endregion
3402
3465
  //#region ../../src/api/users/index.ts
@@ -3429,6 +3492,7 @@ const AlephaApiUsers = $module({
3429
3492
  UserController,
3430
3493
  AdminUserController,
3431
3494
  AdminSessionController,
3495
+ MySessionController,
3432
3496
  AdminIdentityController,
3433
3497
  RealmController
3434
3498
  ],
@@ -3441,6 +3505,6 @@ const AlephaApiUsers = $module({
3441
3505
  ]
3442
3506
  });
3443
3507
  //#endregion
3444
- export { $realm, AdminIdentityController, AdminSessionController, AdminUserController, AlephaApiUsers, CredentialService, DEFAULT_USER_REALM_NAME, IdentityService, RealmController, RealmProvider, RegistrationService, SessionAudits, SessionCrudService, SessionService, UserAudits, UserBuckets, UserController, UserJobs, UserNotifications, UserService, UsernameSlugger, completePasswordResetRequestSchema, completeRegistrationRequestSchema, createUserSchema, identities, identityQuerySchema, identityResourceSchema, loginSchema, passwordResetIntentResponseSchema, realmAuthSettingsAtom, realmConfigSchema, registerSchema, registrationIntentResponseSchema, resetPasswordRequestSchema, resetPasswordSchema, sessionQuerySchema, sessionResourceSchema, sessionUserSummarySchema, sessions, updateUserSchema, userQuerySchema, userResourceSchema, users };
3508
+ export { $realm, AdminIdentityController, AdminSessionController, AdminUserController, AlephaApiUsers, CredentialService, DEFAULT_USER_REALM_NAME, IdentityService, MySessionController, RealmController, RealmProvider, RegistrationService, SessionAudits, SessionCrudService, SessionService, UserAudits, UserBuckets, UserController, UserJobs, UserNotifications, UserService, UsernameSlugger, completePasswordResetRequestSchema, completeRegistrationRequestSchema, createUserSchema, identities, identityQuerySchema, identityResourceSchema, loginSchema, mySessionSchema, passwordResetIntentResponseSchema, realmAuthSettingsAtom, realmConfigSchema, registerSchema, registrationIntentResponseSchema, resetPasswordRequestSchema, resetPasswordSchema, sessionQuerySchema, sessionResourceSchema, sessionUserSummarySchema, sessions, updateUserSchema, userQuerySchema, userResourceSchema, users };
3445
3509
 
3446
3510
  //# sourceMappingURL=index.js.map