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,8 +1,25 @@
1
+ import { AlephaError } from "alepha";
1
2
  import type { AppEntry } from "alepha/cli";
2
3
  import type { RunnerMethod } from "alepha/command";
3
4
  import type { EnvironmentConfig } from "../atoms/platformOptions.ts";
4
5
  import type { NamingContext } from "../services/NamingService.ts";
5
6
 
7
+ /**
8
+ * Options for {@link PlatformAdapter.exportDb}.
9
+ */
10
+ export interface ExportDbOptions {
11
+ /**
12
+ * Destination file for the local snapshot. Adapter-specific default —
13
+ * Cloudflare/D1 writes the dev SQLite at
14
+ * `node_modules/.alepha/sqlite.db`.
15
+ */
16
+ output?: string;
17
+ /**
18
+ * Keep the intermediate `.sql` dump instead of deleting it after import.
19
+ */
20
+ keepSql?: boolean;
21
+ }
22
+
6
23
  // ---------------------------------------------------------------------------
7
24
  // Context types
8
25
  // ---------------------------------------------------------------------------
@@ -15,32 +32,14 @@ export interface DetectedResources {
15
32
  hasCron: boolean;
16
33
  }
17
34
 
18
- export interface AppDefinition {
19
- /**
20
- * Slugified app name (from package.json).
21
- */
22
- name: string;
23
-
24
- /**
25
- * Relative path from root (e.g., "apps/api").
26
- * Empty string for standalone apps.
27
- */
28
- path: string;
29
-
30
- /**
31
- * Resolved entry points for this app.
32
- */
33
- entry: AppEntry;
34
-
35
- /**
36
- * Cloud resources detected by introspecting the app.
37
- */
38
- resources: DetectedResources;
39
- }
40
-
35
+ /**
36
+ * One workspace = one app. Used to be a per-app definition in a
37
+ * monorepo-aware orchestrator; flattened into `PlatformContext` after
38
+ * the `apps:` field was removed from platform options.
39
+ */
41
40
  export interface PlatformContext {
42
41
  /**
43
- * Slugified project name (from root package.json or config).
42
+ * Slugified project name (from package.json or platform config).
44
43
  */
45
44
  project: string;
46
45
 
@@ -55,20 +54,35 @@ export interface PlatformContext {
55
54
  envConfig: EnvironmentConfig;
56
55
 
57
56
  /**
58
- * All apps in the project.
57
+ * Workspace root path.
59
58
  */
60
- apps: AppDefinition[];
59
+ root: string;
61
60
 
62
61
  /**
63
- * Monorepo/project root path.
62
+ * Resolved entry points for the workspace. Stub (`{ root, server: "" }`)
63
+ * in pre-built / manifest mode since no source booting happens.
64
64
  */
65
- root: string;
65
+ entry: AppEntry;
66
+
67
+ /**
68
+ * Cloud resources the workspace uses — discovered at build time, read
69
+ * from `dist/manifest.json` at deploy time.
70
+ */
71
+ resources: DetectedResources;
66
72
 
67
73
  /**
68
- * Resource name generator bound to this project+env.
74
+ * Resource name generator bound to this project+env(+tenant).
69
75
  */
70
76
  naming: NamingContext;
71
77
 
78
+ /**
79
+ * Active tenant slug for this deploy (apps with `tenancy: optional |
80
+ * required`), or `undefined` for a base / non-tenanted deploy. Shapes
81
+ * the served host (`<tenant>.<domain>`); resource names already fold it
82
+ * in via {@link naming}.
83
+ */
84
+ tenant?: string;
85
+
72
86
  /**
73
87
  * Pre-built mode. When true, the adapter's `build()` should skip the
74
88
  * Vite bundle steps and only regenerate the deploy config
@@ -78,12 +92,11 @@ export interface PlatformContext {
78
92
  prebuilt?: boolean;
79
93
  }
80
94
 
81
- export interface AppContext extends PlatformContext {
82
- /**
83
- * The specific app being operated on.
84
- */
85
- app: AppDefinition;
86
- }
95
+ /**
96
+ * @deprecated Same as `PlatformContext` since the `apps:` collapse —
97
+ * kept as a type alias so existing adapter signatures still compile.
98
+ */
99
+ export type AppContext = PlatformContext;
87
100
 
88
101
  // ---------------------------------------------------------------------------
89
102
  // State types (returned by inspect)
@@ -158,6 +171,20 @@ export abstract class PlatformAdapter {
158
171
  */
159
172
  async migrate(_ctx: PlatformContext, _run: RunnerMethod): Promise<void> {}
160
173
 
174
+ /**
175
+ * Export the deployed database to a local file — the remote → local dev
176
+ * snapshot workflow. Adapter/dialect specific; the default refuses.
177
+ */
178
+ async exportDb(
179
+ _ctx: PlatformContext,
180
+ _run: RunnerMethod,
181
+ _options: ExportDbOptions = {},
182
+ ): Promise<void> {
183
+ throw new AlephaError(
184
+ `Database export is not supported by the '${this.constructor.name}' adapter.`,
185
+ );
186
+ }
187
+
161
188
  /**
162
189
  * Push runtime secrets to the deployed worker(s).
163
190
  *
@@ -95,9 +95,7 @@ export class VercelAdapter extends PlatformAdapter {
95
95
  // -------------------------------------------------------------------------
96
96
 
97
97
  async build(ctx: AppContext, run: RunnerMethod): Promise<void> {
98
- const appDir = ctx.app.path
99
- ? this.fs.join(ctx.root, ctx.app.path)
100
- : ctx.root;
98
+ const appDir = ctx.root;
101
99
 
102
100
  await run({
103
101
  name: "alepha build -t vercel",
@@ -117,16 +115,14 @@ export class VercelAdapter extends PlatformAdapter {
117
115
  ctx: AppContext,
118
116
  run: RunnerMethod,
119
117
  ): Promise<string | undefined> {
120
- const distDir = ctx.app.path
121
- ? this.fs.join(ctx.root, ctx.app.path, "dist")
122
- : this.fs.join(ctx.root, "dist");
118
+ const distDir = this.fs.join(ctx.root, "dist");
123
119
 
124
120
  const projectName = ctx.naming.worker();
125
121
 
126
122
  let url: string | undefined;
127
123
 
128
124
  await run({
129
- name: `deploy ${ctx.app.name}`,
125
+ name: `deploy ${ctx.project}`,
130
126
  handler: async () => {
131
127
  // Ensure project exists and has framework: null for prebuilt deploys
132
128
  let project = await this.api.getProject(projectName);
@@ -199,7 +195,7 @@ export class VercelAdapter extends PlatformAdapter {
199
195
  return;
200
196
  }
201
197
 
202
- for (const app of ctx.apps) {
198
+ {
203
199
  const projectName = ctx.naming.worker();
204
200
 
205
201
  await run({
@@ -231,7 +227,7 @@ export class VercelAdapter extends PlatformAdapter {
231
227
  const tasks: Array<{ name: string; handler: () => Promise<void> }> = [];
232
228
 
233
229
  // Projects/deployments (mapped to "workers" in PlatformState)
234
- for (const app of ctx.apps) {
230
+ {
235
231
  const projectName = ctx.naming.worker();
236
232
 
237
233
  tasks.push({
@@ -303,7 +299,7 @@ export class VercelAdapter extends PlatformAdapter {
303
299
  // -------------------------------------------------------------------------
304
300
 
305
301
  async teardown(ctx: PlatformContext, run: RunnerMethod): Promise<void> {
306
- for (const app of ctx.apps) {
302
+ {
307
303
  const projectName = ctx.naming.worker();
308
304
 
309
305
  await run({
@@ -23,16 +23,49 @@ export const platformOptions = $atom({
23
23
  */
24
24
  default: t.optional(t.text()),
25
25
 
26
+ /**
27
+ * Multi-tenancy mode — controls whether `--tenant <slug>` is
28
+ * accepted/required and how it shapes resource names + the domain.
29
+ *
30
+ * - `none` (default): single instance. `--tenant` is rejected.
31
+ * - `required`: every deploy needs `--tenant`; resources are named
32
+ * `<tenant>-<project>-<env>` and the host becomes
33
+ * `<tenant>.<domain>`. Omitting it errors.
34
+ * - `optional`: a base instance (no `--tenant`) plus per-tenant
35
+ * instances coexist.
36
+ *
37
+ * @default "none"
38
+ */
39
+ tenancy: t.optional(t.enum(["none", "optional", "required"])),
40
+
26
41
  /**
27
42
  * Secret store configuration for syncing .env secrets
28
43
  * to external providers (e.g. GitHub Actions environments).
29
44
  */
30
45
  secrets: t.optional(
31
46
  t.object({
47
+ /**
48
+ * Explicit override of the worker secret-key allowlist.
49
+ *
50
+ * By default the deploy `secrets` step uses the build manifest's
51
+ * `env` list (every key the app declares via `$env`, captured at
52
+ * build time) as the allowlist, resolving each value from
53
+ * `.env.<env>[.local]` first, then `process.env`. This lets CI
54
+ * deliver secrets via the job environment (no `.env` file on the
55
+ * runner) while only ever pushing declared keys — ambient runner
56
+ * vars (PATH, GITHUB_*, …) can never leak.
57
+ *
58
+ * Set `keys` to override that auto-detected list (e.g. to narrow it,
59
+ * or to add a key read via `process.env` rather than `$env`). When
60
+ * neither this nor a manifest is present, the `.env.<env>` file is
61
+ * itself the allowlist (legacy fallback).
62
+ */
63
+ keys: t.optional(t.array(t.text())),
64
+
32
65
  /**
33
66
  * Secret store backend.
34
67
  */
35
- store: t.enum(["github"]),
68
+ store: t.optional(t.enum(["github"])),
36
69
 
37
70
  /**
38
71
  * Pattern for resolving environment names in the store.
@@ -0,0 +1,67 @@
1
+ import { $module } from "alepha";
2
+ import { CloudflareAdapter } from "./adapters/CloudflareAdapter.ts";
3
+ import { VercelAdapter } from "./adapters/VercelAdapter.ts";
4
+ import { GitHubSecretStore } from "./providers/GitHubSecretStore.ts";
5
+ import { MemorySecretStore } from "./providers/MemorySecretStore.ts";
6
+ import { PlatformCacheProvider } from "./providers/PlatformCacheProvider.ts";
7
+ import { CloudflareApi } from "./services/CloudflareApi.ts";
8
+ import { NamingService } from "./services/NamingService.ts";
9
+ import { PlatformInspector } from "./services/PlatformInspector.ts";
10
+ import { PlatformOrchestrator } from "./services/PlatformOrchestrator.ts";
11
+ import { SecretFilterService } from "./services/SecretFilterService.ts";
12
+ import { VercelApi } from "./services/VercelApi.ts";
13
+ import { VercelCli } from "./services/VercelCli.ts";
14
+ import { WranglerApi } from "./services/WranglerApi.ts";
15
+
16
+ /**
17
+ * Framework-agnostic platform deploy services.
18
+ *
19
+ * Exports `PlatformOrchestrator` + adapters + secret stores + the
20
+ * `platformOptions` atom — everything needed to drive a deploy
21
+ * programmatically. **No `$command` instances** and **no
22
+ * `AppEntryProvider` / `ViteBuildProvider` dependency** — so consumers
23
+ * importing this subpath don't pull in the CLI argv-parser or Vite.
24
+ *
25
+ * Used by Alepha Rocket (and other non-CLI deploy orchestrators) to
26
+ * call `orchestrator.up({ ... })` directly. For CLI usage
27
+ * (`alepha platform up`), import `AlephaCliPlatformPlugin` from
28
+ * `alepha/cli/platform` — that one adds the command layer on top.
29
+ */
30
+ export const AlephaPlatformLibPlugin = $module({
31
+ name: "alepha.cli.platform-lib",
32
+ services: [
33
+ CloudflareAdapter,
34
+ CloudflareApi,
35
+ VercelAdapter,
36
+ VercelApi,
37
+ VercelCli,
38
+ WranglerApi,
39
+ PlatformCacheProvider,
40
+ GitHubSecretStore,
41
+ MemorySecretStore,
42
+ NamingService,
43
+ SecretFilterService,
44
+ PlatformInspector,
45
+ PlatformOrchestrator,
46
+ ],
47
+ });
48
+
49
+ export * from "./adapters/CloudflareAdapter.ts";
50
+ export * from "./adapters/PlatformAdapter.ts";
51
+ export * from "./adapters/VercelAdapter.ts";
52
+ export * from "./atoms/platformOptions.ts";
53
+ export * from "./providers/GitHubSecretStore.ts";
54
+ export * from "./providers/MemorySecretStore.ts";
55
+ export * from "./providers/PlatformCacheProvider.ts";
56
+ export * from "./providers/SecretStoreProvider.ts";
57
+ export * from "./schemas/cloudflare.ts";
58
+ export * from "./schemas/platform.ts";
59
+ export * from "./schemas/vercel.ts";
60
+ export * from "./services/CloudflareApi.ts";
61
+ export * from "./services/NamingService.ts";
62
+ export * from "./services/PlatformInspector.ts";
63
+ export * from "./services/PlatformOrchestrator.ts";
64
+ export * from "./services/SecretFilterService.ts";
65
+ export * from "./services/VercelApi.ts";
66
+ export * from "./services/VercelCli.ts";
67
+ export * from "./services/WranglerApi.ts";
@@ -0,0 +1,136 @@
1
+ import { AlephaError } from "alepha";
2
+
3
+ /**
4
+ * Multi-tenancy mode for an app's deployments.
5
+ *
6
+ * - `none` (default): single-instance app. Passing `--tenant` is an
7
+ * error — guards a non-tenanted app (e.g. the SaaS console) from
8
+ * accidentally getting a tenant prefix.
9
+ * - `required`: every deploy targets a tenant. Omitting `--tenant` is an
10
+ * error — kills the "forgot the flag → deployed to the apex" footgun.
11
+ * - `optional`: both work — a base instance (no `--tenant`) and per-tenant
12
+ * instances coexist (distinct names + hosts).
13
+ */
14
+ export type Tenancy = "none" | "optional" | "required";
15
+
16
+ /**
17
+ * Validate a `--tenant` value against the app's declared `tenancy` and
18
+ * return the effective tenant (or `undefined` for a base/non-tenanted
19
+ * deploy). Throws on any matrix violation so a misconfigured deploy fails
20
+ * fast instead of landing on the wrong resource names / host.
21
+ */
22
+ export function resolveTenant(
23
+ tenancy: Tenancy | undefined,
24
+ tenant: string | undefined,
25
+ ): string | undefined {
26
+ const mode = tenancy ?? "none";
27
+
28
+ if (tenant !== undefined && !/^[a-z0-9][a-z0-9-]*$/.test(tenant)) {
29
+ throw new AlephaError(
30
+ `Invalid --tenant "${tenant}": must be a slug (lowercase alphanumeric + dashes, e.g. "b14").`,
31
+ );
32
+ }
33
+
34
+ if (mode === "none") {
35
+ if (tenant !== undefined) {
36
+ throw new AlephaError(
37
+ `This app is not tenanted (tenancy: "none") but --tenant "${tenant}" was given. ` +
38
+ `Set tenancy: "optional" | "required" in platform() to deploy per-tenant.`,
39
+ );
40
+ }
41
+ return undefined;
42
+ }
43
+
44
+ if (mode === "required" && tenant === undefined) {
45
+ throw new AlephaError(
46
+ `This app requires a tenant (tenancy: "required"). Pass --tenant <slug>.`,
47
+ );
48
+ }
49
+
50
+ // required+value or optional(+/- value) — value may be undefined for the
51
+ // optional base instance.
52
+ return tenant;
53
+ }
54
+
55
+ /**
56
+ * Resolve the host a deploy is served on.
57
+ *
58
+ * - `override` (V2 custom domains, e.g. `reservation.club-b14.fr`) wins
59
+ * outright when supplied — not wired to a flag today, but the single
60
+ * seam a future `--domain` / Rocket `config.hostname` plugs into.
61
+ * - else a tenant becomes the leftmost DNS label: `b14` + `alepha.club`
62
+ * → `b14.alepha.club`.
63
+ * - else the base domain is used as-is.
64
+ */
65
+ export function tenantDomain(
66
+ base: string | undefined,
67
+ tenant: string | undefined,
68
+ override?: string,
69
+ ): string | undefined {
70
+ if (override) return override;
71
+ if (!base) return base;
72
+ return tenant ? `${tenant}.${base}` : base;
73
+ }
74
+
75
+ /**
76
+ * Generates deterministic resource names for cloud deployments.
77
+ *
78
+ * Pattern: `<tenant>-<project>-<env>` (tenant segment omitted when the
79
+ * deploy isn't tenanted).
80
+ *
81
+ * All segments are slugified (lowercase, alphanumeric + dashes, max 63
82
+ * chars). One app per workspace — see `alepha platform`.
83
+ */
84
+ export class NamingService {
85
+ public forContext(
86
+ project: string,
87
+ env: string,
88
+ tenant?: string,
89
+ ): NamingContext {
90
+ const prefix = [tenant, project, env]
91
+ .filter((segment): segment is string => !!segment)
92
+ .map((segment) => this.slugify(segment))
93
+ .join("-");
94
+ return new NamingContext(prefix);
95
+ }
96
+
97
+ public slugify(name: string): string {
98
+ return name
99
+ .toLowerCase()
100
+ .replace(/[^a-z0-9]+/g, "-")
101
+ .replace(/^-+|-+$/g, "")
102
+ .slice(0, 63);
103
+ }
104
+ }
105
+
106
+ export class NamingContext {
107
+ protected readonly prefix: string;
108
+
109
+ constructor(prefix: string) {
110
+ this.prefix = prefix;
111
+ }
112
+
113
+ public worker(): string {
114
+ return this.prefix;
115
+ }
116
+
117
+ public d1(): string {
118
+ return this.prefix;
119
+ }
120
+
121
+ public hyperdrive(): string {
122
+ return this.prefix;
123
+ }
124
+
125
+ public r2(): string {
126
+ return this.prefix;
127
+ }
128
+
129
+ public kv(): string {
130
+ return this.prefix;
131
+ }
132
+
133
+ public queue(): string {
134
+ return this.prefix;
135
+ }
136
+ }
@@ -6,11 +6,13 @@ import {
6
6
  type EnvironmentConfig,
7
7
  platformOptions,
8
8
  } from "../atoms/platformOptions.ts";
9
- import { NamingService } from "./NamingService.ts";
9
+ import { NamingService, type Tenancy } from "./NamingService.ts";
10
10
 
11
11
  export interface ResolvedPlatformConfig {
12
12
  project: string;
13
13
  defaultEnv: string;
14
+ /** App tenancy mode (undefined ⇒ "none"). */
15
+ tenancy?: Tenancy;
14
16
  environments: Record<string, EnvironmentConfig>;
15
17
  }
16
18
 
@@ -35,10 +37,42 @@ export class PlatformInspector {
35
37
 
36
38
  /**
37
39
  * Resolve and validate the full platform configuration.
40
+ *
41
+ * Source priority:
42
+ * 1. `platformOptions` atom (set by `alepha.config.ts` during the
43
+ * configure hook) — local dev / from-source deploys.
44
+ * 2. `dist/manifest.json` (written by `alepha build`) — pre-built
45
+ * deploys via Alepha Rocket or any `--prebuilt` consumer that
46
+ * ships only the build artifact without `alepha.config.ts`.
38
47
  */
39
48
  public async resolveConfig(root: string): Promise<ResolvedPlatformConfig> {
40
- if (!this.options) {
41
- this.log.warn(` alepha.config.ts not found or missing platform config.
49
+ if (this.options) {
50
+ const opts = this.options;
51
+ const project = await this.resolveProjectName(root, opts.name);
52
+ return {
53
+ project: this.naming.slugify(project),
54
+ defaultEnv: opts.default ?? "production",
55
+ tenancy: opts.tenancy,
56
+ environments: opts.environments as Record<string, EnvironmentConfig>,
57
+ };
58
+ }
59
+
60
+ // Fallback: read dist/manifest.json. Lets prebuilt artifacts deploy
61
+ // without shipping alepha.config.ts in the tarball.
62
+ const manifest = await this.readManifest(root);
63
+ if (manifest) {
64
+ return {
65
+ project: this.naming.slugify(manifest.project),
66
+ defaultEnv: manifest.defaultEnv ?? "production",
67
+ tenancy: manifest.tenancy,
68
+ environments: manifest.environments as Record<
69
+ string,
70
+ EnvironmentConfig
71
+ >,
72
+ };
73
+ }
74
+
75
+ this.log.warn(` alepha.config.ts not found or missing platform config.
42
76
 
43
77
  Please add a "platform" section to alepha.config.ts:
44
78
 
@@ -50,17 +84,30 @@ export default defineConfig({
50
84
  },
51
85
  });
52
86
  `);
53
- throw new AlephaError("Missing platform configuration.");
54
- }
55
-
56
- const opts = this.options;
57
- const project = await this.resolveProjectName(root, opts.name);
87
+ throw new AlephaError("Missing platform configuration.");
88
+ }
58
89
 
59
- return {
60
- project: this.naming.slugify(project),
61
- defaultEnv: opts.default ?? "production",
62
- environments: opts.environments as Record<string, EnvironmentConfig>,
63
- };
90
+ /**
91
+ * Read `dist/manifest.json` if present. Returns null on any error so
92
+ * callers fall back to the strict alepha.config.ts path.
93
+ */
94
+ protected async readManifest(root: string): Promise<{
95
+ project: string;
96
+ defaultEnv?: string;
97
+ tenancy?: Tenancy;
98
+ environments?: Record<string, unknown>;
99
+ } | null> {
100
+ try {
101
+ const fs = await import("node:fs/promises");
102
+ const path = await import("node:path");
103
+ const raw = await fs.readFile(
104
+ path.join(root, "dist", "manifest.json"),
105
+ "utf-8",
106
+ );
107
+ return JSON.parse(raw);
108
+ } catch {
109
+ return null;
110
+ }
64
111
  }
65
112
 
66
113
  /**