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,231 +0,0 @@
1
- import { $inject, $module, Alepha, AlephaError, KIND, Primitive, createPrimitive } from "alepha";
2
- import { $logger } from "alepha/logger";
3
- //#region ../../src/container/core/providers/ContainerProvider.ts
4
- /**
5
- * Abstract transport for `$container` proxies.
6
- *
7
- * Concrete subclasses translate a `(container, action, config)` call
8
- * into an HTTP request that reaches the running container. The default
9
- * binding on Node throws — apps must register either a
10
- * `NodeContainerProvider` (with `url` on each primitive) or the
11
- * Cloudflare workerd variant.
12
- */
13
- var ContainerProvider = class {
14
- log = $logger();
15
- /**
16
- * Invoke a remote action on the container. Subclasses do the work;
17
- * the default implementation rejects to make missing wiring obvious.
18
- */
19
- async invoke(container, action, config) {
20
- throw new AlephaError(`No ContainerProvider configured for container '${container.name}' (action '${action}'). Set up alepha/container via AlephaContainer and either supply 'url' (Node) or build for target=cloudflare.`);
21
- }
22
- /**
23
- * Helper: build the fetch path/body for an action call. Kept as a
24
- * protected method so workerd and Node providers share the wire
25
- * shape — `POST /api/<action>` with the JSON body, query params on
26
- * the URL, and the request headers merged in.
27
- */
28
- buildRequest(action, config) {
29
- const params = new URLSearchParams();
30
- if (config.query) {
31
- for (const [k, v] of Object.entries(config.query)) if (v !== void 0 && v !== null) params.set(k, String(v));
32
- }
33
- let path = `/api/${action}`;
34
- if (config.params) {
35
- const tail = [];
36
- for (const [k, v] of Object.entries(config.params)) {
37
- const placeholder = `:${k}`;
38
- const encoded = encodeURIComponent(String(v));
39
- if (path.includes(placeholder)) path = path.replace(placeholder, encoded);
40
- else tail.push(encoded);
41
- }
42
- if (tail.length) path += `/${tail.join("/")}`;
43
- }
44
- const search = params.toString();
45
- if (search) path += `?${search}`;
46
- const init = {
47
- method: "POST",
48
- headers: {
49
- "content-type": "application/json",
50
- ...config.headers ?? {}
51
- },
52
- body: config.body !== void 0 ? JSON.stringify(config.body) : void 0
53
- };
54
- return {
55
- path,
56
- init
57
- };
58
- }
59
- };
60
- //#endregion
61
- //#region ../../src/container/core/primitives/$container.ts
62
- /**
63
- * `$container` — typed RPC client to a containerized Alepha app.
64
- *
65
- * Returns a typed Proxy whose method calls map 1:1 to the target
66
- * controller's `$action` endpoints. The wire format mirrors what a
67
- * normal Alepha server exposes (`POST /api/<method>` with a JSON body),
68
- * so the container is literally a tiny Alepha worker.
69
- *
70
- * Transport is owned by the active {@link ContainerProvider}:
71
- * - `target=cloudflare` → `CloudflareContainerProvider` routes through
72
- * the Containers binding (`env.<NAME>.getContainer(...).fetch()`).
73
- * - Node (with `url` set) → `NodeContainerProvider` uses plain
74
- * `fetch()` against the configured URL.
75
- *
76
- * Build-time, `BuildCloudflareTask.enhanceContainers` walks
77
- * `alepha.primitives($container)` to emit the matching `wrangler.jsonc`
78
- * entries and Durable Object class declarations into
79
- * `main.cloudflare.js`.
80
- *
81
- * @example
82
- * ```ts
83
- * import { $container } from "alepha/container";
84
- * import type { RocketController } from "@alepha/rocket";
85
- *
86
- * class DeployService {
87
- * rocket = $container<RocketController>({
88
- * image: "alepha/rocket:latest",
89
- * port: 3000,
90
- * sleepAfter: "15m",
91
- * });
92
- *
93
- * async deploy() {
94
- * return this.rocket.createJob({ body: { op: "up" } });
95
- * }
96
- * }
97
- * ```
98
- */
99
- const $container = (options) => {
100
- if (!options.image) throw new AlephaError("$container requires an 'image' option");
101
- return createPrimitive(ContainerPrimitive, options).proxy();
102
- };
103
- var ContainerPrimitive = class extends Primitive {
104
- provider = $inject(ContainerProvider);
105
- get name() {
106
- return this.options.name ?? this.config.propertyKey;
107
- }
108
- /**
109
- * Build the typed Proxy. The target is the primitive itself so
110
- * `instanceof Primitive` keeps working (required by Alepha's
111
- * primitive registration in `Alepha.new`). Property reads that match
112
- * an own/inherited member return that member; anything else is
113
- * treated as an action name and routed through the provider.
114
- */
115
- proxy() {
116
- const primitive = this;
117
- return new Proxy(primitive, { get(target, prop, receiver) {
118
- if (typeof prop === "symbol" || prop in target) return Reflect.get(target, prop, receiver);
119
- return (config = {}) => primitive.provider.invoke(primitive, prop, config);
120
- } });
121
- }
122
- };
123
- $container[KIND] = ContainerPrimitive;
124
- //#endregion
125
- //#region ../../src/container/core/providers/MockContainerProvider.ts
126
- /**
127
- * In-process test provider.
128
- *
129
- * Resolves the action name against `LinkProvider`'s registered links in
130
- * the SAME Alepha instance — effectively calling the "containerized"
131
- * controller as if it were local. Use it in tests: register the
132
- * controller class on the test container alongside the consumer and
133
- * substitute `ContainerProvider` with `MockContainerProvider`.
134
- *
135
- * @example
136
- * ```ts
137
- * const alepha = Alepha.create()
138
- * .with(AlephaContainer)
139
- * .with(RocketController)
140
- * .with(MyApp)
141
- * .with({ provide: ContainerProvider, use: MockContainerProvider });
142
- * ```
143
- */
144
- var MockContainerProvider = class extends ContainerProvider {
145
- alepha = $inject(Alepha);
146
- async invoke(container, action, config) {
147
- const linkProviderClass = await this.loadLinkProvider();
148
- return await this.alepha.inject(linkProviderClass).follow(action, {
149
- body: config.body,
150
- query: config.query,
151
- params: config.params,
152
- headers: config.headers
153
- });
154
- }
155
- async loadLinkProvider() {
156
- try {
157
- return (await import("alepha/server/links")).LinkProvider;
158
- } catch {
159
- throw new AlephaError("MockContainerProvider needs 'alepha/server/links' to be available — add AlephaServerLinks to the test app.");
160
- }
161
- }
162
- };
163
- //#endregion
164
- //#region ../../src/container/core/providers/NodeContainerProvider.ts
165
- /**
166
- * Node (dev / test / non-Cloudflare) container provider.
167
- *
168
- * Routes proxy calls through plain `fetch()` against the URL given on
169
- * the `$container` primitive. If no `url` is supplied, calls throw —
170
- * v1 deliberately has no Docker spawning. This is the "temporary, not
171
- * perfect" Node path documented in the spec; the longer-term plan is
172
- * to plug in a `target=docker` adapter once that lands.
173
- */
174
- var NodeContainerProvider = class extends ContainerProvider {
175
- async invoke(container, action, config) {
176
- const url = this.resolveUrl(container);
177
- if (!url) throw new AlephaError(`Container '${container.name}' has no 'url' configured — NodeContainerProvider cannot reach the container.`);
178
- const { path, init } = this.buildRequest(action, config);
179
- const response = await fetch(`${url.replace(/\/$/, "")}${path}`, init);
180
- if (!response.ok) {
181
- const text = await response.text().catch(() => "");
182
- throw new AlephaError(`Container '${container.name}' action '${action}' failed: ${response.status} ${response.statusText}${text ? ` — ${text}` : ""}`);
183
- }
184
- if ((response.headers.get("content-type") ?? "").includes("application/json")) return await response.json();
185
- return await response.text();
186
- }
187
- resolveUrl(container) {
188
- const url = container.options.url;
189
- return typeof url === "function" ? url() : url;
190
- }
191
- };
192
- //#endregion
193
- //#region ../../src/container/core/index.ts
194
- /**
195
- * Type-safe RPC clients for ephemeral containerized Alepha apps.
196
- *
197
- * **Features:**
198
- * - `$container<T>()` directive returns a typed Proxy onto a remote
199
- * Alepha controller's `$action` endpoints — the wire format is the
200
- * same `POST /api/<method>` shape served by every Alepha server.
201
- * - Pluggable transport: Node (plain `fetch` against a configured URL),
202
- * Mock (in-process call via `LinkProvider.follow` for tests),
203
- * Cloudflare workerd (`getContainer().fetch()` through the Containers
204
- * binding — see `alepha/container` workerd entry).
205
- * - Build-time integration: `BuildCloudflareTask.enhanceContainers`
206
- * emits the matching wrangler bindings and Durable Object class
207
- * declarations.
208
- *
209
- * The Node binding is the "temporary, not perfect" path documented in
210
- * the spec — apps need to provide an explicit `url` per primitive
211
- * until a `target=docker` adapter ships.
212
- *
213
- * @module alepha.container
214
- */
215
- const AlephaContainer = $module({
216
- name: "alepha.container",
217
- primitives: [$container],
218
- services: [ContainerProvider],
219
- variants: [MockContainerProvider, NodeContainerProvider],
220
- register: (alepha) => {
221
- alepha.with({
222
- optional: true,
223
- provide: ContainerProvider,
224
- use: alepha.isTest() ? MockContainerProvider : NodeContainerProvider
225
- });
226
- }
227
- });
228
- //#endregion
229
- export { $container, AlephaContainer, ContainerPrimitive, ContainerProvider, MockContainerProvider, NodeContainerProvider };
230
-
231
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/container/core/providers/ContainerProvider.ts","../../../src/container/core/primitives/$container.ts","../../../src/container/core/providers/MockContainerProvider.ts","../../../src/container/core/providers/NodeContainerProvider.ts","../../../src/container/core/index.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { ContainerPrimitive } from \"../primitives/$container.ts\";\n\nexport interface ContainerInvokeConfig {\n body?: unknown;\n query?: Record<string, unknown>;\n params?: Record<string, unknown>;\n headers?: Record<string, string>;\n}\n\n/**\n * Abstract transport for `$container` proxies.\n *\n * Concrete subclasses translate a `(container, action, config)` call\n * into an HTTP request that reaches the running container. The default\n * binding on Node throws — apps must register either a\n * `NodeContainerProvider` (with `url` on each primitive) or the\n * Cloudflare workerd variant.\n */\nexport abstract class ContainerProvider {\n protected readonly log = $logger();\n\n /**\n * Invoke a remote action on the container. Subclasses do the work;\n * the default implementation rejects to make missing wiring obvious.\n */\n public async invoke(\n container: ContainerPrimitive,\n action: string,\n config: ContainerInvokeConfig,\n ): Promise<unknown> {\n void config;\n throw new AlephaError(\n `No ContainerProvider configured for container '${container.name}' (action '${action}'). ` +\n `Set up alepha/container via AlephaContainer and either supply 'url' (Node) or build for target=cloudflare.`,\n );\n }\n\n /**\n * Helper: build the fetch path/body for an action call. Kept as a\n * protected method so workerd and Node providers share the wire\n * shape — `POST /api/<action>` with the JSON body, query params on\n * the URL, and the request headers merged in.\n */\n protected buildRequest(\n action: string,\n config: ContainerInvokeConfig,\n ): { path: string; init: RequestInit } {\n const params = new URLSearchParams();\n if (config.query) {\n for (const [k, v] of Object.entries(config.query)) {\n if (v !== undefined && v !== null) params.set(k, String(v));\n }\n }\n\n // Match the route Alepha generates server-side when no explicit\n // `path:` is set on `$action`: `/${name}` with one `/:<key>`\n // segment appended per param. Params that match a `:key`\n // placeholder are substituted in place; any remaining params are\n // appended in declaration order so `params: {id:\"abc\"}` against a\n // proxy action `getDeploy` yields `/api/getDeploy/abc`.\n let path = `/api/${action}`;\n if (config.params) {\n const tail: string[] = [];\n for (const [k, v] of Object.entries(config.params)) {\n const placeholder = `:${k}`;\n const encoded = encodeURIComponent(String(v));\n if (path.includes(placeholder)) {\n path = path.replace(placeholder, encoded);\n } else {\n tail.push(encoded);\n }\n }\n if (tail.length) path += `/${tail.join(\"/\")}`;\n }\n\n const search = params.toString();\n if (search) path += `?${search}`;\n\n const init: RequestInit = {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(config.headers ?? {}),\n },\n body: config.body !== undefined ? JSON.stringify(config.body) : undefined,\n };\n\n return { path, init };\n }\n}\n","import { $inject, AlephaError, createPrimitive, KIND, Primitive } from \"alepha\";\nimport type { ContainerPrimitiveOptions } from \"../interfaces/ContainerOptions.ts\";\nimport { ContainerProvider } from \"../providers/ContainerProvider.ts\";\n\n/**\n * `$container` — typed RPC client to a containerized Alepha app.\n *\n * Returns a typed Proxy whose method calls map 1:1 to the target\n * controller's `$action` endpoints. The wire format mirrors what a\n * normal Alepha server exposes (`POST /api/<method>` with a JSON body),\n * so the container is literally a tiny Alepha worker.\n *\n * Transport is owned by the active {@link ContainerProvider}:\n * - `target=cloudflare` → `CloudflareContainerProvider` routes through\n * the Containers binding (`env.<NAME>.getContainer(...).fetch()`).\n * - Node (with `url` set) → `NodeContainerProvider` uses plain\n * `fetch()` against the configured URL.\n *\n * Build-time, `BuildCloudflareTask.enhanceContainers` walks\n * `alepha.primitives($container)` to emit the matching `wrangler.jsonc`\n * entries and Durable Object class declarations into\n * `main.cloudflare.js`.\n *\n * @example\n * ```ts\n * import { $container } from \"alepha/container\";\n * import type { RocketController } from \"@alepha/rocket\";\n *\n * class DeployService {\n * rocket = $container<RocketController>({\n * image: \"alepha/rocket:latest\",\n * port: 3000,\n * sleepAfter: \"15m\",\n * });\n *\n * async deploy() {\n * return this.rocket.createJob({ body: { op: \"up\" } });\n * }\n * }\n * ```\n */\nexport const $container = <T extends object = any>(\n options: ContainerPrimitiveOptions,\n): ContainerProxy<T> => {\n if (!options.image) {\n throw new AlephaError(\"$container requires an 'image' option\");\n }\n const instance = createPrimitive(ContainerPrimitive, options);\n return instance.proxy() as ContainerProxy<T>;\n};\n\n/**\n * Typed proxy returned by `$container<T>()`. Each `$action` member of\n * `T` becomes a callable returning the action's response body.\n *\n * The runtime shape is a `Proxy(primitive)` — own-property reads hit the\n * underlying `ContainerPrimitive` (so `alepha.primitives($container)`\n * still finds it via the `instanceof Primitive` check inside\n * `Alepha.new()`), and anything else is treated as an action name and\n * routed through the active `ContainerProvider`.\n */\nexport type ContainerProxy<T extends object> = {\n [K in keyof T]: T[K] extends (...args: infer A) => infer R\n ? (...args: A) => Promise<Awaited<R>>\n : (config?: {\n body?: unknown;\n query?: unknown;\n params?: unknown;\n }) => Promise<any>;\n};\n\nexport class ContainerPrimitive extends Primitive<ContainerPrimitiveOptions> {\n protected readonly provider = $inject(ContainerProvider);\n\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * Build the typed Proxy. The target is the primitive itself so\n * `instanceof Primitive` keeps working (required by Alepha's\n * primitive registration in `Alepha.new`). Property reads that match\n * an own/inherited member return that member; anything else is\n * treated as an action name and routed through the provider.\n */\n public proxy<T extends object = any>(): ContainerProxy<T> {\n const primitive = this;\n return new Proxy(primitive as any, {\n get(target: any, prop: string | symbol, receiver: any) {\n if (typeof prop === \"symbol\" || prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n return (config: any = {}) =>\n primitive.provider.invoke(primitive, prop as string, config);\n },\n }) as ContainerProxy<T>;\n }\n}\n\n$container[KIND] = ContainerPrimitive;\n","import { $inject, Alepha, AlephaError } from \"alepha\";\nimport type { ContainerPrimitive } from \"../primitives/$container.ts\";\nimport {\n type ContainerInvokeConfig,\n ContainerProvider,\n} from \"./ContainerProvider.ts\";\n\n/**\n * In-process test provider.\n *\n * Resolves the action name against `LinkProvider`'s registered links in\n * the SAME Alepha instance — effectively calling the \"containerized\"\n * controller as if it were local. Use it in tests: register the\n * controller class on the test container alongside the consumer and\n * substitute `ContainerProvider` with `MockContainerProvider`.\n *\n * @example\n * ```ts\n * const alepha = Alepha.create()\n * .with(AlephaContainer)\n * .with(RocketController)\n * .with(MyApp)\n * .with({ provide: ContainerProvider, use: MockContainerProvider });\n * ```\n */\nexport class MockContainerProvider extends ContainerProvider {\n protected readonly alepha = $inject(Alepha);\n\n public override async invoke(\n container: ContainerPrimitive,\n action: string,\n config: ContainerInvokeConfig,\n ): Promise<unknown> {\n void container;\n // Lazy-resolve LinkProvider so tests that don't load `alepha/server/links`\n // still get a clear error message.\n const linkProviderClass = await this.loadLinkProvider();\n const linkProvider = this.alepha.inject(linkProviderClass) as {\n follow: (\n name: string,\n config?: Record<string, unknown>,\n ) => Promise<unknown>;\n };\n return await linkProvider.follow(action, {\n body: config.body,\n query: config.query,\n params: config.params,\n headers: config.headers,\n });\n }\n\n protected async loadLinkProvider(): Promise<any> {\n try {\n const mod = await import(\"alepha/server/links\");\n return mod.LinkProvider;\n } catch {\n throw new AlephaError(\n \"MockContainerProvider needs 'alepha/server/links' to be available — add AlephaServerLinks to the test app.\",\n );\n }\n }\n}\n","import { AlephaError } from \"alepha\";\nimport type { ContainerPrimitive } from \"../primitives/$container.ts\";\nimport {\n type ContainerInvokeConfig,\n ContainerProvider,\n} from \"./ContainerProvider.ts\";\n\n/**\n * Node (dev / test / non-Cloudflare) container provider.\n *\n * Routes proxy calls through plain `fetch()` against the URL given on\n * the `$container` primitive. If no `url` is supplied, calls throw —\n * v1 deliberately has no Docker spawning. This is the \"temporary, not\n * perfect\" Node path documented in the spec; the longer-term plan is\n * to plug in a `target=docker` adapter once that lands.\n */\nexport class NodeContainerProvider extends ContainerProvider {\n public override async invoke(\n container: ContainerPrimitive,\n action: string,\n config: ContainerInvokeConfig,\n ): Promise<unknown> {\n const url = this.resolveUrl(container);\n if (!url) {\n throw new AlephaError(\n `Container '${container.name}' has no 'url' configured — NodeContainerProvider cannot reach the container.`,\n );\n }\n\n const { path, init } = this.buildRequest(action, config);\n const response = await fetch(`${url.replace(/\\/$/, \"\")}${path}`, init);\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new AlephaError(\n `Container '${container.name}' action '${action}' failed: ${response.status} ${response.statusText}${\n text ? ` — ${text}` : \"\"\n }`,\n );\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return await response.json();\n }\n return await response.text();\n }\n\n protected resolveUrl(container: ContainerPrimitive): string | undefined {\n const url = container.options.url;\n return typeof url === \"function\" ? url() : url;\n }\n}\n","import { $module } from \"alepha\";\nimport { $container } from \"./primitives/$container.ts\";\nimport { ContainerProvider } from \"./providers/ContainerProvider.ts\";\nimport { MockContainerProvider } from \"./providers/MockContainerProvider.ts\";\nimport { NodeContainerProvider } from \"./providers/NodeContainerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./interfaces/ContainerOptions.ts\";\nexport * from \"./primitives/$container.ts\";\nexport * from \"./providers/ContainerProvider.ts\";\nexport * from \"./providers/MockContainerProvider.ts\";\nexport * from \"./providers/NodeContainerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Type-safe RPC clients for ephemeral containerized Alepha apps.\n *\n * **Features:**\n * - `$container<T>()` directive returns a typed Proxy onto a remote\n * Alepha controller's `$action` endpoints — the wire format is the\n * same `POST /api/<method>` shape served by every Alepha server.\n * - Pluggable transport: Node (plain `fetch` against a configured URL),\n * Mock (in-process call via `LinkProvider.follow` for tests),\n * Cloudflare workerd (`getContainer().fetch()` through the Containers\n * binding — see `alepha/container` workerd entry).\n * - Build-time integration: `BuildCloudflareTask.enhanceContainers`\n * emits the matching wrangler bindings and Durable Object class\n * declarations.\n *\n * The Node binding is the \"temporary, not perfect\" path documented in\n * the spec — apps need to provide an explicit `url` per primitive\n * until a `target=docker` adapter ships.\n *\n * @module alepha.container\n */\nexport const AlephaContainer = $module({\n name: \"alepha.container\",\n primitives: [$container],\n services: [ContainerProvider],\n variants: [MockContainerProvider, NodeContainerProvider],\n register: (alepha) => {\n alepha.with({\n optional: true,\n provide: ContainerProvider,\n use: alepha.isTest() ? MockContainerProvider : NodeContainerProvider,\n });\n },\n});\n"],"mappings":";;;;;;;;;;;;AAoBA,IAAsB,oBAAtB,MAAwC;CACtC,MAAyB,QAAQ;;;;;CAMjC,MAAa,OACX,WACA,QACA,QACkB;EAElB,MAAM,IAAI,YACR,kDAAkD,UAAU,KAAK,aAAa,OAAO,+GAEvF;CACF;;;;;;;CAQA,aACE,QACA,QACqC;EACrC,MAAM,SAAS,IAAI,gBAAgB;EACnC,IAAI,OAAO;QACJ,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,OAAO,KAAK,GAC9C,IAAI,MAAM,KAAA,KAAa,MAAM,MAAM,OAAO,IAAI,GAAG,OAAO,CAAC,CAAC;EAAA;EAU9D,IAAI,OAAO,QAAQ;EACnB,IAAI,OAAO,QAAQ;GACjB,MAAM,OAAiB,CAAC;GACxB,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,OAAO,MAAM,GAAG;IAClD,MAAM,cAAc,IAAI;IACxB,MAAM,UAAU,mBAAmB,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,SAAS,WAAW,GAC3B,OAAO,KAAK,QAAQ,aAAa,OAAO;SAExC,KAAK,KAAK,OAAO;GAErB;GACA,IAAI,KAAK,QAAQ,QAAQ,IAAI,KAAK,KAAK,GAAG;EAC5C;EAEA,MAAM,SAAS,OAAO,SAAS;EAC/B,IAAI,QAAQ,QAAQ,IAAI;EAExB,MAAM,OAAoB;GACxB,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,GAAI,OAAO,WAAW,CAAC;GACzB;GACA,MAAM,OAAO,SAAS,KAAA,IAAY,KAAK,UAAU,OAAO,IAAI,IAAI,KAAA;EAClE;EAEA,OAAO;GAAE;GAAM;EAAK;CACtB;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClDA,MAAa,cACX,YACsB;CACtB,IAAI,CAAC,QAAQ,OACX,MAAM,IAAI,YAAY,uCAAuC;CAG/D,OADiB,gBAAgB,oBAAoB,OACvC,EAAE,MAAM;AACxB;AAsBA,IAAa,qBAAb,cAAwC,UAAqC;CAC3E,WAA8B,QAAQ,iBAAiB;CAEvD,IAAW,OAAe;EACxB,OAAO,KAAK,QAAQ,QAAQ,KAAK,OAAO;CAC1C;;;;;;;;CASA,QAA0D;EACxD,MAAM,YAAY;EAClB,OAAO,IAAI,MAAM,WAAkB,EACjC,IAAI,QAAa,MAAuB,UAAe;GACrD,IAAI,OAAO,SAAS,YAAY,QAAQ,QACtC,OAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;GAE3C,QAAQ,SAAc,CAAC,MACrB,UAAU,SAAS,OAAO,WAAW,MAAgB,MAAM;EAC/D,EACF,CAAC;CACH;AACF;AAEA,WAAW,QAAQ;;;;;;;;;;;;;;;;;;;;;AC1EnB,IAAa,wBAAb,cAA2C,kBAAkB;CAC3D,SAA4B,QAAQ,MAAM;CAE1C,MAAsB,OACpB,WACA,QACA,QACkB;EAIlB,MAAM,oBAAoB,MAAM,KAAK,iBAAiB;EAOtD,OAAO,MANc,KAAK,OAAO,OAAO,iBAMhB,EAAE,OAAO,QAAQ;GACvC,MAAM,OAAO;GACb,OAAO,OAAO;GACd,QAAQ,OAAO;GACf,SAAS,OAAO;EAClB,CAAC;CACH;CAEA,MAAgB,mBAAiC;EAC/C,IAAI;GAEF,QAAO,MADW,OAAO,wBACd;EACb,QAAQ;GACN,MAAM,IAAI,YACR,4GACF;EACF;CACF;AACF;;;;;;;;;;;;AC7CA,IAAa,wBAAb,cAA2C,kBAAkB;CAC3D,MAAsB,OACpB,WACA,QACA,QACkB;EAClB,MAAM,MAAM,KAAK,WAAW,SAAS;EACrC,IAAI,CAAC,KACH,MAAM,IAAI,YACR,cAAc,UAAU,KAAK,8EAC/B;EAGF,MAAM,EAAE,MAAM,SAAS,KAAK,aAAa,QAAQ,MAAM;EACvD,MAAM,WAAW,MAAM,MAAM,GAAG,IAAI,QAAQ,OAAO,EAAE,IAAI,QAAQ,IAAI;EAErE,IAAI,CAAC,SAAS,IAAI;GAChB,MAAM,OAAO,MAAM,SAAS,KAAK,EAAE,YAAY,EAAE;GACjD,MAAM,IAAI,YACR,cAAc,UAAU,KAAK,YAAY,OAAO,YAAY,SAAS,OAAO,GAAG,SAAS,aACtF,OAAO,MAAM,SAAS,IAE1B;EACF;EAGA,KADoB,SAAS,QAAQ,IAAI,cAAc,KAAK,IAC5C,SAAS,kBAAkB,GACzC,OAAO,MAAM,SAAS,KAAK;EAE7B,OAAO,MAAM,SAAS,KAAK;CAC7B;CAEA,WAAqB,WAAmD;EACtE,MAAM,MAAM,UAAU,QAAQ;EAC9B,OAAO,OAAO,QAAQ,aAAa,IAAI,IAAI;CAC7C;AACF;;;;;;;;;;;;;;;;;;;;;;;;ACfA,MAAa,kBAAkB,QAAQ;CACrC,MAAM;CACN,YAAY,CAAC,UAAU;CACvB,UAAU,CAAC,iBAAiB;CAC5B,UAAU,CAAC,uBAAuB,qBAAqB;CACvD,WAAW,WAAW;EACpB,OAAO,KAAK;GACV,UAAU;GACV,SAAS;GACT,KAAK,OAAO,OAAO,IAAI,wBAAwB;EACjD,CAAC;CACH;AACF,CAAC"}
@@ -1,192 +0,0 @@
1
- import { Container, getContainer } from "@cloudflare/containers";
2
- import { $inject, $module, Alepha, AlephaError, KIND, Primitive, createPrimitive } from "alepha";
3
- import { $logger } from "alepha/logger";
4
- //#region ../../src/container/core/providers/ContainerProvider.ts
5
- /**
6
- * Abstract transport for `$container` proxies.
7
- *
8
- * Concrete subclasses translate a `(container, action, config)` call
9
- * into an HTTP request that reaches the running container. The default
10
- * binding on Node throws — apps must register either a
11
- * `NodeContainerProvider` (with `url` on each primitive) or the
12
- * Cloudflare workerd variant.
13
- */
14
- var ContainerProvider = class {
15
- log = $logger();
16
- /**
17
- * Invoke a remote action on the container. Subclasses do the work;
18
- * the default implementation rejects to make missing wiring obvious.
19
- */
20
- async invoke(container, action, config) {
21
- throw new AlephaError(`No ContainerProvider configured for container '${container.name}' (action '${action}'). Set up alepha/container via AlephaContainer and either supply 'url' (Node) or build for target=cloudflare.`);
22
- }
23
- /**
24
- * Helper: build the fetch path/body for an action call. Kept as a
25
- * protected method so workerd and Node providers share the wire
26
- * shape — `POST /api/<action>` with the JSON body, query params on
27
- * the URL, and the request headers merged in.
28
- */
29
- buildRequest(action, config) {
30
- const params = new URLSearchParams();
31
- if (config.query) {
32
- for (const [k, v] of Object.entries(config.query)) if (v !== void 0 && v !== null) params.set(k, String(v));
33
- }
34
- let path = `/api/${action}`;
35
- if (config.params) {
36
- const tail = [];
37
- for (const [k, v] of Object.entries(config.params)) {
38
- const placeholder = `:${k}`;
39
- const encoded = encodeURIComponent(String(v));
40
- if (path.includes(placeholder)) path = path.replace(placeholder, encoded);
41
- else tail.push(encoded);
42
- }
43
- if (tail.length) path += `/${tail.join("/")}`;
44
- }
45
- const search = params.toString();
46
- if (search) path += `?${search}`;
47
- const init = {
48
- method: "POST",
49
- headers: {
50
- "content-type": "application/json",
51
- ...config.headers ?? {}
52
- },
53
- body: config.body !== void 0 ? JSON.stringify(config.body) : void 0
54
- };
55
- return {
56
- path,
57
- init
58
- };
59
- }
60
- };
61
- //#endregion
62
- //#region ../../src/container/core/primitives/$container.ts
63
- /**
64
- * `$container` — typed RPC client to a containerized Alepha app.
65
- *
66
- * Returns a typed Proxy whose method calls map 1:1 to the target
67
- * controller's `$action` endpoints. The wire format mirrors what a
68
- * normal Alepha server exposes (`POST /api/<method>` with a JSON body),
69
- * so the container is literally a tiny Alepha worker.
70
- *
71
- * Transport is owned by the active {@link ContainerProvider}:
72
- * - `target=cloudflare` → `CloudflareContainerProvider` routes through
73
- * the Containers binding (`env.<NAME>.getContainer(...).fetch()`).
74
- * - Node (with `url` set) → `NodeContainerProvider` uses plain
75
- * `fetch()` against the configured URL.
76
- *
77
- * Build-time, `BuildCloudflareTask.enhanceContainers` walks
78
- * `alepha.primitives($container)` to emit the matching `wrangler.jsonc`
79
- * entries and Durable Object class declarations into
80
- * `main.cloudflare.js`.
81
- *
82
- * @example
83
- * ```ts
84
- * import { $container } from "alepha/container";
85
- * import type { RocketController } from "@alepha/rocket";
86
- *
87
- * class DeployService {
88
- * rocket = $container<RocketController>({
89
- * image: "alepha/rocket:latest",
90
- * port: 3000,
91
- * sleepAfter: "15m",
92
- * });
93
- *
94
- * async deploy() {
95
- * return this.rocket.createJob({ body: { op: "up" } });
96
- * }
97
- * }
98
- * ```
99
- */
100
- const $container = (options) => {
101
- if (!options.image) throw new AlephaError("$container requires an 'image' option");
102
- return createPrimitive(ContainerPrimitive, options).proxy();
103
- };
104
- var ContainerPrimitive = class extends Primitive {
105
- provider = $inject(ContainerProvider);
106
- get name() {
107
- return this.options.name ?? this.config.propertyKey;
108
- }
109
- /**
110
- * Build the typed Proxy. The target is the primitive itself so
111
- * `instanceof Primitive` keeps working (required by Alepha's
112
- * primitive registration in `Alepha.new`). Property reads that match
113
- * an own/inherited member return that member; anything else is
114
- * treated as an action name and routed through the provider.
115
- */
116
- proxy() {
117
- const primitive = this;
118
- return new Proxy(primitive, { get(target, prop, receiver) {
119
- if (typeof prop === "symbol" || prop in target) return Reflect.get(target, prop, receiver);
120
- return (config = {}) => primitive.provider.invoke(primitive, prop, config);
121
- } });
122
- }
123
- };
124
- $container[KIND] = ContainerPrimitive;
125
- //#endregion
126
- //#region ../../src/container/core/providers/CloudflareContainerProvider.ts
127
- /**
128
- * Cloudflare Workers (workerd) container provider.
129
- *
130
- * Routes proxy calls through the Cloudflare Containers binding bound
131
- * on `env.<NAME>`, using a single shared instance per container.
132
- * `getContainer` from `@cloudflare/containers` is a free function (not
133
- * a method on the binding) — it takes the DO namespace and an id and
134
- * returns a stub with a `.fetch()` method targeting the running
135
- * container instance.
136
- *
137
- * The binding is generated by `BuildCloudflareTask.enhanceContainers`
138
- * from the `$container` primitives discovered in the app. The runtime
139
- * `env` object is pulled from the Alepha store key `cloudflare.env`
140
- * — the worker entry point publishes it there on every fetch
141
- * (`__alepha.set("cloudflare.env", env)`).
142
- */
143
- var CloudflareContainerProvider = class extends ContainerProvider {
144
- alepha = $inject(Alepha);
145
- async invoke(container, action, config) {
146
- const env = this.alepha.store.get("cloudflare.env");
147
- if (!env) throw new AlephaError(`CloudflareContainerProvider could not resolve 'cloudflare.env' from the store — is the app running on workerd?`);
148
- const bindingName = container.name.toUpperCase();
149
- const binding = env[bindingName];
150
- if (!binding) throw new AlephaError(`Cloudflare Containers binding '${bindingName}' not found on env — check wrangler.jsonc.`);
151
- const instance = getContainer(binding, "shared");
152
- const { path, init } = this.buildRequest(action, config);
153
- const request = new Request(`http://container${path}`, init);
154
- const response = await instance.fetch(request);
155
- if (!response.ok) {
156
- const text = await response.text().catch(() => "");
157
- throw new AlephaError(`Container '${container.name}' action '${action}' failed: ${response.status} ${response.statusText}${text ? ` — ${text}` : ""}`);
158
- }
159
- if ((response.headers.get("content-type") ?? "").includes("application/json")) return await response.json();
160
- return await response.text();
161
- }
162
- };
163
- //#endregion
164
- //#region ../../src/container/core/index.workerd.ts
165
- globalThis.__alepha_CloudflareContainer = Container;
166
- /**
167
- * Type-safe RPC clients for ephemeral containerized Alepha apps,
168
- * Cloudflare workerd build.
169
- *
170
- * Auto-binds `CloudflareContainerProvider` so `$container()` calls
171
- * route through `env.<NAME>.getContainer(...).fetch()`. Pair with
172
- * `BuildCloudflareTask.enhanceContainers` (in `alepha/cli/core`) which
173
- * emits the wrangler.jsonc bindings and DO class declarations.
174
- *
175
- * @module alepha.container
176
- */
177
- const AlephaContainer = $module({
178
- name: "alepha.container",
179
- primitives: [$container],
180
- services: [ContainerProvider, CloudflareContainerProvider],
181
- register: (alepha) => {
182
- alepha.with({
183
- optional: true,
184
- provide: ContainerProvider,
185
- use: CloudflareContainerProvider
186
- });
187
- }
188
- });
189
- //#endregion
190
- export { $container, AlephaContainer, CloudflareContainerProvider, ContainerPrimitive, ContainerProvider };
191
-
192
- //# sourceMappingURL=index.workerd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.workerd.js","names":[],"sources":["../../../src/container/core/providers/ContainerProvider.ts","../../../src/container/core/primitives/$container.ts","../../../src/container/core/providers/CloudflareContainerProvider.ts","../../../src/container/core/index.workerd.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { ContainerPrimitive } from \"../primitives/$container.ts\";\n\nexport interface ContainerInvokeConfig {\n body?: unknown;\n query?: Record<string, unknown>;\n params?: Record<string, unknown>;\n headers?: Record<string, string>;\n}\n\n/**\n * Abstract transport for `$container` proxies.\n *\n * Concrete subclasses translate a `(container, action, config)` call\n * into an HTTP request that reaches the running container. The default\n * binding on Node throws — apps must register either a\n * `NodeContainerProvider` (with `url` on each primitive) or the\n * Cloudflare workerd variant.\n */\nexport abstract class ContainerProvider {\n protected readonly log = $logger();\n\n /**\n * Invoke a remote action on the container. Subclasses do the work;\n * the default implementation rejects to make missing wiring obvious.\n */\n public async invoke(\n container: ContainerPrimitive,\n action: string,\n config: ContainerInvokeConfig,\n ): Promise<unknown> {\n void config;\n throw new AlephaError(\n `No ContainerProvider configured for container '${container.name}' (action '${action}'). ` +\n `Set up alepha/container via AlephaContainer and either supply 'url' (Node) or build for target=cloudflare.`,\n );\n }\n\n /**\n * Helper: build the fetch path/body for an action call. Kept as a\n * protected method so workerd and Node providers share the wire\n * shape — `POST /api/<action>` with the JSON body, query params on\n * the URL, and the request headers merged in.\n */\n protected buildRequest(\n action: string,\n config: ContainerInvokeConfig,\n ): { path: string; init: RequestInit } {\n const params = new URLSearchParams();\n if (config.query) {\n for (const [k, v] of Object.entries(config.query)) {\n if (v !== undefined && v !== null) params.set(k, String(v));\n }\n }\n\n // Match the route Alepha generates server-side when no explicit\n // `path:` is set on `$action`: `/${name}` with one `/:<key>`\n // segment appended per param. Params that match a `:key`\n // placeholder are substituted in place; any remaining params are\n // appended in declaration order so `params: {id:\"abc\"}` against a\n // proxy action `getDeploy` yields `/api/getDeploy/abc`.\n let path = `/api/${action}`;\n if (config.params) {\n const tail: string[] = [];\n for (const [k, v] of Object.entries(config.params)) {\n const placeholder = `:${k}`;\n const encoded = encodeURIComponent(String(v));\n if (path.includes(placeholder)) {\n path = path.replace(placeholder, encoded);\n } else {\n tail.push(encoded);\n }\n }\n if (tail.length) path += `/${tail.join(\"/\")}`;\n }\n\n const search = params.toString();\n if (search) path += `?${search}`;\n\n const init: RequestInit = {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(config.headers ?? {}),\n },\n body: config.body !== undefined ? JSON.stringify(config.body) : undefined,\n };\n\n return { path, init };\n }\n}\n","import { $inject, AlephaError, createPrimitive, KIND, Primitive } from \"alepha\";\nimport type { ContainerPrimitiveOptions } from \"../interfaces/ContainerOptions.ts\";\nimport { ContainerProvider } from \"../providers/ContainerProvider.ts\";\n\n/**\n * `$container` — typed RPC client to a containerized Alepha app.\n *\n * Returns a typed Proxy whose method calls map 1:1 to the target\n * controller's `$action` endpoints. The wire format mirrors what a\n * normal Alepha server exposes (`POST /api/<method>` with a JSON body),\n * so the container is literally a tiny Alepha worker.\n *\n * Transport is owned by the active {@link ContainerProvider}:\n * - `target=cloudflare` → `CloudflareContainerProvider` routes through\n * the Containers binding (`env.<NAME>.getContainer(...).fetch()`).\n * - Node (with `url` set) → `NodeContainerProvider` uses plain\n * `fetch()` against the configured URL.\n *\n * Build-time, `BuildCloudflareTask.enhanceContainers` walks\n * `alepha.primitives($container)` to emit the matching `wrangler.jsonc`\n * entries and Durable Object class declarations into\n * `main.cloudflare.js`.\n *\n * @example\n * ```ts\n * import { $container } from \"alepha/container\";\n * import type { RocketController } from \"@alepha/rocket\";\n *\n * class DeployService {\n * rocket = $container<RocketController>({\n * image: \"alepha/rocket:latest\",\n * port: 3000,\n * sleepAfter: \"15m\",\n * });\n *\n * async deploy() {\n * return this.rocket.createJob({ body: { op: \"up\" } });\n * }\n * }\n * ```\n */\nexport const $container = <T extends object = any>(\n options: ContainerPrimitiveOptions,\n): ContainerProxy<T> => {\n if (!options.image) {\n throw new AlephaError(\"$container requires an 'image' option\");\n }\n const instance = createPrimitive(ContainerPrimitive, options);\n return instance.proxy() as ContainerProxy<T>;\n};\n\n/**\n * Typed proxy returned by `$container<T>()`. Each `$action` member of\n * `T` becomes a callable returning the action's response body.\n *\n * The runtime shape is a `Proxy(primitive)` — own-property reads hit the\n * underlying `ContainerPrimitive` (so `alepha.primitives($container)`\n * still finds it via the `instanceof Primitive` check inside\n * `Alepha.new()`), and anything else is treated as an action name and\n * routed through the active `ContainerProvider`.\n */\nexport type ContainerProxy<T extends object> = {\n [K in keyof T]: T[K] extends (...args: infer A) => infer R\n ? (...args: A) => Promise<Awaited<R>>\n : (config?: {\n body?: unknown;\n query?: unknown;\n params?: unknown;\n }) => Promise<any>;\n};\n\nexport class ContainerPrimitive extends Primitive<ContainerPrimitiveOptions> {\n protected readonly provider = $inject(ContainerProvider);\n\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * Build the typed Proxy. The target is the primitive itself so\n * `instanceof Primitive` keeps working (required by Alepha's\n * primitive registration in `Alepha.new`). Property reads that match\n * an own/inherited member return that member; anything else is\n * treated as an action name and routed through the provider.\n */\n public proxy<T extends object = any>(): ContainerProxy<T> {\n const primitive = this;\n return new Proxy(primitive as any, {\n get(target: any, prop: string | symbol, receiver: any) {\n if (typeof prop === \"symbol\" || prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n return (config: any = {}) =>\n primitive.provider.invoke(primitive, prop as string, config);\n },\n }) as ContainerProxy<T>;\n }\n}\n\n$container[KIND] = ContainerPrimitive;\n","import { getContainer } from \"@cloudflare/containers\";\nimport { $inject, Alepha, AlephaError } from \"alepha\";\nimport type { ContainerPrimitive } from \"../primitives/$container.ts\";\nimport {\n type ContainerInvokeConfig,\n ContainerProvider,\n} from \"./ContainerProvider.ts\";\n\n/**\n * Cloudflare Workers (workerd) container provider.\n *\n * Routes proxy calls through the Cloudflare Containers binding bound\n * on `env.<NAME>`, using a single shared instance per container.\n * `getContainer` from `@cloudflare/containers` is a free function (not\n * a method on the binding) — it takes the DO namespace and an id and\n * returns a stub with a `.fetch()` method targeting the running\n * container instance.\n *\n * The binding is generated by `BuildCloudflareTask.enhanceContainers`\n * from the `$container` primitives discovered in the app. The runtime\n * `env` object is pulled from the Alepha store key `cloudflare.env`\n * — the worker entry point publishes it there on every fetch\n * (`__alepha.set(\"cloudflare.env\", env)`).\n */\nexport class CloudflareContainerProvider extends ContainerProvider {\n protected readonly alepha = $inject(Alepha);\n\n public override async invoke(\n container: ContainerPrimitive,\n action: string,\n config: ContainerInvokeConfig,\n ): Promise<unknown> {\n const env = this.alepha.store.get(\"cloudflare.env\") as\n | Record<string, unknown>\n | undefined;\n if (!env) {\n throw new AlephaError(\n `CloudflareContainerProvider could not resolve 'cloudflare.env' from the store — is the app running on workerd?`,\n );\n }\n\n const bindingName = container.name.toUpperCase();\n const binding = env[bindingName];\n if (!binding) {\n throw new AlephaError(\n `Cloudflare Containers binding '${bindingName}' not found on env — check wrangler.jsonc.`,\n );\n }\n\n const instance = getContainer(binding as never, \"shared\");\n const { path, init } = this.buildRequest(action, config);\n const request = new Request(`http://container${path}`, init);\n const response = await instance.fetch(request);\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new AlephaError(\n `Container '${container.name}' action '${action}' failed: ${response.status} ${response.statusText}${\n text ? ` — ${text}` : \"\"\n }`,\n );\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return await response.json();\n }\n return await response.text();\n }\n}\n","import { Container } from \"@cloudflare/containers\";\nimport { $module } from \"alepha\";\nimport { $container } from \"./primitives/$container.ts\";\nimport { CloudflareContainerProvider } from \"./providers/CloudflareContainerProvider.ts\";\nimport { ContainerProvider } from \"./providers/ContainerProvider.ts\";\n\n// Stash the Cloudflare Containers `Container` base class on globalThis\n// so `BuildCloudflareTask`'s post-Vite-emitted entry\n// (`dist/main.cloudflare.js`) can declare\n// `class <T> extends globalThis.__alepha_CloudflareContainer` without\n// introducing a bare `@cloudflare/containers` specifier.\n//\n// The entry is written AFTER Vite — anything Vite hasn't seen\n// survives as an unresolved import all the way to workerd (where the\n// upload is `no_bundle: true`). This side-effect runs whenever an app\n// imports anything from `alepha/container` (Vite picks this file via\n// the `workerd` export condition), so by the time the entry's\n// `import \"./index.js\"` finishes, the global is set and the\n// `extends` expression resolves.\n(globalThis as any).__alepha_CloudflareContainer = Container;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./interfaces/ContainerOptions.ts\";\nexport * from \"./primitives/$container.ts\";\nexport * from \"./providers/CloudflareContainerProvider.ts\";\nexport * from \"./providers/ContainerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Type-safe RPC clients for ephemeral containerized Alepha apps,\n * Cloudflare workerd build.\n *\n * Auto-binds `CloudflareContainerProvider` so `$container()` calls\n * route through `env.<NAME>.getContainer(...).fetch()`. Pair with\n * `BuildCloudflareTask.enhanceContainers` (in `alepha/cli/core`) which\n * emits the wrangler.jsonc bindings and DO class declarations.\n *\n * @module alepha.container\n */\nexport const AlephaContainer = $module({\n name: \"alepha.container\",\n primitives: [$container],\n services: [ContainerProvider, CloudflareContainerProvider],\n register: (alepha) => {\n alepha.with({\n optional: true,\n provide: ContainerProvider,\n use: CloudflareContainerProvider,\n });\n },\n});\n"],"mappings":"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"}