alepha 0.22.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (869) hide show
  1. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  2. package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
  3. package/dist/api/audits/index.browser.js +49 -52
  4. package/dist/api/audits/index.browser.js.map +1 -1
  5. package/dist/api/audits/index.d.ts +629 -565
  6. package/dist/api/audits/index.d.ts.map +1 -1
  7. package/dist/api/audits/index.js +206 -98
  8. package/dist/api/audits/index.js.map +1 -1
  9. package/dist/api/files/index.browser.js +44 -44
  10. package/dist/api/files/index.browser.js.map +1 -1
  11. package/dist/api/files/index.d.ts +292 -293
  12. package/dist/api/files/index.d.ts.map +1 -1
  13. package/dist/api/files/index.js +61 -64
  14. package/dist/api/files/index.js.map +1 -1
  15. package/dist/api/jobs/index.browser.js +61 -59
  16. package/dist/api/jobs/index.browser.js.map +1 -1
  17. package/dist/api/jobs/index.d.ts +546 -347
  18. package/dist/api/jobs/index.d.ts.map +1 -1
  19. package/dist/api/jobs/index.js +165 -86
  20. package/dist/api/jobs/index.js.map +1 -1
  21. package/dist/api/keys/index.d.ts +242 -230
  22. package/dist/api/keys/index.d.ts.map +1 -1
  23. package/dist/api/keys/index.js +63 -66
  24. package/dist/api/keys/index.js.map +1 -1
  25. package/dist/api/notifications/index.browser.js +40 -38
  26. package/dist/api/notifications/index.browser.js.map +1 -1
  27. package/dist/api/notifications/index.d.ts +339 -209
  28. package/dist/api/notifications/index.d.ts.map +1 -1
  29. package/dist/api/notifications/index.js +108 -60
  30. package/dist/api/notifications/index.js.map +1 -1
  31. package/dist/api/oauth/index.d.ts +190 -78
  32. package/dist/api/oauth/index.d.ts.map +1 -1
  33. package/dist/api/oauth/index.js +290 -68
  34. package/dist/api/oauth/index.js.map +1 -1
  35. package/dist/api/organizations/index.browser.js +14 -14
  36. package/dist/api/organizations/index.browser.js.map +1 -1
  37. package/dist/api/organizations/index.d.ts +158 -134
  38. package/dist/api/organizations/index.d.ts.map +1 -1
  39. package/dist/api/organizations/index.js +18 -18
  40. package/dist/api/organizations/index.js.map +1 -1
  41. package/dist/api/parameters/index.browser.js +74 -53
  42. package/dist/api/parameters/index.browser.js.map +1 -1
  43. package/dist/api/parameters/index.d.ts +607 -513
  44. package/dist/api/parameters/index.d.ts.map +1 -1
  45. package/dist/api/parameters/index.js +205 -127
  46. package/dist/api/parameters/index.js.map +1 -1
  47. package/dist/api/payments/index.d.ts +652 -449
  48. package/dist/api/payments/index.d.ts.map +1 -1
  49. package/dist/api/payments/index.js +159 -93
  50. package/dist/api/payments/index.js.map +1 -1
  51. package/dist/api/subscriptions/index.d.ts +1032 -762
  52. package/dist/api/subscriptions/index.d.ts.map +1 -1
  53. package/dist/api/subscriptions/index.js +166 -185
  54. package/dist/api/subscriptions/index.js.map +1 -1
  55. package/dist/api/users/index.browser.js +48 -71
  56. package/dist/api/users/index.browser.js.map +1 -1
  57. package/dist/api/users/index.d.ts +1297 -1109
  58. package/dist/api/users/index.d.ts.map +1 -1
  59. package/dist/api/users/index.js +454 -369
  60. package/dist/api/users/index.js.map +1 -1
  61. package/dist/api/verifications/index.browser.js +17 -17
  62. package/dist/api/verifications/index.browser.js.map +1 -1
  63. package/dist/api/verifications/index.d.ts +169 -157
  64. package/dist/api/verifications/index.d.ts.map +1 -1
  65. package/dist/api/verifications/index.js +47 -95
  66. package/dist/api/verifications/index.js.map +1 -1
  67. package/dist/background/index.d.ts +0 -1
  68. package/dist/background/index.d.ts.map +1 -1
  69. package/dist/background/index.js.map +1 -1
  70. package/dist/background/index.workerd.js.map +1 -1
  71. package/dist/batch/index.d.ts +0 -1
  72. package/dist/batch/index.d.ts.map +1 -1
  73. package/dist/batch/index.js.map +1 -1
  74. package/dist/bin/index.js +1 -1
  75. package/dist/bin/index.js.map +1 -1
  76. package/dist/bucket/index.d.ts +27 -32
  77. package/dist/bucket/index.d.ts.map +1 -1
  78. package/dist/bucket/index.js +56 -26
  79. package/dist/bucket/index.js.map +1 -1
  80. package/dist/bucket/index.workerd.js +52 -24
  81. package/dist/bucket/index.workerd.js.map +1 -1
  82. package/dist/cache/core/index.d.ts +4 -6
  83. package/dist/cache/core/index.d.ts.map +1 -1
  84. package/dist/cache/core/index.js +4 -10
  85. package/dist/cache/core/index.js.map +1 -1
  86. package/dist/cache/core/index.workerd.js +4 -10
  87. package/dist/cache/core/index.workerd.js.map +1 -1
  88. package/dist/cache/database/index.d.ts +22 -23
  89. package/dist/cache/database/index.d.ts.map +1 -1
  90. package/dist/cache/database/index.js +11 -20
  91. package/dist/cache/database/index.js.map +1 -1
  92. package/dist/cache/redis/index.d.ts +3 -4
  93. package/dist/cache/redis/index.d.ts.map +1 -1
  94. package/dist/cache/redis/index.js +2 -2
  95. package/dist/cache/redis/index.js.map +1 -1
  96. package/dist/captcha/index.d.ts.map +1 -1
  97. package/dist/captcha/index.js +4 -4
  98. package/dist/captcha/index.js.map +1 -1
  99. package/dist/cli/config/index.d.ts +0 -1
  100. package/dist/cli/config/index.d.ts.map +1 -1
  101. package/dist/cli/core/index.d.ts +244 -475
  102. package/dist/cli/core/index.d.ts.map +1 -1
  103. package/dist/cli/core/index.js +308 -383
  104. package/dist/cli/core/index.js.map +1 -1
  105. package/dist/cli/devtools/index.d.ts +3 -9
  106. package/dist/cli/devtools/index.d.ts.map +1 -1
  107. package/dist/cli/devtools/index.js +3 -3
  108. package/dist/cli/devtools/index.js.map +1 -1
  109. package/dist/cli/i18n/index.d.ts +20 -39
  110. package/dist/cli/i18n/index.d.ts.map +1 -1
  111. package/dist/cli/i18n/index.js +51 -17
  112. package/dist/cli/i18n/index.js.map +1 -1
  113. package/dist/cli/platform/index.d.ts +89 -82
  114. package/dist/cli/platform/index.d.ts.map +1 -1
  115. package/dist/cli/platform/index.js +27 -33
  116. package/dist/cli/platform/index.js.map +1 -1
  117. package/dist/cli/platform-lib/index.d.ts +383 -410
  118. package/dist/cli/platform-lib/index.d.ts.map +1 -1
  119. package/dist/cli/platform-lib/index.js +300 -258
  120. package/dist/cli/platform-lib/index.js.map +1 -1
  121. package/dist/cli/vendor/index.d.ts +17 -41
  122. package/dist/cli/vendor/index.d.ts.map +1 -1
  123. package/dist/cli/vendor/index.js +10 -13
  124. package/dist/cli/vendor/index.js.map +1 -1
  125. package/dist/command/index.d.ts +82 -194
  126. package/dist/command/index.d.ts.map +1 -1
  127. package/dist/command/index.js +160 -563
  128. package/dist/command/index.js.map +1 -1
  129. package/dist/core/index.browser.js +845 -859
  130. package/dist/core/index.browser.js.map +1 -1
  131. package/dist/core/index.d.ts +787 -527
  132. package/dist/core/index.d.ts.map +1 -1
  133. package/dist/core/index.js +845 -859
  134. package/dist/core/index.js.map +1 -1
  135. package/dist/core/index.native.js +845 -859
  136. package/dist/core/index.native.js.map +1 -1
  137. package/dist/core/index.workerd.js +845 -859
  138. package/dist/core/index.workerd.js.map +1 -1
  139. package/dist/crypto/index.browser.js +1 -1
  140. package/dist/crypto/index.browser.js.map +1 -1
  141. package/dist/crypto/index.d.ts +3 -4
  142. package/dist/crypto/index.d.ts.map +1 -1
  143. package/dist/crypto/index.js +6 -3
  144. package/dist/crypto/index.js.map +1 -1
  145. package/dist/datetime/index.d.ts +12 -2
  146. package/dist/datetime/index.d.ts.map +1 -1
  147. package/dist/datetime/index.js +6 -1
  148. package/dist/datetime/index.js.map +1 -1
  149. package/dist/email/brevo/index.d.ts +0 -1
  150. package/dist/email/brevo/index.d.ts.map +1 -1
  151. package/dist/email/brevo/index.js +4 -4
  152. package/dist/email/brevo/index.js.map +1 -1
  153. package/dist/email/cloudflare/index.d.ts +0 -1
  154. package/dist/email/cloudflare/index.d.ts.map +1 -1
  155. package/dist/email/cloudflare/index.js +2 -2
  156. package/dist/email/cloudflare/index.js.map +1 -1
  157. package/dist/email/core/index.d.ts +15 -7
  158. package/dist/email/core/index.d.ts.map +1 -1
  159. package/dist/email/core/index.js +14 -5
  160. package/dist/email/core/index.js.map +1 -1
  161. package/dist/email/core/index.workerd.js +5 -1
  162. package/dist/email/core/index.workerd.js.map +1 -1
  163. package/dist/email/smtp/index.d.ts +8 -9
  164. package/dist/email/smtp/index.d.ts.map +1 -1
  165. package/dist/email/smtp/index.js +702 -479
  166. package/dist/email/smtp/index.js.map +1 -1
  167. package/dist/fake/index.d.ts +1580 -1238
  168. package/dist/fake/index.d.ts.map +1 -1
  169. package/dist/fake/index.js +11728 -32131
  170. package/dist/fake/index.js.map +1 -1
  171. package/dist/lock/core/index.d.ts +13 -9
  172. package/dist/lock/core/index.d.ts.map +1 -1
  173. package/dist/lock/core/index.js +5 -5
  174. package/dist/lock/core/index.js.map +1 -1
  175. package/dist/lock/redis/index.d.ts +0 -1
  176. package/dist/lock/redis/index.d.ts.map +1 -1
  177. package/dist/lock/redis/index.js.map +1 -1
  178. package/dist/logger/index.d.ts +81 -69
  179. package/dist/logger/index.d.ts.map +1 -1
  180. package/dist/logger/index.js +123 -56
  181. package/dist/logger/index.js.map +1 -1
  182. package/dist/mcp/index.d.ts +36 -90
  183. package/dist/mcp/index.d.ts.map +1 -1
  184. package/dist/mcp/index.js +65 -70
  185. package/dist/mcp/index.js.map +1 -1
  186. package/dist/orm/core/index.browser.js +54 -40
  187. package/dist/orm/core/index.browser.js.map +1 -1
  188. package/dist/orm/core/index.bun.js +140 -106
  189. package/dist/orm/core/index.bun.js.map +1 -1
  190. package/dist/orm/core/index.d.ts +145 -150
  191. package/dist/orm/core/index.d.ts.map +1 -1
  192. package/dist/orm/core/index.js +144 -109
  193. package/dist/orm/core/index.js.map +1 -1
  194. package/dist/orm/postgres/index.bun.js +64 -54
  195. package/dist/orm/postgres/index.bun.js.map +1 -1
  196. package/dist/orm/postgres/index.d.ts +36 -76
  197. package/dist/orm/postgres/index.d.ts.map +1 -1
  198. package/dist/orm/postgres/index.js +67 -57
  199. package/dist/orm/postgres/index.js.map +1 -1
  200. package/dist/queue/core/index.d.ts +62 -75
  201. package/dist/queue/core/index.d.ts.map +1 -1
  202. package/dist/queue/core/index.js +48 -71
  203. package/dist/queue/core/index.js.map +1 -1
  204. package/dist/queue/core/index.workerd.js +48 -71
  205. package/dist/queue/core/index.workerd.js.map +1 -1
  206. package/dist/queue/redis/index.d.ts +3 -4
  207. package/dist/queue/redis/index.d.ts.map +1 -1
  208. package/dist/queue/redis/index.js +2 -2
  209. package/dist/queue/redis/index.js.map +1 -1
  210. package/dist/react/auth/index.browser.js.map +1 -1
  211. package/dist/react/auth/index.d.ts +7 -4
  212. package/dist/react/auth/index.d.ts.map +1 -1
  213. package/dist/react/auth/index.js.map +1 -1
  214. package/dist/react/core/index.d.ts +87 -5
  215. package/dist/react/core/index.d.ts.map +1 -1
  216. package/dist/react/core/index.js +170 -23
  217. package/dist/react/core/index.js.map +1 -1
  218. package/dist/react/form/index.d.ts +4 -6
  219. package/dist/react/form/index.d.ts.map +1 -1
  220. package/dist/react/form/index.js +107 -71
  221. package/dist/react/form/index.js.map +1 -1
  222. package/dist/react/head/index.browser.js.map +1 -1
  223. package/dist/react/head/index.d.ts +0 -1
  224. package/dist/react/head/index.d.ts.map +1 -1
  225. package/dist/react/head/index.js.map +1 -1
  226. package/dist/react/i18n/index.d.ts +47 -5
  227. package/dist/react/i18n/index.d.ts.map +1 -1
  228. package/dist/react/i18n/index.js +116 -12
  229. package/dist/react/i18n/index.js.map +1 -1
  230. package/dist/react/intro/index.d.ts +1 -4
  231. package/dist/react/intro/index.d.ts.map +1 -1
  232. package/dist/react/intro/index.js.map +1 -1
  233. package/dist/react/router/index.browser.js +188 -29
  234. package/dist/react/router/index.browser.js.map +1 -1
  235. package/dist/react/router/index.d.ts +480 -372
  236. package/dist/react/router/index.d.ts.map +1 -1
  237. package/dist/react/router/index.js +261 -47
  238. package/dist/react/router/index.js.map +1 -1
  239. package/dist/react/sitemap/index.browser.js +35 -0
  240. package/dist/react/sitemap/index.browser.js.map +1 -0
  241. package/dist/react/sitemap/index.d.ts +91 -0
  242. package/dist/react/sitemap/index.d.ts.map +1 -0
  243. package/dist/react/sitemap/index.js +131 -0
  244. package/dist/react/sitemap/index.js.map +1 -0
  245. package/dist/react/testing/index.d.ts +4 -5
  246. package/dist/react/testing/index.d.ts.map +1 -1
  247. package/dist/react/testing/index.js +41 -15
  248. package/dist/react/testing/index.js.map +1 -1
  249. package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
  250. package/dist/react/ui/index.d.ts +35 -34
  251. package/dist/react/ui/index.d.ts.map +1 -1
  252. package/dist/react/ui/index.js +12 -17
  253. package/dist/react/ui/index.js.map +1 -1
  254. package/dist/redis/index.bun.js +5 -5
  255. package/dist/redis/index.bun.js.map +1 -1
  256. package/dist/redis/index.d.ts +6 -7
  257. package/dist/redis/index.d.ts.map +1 -1
  258. package/dist/redis/index.js +6 -6
  259. package/dist/redis/index.js.map +1 -1
  260. package/dist/retry/index.d.ts +0 -1
  261. package/dist/retry/index.d.ts.map +1 -1
  262. package/dist/retry/index.js.map +1 -1
  263. package/dist/router/index.d.ts.map +1 -1
  264. package/dist/router/index.js.map +1 -1
  265. package/dist/scheduler/index.d.ts +4 -12
  266. package/dist/scheduler/index.d.ts.map +1 -1
  267. package/dist/scheduler/index.js +9 -4
  268. package/dist/scheduler/index.js.map +1 -1
  269. package/dist/scheduler/index.workerd.js +9 -4
  270. package/dist/scheduler/index.workerd.js.map +1 -1
  271. package/dist/security/index.browser.js +30 -28
  272. package/dist/security/index.browser.js.map +1 -1
  273. package/dist/security/index.d.ts +113 -44
  274. package/dist/security/index.d.ts.map +1 -1
  275. package/dist/security/index.js +452 -37
  276. package/dist/security/index.js.map +1 -1
  277. package/dist/server/auth/index.browser.js +19 -19
  278. package/dist/server/auth/index.browser.js.map +1 -1
  279. package/dist/server/auth/index.d.ts +215 -187
  280. package/dist/server/auth/index.d.ts.map +1 -1
  281. package/dist/server/auth/index.js +1145 -86
  282. package/dist/server/auth/index.js.map +1 -1
  283. package/dist/server/cookies/index.browser.js +103 -5
  284. package/dist/server/cookies/index.browser.js.map +1 -1
  285. package/dist/server/cookies/index.d.ts +86 -4
  286. package/dist/server/cookies/index.d.ts.map +1 -1
  287. package/dist/server/cookies/index.js +121 -8
  288. package/dist/server/cookies/index.js.map +1 -1
  289. package/dist/server/core/index.browser.js +22 -27
  290. package/dist/server/core/index.browser.js.map +1 -1
  291. package/dist/server/core/index.d.ts +134 -85
  292. package/dist/server/core/index.d.ts.map +1 -1
  293. package/dist/server/core/index.js +130 -118
  294. package/dist/server/core/index.js.map +1 -1
  295. package/dist/server/cors/index.d.ts +9 -10
  296. package/dist/server/cors/index.d.ts.map +1 -1
  297. package/dist/server/cors/index.js +14 -26
  298. package/dist/server/cors/index.js.map +1 -1
  299. package/dist/server/etag/index.d.ts +2 -3
  300. package/dist/server/etag/index.d.ts.map +1 -1
  301. package/dist/server/etag/index.js.map +1 -1
  302. package/dist/server/health/index.d.ts +18 -19
  303. package/dist/server/health/index.d.ts.map +1 -1
  304. package/dist/server/health/index.js +6 -6
  305. package/dist/server/health/index.js.map +1 -1
  306. package/dist/server/links/index.browser.js +15 -18
  307. package/dist/server/links/index.browser.js.map +1 -1
  308. package/dist/server/links/index.d.ts +66 -67
  309. package/dist/server/links/index.d.ts.map +1 -1
  310. package/dist/server/links/index.js +29 -32
  311. package/dist/server/links/index.js.map +1 -1
  312. package/dist/server/metrics/index.d.ts +0 -1
  313. package/dist/server/metrics/index.d.ts.map +1 -1
  314. package/dist/server/metrics/index.js +10 -3
  315. package/dist/server/metrics/index.js.map +1 -1
  316. package/dist/server/proxy/index.d.ts +0 -1
  317. package/dist/server/proxy/index.d.ts.map +1 -1
  318. package/dist/server/proxy/index.js.map +1 -1
  319. package/dist/server/rate-limit/index.d.ts +8 -9
  320. package/dist/server/rate-limit/index.d.ts.map +1 -1
  321. package/dist/server/rate-limit/index.js +6 -12
  322. package/dist/server/rate-limit/index.js.map +1 -1
  323. package/dist/server/static/index.d.ts +0 -1
  324. package/dist/server/static/index.d.ts.map +1 -1
  325. package/dist/server/static/index.js.map +1 -1
  326. package/dist/server/swagger/index.d.ts +4 -4
  327. package/dist/server/swagger/index.d.ts.map +1 -1
  328. package/dist/server/swagger/index.js +37 -25
  329. package/dist/server/swagger/index.js.map +1 -1
  330. package/dist/sms/index.d.ts +0 -1
  331. package/dist/sms/index.d.ts.map +1 -1
  332. package/dist/sms/index.js.map +1 -1
  333. package/dist/system/index.browser.js.map +1 -1
  334. package/dist/system/index.d.ts +0 -1
  335. package/dist/system/index.d.ts.map +1 -1
  336. package/dist/system/index.js +2 -1
  337. package/dist/system/index.js.map +1 -1
  338. package/dist/system/index.workerd.js.map +1 -1
  339. package/dist/topic/core/index.d.ts +19 -20
  340. package/dist/topic/core/index.d.ts.map +1 -1
  341. package/dist/topic/core/index.js +8 -8
  342. package/dist/topic/core/index.js.map +1 -1
  343. package/dist/topic/redis/index.d.ts +3 -4
  344. package/dist/topic/redis/index.d.ts.map +1 -1
  345. package/dist/topic/redis/index.js +2 -2
  346. package/dist/topic/redis/index.js.map +1 -1
  347. package/package.json +36 -36
  348. package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
  349. package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
  350. package/src/api/audits/controllers/AdminAuditController.ts +41 -41
  351. package/src/api/audits/entities/audits.ts +22 -22
  352. package/src/api/audits/index.ts +6 -1
  353. package/src/api/audits/jobs/AuditJobs.ts +29 -0
  354. package/src/api/audits/parameters/AuditParameters.ts +51 -0
  355. package/src/api/audits/primitives/$audit.ts +24 -0
  356. package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
  357. package/src/api/audits/schemas/createAuditSchema.ts +18 -18
  358. package/src/api/audits/services/AuditService.ts +79 -7
  359. package/src/api/files/__tests__/FileController.spec.ts +5 -5
  360. package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
  361. package/src/api/files/controllers/FileController.ts +25 -25
  362. package/src/api/files/entities/files.ts +15 -15
  363. package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
  364. package/src/api/files/schemas/fileQuerySchema.ts +9 -9
  365. package/src/api/files/schemas/fileResourceSchema.ts +7 -9
  366. package/src/api/files/schemas/storageStatsSchema.ts +13 -13
  367. package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
  368. package/src/api/jobs/__tests__/$job.spec.ts +18 -18
  369. package/src/api/jobs/controllers/AdminJobController.ts +8 -8
  370. package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
  371. package/src/api/jobs/providers/JobProvider.ts +128 -12
  372. package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
  373. package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
  374. package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
  375. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
  376. package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
  377. package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
  378. package/src/api/jobs/services/JobService.ts +6 -6
  379. package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
  380. package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
  381. package/src/api/keys/entities/apiKeyEntity.ts +15 -15
  382. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
  383. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
  384. package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
  385. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
  386. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
  387. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
  388. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
  389. package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
  390. package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
  391. package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
  392. package/src/api/notifications/primitives/$notification.ts +43 -4
  393. package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
  394. package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
  395. package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
  396. package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
  397. package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
  398. package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
  399. package/src/api/notifications/services/NotificationSenderService.ts +38 -2
  400. package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
  401. package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
  402. package/src/api/oauth/controllers/OAuthController.ts +132 -12
  403. package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
  404. package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
  405. package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
  406. package/src/api/oauth/index.ts +1 -0
  407. package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
  408. package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
  409. package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
  410. package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
  411. package/src/api/oauth/services/OAuthClientService.ts +228 -15
  412. package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
  413. package/src/api/organizations/entities/organizations.ts +6 -6
  414. package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
  415. package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
  416. package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
  417. package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
  418. package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
  419. package/src/api/parameters/entities/parameters.ts +29 -16
  420. package/src/api/parameters/primitives/$parameter.ts +3 -3
  421. package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
  422. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
  423. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
  424. package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
  425. package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
  426. package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
  427. package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
  428. package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
  429. package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
  430. package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
  431. package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
  432. package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
  433. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
  434. package/src/api/parameters/services/ParameterProvider.ts +152 -65
  435. package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
  436. package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
  437. package/src/api/payments/controllers/PaymentController.ts +4 -4
  438. package/src/api/payments/entities/paymentIntents.ts +11 -11
  439. package/src/api/payments/entities/paymentMethods.ts +11 -11
  440. package/src/api/payments/entities/refunds.ts +9 -9
  441. package/src/api/payments/providers/PaymentProvider.ts +18 -0
  442. package/src/api/payments/schemas/intentSchemas.ts +25 -25
  443. package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
  444. package/src/api/payments/services/PaymentService.ts +60 -3
  445. package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
  446. package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
  447. package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
  448. package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
  449. package/src/api/subscriptions/entities/subscriptions.ts +22 -22
  450. package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
  451. package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
  452. package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
  453. package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
  454. package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
  455. package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
  456. package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
  457. package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
  458. package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
  459. package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
  460. package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
  461. package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
  462. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
  463. package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
  464. package/src/api/users/controllers/AdminIdentityController.ts +29 -19
  465. package/src/api/users/controllers/AdminSessionController.ts +37 -27
  466. package/src/api/users/controllers/AdminUserController.ts +75 -53
  467. package/src/api/users/controllers/MySessionController.ts +125 -0
  468. package/src/api/users/controllers/RealmController.ts +9 -9
  469. package/src/api/users/controllers/UserController.ts +55 -55
  470. package/src/api/users/entities/identities.ts +8 -8
  471. package/src/api/users/entities/sessions.ts +17 -17
  472. package/src/api/users/entities/users.ts +17 -17
  473. package/src/api/users/index.ts +3 -0
  474. package/src/api/users/notifications/UserNotifications.ts +76 -24
  475. package/src/api/users/primitives/$realm.ts +12 -0
  476. package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
  477. package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
  478. package/src/api/users/schemas/createUserSchema.ts +2 -2
  479. package/src/api/users/schemas/identityQuerySchema.ts +4 -4
  480. package/src/api/users/schemas/identityResourceSchema.ts +3 -2
  481. package/src/api/users/schemas/loginSchema.ts +4 -4
  482. package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
  483. package/src/api/users/schemas/realmConfigSchema.ts +10 -10
  484. package/src/api/users/schemas/registerQuerySchema.ts +6 -6
  485. package/src/api/users/schemas/registerRequestSchema.ts +21 -43
  486. package/src/api/users/schemas/registerResponseSchema.ts +2 -2
  487. package/src/api/users/schemas/registerSchema.ts +13 -31
  488. package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
  489. package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
  490. package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
  491. package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
  492. package/src/api/users/schemas/updateUserSchema.ts +3 -4
  493. package/src/api/users/schemas/userQuerySchema.ts +7 -7
  494. package/src/api/users/services/RegistrationService.ts +25 -11
  495. package/src/api/users/services/UserService.ts +12 -6
  496. package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
  497. package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
  498. package/src/api/verifications/controllers/VerificationController.ts +13 -27
  499. package/src/api/verifications/entities/verifications.ts +13 -14
  500. package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
  501. package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
  502. package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
  503. package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
  504. package/src/api/verifications/services/VerificationService.ts +12 -0
  505. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
  506. package/src/batch/__tests__/$batch.spec.ts +22 -22
  507. package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
  508. package/src/bin/index.ts +1 -1
  509. package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
  510. package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
  511. package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
  512. package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
  513. package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
  514. package/src/cache/core/primitives/$cache.ts +7 -10
  515. package/src/cache/database/entities/cacheEntries.ts +16 -27
  516. package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
  517. package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
  518. package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
  519. package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
  520. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
  521. package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
  522. package/src/cli/core/atoms/appEntryOptions.ts +5 -5
  523. package/src/cli/core/atoms/buildOptions.ts +76 -88
  524. package/src/cli/core/atoms/changelogOptions.ts +3 -3
  525. package/src/cli/core/atoms/devOptions.ts +3 -3
  526. package/src/cli/core/commands/build.ts +36 -49
  527. package/src/cli/core/commands/db.ts +171 -83
  528. package/src/cli/core/commands/dev.ts +8 -8
  529. package/src/cli/core/commands/gen/changelog.ts +12 -14
  530. package/src/cli/core/commands/gen/env.ts +6 -6
  531. package/src/cli/core/commands/gen/openapi.ts +6 -6
  532. package/src/cli/core/commands/init.ts +28 -33
  533. package/src/cli/core/commands/pack.ts +10 -10
  534. package/src/cli/core/commands/root.ts +7 -8
  535. package/src/cli/core/commands/test.ts +17 -20
  536. package/src/cli/core/index.ts +0 -3
  537. package/src/cli/core/tasks/BuildCloudflareTask.ts +138 -245
  538. package/src/cli/core/tasks/BuildPrerenderTask.ts +44 -7
  539. package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
  540. package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
  541. package/src/cli/i18n/__tests__/I18nCheckService.spec.ts +48 -0
  542. package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
  543. package/src/cli/i18n/services/I18nCheckService.ts +65 -11
  544. package/src/cli/platform/commands/SecretsCommand.ts +24 -25
  545. package/src/cli/platform/commands/platform.ts +40 -46
  546. package/src/cli/platform/index.ts +1 -1
  547. package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
  548. package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
  549. package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
  550. package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +141 -50
  551. package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
  552. package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
  553. package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
  554. package/src/cli/platform-lib/schemas/platform.ts +51 -51
  555. package/src/cli/platform-lib/schemas/vercel.ts +28 -28
  556. package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
  557. package/src/cli/platform-lib/services/VercelApi.ts +4 -4
  558. package/src/cli/platform-lib/services/VercelCli.ts +6 -15
  559. package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
  560. package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
  561. package/src/cli/vendor/commands/VendorCommand.ts +11 -12
  562. package/src/command/__tests__/$command.spec.ts +82 -83
  563. package/src/command/__tests__/Asker.spec.ts +6 -13
  564. package/src/command/__tests__/CliProvider.spec.ts +136 -149
  565. package/src/command/__tests__/Runner.spec.ts +86 -110
  566. package/src/command/helpers/Asker.ts +23 -58
  567. package/src/command/helpers/Runner.ts +34 -110
  568. package/src/command/index.ts +4 -9
  569. package/src/command/primitives/$command.ts +10 -10
  570. package/src/command/providers/CliProvider.ts +183 -161
  571. package/src/core/Alepha.ts +62 -13
  572. package/src/core/__tests__/$atom.spec.ts +52 -3
  573. package/src/core/__tests__/$computed.spec.ts +129 -0
  574. package/src/core/__tests__/$env.spec.ts +13 -13
  575. package/src/core/__tests__/$inject.spec.ts +4 -4
  576. package/src/core/__tests__/$module.spec.ts +1 -1
  577. package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
  578. package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
  579. package/src/core/__tests__/Alepha-start.spec.ts +3 -3
  580. package/src/core/__tests__/CodecManager.spec.ts +113 -94
  581. package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
  582. package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
  583. package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
  584. package/src/core/__tests__/StateManager.spec.ts +423 -0
  585. package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
  586. package/src/core/__tests__/TypeProvider.spec.ts +314 -309
  587. package/src/core/__tests__/dump.spec.ts +6 -6
  588. package/src/core/__tests__/pagination.spec.ts +4 -4
  589. package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
  590. package/src/core/errors/TypeBoxError.ts +10 -4
  591. package/src/core/helpers/FileLike.ts +5 -5
  592. package/src/core/helpers/coerceStrings.ts +70 -0
  593. package/src/core/helpers/jsonSchemaToZod.ts +112 -0
  594. package/src/core/index.shared.ts +4 -1
  595. package/src/core/primitives/$atom.ts +95 -27
  596. package/src/core/primitives/$computed.ts +148 -0
  597. package/src/core/primitives/$env.ts +5 -5
  598. package/src/core/primitives/$state.ts +1 -1
  599. package/src/core/providers/AlsProvider.ts +26 -0
  600. package/src/core/providers/CodecManager.ts +1 -2
  601. package/src/core/providers/JsonSchemaCodec.ts +1 -2
  602. package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
  603. package/src/core/providers/SchemaValidator.ts +48 -158
  604. package/src/core/providers/StateManager.ts +383 -9
  605. package/src/core/providers/TypeProvider.ts +80 -734
  606. package/src/core/providers/ZodProvider.ts +380 -0
  607. package/src/core/providers/zodAugment.ts +69 -0
  608. package/src/core/schemas/pageQuerySchema.ts +19 -21
  609. package/src/core/schemas/pageSchema.ts +47 -57
  610. package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
  611. package/src/crypto/providers/SecretProvider.ts +16 -10
  612. package/src/datetime/primitives/$throttle.ts +6 -1
  613. package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
  614. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
  615. package/src/email/core/index.ts +7 -2
  616. package/src/email/core/primitives/$email.ts +5 -1
  617. package/src/email/core/providers/LocalEmailProvider.ts +5 -5
  618. package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
  619. package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
  620. package/src/fake/__tests__/keyName.example.ts +21 -21
  621. package/src/fake/__tests__/keyName.spec.ts +41 -41
  622. package/src/fake/__tests__/module.example.ts +8 -8
  623. package/src/fake/providers/FakeProvider.ts +122 -121
  624. package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
  625. package/src/lock/core/index.ts +1 -0
  626. package/src/lock/core/primitives/$lock.ts +13 -6
  627. package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
  628. package/src/logger/__tests__/Logger.spec.ts +49 -0
  629. package/src/logger/index.ts +25 -18
  630. package/src/logger/providers/CliFormatterProvider.ts +75 -0
  631. package/src/logger/schemas/logEntrySchema.ts +10 -10
  632. package/src/logger/services/Logger.ts +18 -0
  633. package/src/mcp/__tests__/$prompt.spec.ts +21 -23
  634. package/src/mcp/__tests__/$tool.spec.ts +22 -22
  635. package/src/mcp/__tests__/McpServerProvider.spec.ts +82 -11
  636. package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
  637. package/src/mcp/__tests__/integration.spec.ts +33 -33
  638. package/src/mcp/primitives/$prompt.ts +11 -9
  639. package/src/mcp/primitives/$tool.ts +27 -86
  640. package/src/mcp/providers/McpServerProvider.ts +55 -0
  641. package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
  642. package/src/orm/__tests__/$repository-tests.ts +133 -27
  643. package/src/orm/__tests__/$repository.spec.ts +23 -0
  644. package/src/orm/__tests__/$transactional-tests.ts +4 -4
  645. package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
  646. package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
  647. package/src/orm/__tests__/QueryManager.spec.ts +5 -5
  648. package/src/orm/__tests__/delete-returning-tests.ts +11 -11
  649. package/src/orm/__tests__/deletedAt-tests.ts +3 -3
  650. package/src/orm/__tests__/enums.spec.ts +29 -25
  651. package/src/orm/__tests__/execute-tests.ts +8 -8
  652. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
  653. package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
  654. package/src/orm/__tests__/joins-tests.ts +30 -30
  655. package/src/orm/__tests__/organization-tests.ts +105 -3
  656. package/src/orm/__tests__/organization.spec.ts +46 -0
  657. package/src/orm/__tests__/orm-errors.spec.ts +10 -10
  658. package/src/orm/__tests__/orm-next-tests.ts +29 -29
  659. package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
  660. package/src/orm/__tests__/primaryKey.spec.ts +4 -4
  661. package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
  662. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
  663. package/src/orm/__tests__/references.spec.ts +7 -7
  664. package/src/orm/__tests__/security.spec.ts +17 -17
  665. package/src/orm/__tests__/string-operators-tests.ts +5 -5
  666. package/src/orm/__tests__/timestamps-tests.ts +14 -14
  667. package/src/orm/__tests__/validation-tests.ts +5 -5
  668. package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
  669. package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
  670. package/src/orm/core/entities/alephaSequences.ts +8 -8
  671. package/src/orm/core/helpers/pgAttr.ts +4 -4
  672. package/src/orm/core/primitives/$entity.ts +10 -6
  673. package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
  674. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
  675. package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
  676. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
  677. package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
  678. package/src/orm/core/schemas/insertSchema.ts +14 -18
  679. package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
  680. package/src/orm/core/schemas/updateSchema.ts +10 -16
  681. package/src/orm/core/services/PgRelationManager.ts +2 -2
  682. package/src/orm/core/services/QueryManager.ts +13 -2
  683. package/src/orm/core/services/Repository.ts +88 -33
  684. package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
  685. package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
  686. package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
  687. package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
  688. package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
  689. package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
  690. package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
  691. package/src/queue/core/__tests__/shared.ts +6 -6
  692. package/src/queue/core/primitives/$consumer.ts +5 -5
  693. package/src/queue/core/primitives/$queue.ts +44 -61
  694. package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
  695. package/src/queue/core/providers/WorkerProvider.ts +17 -14
  696. package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
  697. package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
  698. package/src/react/core/__tests__/Router.spec.tsx +4 -4
  699. package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
  700. package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
  701. package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
  702. package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
  703. package/src/react/core/components/ErrorBoundary.tsx +42 -0
  704. package/src/react/core/hooks/useAction.ts +56 -19
  705. package/src/react/core/hooks/useComputed.ts +91 -0
  706. package/src/react/core/hooks/useSelector.ts +67 -0
  707. package/src/react/core/hooks/useStore.ts +36 -17
  708. package/src/react/core/index.ts +3 -0
  709. package/src/react/core/utils/shallowEqual.ts +36 -0
  710. package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +71 -0
  711. package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +96 -0
  712. package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
  713. package/src/react/form/errors/FormValidationError.ts +0 -2
  714. package/src/react/form/hooks/useForm.ts +19 -4
  715. package/src/react/form/hooks/useFormQuerySync.ts +0 -0
  716. package/src/react/form/services/FormModel.ts +124 -86
  717. package/src/react/form/services/parseField.ts +66 -27
  718. package/src/react/i18n/__tests__/I18nProvider.spec.ts +89 -0
  719. package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
  720. package/src/react/i18n/__tests__/locale-routing.spec.ts +107 -0
  721. package/src/react/i18n/providers/I18nProvider.ts +173 -14
  722. package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
  723. package/src/react/router/__tests__/$page.spec.tsx +21 -21
  724. package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
  725. package/src/react/router/__tests__/RouterLocaleProvider.spec.ts +127 -0
  726. package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
  727. package/src/react/router/components/NestedView.tsx +11 -3
  728. package/src/react/router/hooks/useQueryParams.ts +1 -1
  729. package/src/react/router/index.browser.ts +4 -0
  730. package/src/react/router/index.shared.ts +1 -0
  731. package/src/react/router/index.ts +9 -0
  732. package/src/react/router/primitives/$page.ts +2 -2
  733. package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
  734. package/src/react/router/providers/ReactBrowserRouterProvider.ts +15 -1
  735. package/src/react/router/providers/ReactPageProvider.ts +38 -13
  736. package/src/react/router/providers/ReactServerProvider.ts +105 -16
  737. package/src/react/router/providers/RootComponentsProvider.ts +13 -0
  738. package/src/react/router/providers/RouterLocaleProvider.ts +125 -0
  739. package/src/react/router/providers/__tests__/RootComponentsProvider.spec.ts +15 -0
  740. package/src/react/router/providers/__tests__/rootComponents.ssr.browser.spec.tsx +67 -0
  741. package/src/react/sitemap/__tests__/$sitemap.spec.ts +131 -0
  742. package/src/react/sitemap/index.browser.ts +21 -0
  743. package/src/react/sitemap/index.ts +25 -0
  744. package/src/react/sitemap/primitives/$sitemap.browser.ts +26 -0
  745. package/src/react/sitemap/primitives/$sitemap.ts +196 -0
  746. package/src/react/ui/atoms/uiAtom.ts +6 -6
  747. package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
  748. package/src/react/ui/hooks/useColorMode.ts +11 -4
  749. package/src/react/ui/services/SchemaControl.ts +4 -4
  750. package/src/redis/providers/BunRedisProvider.ts +19 -11
  751. package/src/redis/providers/NodeRedisProvider.ts +3 -3
  752. package/src/scheduler/primitives/$scheduler.ts +21 -8
  753. package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
  754. package/src/security/atoms/currentTenantAtom.ts +6 -6
  755. package/src/security/atoms/currentUserAtom.ts +2 -2
  756. package/src/security/primitives/$issuer.ts +24 -2
  757. package/src/security/providers/JwtProvider.ts +100 -0
  758. package/src/security/providers/SecurityProvider.ts +43 -2
  759. package/src/security/schemas/permissionSchema.ts +19 -19
  760. package/src/security/schemas/roleSchema.ts +22 -28
  761. package/src/security/schemas/userAccountInfoSchema.ts +47 -37
  762. package/src/server/auth/__tests__/appleClientSecret.spec.ts +34 -0
  763. package/src/server/auth/__tests__/federationRedirectReplay.spec.ts +44 -0
  764. package/src/server/auth/helpers/appleClientSecret.ts +24 -0
  765. package/src/server/auth/helpers/jtiReplayGuard.ts +41 -0
  766. package/src/server/auth/helpers/safeRedirectPath.ts +19 -0
  767. package/src/server/auth/index.ts +1 -0
  768. package/src/server/auth/primitives/$auth.ts +6 -6
  769. package/src/server/auth/primitives/$authApple.ts +10 -10
  770. package/src/server/auth/primitives/$authFacebook.ts +10 -10
  771. package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
  772. package/src/server/auth/primitives/$authGithub.ts +10 -10
  773. package/src/server/auth/primitives/$authGoogle.ts +10 -10
  774. package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
  775. package/src/server/auth/providers/ServerAuthProvider.ts +67 -52
  776. package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
  777. package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
  778. package/src/server/auth/schemas/tokensSchema.ts +16 -16
  779. package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
  780. package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
  781. package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
  782. package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
  783. package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +82 -12
  784. package/src/server/cookies/index.browser.ts +4 -1
  785. package/src/server/cookies/index.ts +8 -1
  786. package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
  787. package/src/server/cookies/primitives/$cookie.ts +16 -0
  788. package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
  789. package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
  790. package/src/server/cookies/providers/ServerCookiesProvider.ts +32 -4
  791. package/src/server/cookies/services/CookieParser.ts +6 -1
  792. package/src/server/core/__tests__/$action.spec.ts +13 -13
  793. package/src/server/core/__tests__/$middleware.spec.ts +10 -10
  794. package/src/server/core/__tests__/$route.spec.ts +9 -9
  795. package/src/server/core/__tests__/$sse.spec.ts +26 -26
  796. package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
  797. package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
  798. package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
  799. package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
  800. package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
  801. package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
  802. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
  803. package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
  804. package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
  805. package/src/server/core/errors/ValidationError.ts +6 -3
  806. package/src/server/core/helpers/isMultipart.ts +2 -1
  807. package/src/server/core/index.ts +5 -2
  808. package/src/server/core/interfaces/ServerRequest.ts +14 -14
  809. package/src/server/core/primitives/$action.ts +26 -36
  810. package/src/server/core/primitives/$route.ts +27 -0
  811. package/src/server/core/primitives/$sse.ts +3 -3
  812. package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
  813. package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
  814. package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
  815. package/src/server/core/providers/ServerCompressProvider.ts +9 -10
  816. package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
  817. package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
  818. package/src/server/core/providers/ServerRouterProvider.ts +44 -15
  819. package/src/server/core/schemas/errorSchema.ts +20 -25
  820. package/src/server/core/schemas/okSchema.ts +9 -14
  821. package/src/server/core/services/HttpClient.ts +13 -1
  822. package/src/server/core/services/ServerRequestParser.ts +6 -6
  823. package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
  824. package/src/server/health/schemas/healthSchema.ts +6 -6
  825. package/src/server/links/__tests__/$remote.spec.ts +3 -3
  826. package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
  827. package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
  828. package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
  829. package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
  830. package/src/server/links/atoms/apiLinksAtom.ts +2 -2
  831. package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
  832. package/src/server/links/primitives/$remote.ts +3 -3
  833. package/src/server/links/providers/LinkProvider.ts +3 -3
  834. package/src/server/links/providers/ServerLinksProvider.ts +20 -20
  835. package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
  836. package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
  837. package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
  838. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
  839. package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
  840. package/src/server/swagger/__tests__/ui.spec.ts +3 -3
  841. package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
  842. package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
  843. package/src/system/providers/NodeShellProvider.ts +4 -1
  844. package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
  845. package/src/topic/core/__tests__/shared.ts +8 -8
  846. package/src/topic/core/primitives/$subscriber.ts +5 -5
  847. package/src/topic/core/primitives/$topic.ts +14 -14
  848. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  849. package/dist/container/core/index.d.ts +0 -236
  850. package/dist/container/core/index.d.ts.map +0 -1
  851. package/dist/container/core/index.js +0 -231
  852. package/dist/container/core/index.js.map +0 -1
  853. package/dist/container/core/index.workerd.js +0 -192
  854. package/dist/container/core/index.workerd.js.map +0 -1
  855. package/src/cli/core/tasks/BuildSitemapTask.ts +0 -130
  856. package/src/command/helpers/PrettyAsker.ts +0 -256
  857. package/src/command/helpers/PrettyPrint.ts +0 -332
  858. package/src/container/core/__tests__/$container.spec.ts +0 -83
  859. package/src/container/core/index.ts +0 -50
  860. package/src/container/core/index.workerd.ts +0 -53
  861. package/src/container/core/interfaces/ContainerOptions.ts +0 -69
  862. package/src/container/core/primitives/$container.ts +0 -100
  863. package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
  864. package/src/container/core/providers/ContainerProvider.ts +0 -92
  865. package/src/container/core/providers/MockContainerProvider.ts +0 -62
  866. package/src/container/core/providers/NodeContainerProvider.ts +0 -53
  867. package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
  868. package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
  869. /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
@@ -1,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
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",
@@ -493,6 +470,7 @@ var AdminIdentityController = class {
493
470
  url = "/identities";
494
471
  group = "admin:identities";
495
472
  identityService = $inject(IdentityService);
473
+ securityProvider = $inject(SecurityProvider);
496
474
  /**
497
475
  * Find identities with pagination and filtering.
498
476
  */
@@ -502,12 +480,12 @@ var AdminIdentityController = class {
502
480
  use: [$secure({ permissions: ["admin:identity:read"] })],
503
481
  description: "Find identities with pagination and filtering",
504
482
  schema: {
505
- query: t.extend(identityQuerySchema, { userRealmName: t.optional(t.string()) }),
506
- response: t.page(identityResourceSchema)
483
+ query: identityQuerySchema.extend({ userRealmName: z.string().optional() }),
484
+ response: z.page(identityResourceSchema)
507
485
  },
508
- handler: ({ query }) => {
486
+ handler: ({ query, user }) => {
509
487
  const { userRealmName, ...q } = query;
510
- return this.identityService.findIdentities(q, userRealmName);
488
+ return this.identityService.findIdentities(q, this.securityProvider.assertRealmScope(user, userRealmName));
511
489
  }
512
490
  });
513
491
  /**
@@ -519,11 +497,11 @@ var AdminIdentityController = class {
519
497
  use: [$secure({ permissions: ["admin:identity:read"] })],
520
498
  description: "Get an identity by ID",
521
499
  schema: {
522
- params: t.object({ id: t.uuid() }),
523
- query: t.object({ userRealmName: t.optional(t.string()) }),
500
+ params: z.object({ id: z.uuid() }),
501
+ query: z.object({ userRealmName: z.string().optional() }),
524
502
  response: identityResourceSchema
525
503
  },
526
- 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))
527
505
  });
528
506
  /**
529
507
  * Delete an identity.
@@ -535,12 +513,12 @@ var AdminIdentityController = class {
535
513
  use: [$secure({ permissions: ["admin:identity:delete"] })],
536
514
  description: "Delete an identity",
537
515
  schema: {
538
- params: t.object({ id: t.uuid() }),
539
- query: t.object({ userRealmName: t.optional(t.string()) }),
516
+ params: z.object({ id: z.uuid() }),
517
+ query: z.object({ userRealmName: z.string().optional() }),
540
518
  response: okSchema
541
519
  },
542
- handler: async ({ params, query }) => {
543
- 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));
544
522
  return {
545
523
  ok: true,
546
524
  id: params.id
@@ -550,7 +528,7 @@ var AdminIdentityController = class {
550
528
  };
551
529
  //#endregion
552
530
  //#region ../../src/api/users/schemas/sessionQuerySchema.ts
553
- const sessionQuerySchema = t.extend(pageQuerySchema, { userId: t.optional(t.uuid()) });
531
+ const sessionQuerySchema = pageQuerySchema.extend({ userId: z.uuid().optional() });
554
532
  //#endregion
555
533
  //#region ../../src/api/users/schemas/sessionResourceSchema.ts
556
534
  /**
@@ -559,36 +537,36 @@ const sessionQuerySchema = t.extend(pageQuerySchema, { userId: t.optional(t.uuid
559
537
  * back via a left join, so it's optional (a session whose user was deleted
560
538
  * still returns; `user` is undefined).
561
539
  */
562
- const sessionUserSummarySchema = t.object({
563
- id: t.uuid(),
564
- email: t.optional(t.string({ format: "email" })),
565
- 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({
566
544
  minLength: 3,
567
545
  maxLength: 30
568
- })),
569
- firstName: t.optional(t.string()),
570
- lastName: t.optional(t.string())
546
+ }).optional(),
547
+ firstName: z.string().optional(),
548
+ lastName: z.string().optional()
571
549
  });
572
- const sessionResourceSchema = t.object({
573
- id: t.uuid(),
574
- version: t.number(),
575
- createdAt: t.datetime(),
576
- updatedAt: t.datetime(),
577
- refreshToken: t.uuid(),
578
- userId: t.uuid(),
579
- expiresAt: t.datetime(),
580
- ip: t.optional(t.string()),
581
- country: t.optional(t.string()),
582
- userAgent: t.optional(t.object({
583
- os: t.string(),
584
- browser: t.string(),
585
- 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([
586
564
  "MOBILE",
587
565
  "DESKTOP",
588
566
  "TABLET"
589
567
  ])
590
- })),
591
- user: t.optional(sessionUserSummarySchema)
568
+ }).optional(),
569
+ user: sessionUserSummarySchema.optional()
592
570
  });
593
571
  //#endregion
594
572
  //#region ../../src/api/users/services/SessionCrudService.ts
@@ -679,6 +657,7 @@ var AdminSessionController = class {
679
657
  url = "/sessions";
680
658
  group = "admin:sessions";
681
659
  sessionService = $inject(SessionCrudService);
660
+ securityProvider = $inject(SecurityProvider);
682
661
  /**
683
662
  * Find sessions with pagination and filtering.
684
663
  */
@@ -688,12 +667,12 @@ var AdminSessionController = class {
688
667
  use: [$secure({ permissions: ["admin:session:read"] })],
689
668
  description: "Find sessions with pagination and filtering",
690
669
  schema: {
691
- query: t.extend(sessionQuerySchema, { userRealmName: t.optional(t.string()) }),
692
- response: t.page(sessionResourceSchema)
670
+ query: sessionQuerySchema.extend({ userRealmName: z.string().optional() }),
671
+ response: z.page(sessionResourceSchema)
693
672
  },
694
- handler: ({ query }) => {
673
+ handler: ({ query, user }) => {
695
674
  const { userRealmName, ...q } = query;
696
- return this.sessionService.findSessions(q, userRealmName);
675
+ return this.sessionService.findSessions(q, this.securityProvider.assertRealmScope(user, userRealmName));
697
676
  }
698
677
  });
699
678
  /**
@@ -705,11 +684,11 @@ var AdminSessionController = class {
705
684
  use: [$secure({ permissions: ["admin:session:read"] })],
706
685
  description: "Get a session by ID",
707
686
  schema: {
708
- params: t.object({ id: t.uuid() }),
709
- query: t.object({ userRealmName: t.optional(t.string()) }),
687
+ params: z.object({ id: z.uuid() }),
688
+ query: z.object({ userRealmName: z.string().optional() }),
710
689
  response: sessionResourceSchema
711
690
  },
712
- 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))
713
692
  });
714
693
  /**
715
694
  * Delete a session.
@@ -721,12 +700,12 @@ var AdminSessionController = class {
721
700
  use: [$secure({ permissions: ["admin:session:delete"] })],
722
701
  description: "Delete a session",
723
702
  schema: {
724
- params: t.object({ id: t.uuid() }),
725
- query: t.object({ userRealmName: t.optional(t.string()) }),
703
+ params: z.object({ id: z.uuid() }),
704
+ query: z.object({ userRealmName: z.string().optional() }),
726
705
  response: okSchema
727
706
  },
728
- handler: async ({ params, query }) => {
729
- 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));
730
709
  return {
731
710
  ok: true,
732
711
  id: params.id
@@ -743,43 +722,40 @@ var AdminSessionController = class {
743
722
  use: [$secure({ permissions: ["admin:session:delete"] })],
744
723
  description: "Delete many sessions",
745
724
  schema: {
746
- query: t.object({ userRealmName: t.optional(t.string()) }),
747
- body: t.object({ ids: t.array(t.uuid(), {
748
- minItems: 1,
749
- maxItems: 1e3
750
- }) }),
751
- 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()) })
752
728
  },
753
- handler: async ({ body, query }) => {
754
- 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)) };
755
731
  }
756
732
  });
757
733
  };
758
734
  //#endregion
759
735
  //#region ../../src/api/users/schemas/createUserSchema.ts
760
- const createUserSchema = t.omit(users.insertSchema, ["realm"]);
736
+ const createUserSchema = users.insertSchema.omit({ realm: true });
761
737
  //#endregion
762
738
  //#region ../../src/api/users/schemas/updateUserSchema.ts
763
- const updateUserSchema = t.partial(t.omit(users.insertSchema, [
764
- "id",
765
- "version",
766
- "createdAt",
767
- "updatedAt"
768
- ]));
739
+ const updateUserSchema = users.insertSchema.omit({
740
+ id: true,
741
+ version: true,
742
+ createdAt: true,
743
+ updatedAt: true
744
+ }).partial();
769
745
  //#endregion
770
746
  //#region ../../src/api/users/schemas/userQuerySchema.ts
771
- const userQuerySchema = t.extend(pageQuerySchema, {
747
+ const userQuerySchema = pageQuerySchema.extend({
772
748
  /**
773
749
  * Free-text search applied (case-insensitive) across `email`,
774
750
  * `username`, `firstName`, and `lastName`. Matches with a leading and
775
751
  * trailing wildcard, so `?search=foo` finds any user whose email,
776
752
  * username, or name contains `foo`.
777
753
  */
778
- search: t.optional(t.string()),
779
- email: t.optional(t.string()),
780
- enabled: t.optional(t.boolean()),
781
- emailVerified: t.optional(t.boolean()),
782
- 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()
783
759
  });
784
760
  //#endregion
785
761
  //#region ../../src/api/users/schemas/userResourceSchema.ts
@@ -808,10 +784,25 @@ var UserNotifications = class {
808
784
  <p>Best regards,<br>The Team</p>
809
785
  `
810
786
  },
811
- schema: t.object({
812
- email: t.string({ format: "email" }),
813
- code: t.string(),
814
- 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()
815
806
  })
816
807
  });
817
808
  emailVerification = $notification({
@@ -835,10 +826,25 @@ var UserNotifications = class {
835
826
  <p>Best regards,<br>The Team</p>
836
827
  `
837
828
  },
838
- schema: t.object({
839
- email: t.string({ format: "email" }),
840
- code: t.string(),
841
- 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()
842
848
  })
843
849
  });
844
850
  phoneVerification = $notification({
@@ -847,10 +853,10 @@ var UserNotifications = class {
847
853
  critical: true,
848
854
  sensitive: true,
849
855
  sms: { message: (it) => `Your verification code is: ${it.code}. This code expires in ${it.expiresInMinutes} minutes.` },
850
- schema: t.object({
851
- phoneNumber: t.string(),
852
- code: t.string(),
853
- expiresInMinutes: t.number()
856
+ schema: z.object({
857
+ phoneNumber: z.string(),
858
+ code: z.string(),
859
+ expiresInMinutes: z.number()
854
860
  })
855
861
  });
856
862
  passwordResetLink = $notification({
@@ -876,10 +882,10 @@ var UserNotifications = class {
876
882
  <p>Best regards,<br>The Team</p>
877
883
  `
878
884
  },
879
- schema: t.object({
880
- email: t.string({ format: "email" }),
881
- resetUrl: t.string(),
882
- expiresInMinutes: t.number()
885
+ schema: z.object({
886
+ email: z.string().meta({ format: "email" }),
887
+ resetUrl: z.string(),
888
+ expiresInMinutes: z.number()
883
889
  })
884
890
  });
885
891
  accountLockout = $notification({
@@ -898,9 +904,19 @@ var UserNotifications = class {
898
904
  <p>Best regards,<br>The Team</p>
899
905
  `
900
906
  },
901
- schema: t.object({
902
- email: t.string({ format: "email" }),
903
- 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()
904
920
  })
905
921
  });
906
922
  emailVerificationLink = $notification({
@@ -926,10 +942,10 @@ var UserNotifications = class {
926
942
  <p>Best regards,<br>The Team</p>
927
943
  `
928
944
  },
929
- schema: t.object({
930
- email: t.string({ format: "email" }),
931
- verifyUrl: t.string(),
932
- expiresInMinutes: t.number()
945
+ schema: z.object({
946
+ email: z.string().meta({ format: "email" }),
947
+ verifyUrl: z.string(),
948
+ expiresInMinutes: z.number()
933
949
  })
934
950
  });
935
951
  };
@@ -939,6 +955,7 @@ var UserService = class {
939
955
  alepha = $inject(Alepha);
940
956
  log = $logger();
941
957
  verificationController = $client();
958
+ verificationService = $inject(VerificationService);
942
959
  realmProvider = $inject(RealmProvider);
943
960
  cryptoProvider = $inject(CryptoProvider);
944
961
  userAudits(realmName) {
@@ -976,9 +993,9 @@ var UserService = class {
976
993
  return true;
977
994
  }
978
995
  try {
979
- const verification = await this.verificationController.requestVerificationCode({
980
- params: { type: method },
981
- body: { target: email }
996
+ const verification = await this.verificationService.createVerification({
997
+ type: method,
998
+ target: email
982
999
  });
983
1000
  if (method === "link") {
984
1001
  const realmSettings = await this.realmProvider.getRealm(userRealmName).getSettings();
@@ -1306,15 +1323,15 @@ var AdminUserController = class {
1306
1323
  use: [$secure({ permissions: ["admin:user:read"] })],
1307
1324
  description: "List roles available in a realm",
1308
1325
  schema: {
1309
- query: t.object({ userRealmName: t.optional(t.string()) }),
1310
- response: t.array(t.object({
1311
- name: t.string(),
1312
- default: t.optional(t.boolean()),
1313
- 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()
1314
1331
  }))
1315
1332
  },
1316
- handler: ({ query }) => {
1317
- 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) => ({
1318
1335
  name: r.name,
1319
1336
  default: r.default,
1320
1337
  description: r.description
@@ -1330,12 +1347,12 @@ var AdminUserController = class {
1330
1347
  use: [$secure({ permissions: ["admin:user:read"] })],
1331
1348
  description: "Find users with pagination and filtering",
1332
1349
  schema: {
1333
- query: t.extend(userQuerySchema, { userRealmName: t.optional(t.string()) }),
1334
- response: t.page(userResourceSchema)
1350
+ query: userQuerySchema.extend({ userRealmName: z.string().optional() }),
1351
+ response: z.page(userResourceSchema)
1335
1352
  },
1336
- handler: ({ query }) => {
1353
+ handler: ({ query, user }) => {
1337
1354
  const { userRealmName, ...q } = query;
1338
- return this.userService.findUsers(q, userRealmName);
1355
+ return this.userService.findUsers(q, this.securityProvider.assertRealmScope(user, userRealmName));
1339
1356
  }
1340
1357
  });
1341
1358
  /**
@@ -1347,11 +1364,11 @@ var AdminUserController = class {
1347
1364
  use: [$secure({ permissions: ["admin:user:read"] })],
1348
1365
  description: "Get a user by ID",
1349
1366
  schema: {
1350
- params: t.object({ id: t.uuid() }),
1351
- query: t.object({ userRealmName: t.optional(t.string()) }),
1367
+ params: z.object({ id: z.uuid() }),
1368
+ query: z.object({ userRealmName: z.string().optional() }),
1352
1369
  response: userResourceSchema
1353
1370
  },
1354
- 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))
1355
1372
  });
1356
1373
  /**
1357
1374
  * Create a new user.
@@ -1363,11 +1380,11 @@ var AdminUserController = class {
1363
1380
  use: [$secure({ permissions: ["admin:user:create"] })],
1364
1381
  description: "Create a new user",
1365
1382
  schema: {
1366
- query: t.object({ userRealmName: t.optional(t.string()) }),
1383
+ query: z.object({ userRealmName: z.string().optional() }),
1367
1384
  body: createUserSchema,
1368
1385
  response: userResourceSchema
1369
1386
  },
1370
- handler: ({ body, query }) => this.userService.createUser(body, query.userRealmName)
1387
+ handler: ({ body, query, user }) => this.userService.createUser(body, this.securityProvider.assertRealmScope(user, query.userRealmName))
1371
1388
  });
1372
1389
  /**
1373
1390
  * Update a user.
@@ -1379,12 +1396,12 @@ var AdminUserController = class {
1379
1396
  use: [$secure({ permissions: ["admin:user:update"] })],
1380
1397
  description: "Update a user",
1381
1398
  schema: {
1382
- params: t.object({ id: t.uuid() }),
1383
- query: t.object({ userRealmName: t.optional(t.string()) }),
1399
+ params: z.object({ id: z.uuid() }),
1400
+ query: z.object({ userRealmName: z.string().optional() }),
1384
1401
  body: updateUserSchema,
1385
1402
  response: userResourceSchema
1386
1403
  },
1387
- 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))
1388
1405
  });
1389
1406
  /**
1390
1407
  * Set (or reset) a user's password. Admin-only flow — does NOT
@@ -1398,13 +1415,13 @@ var AdminUserController = class {
1398
1415
  use: [$secure({ permissions: ["admin:user:update"] })],
1399
1416
  description: "Set a user's password",
1400
1417
  schema: {
1401
- params: t.object({ id: t.uuid() }),
1402
- query: t.object({ userRealmName: t.optional(t.string()) }),
1403
- 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) }),
1404
1421
  response: okSchema
1405
1422
  },
1406
- handler: async ({ params, body, query }) => {
1407
- 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));
1408
1425
  return {
1409
1426
  ok: true,
1410
1427
  id: params.id
@@ -1421,12 +1438,12 @@ var AdminUserController = class {
1421
1438
  use: [$secure({ permissions: ["admin:user:delete"] })],
1422
1439
  description: "Delete a user",
1423
1440
  schema: {
1424
- params: t.object({ id: t.uuid() }),
1425
- query: t.object({ userRealmName: t.optional(t.string()) }),
1441
+ params: z.object({ id: z.uuid() }),
1442
+ query: z.object({ userRealmName: z.string().optional() }),
1426
1443
  response: okSchema
1427
1444
  },
1428
- handler: async ({ params, query }) => {
1429
- 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));
1430
1447
  return {
1431
1448
  ok: true,
1432
1449
  id: params.id
@@ -1445,17 +1462,15 @@ var AdminUserController = class {
1445
1462
  use: [$secure({ permissions: ["admin:user:delete"] })],
1446
1463
  description: "Delete many users",
1447
1464
  schema: {
1448
- query: t.object({ userRealmName: t.optional(t.string()) }),
1449
- body: t.object({ ids: t.array(t.uuid(), {
1450
- minItems: 1,
1451
- maxItems: 1e3
1452
- }) }),
1453
- 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()) })
1454
1468
  },
1455
- handler: async ({ body, query }) => {
1469
+ handler: async ({ body, query, user }) => {
1470
+ const realm = this.securityProvider.assertRealmScope(user, query.userRealmName);
1456
1471
  const deleted = [];
1457
1472
  for (const id of body.ids) {
1458
- await this.userService.deleteUser(id, query.userRealmName);
1473
+ await this.userService.deleteUser(id, realm);
1459
1474
  deleted.push(id);
1460
1475
  }
1461
1476
  return { deleted };
@@ -1463,12 +1478,110 @@ var AdminUserController = class {
1463
1478
  });
1464
1479
  };
1465
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
1466
1579
  //#region ../../src/api/users/schemas/realmConfigSchema.ts
1467
- const realmConfigSchema = t.object({
1580
+ const realmConfigSchema = z.object({
1468
1581
  settings: realmAuthSettingsAtom.schema,
1469
- realmName: t.string(),
1470
- authenticationMethods: t.array(authenticationProviderSchema),
1471
- captchaSiteKey: t.optional(t.string({ description: "Public site key for the captcha widget (when settings.captchaRequired is true)" }))
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()
1472
1585
  });
1473
1586
  //#endregion
1474
1587
  //#region ../../src/api/users/controllers/RealmController.ts
@@ -1492,7 +1605,7 @@ var RealmController = class {
1492
1605
  path: `${this.url}/config`,
1493
1606
  use: [$etag()],
1494
1607
  schema: {
1495
- query: t.object({ realmName: t.optional(t.string()) }),
1608
+ query: z.object({ realmName: z.string().optional() }),
1496
1609
  response: realmConfigSchema
1497
1610
  },
1498
1611
  handler: async ({ query }) => {
@@ -1511,9 +1624,9 @@ var RealmController = class {
1511
1624
  group: this.group,
1512
1625
  path: `${this.url}/check-username`,
1513
1626
  schema: {
1514
- query: t.object({ realmName: t.optional(t.text()) }),
1515
- body: t.object({ username: t.text() }),
1516
- 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() })
1517
1630
  },
1518
1631
  handler: async ({ query, body }) => {
1519
1632
  const realmName = query.realmName;
@@ -1529,21 +1642,18 @@ var RealmController = class {
1529
1642
  * Requires the intent ID from Phase 1, the verification code,
1530
1643
  * and the new password.
1531
1644
  */
1532
- const completePasswordResetRequestSchema = t.object({
1533
- intentId: t.uuid({ description: "The intent ID from createPasswordResetIntent" }),
1534
- code: t.string({ description: "6-digit verification code sent via email" }),
1535
- newPassword: t.string({
1536
- minLength: 8,
1537
- description: "New password (minimum 8 characters)"
1538
- })
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)")
1539
1649
  });
1540
1650
  //#endregion
1541
1651
  //#region ../../src/api/users/schemas/completeRegistrationRequestSchema.ts
1542
- const completeRegistrationRequestSchema = t.object({
1543
- intentId: t.uuid({ description: "The registration intent ID from the first phase" }),
1544
- emailCode: t.optional(t.string({ description: "Email verification code (if email verification required)" })),
1545
- phoneCode: t.optional(t.string({ description: "Phone verification code (if phone verification required)" })),
1546
- 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()
1547
1657
  });
1548
1658
  //#endregion
1549
1659
  //#region ../../src/api/users/schemas/passwordResetIntentResponseSchema.ts
@@ -1553,9 +1663,9 @@ const completeRegistrationRequestSchema = t.object({
1553
1663
  * Contains the intent ID needed for Phase 2 completion,
1554
1664
  * along with expiration time.
1555
1665
  */
1556
- const passwordResetIntentResponseSchema = t.object({
1557
- intentId: t.uuid({ description: "Unique identifier for this password reset intent" }),
1558
- 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")
1559
1669
  });
1560
1670
  //#endregion
1561
1671
  //#region ../../src/api/users/schemas/registerQuerySchema.ts
@@ -1563,41 +1673,32 @@ const passwordResetIntentResponseSchema = t.object({
1563
1673
  * Schema for user registration query parameters.
1564
1674
  * Allows specifying a custom user realm.
1565
1675
  */
1566
- 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() });
1567
1677
  //#endregion
1568
1678
  //#region ../../src/api/users/schemas/registerRequestSchema.ts
1569
1679
  /**
1570
1680
  * Schema for user registration request body.
1571
1681
  * Password is always required, other fields depend on realm settings.
1572
1682
  */
1573
- const registerRequestSchema = t.object({
1574
- password: t.string({
1575
- minLength: 8,
1576
- description: "Password for the account"
1577
- }),
1578
- username: t.optional(t.string({
1579
- minLength: 3,
1580
- description: "Unique username for the account"
1581
- })),
1582
- email: t.optional(t.string({
1583
- format: "email",
1584
- description: "User's email address"
1585
- })),
1586
- phoneNumber: t.optional(t.string({ description: "User's phone number" })),
1587
- firstName: t.optional(t.string({ description: "User's first name" })),
1588
- lastName: t.optional(t.string({ description: "User's last name" })),
1589
- picture: t.optional(t.string({ description: "User's profile picture URL" })),
1590
- 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()
1591
1692
  });
1592
1693
  //#endregion
1593
1694
  //#region ../../src/api/users/schemas/registrationIntentResponseSchema.ts
1594
- const registrationIntentResponseSchema = t.object({
1595
- intentId: t.uuid({ description: "Unique identifier for the registration intent" }),
1596
- expectCaptcha: t.boolean({ description: "Whether captcha verification is required" }),
1597
- captchaSiteKey: t.optional(t.string({ description: "Public site key the client should render (when expectCaptcha is true)" })),
1598
- expectEmailVerification: t.boolean({ description: "Whether email verification is required" }),
1599
- expectPhoneVerification: t.boolean({ description: "Whether phone verification is required" }),
1600
- 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")
1601
1702
  });
1602
1703
  //#endregion
1603
1704
  //#region ../../src/api/users/services/CredentialService.ts
@@ -1992,6 +2093,7 @@ var RegistrationService = class {
1992
2093
  dateTimeProvider = $inject(DateTimeProvider);
1993
2094
  cryptoProvider = $inject(CryptoProvider);
1994
2095
  verificationController = $client();
2096
+ verificationService = $inject(VerificationService);
1995
2097
  realmProvider = $inject(RealmProvider);
1996
2098
  credentialService = $inject(CredentialService);
1997
2099
  captchaProvider = $inject(CaptchaProvider);
@@ -2072,6 +2174,10 @@ var RegistrationService = class {
2072
2174
  this.log.debug("Registration rejected: phone required", { userRealmName });
2073
2175
  throw new BadRequestError("Phone number is required");
2074
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
+ }
2075
2181
  if (realmSettings?.username === "email") {
2076
2182
  if (!body.email) throw new BadRequestError("Email is required to derive a username from email");
2077
2183
  const base = this.usernameSlugger.slug(body.email);
@@ -2244,9 +2350,9 @@ var RegistrationService = class {
2244
2350
  */
2245
2351
  async sendEmailVerification(email, realmName) {
2246
2352
  this.log.debug("Sending email verification code", { email });
2247
- const verification = await this.verificationController.requestVerificationCode({
2248
- params: { type: "code" },
2249
- body: { target: email }
2353
+ const verification = await this.verificationService.createVerification({
2354
+ type: "code",
2355
+ target: email
2250
2356
  });
2251
2357
  await this.userNotifications(realmName).emailVerification.push({
2252
2358
  contact: email,
@@ -2264,9 +2370,9 @@ var RegistrationService = class {
2264
2370
  async sendPhoneVerification(phoneNumber, realmName) {
2265
2371
  this.log.debug("Sending phone verification code", { phoneNumber });
2266
2372
  try {
2267
- const verification = await this.verificationController.requestVerificationCode({
2268
- params: { type: "code" },
2269
- body: { target: phoneNumber }
2373
+ const verification = await this.verificationService.createVerification({
2374
+ type: "code",
2375
+ target: phoneNumber
2270
2376
  });
2271
2377
  await this.userNotifications(realmName).phoneVerification.push({
2272
2378
  contact: phoneNumber,
@@ -2367,8 +2473,8 @@ var UserController = class {
2367
2473
  method: "POST",
2368
2474
  path: `${this.url}/password-reset`,
2369
2475
  schema: {
2370
- query: t.object({ userRealmName: t.optional(t.string()) }),
2371
- body: t.object({ email: t.email() }),
2476
+ query: z.object({ userRealmName: z.string().optional() }),
2477
+ body: z.object({ email: z.email() }),
2372
2478
  response: passwordResetIntentResponseSchema
2373
2479
  },
2374
2480
  handler: ({ body, query }) => this.credentialService.createPasswordResetIntent(body.email, query.userRealmName)
@@ -2397,11 +2503,11 @@ var UserController = class {
2397
2503
  path: "/users/password-reset/request",
2398
2504
  group: this.group,
2399
2505
  schema: {
2400
- query: t.object({ userRealmName: t.optional(t.string()) }),
2401
- body: t.object({ email: t.email() }),
2402
- response: t.object({
2403
- success: t.boolean(),
2404
- 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()
2405
2511
  })
2406
2512
  },
2407
2513
  handler: async ({ body, query }) => {
@@ -2419,14 +2525,14 @@ var UserController = class {
2419
2525
  path: "/users/password-reset/validate",
2420
2526
  group: this.group,
2421
2527
  schema: {
2422
- query: t.object({
2423
- email: t.email(),
2424
- token: t.string(),
2425
- userRealmName: t.optional(t.string())
2528
+ query: z.object({
2529
+ email: z.email(),
2530
+ token: z.string(),
2531
+ userRealmName: z.string().optional()
2426
2532
  }),
2427
- response: t.object({
2428
- valid: t.boolean(),
2429
- email: t.optional(t.email())
2533
+ response: z.object({
2534
+ valid: z.boolean(),
2535
+ email: z.email().optional()
2430
2536
  })
2431
2537
  },
2432
2538
  handler: async ({ query }) => {
@@ -2447,15 +2553,15 @@ var UserController = class {
2447
2553
  path: "/users/password-reset/reset",
2448
2554
  group: this.group,
2449
2555
  schema: {
2450
- query: t.object({ userRealmName: t.optional(t.string()) }),
2451
- body: t.object({
2452
- email: t.email(),
2453
- token: t.string(),
2454
- 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)
2455
2561
  }),
2456
- response: t.object({
2457
- success: t.boolean(),
2458
- message: t.string()
2562
+ response: z.object({
2563
+ success: z.boolean(),
2564
+ message: z.string()
2459
2565
  })
2460
2566
  },
2461
2567
  handler: async ({ body, query }) => {
@@ -2476,17 +2582,14 @@ var UserController = class {
2476
2582
  path: "/users/email-verification/request",
2477
2583
  group: this.group,
2478
2584
  schema: {
2479
- query: t.object({
2480
- userRealmName: t.optional(t.string()),
2481
- method: t.optional(t.enum(["code", "link"], {
2482
- default: "code",
2483
- description: "Verification method: \"code\" sends a 6-digit code, \"link\" sends a clickable verification link. When using \"link\", configure verifyEmailUrl in realm settings."
2484
- }))
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()
2485
2588
  }),
2486
- body: t.object({ email: t.email() }),
2487
- response: t.object({
2488
- success: t.boolean(),
2489
- message: t.string()
2589
+ body: z.object({ email: z.email() }),
2590
+ response: z.object({
2591
+ success: z.boolean(),
2592
+ message: z.string()
2490
2593
  })
2491
2594
  },
2492
2595
  handler: async ({ body, query }) => {
@@ -2506,14 +2609,14 @@ var UserController = class {
2506
2609
  path: "/users/email-verification/verify",
2507
2610
  group: this.group,
2508
2611
  schema: {
2509
- query: t.object({ userRealmName: t.optional(t.string()) }),
2510
- body: t.object({
2511
- email: t.email(),
2512
- token: t.string()
2612
+ query: z.object({ userRealmName: z.string().optional() }),
2613
+ body: z.object({
2614
+ email: z.email(),
2615
+ token: z.string()
2513
2616
  }),
2514
- response: t.object({
2515
- success: t.boolean(),
2516
- message: t.string()
2617
+ response: z.object({
2618
+ success: z.boolean(),
2619
+ message: z.string()
2517
2620
  })
2518
2621
  },
2519
2622
  handler: async ({ body, query }) => {
@@ -2532,11 +2635,11 @@ var UserController = class {
2532
2635
  group: this.group,
2533
2636
  use: [$secure()],
2534
2637
  schema: {
2535
- query: t.object({
2536
- email: t.email(),
2537
- userRealmName: t.optional(t.string())
2638
+ query: z.object({
2639
+ email: z.email(),
2640
+ userRealmName: z.string().optional()
2538
2641
  }),
2539
- response: t.object({ verified: t.boolean() })
2642
+ response: z.object({ verified: z.boolean() })
2540
2643
  },
2541
2644
  handler: async ({ query }) => {
2542
2645
  return { verified: await this.userService.isEmailVerified(query.email, query.userRealmName) };
@@ -3222,6 +3325,7 @@ const $realm = (options = {}) => {
3222
3325
  ...options.issuer,
3223
3326
  name,
3224
3327
  secret: options.secret ?? securityProvider.secretKey,
3328
+ signing: options.signing,
3225
3329
  resolvers: customResolvers,
3226
3330
  roles: options.issuer?.roles ?? [{
3227
3331
  name: "admin",
@@ -3270,7 +3374,10 @@ const $realm = (options = {}) => {
3270
3374
  id: user.id,
3271
3375
  roles: user.roles,
3272
3376
  name: composedName,
3377
+ firstName: user.firstName,
3378
+ lastName: user.lastName,
3273
3379
  email: user.email,
3380
+ emailVerified: user.emailVerified,
3274
3381
  username: user.username,
3275
3382
  picture: user.picture,
3276
3383
  organization: user.organizationId ?? void 0,
@@ -3325,57 +3432,34 @@ const $realm = (options = {}) => {
3325
3432
  };
3326
3433
  //#endregion
3327
3434
  //#region ../../src/api/users/schemas/loginSchema.ts
3328
- const loginSchema = t.object({
3329
- username: t.text({
3435
+ const loginSchema = z.object({
3436
+ username: z.text({
3330
3437
  minLength: 3,
3331
3438
  maxLength: 100,
3332
3439
  description: "Username or email address for login"
3333
3440
  }),
3334
- password: t.text({
3441
+ password: z.text({
3335
3442
  minLength: 8,
3336
3443
  description: "User password"
3337
3444
  })
3338
3445
  });
3339
3446
  //#endregion
3340
3447
  //#region ../../src/api/users/schemas/registerSchema.ts
3341
- const registerSchema = t.object({
3342
- username: t.string({
3343
- minLength: 3,
3344
- maxLength: 20,
3345
- pattern: /^[a-zA-Z0-9_]+$/,
3346
- description: "Username for the new account"
3347
- }),
3348
- email: t.email({ description: "Email address for the new account" }),
3349
- password: t.string({
3350
- minLength: 8,
3351
- description: "Password for the new account"
3352
- }),
3353
- confirmPassword: t.string({
3354
- minLength: 8,
3355
- description: "Confirmation of the password"
3356
- }),
3357
- firstName: t.optional(t.string({
3358
- maxLength: 100,
3359
- description: "User's first name"
3360
- })),
3361
- lastName: t.optional(t.string({
3362
- maxLength: 100,
3363
- description: "User's last name"
3364
- }))
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()
3365
3455
  });
3366
3456
  //#endregion
3367
3457
  //#region ../../src/api/users/schemas/resetPasswordSchema.ts
3368
- const resetPasswordRequestSchema = t.object({ email: t.email({ description: "Email address to send password reset link" }) });
3369
- const resetPasswordSchema = t.object({
3370
- token: t.string({ description: "Password reset token from email" }),
3371
- password: t.string({
3372
- minLength: 8,
3373
- description: "New password"
3374
- }),
3375
- confirmPassword: t.string({
3376
- minLength: 8,
3377
- description: "Confirmation of the new password"
3378
- })
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")
3379
3463
  });
3380
3464
  //#endregion
3381
3465
  //#region ../../src/api/users/index.ts
@@ -3408,6 +3492,7 @@ const AlephaApiUsers = $module({
3408
3492
  UserController,
3409
3493
  AdminUserController,
3410
3494
  AdminSessionController,
3495
+ MySessionController,
3411
3496
  AdminIdentityController,
3412
3497
  RealmController
3413
3498
  ],
@@ -3420,6 +3505,6 @@ const AlephaApiUsers = $module({
3420
3505
  ]
3421
3506
  });
3422
3507
  //#endregion
3423
- 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 };
3424
3509
 
3425
3510
  //# sourceMappingURL=index.js.map