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,10 +1,11 @@
1
- import { $atom, $inject, $module, $state, Alepha, AlephaError, t } from "alepha";
1
+ import { $atom, $inject, $module, $state, Alepha, AlephaError, z } from "alepha";
2
2
  import { $logger } from "alepha/logger";
3
+ import { JwtProvider } from "alepha/security";
3
4
  import { $route } from "alepha/server";
4
5
  import { createHash, randomUUID } from "node:crypto";
6
+ import { CryptoProvider } from "alepha/crypto";
5
7
  import { DateTimeProvider } from "alepha/datetime";
6
8
  import { $entity, $repository, db } from "alepha/orm";
7
- import { JwtProvider } from "alepha/security";
8
9
  //#region ../../src/api/oauth/helpers/consentPage.ts
9
10
  const escapeHtml = (s) => s.replace(/[&<>"']/g, (c) => ({
10
11
  "&": "&amp;",
@@ -53,6 +54,7 @@ const buildAuthorizationServerMetadata = (baseUrl) => ({
53
54
  authorization_endpoint: `${baseUrl}/oauth/authorize`,
54
55
  token_endpoint: `${baseUrl}/oauth/token`,
55
56
  registration_endpoint: `${baseUrl}/oauth/register`,
57
+ jwks_uri: `${baseUrl}/oauth/jwks`,
56
58
  response_types_supported: ["code"],
57
59
  grant_types_supported: ["authorization_code", "refresh_token"],
58
60
  code_challenge_methods_supported: ["S256"],
@@ -70,37 +72,65 @@ const buildProtectedResourceMetadata = (baseUrl, resource) => ({
70
72
  bearer_methods_supported: ["header"]
71
73
  });
72
74
  //#endregion
75
+ //#region ../../src/api/oauth/helpers/oidcMetadata.ts
76
+ /**
77
+ * OpenID Connect Discovery 1.0 — provider metadata document
78
+ * (`/.well-known/openid-configuration`). `baseUrl` is the absolute origin of
79
+ * the OIDC provider (e.g. https://alepha.club).
80
+ */
81
+ const buildOpenIdConfiguration = (baseUrl) => ({
82
+ issuer: baseUrl,
83
+ authorization_endpoint: `${baseUrl}/oauth/authorize`,
84
+ token_endpoint: `${baseUrl}/oauth/token`,
85
+ jwks_uri: `${baseUrl}/oauth/jwks`,
86
+ registration_endpoint: `${baseUrl}/oauth/register`,
87
+ response_types_supported: ["code"],
88
+ grant_types_supported: ["authorization_code", "refresh_token"],
89
+ subject_types_supported: ["public"],
90
+ id_token_signing_alg_values_supported: ["EdDSA", "RS256"],
91
+ code_challenge_methods_supported: ["S256"],
92
+ token_endpoint_auth_methods_supported: ["none", "client_secret_post"],
93
+ scopes_supported: [
94
+ "openid",
95
+ "email",
96
+ "profile"
97
+ ]
98
+ });
99
+ //#endregion
73
100
  //#region ../../src/api/oauth/schemas/authorizeDecisionBodySchema.ts
74
101
  /**
75
102
  * Body posted by the consent screen. All authorization-request parameters
76
103
  * are round-tripped through hidden form fields so the POST handler can
77
104
  * re-validate them without server-side session state.
78
105
  */
79
- const authorizeDecisionBodySchema = t.object({
80
- decision: t.text(),
81
- response_type: t.text(),
82
- client_id: t.text(),
83
- redirect_uri: t.text({ maxLength: 2048 }),
84
- code_challenge: t.text(),
85
- code_challenge_method: t.text(),
86
- scope: t.optional(t.text({ maxLength: 1024 })),
87
- state: t.optional(t.text({ maxLength: 512 })),
88
- resource: t.optional(t.text({ maxLength: 2048 }))
106
+ const authorizeDecisionBodySchema = z.object({
107
+ decision: z.text(),
108
+ response_type: z.text(),
109
+ client_id: z.text(),
110
+ redirect_uri: z.text({ maxLength: 2048 }),
111
+ code_challenge: z.text(),
112
+ code_challenge_method: z.text(),
113
+ scope: z.text({ maxLength: 1024 }).optional(),
114
+ state: z.text({ maxLength: 512 }).optional(),
115
+ resource: z.text({ maxLength: 2048 }).optional(),
116
+ nonce: z.text({ maxLength: 512 }).optional()
89
117
  });
90
118
  //#endregion
91
119
  //#region ../../src/api/oauth/schemas/authorizeQuerySchema.ts
92
120
  /**
93
121
  * OAuth 2.1 authorization request query parameters (GET /oauth/authorize).
94
122
  */
95
- const authorizeQuerySchema = t.object({
96
- response_type: t.text(),
97
- client_id: t.text(),
98
- redirect_uri: t.text({ maxLength: 2048 }),
99
- code_challenge: t.text(),
100
- code_challenge_method: t.text(),
101
- scope: t.optional(t.text({ maxLength: 1024 })),
102
- state: t.optional(t.text({ maxLength: 512 })),
103
- resource: t.optional(t.text({ maxLength: 2048 }))
123
+ const authorizeQuerySchema = z.object({
124
+ response_type: z.text(),
125
+ client_id: z.text(),
126
+ redirect_uri: z.text({ maxLength: 2048 }),
127
+ code_challenge: z.text(),
128
+ code_challenge_method: z.text(),
129
+ scope: z.text({ maxLength: 1024 }).optional(),
130
+ state: z.text({ maxLength: 512 }).optional(),
131
+ resource: z.text({ maxLength: 2048 }).optional(),
132
+ prompt: z.text({ maxLength: 64 }).optional(),
133
+ nonce: z.text({ maxLength: 512 }).optional()
104
134
  });
105
135
  //#endregion
106
136
  //#region ../../src/api/oauth/schemas/registerClientBodySchema.ts
@@ -108,13 +138,13 @@ const authorizeQuerySchema = t.object({
108
138
  * RFC 7591 Dynamic Client Registration request body.
109
139
  * Only the fields Alepha consumes are typed; unknown fields are ignored.
110
140
  */
111
- const registerClientBodySchema = t.object({
112
- client_name: t.optional(t.text({ maxLength: 200 })),
113
- redirect_uris: t.array(t.text({ maxLength: 2048 }), { minItems: 1 }),
114
- scope: t.optional(t.text({ maxLength: 1024 })),
115
- grant_types: t.optional(t.array(t.text())),
116
- token_endpoint_auth_method: t.optional(t.text())
117
- }, { additionalProperties: true });
141
+ const registerClientBodySchema = z.object({
142
+ client_name: z.text({ maxLength: 200 }).optional(),
143
+ redirect_uris: z.array(z.text({ maxLength: 2048 })).min(1),
144
+ scope: z.text({ maxLength: 1024 }).optional(),
145
+ grant_types: z.array(z.text()).optional(),
146
+ token_endpoint_auth_method: z.text().optional()
147
+ }).meta({ additionalProperties: true });
118
148
  //#endregion
119
149
  //#region ../../src/api/oauth/schemas/tokenRequestBodySchema.ts
120
150
  /**
@@ -123,13 +153,14 @@ const registerClientBodySchema = t.object({
123
153
  * optional at the schema level; the handler enforces the grant-specific
124
154
  * requirements and returns the appropriate OAuth error responses.
125
155
  */
126
- const tokenRequestBodySchema = t.object({
127
- grant_type: t.optional(t.text()),
128
- code: t.optional(t.text({ maxLength: 4096 })),
129
- client_id: t.optional(t.text()),
130
- redirect_uri: t.optional(t.text({ maxLength: 2048 })),
131
- code_verifier: t.optional(t.text({ maxLength: 256 })),
132
- refresh_token: t.optional(t.text({ maxLength: 4096 }))
156
+ const tokenRequestBodySchema = z.object({
157
+ grant_type: z.text().optional(),
158
+ code: z.text({ maxLength: 4096 }).optional(),
159
+ client_id: z.text().optional(),
160
+ redirect_uri: z.text({ maxLength: 2048 }).optional(),
161
+ code_verifier: z.text({ maxLength: 256 }).optional(),
162
+ refresh_token: z.text({ maxLength: 4096 }).optional(),
163
+ client_secret: z.text({ maxLength: 512 }).optional()
133
164
  });
134
165
  //#endregion
135
166
  //#region ../../src/api/oauth/entities/oauthClientEntity.ts
@@ -143,19 +174,36 @@ const tokenRequestBodySchema = t.object({
143
174
  */
144
175
  const oauthClientEntity = $entity({
145
176
  name: "oauth_clients",
146
- schema: t.object({
147
- id: db.primaryKey(t.uuid()),
177
+ schema: z.object({
178
+ id: db.primaryKey(z.uuid()),
148
179
  createdAt: db.createdAt(),
149
180
  updatedAt: db.updatedAt(),
150
- clientId: t.text({ maxLength: 64 }),
151
- clientName: t.text({ maxLength: 200 }),
152
- redirectUris: db.default(t.array(t.text({ maxLength: 2048 })), []),
153
- scopes: db.default(t.array(t.text({ maxLength: 64 })), []),
154
- realm: t.text({ maxLength: 100 }),
155
- source: db.default(t.text({ maxLength: 16 }), "dcr"),
156
- createdByUserId: t.optional(t.uuid()),
157
- lastUsedAt: t.optional(t.datetime()),
158
- revokedAt: t.optional(t.datetime())
181
+ clientId: z.text({ maxLength: 64 }),
182
+ clientName: z.text({ maxLength: 200 }),
183
+ redirectUris: db.default(z.array(z.text({ maxLength: 2048 })), []),
184
+ scopes: db.default(z.array(z.text({ maxLength: 64 })), []),
185
+ realm: z.text({ maxLength: 100 }),
186
+ /**
187
+ * OAuth client type. `confidential` clients authenticate at the token
188
+ * endpoint with a secret; `public` clients rely on PKCE only.
189
+ */
190
+ type: db.default(z.enum(["public", "confidential"]), "public"),
191
+ /**
192
+ * First-party client: skip the consent screen. Consent exists to protect a
193
+ * user from THIRD-party apps requesting their data; a trusted client is the
194
+ * authorization server's own product (same vendor), so an authenticated
195
+ * user is sent straight back with a code — no "App X wants to connect" page.
196
+ */
197
+ trusted: db.default(z.boolean(), false),
198
+ /**
199
+ * Scrypt hash of the client secret (confidential clients only). Null for
200
+ * public clients. Verified via `OAuthClientService.verifySecret`.
201
+ */
202
+ clientSecretHash: z.text({ maxLength: 256 }).optional(),
203
+ source: db.default(z.text({ maxLength: 16 }), "dcr"),
204
+ createdByUserId: z.uuid().optional(),
205
+ lastUsedAt: z.datetime().optional(),
206
+ revokedAt: z.datetime().optional()
159
207
  }),
160
208
  indexes: [{
161
209
  columns: ["clientId"],
@@ -182,6 +230,7 @@ var OAuthClientService = class {
182
230
  log = $logger();
183
231
  repo = $repository(oauthClientEntity);
184
232
  jwt = $inject(JwtProvider);
233
+ crypto = $inject(CryptoProvider);
185
234
  /**
186
235
  * Codes already redeemed in this process. Single-use enforcement only
187
236
  * needs to cover the ~60s code lifetime, so a bounded in-memory set is
@@ -221,6 +270,35 @@ var OAuthClientService = class {
221
270
  };
222
271
  }
223
272
  /**
273
+ * Mint an OIDC `id_token` for a consumed grant, signed by the realm's issuer
274
+ * key (asymmetric when configured). Claims: iss, sub, aud (client_id), exp,
275
+ * iat, nonce (when present), plus the standard profile claims the loader
276
+ * provides: email, email_verified, name, given_name, family_name,
277
+ * preferred_username, picture.
278
+ */
279
+ async issueIdToken(realm, params) {
280
+ const entry = this.issuers.get(realm);
281
+ if (!entry) throw new AlephaError(`No issuer registered for realm '${realm}'`);
282
+ const user = await entry.loadUser(params.userId);
283
+ const iat = this.dateTime.now().unix();
284
+ const exp = iat + entry.issuer.accessTokenExpiration.asSeconds();
285
+ return this.jwt.create({
286
+ iss: params.issuer,
287
+ sub: user.id,
288
+ aud: params.clientId,
289
+ exp,
290
+ iat,
291
+ ...params.nonce ? { nonce: params.nonce } : {},
292
+ ...user.email ? { email: user.email } : {},
293
+ ...user.emailVerified !== void 0 ? { email_verified: user.emailVerified } : {},
294
+ ...user.name ? { name: user.name } : {},
295
+ ...user.firstName ? { given_name: user.firstName } : {},
296
+ ...user.lastName ? { family_name: user.lastName } : {},
297
+ ...user.username ? { preferred_username: user.username } : {},
298
+ ...user.picture ? { picture: user.picture } : {}
299
+ }, realm, { header: { typ: "JWT" } });
300
+ }
301
+ /**
224
302
  * Exchange a refresh token for a fresh access token (OAuth 2.1
225
303
  * `refresh_token` grant), using the issuer registered for `realm`. Lets an
226
304
  * MCP client stay connected for the refresh token's full lifetime without
@@ -230,11 +308,12 @@ var OAuthClientService = class {
230
308
  async refreshAccessToken(realm, refreshToken) {
231
309
  const entry = this.issuers.get(realm);
232
310
  if (!entry) throw new AlephaError(`No issuer registered for realm '${realm}'`);
233
- const { tokens } = await entry.issuer.refreshToken(refreshToken);
311
+ const { tokens, user } = await entry.issuer.refreshToken(refreshToken);
234
312
  return {
235
313
  access_token: tokens.access_token,
236
314
  expires_in: tokens.expires_in,
237
- refresh_token: tokens.refresh_token
315
+ refresh_token: tokens.refresh_token,
316
+ userId: user.id
238
317
  };
239
318
  }
240
319
  /**
@@ -243,35 +322,106 @@ var OAuthClientService = class {
243
322
  */
244
323
  async register(options) {
245
324
  if (options.redirectUris.length === 0) throw new AlephaError("At least one redirect_uri is required");
246
- for (const uri of options.redirectUris) if (!uri.startsWith("https://") && !uri.startsWith("http://localhost")) throw new AlephaError(`Invalid redirect_uri: ${uri}`);
247
- const clientId = `mcp_${randomUUID().replace(/-/g, "")}`;
325
+ for (const uri of options.redirectUris) this.assertValidRedirectUri(uri);
326
+ const type = options.type ?? "public";
327
+ if (type === "confidential" && !options.secret) throw new AlephaError("A confidential client requires a secret");
328
+ const clientId = options.clientId ?? `mcp_${randomUUID().replace(/-/g, "")}`;
329
+ const clientSecretHash = options.secret ? await this.crypto.hashPassword(options.secret) : void 0;
248
330
  const client = await this.repo.create({
249
331
  clientId,
250
- clientName: options.clientName || "MCP Client",
332
+ clientName: options.clientName || "OAuth Client",
251
333
  redirectUris: options.redirectUris,
252
- scopes: options.scopes,
334
+ scopes: options.scopes ?? ["openid"],
253
335
  realm: options.realm,
336
+ type,
337
+ trusted: options.trusted ?? false,
338
+ clientSecretHash,
254
339
  source: options.source ?? "dcr",
255
340
  createdByUserId: options.createdByUserId
256
341
  });
257
342
  this.log.info("OAuth client registered", {
258
343
  clientId,
344
+ type,
259
345
  source: client.source
260
346
  });
261
347
  return client;
262
348
  }
263
349
  /**
350
+ * Idempotently align a registered client's redirect_uri allowlist with the
351
+ * given list. No-op when the client is unknown or the list already matches —
352
+ * safe to call from post-deploy seeders (allowlist changes ship as code, and
353
+ * `register` alone would leave existing rows stale).
354
+ */
355
+ async updateRedirectUris(clientId, redirectUris) {
356
+ if (redirectUris.length === 0) throw new AlephaError("At least one redirect_uri is required");
357
+ for (const uri of redirectUris) this.assertValidRedirectUri(uri);
358
+ const client = await this.findByClientId(clientId);
359
+ if (!client) return;
360
+ if (client.redirectUris.length === redirectUris.length && client.redirectUris.every((uri, i) => uri === redirectUris[i])) return;
361
+ await this.repo.updateById(client.id, { redirectUris });
362
+ this.log.info("OAuth client redirect_uris updated", {
363
+ clientId,
364
+ redirectUris
365
+ });
366
+ }
367
+ /**
368
+ * Verify a confidential client's secret against its stored scrypt hash.
369
+ * Returns false for unknown/revoked/public (no-hash) clients.
370
+ */
371
+ async verifySecret(clientId, secret) {
372
+ const client = await this.findByClientId(clientId);
373
+ if (!client || client.revokedAt || !client.clientSecretHash) return false;
374
+ return this.crypto.verifyPassword(secret, client.clientSecretHash);
375
+ }
376
+ /**
377
+ * Validate a registered redirect_uri. https (or http://localhost) only, and
378
+ * at most a single `*` which must live inside the host (see
379
+ * `redirectUriMatches` for the matching rule).
380
+ */
381
+ assertValidRedirectUri(uri) {
382
+ const stars = (uri.match(/\*/g) ?? []).length;
383
+ if (stars > 1) throw new AlephaError(`At most one '*' wildcard is allowed in redirect_uri: ${uri}`);
384
+ const probe = uri.replace("*", "wildcard");
385
+ if (!probe.startsWith("https://") && !probe.startsWith("http://localhost")) throw new AlephaError(`Invalid redirect_uri: ${uri}`);
386
+ if (stars === 1) {
387
+ if (!(uri.slice(uri.indexOf("://") + 3).split("/")[0] ?? "").includes("*")) throw new AlephaError(`Wildcard '*' is only allowed in the host: ${uri}`);
388
+ }
389
+ }
390
+ /**
264
391
  * Look up a client by its public `clientId`. Returns null if unknown.
265
392
  */
266
393
  async findByClientId(clientId) {
267
394
  return await this.repo.findOne({ where: { clientId: { eq: clientId } } }) ?? null;
268
395
  }
269
396
  /**
270
- * Exact-match redirect_uri check. OAuth 2.1 forbids substring/prefix
271
- * matching the value must equal a registered URI byte-for-byte.
397
+ * Narrow the scopes a client asks for to those it is actually registered
398
+ * for. The requested scope string is attacker-controlled, so it must never
399
+ * be trusted verbatim — a client registered for `["mcp"]` that asks for
400
+ * `mcp admin` must only be granted `mcp`. When nothing (usable) is
401
+ * requested, the client's full registered set is the default grant.
402
+ * Requested order is preserved and duplicates are dropped.
403
+ */
404
+ intersectScopes(requested, allowed) {
405
+ if (!requested || requested.length === 0) return allowed;
406
+ const allowedSet = new Set(allowed);
407
+ const granted = [];
408
+ for (const scope of requested) if (allowedSet.has(scope) && !granted.includes(scope)) granted.push(scope);
409
+ return granted;
410
+ }
411
+ /**
412
+ * Redirect_uri check. A registered pattern is matched byte-exact unless it
413
+ * contains a single `*`, which matches exactly ONE host label (no dots).
414
+ * E.g. `https://*.alepha.club/auth/callback` matches
415
+ * `https://b14.alepha.club/auth/callback` but NOT `https://alepha.club/...`
416
+ * nor `https://a.b.alepha.club/...`.
272
417
  */
273
418
  isRedirectUriAllowed(client, redirectUri) {
274
- return client.redirectUris.includes(redirectUri);
419
+ return client.redirectUris.some((pattern) => this.redirectUriMatches(pattern, redirectUri));
420
+ }
421
+ redirectUriMatches(pattern, candidate) {
422
+ if (!pattern.includes("*")) return pattern === candidate;
423
+ const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
424
+ return new RegExp(`^${escaped.replace("\\*", "[^.]+")}$`).test(candidate);
275
425
  }
276
426
  /**
277
427
  * Mint a stateless authorization code: a short-lived signed JWT
@@ -286,6 +436,7 @@ var OAuthClientService = class {
286
436
  code_challenge: grant.codeChallenge,
287
437
  scopes: grant.scopes,
288
438
  resource: grant.resource,
439
+ nonce: grant.nonce,
289
440
  iat,
290
441
  exp: iat + 60,
291
442
  jti: randomUUID()
@@ -307,7 +458,8 @@ var OAuthClientService = class {
307
458
  return {
308
459
  userId: payload.sub,
309
460
  scopes: payload.scopes ?? [],
310
- resource: payload.resource
461
+ resource: payload.resource,
462
+ nonce: payload.nonce
311
463
  };
312
464
  }
313
465
  };
@@ -323,10 +475,10 @@ var OAuthClientService = class {
323
475
  const oauthOptions = $atom({
324
476
  name: "alepha.api.oauth.options",
325
477
  description: "Configuration for the OAuth authorization server.",
326
- schema: t.object({
327
- realm: t.text({ default: "users" }),
328
- resource: t.text({ default: "/mcp" }),
329
- loginPath: t.text({ default: "/login" })
478
+ schema: z.object({
479
+ realm: z.text({ default: "users" }),
480
+ resource: z.text({ default: "/mcp" }),
481
+ loginPath: z.text({ default: "/login" })
330
482
  }),
331
483
  default: {
332
484
  realm: "users",
@@ -343,6 +495,7 @@ var OAuthController = class {
343
495
  log = $logger();
344
496
  options = $state(oauthOptions);
345
497
  clients = $inject(OAuthClientService);
498
+ jwt = $inject(JwtProvider);
346
499
  /**
347
500
  * Absolute origin of the current request, e.g. https://app.com.
348
501
  */
@@ -366,6 +519,22 @@ var OAuthController = class {
366
519
  reply.body = JSON.stringify(buildProtectedResourceMetadata(base, `${base}${this.options.resource}`));
367
520
  }
368
521
  });
522
+ openidConfiguration = $route({
523
+ method: "GET",
524
+ path: "/.well-known/openid-configuration",
525
+ handler: ({ url, reply }) => {
526
+ reply.headers["content-type"] = "application/json";
527
+ reply.body = JSON.stringify(buildOpenIdConfiguration(this.baseUrl(url)));
528
+ }
529
+ });
530
+ jwks = $route({
531
+ method: "GET",
532
+ path: "/oauth/jwks",
533
+ handler: async ({ reply }) => {
534
+ reply.headers["content-type"] = "application/json";
535
+ reply.body = JSON.stringify(await this.jwt.getJwks(this.options.realm));
536
+ }
537
+ });
369
538
  register = $route({
370
539
  method: "POST",
371
540
  path: "/oauth/register",
@@ -422,16 +591,41 @@ var OAuthController = class {
422
591
  reply.body = "redirect_uri not registered";
423
592
  return;
424
593
  }
594
+ const silent = query.prompt === "none";
595
+ const skipConsent = silent || client.trusted === true;
425
596
  if (!user) {
597
+ if (silent) {
598
+ const redirect = new URL(query.redirect_uri);
599
+ redirect.searchParams.set("error", "login_required");
600
+ if (query.state) redirect.searchParams.set("state", query.state);
601
+ reply.redirect(redirect.toString(), 302);
602
+ return;
603
+ }
426
604
  const returnTo = encodeURIComponent(url.pathname + url.search);
427
605
  reply.redirect(`${this.options.loginPath}?redirect_uri=${returnTo}`, 302);
428
606
  return;
429
607
  }
608
+ if (skipConsent) {
609
+ const code = await this.clients.createAuthorizationCode(this.options.realm, {
610
+ userId: user.id,
611
+ clientId: query.client_id,
612
+ redirectUri: query.redirect_uri,
613
+ codeChallenge: query.code_challenge,
614
+ scopes: this.clients.intersectScopes(query.scope?.split(" "), client.scopes),
615
+ resource: query.resource || void 0,
616
+ nonce: query.nonce
617
+ });
618
+ const redirect = new URL(query.redirect_uri);
619
+ redirect.searchParams.set("code", code);
620
+ if (query.state) redirect.searchParams.set("state", query.state);
621
+ reply.redirect(redirect.toString(), 302);
622
+ return;
623
+ }
430
624
  reply.headers["content-type"] = "text/html; charset=utf-8";
431
625
  reply.body = renderConsentPage({
432
626
  clientName: client.clientName,
433
627
  userName: user.name ?? user.email ?? "your account",
434
- scopes: query.scope ? query.scope.split(" ") : client.scopes,
628
+ scopes: this.clients.intersectScopes(query.scope?.split(" "), client.scopes),
435
629
  hidden: {
436
630
  response_type: query.response_type,
437
631
  client_id: query.client_id,
@@ -440,7 +634,8 @@ var OAuthController = class {
440
634
  code_challenge_method: query.code_challenge_method,
441
635
  scope: query.scope ?? "",
442
636
  state: query.state ?? "",
443
- resource: query.resource ?? ""
637
+ resource: query.resource ?? "",
638
+ nonce: query.nonce ?? ""
444
639
  }
445
640
  });
446
641
  }
@@ -484,8 +679,9 @@ var OAuthController = class {
484
679
  clientId: body.client_id,
485
680
  redirectUri: body.redirect_uri,
486
681
  codeChallenge: body.code_challenge,
487
- scopes: body.scope ? body.scope.split(" ") : client.scopes,
488
- resource: body.resource || void 0
682
+ scopes: this.clients.intersectScopes(body.scope?.split(" "), client.scopes),
683
+ resource: body.resource || void 0,
684
+ nonce: body.nonce
489
685
  });
490
686
  redirect.searchParams.set("code", code);
491
687
  if (body.state) redirect.searchParams.set("state", body.state);
@@ -503,10 +699,23 @@ var OAuthController = class {
503
699
  path: "/oauth/token",
504
700
  schema: { body: tokenRequestBodySchema },
505
701
  use: [],
506
- handler: async ({ body, reply }) => {
702
+ handler: async ({ body, url, reply }) => {
507
703
  reply.headers["content-type"] = "application/json";
508
704
  try {
509
705
  if (body.grant_type === "authorization_code") {
706
+ const client = await this.clients.findByClientId(body.client_id ?? "");
707
+ if (!client || client.revokedAt) {
708
+ reply.status = 400;
709
+ reply.body = JSON.stringify({ error: "invalid_client" });
710
+ return;
711
+ }
712
+ if (client.type === "confidential") {
713
+ if (!await this.clients.verifySecret(client.clientId, body.client_secret ?? "")) {
714
+ reply.status = 401;
715
+ reply.body = JSON.stringify({ error: "invalid_client" });
716
+ return;
717
+ }
718
+ }
510
719
  const grant = await this.clients.consumeAuthorizationCode(this.options.realm, body.code ?? "", {
511
720
  clientId: body.client_id ?? "",
512
721
  redirectUri: body.redirect_uri ?? "",
@@ -516,23 +725,36 @@ var OAuthController = class {
516
725
  ...grant,
517
726
  clientId: body.client_id ?? ""
518
727
  });
519
- reply.body = JSON.stringify({
728
+ const response = {
520
729
  access_token: tokens.access_token,
521
730
  token_type: "Bearer",
522
731
  expires_in: tokens.expires_in,
523
732
  refresh_token: tokens.refresh_token,
524
733
  scope: grant.scopes.join(" ")
734
+ };
735
+ if (grant.scopes.includes("openid")) response.id_token = await this.clients.issueIdToken(this.options.realm, {
736
+ userId: grant.userId,
737
+ clientId: body.client_id ?? "",
738
+ issuer: this.baseUrl(url),
739
+ nonce: grant.nonce
525
740
  });
741
+ reply.body = JSON.stringify(response);
526
742
  return;
527
743
  }
528
744
  if (body.grant_type === "refresh_token") {
529
745
  const tokens = await this.clients.refreshAccessToken(this.options.realm, body.refresh_token ?? "");
530
- reply.body = JSON.stringify({
746
+ const response = {
531
747
  access_token: tokens.access_token,
532
748
  token_type: "Bearer",
533
749
  expires_in: tokens.expires_in,
534
750
  refresh_token: tokens.refresh_token
751
+ };
752
+ if (body.client_id) response.id_token = await this.clients.issueIdToken(this.options.realm, {
753
+ userId: tokens.userId,
754
+ clientId: body.client_id,
755
+ issuer: this.baseUrl(url)
535
756
  });
757
+ reply.body = JSON.stringify(response);
536
758
  return;
537
759
  }
538
760
  reply.status = 400;
@@ -573,6 +795,6 @@ const AlephaOAuth = $module({
573
795
  services: [OAuthClientService, OAuthController]
574
796
  });
575
797
  //#endregion
576
- export { AlephaOAuth, OAuthClientService, OAuthController, oauthClientEntity, oauthOptions };
798
+ export { AlephaOAuth, OAuthClientService, OAuthController, buildOpenIdConfiguration, oauthClientEntity, oauthOptions };
577
799
 
578
800
  //# sourceMappingURL=index.js.map