alepha 0.21.2 → 0.22.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 (463) hide show
  1. package/README.md +0 -1
  2. package/dist/api/audits/index.browser.js.map +1 -1
  3. package/dist/api/audits/index.d.ts +393 -403
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/audits/index.js +25 -56
  6. package/dist/api/audits/index.js.map +1 -1
  7. package/dist/api/files/index.browser.js +31 -1
  8. package/dist/api/files/index.browser.js.map +1 -1
  9. package/dist/api/files/index.d.ts +313 -208
  10. package/dist/api/files/index.d.ts.map +1 -1
  11. package/dist/api/files/index.js +152 -42
  12. package/dist/api/files/index.js.map +1 -1
  13. package/dist/api/jobs/index.browser.js +2 -2
  14. package/dist/api/jobs/index.browser.js.map +1 -1
  15. package/dist/api/jobs/index.d.ts +289 -292
  16. package/dist/api/jobs/index.d.ts.map +1 -1
  17. package/dist/api/jobs/index.js +39 -33
  18. package/dist/api/jobs/index.js.map +1 -1
  19. package/dist/api/keys/index.d.ts +211 -216
  20. package/dist/api/keys/index.d.ts.map +1 -1
  21. package/dist/api/keys/index.js.map +1 -1
  22. package/dist/api/notifications/index.browser.js.map +1 -1
  23. package/dist/api/notifications/index.d.ts +188 -195
  24. package/dist/api/notifications/index.d.ts.map +1 -1
  25. package/dist/api/notifications/index.js.map +1 -1
  26. package/dist/api/oauth/index.d.ts +71 -76
  27. package/dist/api/oauth/index.d.ts.map +1 -1
  28. package/dist/api/oauth/index.js.map +1 -1
  29. package/dist/api/organizations/index.browser.js.map +1 -1
  30. package/dist/api/organizations/index.d.ts +104 -109
  31. package/dist/api/organizations/index.d.ts.map +1 -1
  32. package/dist/api/organizations/index.js.map +1 -1
  33. package/dist/api/parameters/index.browser.js +43 -16
  34. package/dist/api/parameters/index.browser.js.map +1 -1
  35. package/dist/api/parameters/index.d.ts +488 -344
  36. package/dist/api/parameters/index.d.ts.map +1 -1
  37. package/dist/api/parameters/index.js +175 -35
  38. package/dist/api/parameters/index.js.map +1 -1
  39. package/dist/api/payments/index.d.ts +396 -402
  40. package/dist/api/payments/index.d.ts.map +1 -1
  41. package/dist/api/payments/index.js.map +1 -1
  42. package/dist/api/subscriptions/index.d.ts +644 -652
  43. package/dist/api/subscriptions/index.d.ts.map +1 -1
  44. package/dist/api/subscriptions/index.js +1 -1
  45. package/dist/api/subscriptions/index.js.map +1 -1
  46. package/dist/api/users/index.browser.js +7 -0
  47. package/dist/api/users/index.browser.js.map +1 -1
  48. package/dist/api/users/index.d.ts +1073 -1006
  49. package/dist/api/users/index.d.ts.map +1 -1
  50. package/dist/api/users/index.js +283 -61
  51. package/dist/api/users/index.js.map +1 -1
  52. package/dist/api/verifications/index.browser.js.map +1 -1
  53. package/dist/api/verifications/index.d.ts +134 -140
  54. package/dist/api/verifications/index.d.ts.map +1 -1
  55. package/dist/api/verifications/index.js.map +1 -1
  56. package/dist/background/index.d.ts +95 -0
  57. package/dist/background/index.d.ts.map +1 -0
  58. package/dist/background/index.js +121 -0
  59. package/dist/background/index.js.map +1 -0
  60. package/dist/background/index.workerd.js +110 -0
  61. package/dist/background/index.workerd.js.map +1 -0
  62. package/dist/batch/index.d.ts +5 -7
  63. package/dist/batch/index.d.ts.map +1 -1
  64. package/dist/batch/index.js.map +1 -1
  65. package/dist/bin/index.js.map +1 -1
  66. package/dist/bucket/index.d.ts +76 -54
  67. package/dist/bucket/index.d.ts.map +1 -1
  68. package/dist/bucket/index.js +58 -11
  69. package/dist/bucket/index.js.map +1 -1
  70. package/dist/bucket/index.workerd.js +200 -5
  71. package/dist/bucket/index.workerd.js.map +1 -1
  72. package/dist/cache/core/index.d.ts +7 -10
  73. package/dist/cache/core/index.d.ts.map +1 -1
  74. package/dist/cache/core/index.js.map +1 -1
  75. package/dist/cache/core/index.workerd.js.map +1 -1
  76. package/dist/cache/database/index.d.ts +22 -26
  77. package/dist/cache/database/index.d.ts.map +1 -1
  78. package/dist/cache/database/index.js.map +1 -1
  79. package/dist/cache/redis/index.d.ts +4 -7
  80. package/dist/cache/redis/index.d.ts.map +1 -1
  81. package/dist/cache/redis/index.js.map +1 -1
  82. package/dist/captcha/index.d.ts +3 -6
  83. package/dist/captcha/index.d.ts.map +1 -1
  84. package/dist/captcha/index.js.map +1 -1
  85. package/dist/cli/config/index.d.ts.map +1 -1
  86. package/dist/cli/config/index.js.map +1 -1
  87. package/dist/cli/core/index.d.ts +417 -214
  88. package/dist/cli/core/index.d.ts.map +1 -1
  89. package/dist/cli/core/index.js +325 -563
  90. package/dist/cli/core/index.js.map +1 -1
  91. package/dist/cli/devtools/index.d.ts +3 -5
  92. package/dist/cli/devtools/index.d.ts.map +1 -1
  93. package/dist/cli/devtools/index.js.map +1 -1
  94. package/dist/cli/i18n/index.d.ts +8 -12
  95. package/dist/cli/i18n/index.d.ts.map +1 -1
  96. package/dist/cli/i18n/index.js.map +1 -1
  97. package/dist/cli/platform/index.d.ts +126 -1342
  98. package/dist/cli/platform/index.d.ts.map +1 -1
  99. package/dist/cli/platform/index.js +136 -2374
  100. package/dist/cli/platform/index.js.map +1 -1
  101. package/dist/cli/platform-lib/index.d.ts +1446 -0
  102. package/dist/cli/platform-lib/index.d.ts.map +1 -0
  103. package/dist/cli/platform-lib/index.js +2597 -0
  104. package/dist/cli/platform-lib/index.js.map +1 -0
  105. package/dist/cli/vendor/index.d.ts +17 -21
  106. package/dist/cli/vendor/index.d.ts.map +1 -1
  107. package/dist/cli/vendor/index.js.map +1 -1
  108. package/dist/command/index.d.ts +21 -20
  109. package/dist/command/index.d.ts.map +1 -1
  110. package/dist/command/index.js +39 -10
  111. package/dist/command/index.js.map +1 -1
  112. package/dist/{containers → container}/core/index.d.ts +13 -15
  113. package/dist/container/core/index.d.ts.map +1 -0
  114. package/dist/{containers → container}/core/index.js +23 -14
  115. package/dist/container/core/index.js.map +1 -0
  116. package/dist/{containers → container}/core/index.workerd.js +37 -22
  117. package/dist/container/core/index.workerd.js.map +1 -0
  118. package/dist/core/index.browser.js +27 -1
  119. package/dist/core/index.browser.js.map +1 -1
  120. package/dist/core/index.d.ts +48 -24
  121. package/dist/core/index.d.ts.map +1 -1
  122. package/dist/core/index.js +27 -1
  123. package/dist/core/index.js.map +1 -1
  124. package/dist/core/index.native.js +27 -1
  125. package/dist/core/index.native.js.map +1 -1
  126. package/dist/core/index.workerd.js +27 -1
  127. package/dist/core/index.workerd.js.map +1 -1
  128. package/dist/crypto/index.browser.js.map +1 -1
  129. package/dist/crypto/index.d.ts +5 -8
  130. package/dist/crypto/index.d.ts.map +1 -1
  131. package/dist/crypto/index.js.map +1 -1
  132. package/dist/datetime/index.d.ts +3 -4
  133. package/dist/datetime/index.d.ts.map +1 -1
  134. package/dist/datetime/index.js.map +1 -1
  135. package/dist/email/brevo/index.d.ts +2 -4
  136. package/dist/email/brevo/index.d.ts.map +1 -1
  137. package/dist/email/brevo/index.js.map +1 -1
  138. package/dist/email/cloudflare/index.d.ts +20 -7
  139. package/dist/email/cloudflare/index.d.ts.map +1 -1
  140. package/dist/email/cloudflare/index.js +46 -9
  141. package/dist/email/cloudflare/index.js.map +1 -1
  142. package/dist/email/core/index.d.ts +6 -9
  143. package/dist/email/core/index.d.ts.map +1 -1
  144. package/dist/email/core/index.js.map +1 -1
  145. package/dist/email/core/index.workerd.js.map +1 -1
  146. package/dist/email/smtp/index.d.ts +10 -13
  147. package/dist/email/smtp/index.d.ts.map +1 -1
  148. package/dist/email/smtp/index.js +107 -32
  149. package/dist/email/smtp/index.js.map +1 -1
  150. package/dist/fake/index.d.ts +1 -2
  151. package/dist/fake/index.d.ts.map +1 -1
  152. package/dist/fake/index.js.map +1 -1
  153. package/dist/lock/core/index.d.ts +9 -14
  154. package/dist/lock/core/index.d.ts.map +1 -1
  155. package/dist/lock/core/index.js.map +1 -1
  156. package/dist/lock/redis/index.d.ts +2 -4
  157. package/dist/lock/redis/index.d.ts.map +1 -1
  158. package/dist/lock/redis/index.js.map +1 -1
  159. package/dist/logger/index.d.ts +105 -76
  160. package/dist/logger/index.d.ts.map +1 -1
  161. package/dist/logger/index.js +196 -174
  162. package/dist/logger/index.js.map +1 -1
  163. package/dist/mcp/index.d.ts +16 -20
  164. package/dist/mcp/index.d.ts.map +1 -1
  165. package/dist/mcp/index.js.map +1 -1
  166. package/dist/orm/core/index.browser.js.map +1 -1
  167. package/dist/orm/core/index.bun.js +19 -1
  168. package/dist/orm/core/index.bun.js.map +1 -1
  169. package/dist/orm/core/index.d.ts +76 -62
  170. package/dist/orm/core/index.d.ts.map +1 -1
  171. package/dist/orm/core/index.js +20 -2
  172. package/dist/orm/core/index.js.map +1 -1
  173. package/dist/orm/postgres/index.bun.js.map +1 -1
  174. package/dist/orm/postgres/index.d.ts +28 -20
  175. package/dist/orm/postgres/index.d.ts.map +1 -1
  176. package/dist/orm/postgres/index.js.map +1 -1
  177. package/dist/queue/core/index.d.ts +12 -15
  178. package/dist/queue/core/index.d.ts.map +1 -1
  179. package/dist/queue/core/index.js.map +1 -1
  180. package/dist/queue/core/index.workerd.js.map +1 -1
  181. package/dist/queue/redis/index.d.ts +3 -5
  182. package/dist/queue/redis/index.d.ts.map +1 -1
  183. package/dist/queue/redis/index.js.map +1 -1
  184. package/dist/react/auth/index.browser.js +9 -2
  185. package/dist/react/auth/index.browser.js.map +1 -1
  186. package/dist/react/auth/index.d.ts +14 -9
  187. package/dist/react/auth/index.d.ts.map +1 -1
  188. package/dist/react/auth/index.js +9 -2
  189. package/dist/react/auth/index.js.map +1 -1
  190. package/dist/react/core/index.d.ts +7 -8
  191. package/dist/react/core/index.d.ts.map +1 -1
  192. package/dist/react/core/index.js +6 -3
  193. package/dist/react/core/index.js.map +1 -1
  194. package/dist/react/form/index.d.ts +2 -4
  195. package/dist/react/form/index.d.ts.map +1 -1
  196. package/dist/react/form/index.js.map +1 -1
  197. package/dist/react/head/index.browser.js.map +1 -1
  198. package/dist/react/head/index.d.ts +2 -4
  199. package/dist/react/head/index.d.ts.map +1 -1
  200. package/dist/react/head/index.js.map +1 -1
  201. package/dist/react/i18n/index.d.ts +47 -11
  202. package/dist/react/i18n/index.d.ts.map +1 -1
  203. package/dist/react/i18n/index.js +33 -1
  204. package/dist/react/i18n/index.js.map +1 -1
  205. package/dist/react/intro/index.d.ts +1 -2
  206. package/dist/react/intro/index.d.ts.map +1 -1
  207. package/dist/react/intro/index.js +2 -2
  208. package/dist/react/intro/index.js.map +1 -1
  209. package/dist/react/router/index.browser.js +65 -19
  210. package/dist/react/router/index.browser.js.map +1 -1
  211. package/dist/react/router/index.d.ts +327 -222
  212. package/dist/react/router/index.d.ts.map +1 -1
  213. package/dist/react/router/index.js +65 -29
  214. package/dist/react/router/index.js.map +1 -1
  215. package/dist/react/testing/index.d.ts +1 -2
  216. package/dist/react/testing/index.d.ts.map +1 -1
  217. package/dist/react/testing/index.js +16 -17
  218. package/dist/react/testing/index.js.map +1 -1
  219. package/dist/react/ui/index.d.ts +20 -25
  220. package/dist/react/ui/index.d.ts.map +1 -1
  221. package/dist/react/ui/index.js.map +1 -1
  222. package/dist/redis/index.bun.js.map +1 -1
  223. package/dist/redis/index.d.ts +17 -19
  224. package/dist/redis/index.d.ts.map +1 -1
  225. package/dist/redis/index.js.map +1 -1
  226. package/dist/retry/index.d.ts +2 -4
  227. package/dist/retry/index.d.ts.map +1 -1
  228. package/dist/retry/index.js.map +1 -1
  229. package/dist/router/index.d.ts.map +1 -1
  230. package/dist/router/index.js.map +1 -1
  231. package/dist/scheduler/index.d.ts +10 -13
  232. package/dist/scheduler/index.d.ts.map +1 -1
  233. package/dist/scheduler/index.js.map +1 -1
  234. package/dist/scheduler/index.workerd.js.map +1 -1
  235. package/dist/security/index.browser.js.map +1 -1
  236. package/dist/security/index.d.ts +45 -48
  237. package/dist/security/index.d.ts.map +1 -1
  238. package/dist/security/index.js.map +1 -1
  239. package/dist/server/auth/index.browser.js.map +1 -1
  240. package/dist/server/auth/index.d.ts +167 -172
  241. package/dist/server/auth/index.d.ts.map +1 -1
  242. package/dist/server/auth/index.js +4 -8
  243. package/dist/server/auth/index.js.map +1 -1
  244. package/dist/server/cookies/index.browser.js.map +1 -1
  245. package/dist/server/cookies/index.d.ts +5 -7
  246. package/dist/server/cookies/index.d.ts.map +1 -1
  247. package/dist/server/cookies/index.js.map +1 -1
  248. package/dist/server/core/index.browser.js.map +1 -1
  249. package/dist/server/core/index.d.ts +88 -73
  250. package/dist/server/core/index.d.ts.map +1 -1
  251. package/dist/server/core/index.js +19 -0
  252. package/dist/server/core/index.js.map +1 -1
  253. package/dist/server/cors/index.d.ts +11 -14
  254. package/dist/server/cors/index.d.ts.map +1 -1
  255. package/dist/server/cors/index.js.map +1 -1
  256. package/dist/server/etag/index.d.ts +6 -9
  257. package/dist/server/etag/index.d.ts.map +1 -1
  258. package/dist/server/etag/index.js.map +1 -1
  259. package/dist/server/health/index.d.ts +18 -21
  260. package/dist/server/health/index.d.ts.map +1 -1
  261. package/dist/server/health/index.js.map +1 -1
  262. package/dist/server/links/index.browser.js +2 -0
  263. package/dist/server/links/index.browser.js.map +1 -1
  264. package/dist/server/links/index.d.ts +63 -67
  265. package/dist/server/links/index.d.ts.map +1 -1
  266. package/dist/server/links/index.js +2 -0
  267. package/dist/server/links/index.js.map +1 -1
  268. package/dist/server/metrics/index.d.ts +5 -7
  269. package/dist/server/metrics/index.d.ts.map +1 -1
  270. package/dist/server/metrics/index.js.map +1 -1
  271. package/dist/server/proxy/index.d.ts +3 -5
  272. package/dist/server/proxy/index.d.ts.map +1 -1
  273. package/dist/server/proxy/index.js.map +1 -1
  274. package/dist/server/rate-limit/index.d.ts +10 -13
  275. package/dist/server/rate-limit/index.d.ts.map +1 -1
  276. package/dist/server/rate-limit/index.js.map +1 -1
  277. package/dist/server/static/index.d.ts +3 -5
  278. package/dist/server/static/index.d.ts.map +1 -1
  279. package/dist/server/static/index.js.map +1 -1
  280. package/dist/server/swagger/index.d.ts +5 -8
  281. package/dist/server/swagger/index.d.ts.map +1 -1
  282. package/dist/server/swagger/index.js.map +1 -1
  283. package/dist/sms/index.d.ts +3 -5
  284. package/dist/sms/index.d.ts.map +1 -1
  285. package/dist/sms/index.js.map +1 -1
  286. package/dist/system/index.browser.js.map +1 -1
  287. package/dist/system/index.d.ts +2 -4
  288. package/dist/system/index.d.ts.map +1 -1
  289. package/dist/system/index.js.map +1 -1
  290. package/dist/system/index.workerd.js.map +1 -1
  291. package/dist/topic/core/index.d.ts +4 -6
  292. package/dist/topic/core/index.d.ts.map +1 -1
  293. package/dist/topic/core/index.js.map +1 -1
  294. package/dist/topic/redis/index.d.ts +5 -8
  295. package/dist/topic/redis/index.d.ts.map +1 -1
  296. package/dist/topic/redis/index.js.map +1 -1
  297. package/package.json +45 -22
  298. package/src/api/audits/__tests__/AuditService.spec.ts +18 -110
  299. package/src/api/audits/controllers/AdminAuditController.ts +14 -0
  300. package/src/api/audits/services/AuditService.ts +21 -88
  301. package/src/api/files/__tests__/FileService.spec.ts +207 -2
  302. package/src/api/files/index.ts +3 -0
  303. package/src/api/files/schemas/fileCreatorSummarySchema.ts +22 -0
  304. package/src/api/files/schemas/fileResourceSchema.ts +10 -1
  305. package/src/api/files/services/FileService.ts +170 -72
  306. package/src/api/jobs/__tests__/$job.spec.ts +24 -1
  307. package/src/api/jobs/index.ts +4 -3
  308. package/src/api/jobs/primitives/$job.ts +7 -3
  309. package/src/api/jobs/providers/DirectJobDispatcher.ts +17 -36
  310. package/src/api/jobs/providers/JobProvider.ts +53 -24
  311. package/src/api/jobs/schemas/jobConfigAtom.ts +1 -1
  312. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +4 -1
  313. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +3 -1
  314. package/src/api/parameters/__tests__/$parameter.spec.ts +19 -2
  315. package/src/api/parameters/audits/ParameterAudits.ts +17 -0
  316. package/src/api/parameters/controllers/AdminParameterController.ts +95 -19
  317. package/src/api/parameters/index.ts +3 -0
  318. package/src/api/parameters/schemas/activateParameterBodySchema.ts +3 -3
  319. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +3 -2
  320. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +25 -0
  321. package/src/api/parameters/schemas/parameterResponseSchema.ts +5 -0
  322. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +4 -2
  323. package/src/api/parameters/services/ParameterProvider.ts +69 -6
  324. package/src/api/subscriptions/jobs/SubscriptionJobs.ts +1 -1
  325. package/src/api/users/__tests__/AdminSessionController.spec.ts +37 -0
  326. package/src/api/users/audits/SessionAudits.ts +33 -0
  327. package/src/api/users/audits/UserAudits.ts +19 -43
  328. package/src/api/users/controllers/AdminUserController.ts +66 -1
  329. package/src/api/users/entities/sessions.ts +6 -0
  330. package/src/api/users/entities/users.ts +2 -0
  331. package/src/api/users/index.ts +9 -1
  332. package/src/api/users/primitives/$realm.ts +3 -0
  333. package/src/api/users/schemas/sessionResourceSchema.ts +16 -0
  334. package/src/api/users/schemas/updateUserSchema.ts +1 -8
  335. package/src/api/users/schemas/userQuerySchema.ts +7 -0
  336. package/src/api/users/services/CredentialService.ts +15 -6
  337. package/src/api/users/services/IdentityService.ts +2 -1
  338. package/src/api/users/services/RegistrationService.ts +2 -1
  339. package/src/api/users/services/SessionCrudService.ts +19 -2
  340. package/src/api/users/services/SessionService.ts +39 -19
  341. package/src/api/users/services/UserService.ts +106 -8
  342. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +96 -0
  343. package/src/background/index.ts +37 -0
  344. package/src/background/index.workerd.ts +28 -0
  345. package/src/background/providers/BackgroundTaskProvider.ts +70 -0
  346. package/src/background/providers/WorkerdBackgroundTaskProvider.ts +43 -0
  347. package/src/bucket/__tests__/$bucket.spec.ts +18 -0
  348. package/src/bucket/__tests__/LocalFileStorageProvider.spec.ts +5 -0
  349. package/src/bucket/__tests__/MemoryFileStorageProvider.spec.ts +5 -0
  350. package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +23 -4
  351. package/src/bucket/__tests__/shared.ts +30 -0
  352. package/src/bucket/index.ts +5 -5
  353. package/src/bucket/index.workerd.ts +11 -4
  354. package/src/bucket/primitives/$bucket.ts +27 -0
  355. package/src/bucket/providers/FileStorageProvider.ts +13 -0
  356. package/src/bucket/providers/LocalFileStorageProvider.ts +17 -1
  357. package/src/bucket/providers/MemoryFileStorageProvider.ts +7 -0
  358. package/src/bucket/providers/{CloudflareR2Provider.ts → R2FileStorageProvider.ts} +10 -1
  359. package/src/bucket/providers/{NodeS3BucketProvider.ts → S3FileStorageProvider.ts} +27 -5
  360. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +25 -1
  361. package/src/cli/core/__tests__/init.spec.ts +0 -219
  362. package/src/cli/core/commands/__tests__/BuildCommand.spec.ts +43 -0
  363. package/src/cli/core/commands/build.ts +108 -30
  364. package/src/cli/core/commands/init.ts +0 -12
  365. package/src/cli/core/commands/pack.ts +133 -0
  366. package/src/cli/core/index.ts +3 -0
  367. package/src/cli/core/providers/ViteDevServerProvider.ts +40 -16
  368. package/src/cli/core/services/PackageManagerUtils.ts +0 -16
  369. package/src/cli/core/services/ProjectScaffolder.ts +29 -291
  370. package/src/cli/core/tasks/BuildCloudflareTask.ts +353 -47
  371. package/src/cli/core/tasks/BuildDockerTask.ts +33 -3
  372. package/src/cli/core/tasks/BuildTask.ts +34 -0
  373. package/src/cli/core/templates/apiIndexTs.ts +1 -22
  374. package/src/cli/core/templates/mainCss.ts +0 -1
  375. package/src/cli/core/templates/webAppRouterTs.ts +0 -99
  376. package/src/cli/core/templates/webIndexTs.ts +1 -22
  377. package/src/cli/platform/__tests__/SecretsCommand.spec.ts +5 -3
  378. package/src/cli/platform/commands/SecretsCommand.ts +8 -6
  379. package/src/cli/platform/commands/platform.ts +192 -46
  380. package/src/cli/platform/index.ts +12 -52
  381. package/src/cli/{platform → platform-lib}/__tests__/CloudflareAdapter.spec.ts +426 -169
  382. package/src/cli/{platform → platform-lib}/__tests__/NamingService.spec.ts +91 -4
  383. package/src/cli/{platform → platform-lib}/__tests__/VercelAdapter.spec.ts +56 -85
  384. package/src/cli/{platform → platform-lib}/adapters/CloudflareAdapter.ts +402 -165
  385. package/src/cli/{platform → platform-lib}/adapters/PlatformAdapter.ts +62 -35
  386. package/src/cli/{platform → platform-lib}/adapters/VercelAdapter.ts +6 -10
  387. package/src/cli/{platform → platform-lib}/atoms/platformOptions.ts +34 -1
  388. package/src/cli/platform-lib/index.ts +67 -0
  389. package/src/cli/platform-lib/services/NamingService.ts +136 -0
  390. package/src/cli/{platform → platform-lib}/services/PlatformInspector.ts +60 -13
  391. package/src/cli/{platform → platform-lib}/services/PlatformOrchestrator.ts +54 -43
  392. package/src/cli/{platform → platform-lib}/services/WranglerApi.ts +4 -2
  393. package/src/command/__tests__/Runner.spec.ts +20 -0
  394. package/src/command/helpers/EnvUtils.ts +19 -3
  395. package/src/command/helpers/Runner.ts +12 -2
  396. package/src/command/providers/CliProvider.ts +34 -1
  397. package/src/{containers → container}/core/__tests__/$container.spec.ts +5 -5
  398. package/src/{containers → container}/core/index.ts +4 -4
  399. package/src/{containers → container}/core/index.workerd.ts +19 -3
  400. package/src/{containers → container}/core/primitives/$container.ts +1 -1
  401. package/src/{containers → container}/core/providers/CloudflareContainerProvider.ts +17 -19
  402. package/src/{containers → container}/core/providers/ContainerProvider.ts +16 -2
  403. package/src/{containers → container}/core/providers/MockContainerProvider.ts +1 -1
  404. package/src/core/Alepha.ts +49 -1
  405. package/src/core/__tests__/$env.spec.ts +42 -0
  406. package/src/core/__tests__/dump.spec.ts +47 -0
  407. package/src/email/cloudflare/__tests__/CloudflareEmailProvider.spec.ts +42 -10
  408. package/src/email/cloudflare/index.ts +14 -5
  409. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +54 -9
  410. package/src/logger/__tests__/Logger.spec.ts +55 -0
  411. package/src/logger/index.ts +13 -0
  412. package/src/logger/services/Logger.ts +31 -1
  413. package/src/orm/__tests__/orm-showcase-tests.ts +27 -0
  414. package/src/orm/__tests__/orm-showcase.spec.ts +12 -0
  415. package/src/orm/core/interfaces/PgQuery.ts +4 -1
  416. package/src/orm/core/services/Repository.ts +27 -11
  417. package/src/react/auth/hooks/useAuth.ts +10 -5
  418. package/src/react/core/__tests__/useQuery.browser.spec.tsx +25 -0
  419. package/src/react/core/hooks/useAction.ts +14 -3
  420. package/src/react/core/hooks/useQuery.ts +24 -4
  421. package/src/react/i18n/components/Translate.tsx +47 -0
  422. package/src/react/i18n/index.ts +2 -0
  423. package/src/react/intro/components/GettingStartedAdminSlide.tsx +2 -2
  424. package/src/react/router/__tests__/$page.spec.tsx +3 -2
  425. package/src/react/router/__tests__/page-can.spec.ts +18 -13
  426. package/src/react/router/hooks/useQueryParams.ts +114 -14
  427. package/src/react/router/primitives/$page.ts +85 -4
  428. package/src/react/router/providers/ReactBrowserRouterProvider.ts +3 -7
  429. package/src/react/router/providers/ReactServerProvider.ts +4 -13
  430. package/src/react/ui/services/SchemaControl.ts +3 -4
  431. package/src/server/core/providers/ServerMultipartProvider.ts +19 -0
  432. package/src/server/links/providers/LinkProvider.ts +10 -0
  433. package/dist/containers/core/index.d.ts.map +0 -1
  434. package/dist/containers/core/index.js.map +0 -1
  435. package/dist/containers/core/index.workerd.js.map +0 -1
  436. package/src/cli/core/templates/componentsJsonTs.ts +0 -39
  437. package/src/cli/core/templates/saasAdminLayoutTsx.ts +0 -77
  438. package/src/cli/core/templates/saasAdminPagesTsx.ts +0 -26
  439. package/src/cli/core/templates/saasAuthLayoutTsx.ts +0 -22
  440. package/src/cli/core/templates/saasAuthPagesTsx.ts +0 -62
  441. package/src/cli/core/templates/saasRealmProviderTs.ts +0 -52
  442. package/src/cli/platform/services/NamingService.ts +0 -54
  443. /package/dist/orm/core/{chunk-o8xxKEmq.js → chunk-B4FMCO8f.js} +0 -0
  444. /package/dist/react/testing/{chunk-6Ep1yQYe.js → chunk-BpyX8vjI.js} +0 -0
  445. /package/src/cli/{platform → platform-lib}/__tests__/GitHubSecretStore.spec.ts +0 -0
  446. /package/src/cli/{platform → platform-lib}/__tests__/PlatformCacheProvider.spec.ts +0 -0
  447. /package/src/cli/{platform → platform-lib}/__tests__/PlatformInspector.spec.ts +0 -0
  448. /package/src/cli/{platform → platform-lib}/__tests__/PlatformOrchestrator.spec.ts +0 -0
  449. /package/src/cli/{platform → platform-lib}/__tests__/SecretFilterService.spec.ts +0 -0
  450. /package/src/cli/{platform → platform-lib}/__tests__/detectResources.spec.ts +0 -0
  451. /package/src/cli/{platform → platform-lib}/providers/GitHubSecretStore.ts +0 -0
  452. /package/src/cli/{platform → platform-lib}/providers/MemorySecretStore.ts +0 -0
  453. /package/src/cli/{platform → platform-lib}/providers/PlatformCacheProvider.ts +0 -0
  454. /package/src/cli/{platform → platform-lib}/providers/SecretStoreProvider.ts +0 -0
  455. /package/src/cli/{platform → platform-lib}/schemas/cloudflare.ts +0 -0
  456. /package/src/cli/{platform → platform-lib}/schemas/platform.ts +0 -0
  457. /package/src/cli/{platform → platform-lib}/schemas/vercel.ts +0 -0
  458. /package/src/cli/{platform → platform-lib}/services/CloudflareApi.ts +0 -0
  459. /package/src/cli/{platform → platform-lib}/services/SecretFilterService.ts +0 -0
  460. /package/src/cli/{platform → platform-lib}/services/VercelApi.ts +0 -0
  461. /package/src/cli/{platform → platform-lib}/services/VercelCli.ts +0 -0
  462. /package/src/{containers → container}/core/interfaces/ContainerOptions.ts +0 -0
  463. /package/src/{containers → container}/core/providers/NodeContainerProvider.ts +0 -0
@@ -1,30 +1,9 @@
1
1
  export interface ApiIndexTsOptions {
2
2
  appName?: string;
3
- /**
4
- * Include `AlephaApiUsers` (realms, sessions, registration, identities,
5
- * password reset, email verification, admin endpoints) plus the local
6
- * `RealmProvider` that declares `$realm({ ... })`.
7
- */
8
- saas?: boolean;
9
3
  }
10
4
 
11
5
  export const apiIndexTs = (options: ApiIndexTsOptions = {}) => {
12
- const { appName = "app", saas = false } = options;
13
-
14
- if (saas) {
15
- return `
16
- import { $module } from "alepha";
17
- import { AlephaApiUsers } from "alepha/api/users";
18
- import { HelloController } from "./controllers/HelloController.ts";
19
- import { RealmProvider } from "./providers/RealmProvider.ts";
20
-
21
- export const ApiModule = $module({
22
- name: "${appName}.api",
23
- services: [HelloController, RealmProvider],
24
- imports: [AlephaApiUsers],
25
- });
26
- `.trim();
27
- }
6
+ const { appName = "app" } = options;
28
7
 
29
8
  return `
30
9
  import { $module } from "alepha";
@@ -11,7 +11,6 @@ export const mainCss = (opts: { tailwind?: boolean } = {}) => {
11
11
  *
12
12
  * Options:
13
13
  * - Tailwind CSS: Use \`alepha init --tailwind\` to add Tailwind CSS
14
- * - shadcn/ui: Use \`alepha init --shadcn\` to add shadcn/ui setup
15
14
  * - Raw CSS: Write your own styles below
16
15
  */
17
16
 
@@ -1,16 +1,8 @@
1
1
  export interface WebAppRouterOptions {
2
2
  api?: boolean;
3
- saas?: boolean;
4
3
  }
5
4
 
6
5
  export const webAppRouterTs = (options: WebAppRouterOptions) => {
7
- if (options.saas) {
8
- return saasAppRouterTs();
9
- }
10
- return basicAppRouterTs(options);
11
- };
12
-
13
- const basicAppRouterTs = (options: WebAppRouterOptions) => {
14
6
  const imports: string[] = ['import { $page } from "alepha/react/router";'];
15
7
  const classMembers: string[] = [];
16
8
 
@@ -39,94 +31,3 @@ export class AppRouter {
39
31
  ${classMembers.join("\n\n")}
40
32
  }`;
41
33
  };
42
-
43
- /**
44
- * SaaS router wires three trees onto the app:
45
- * / → Home
46
- * /auth/* → AuthLayout + login / register / reset / verify
47
- * /admin/* → AdminLayout + users / sessions / api-keys / parameters / audits
48
- *
49
- * Each auth page resolves the realm config from its loader, so the registry
50
- * components render with everything they need on first paint.
51
- */
52
- const saasAppRouterTs =
53
- () => `import type { RealmController } from "alepha/api/users";
54
- import { $page, NotFound } from "alepha/react/router";
55
- import { $secure } from "alepha/security";
56
- import { $client } from "alepha/server/links";
57
- import type { HelloController } from "../api/controllers/HelloController.ts";
58
-
59
- export class AppRouter {
60
- protected readonly api = $client<HelloController>();
61
- protected readonly realmApi = $client<RealmController>();
62
-
63
- home = $page({
64
- path: "/",
65
- lazy: () => import("./components/Home.tsx"),
66
- loader: () => this.api.hello(),
67
- });
68
-
69
- // ── /auth — login, register, reset, verify ─────────────────────────────
70
- authLayout = $page({
71
- path: "/auth",
72
- lazy: () => import("./components/auth/AuthLayout.tsx"),
73
- });
74
-
75
- login = $page({
76
- parent: this.authLayout,
77
- path: "/login",
78
- name: "login",
79
- head: { title: "Sign in" },
80
- lazy: () => import("./components/auth/Login.tsx"),
81
- loader: async () => ({ realmConfig: await this.realmApi.getRealmConfig() }),
82
- });
83
-
84
- register = $page({
85
- parent: this.authLayout,
86
- path: "/register",
87
- name: "register",
88
- head: { title: "Sign up" },
89
- lazy: () => import("./components/auth/Register.tsx"),
90
- loader: async () => ({ realmConfig: await this.realmApi.getRealmConfig() }),
91
- });
92
-
93
- resetPassword = $page({
94
- parent: this.authLayout,
95
- path: "/reset-password",
96
- head: { title: "Reset password" },
97
- lazy: () => import("./components/auth/ResetPassword.tsx"),
98
- loader: async () => ({ realmConfig: await this.realmApi.getRealmConfig() }),
99
- });
100
-
101
- verifyEmail = $page({
102
- parent: this.authLayout,
103
- path: "/verify-email",
104
- head: { title: "Verify email" },
105
- lazy: () => import("./components/auth/VerifyEmail.tsx"),
106
- });
107
-
108
- // ── /admin — gated by 'admin:ui' permission, declared in RealmProvider.
109
- // Children inherit the gate via the parent chain.
110
- adminLayout = $page({
111
- path: "/admin",
112
- use: [$secure({ permissions: ["admin:ui"] })],
113
- lazy: () => import("./components/admin/AdminLayout.tsx"),
114
- });
115
-
116
- adminUsers = $page({
117
- parent: this.adminLayout,
118
- path: "/users",
119
- head: { title: "Users" },
120
- lazy: () => import("./components/admin/Users.tsx"),
121
- });
122
-
123
- adminSessions = $page({
124
- parent: this.adminLayout,
125
- path: "/sessions",
126
- head: { title: "Sessions" },
127
- lazy: () => import("./components/admin/Sessions.tsx"),
128
- });
129
-
130
- notFound = $page({ path: "/*", component: NotFound });
131
- }
132
- `;
@@ -1,30 +1,9 @@
1
1
  export interface WebIndexTsOptions {
2
2
  appName?: string;
3
- /**
4
- * SaaS bundle: auth pages need `useAuth()` (ReactAuth) which lives in the
5
- * `alepha.react.auth` module. Importing it here registers ReactAuth in the
6
- * container so the auth-* registry components can inject it.
7
- */
8
- saas?: boolean;
9
3
  }
10
4
 
11
5
  export const webIndexTs = (options: WebIndexTsOptions = {}) => {
12
- const { appName = "app", saas = false } = options;
13
-
14
- if (saas) {
15
- return `
16
- import { $module } from "alepha";
17
- import { AlephaReactAuth } from "alepha/react/auth";
18
- import { AlephaReactI18n } from "alepha/react/i18n";
19
- import { AppRouter } from "./AppRouter.ts";
20
-
21
- export const WebModule = $module({
22
- name: "${appName}.web",
23
- services: [AppRouter],
24
- imports: [AlephaReactAuth, AlephaReactI18n],
25
- });
26
- `.trim();
27
- }
6
+ const { appName = "app" } = options;
28
7
 
29
8
  return `
30
9
  import { $module } from "alepha";
@@ -1,11 +1,13 @@
1
1
  import { Alepha } from "alepha";
2
+ import {
3
+ MemorySecretStore,
4
+ platformOptions,
5
+ type SecretStoreProvider,
6
+ } from "alepha/cli/platform-lib";
2
7
  import { CliProvider } from "alepha/command";
3
8
  import { FileSystemProvider, MemoryFileSystemProvider } from "alepha/system";
4
9
  import { describe, test } from "vitest";
5
- import { platformOptions } from "../atoms/platformOptions.ts";
6
10
  import { SecretsCommand } from "../commands/SecretsCommand.ts";
7
- import { MemorySecretStore } from "../providers/MemorySecretStore.ts";
8
- import type { SecretStoreProvider } from "../providers/SecretStoreProvider.ts";
9
11
 
10
12
  class TestSecretsCommand extends SecretsCommand {
11
13
  public readonly testList = this.list;
@@ -1,12 +1,14 @@
1
1
  import { $inject, $state, AlephaError, t } from "alepha";
2
+ import {
3
+ GitHubSecretStore,
4
+ NamingService,
5
+ PlatformInspector,
6
+ platformOptions,
7
+ SecretFilterService,
8
+ type SecretStoreProvider,
9
+ } from "alepha/cli/platform-lib";
2
10
  import { $command, EnvUtils } from "alepha/command";
3
11
  import { $logger, ConsoleColorProvider } from "alepha/logger";
4
- import { platformOptions } from "../atoms/platformOptions.ts";
5
- import { GitHubSecretStore } from "../providers/GitHubSecretStore.ts";
6
- import type { SecretStoreProvider } from "../providers/SecretStoreProvider.ts";
7
- import { NamingService } from "../services/NamingService.ts";
8
- import { PlatformInspector } from "../services/PlatformInspector.ts";
9
- import { SecretFilterService } from "../services/SecretFilterService.ts";
10
12
 
11
13
  export class SecretsCommand {
12
14
  protected readonly log = $logger();
@@ -1,24 +1,20 @@
1
1
  import { $inject, $state, AlephaError, t } from "alepha";
2
- import { AppEntryProvider, ViteBuildProvider } from "alepha/cli";
3
- import { $command, EnvUtils } from "alepha/command";
4
- import { $logger, ConsoleColorProvider } from "alepha/logger";
5
- import { CloudflareAdapter } from "../adapters/CloudflareAdapter.ts";
6
- import type {
7
- AppDefinition,
8
- DetectedResources,
9
- } from "../adapters/PlatformAdapter.ts";
10
- import { VercelAdapter } from "../adapters/VercelAdapter.ts";
11
- import { platformOptions } from "../atoms/platformOptions.ts";
12
- import type {
13
- PlatformPlanOutput,
14
- PlatformStatusOutput,
15
- } from "../schemas/platform.ts";
16
- import { NamingService } from "../services/NamingService.ts";
2
+ import { type AppEntry, AppEntryProvider, ViteBuildProvider } from "alepha/cli";
17
3
  import {
4
+ CloudflareAdapter,
5
+ type DetectedResources,
6
+ NamingService,
18
7
  PlatformInspector,
8
+ PlatformOrchestrator,
9
+ type PlatformPlanOutput,
10
+ type PlatformStatusOutput,
11
+ platformOptions,
19
12
  type ResolvedPlatformConfig,
20
- } from "../services/PlatformInspector.ts";
21
- import { PlatformOrchestrator } from "../services/PlatformOrchestrator.ts";
13
+ resolveTenant,
14
+ VercelAdapter,
15
+ } from "alepha/cli/platform-lib";
16
+ import { $command, EnvUtils } from "alepha/command";
17
+ import { $logger, ConsoleColorProvider } from "alepha/logger";
22
18
  import { SecretsCommand } from "./SecretsCommand.ts";
23
19
 
24
20
  export class PlatformCommand {
@@ -43,6 +39,12 @@ export class PlatformCommand {
43
39
  description: "Target environment",
44
40
  }),
45
41
  ),
42
+ tenant: t.optional(
43
+ t.text({
44
+ description:
45
+ "Tenant slug (apps with tenancy: optional | required). Names resources <tenant>-<project>-<env> and serves <tenant>.<domain>.",
46
+ }),
47
+ ),
46
48
  verbose: t.optional(
47
49
  t.boolean({
48
50
  aliases: ["v"],
@@ -75,7 +77,8 @@ export class PlatformCommand {
75
77
  config,
76
78
  this.isServerless(adapterName),
77
79
  );
78
- const namingCtx = this.naming.forContext(config.project, env);
80
+ const tenant = resolveTenant(config.tenancy, flags.tenant);
81
+ const namingCtx = this.naming.forContext(config.project, env, tenant);
79
82
 
80
83
  // --- Data collection ---
81
84
 
@@ -231,14 +234,18 @@ export class PlatformCommand {
231
234
  root,
232
235
  config,
233
236
  this.isServerless(adapter),
237
+ { prebuilt: flags.prebuilt },
234
238
  );
235
239
 
236
240
  const result = await this.orchestrator.up({
237
241
  root,
238
242
  env,
239
- apps,
243
+ entry: apps[0].entry,
244
+ resources: apps[0].resources,
245
+
240
246
  run,
241
247
  prebuilt: flags.prebuilt,
248
+ tenant: flags.tenant,
242
249
  });
243
250
 
244
251
  if (flags.json) {
@@ -296,8 +303,11 @@ export class PlatformCommand {
296
303
  const completed = await this.orchestrator.down({
297
304
  root,
298
305
  env: flags.env,
299
- apps,
306
+ entry: apps[0].entry,
307
+ resources: apps[0].resources,
308
+
300
309
  run,
310
+ tenant: flags.tenant,
301
311
  confirm: async (prompt) => {
302
312
  if (flags.yes) {
303
313
  return flags.env as string;
@@ -347,8 +357,11 @@ export class PlatformCommand {
347
357
  const { state } = await this.orchestrator.status({
348
358
  root,
349
359
  env,
350
- apps,
360
+ entry: apps[0].entry,
361
+ resources: apps[0].resources,
362
+
351
363
  run,
364
+ tenant: flags.tenant,
352
365
  });
353
366
 
354
367
  // --- JSON output ---
@@ -521,20 +534,22 @@ export class PlatformCommand {
521
534
  config,
522
535
  this.isServerless(envConfig.adapter),
523
536
  );
524
- const namingCtx = this.naming.forContext(config.project, env);
537
+ const tenant = resolveTenant(config.tenancy, flags.tenant);
538
+ const namingCtx = this.naming.forContext(config.project, env, tenant);
525
539
 
526
540
  const ctx = {
527
541
  project: config.project,
528
542
  env,
529
543
  envConfig,
530
- apps,
544
+ entry: apps[0].entry,
545
+ resources: apps[0].resources,
546
+
531
547
  root,
532
548
  naming: namingCtx,
549
+ tenant,
533
550
  };
534
551
 
535
- for (const app of apps) {
536
- await adapter.build({ ...ctx, app }, run);
537
- }
552
+ await adapter.build(ctx, run);
538
553
  },
539
554
  });
540
555
 
@@ -552,22 +567,23 @@ export class PlatformCommand {
552
567
  config,
553
568
  this.isServerless(envConfig.adapter),
554
569
  );
555
- const namingCtx = this.naming.forContext(config.project, env);
570
+ const tenant = resolveTenant(config.tenancy, flags.tenant);
571
+ const namingCtx = this.naming.forContext(config.project, env, tenant);
556
572
 
557
573
  const ctx = {
558
574
  project: config.project,
559
575
  env,
560
576
  envConfig,
561
- apps,
577
+ entry: apps[0].entry,
578
+ resources: apps[0].resources,
579
+
562
580
  root,
563
581
  naming: namingCtx,
582
+ tenant,
564
583
  };
565
584
 
566
585
  await adapter.authenticate(ctx, run);
567
-
568
- for (const app of apps) {
569
- await adapter.deploy({ ...ctx, app }, run);
570
- }
586
+ await adapter.deploy(ctx, run);
571
587
  },
572
588
  });
573
589
 
@@ -585,15 +601,19 @@ export class PlatformCommand {
585
601
  config,
586
602
  this.isServerless(envConfig.adapter),
587
603
  );
588
- const namingCtx = this.naming.forContext(config.project, env);
604
+ const tenant = resolveTenant(config.tenancy, flags.tenant);
605
+ const namingCtx = this.naming.forContext(config.project, env, tenant);
589
606
 
590
607
  const ctx = {
591
608
  project: config.project,
592
609
  env,
593
610
  envConfig,
594
- apps,
611
+ entry: apps[0].entry,
612
+ resources: apps[0].resources,
613
+
595
614
  root,
596
615
  naming: namingCtx,
616
+ tenant,
597
617
  };
598
618
 
599
619
  await adapter.authenticate(ctx, run);
@@ -611,6 +631,72 @@ export class PlatformCommand {
611
631
  },
612
632
  });
613
633
 
634
+ protected readonly dbExport = $command({
635
+ name: "export",
636
+ description:
637
+ "Export the deployed database to a local snapshot (remote → local dev DB).",
638
+ flags: t.object({
639
+ ...this.envFlags.properties,
640
+ output: t.optional(
641
+ t.text({
642
+ description:
643
+ "Destination SQLite file. Defaults to the dev DB path (node_modules/.alepha/sqlite.db).",
644
+ }),
645
+ ),
646
+ keepSql: t.optional(
647
+ t.boolean({
648
+ description: "Keep the intermediate .sql dump file.",
649
+ }),
650
+ ),
651
+ }),
652
+ handler: async ({ flags, root, run }) => {
653
+ const config = await this.inspector.resolveConfig(root);
654
+ const env = flags.env ?? config.defaultEnv;
655
+ const envConfig = config.environments[env];
656
+ const adapter = this.orchestrator.resolveAdapter(envConfig.adapter);
657
+ const app = await this.resolveApp(
658
+ root,
659
+ config,
660
+ this.isServerless(envConfig.adapter),
661
+ );
662
+ const tenant = resolveTenant(config.tenancy, flags.tenant);
663
+ const namingCtx = this.naming.forContext(config.project, env, tenant);
664
+
665
+ const ctx = {
666
+ project: config.project,
667
+ env,
668
+ envConfig,
669
+ entry: app.entry,
670
+ resources: app.resources,
671
+
672
+ root,
673
+ naming: namingCtx,
674
+ tenant,
675
+ };
676
+
677
+ await adapter.authenticate(ctx, run);
678
+ await adapter.exportDb(ctx, run, {
679
+ output: flags.output,
680
+ keepSql: flags.keepSql,
681
+ });
682
+ },
683
+ });
684
+
685
+ /**
686
+ * `db` subgroup — operations against the *deployed* database (export,
687
+ * migrate). They live under `platform` (not core `alepha db`) because
688
+ * they need the env config, tenancy, adapter, and resource naming.
689
+ */
690
+ protected readonly db = $command({
691
+ name: "db",
692
+ description: "Deployed-database operations (export, migrate).",
693
+ children: [this.dbExport, this.migrate],
694
+ handler: async ({ help, root }) => {
695
+ await this.inspector.resolveConfig(root);
696
+ help();
697
+ },
698
+ });
699
+
614
700
  // -----------------------------------------------------------------------
615
701
  // Parent command
616
702
  // -----------------------------------------------------------------------
@@ -626,7 +712,7 @@ export class PlatformCommand {
626
712
  this.status,
627
713
  this.build,
628
714
  this.deploy,
629
- this.migrate,
715
+ this.db,
630
716
  this.secretsCommand.secrets,
631
717
  ],
632
718
  handler: async ({ help, root }) => {
@@ -649,11 +735,29 @@ export class PlatformCommand {
649
735
  * ViteBuildProvider.init() per app. This is expensive -- only done
650
736
  * for up/down/status, not for plan.
651
737
  */
652
- protected async resolveApps(
738
+ protected async resolveApp(
653
739
  root: string,
654
- config: ResolvedPlatformConfig,
740
+ _config: ResolvedPlatformConfig,
655
741
  isServerless: boolean,
656
- ): Promise<AppDefinition[]> {
742
+ options: { prebuilt?: boolean } = {},
743
+ ): Promise<{ entry: AppEntry; resources: DetectedResources }> {
744
+ // Prebuilt + manifest fast-path: read `dist/manifest.json` produced
745
+ // by the original `alepha build` instead of re-booting the workspace
746
+ // via Vite. Lets external orchestrators (Alepha Rocket) avoid the
747
+ // workspace's runtime `npm install` — the app source is never
748
+ // imported here, so missing deps (react-dom, etc.) don't matter.
749
+ if (options.prebuilt) {
750
+ const manifest = await this.readManifest(root);
751
+ if (manifest) {
752
+ return {
753
+ entry: { root, server: "" },
754
+ resources: manifest.resources,
755
+ };
756
+ }
757
+ // No manifest — fall through to introspection. Useful for older
758
+ // artifacts that pre-date the manifest emission.
759
+ }
760
+
657
761
  const entry = await this.boot.getAppEntry(root);
658
762
  if (isServerless) {
659
763
  process.env.ALEPHA_SERVERLESS = "true";
@@ -662,20 +766,62 @@ export class PlatformCommand {
662
766
  delete process.env.ALEPHA_SERVERLESS;
663
767
  const resources = this.detectResources(appAlepha);
664
768
 
665
- return [
666
- {
667
- name: config.project,
668
- path: "",
669
- entry,
670
- resources,
671
- },
672
- ];
769
+ return { entry, resources };
770
+ }
771
+
772
+ /**
773
+ * @deprecated single-app projects; use `resolveApp` directly.
774
+ * Kept temporarily so existing commands can be migrated one at a time.
775
+ */
776
+ protected async resolveApps(
777
+ root: string,
778
+ config: ResolvedPlatformConfig,
779
+ isServerless: boolean,
780
+ options: { prebuilt?: boolean } = {},
781
+ ): Promise<
782
+ Array<{
783
+ name: string;
784
+ path: string;
785
+ entry: AppEntry;
786
+ resources: DetectedResources;
787
+ }>
788
+ > {
789
+ const { entry, resources } = await this.resolveApp(
790
+ root,
791
+ config,
792
+ isServerless,
793
+ options,
794
+ );
795
+ return [{ name: config.project, path: "", entry, resources }];
673
796
  }
674
797
 
675
798
  protected isServerless(adapter: string): boolean {
676
799
  return adapter === "vercel" || adapter === "cloudflare";
677
800
  }
678
801
 
802
+ /**
803
+ * Read `dist/manifest.json` if present. Returns `null` when the file
804
+ * doesn't exist or isn't parseable — caller falls back to the
805
+ * Vite-introspection path.
806
+ */
807
+ protected async readManifest(root: string): Promise<{
808
+ version: number;
809
+ project: string;
810
+ resources: DetectedResources;
811
+ } | null> {
812
+ try {
813
+ const fs = await import("node:fs/promises");
814
+ const path = await import("node:path");
815
+ const raw = await fs.readFile(
816
+ path.join(root, "dist", "manifest.json"),
817
+ "utf-8",
818
+ );
819
+ return JSON.parse(raw);
820
+ } catch {
821
+ return null;
822
+ }
823
+ }
824
+
679
825
  protected detectResources(alepha: any): DetectedResources {
680
826
  let hasDatabase = false;
681
827
  let hasBucket = false;
@@ -1,33 +1,23 @@
1
1
  import { $context, $module } from "alepha";
2
2
  import { AlephaCli } from "alepha/cli";
3
- import { CloudflareAdapter } from "./adapters/CloudflareAdapter.ts";
4
- import { VercelAdapter } from "./adapters/VercelAdapter.ts";
5
3
  import {
4
+ AlephaPlatformLibPlugin,
6
5
  type PlatformOptions,
7
6
  platformOptions,
8
- } from "./atoms/platformOptions.ts";
7
+ } from "alepha/cli/platform-lib";
9
8
  import { PlatformCommand } from "./commands/platform.ts";
10
9
  import { SecretsCommand } from "./commands/SecretsCommand.ts";
11
- import { GitHubSecretStore } from "./providers/GitHubSecretStore.ts";
12
- import { MemorySecretStore } from "./providers/MemorySecretStore.ts";
13
- import { PlatformCacheProvider } from "./providers/PlatformCacheProvider.ts";
14
- import { CloudflareApi } from "./services/CloudflareApi.ts";
15
- import { NamingService } from "./services/NamingService.ts";
16
- import { PlatformInspector } from "./services/PlatformInspector.ts";
17
- import { PlatformOrchestrator } from "./services/PlatformOrchestrator.ts";
18
- import { SecretFilterService } from "./services/SecretFilterService.ts";
19
- import { VercelApi } from "./services/VercelApi.ts";
20
- import { VercelCli } from "./services/VercelCli.ts";
21
- import { WranglerApi } from "./services/WranglerApi.ts";
22
10
 
23
11
  // ---------------------------------------------------------------------------
24
12
 
25
13
  /**
26
14
  * CLI plugin for multi-cloud deployment orchestration.
27
15
  *
28
- * Manages the full lifecycle of deploying Alepha apps: provision
29
- * resources, build, migrate databases, deploy, and sync secrets.
30
- * Supports Cloudflare Workers and Vercel.
16
+ * Wraps `AlephaPlatformLibPlugin` (the framework-agnostic deploy
17
+ * services) with `$command` instances so the orchestration is
18
+ * reachable from `alepha platform …`. Non-CLI consumers (e.g. Alepha
19
+ * Rocket) should depend on `alepha/cli/platform-lib` directly instead
20
+ * of pulling in this command surface.
31
21
  *
32
22
  * Commands:
33
23
  * - `alepha platform plan` — show project topology and resource names
@@ -35,9 +25,10 @@ import { WranglerApi } from "./services/WranglerApi.ts";
35
25
  * - `alepha platform down` — teardown an environment
36
26
  * - `alepha platform status` — inspect deployed resources
37
27
  * - `alepha platform build` — build apps locally
38
- * - `alepha platform deploy` — deploy to cloud
39
- * - `alepha platform migrate` — run database migrations
40
- * - `alepha platform secrets` manage external secret stores
28
+ * - `alepha platform deploy` — deploy to cloud
29
+ * - `alepha platform db migrate` — run database migrations
30
+ * - `alepha platform db export` pull the deployed DB into a local snapshot
31
+ * - `alepha platform secrets` — manage external secret stores
41
32
  *
42
33
  * Configuration in `alepha.config.ts`:
43
34
  *
@@ -59,21 +50,9 @@ export const AlephaCliPlatformPlugin = $module({
59
50
  name: "alepha.cli.plugins.platform",
60
51
  services: [
61
52
  AlephaCli,
53
+ AlephaPlatformLibPlugin,
62
54
  PlatformCommand,
63
55
  SecretsCommand,
64
- CloudflareAdapter,
65
- CloudflareApi,
66
- VercelAdapter,
67
- VercelApi,
68
- VercelCli,
69
- WranglerApi,
70
- PlatformCacheProvider,
71
- GitHubSecretStore,
72
- MemorySecretStore,
73
- NamingService,
74
- SecretFilterService,
75
- PlatformInspector,
76
- PlatformOrchestrator,
77
56
  ],
78
57
  });
79
58
 
@@ -99,24 +78,5 @@ export const platform = (options: PlatformOptions) => {
99
78
 
100
79
  // ---------------------------------------------------------------------------
101
80
 
102
- export * from "./adapters/CloudflareAdapter.ts";
103
- export * from "./adapters/PlatformAdapter.ts";
104
- export * from "./adapters/VercelAdapter.ts";
105
- export * from "./atoms/platformOptions.ts";
106
81
  export * from "./commands/platform.ts";
107
82
  export * from "./commands/SecretsCommand.ts";
108
- export * from "./providers/GitHubSecretStore.ts";
109
- export * from "./providers/MemorySecretStore.ts";
110
- export * from "./providers/PlatformCacheProvider.ts";
111
- export * from "./providers/SecretStoreProvider.ts";
112
- export * from "./schemas/cloudflare.ts";
113
- export * from "./schemas/platform.ts";
114
- export * from "./schemas/vercel.ts";
115
- export * from "./services/CloudflareApi.ts";
116
- export * from "./services/NamingService.ts";
117
- export * from "./services/PlatformInspector.ts";
118
- export * from "./services/PlatformOrchestrator.ts";
119
- export * from "./services/SecretFilterService.ts";
120
- export * from "./services/VercelApi.ts";
121
- export * from "./services/VercelCli.ts";
122
- export * from "./services/WranglerApi.ts";