alepha 0.23.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (845) hide show
  1. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  2. package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
  3. package/dist/api/audits/index.browser.js +49 -52
  4. package/dist/api/audits/index.browser.js.map +1 -1
  5. package/dist/api/audits/index.d.ts +629 -565
  6. package/dist/api/audits/index.d.ts.map +1 -1
  7. package/dist/api/audits/index.js +206 -98
  8. package/dist/api/audits/index.js.map +1 -1
  9. package/dist/api/files/index.browser.js +44 -44
  10. package/dist/api/files/index.browser.js.map +1 -1
  11. package/dist/api/files/index.d.ts +292 -293
  12. package/dist/api/files/index.d.ts.map +1 -1
  13. package/dist/api/files/index.js +61 -64
  14. package/dist/api/files/index.js.map +1 -1
  15. package/dist/api/jobs/index.browser.js +61 -59
  16. package/dist/api/jobs/index.browser.js.map +1 -1
  17. package/dist/api/jobs/index.d.ts +546 -347
  18. package/dist/api/jobs/index.d.ts.map +1 -1
  19. package/dist/api/jobs/index.js +165 -86
  20. package/dist/api/jobs/index.js.map +1 -1
  21. package/dist/api/keys/index.d.ts +247 -235
  22. package/dist/api/keys/index.d.ts.map +1 -1
  23. package/dist/api/keys/index.js +63 -66
  24. package/dist/api/keys/index.js.map +1 -1
  25. package/dist/api/notifications/index.browser.js +40 -38
  26. package/dist/api/notifications/index.browser.js.map +1 -1
  27. package/dist/api/notifications/index.d.ts +339 -209
  28. package/dist/api/notifications/index.d.ts.map +1 -1
  29. package/dist/api/notifications/index.js +108 -60
  30. package/dist/api/notifications/index.js.map +1 -1
  31. package/dist/api/oauth/index.d.ts +190 -78
  32. package/dist/api/oauth/index.d.ts.map +1 -1
  33. package/dist/api/oauth/index.js +290 -68
  34. package/dist/api/oauth/index.js.map +1 -1
  35. package/dist/api/organizations/index.browser.js +14 -14
  36. package/dist/api/organizations/index.browser.js.map +1 -1
  37. package/dist/api/organizations/index.d.ts +158 -134
  38. package/dist/api/organizations/index.d.ts.map +1 -1
  39. package/dist/api/organizations/index.js +18 -18
  40. package/dist/api/organizations/index.js.map +1 -1
  41. package/dist/api/parameters/index.browser.js +74 -53
  42. package/dist/api/parameters/index.browser.js.map +1 -1
  43. package/dist/api/parameters/index.d.ts +607 -513
  44. package/dist/api/parameters/index.d.ts.map +1 -1
  45. package/dist/api/parameters/index.js +205 -127
  46. package/dist/api/parameters/index.js.map +1 -1
  47. package/dist/api/payments/index.d.ts +652 -449
  48. package/dist/api/payments/index.d.ts.map +1 -1
  49. package/dist/api/payments/index.js +159 -93
  50. package/dist/api/payments/index.js.map +1 -1
  51. package/dist/api/subscriptions/index.d.ts +1032 -762
  52. package/dist/api/subscriptions/index.d.ts.map +1 -1
  53. package/dist/api/subscriptions/index.js +166 -185
  54. package/dist/api/subscriptions/index.js.map +1 -1
  55. package/dist/api/users/index.browser.js +48 -71
  56. package/dist/api/users/index.browser.js.map +1 -1
  57. package/dist/api/users/index.d.ts +1297 -1143
  58. package/dist/api/users/index.d.ts.map +1 -1
  59. package/dist/api/users/index.js +456 -392
  60. package/dist/api/users/index.js.map +1 -1
  61. package/dist/api/verifications/index.browser.js +17 -17
  62. package/dist/api/verifications/index.browser.js.map +1 -1
  63. package/dist/api/verifications/index.d.ts +167 -155
  64. package/dist/api/verifications/index.d.ts.map +1 -1
  65. package/dist/api/verifications/index.js +47 -95
  66. package/dist/api/verifications/index.js.map +1 -1
  67. package/dist/background/index.d.ts +0 -1
  68. package/dist/background/index.d.ts.map +1 -1
  69. package/dist/background/index.js.map +1 -1
  70. package/dist/background/index.workerd.js.map +1 -1
  71. package/dist/batch/index.d.ts +0 -1
  72. package/dist/batch/index.d.ts.map +1 -1
  73. package/dist/batch/index.js.map +1 -1
  74. package/dist/bin/index.js +1 -1
  75. package/dist/bin/index.js.map +1 -1
  76. package/dist/bucket/index.d.ts +27 -32
  77. package/dist/bucket/index.d.ts.map +1 -1
  78. package/dist/bucket/index.js +56 -26
  79. package/dist/bucket/index.js.map +1 -1
  80. package/dist/bucket/index.workerd.js +52 -24
  81. package/dist/bucket/index.workerd.js.map +1 -1
  82. package/dist/cache/core/index.d.ts +4 -6
  83. package/dist/cache/core/index.d.ts.map +1 -1
  84. package/dist/cache/core/index.js +4 -10
  85. package/dist/cache/core/index.js.map +1 -1
  86. package/dist/cache/core/index.workerd.js +4 -10
  87. package/dist/cache/core/index.workerd.js.map +1 -1
  88. package/dist/cache/database/index.d.ts +22 -23
  89. package/dist/cache/database/index.d.ts.map +1 -1
  90. package/dist/cache/database/index.js +11 -20
  91. package/dist/cache/database/index.js.map +1 -1
  92. package/dist/cache/redis/index.d.ts +3 -4
  93. package/dist/cache/redis/index.d.ts.map +1 -1
  94. package/dist/cache/redis/index.js +2 -2
  95. package/dist/cache/redis/index.js.map +1 -1
  96. package/dist/captcha/index.d.ts.map +1 -1
  97. package/dist/captcha/index.js +4 -4
  98. package/dist/captcha/index.js.map +1 -1
  99. package/dist/cli/config/index.d.ts +0 -1
  100. package/dist/cli/config/index.d.ts.map +1 -1
  101. package/dist/cli/core/index.d.ts +205 -442
  102. package/dist/cli/core/index.d.ts.map +1 -1
  103. package/dist/cli/core/index.js +259 -284
  104. package/dist/cli/core/index.js.map +1 -1
  105. package/dist/cli/devtools/index.d.ts +3 -9
  106. package/dist/cli/devtools/index.d.ts.map +1 -1
  107. package/dist/cli/devtools/index.js +3 -3
  108. package/dist/cli/devtools/index.js.map +1 -1
  109. package/dist/cli/i18n/index.d.ts +8 -34
  110. package/dist/cli/i18n/index.d.ts.map +1 -1
  111. package/dist/cli/i18n/index.js +6 -6
  112. package/dist/cli/i18n/index.js.map +1 -1
  113. package/dist/cli/platform/index.d.ts +89 -82
  114. package/dist/cli/platform/index.d.ts.map +1 -1
  115. package/dist/cli/platform/index.js +27 -33
  116. package/dist/cli/platform/index.js.map +1 -1
  117. package/dist/cli/platform-lib/index.d.ts +351 -404
  118. package/dist/cli/platform-lib/index.d.ts.map +1 -1
  119. package/dist/cli/platform-lib/index.js +218 -239
  120. package/dist/cli/platform-lib/index.js.map +1 -1
  121. package/dist/cli/vendor/index.d.ts +17 -41
  122. package/dist/cli/vendor/index.d.ts.map +1 -1
  123. package/dist/cli/vendor/index.js +10 -13
  124. package/dist/cli/vendor/index.js.map +1 -1
  125. package/dist/command/index.d.ts +83 -195
  126. package/dist/command/index.d.ts.map +1 -1
  127. package/dist/command/index.js +160 -563
  128. package/dist/command/index.js.map +1 -1
  129. package/dist/core/index.browser.js +845 -859
  130. package/dist/core/index.browser.js.map +1 -1
  131. package/dist/core/index.d.ts +787 -527
  132. package/dist/core/index.d.ts.map +1 -1
  133. package/dist/core/index.js +845 -859
  134. package/dist/core/index.js.map +1 -1
  135. package/dist/core/index.native.js +845 -859
  136. package/dist/core/index.native.js.map +1 -1
  137. package/dist/core/index.workerd.js +845 -859
  138. package/dist/core/index.workerd.js.map +1 -1
  139. package/dist/crypto/index.browser.js +1 -1
  140. package/dist/crypto/index.browser.js.map +1 -1
  141. package/dist/crypto/index.d.ts +3 -4
  142. package/dist/crypto/index.d.ts.map +1 -1
  143. package/dist/crypto/index.js +6 -3
  144. package/dist/crypto/index.js.map +1 -1
  145. package/dist/datetime/index.d.ts +12 -2
  146. package/dist/datetime/index.d.ts.map +1 -1
  147. package/dist/datetime/index.js +6 -1
  148. package/dist/datetime/index.js.map +1 -1
  149. package/dist/email/brevo/index.d.ts +0 -1
  150. package/dist/email/brevo/index.d.ts.map +1 -1
  151. package/dist/email/brevo/index.js +4 -4
  152. package/dist/email/brevo/index.js.map +1 -1
  153. package/dist/email/cloudflare/index.d.ts +0 -1
  154. package/dist/email/cloudflare/index.d.ts.map +1 -1
  155. package/dist/email/cloudflare/index.js +2 -2
  156. package/dist/email/cloudflare/index.js.map +1 -1
  157. package/dist/email/core/index.d.ts +15 -7
  158. package/dist/email/core/index.d.ts.map +1 -1
  159. package/dist/email/core/index.js +14 -5
  160. package/dist/email/core/index.js.map +1 -1
  161. package/dist/email/core/index.workerd.js +5 -1
  162. package/dist/email/core/index.workerd.js.map +1 -1
  163. package/dist/email/smtp/index.d.ts +8 -9
  164. package/dist/email/smtp/index.d.ts.map +1 -1
  165. package/dist/email/smtp/index.js +702 -479
  166. package/dist/email/smtp/index.js.map +1 -1
  167. package/dist/fake/index.d.ts +1580 -1238
  168. package/dist/fake/index.d.ts.map +1 -1
  169. package/dist/fake/index.js +11728 -32131
  170. package/dist/fake/index.js.map +1 -1
  171. package/dist/lock/core/index.d.ts +13 -9
  172. package/dist/lock/core/index.d.ts.map +1 -1
  173. package/dist/lock/core/index.js +5 -5
  174. package/dist/lock/core/index.js.map +1 -1
  175. package/dist/lock/redis/index.d.ts +0 -1
  176. package/dist/lock/redis/index.d.ts.map +1 -1
  177. package/dist/lock/redis/index.js.map +1 -1
  178. package/dist/logger/index.d.ts +81 -69
  179. package/dist/logger/index.d.ts.map +1 -1
  180. package/dist/logger/index.js +123 -56
  181. package/dist/logger/index.js.map +1 -1
  182. package/dist/mcp/index.d.ts +27 -90
  183. package/dist/mcp/index.d.ts.map +1 -1
  184. package/dist/mcp/index.js +42 -70
  185. package/dist/mcp/index.js.map +1 -1
  186. package/dist/orm/core/index.browser.js +54 -40
  187. package/dist/orm/core/index.browser.js.map +1 -1
  188. package/dist/orm/core/index.bun.js +140 -106
  189. package/dist/orm/core/index.bun.js.map +1 -1
  190. package/dist/orm/core/index.d.ts +145 -150
  191. package/dist/orm/core/index.d.ts.map +1 -1
  192. package/dist/orm/core/index.js +144 -109
  193. package/dist/orm/core/index.js.map +1 -1
  194. package/dist/orm/postgres/index.bun.js +64 -54
  195. package/dist/orm/postgres/index.bun.js.map +1 -1
  196. package/dist/orm/postgres/index.d.ts +36 -76
  197. package/dist/orm/postgres/index.d.ts.map +1 -1
  198. package/dist/orm/postgres/index.js +67 -57
  199. package/dist/orm/postgres/index.js.map +1 -1
  200. package/dist/queue/core/index.d.ts +62 -75
  201. package/dist/queue/core/index.d.ts.map +1 -1
  202. package/dist/queue/core/index.js +48 -71
  203. package/dist/queue/core/index.js.map +1 -1
  204. package/dist/queue/core/index.workerd.js +48 -71
  205. package/dist/queue/core/index.workerd.js.map +1 -1
  206. package/dist/queue/redis/index.d.ts +3 -4
  207. package/dist/queue/redis/index.d.ts.map +1 -1
  208. package/dist/queue/redis/index.js +2 -2
  209. package/dist/queue/redis/index.js.map +1 -1
  210. package/dist/react/auth/index.browser.js.map +1 -1
  211. package/dist/react/auth/index.d.ts +7 -4
  212. package/dist/react/auth/index.d.ts.map +1 -1
  213. package/dist/react/auth/index.js.map +1 -1
  214. package/dist/react/core/index.d.ts +87 -5
  215. package/dist/react/core/index.d.ts.map +1 -1
  216. package/dist/react/core/index.js +170 -23
  217. package/dist/react/core/index.js.map +1 -1
  218. package/dist/react/form/index.d.ts +4 -5
  219. package/dist/react/form/index.d.ts.map +1 -1
  220. package/dist/react/form/index.js +91 -56
  221. package/dist/react/form/index.js.map +1 -1
  222. package/dist/react/head/index.browser.js.map +1 -1
  223. package/dist/react/head/index.d.ts +0 -1
  224. package/dist/react/head/index.d.ts.map +1 -1
  225. package/dist/react/head/index.js.map +1 -1
  226. package/dist/react/i18n/index.d.ts +4 -5
  227. package/dist/react/i18n/index.d.ts.map +1 -1
  228. package/dist/react/i18n/index.js +2 -2
  229. package/dist/react/i18n/index.js.map +1 -1
  230. package/dist/react/intro/index.d.ts +1 -4
  231. package/dist/react/intro/index.d.ts.map +1 -1
  232. package/dist/react/intro/index.js.map +1 -1
  233. package/dist/react/router/index.browser.js +60 -24
  234. package/dist/react/router/index.browser.js.map +1 -1
  235. package/dist/react/router/index.d.ts +378 -377
  236. package/dist/react/router/index.d.ts.map +1 -1
  237. package/dist/react/router/index.js +77 -41
  238. package/dist/react/router/index.js.map +1 -1
  239. package/dist/react/sitemap/index.d.ts +0 -1
  240. package/dist/react/sitemap/index.d.ts.map +1 -1
  241. package/dist/react/sitemap/index.js.map +1 -1
  242. package/dist/react/testing/index.d.ts +4 -5
  243. package/dist/react/testing/index.d.ts.map +1 -1
  244. package/dist/react/testing/index.js +41 -15
  245. package/dist/react/testing/index.js.map +1 -1
  246. package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
  247. package/dist/react/ui/index.d.ts +35 -34
  248. package/dist/react/ui/index.d.ts.map +1 -1
  249. package/dist/react/ui/index.js +12 -17
  250. package/dist/react/ui/index.js.map +1 -1
  251. package/dist/redis/index.bun.js +5 -5
  252. package/dist/redis/index.bun.js.map +1 -1
  253. package/dist/redis/index.d.ts +6 -7
  254. package/dist/redis/index.d.ts.map +1 -1
  255. package/dist/redis/index.js +6 -6
  256. package/dist/redis/index.js.map +1 -1
  257. package/dist/retry/index.d.ts +0 -1
  258. package/dist/retry/index.d.ts.map +1 -1
  259. package/dist/retry/index.js.map +1 -1
  260. package/dist/router/index.d.ts.map +1 -1
  261. package/dist/router/index.js.map +1 -1
  262. package/dist/scheduler/index.d.ts +4 -12
  263. package/dist/scheduler/index.d.ts.map +1 -1
  264. package/dist/scheduler/index.js +9 -4
  265. package/dist/scheduler/index.js.map +1 -1
  266. package/dist/scheduler/index.workerd.js +9 -4
  267. package/dist/scheduler/index.workerd.js.map +1 -1
  268. package/dist/security/index.browser.js +30 -28
  269. package/dist/security/index.browser.js.map +1 -1
  270. package/dist/security/index.d.ts +113 -44
  271. package/dist/security/index.d.ts.map +1 -1
  272. package/dist/security/index.js +452 -37
  273. package/dist/security/index.js.map +1 -1
  274. package/dist/server/auth/index.browser.js +19 -19
  275. package/dist/server/auth/index.browser.js.map +1 -1
  276. package/dist/server/auth/index.d.ts +198 -274
  277. package/dist/server/auth/index.d.ts.map +1 -1
  278. package/dist/server/auth/index.js +83 -621
  279. package/dist/server/auth/index.js.map +1 -1
  280. package/dist/server/cookies/index.browser.js +103 -5
  281. package/dist/server/cookies/index.browser.js.map +1 -1
  282. package/dist/server/cookies/index.d.ts +72 -5
  283. package/dist/server/cookies/index.d.ts.map +1 -1
  284. package/dist/server/cookies/index.js +103 -9
  285. package/dist/server/cookies/index.js.map +1 -1
  286. package/dist/server/core/index.browser.js +22 -27
  287. package/dist/server/core/index.browser.js.map +1 -1
  288. package/dist/server/core/index.d.ts +116 -85
  289. package/dist/server/core/index.d.ts.map +1 -1
  290. package/dist/server/core/index.js +105 -118
  291. package/dist/server/core/index.js.map +1 -1
  292. package/dist/server/cors/index.d.ts +9 -10
  293. package/dist/server/cors/index.d.ts.map +1 -1
  294. package/dist/server/cors/index.js +14 -26
  295. package/dist/server/cors/index.js.map +1 -1
  296. package/dist/server/etag/index.d.ts +2 -3
  297. package/dist/server/etag/index.d.ts.map +1 -1
  298. package/dist/server/etag/index.js.map +1 -1
  299. package/dist/server/health/index.d.ts +18 -19
  300. package/dist/server/health/index.d.ts.map +1 -1
  301. package/dist/server/health/index.js +6 -6
  302. package/dist/server/health/index.js.map +1 -1
  303. package/dist/server/links/index.browser.js +15 -18
  304. package/dist/server/links/index.browser.js.map +1 -1
  305. package/dist/server/links/index.d.ts +66 -67
  306. package/dist/server/links/index.d.ts.map +1 -1
  307. package/dist/server/links/index.js +29 -32
  308. package/dist/server/links/index.js.map +1 -1
  309. package/dist/server/metrics/index.d.ts +0 -1
  310. package/dist/server/metrics/index.d.ts.map +1 -1
  311. package/dist/server/metrics/index.js +10 -3
  312. package/dist/server/metrics/index.js.map +1 -1
  313. package/dist/server/proxy/index.d.ts +0 -1
  314. package/dist/server/proxy/index.d.ts.map +1 -1
  315. package/dist/server/proxy/index.js.map +1 -1
  316. package/dist/server/rate-limit/index.d.ts +8 -9
  317. package/dist/server/rate-limit/index.d.ts.map +1 -1
  318. package/dist/server/rate-limit/index.js +6 -12
  319. package/dist/server/rate-limit/index.js.map +1 -1
  320. package/dist/server/static/index.d.ts +0 -1
  321. package/dist/server/static/index.d.ts.map +1 -1
  322. package/dist/server/static/index.js.map +1 -1
  323. package/dist/server/swagger/index.d.ts +4 -4
  324. package/dist/server/swagger/index.d.ts.map +1 -1
  325. package/dist/server/swagger/index.js +37 -25
  326. package/dist/server/swagger/index.js.map +1 -1
  327. package/dist/sms/index.d.ts +0 -1
  328. package/dist/sms/index.d.ts.map +1 -1
  329. package/dist/sms/index.js.map +1 -1
  330. package/dist/system/index.browser.js.map +1 -1
  331. package/dist/system/index.d.ts +0 -1
  332. package/dist/system/index.d.ts.map +1 -1
  333. package/dist/system/index.js +2 -1
  334. package/dist/system/index.js.map +1 -1
  335. package/dist/system/index.workerd.js.map +1 -1
  336. package/dist/topic/core/index.d.ts +19 -20
  337. package/dist/topic/core/index.d.ts.map +1 -1
  338. package/dist/topic/core/index.js +8 -8
  339. package/dist/topic/core/index.js.map +1 -1
  340. package/dist/topic/redis/index.d.ts +3 -4
  341. package/dist/topic/redis/index.d.ts.map +1 -1
  342. package/dist/topic/redis/index.js +2 -2
  343. package/dist/topic/redis/index.js.map +1 -1
  344. package/package.json +22 -35
  345. package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
  346. package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
  347. package/src/api/audits/controllers/AdminAuditController.ts +41 -41
  348. package/src/api/audits/entities/audits.ts +22 -22
  349. package/src/api/audits/index.ts +6 -1
  350. package/src/api/audits/jobs/AuditJobs.ts +29 -0
  351. package/src/api/audits/parameters/AuditParameters.ts +51 -0
  352. package/src/api/audits/primitives/$audit.ts +24 -0
  353. package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
  354. package/src/api/audits/schemas/createAuditSchema.ts +18 -18
  355. package/src/api/audits/services/AuditService.ts +79 -7
  356. package/src/api/files/__tests__/FileController.spec.ts +5 -5
  357. package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
  358. package/src/api/files/controllers/FileController.ts +25 -25
  359. package/src/api/files/entities/files.ts +15 -15
  360. package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
  361. package/src/api/files/schemas/fileQuerySchema.ts +9 -9
  362. package/src/api/files/schemas/fileResourceSchema.ts +7 -9
  363. package/src/api/files/schemas/storageStatsSchema.ts +13 -13
  364. package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
  365. package/src/api/jobs/__tests__/$job.spec.ts +18 -18
  366. package/src/api/jobs/controllers/AdminJobController.ts +8 -8
  367. package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
  368. package/src/api/jobs/providers/JobProvider.ts +128 -12
  369. package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
  370. package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
  371. package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
  372. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
  373. package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
  374. package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
  375. package/src/api/jobs/services/JobService.ts +6 -6
  376. package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
  377. package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
  378. package/src/api/keys/entities/apiKeyEntity.ts +15 -15
  379. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
  380. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
  381. package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
  382. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
  383. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
  384. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
  385. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
  386. package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
  387. package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
  388. package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
  389. package/src/api/notifications/primitives/$notification.ts +43 -4
  390. package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
  391. package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
  392. package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
  393. package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
  394. package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
  395. package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
  396. package/src/api/notifications/services/NotificationSenderService.ts +38 -2
  397. package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
  398. package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
  399. package/src/api/oauth/controllers/OAuthController.ts +132 -12
  400. package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
  401. package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
  402. package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
  403. package/src/api/oauth/index.ts +1 -0
  404. package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
  405. package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
  406. package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
  407. package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
  408. package/src/api/oauth/services/OAuthClientService.ts +228 -15
  409. package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
  410. package/src/api/organizations/entities/organizations.ts +6 -6
  411. package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
  412. package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
  413. package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
  414. package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
  415. package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
  416. package/src/api/parameters/entities/parameters.ts +29 -16
  417. package/src/api/parameters/primitives/$parameter.ts +3 -3
  418. package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
  419. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
  420. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
  421. package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
  422. package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
  423. package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
  424. package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
  425. package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
  426. package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
  427. package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
  428. package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
  429. package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
  430. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
  431. package/src/api/parameters/services/ParameterProvider.ts +152 -65
  432. package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
  433. package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
  434. package/src/api/payments/controllers/PaymentController.ts +4 -4
  435. package/src/api/payments/entities/paymentIntents.ts +11 -11
  436. package/src/api/payments/entities/paymentMethods.ts +11 -11
  437. package/src/api/payments/entities/refunds.ts +9 -9
  438. package/src/api/payments/providers/PaymentProvider.ts +18 -0
  439. package/src/api/payments/schemas/intentSchemas.ts +25 -25
  440. package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
  441. package/src/api/payments/services/PaymentService.ts +60 -3
  442. package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
  443. package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
  444. package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
  445. package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
  446. package/src/api/subscriptions/entities/subscriptions.ts +22 -22
  447. package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
  448. package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
  449. package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
  450. package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
  451. package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
  452. package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
  453. package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
  454. package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
  455. package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
  456. package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
  457. package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
  458. package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
  459. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
  460. package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
  461. package/src/api/users/controllers/AdminIdentityController.ts +29 -19
  462. package/src/api/users/controllers/AdminSessionController.ts +37 -27
  463. package/src/api/users/controllers/AdminUserController.ts +75 -53
  464. package/src/api/users/controllers/MySessionController.ts +125 -0
  465. package/src/api/users/controllers/RealmController.ts +9 -10
  466. package/src/api/users/controllers/UserController.ts +55 -55
  467. package/src/api/users/entities/identities.ts +8 -8
  468. package/src/api/users/entities/sessions.ts +17 -17
  469. package/src/api/users/entities/users.ts +17 -17
  470. package/src/api/users/index.ts +3 -0
  471. package/src/api/users/notifications/UserNotifications.ts +76 -24
  472. package/src/api/users/primitives/$realm.ts +12 -26
  473. package/src/api/users/providers/RealmProvider.ts +0 -15
  474. package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
  475. package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
  476. package/src/api/users/schemas/createUserSchema.ts +2 -2
  477. package/src/api/users/schemas/identityQuerySchema.ts +4 -4
  478. package/src/api/users/schemas/identityResourceSchema.ts +3 -2
  479. package/src/api/users/schemas/loginSchema.ts +4 -4
  480. package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
  481. package/src/api/users/schemas/realmConfigSchema.ts +10 -24
  482. package/src/api/users/schemas/registerQuerySchema.ts +6 -6
  483. package/src/api/users/schemas/registerRequestSchema.ts +21 -43
  484. package/src/api/users/schemas/registerResponseSchema.ts +2 -2
  485. package/src/api/users/schemas/registerSchema.ts +13 -31
  486. package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
  487. package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
  488. package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
  489. package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
  490. package/src/api/users/schemas/updateUserSchema.ts +3 -4
  491. package/src/api/users/schemas/userQuerySchema.ts +7 -7
  492. package/src/api/users/services/RegistrationService.ts +25 -11
  493. package/src/api/users/services/UserService.ts +12 -6
  494. package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
  495. package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
  496. package/src/api/verifications/controllers/VerificationController.ts +13 -27
  497. package/src/api/verifications/entities/verifications.ts +13 -14
  498. package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
  499. package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
  500. package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
  501. package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
  502. package/src/api/verifications/services/VerificationService.ts +12 -0
  503. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
  504. package/src/batch/__tests__/$batch.spec.ts +22 -22
  505. package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
  506. package/src/bin/index.ts +1 -1
  507. package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
  508. package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
  509. package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
  510. package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
  511. package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
  512. package/src/cache/core/primitives/$cache.ts +7 -10
  513. package/src/cache/database/entities/cacheEntries.ts +16 -27
  514. package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
  515. package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
  516. package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
  517. package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
  518. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
  519. package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
  520. package/src/cli/core/atoms/appEntryOptions.ts +5 -5
  521. package/src/cli/core/atoms/buildOptions.ts +76 -76
  522. package/src/cli/core/atoms/changelogOptions.ts +3 -3
  523. package/src/cli/core/atoms/devOptions.ts +3 -3
  524. package/src/cli/core/commands/build.ts +36 -39
  525. package/src/cli/core/commands/db.ts +171 -83
  526. package/src/cli/core/commands/dev.ts +8 -8
  527. package/src/cli/core/commands/gen/changelog.ts +12 -14
  528. package/src/cli/core/commands/gen/env.ts +6 -6
  529. package/src/cli/core/commands/gen/openapi.ts +6 -6
  530. package/src/cli/core/commands/init.ts +28 -33
  531. package/src/cli/core/commands/pack.ts +10 -10
  532. package/src/cli/core/commands/root.ts +7 -8
  533. package/src/cli/core/commands/test.ts +17 -20
  534. package/src/cli/core/tasks/BuildCloudflareTask.ts +103 -230
  535. package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
  536. package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
  537. package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
  538. package/src/cli/platform/commands/SecretsCommand.ts +24 -25
  539. package/src/cli/platform/commands/platform.ts +40 -46
  540. package/src/cli/platform/index.ts +1 -1
  541. package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
  542. package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
  543. package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
  544. package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +13 -14
  545. package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
  546. package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
  547. package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
  548. package/src/cli/platform-lib/schemas/platform.ts +51 -51
  549. package/src/cli/platform-lib/schemas/vercel.ts +28 -28
  550. package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
  551. package/src/cli/platform-lib/services/VercelApi.ts +4 -4
  552. package/src/cli/platform-lib/services/VercelCli.ts +6 -15
  553. package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
  554. package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
  555. package/src/cli/vendor/commands/VendorCommand.ts +11 -12
  556. package/src/command/__tests__/$command.spec.ts +82 -83
  557. package/src/command/__tests__/Asker.spec.ts +6 -13
  558. package/src/command/__tests__/CliProvider.spec.ts +136 -149
  559. package/src/command/__tests__/Runner.spec.ts +86 -110
  560. package/src/command/helpers/Asker.ts +23 -58
  561. package/src/command/helpers/Runner.ts +34 -110
  562. package/src/command/index.ts +4 -9
  563. package/src/command/primitives/$command.ts +10 -10
  564. package/src/command/providers/CliProvider.ts +183 -161
  565. package/src/core/Alepha.ts +62 -13
  566. package/src/core/__tests__/$atom.spec.ts +52 -3
  567. package/src/core/__tests__/$computed.spec.ts +129 -0
  568. package/src/core/__tests__/$env.spec.ts +13 -13
  569. package/src/core/__tests__/$inject.spec.ts +4 -4
  570. package/src/core/__tests__/$module.spec.ts +1 -1
  571. package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
  572. package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
  573. package/src/core/__tests__/Alepha-start.spec.ts +3 -3
  574. package/src/core/__tests__/CodecManager.spec.ts +113 -94
  575. package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
  576. package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
  577. package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
  578. package/src/core/__tests__/StateManager.spec.ts +423 -0
  579. package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
  580. package/src/core/__tests__/TypeProvider.spec.ts +314 -309
  581. package/src/core/__tests__/dump.spec.ts +6 -6
  582. package/src/core/__tests__/pagination.spec.ts +4 -4
  583. package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
  584. package/src/core/errors/TypeBoxError.ts +10 -4
  585. package/src/core/helpers/FileLike.ts +5 -5
  586. package/src/core/helpers/coerceStrings.ts +70 -0
  587. package/src/core/helpers/jsonSchemaToZod.ts +112 -0
  588. package/src/core/index.shared.ts +4 -1
  589. package/src/core/primitives/$atom.ts +95 -27
  590. package/src/core/primitives/$computed.ts +148 -0
  591. package/src/core/primitives/$env.ts +5 -5
  592. package/src/core/primitives/$state.ts +1 -1
  593. package/src/core/providers/AlsProvider.ts +26 -0
  594. package/src/core/providers/CodecManager.ts +1 -2
  595. package/src/core/providers/JsonSchemaCodec.ts +1 -2
  596. package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
  597. package/src/core/providers/SchemaValidator.ts +48 -158
  598. package/src/core/providers/StateManager.ts +383 -9
  599. package/src/core/providers/TypeProvider.ts +80 -734
  600. package/src/core/providers/ZodProvider.ts +380 -0
  601. package/src/core/providers/zodAugment.ts +69 -0
  602. package/src/core/schemas/pageQuerySchema.ts +19 -21
  603. package/src/core/schemas/pageSchema.ts +47 -57
  604. package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
  605. package/src/crypto/providers/SecretProvider.ts +16 -10
  606. package/src/datetime/primitives/$throttle.ts +6 -1
  607. package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
  608. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
  609. package/src/email/core/index.ts +7 -2
  610. package/src/email/core/primitives/$email.ts +5 -1
  611. package/src/email/core/providers/LocalEmailProvider.ts +5 -5
  612. package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
  613. package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
  614. package/src/fake/__tests__/keyName.example.ts +21 -21
  615. package/src/fake/__tests__/keyName.spec.ts +41 -41
  616. package/src/fake/__tests__/module.example.ts +8 -8
  617. package/src/fake/providers/FakeProvider.ts +122 -121
  618. package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
  619. package/src/lock/core/index.ts +1 -0
  620. package/src/lock/core/primitives/$lock.ts +13 -6
  621. package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
  622. package/src/logger/__tests__/Logger.spec.ts +49 -0
  623. package/src/logger/index.ts +25 -18
  624. package/src/logger/providers/CliFormatterProvider.ts +75 -0
  625. package/src/logger/schemas/logEntrySchema.ts +10 -10
  626. package/src/logger/services/Logger.ts +18 -0
  627. package/src/mcp/__tests__/$prompt.spec.ts +21 -23
  628. package/src/mcp/__tests__/$tool.spec.ts +22 -22
  629. package/src/mcp/__tests__/McpServerProvider.spec.ts +11 -11
  630. package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
  631. package/src/mcp/__tests__/integration.spec.ts +33 -33
  632. package/src/mcp/primitives/$prompt.ts +11 -9
  633. package/src/mcp/primitives/$tool.ts +27 -86
  634. package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
  635. package/src/orm/__tests__/$repository-tests.ts +133 -27
  636. package/src/orm/__tests__/$repository.spec.ts +23 -0
  637. package/src/orm/__tests__/$transactional-tests.ts +4 -4
  638. package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
  639. package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
  640. package/src/orm/__tests__/QueryManager.spec.ts +5 -5
  641. package/src/orm/__tests__/delete-returning-tests.ts +11 -11
  642. package/src/orm/__tests__/deletedAt-tests.ts +3 -3
  643. package/src/orm/__tests__/enums.spec.ts +29 -25
  644. package/src/orm/__tests__/execute-tests.ts +8 -8
  645. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
  646. package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
  647. package/src/orm/__tests__/joins-tests.ts +30 -30
  648. package/src/orm/__tests__/organization-tests.ts +105 -3
  649. package/src/orm/__tests__/organization.spec.ts +46 -0
  650. package/src/orm/__tests__/orm-errors.spec.ts +10 -10
  651. package/src/orm/__tests__/orm-next-tests.ts +29 -29
  652. package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
  653. package/src/orm/__tests__/primaryKey.spec.ts +4 -4
  654. package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
  655. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
  656. package/src/orm/__tests__/references.spec.ts +7 -7
  657. package/src/orm/__tests__/security.spec.ts +17 -17
  658. package/src/orm/__tests__/string-operators-tests.ts +5 -5
  659. package/src/orm/__tests__/timestamps-tests.ts +14 -14
  660. package/src/orm/__tests__/validation-tests.ts +5 -5
  661. package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
  662. package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
  663. package/src/orm/core/entities/alephaSequences.ts +8 -8
  664. package/src/orm/core/helpers/pgAttr.ts +4 -4
  665. package/src/orm/core/primitives/$entity.ts +10 -6
  666. package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
  667. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
  668. package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
  669. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
  670. package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
  671. package/src/orm/core/schemas/insertSchema.ts +14 -18
  672. package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
  673. package/src/orm/core/schemas/updateSchema.ts +10 -16
  674. package/src/orm/core/services/PgRelationManager.ts +2 -2
  675. package/src/orm/core/services/QueryManager.ts +13 -2
  676. package/src/orm/core/services/Repository.ts +88 -33
  677. package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
  678. package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
  679. package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
  680. package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
  681. package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
  682. package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
  683. package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
  684. package/src/queue/core/__tests__/shared.ts +6 -6
  685. package/src/queue/core/primitives/$consumer.ts +5 -5
  686. package/src/queue/core/primitives/$queue.ts +44 -61
  687. package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
  688. package/src/queue/core/providers/WorkerProvider.ts +17 -14
  689. package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
  690. package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
  691. package/src/react/core/__tests__/Router.spec.tsx +4 -4
  692. package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
  693. package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
  694. package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
  695. package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
  696. package/src/react/core/components/ErrorBoundary.tsx +42 -0
  697. package/src/react/core/hooks/useAction.ts +56 -19
  698. package/src/react/core/hooks/useComputed.ts +91 -0
  699. package/src/react/core/hooks/useSelector.ts +67 -0
  700. package/src/react/core/hooks/useStore.ts +36 -17
  701. package/src/react/core/index.ts +3 -0
  702. package/src/react/core/utils/shallowEqual.ts +36 -0
  703. package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +2 -2
  704. package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +5 -5
  705. package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
  706. package/src/react/form/errors/FormValidationError.ts +0 -2
  707. package/src/react/form/hooks/useForm.ts +19 -4
  708. package/src/react/form/hooks/useFormQuerySync.ts +0 -0
  709. package/src/react/form/services/FormModel.ts +67 -47
  710. package/src/react/form/services/parseField.ts +66 -27
  711. package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
  712. package/src/react/i18n/providers/I18nProvider.ts +2 -2
  713. package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
  714. package/src/react/router/__tests__/$page.spec.tsx +21 -21
  715. package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
  716. package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
  717. package/src/react/router/components/NestedView.tsx +11 -3
  718. package/src/react/router/hooks/useQueryParams.ts +1 -1
  719. package/src/react/router/primitives/$page.ts +2 -2
  720. package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
  721. package/src/react/router/providers/ReactPageProvider.ts +26 -12
  722. package/src/react/router/providers/ReactServerProvider.ts +13 -15
  723. package/src/react/sitemap/__tests__/$sitemap.spec.ts +2 -2
  724. package/src/react/ui/atoms/uiAtom.ts +6 -6
  725. package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
  726. package/src/react/ui/hooks/useColorMode.ts +11 -4
  727. package/src/react/ui/services/SchemaControl.ts +4 -4
  728. package/src/redis/providers/BunRedisProvider.ts +19 -11
  729. package/src/redis/providers/NodeRedisProvider.ts +3 -3
  730. package/src/scheduler/primitives/$scheduler.ts +21 -8
  731. package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
  732. package/src/security/atoms/currentTenantAtom.ts +6 -6
  733. package/src/security/atoms/currentUserAtom.ts +2 -2
  734. package/src/security/primitives/$issuer.ts +24 -2
  735. package/src/security/providers/JwtProvider.ts +100 -0
  736. package/src/security/providers/SecurityProvider.ts +43 -2
  737. package/src/security/schemas/permissionSchema.ts +19 -19
  738. package/src/security/schemas/roleSchema.ts +22 -28
  739. package/src/security/schemas/userAccountInfoSchema.ts +47 -37
  740. package/src/server/auth/index.ts +0 -3
  741. package/src/server/auth/primitives/$auth.ts +6 -6
  742. package/src/server/auth/primitives/$authApple.ts +10 -10
  743. package/src/server/auth/primitives/$authFacebook.ts +10 -10
  744. package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
  745. package/src/server/auth/primitives/$authGithub.ts +10 -10
  746. package/src/server/auth/primitives/$authGoogle.ts +10 -10
  747. package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
  748. package/src/server/auth/providers/ServerAuthProvider.ts +49 -48
  749. package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
  750. package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
  751. package/src/server/auth/schemas/tokensSchema.ts +16 -16
  752. package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
  753. package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
  754. package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
  755. package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
  756. package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +14 -14
  757. package/src/server/cookies/index.browser.ts +4 -1
  758. package/src/server/cookies/index.ts +8 -1
  759. package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
  760. package/src/server/cookies/primitives/$cookie.ts +16 -0
  761. package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
  762. package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
  763. package/src/server/cookies/providers/ServerCookiesProvider.ts +13 -5
  764. package/src/server/cookies/services/CookieParser.ts +6 -1
  765. package/src/server/core/__tests__/$action.spec.ts +13 -13
  766. package/src/server/core/__tests__/$middleware.spec.ts +10 -10
  767. package/src/server/core/__tests__/$route.spec.ts +9 -9
  768. package/src/server/core/__tests__/$sse.spec.ts +26 -26
  769. package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
  770. package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
  771. package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
  772. package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
  773. package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
  774. package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
  775. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
  776. package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
  777. package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
  778. package/src/server/core/errors/ValidationError.ts +6 -3
  779. package/src/server/core/helpers/isMultipart.ts +2 -1
  780. package/src/server/core/index.ts +5 -2
  781. package/src/server/core/interfaces/ServerRequest.ts +6 -14
  782. package/src/server/core/primitives/$action.ts +26 -36
  783. package/src/server/core/primitives/$sse.ts +3 -3
  784. package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
  785. package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
  786. package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
  787. package/src/server/core/providers/ServerCompressProvider.ts +9 -10
  788. package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
  789. package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
  790. package/src/server/core/providers/ServerRouterProvider.ts +44 -15
  791. package/src/server/core/schemas/errorSchema.ts +20 -25
  792. package/src/server/core/schemas/okSchema.ts +9 -14
  793. package/src/server/core/services/HttpClient.ts +13 -1
  794. package/src/server/core/services/ServerRequestParser.ts +6 -6
  795. package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
  796. package/src/server/health/schemas/healthSchema.ts +6 -6
  797. package/src/server/links/__tests__/$remote.spec.ts +3 -3
  798. package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
  799. package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
  800. package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
  801. package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
  802. package/src/server/links/atoms/apiLinksAtom.ts +2 -2
  803. package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
  804. package/src/server/links/primitives/$remote.ts +3 -3
  805. package/src/server/links/providers/LinkProvider.ts +3 -3
  806. package/src/server/links/providers/ServerLinksProvider.ts +20 -20
  807. package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
  808. package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
  809. package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
  810. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
  811. package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
  812. package/src/server/swagger/__tests__/ui.spec.ts +3 -3
  813. package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
  814. package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
  815. package/src/system/providers/NodeShellProvider.ts +4 -1
  816. package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
  817. package/src/topic/core/__tests__/shared.ts +8 -8
  818. package/src/topic/core/primitives/$subscriber.ts +5 -5
  819. package/src/topic/core/primitives/$topic.ts +14 -14
  820. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  821. package/dist/container/core/index.d.ts +0 -236
  822. package/dist/container/core/index.d.ts.map +0 -1
  823. package/dist/container/core/index.js +0 -231
  824. package/dist/container/core/index.js.map +0 -1
  825. package/dist/container/core/index.workerd.js +0 -192
  826. package/dist/container/core/index.workerd.js.map +0 -1
  827. package/src/command/helpers/PrettyAsker.ts +0 -256
  828. package/src/command/helpers/PrettyPrint.ts +0 -332
  829. package/src/container/core/__tests__/$container.spec.ts +0 -83
  830. package/src/container/core/index.ts +0 -50
  831. package/src/container/core/index.workerd.ts +0 -53
  832. package/src/container/core/interfaces/ContainerOptions.ts +0 -69
  833. package/src/container/core/primitives/$container.ts +0 -100
  834. package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
  835. package/src/container/core/providers/ContainerProvider.ts +0 -92
  836. package/src/container/core/providers/MockContainerProvider.ts +0 -62
  837. package/src/container/core/providers/NodeContainerProvider.ts +0 -53
  838. package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
  839. package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
  840. package/src/server/auth/__tests__/authFederationClient.spec.ts +0 -40
  841. package/src/server/auth/__tests__/federationAssertion.spec.ts +0 -146
  842. package/src/server/auth/helpers/federationAssertion.ts +0 -74
  843. package/src/server/auth/primitives/$authFederationBroker.ts +0 -273
  844. package/src/server/auth/primitives/$authFederationClient.ts +0 -89
  845. /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/react/intro/components/GettingStartedAdminSlide.tsx","../../../src/react/intro/components/GettingStartedAuthSlide.tsx","../../../src/react/intro/components/GettingStartedDevtoolsSlide.tsx","../../../src/react/intro/components/GettingStarted.tsx"],"sourcesContent":["import { useAuth } from \"alepha/react/auth\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the admin slide content.\n * Content changes based on user status and admin permissions.\n * Returns undefined if admin routes are not configured.\n */\nexport const useAdminSlide = (): GettingStartedSlide | undefined => {\n const { user, has } = useAuth();\n const router = useRouter();\n\n // Check if admin routes exist\n const hasAdmin = router.pages.find((it) => it.name === \"adminLayout\");\n if (!hasAdmin) {\n return undefined;\n }\n\n const adminAnchorProps = router.anchor(router.path(\"adminLayout\"));\n const canAccessAdmin = has(\"admin:*\");\n\n // User is admin - show success message\n if (canAccessAdmin) {\n return {\n text: \"You're in control.\",\n sub: \"Admin access granted.\",\n steps: [\n {\n num: \"✓\",\n text: \"You have admin privileges\",\n },\n {\n num: \"→\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a> to manage your\n application\n </>\n ),\n },\n ],\n };\n }\n\n // User is logged in but not admin - show how to become admin\n if (user) {\n return {\n text: \"Take the wheel.\",\n sub: \"Become admin in two steps.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Add your email to <code>adminEmails</code> in{\" \"}\n <code>AppSecurity.ts</code>\n </>\n ),\n },\n {\n num: \"2\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a>\n </>\n ),\n },\n ],\n };\n }\n\n // User is not logged in - show full instructions\n return {\n text: \"Take the wheel.\",\n sub: \"Become admin in three steps.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Add your email to <code>adminEmails</code> in{\" \"}\n <code>AppSecurity.ts</code>\n </>\n ),\n },\n { num: \"2\", text: \"Create a user account with that email\" },\n {\n num: \"3\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a>\n </>\n ),\n },\n ],\n };\n};\n","import { useAuth } from \"alepha/react/auth\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the auth slide content.\n * Content changes based on whether user is logged in.\n * Returns undefined if auth routes are not configured.\n */\nexport const useAuthSlide = (): GettingStartedSlide | undefined => {\n const { user, logout } = useAuth();\n const router = useRouter();\n\n // Check if auth routes exist\n const hasAuth = router.pages.find((it) => it.name === \"authLayout\");\n if (!hasAuth) {\n return undefined;\n }\n\n // User is logged in - show user info and logout option\n if (user) {\n return {\n text: \"Welcome back!\",\n sub: `You're signed in as ${user.email || user.username || \"user\"}.`,\n steps: [\n {\n num: \"✓\",\n text: \"Authentication is working correctly\",\n },\n {\n num: \"→\",\n text: (\n <>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n logout();\n }}\n >\n Sign out\n </a>{\" \"}\n to test the login flow\n </>\n ),\n },\n ],\n };\n }\n\n // User is not logged in - show signup instructions\n const authAnchorProps = router.anchor(router.path(\"login\"));\n\n return {\n text: \"Who are you?\",\n sub: \"Create your first account.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Sign up at <a {...authAnchorProps}>/auth/login</a>\n </>\n ),\n },\n {\n num: \"2\",\n text: (\n <>\n Customize in <code>src/api/AppSecurity.ts</code>\n </>\n ),\n },\n ],\n };\n};\n","import type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the devtools slide content.\n * Only shown when @alepha/devtools is installed and enabled.\n * Returns undefined if devtools are not available.\n */\nexport const useDevtoolsSlide = (): GettingStartedSlide | undefined => {\n if (!import.meta.env?.VITE_ALEPHA_DEVTOOLS) {\n return undefined;\n }\n\n return {\n text: \"Inspect everything.\",\n sub: \"DevTools are built in.\",\n steps: [\n {\n num: \"→\",\n text: (\n <>\n Open{\" \"}\n <a href=\"/__devtools/\" target=\"_blank\" rel=\"noopener noreferrer\">\n /__devtools\n </a>{\" \"}\n to explore your app\n </>\n ),\n },\n {\n num: \"✓\",\n text: \"Browse entities, logs, configuration and dependencies\",\n },\n ],\n };\n};\n","import type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useAdminSlide } from \"./GettingStartedAdminSlide.tsx\";\nimport { useAuthSlide } from \"./GettingStartedAuthSlide.tsx\";\nimport { useDevtoolsSlide } from \"./GettingStartedDevtoolsSlide.tsx\";\n\nexport type GettingStartedStep = {\n num: string;\n text: ReactNode;\n};\n\nexport type GettingStartedSlide = {\n text: string;\n sub: string;\n detail?: string;\n steps?: GettingStartedStep[];\n links?: { label: string; href: string }[];\n};\n\nexport type GettingStartedWelcome = {\n appName: string;\n serverTime: string;\n};\n\nexport type GettingStartedProps = {\n /**\n * Welcome data loaded from the server via SSR.\n *\n * When provided, displays app name and server timestamp on the first slide,\n * demonstrating the full SSR → hydration data flow.\n */\n welcome?: GettingStartedWelcome;\n};\n\nconst defaultFirstSlide: GettingStartedSlide = {\n text: \"Let's begin.\",\n sub: \"Every story starts with a blank page.\",\n detail: \"This one is yours.\",\n};\n\nconst helpSlide: GettingStartedSlide = {\n text: \"Need help?\",\n sub: \"We've got you covered.\",\n detail: \"Even our AI friends can read the docs.\",\n links: [\n { label: \"alepha.dev\", href: \"https://alepha.dev\" },\n { label: \"llms.txt\", href: \"https://alepha.dev/llms.txt\" },\n ],\n};\n\nconst formatServerTime = (isoString: string): string => {\n try {\n const date = new Date(isoString);\n return date.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n } catch {\n return isoString;\n }\n};\n\n/**\n * A welcome component displayed when creating a new Alepha application.\n */\nconst GettingStarted = ({ welcome }: GettingStartedProps) => {\n const [index, setIndex] = useState(0);\n const [direction, setDirection] = useState<\"next\" | \"prev\">(\"next\");\n\n // Get auth-aware slide content (hooks return undefined if routes don't exist)\n const authSlide = useAuthSlide();\n const adminSlide = useAdminSlide();\n const devtoolsSlide = useDevtoolsSlide();\n\n const filteredMessages = useMemo(() => {\n const result: GettingStartedSlide[] = [];\n\n // First slide: use welcome data if provided, otherwise default\n if (welcome) {\n result.push({\n ...defaultFirstSlide,\n detail: `Server time: ${formatServerTime(welcome.serverTime)} - App: ${welcome.appName}`,\n });\n } else {\n result.push(defaultFirstSlide);\n }\n\n // Add auth slide if auth routes exist\n if (authSlide) {\n result.push(authSlide);\n }\n\n // Add admin slide if admin routes exist\n if (adminSlide) {\n result.push(adminSlide);\n }\n\n // Add devtools slide in non-production environments\n if (devtoolsSlide) {\n result.push(devtoolsSlide);\n }\n\n // Add \"Need help?\" message\n result.push(helpSlide);\n\n return result;\n }, [welcome, authSlide, adminSlide, devtoolsSlide]);\n\n const current = filteredMessages[index];\n\n const prev = useCallback(() => {\n setDirection(\"prev\");\n setIndex(\n (i) => (i - 1 + filteredMessages.length) % filteredMessages.length,\n );\n }, [filteredMessages.length]);\n\n const next = useCallback(() => {\n setDirection(\"next\");\n setIndex((i) => (i + 1) % filteredMessages.length);\n }, [filteredMessages.length]);\n\n const goTo = useCallback(\n (i: number) => {\n setDirection(i > index ? \"next\" : \"prev\");\n setIndex(i);\n },\n [index],\n );\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"ArrowLeft\") {\n prev();\n } else if (e.key === \"ArrowRight\") {\n next();\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [prev, next]);\n\n return (\n <>\n <style>{styles}</style>\n <main className=\"alepha-blank\">\n <div className=\"alepha-blank-content\">\n <div className=\"alepha-blank-text-block\">\n <h1\n className={`alepha-blank-message alepha-blank-slide-${direction}`}\n key={index}\n >\n {current.text}\n </h1>\n <p\n className={`alepha-blank-sub alepha-blank-slide-${direction}`}\n key={`sub-${index}`}\n >\n {current.sub}\n </p>\n {current.detail && (\n <p\n className={`alepha-blank-detail alepha-blank-slide-${direction}`}\n key={`detail-${index}`}\n >\n {current.detail}\n </p>\n )}\n {current.steps && (\n <div\n className={`alepha-blank-steps alepha-blank-slide-${direction}`}\n key={`steps-${index}`}\n >\n {current.steps.map((step, i) => (\n <div\n key={i}\n className=\"alepha-blank-step\"\n style={{ animationDelay: `${0.15 + i * 0.08}s` }}\n >\n <span className=\"alepha-blank-step-num\">{step.num}</span>\n <span className=\"alepha-blank-step-text\">{step.text}</span>\n </div>\n ))}\n </div>\n )}\n {current.links && (\n <div\n className={`alepha-blank-links alepha-blank-slide-${direction}`}\n key={`links-${index}`}\n >\n {current.links.map((link, i) => (\n <a\n key={link.href}\n href={link.href}\n target={link.href.startsWith(\"http\") ? \"_blank\" : undefined}\n rel={\n link.href.startsWith(\"http\")\n ? \"noopener noreferrer\"\n : undefined\n }\n style={{ animationDelay: `${0.1 + i * 0.05}s` }}\n >\n {link.label}\n </a>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"alepha-blank-slider\">\n <button\n className=\"alepha-blank-nav-btn\"\n onClick={prev}\n aria-label=\"Previous\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M9 3L5 7L9 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <div className=\"alepha-blank-dots\">\n {filteredMessages.map((_, i) => (\n <button\n key={i}\n className={`alepha-blank-dot ${i === index ? \"active\" : \"\"}`}\n onClick={() => goTo(i)}\n aria-label={`Go to message ${i + 1}`}\n />\n ))}\n </div>\n <button\n className=\"alepha-blank-nav-btn\"\n onClick={next}\n aria-label=\"Next\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M5 3L9 7L5 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"alepha-blank-hint\">\n <kbd>←</kbd> <kbd>→</kbd> to navigate\n </div>\n </div>\n </main>\n </>\n );\n};\n\nexport default GettingStarted;\n\nconst styles = `\n.alepha-blank {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100svh;\n background: #fafafa;\n font-family: system-ui, -apple-system, sans-serif;\n color: #171717;\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n width: 100%;\n}\n\n.alepha-blank-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n max-width: 640px;\n}\n\n.alepha-blank-text-block {\n min-height: 320px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n\n.alepha-blank-message {\n font-size: clamp(2rem, 8vw, 3rem);\n font-weight: 600;\n letter-spacing: -0.02em;\n margin: 0;\n line-height: 1.1;\n}\n\n.alepha-blank-sub {\n font-size: 1.0625rem;\n color: #525252;\n margin: 1rem 0 0;\n font-weight: 400;\n line-height: 1.5;\n}\n\n.alepha-blank-detail {\n font-size: 0.875rem;\n color: #a3a3a3;\n margin: 0.5rem 0 0;\n font-weight: 400;\n line-height: 1.5;\n}\n\n.alepha-blank-slide-next {\n animation: alepha-blank-slideNext 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n\n.alepha-blank-slide-prev {\n animation: alepha-blank-slidePrev 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n\n@keyframes alepha-blank-slideNext {\n from {\n opacity: 0;\n transform: translateX(20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes alepha-blank-slidePrev {\n from {\n opacity: 0;\n transform: translateX(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.alepha-blank-steps {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n margin-top: 1.25rem;\n text-align: left;\n}\n\n.alepha-blank-step {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 0.25rem 0;\n opacity: 0;\n animation: alepha-blank-stepIn 0.4s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n}\n\n.alepha-blank-step-num {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: #171717;\n color: #fff;\n font-size: 0.6875rem;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.alepha-blank-step-text {\n font-size: 0.8125rem;\n color: #525252;\n line-height: 1.5;\n}\n\n.alepha-blank-step-text code {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.75rem;\n background: #f5f5f5;\n color: #171717;\n padding: 0.0625rem 0.375rem;\n border-radius: 3px;\n border: 1px solid #e5e5e5;\n}\n\n.alepha-blank-step-text a {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n color: #525252;\n text-decoration: underline;\n text-underline-offset: 2px;\n transition: color 0.15s ease;\n}\n\n.alepha-blank-step-text a:hover {\n color: #171717;\n}\n\n@keyframes alepha-blank-stepIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.alepha-blank-links {\n display: flex;\n gap: 1.5rem;\n margin-top: 1.25rem;\n}\n\n.alepha-blank-links a {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.875rem;\n color: #525252;\n text-decoration: none;\n position: relative;\n opacity: 0;\n animation: alepha-blank-fadeIn 0.3s ease-out forwards;\n transition: color 0.2s ease;\n}\n\n.alepha-blank-links a::after {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n bottom: -2px;\n height: 1px;\n background: #a3a3a3;\n transform: scaleX(1);\n transform-origin: left;\n transition:\n transform 0.25s cubic-bezier(0.22, 1, 0.36, 1),\n background 0.2s ease;\n}\n\n.alepha-blank-links a:hover {\n color: #171717;\n}\n\n.alepha-blank-links a:hover::after {\n background: #171717;\n transform: scaleX(1.05);\n}\n\n.alepha-blank-slider {\n display: flex;\n align-items: center;\n gap: 1rem;\n margin-top: 2.5rem;\n}\n\n.alepha-blank-dots {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.alepha-blank-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: transparent;\n border: 1.5px solid #d4d4d4;\n padding: 0;\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.alepha-blank-dot:hover {\n border-color: #a3a3a3;\n transform: scale(1.2);\n}\n\n.alepha-blank-dot:focus-visible {\n outline: 2px solid #737373;\n outline-offset: 2px;\n}\n\n.alepha-blank-dot.active {\n background: #737373;\n border-color: #737373;\n transform: scale(1.1);\n}\n\n.alepha-blank-nav-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n font-family: inherit;\n background: transparent;\n color: #a3a3a3;\n border: 1.5px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.alepha-blank-nav-btn:hover {\n color: #525252;\n background: #f0f0f0;\n}\n\n.alepha-blank-nav-btn:focus-visible {\n outline: none;\n border-color: #737373;\n color: #525252;\n}\n\n.alepha-blank-nav-btn:active {\n transform: scale(0.92);\n background: #e5e5e5;\n}\n\n.alepha-blank-hint {\n margin-top: 2rem;\n font-size: 0.75rem;\n color: #a3a3a3;\n display: flex;\n align-items: center;\n gap: 0.375rem;\n opacity: 0;\n animation: alepha-blank-fadeIn 0.5s ease-out 0.5s forwards;\n}\n\n.alepha-blank-hint kbd {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.6875rem;\n background: #f0f0f0;\n border: 1px solid #e5e5e5;\n border-radius: 4px;\n padding: 0.125rem 0.375rem;\n box-shadow: 0 1px 0 #d4d4d4;\n}\n\n@keyframes alepha-blank-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .alepha-blank-slide-next,\n .alepha-blank-slide-prev,\n .alepha-blank-links a,\n .alepha-blank-hint,\n .alepha-blank-step {\n animation: none;\n opacity: 1;\n }\n\n .alepha-blank-dot,\n .alepha-blank-nav-btn,\n .alepha-blank-links a,\n .alepha-blank-links a::after {\n transition: none;\n }\n}\n`;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/react/intro/components/GettingStartedAdminSlide.tsx","../../../src/react/intro/components/GettingStartedAuthSlide.tsx","../../../src/react/intro/components/GettingStartedDevtoolsSlide.tsx","../../../src/react/intro/components/GettingStarted.tsx"],"sourcesContent":["import { useAuth } from \"alepha/react/auth\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the admin slide content.\n * Content changes based on user status and admin permissions.\n * Returns undefined if admin routes are not configured.\n */\nexport const useAdminSlide = (): GettingStartedSlide | undefined => {\n const { user, has } = useAuth();\n const router = useRouter();\n\n // Check if admin routes exist\n const hasAdmin = router.pages.find((it) => it.name === \"adminLayout\");\n if (!hasAdmin) {\n return undefined;\n }\n\n const adminAnchorProps = router.anchor(router.path(\"adminLayout\"));\n const canAccessAdmin = has(\"admin:*\");\n\n // User is admin - show success message\n if (canAccessAdmin) {\n return {\n text: \"You're in control.\",\n sub: \"Admin access granted.\",\n steps: [\n {\n num: \"✓\",\n text: \"You have admin privileges\",\n },\n {\n num: \"→\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a> to manage your\n application\n </>\n ),\n },\n ],\n };\n }\n\n // User is logged in but not admin - show how to become admin\n if (user) {\n return {\n text: \"Take the wheel.\",\n sub: \"Become admin in two steps.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Add your email to <code>adminEmails</code> in{\" \"}\n <code>AppSecurity.ts</code>\n </>\n ),\n },\n {\n num: \"2\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a>\n </>\n ),\n },\n ],\n };\n }\n\n // User is not logged in - show full instructions\n return {\n text: \"Take the wheel.\",\n sub: \"Become admin in three steps.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Add your email to <code>adminEmails</code> in{\" \"}\n <code>AppSecurity.ts</code>\n </>\n ),\n },\n { num: \"2\", text: \"Create a user account with that email\" },\n {\n num: \"3\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a>\n </>\n ),\n },\n ],\n };\n};\n","import { useAuth } from \"alepha/react/auth\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the auth slide content.\n * Content changes based on whether user is logged in.\n * Returns undefined if auth routes are not configured.\n */\nexport const useAuthSlide = (): GettingStartedSlide | undefined => {\n const { user, logout } = useAuth();\n const router = useRouter();\n\n // Check if auth routes exist\n const hasAuth = router.pages.find((it) => it.name === \"authLayout\");\n if (!hasAuth) {\n return undefined;\n }\n\n // User is logged in - show user info and logout option\n if (user) {\n return {\n text: \"Welcome back!\",\n sub: `You're signed in as ${user.email || user.username || \"user\"}.`,\n steps: [\n {\n num: \"✓\",\n text: \"Authentication is working correctly\",\n },\n {\n num: \"→\",\n text: (\n <>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n logout();\n }}\n >\n Sign out\n </a>{\" \"}\n to test the login flow\n </>\n ),\n },\n ],\n };\n }\n\n // User is not logged in - show signup instructions\n const authAnchorProps = router.anchor(router.path(\"login\"));\n\n return {\n text: \"Who are you?\",\n sub: \"Create your first account.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Sign up at <a {...authAnchorProps}>/auth/login</a>\n </>\n ),\n },\n {\n num: \"2\",\n text: (\n <>\n Customize in <code>src/api/AppSecurity.ts</code>\n </>\n ),\n },\n ],\n };\n};\n","import type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the devtools slide content.\n * Only shown when @alepha/devtools is installed and enabled.\n * Returns undefined if devtools are not available.\n */\nexport const useDevtoolsSlide = (): GettingStartedSlide | undefined => {\n if (!import.meta.env?.VITE_ALEPHA_DEVTOOLS) {\n return undefined;\n }\n\n return {\n text: \"Inspect everything.\",\n sub: \"DevTools are built in.\",\n steps: [\n {\n num: \"→\",\n text: (\n <>\n Open{\" \"}\n <a href=\"/__devtools/\" target=\"_blank\" rel=\"noopener noreferrer\">\n /__devtools\n </a>{\" \"}\n to explore your app\n </>\n ),\n },\n {\n num: \"✓\",\n text: \"Browse entities, logs, configuration and dependencies\",\n },\n ],\n };\n};\n","import type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useAdminSlide } from \"./GettingStartedAdminSlide.tsx\";\nimport { useAuthSlide } from \"./GettingStartedAuthSlide.tsx\";\nimport { useDevtoolsSlide } from \"./GettingStartedDevtoolsSlide.tsx\";\n\nexport type GettingStartedStep = {\n num: string;\n text: ReactNode;\n};\n\nexport type GettingStartedSlide = {\n text: string;\n sub: string;\n detail?: string;\n steps?: GettingStartedStep[];\n links?: { label: string; href: string }[];\n};\n\nexport type GettingStartedWelcome = {\n appName: string;\n serverTime: string;\n};\n\nexport type GettingStartedProps = {\n /**\n * Welcome data loaded from the server via SSR.\n *\n * When provided, displays app name and server timestamp on the first slide,\n * demonstrating the full SSR → hydration data flow.\n */\n welcome?: GettingStartedWelcome;\n};\n\nconst defaultFirstSlide: GettingStartedSlide = {\n text: \"Let's begin.\",\n sub: \"Every story starts with a blank page.\",\n detail: \"This one is yours.\",\n};\n\nconst helpSlide: GettingStartedSlide = {\n text: \"Need help?\",\n sub: \"We've got you covered.\",\n detail: \"Even our AI friends can read the docs.\",\n links: [\n { label: \"alepha.dev\", href: \"https://alepha.dev\" },\n { label: \"llms.txt\", href: \"https://alepha.dev/llms.txt\" },\n ],\n};\n\nconst formatServerTime = (isoString: string): string => {\n try {\n const date = new Date(isoString);\n return date.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n } catch {\n return isoString;\n }\n};\n\n/**\n * A welcome component displayed when creating a new Alepha application.\n */\nconst GettingStarted = ({ welcome }: GettingStartedProps) => {\n const [index, setIndex] = useState(0);\n const [direction, setDirection] = useState<\"next\" | \"prev\">(\"next\");\n\n // Get auth-aware slide content (hooks return undefined if routes don't exist)\n const authSlide = useAuthSlide();\n const adminSlide = useAdminSlide();\n const devtoolsSlide = useDevtoolsSlide();\n\n const filteredMessages = useMemo(() => {\n const result: GettingStartedSlide[] = [];\n\n // First slide: use welcome data if provided, otherwise default\n if (welcome) {\n result.push({\n ...defaultFirstSlide,\n detail: `Server time: ${formatServerTime(welcome.serverTime)} - App: ${welcome.appName}`,\n });\n } else {\n result.push(defaultFirstSlide);\n }\n\n // Add auth slide if auth routes exist\n if (authSlide) {\n result.push(authSlide);\n }\n\n // Add admin slide if admin routes exist\n if (adminSlide) {\n result.push(adminSlide);\n }\n\n // Add devtools slide in non-production environments\n if (devtoolsSlide) {\n result.push(devtoolsSlide);\n }\n\n // Add \"Need help?\" message\n result.push(helpSlide);\n\n return result;\n }, [welcome, authSlide, adminSlide, devtoolsSlide]);\n\n const current = filteredMessages[index];\n\n const prev = useCallback(() => {\n setDirection(\"prev\");\n setIndex(\n (i) => (i - 1 + filteredMessages.length) % filteredMessages.length,\n );\n }, [filteredMessages.length]);\n\n const next = useCallback(() => {\n setDirection(\"next\");\n setIndex((i) => (i + 1) % filteredMessages.length);\n }, [filteredMessages.length]);\n\n const goTo = useCallback(\n (i: number) => {\n setDirection(i > index ? \"next\" : \"prev\");\n setIndex(i);\n },\n [index],\n );\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"ArrowLeft\") {\n prev();\n } else if (e.key === \"ArrowRight\") {\n next();\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [prev, next]);\n\n return (\n <>\n <style>{styles}</style>\n <main className=\"alepha-blank\">\n <div className=\"alepha-blank-content\">\n <div className=\"alepha-blank-text-block\">\n <h1\n className={`alepha-blank-message alepha-blank-slide-${direction}`}\n key={index}\n >\n {current.text}\n </h1>\n <p\n className={`alepha-blank-sub alepha-blank-slide-${direction}`}\n key={`sub-${index}`}\n >\n {current.sub}\n </p>\n {current.detail && (\n <p\n className={`alepha-blank-detail alepha-blank-slide-${direction}`}\n key={`detail-${index}`}\n >\n {current.detail}\n </p>\n )}\n {current.steps && (\n <div\n className={`alepha-blank-steps alepha-blank-slide-${direction}`}\n key={`steps-${index}`}\n >\n {current.steps.map((step, i) => (\n <div\n key={i}\n className=\"alepha-blank-step\"\n style={{ animationDelay: `${0.15 + i * 0.08}s` }}\n >\n <span className=\"alepha-blank-step-num\">{step.num}</span>\n <span className=\"alepha-blank-step-text\">{step.text}</span>\n </div>\n ))}\n </div>\n )}\n {current.links && (\n <div\n className={`alepha-blank-links alepha-blank-slide-${direction}`}\n key={`links-${index}`}\n >\n {current.links.map((link, i) => (\n <a\n key={link.href}\n href={link.href}\n target={link.href.startsWith(\"http\") ? \"_blank\" : undefined}\n rel={\n link.href.startsWith(\"http\")\n ? \"noopener noreferrer\"\n : undefined\n }\n style={{ animationDelay: `${0.1 + i * 0.05}s` }}\n >\n {link.label}\n </a>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"alepha-blank-slider\">\n <button\n className=\"alepha-blank-nav-btn\"\n onClick={prev}\n aria-label=\"Previous\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M9 3L5 7L9 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <div className=\"alepha-blank-dots\">\n {filteredMessages.map((_, i) => (\n <button\n key={i}\n className={`alepha-blank-dot ${i === index ? \"active\" : \"\"}`}\n onClick={() => goTo(i)}\n aria-label={`Go to message ${i + 1}`}\n />\n ))}\n </div>\n <button\n className=\"alepha-blank-nav-btn\"\n onClick={next}\n aria-label=\"Next\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M5 3L9 7L5 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"alepha-blank-hint\">\n <kbd>←</kbd> <kbd>→</kbd> to navigate\n </div>\n </div>\n </main>\n </>\n );\n};\n\nexport default GettingStarted;\n\nconst styles = `\n.alepha-blank {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100svh;\n background: #fafafa;\n font-family: system-ui, -apple-system, sans-serif;\n color: #171717;\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n width: 100%;\n}\n\n.alepha-blank-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n max-width: 640px;\n}\n\n.alepha-blank-text-block {\n min-height: 320px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n\n.alepha-blank-message {\n font-size: clamp(2rem, 8vw, 3rem);\n font-weight: 600;\n letter-spacing: -0.02em;\n margin: 0;\n line-height: 1.1;\n}\n\n.alepha-blank-sub {\n font-size: 1.0625rem;\n color: #525252;\n margin: 1rem 0 0;\n font-weight: 400;\n line-height: 1.5;\n}\n\n.alepha-blank-detail {\n font-size: 0.875rem;\n color: #a3a3a3;\n margin: 0.5rem 0 0;\n font-weight: 400;\n line-height: 1.5;\n}\n\n.alepha-blank-slide-next {\n animation: alepha-blank-slideNext 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n\n.alepha-blank-slide-prev {\n animation: alepha-blank-slidePrev 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n\n@keyframes alepha-blank-slideNext {\n from {\n opacity: 0;\n transform: translateX(20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes alepha-blank-slidePrev {\n from {\n opacity: 0;\n transform: translateX(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.alepha-blank-steps {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n margin-top: 1.25rem;\n text-align: left;\n}\n\n.alepha-blank-step {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 0.25rem 0;\n opacity: 0;\n animation: alepha-blank-stepIn 0.4s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n}\n\n.alepha-blank-step-num {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: #171717;\n color: #fff;\n font-size: 0.6875rem;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.alepha-blank-step-text {\n font-size: 0.8125rem;\n color: #525252;\n line-height: 1.5;\n}\n\n.alepha-blank-step-text code {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.75rem;\n background: #f5f5f5;\n color: #171717;\n padding: 0.0625rem 0.375rem;\n border-radius: 3px;\n border: 1px solid #e5e5e5;\n}\n\n.alepha-blank-step-text a {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n color: #525252;\n text-decoration: underline;\n text-underline-offset: 2px;\n transition: color 0.15s ease;\n}\n\n.alepha-blank-step-text a:hover {\n color: #171717;\n}\n\n@keyframes alepha-blank-stepIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.alepha-blank-links {\n display: flex;\n gap: 1.5rem;\n margin-top: 1.25rem;\n}\n\n.alepha-blank-links a {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.875rem;\n color: #525252;\n text-decoration: none;\n position: relative;\n opacity: 0;\n animation: alepha-blank-fadeIn 0.3s ease-out forwards;\n transition: color 0.2s ease;\n}\n\n.alepha-blank-links a::after {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n bottom: -2px;\n height: 1px;\n background: #a3a3a3;\n transform: scaleX(1);\n transform-origin: left;\n transition:\n transform 0.25s cubic-bezier(0.22, 1, 0.36, 1),\n background 0.2s ease;\n}\n\n.alepha-blank-links a:hover {\n color: #171717;\n}\n\n.alepha-blank-links a:hover::after {\n background: #171717;\n transform: scaleX(1.05);\n}\n\n.alepha-blank-slider {\n display: flex;\n align-items: center;\n gap: 1rem;\n margin-top: 2.5rem;\n}\n\n.alepha-blank-dots {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.alepha-blank-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: transparent;\n border: 1.5px solid #d4d4d4;\n padding: 0;\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.alepha-blank-dot:hover {\n border-color: #a3a3a3;\n transform: scale(1.2);\n}\n\n.alepha-blank-dot:focus-visible {\n outline: 2px solid #737373;\n outline-offset: 2px;\n}\n\n.alepha-blank-dot.active {\n background: #737373;\n border-color: #737373;\n transform: scale(1.1);\n}\n\n.alepha-blank-nav-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n font-family: inherit;\n background: transparent;\n color: #a3a3a3;\n border: 1.5px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.alepha-blank-nav-btn:hover {\n color: #525252;\n background: #f0f0f0;\n}\n\n.alepha-blank-nav-btn:focus-visible {\n outline: none;\n border-color: #737373;\n color: #525252;\n}\n\n.alepha-blank-nav-btn:active {\n transform: scale(0.92);\n background: #e5e5e5;\n}\n\n.alepha-blank-hint {\n margin-top: 2rem;\n font-size: 0.75rem;\n color: #a3a3a3;\n display: flex;\n align-items: center;\n gap: 0.375rem;\n opacity: 0;\n animation: alepha-blank-fadeIn 0.5s ease-out 0.5s forwards;\n}\n\n.alepha-blank-hint kbd {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.6875rem;\n background: #f0f0f0;\n border: 1px solid #e5e5e5;\n border-radius: 4px;\n padding: 0.125rem 0.375rem;\n box-shadow: 0 1px 0 #d4d4d4;\n}\n\n@keyframes alepha-blank-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .alepha-blank-slide-next,\n .alepha-blank-slide-prev,\n .alepha-blank-links a,\n .alepha-blank-hint,\n .alepha-blank-step {\n animation: none;\n opacity: 1;\n }\n\n .alepha-blank-dot,\n .alepha-blank-nav-btn,\n .alepha-blank-links a,\n .alepha-blank-links a::after {\n transition: none;\n }\n}\n`;\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { $atom, $hook, $inject, $module, $state, Alepha, AlephaError, KIND, OPTIONS, PipelineHandler, Primitive, createPrimitive, t } from "alepha";
1
+ import { $atom, $hook, $inject, $module, $state, Alepha, AlephaError, KIND, OPTIONS, PipelineHandler, Primitive, SchemaValidator, coerceObject, createPrimitive, z } from "alepha";
2
2
  import { AlephaDateTime, DateTimeProvider } from "alepha/datetime";
3
3
  import { AlephaContext, AlephaReact, ClientOnly, ErrorBoundary, useAlepha, useEvents, useInject, useStore } from "alepha/react";
4
4
  import { AlephaReactHead, BrowserHeadProvider } from "alepha/react/head";
@@ -69,8 +69,8 @@ var ReactPageService = class {
69
69
  * const userProfile = $page({
70
70
  * path: "/users/:id",
71
71
  * schema: {
72
- * params: t.object({ id: t.integer() }),
73
- * query: t.object({ tab: t.optional(t.text()) })
72
+ * params: z.object({ id: z.integer() }),
73
+ * query: z.object({ tab: z.text().optional() })
74
74
  * },
75
75
  * loader: async ({ params }) => {
76
76
  * const user = await userApi.getUser(params.id);
@@ -617,7 +617,7 @@ const NestedView = (props) => {
617
617
  const onError = routerLayer?.onError;
618
618
  const state = useRouterState();
619
619
  const alepha = useAlepha();
620
- const [boundaryKey, setBoundaryKey] = useState(0);
620
+ const boundaryResetKeys = [state.url.pathname];
621
621
  const [view, setView] = useState(state.layers[index]?.element);
622
622
  const [animation, setAnimation] = useState("");
623
623
  const animationExitDuration = useRef(0);
@@ -677,8 +677,9 @@ const NestedView = (props) => {
677
677
  if (props.errorBoundary === false) return /* @__PURE__ */ jsx(Fragment, { children: element });
678
678
  if (props.errorBoundary) return /* @__PURE__ */ jsx(ErrorBoundary, {
679
679
  fallback: props.errorBoundary,
680
+ resetKeys: boundaryResetKeys,
680
681
  children: element
681
- }, boundaryKey);
682
+ });
682
683
  const fallback = (error) => {
683
684
  const result = onError?.(error, state) ?? /* @__PURE__ */ jsx(ErrorViewer, {
684
685
  error,
@@ -689,8 +690,9 @@ const NestedView = (props) => {
689
690
  };
690
691
  return /* @__PURE__ */ jsx(ErrorBoundary, {
691
692
  fallback,
693
+ resetKeys: boundaryResetKeys,
692
694
  children: element
693
- }, boundaryKey);
695
+ });
694
696
  };
695
697
  var NestedView_default = memo(NestedView);
696
698
  function parseAnimation(animationLike, state, type = "enter") {
@@ -834,11 +836,11 @@ var RouterLocaleProvider = class {
834
836
  const reactPageOptions = $atom({
835
837
  name: "alepha.react.page.options",
836
838
  description: "Configuration options for the React page provider.",
837
- schema: t.object({
839
+ schema: z.object({
838
840
  /**
839
841
  * Enable React StrictMode wrapper.
840
842
  */
841
- strictMode: t.boolean({ default: true }),
843
+ strictMode: z.boolean().default(true),
842
844
  /**
843
845
  * RegExp pattern (as string) to detect file-like URLs (e.g. /hello.txt, /wp-login.php).
844
846
  * When a request hits the catch-all wildcard route and matches this pattern,
@@ -848,7 +850,7 @@ const reactPageOptions = $atom({
848
850
  *
849
851
  * @default "\\.[a-zA-Z0-9]{1,10}$"
850
852
  */
851
- staticFilePattern: t.string()
853
+ staticFilePattern: z.string()
852
854
  }),
853
855
  default: {
854
856
  strictMode: true,
@@ -964,9 +966,10 @@ var ReactPageProvider = class {
964
966
  return root;
965
967
  }
966
968
  convertStringObjectToObject = (schema, value) => {
967
- if (t.schema.isObject(schema) && typeof value === "object") {
968
- for (const key in schema.properties) if (t.schema.isObject(schema.properties[key]) && typeof value[key] === "string") try {
969
- value[key] = this.alepha.codec.decode(schema.properties[key], decodeURIComponent(value[key]));
969
+ if (z.schema.isObject(schema) && typeof value === "object") for (const key in schema.properties) {
970
+ const propSchema = z.schema.unwrap(schema.properties[key]);
971
+ if (z.schema.isObject(propSchema) && typeof value[key] === "string") try {
972
+ value[key] = this.alepha.codec.decode(propSchema, decodeURIComponent(value[key]));
970
973
  } catch (e) {}
971
974
  }
972
975
  return value;
@@ -991,13 +994,13 @@ var ReactPageProvider = class {
991
994
  const config = {};
992
995
  try {
993
996
  this.convertStringObjectToObject(route.schema?.query, state.query);
994
- config.query = route.schema?.query ? this.alepha.codec.decode(route.schema.query, state.query) : {};
997
+ config.query = route.schema?.query ? this.alepha.codec.decode(route.schema.query, coerceObject(route.schema.query, state.query)) : {};
995
998
  } catch (e) {
996
999
  it.error = e instanceof Error ? e : new Error(String(e));
997
1000
  break;
998
1001
  }
999
1002
  try {
1000
- config.params = route.schema?.params ? this.alepha.codec.decode(route.schema.params, state.params) : {};
1003
+ config.params = route.schema?.params ? this.alepha.codec.decode(route.schema.params, coerceObject(route.schema.params, state.params)) : {};
1001
1004
  } catch (e) {
1002
1005
  it.error = e instanceof Error ? e : new Error(String(e));
1003
1006
  break;
@@ -1379,8 +1382,8 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
1379
1382
  */
1380
1383
  const reactBrowserOptions = $atom({
1381
1384
  name: "alepha.react.browser.options",
1382
- schema: t.object({
1383
- scrollRestoration: t.enum(["top", "manual"]),
1385
+ schema: z.object({
1386
+ scrollRestoration: z.enum(["top", "manual"]),
1384
1387
  /**
1385
1388
  * Intercept clicks on plain `<a href="/...">` anchors and route them
1386
1389
  * through the SPA router, so authors don't need `<Link>` everywhere
@@ -1390,7 +1393,7 @@ const reactBrowserOptions = $atom({
1390
1393
  * `_self`, `download`, `data-no-router`, non-http(s) schemes, hash-only
1391
1394
  * hrefs, external origins, and clicks already `defaultPrevented`.
1392
1395
  */
1393
- interceptAnchorClicks: t.boolean({ default: true })
1396
+ interceptAnchorClicks: z.boolean().default(true)
1394
1397
  }),
1395
1398
  default: {
1396
1399
  scrollRestoration: "top",
@@ -1404,6 +1407,7 @@ var ReactBrowserProvider = class {
1404
1407
  router = $inject(ReactBrowserRouterProvider);
1405
1408
  dateTimeProvider = $inject(DateTimeProvider);
1406
1409
  browserHeadProvider = $inject(BrowserHeadProvider);
1410
+ validator = $inject(SchemaValidator);
1407
1411
  options = $state(reactBrowserOptions);
1408
1412
  get rootId() {
1409
1413
  return "root";
@@ -1454,7 +1458,7 @@ var ReactBrowserProvider = class {
1454
1458
  return base;
1455
1459
  }
1456
1460
  get url() {
1457
- const url = this.location.pathname + this.location.search;
1461
+ const url = this.location.pathname + this.location.search + this.location.hash;
1458
1462
  if (this.base) return url.replace(this.base, "");
1459
1463
  return url;
1460
1464
  }
@@ -1498,8 +1502,9 @@ var ReactBrowserProvider = class {
1498
1502
  transitionId: myTransitionId
1499
1503
  });
1500
1504
  if (myTransitionId !== this.transitionId) return;
1501
- if (this.state.url.pathname + this.state.url.search !== url) {
1502
- this.pushState(this.state.url.pathname + this.state.url.search);
1505
+ const committed = this.state.url.pathname + this.state.url.search + this.state.url.hash;
1506
+ if (committed !== url) {
1507
+ this.pushState(committed);
1503
1508
  return;
1504
1509
  }
1505
1510
  this.pushState(url, options.replace);
@@ -1543,6 +1548,39 @@ var ReactBrowserProvider = class {
1543
1548
  console.error(error);
1544
1549
  }
1545
1550
  }
1551
+ /**
1552
+ * Apply the SSR hydration payload (the `#__ssr` script tag) to the atom
1553
+ * store.
1554
+ *
1555
+ * Every key except `alepha.react.router.layers` is treated as an atom
1556
+ * value. A registered atom's value is explicitly schema-validated: an
1557
+ * invalid value is dropped (warn + keep the atom's default) instead of
1558
+ * being trusted, so a tampered payload can't smuggle bad data into a
1559
+ * validated atom. Atoms not registered yet fall through to
1560
+ * `Alepha.set()`, which lets `StateManager.register()` decode them
1561
+ * against the schema the moment they first get used.
1562
+ *
1563
+ * `alepha.react.router.layers` is deliberately skipped by this loop: it
1564
+ * carries render instructions (`part`, `name`, `config`, `props`,
1565
+ * `error`), not atom values. Those are NOT hardened here and are trusted
1566
+ * as-is from the SSR payload — a tampered payload can still influence
1567
+ * rendering through this key. Validating router layers is separate,
1568
+ * future work; this method only guarantees atom values.
1569
+ */
1570
+ applyHydration(hydration) {
1571
+ for (const [key, value] of Object.entries(hydration)) {
1572
+ if (key === "alepha.react.router.layers") continue;
1573
+ const atom = this.alepha.store.getAtom(key);
1574
+ if (atom) {
1575
+ const result = this.validator.safeValidate(atom.schema, value);
1576
+ if (!result.success) {
1577
+ this.log.warn(`Hydrated value for atom "${key}" failed schema validation, keeping default`);
1578
+ continue;
1579
+ }
1580
+ this.alepha.store.set(key, result.data, { skipValidation: true });
1581
+ } else this.alepha.set(key, value);
1582
+ }
1583
+ }
1546
1584
  onTransitionEnd = $hook({
1547
1585
  on: "react:transition:end",
1548
1586
  handler: () => {
@@ -1557,9 +1595,7 @@ var ReactBrowserProvider = class {
1557
1595
  handler: async () => {
1558
1596
  const hydration = this.getHydrationState();
1559
1597
  const previous = hydration?.["alepha.react.router.layers"] ?? [];
1560
- if (hydration) {
1561
- for (const [key, value] of Object.entries(hydration)) if (key !== "alepha.react.router.layers") this.alepha.set(key, value);
1562
- }
1598
+ if (hydration) this.applyHydration(hydration);
1563
1599
  await this.render({ previous });
1564
1600
  const element = this.router.root(this.state);
1565
1601
  await this.alepha.events.emit("react:browser:render", {
@@ -1867,7 +1903,7 @@ const useActive = (args) => {
1867
1903
  *
1868
1904
  * @example
1869
1905
  * const [params, setParams] = useQueryParams(
1870
- * t.object({ tab: t.optional(t.string()) }),
1906
+ * z.object({ tab: z.string().optional() }),
1871
1907
  * { format: "querystring" },
1872
1908
  * );
1873
1909
  * // params.tab reads from `?tab=…`; setParams({ tab: "security" }) writes it.