alepha 0.19.1 → 0.19.3

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 (531) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +6 -9
  3. package/dist/api/audits/index.d.ts +378 -346
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/files/index.d.ts +216 -184
  6. package/dist/api/files/index.d.ts.map +1 -1
  7. package/dist/api/jobs/index.d.ts +534 -502
  8. package/dist/api/jobs/index.d.ts.map +1 -1
  9. package/dist/api/jobs/index.js +13 -7
  10. package/dist/api/jobs/index.js.map +1 -1
  11. package/dist/api/keys/index.d.ts +202 -202
  12. package/dist/api/keys/index.d.ts.map +1 -1
  13. package/dist/api/notifications/index.d.ts +152 -152
  14. package/dist/api/notifications/index.d.ts.map +1 -1
  15. package/dist/api/organizations/index.browser.js +48 -0
  16. package/dist/api/organizations/index.browser.js.map +1 -0
  17. package/dist/api/organizations/index.d.ts +516 -0
  18. package/dist/api/organizations/index.d.ts.map +1 -0
  19. package/dist/api/organizations/index.js +202 -0
  20. package/dist/api/organizations/index.js.map +1 -0
  21. package/dist/api/parameters/index.d.ts +391 -358
  22. package/dist/api/parameters/index.d.ts.map +1 -1
  23. package/dist/api/parameters/index.js +5 -1
  24. package/dist/api/parameters/index.js.map +1 -1
  25. package/dist/api/users/index.browser.js +7 -5
  26. package/dist/api/users/index.browser.js.map +1 -1
  27. package/dist/api/users/index.d.ts +986 -931
  28. package/dist/api/users/index.d.ts.map +1 -1
  29. package/dist/api/users/index.js +160 -112
  30. package/dist/api/users/index.js.map +1 -1
  31. package/dist/api/verifications/index.d.ts +137 -137
  32. package/dist/api/verifications/index.d.ts.map +1 -1
  33. package/dist/api/verifications/index.js +2 -2
  34. package/dist/api/verifications/index.js.map +1 -1
  35. package/dist/batch/index.d.ts +6 -6
  36. package/dist/batch/index.d.ts.map +1 -1
  37. package/dist/billing/index.d.ts +1048 -0
  38. package/dist/billing/index.d.ts.map +1 -0
  39. package/dist/billing/index.js +713 -0
  40. package/dist/billing/index.js.map +1 -0
  41. package/dist/bin/index.js +0 -2
  42. package/dist/bin/index.js.map +1 -1
  43. package/dist/bucket/index.d.ts +10 -10
  44. package/dist/bucket/index.d.ts.map +1 -1
  45. package/dist/bucket/index.js +2 -2
  46. package/dist/bucket/index.js.map +1 -1
  47. package/dist/cache/core/index.d.ts +9 -9
  48. package/dist/cache/core/index.d.ts.map +1 -1
  49. package/dist/cache/core/index.js +2 -2
  50. package/dist/cache/core/index.js.map +1 -1
  51. package/dist/cache/core/index.workerd.js +2 -2
  52. package/dist/cache/core/index.workerd.js.map +1 -1
  53. package/dist/cache/redis/index.d.ts +6 -6
  54. package/dist/cache/redis/index.d.ts.map +1 -1
  55. package/dist/cache/redis/index.js +2 -2
  56. package/dist/cache/redis/index.js.map +1 -1
  57. package/dist/cli/config/index.d.ts +6 -18
  58. package/dist/cli/config/index.d.ts.map +1 -1
  59. package/dist/cli/config/index.js +5 -6
  60. package/dist/cli/config/index.js.map +1 -1
  61. package/dist/cli/core/index.d.ts +11811 -323
  62. package/dist/cli/core/index.d.ts.map +1 -1
  63. package/dist/cli/core/index.js +324 -98
  64. package/dist/cli/core/index.js.map +1 -1
  65. package/dist/cli/devtools/index.d.ts +50 -0
  66. package/dist/cli/devtools/index.d.ts.map +1 -0
  67. package/dist/cli/devtools/index.js +174 -0
  68. package/dist/cli/devtools/index.js.map +1 -0
  69. package/dist/cli/platform/index.d.ts +438 -542
  70. package/dist/cli/platform/index.d.ts.map +1 -1
  71. package/dist/cli/platform/index.js +46 -511
  72. package/dist/cli/platform/index.js.map +1 -1
  73. package/dist/cli/vendor/index.d.ts +201 -0
  74. package/dist/cli/vendor/index.d.ts.map +1 -0
  75. package/dist/cli/vendor/index.js +388 -0
  76. package/dist/cli/vendor/index.js.map +1 -0
  77. package/dist/command/index.d.ts +18 -18
  78. package/dist/command/index.d.ts.map +1 -1
  79. package/dist/command/index.js +2 -2
  80. package/dist/command/index.js.map +1 -1
  81. package/dist/core/index.browser.js +4 -4
  82. package/dist/core/index.browser.js.map +1 -1
  83. package/dist/core/index.d.ts +10 -10
  84. package/dist/core/index.d.ts.map +1 -1
  85. package/dist/core/index.js +8 -4
  86. package/dist/core/index.js.map +1 -1
  87. package/dist/core/index.native.js +8 -4
  88. package/dist/core/index.native.js.map +1 -1
  89. package/dist/core/index.workerd.js +8 -4
  90. package/dist/core/index.workerd.js.map +1 -1
  91. package/dist/crypto/index.d.ts +7 -7
  92. package/dist/crypto/index.d.ts.map +1 -1
  93. package/dist/datetime/index.d.ts +4 -4
  94. package/dist/datetime/index.d.ts.map +1 -1
  95. package/dist/email/brevo/index.d.ts +4 -4
  96. package/dist/email/brevo/index.d.ts.map +1 -1
  97. package/dist/email/core/index.d.ts +15 -11
  98. package/dist/email/core/index.d.ts.map +1 -1
  99. package/dist/email/core/index.js +12 -35
  100. package/dist/email/core/index.js.map +1 -1
  101. package/dist/email/smtp/index.d.ts +12 -12
  102. package/dist/email/smtp/index.d.ts.map +1 -1
  103. package/dist/email/smtp/index.js +7 -4
  104. package/dist/email/smtp/index.js.map +1 -1
  105. package/dist/fake/index.d.ts +4 -8
  106. package/dist/fake/index.d.ts.map +1 -1
  107. package/dist/fake/index.js +55 -889
  108. package/dist/fake/index.js.map +1 -1
  109. package/dist/lock/core/index.d.ts +13 -13
  110. package/dist/lock/core/index.d.ts.map +1 -1
  111. package/dist/lock/core/index.js +2 -2
  112. package/dist/lock/core/index.js.map +1 -1
  113. package/dist/lock/redis/index.d.ts +4 -4
  114. package/dist/lock/redis/index.d.ts.map +1 -1
  115. package/dist/logger/index.d.ts +16 -15
  116. package/dist/logger/index.d.ts.map +1 -1
  117. package/dist/logger/index.js +6 -3
  118. package/dist/logger/index.js.map +1 -1
  119. package/dist/mcp/index.d.ts +11 -11
  120. package/dist/mcp/index.d.ts.map +1 -1
  121. package/dist/mcp/index.js +2 -2
  122. package/dist/mcp/index.js.map +1 -1
  123. package/dist/orm/core/index.browser.js +11 -1
  124. package/dist/orm/core/index.browser.js.map +1 -1
  125. package/dist/orm/core/index.bun.js +78 -72
  126. package/dist/orm/core/index.bun.js.map +1 -1
  127. package/dist/orm/core/index.d.ts +103 -69
  128. package/dist/orm/core/index.d.ts.map +1 -1
  129. package/dist/orm/core/index.js +80 -70
  130. package/dist/orm/core/index.js.map +1 -1
  131. package/dist/orm/postgres/index.d.ts +19 -17
  132. package/dist/orm/postgres/index.d.ts.map +1 -1
  133. package/dist/queue/core/index.d.ts +14 -14
  134. package/dist/queue/core/index.d.ts.map +1 -1
  135. package/dist/queue/core/index.js +2 -2
  136. package/dist/queue/core/index.js.map +1 -1
  137. package/dist/queue/core/index.workerd.js +2 -2
  138. package/dist/queue/core/index.workerd.js.map +1 -1
  139. package/dist/queue/redis/index.d.ts +4 -4
  140. package/dist/queue/redis/index.d.ts.map +1 -1
  141. package/dist/queue/redis/index.js +2 -2
  142. package/dist/queue/redis/index.js.map +1 -1
  143. package/dist/react/auth/index.d.ts +9 -9
  144. package/dist/react/auth/index.d.ts.map +1 -1
  145. package/dist/react/core/index.d.ts +6 -6
  146. package/dist/react/core/index.d.ts.map +1 -1
  147. package/dist/react/core/index.js +5 -4
  148. package/dist/react/core/index.js.map +1 -1
  149. package/dist/react/form/index.d.ts +4 -4
  150. package/dist/react/form/index.d.ts.map +1 -1
  151. package/dist/react/head/index.d.ts +4 -4
  152. package/dist/react/head/index.d.ts.map +1 -1
  153. package/dist/react/i18n/index.d.ts +9 -9
  154. package/dist/react/i18n/index.d.ts.map +1 -1
  155. package/dist/react/intro/index.d.ts +2 -2
  156. package/dist/react/intro/index.d.ts.map +1 -1
  157. package/dist/react/intro/index.js +1 -1
  158. package/dist/react/intro/index.js.map +1 -1
  159. package/dist/react/router/index.browser.js +4 -5
  160. package/dist/react/router/index.browser.js.map +1 -1
  161. package/dist/react/router/index.d.ts +215 -215
  162. package/dist/react/router/index.d.ts.map +1 -1
  163. package/dist/react/router/index.js +6 -7
  164. package/dist/react/router/index.js.map +1 -1
  165. package/dist/react/testing/index.d.ts +2 -2
  166. package/dist/react/testing/index.d.ts.map +1 -1
  167. package/dist/react/testing/index.js +2 -4
  168. package/dist/react/testing/index.js.map +1 -1
  169. package/dist/redis/index.d.ts +19 -19
  170. package/dist/redis/index.d.ts.map +1 -1
  171. package/dist/retry/index.d.ts +4 -4
  172. package/dist/retry/index.d.ts.map +1 -1
  173. package/dist/scheduler/index.d.ts +13 -13
  174. package/dist/scheduler/index.d.ts.map +1 -1
  175. package/dist/scheduler/index.js +2 -2
  176. package/dist/scheduler/index.js.map +1 -1
  177. package/dist/scheduler/index.workerd.js +2 -2
  178. package/dist/scheduler/index.workerd.js.map +1 -1
  179. package/dist/security/index.browser.js +1 -1
  180. package/dist/security/index.browser.js.map +1 -1
  181. package/dist/security/index.d.ts +47 -47
  182. package/dist/security/index.d.ts.map +1 -1
  183. package/dist/security/index.js +9 -12
  184. package/dist/security/index.js.map +1 -1
  185. package/dist/server/auth/index.d.ts +170 -169
  186. package/dist/server/auth/index.d.ts.map +1 -1
  187. package/dist/server/auth/index.js +16 -2
  188. package/dist/server/auth/index.js.map +1 -1
  189. package/dist/server/cookies/index.d.ts +7 -7
  190. package/dist/server/cookies/index.d.ts.map +1 -1
  191. package/dist/server/core/index.d.ts +76 -76
  192. package/dist/server/core/index.d.ts.map +1 -1
  193. package/dist/server/core/index.js +23 -17
  194. package/dist/server/core/index.js.map +1 -1
  195. package/dist/server/cors/index.d.ts +13 -13
  196. package/dist/server/cors/index.d.ts.map +1 -1
  197. package/dist/server/cors/index.js +2 -2
  198. package/dist/server/cors/index.js.map +1 -1
  199. package/dist/server/etag/index.d.ts +9 -9
  200. package/dist/server/etag/index.d.ts.map +1 -1
  201. package/dist/server/health/index.d.ts +20 -20
  202. package/dist/server/health/index.d.ts.map +1 -1
  203. package/dist/server/links/index.browser.js +2 -2
  204. package/dist/server/links/index.browser.js.map +1 -1
  205. package/dist/server/links/index.d.ts +66 -66
  206. package/dist/server/links/index.d.ts.map +1 -1
  207. package/dist/server/links/index.js +4 -4
  208. package/dist/server/links/index.js.map +1 -1
  209. package/dist/server/metrics/index.d.ts +7 -7
  210. package/dist/server/metrics/index.d.ts.map +1 -1
  211. package/dist/server/proxy/index.d.ts +5 -5
  212. package/dist/server/proxy/index.d.ts.map +1 -1
  213. package/dist/server/rate-limit/index.d.ts +12 -12
  214. package/dist/server/rate-limit/index.d.ts.map +1 -1
  215. package/dist/server/rate-limit/index.js +2 -2
  216. package/dist/server/rate-limit/index.js.map +1 -1
  217. package/dist/server/static/index.d.ts +5 -5
  218. package/dist/server/static/index.d.ts.map +1 -1
  219. package/dist/server/swagger/index.d.ts +7 -7
  220. package/dist/server/swagger/index.d.ts.map +1 -1
  221. package/dist/server/swagger/index.js +2 -2
  222. package/dist/server/swagger/index.js.map +1 -1
  223. package/dist/sms/index.d.ts +11 -7
  224. package/dist/sms/index.d.ts.map +1 -1
  225. package/dist/sms/index.js +9 -15
  226. package/dist/sms/index.js.map +1 -1
  227. package/dist/system/index.d.ts +4 -4
  228. package/dist/system/index.d.ts.map +1 -1
  229. package/dist/topic/core/index.d.ts +6 -6
  230. package/dist/topic/core/index.d.ts.map +1 -1
  231. package/dist/topic/redis/index.d.ts +7 -7
  232. package/dist/topic/redis/index.d.ts.map +1 -1
  233. package/dist/topic/redis/index.js +2 -2
  234. package/dist/topic/redis/index.js.map +1 -1
  235. package/dist/websocket/index.d.ts +36 -36
  236. package/dist/websocket/index.d.ts.map +1 -1
  237. package/dist/websocket/index.js +2 -2
  238. package/dist/websocket/index.js.map +1 -1
  239. package/package.json +37 -15
  240. package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
  241. package/src/api/jobs/providers/JobProvider.ts +13 -9
  242. package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
  243. package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
  244. package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
  245. package/src/api/organizations/entities/organizations.ts +20 -0
  246. package/src/api/organizations/index.browser.ts +10 -0
  247. package/src/api/organizations/index.ts +31 -0
  248. package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
  249. package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
  250. package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
  251. package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
  252. package/src/api/organizations/services/OrganizationService.ts +75 -0
  253. package/src/api/parameters/services/ParameterProvider.ts +6 -1
  254. package/src/api/users/{services → __tests__}/SessionService.spec.ts +67 -0
  255. package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
  256. package/src/api/users/entities/users.ts +9 -3
  257. package/src/api/users/index.ts +23 -4
  258. package/src/api/users/primitives/$realm.ts +6 -4
  259. package/src/api/users/providers/RealmProvider.ts +1 -1
  260. package/src/api/users/services/RegistrationService.ts +1 -1
  261. package/src/api/users/services/SessionService.ts +92 -5
  262. package/src/api/users/services/UserService.ts +1 -1
  263. package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
  264. package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
  265. package/src/billing/__tests__/BillingService.spec.ts +136 -0
  266. package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
  267. package/src/billing/controllers/AdminBillingController.ts +149 -0
  268. package/src/billing/controllers/BillingController.ts +108 -0
  269. package/src/billing/entities/paymentIntents.ts +34 -0
  270. package/src/billing/entities/paymentMethods.ts +24 -0
  271. package/src/billing/entities/refunds.ts +22 -0
  272. package/src/billing/errors/BillingError.ts +5 -0
  273. package/src/billing/index.ts +76 -0
  274. package/src/billing/providers/BillingProvider.ts +79 -0
  275. package/src/billing/providers/MemoryBillingProvider.ts +139 -0
  276. package/src/billing/schemas/intentSchemas.ts +60 -0
  277. package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
  278. package/src/billing/schemas/refundSchemas.ts +6 -0
  279. package/src/billing/services/BillingService.ts +325 -0
  280. package/src/billing/services/PaymentMethodService.ts +82 -0
  281. package/src/bin/index.ts +0 -2
  282. package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
  283. package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
  284. package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
  285. package/src/cache/core/primitives/$cache.ts +2 -2
  286. package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
  287. package/src/cli/config/defineConfig.ts +17 -26
  288. package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
  289. package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
  290. package/src/cli/core/{commands → __tests__}/init.spec.ts +2 -8
  291. package/src/cli/core/atoms/devOptions.ts +0 -5
  292. package/src/cli/core/commands/build.ts +2 -2
  293. package/src/cli/core/commands/dev.ts +165 -30
  294. package/src/cli/core/commands/gen/changelog.ts +2 -2
  295. package/src/cli/core/commands/init.ts +2 -7
  296. package/src/cli/core/commands/verify.ts +0 -1
  297. package/src/cli/core/providers/AppEntryProvider.ts +2 -2
  298. package/src/cli/core/providers/ViteDevServerProvider.ts +99 -69
  299. package/src/cli/core/services/PackageManagerUtils.ts +8 -1
  300. package/src/cli/core/services/ProjectScaffolder.ts +23 -23
  301. package/src/cli/core/tasks/BuildClientTask.ts +8 -0
  302. package/src/cli/core/tasks/BuildServerTask.ts +17 -4
  303. package/src/cli/core/templates/agentMd.ts +14 -5
  304. package/src/cli/core/templates/alephaConfigTs.ts +0 -6
  305. package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
  306. package/src/cli/core/templates/webAppRouterTs.ts +85 -2
  307. package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
  308. package/src/cli/devtools/index.ts +214 -0
  309. package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
  310. package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
  311. package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
  312. package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
  313. package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
  314. package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
  315. package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
  316. package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
  317. package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
  318. package/src/cli/platform/atoms/platformOptions.ts +2 -10
  319. package/src/cli/platform/commands/SecretsCommand.ts +2 -2
  320. package/src/cli/platform/commands/platform.ts +2 -11
  321. package/src/cli/platform/index.ts +55 -11
  322. package/src/cli/platform/services/PlatformInspector.ts +2 -2
  323. package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
  324. package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
  325. package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
  326. package/src/cli/vendor/commands/VendorCommand.ts +204 -0
  327. package/src/cli/vendor/index.ts +60 -0
  328. package/src/cli/vendor/services/VendorService.ts +338 -0
  329. package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
  330. package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
  331. package/src/command/providers/CliProvider.ts +2 -2
  332. package/src/core/Alepha.ts +10 -0
  333. package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
  334. package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
  335. package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
  336. package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
  337. package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
  338. package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
  339. package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
  340. package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
  341. package/src/core/index.shared.ts +1 -1
  342. package/src/core/primitives/{$use.ts → $state.ts} +4 -4
  343. package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
  344. package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
  345. package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
  346. package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
  347. package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
  348. package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
  349. package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
  350. package/src/email/core/providers/LocalEmailProvider.ts +13 -51
  351. package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
  352. package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
  353. package/src/lock/core/primitives/$lock.ts +2 -2
  354. package/src/logger/index.ts +16 -5
  355. package/src/mcp/transports/SseMcpTransport.ts +2 -2
  356. package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
  357. package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
  358. package/src/orm/__tests__/organization-tests.ts +200 -0
  359. package/src/orm/__tests__/organization.spec.ts +103 -0
  360. package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
  361. package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
  362. package/src/orm/core/index.shared.ts +1 -0
  363. package/src/orm/core/primitives/$entity.ts +31 -0
  364. package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
  365. package/src/orm/core/providers/DrizzleKitProvider.ts +57 -106
  366. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
  367. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
  368. package/src/orm/core/services/ModelBuilder.ts +11 -0
  369. package/src/orm/core/services/QueryManager.ts +16 -2
  370. package/src/orm/core/services/Repository.ts +70 -10
  371. package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
  372. package/src/queue/core/providers/WorkerProvider.ts +2 -2
  373. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
  374. package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
  375. package/src/react/core/hooks/useAction.ts +7 -6
  376. package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
  377. package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
  378. package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
  379. package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
  380. package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
  381. package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
  382. package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
  383. package/src/react/router/providers/ReactPageProvider.ts +2 -2
  384. package/src/react/router/providers/ReactServerProvider.ts +3 -3
  385. package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
  386. package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
  387. package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
  388. package/src/scheduler/primitives/$scheduler.ts +2 -2
  389. package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
  390. package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
  391. package/src/security/primitives/$issuer.ts +1 -1
  392. package/src/security/providers/JwtProvider.ts +6 -10
  393. package/src/security/providers/SecurityProvider.ts +6 -11
  394. package/src/security/schemas/userAccountInfoSchema.ts +3 -3
  395. package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
  396. package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
  397. package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
  398. package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
  399. package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
  400. package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
  401. package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
  402. package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
  403. package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
  404. package/src/server/core/primitives/$action.ts +2 -2
  405. package/src/server/core/primitives/$sse.ts +2 -2
  406. package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
  407. package/src/server/core/providers/ServerCompressProvider.ts +2 -2
  408. package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
  409. package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
  410. package/src/server/core/providers/ServerRouterProvider.ts +1 -5
  411. package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
  412. package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
  413. package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
  414. package/src/server/links/providers/LinkProvider.ts +2 -2
  415. package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
  416. package/src/server/links/providers/ServerLinksProvider.ts +2 -2
  417. package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
  418. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
  419. package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
  420. package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
  421. package/src/sms/providers/LocalSmsProvider.ts +13 -24
  422. package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
  423. package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
  424. package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
  425. package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
  426. package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
  427. package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
  428. package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
  429. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
  430. package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
  431. package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
  432. package/src/cli/platform/services/DockerSshService.ts +0 -61
  433. /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
  434. /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
  435. /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
  436. /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
  437. /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
  438. /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
  439. /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
  440. /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
  441. /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
  442. /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
  443. /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
  444. /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
  445. /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
  446. /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
  447. /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
  448. /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
  449. /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
  450. /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
  451. /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
  452. /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
  453. /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
  454. /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
  455. /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
  456. /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
  457. /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
  458. /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
  459. /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
  460. /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
  461. /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
  462. /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
  463. /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
  464. /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
  465. /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
  466. /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
  467. /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
  468. /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
  469. /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
  470. /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
  471. /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
  472. /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
  473. /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
  474. /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
  475. /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
  476. /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
  477. /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
  478. /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
  479. /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
  480. /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
  481. /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
  482. /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
  483. /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
  484. /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
  485. /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
  486. /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
  487. /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
  488. /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
  489. /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
  490. /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
  491. /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
  492. /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
  493. /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
  494. /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
  495. /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
  496. /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
  497. /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
  498. /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
  499. /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
  500. /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
  501. /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
  502. /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
  503. /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
  504. /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
  505. /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
  506. /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
  507. /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
  508. /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
  509. /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
  510. /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
  511. /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
  512. /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
  513. /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
  514. /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
  515. /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
  516. /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
  517. /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
  518. /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
  519. /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
  520. /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
  521. /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
  522. /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
  523. /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
  524. /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
  525. /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
  526. /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
  527. /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
  528. /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
  529. /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
  530. /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
  531. /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
@@ -1,11 +1,12 @@
1
- import { $atom, $inject, $module, $use, Alepha, AlephaError, t } from "alepha";
1
+ import { $atom, $inject, $module, $state, Alepha, AlephaError, t } from "alepha";
2
2
  import { AlephaCli, AlephaCliUtils, AppEntryProvider, PackageManagerUtils, ViteBuildProvider } from "alepha/cli";
3
+ import { cliConfigPlugins } from "alepha/cli/config";
3
4
  import { $command, Asker, EnvUtils, Runner } from "alepha/command";
4
5
  import { $logger, ConsoleColorProvider } from "alepha/logger";
5
6
  import { FileSystemProvider, ShellProvider } from "alepha/system";
6
7
  import { DateTimeProvider } from "alepha/datetime";
7
- import { dirname, join } from "node:path";
8
8
  import { homedir, platform } from "node:os";
9
+ import { join } from "node:path";
9
10
  //#region ../../src/cli/platform/providers/PlatformCacheProvider.ts
10
11
  /**
11
12
  * Caches cloud provider login state to avoid slow auth checks.
@@ -977,483 +978,6 @@ var CloudflareAdapter = class CloudflareAdapter extends PlatformAdapter {
977
978
  }
978
979
  };
979
980
  //#endregion
980
- //#region ../../src/cli/platform/services/DockerComposeGenerator.ts
981
- /**
982
- * Generates docker-compose.yml content for local, remote, and shared Traefik.
983
- *
984
- * Pure logic — no I/O, no DI. Takes context, returns YAML string.
985
- */
986
- var DockerComposeGenerator = class {
987
- /**
988
- * Generate the shared Traefik compose.
989
- *
990
- * This is a static singleton — one per VPS at /opt/alepha/traefik/.
991
- * It creates the alepha-proxy network that project composes connect to.
992
- */
993
- generateTraefik() {
994
- return [
995
- "# Auto-generated by Alepha. Do not edit.",
996
- "services:",
997
- " traefik:",
998
- " image: traefik:v3",
999
- " container_name: alepha-traefik",
1000
- " command:",
1001
- " - --providers.docker=true",
1002
- " - --providers.docker.exposedbydefault=false",
1003
- " - --entrypoints.web.address=:80",
1004
- " - --entrypoints.websecure.address=:443",
1005
- " - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web",
1006
- " - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json",
1007
- " ports:",
1008
- " - \"80:80\"",
1009
- " - \"443:443\"",
1010
- " volumes:",
1011
- " - /var/run/docker.sock:/var/run/docker.sock",
1012
- " - traefik_certs:/letsencrypt",
1013
- " networks:",
1014
- " - alepha-proxy",
1015
- " restart: unless-stopped",
1016
- "",
1017
- "networks:",
1018
- " alepha-proxy:",
1019
- " name: alepha-proxy",
1020
- "",
1021
- "volumes:",
1022
- " traefik_certs:",
1023
- ""
1024
- ].join("\n");
1025
- }
1026
- /**
1027
- * Generate compose for local dev (services only: postgres, redis).
1028
- * Returns null if no services are needed.
1029
- */
1030
- generateLocal(options) {
1031
- const services = [];
1032
- const volumes = [];
1033
- const needsPostgres = this.anyAppHas(options.apps, "hasDatabase") && !options.envVars.DATABASE_URL;
1034
- const needsRedis = (this.anyAppHas(options.apps, "hasKV") || this.anyAppHas(options.apps, "hasQueue")) && !options.envVars.REDIS_URL;
1035
- const needsRustFS = this.anyAppHas(options.apps, "hasBucket") && !options.envVars.S3_ENDPOINT;
1036
- if (needsPostgres) {
1037
- const dbName = `${options.project}_${options.env}`.replace(/-/g, "_");
1038
- services.push([
1039
- " postgres:",
1040
- " image: postgres:17-alpine",
1041
- " ports: [\"5432:5432\"]",
1042
- " environment:",
1043
- ` POSTGRES_DB: ${dbName}`,
1044
- " POSTGRES_USER: alepha",
1045
- " POSTGRES_PASSWORD: alepha",
1046
- " volumes:",
1047
- " - postgres_data:/var/lib/postgresql/data"
1048
- ].join("\n"));
1049
- volumes.push(" postgres_data:");
1050
- }
1051
- if (needsRedis) services.push([
1052
- " redis:",
1053
- " image: redis:7-alpine",
1054
- " ports: [\"6379:6379\"]"
1055
- ].join("\n"));
1056
- if (needsRustFS) {
1057
- services.push([
1058
- " rustfs:",
1059
- " image: rustfs/rustfs:latest",
1060
- " ports: [\"9000:9000\"]",
1061
- " environment:",
1062
- " RUSTFS_ROOT_USER: alepha",
1063
- " RUSTFS_ROOT_PASSWORD: alepha",
1064
- " volumes:",
1065
- " - rustfs_data:/data"
1066
- ].join("\n"));
1067
- volumes.push(" rustfs_data:");
1068
- }
1069
- if (services.length === 0) return null;
1070
- const parts = [
1071
- "# Auto-generated by Alepha. Do not edit.",
1072
- "services:",
1073
- ...services
1074
- ];
1075
- if (volumes.length > 0) parts.push("", "volumes:", ...volumes);
1076
- return `${parts.join("\n")}\n`;
1077
- }
1078
- /**
1079
- * Generate compose for a remote project.
1080
- *
1081
- * - With `domain`: app connects to shared alepha-proxy network + Traefik labels
1082
- * - Without `domain`: app exposed directly on port 3000, no Traefik involvement
1083
- *
1084
- * Traefik itself is NEVER in this compose — it's a separate shared compose.
1085
- */
1086
- generateRemote(options) {
1087
- const hasDomain = !!options.domain || Object.keys(options.domains ?? {}).length > 0;
1088
- const services = [];
1089
- const volumes = [];
1090
- const isMultiApp = options.apps.length > 1;
1091
- const needsInternal = hasDomain && this.anyAppNeedsInternal(options.apps, options.envVars);
1092
- for (let i = 0; i < options.apps.length; i++) {
1093
- const app = options.apps[i];
1094
- const serviceName = isMultiApp ? `app-${app.name}` : "app";
1095
- const buildPath = isMultiApp ? `./dist/${app.name}` : "./dist";
1096
- const appLines = [
1097
- ` ${serviceName}:`,
1098
- ` build: ${buildPath}`,
1099
- ` env_file: .env.${options.env}`
1100
- ];
1101
- const appDomain = this.resolveAppDomain(app.name, isMultiApp, options.domain, options.domains);
1102
- if (appDomain) {
1103
- const routerName = serviceName.replace(/-/g, "");
1104
- appLines.push(" labels:", " - traefik.enable=true", ` - traefik.http.routers.${routerName}.rule=Host(\`${appDomain}\`)`, ` - traefik.http.routers.${routerName}.tls.certresolver=letsencrypt`, " networks:", " - alepha-proxy");
1105
- if (needsInternal) appLines.push(" - internal");
1106
- } else {
1107
- const port = 3e3 + i;
1108
- appLines.push(" ports:", ` - "${port}:3000"`);
1109
- }
1110
- appLines.push(" restart: unless-stopped");
1111
- const deps = [];
1112
- if (app.resources.hasDatabase && !options.envVars.DATABASE_URL) deps.push(" - postgres");
1113
- if ((app.resources.hasKV || app.resources.hasQueue) && !options.envVars.REDIS_URL) deps.push(" - redis");
1114
- if (app.resources.hasBucket && !options.envVars.S3_ENDPOINT) deps.push(" - rustfs");
1115
- if (deps.length > 0) appLines.push(" depends_on:", ...deps);
1116
- services.push(appLines.join("\n"));
1117
- }
1118
- if (this.anyAppHas(options.apps, "hasDatabase") && !options.envVars.DATABASE_URL) {
1119
- const pgLines = [
1120
- " postgres:",
1121
- " image: postgres:17-alpine",
1122
- " environment:",
1123
- ` POSTGRES_DB: ${`${options.project}_${options.env}`.replace(/-/g, "_")}`,
1124
- " POSTGRES_USER: alepha",
1125
- " POSTGRES_PASSWORD: ${DB_PASSWORD}",
1126
- " volumes:",
1127
- " - postgres_data:/var/lib/postgresql/data"
1128
- ];
1129
- if (hasDomain) pgLines.push(" networks:", " - internal");
1130
- pgLines.push(" restart: unless-stopped");
1131
- services.push(pgLines.join("\n"));
1132
- volumes.push(" postgres_data:");
1133
- }
1134
- if ((this.anyAppHas(options.apps, "hasKV") || this.anyAppHas(options.apps, "hasQueue")) && !options.envVars.REDIS_URL) {
1135
- const redisLines = [" redis:", " image: redis:7-alpine"];
1136
- if (hasDomain) redisLines.push(" networks:", " - internal");
1137
- redisLines.push(" restart: unless-stopped");
1138
- services.push(redisLines.join("\n"));
1139
- }
1140
- if (this.anyAppHas(options.apps, "hasBucket") && !options.envVars.S3_ENDPOINT) {
1141
- const rustfsLines = [
1142
- " rustfs:",
1143
- " image: rustfs/rustfs:latest",
1144
- " environment:",
1145
- " RUSTFS_ROOT_USER: alepha",
1146
- " RUSTFS_ROOT_PASSWORD: ${S3_SECRET_KEY}",
1147
- " volumes:",
1148
- " - rustfs_data:/data"
1149
- ];
1150
- if (hasDomain) rustfsLines.push(" networks:", " - internal");
1151
- rustfsLines.push(" restart: unless-stopped");
1152
- services.push(rustfsLines.join("\n"));
1153
- volumes.push(" rustfs_data:");
1154
- }
1155
- const parts = [
1156
- "# Auto-generated by Alepha. Do not edit.",
1157
- "services:",
1158
- ...services
1159
- ];
1160
- if (hasDomain) {
1161
- parts.push("", "networks:", " alepha-proxy:", " external: true");
1162
- if (needsInternal) parts.push(" internal:");
1163
- }
1164
- if (volumes.length > 0) parts.push("", "volumes:", ...volumes);
1165
- return `${parts.join("\n")}\n`;
1166
- }
1167
- /**
1168
- * Resolve the domain for an app.
1169
- *
1170
- * Priority:
1171
- * 1. `domains[appName]` — explicit override (e.g. shop → myshop.com)
1172
- * 2. `<appName>.<domain>` — convention for multi-app (e.g. api → api.company.com)
1173
- * 3. `domain` — used directly for single-app projects (e.g. myapp.com)
1174
- */
1175
- resolveAppDomain(appName, isMultiApp, domain, domains) {
1176
- if (domains?.[appName]) return domains[appName];
1177
- if (domain && isMultiApp) return `${appName}.${domain}`;
1178
- return domain;
1179
- }
1180
- anyAppHas(apps, resource) {
1181
- return apps.some((app) => app.resources[resource]);
1182
- }
1183
- anyAppNeedsInternal(apps, envVars) {
1184
- return this.anyAppHas(apps, "hasDatabase") && !envVars.DATABASE_URL || (this.anyAppHas(apps, "hasKV") || this.anyAppHas(apps, "hasQueue")) && !envVars.REDIS_URL || this.anyAppHas(apps, "hasBucket") && !envVars.S3_ENDPOINT;
1185
- }
1186
- };
1187
- //#endregion
1188
- //#region ../../src/cli/platform/services/DockerSshService.ts
1189
- /**
1190
- * Wraps SSH and SCP operations for remote Docker deployments.
1191
- */
1192
- var DockerSshService = class {
1193
- shell = $inject(ShellProvider);
1194
- /**
1195
- * Validate an IP address or hostname to prevent shell injection.
1196
- */
1197
- validateHost(ip) {
1198
- if (!/^[a-zA-Z0-9.:_-]+$/.test(ip)) throw new AlephaError(`Invalid host: ${ip}`);
1199
- }
1200
- /**
1201
- * Validate a file path to prevent shell injection.
1202
- */
1203
- validatePath(path) {
1204
- if (/[;&|`$(){}'"\\!#~<>*?[\]\n\r]/.test(path)) throw new AlephaError(`Invalid path: ${path}`);
1205
- }
1206
- /**
1207
- * Verify SSH connectivity to the remote host.
1208
- */
1209
- async checkConnection(ip) {
1210
- this.validateHost(ip);
1211
- await this.shell.run(`ssh root@${ip} echo ok`);
1212
- }
1213
- /**
1214
- * Execute a command on the remote host via SSH.
1215
- */
1216
- async exec(ip, command) {
1217
- this.validateHost(ip);
1218
- const escaped = command.replace(/'/g, "'\\''");
1219
- return this.shell.run(`ssh root@${ip} '${escaped}'`, { capture: true });
1220
- }
1221
- /**
1222
- * Upload a file to the remote host via SCP.
1223
- */
1224
- async upload(ip, localPath, remotePath) {
1225
- this.validateHost(ip);
1226
- this.validatePath(localPath);
1227
- this.validatePath(remotePath);
1228
- await this.shell.run(`scp ${localPath} root@${ip}:${remotePath}`);
1229
- }
1230
- };
1231
- //#endregion
1232
- //#region ../../src/cli/platform/adapters/DockerAdapter.ts
1233
- /**
1234
- * Docker platform adapter.
1235
- *
1236
- * Handles both local development (docker compose for services)
1237
- * and remote VPS deployment (SSH + Docker).
1238
- *
1239
- * Mode is determined by the `ip` field in environment config:
1240
- * - No `ip`: local mode — compose up services (Postgres, Redis)
1241
- * - With `ip`: remote mode — SSH to VPS, push dist, compose up
1242
- *
1243
- * Traefik is a shared singleton per VPS at /opt/alepha/traefik/.
1244
- * Auto-provisioned on first deploy with `domain`, skipped if already running.
1245
- */
1246
- var DockerAdapter = class extends PlatformAdapter {
1247
- log = $logger();
1248
- fs = $inject(FileSystemProvider);
1249
- shell = $inject(ShellProvider);
1250
- envUtils = $inject(EnvUtils);
1251
- generator = $inject(DockerComposeGenerator);
1252
- ssh = $inject(DockerSshService);
1253
- TRAEFIK_PATH = "/opt/alepha/traefik";
1254
- TRAEFIK_CONTAINER = "alepha-traefik";
1255
- isRemote(ctx) {
1256
- return !!ctx.envConfig.ip;
1257
- }
1258
- composePath(ctx) {
1259
- return this.fs.join(ctx.root, "node_modules/.alepha/docker-compose.yml");
1260
- }
1261
- remotePath(ctx) {
1262
- return `/opt/alepha/${ctx.project}-${ctx.env}`;
1263
- }
1264
- async authenticate(ctx, run) {
1265
- await run({
1266
- name: "authenticate",
1267
- handler: async () => {
1268
- await this.shell.run("docker --version");
1269
- if (this.isRemote(ctx)) await this.ssh.checkConnection(ctx.envConfig.ip);
1270
- }
1271
- });
1272
- }
1273
- async build(ctx, run) {
1274
- if (!this.isRemote(ctx)) return;
1275
- await run("alepha build -t docker", { root: ctx.app.path ? this.fs.join(ctx.root, ctx.app.path) : ctx.root });
1276
- }
1277
- async deploy(ctx, run) {
1278
- if (!this.isRemote(ctx)) return;
1279
- const ip = ctx.envConfig.ip;
1280
- const remote = this.remotePath(ctx);
1281
- await run({
1282
- name: "deploy",
1283
- handler: async () => {
1284
- await this.shell.run("tar czf dist.tar.gz dist", { root: ctx.root });
1285
- await this.ssh.exec(ip, `mkdir -p ${remote}`);
1286
- await this.ssh.upload(ip, this.fs.join(ctx.root, "dist.tar.gz"), `${remote}/dist.tar.gz`);
1287
- await this.ssh.exec(ip, `cd ${remote} && tar xzf dist.tar.gz && docker compose build && docker compose up -d`);
1288
- }
1289
- });
1290
- return ctx.envConfig.domain ? `https://${ctx.envConfig.domain}` : void 0;
1291
- }
1292
- async provision(ctx, run) {
1293
- const envVars = await this.envUtils.parseEnv(ctx.root, [`.env.${ctx.env}`, ".env"]);
1294
- if (this.isRemote(ctx)) await this.provisionRemote(ctx, run, envVars);
1295
- else await this.provisionLocal(ctx, run, envVars);
1296
- }
1297
- async provisionLocal(ctx, run, envVars) {
1298
- const compose = this.generator.generateLocal({
1299
- project: ctx.project,
1300
- env: ctx.env,
1301
- naming: ctx.naming,
1302
- apps: ctx.apps,
1303
- envVars
1304
- });
1305
- if (!compose) return;
1306
- await run({
1307
- name: "provision (docker compose)",
1308
- handler: async () => {
1309
- const composePath = this.composePath(ctx);
1310
- await this.fs.mkdir(dirname(composePath), { recursive: true });
1311
- await this.fs.writeFile(composePath, compose);
1312
- await this.shell.run(`docker compose -f ${composePath} -p ${ctx.project}-${ctx.env} up -d`);
1313
- }
1314
- });
1315
- }
1316
- async provisionRemote(ctx, run, envVars) {
1317
- const ip = ctx.envConfig.ip;
1318
- const remote = this.remotePath(ctx);
1319
- if (!!ctx.envConfig.domain || Object.keys(ctx.envConfig.domains ?? {}).length > 0) await this.ensureTraefik(ip, run);
1320
- const compose = this.generator.generateRemote({
1321
- project: ctx.project,
1322
- env: ctx.env,
1323
- naming: ctx.naming,
1324
- domain: ctx.envConfig.domain,
1325
- domains: ctx.envConfig.domains,
1326
- apps: ctx.apps,
1327
- envVars
1328
- });
1329
- await run({
1330
- name: "provision (remote)",
1331
- handler: async () => {
1332
- const localCompose = this.composePath(ctx);
1333
- await this.fs.mkdir(dirname(localCompose), { recursive: true });
1334
- await this.fs.writeFile(localCompose, compose);
1335
- await this.ssh.exec(ip, `mkdir -p ${remote}`);
1336
- await this.ssh.upload(ip, localCompose, `${remote}/docker-compose.yml`);
1337
- const envFile = this.fs.join(ctx.root, `.env.${ctx.env}`);
1338
- if (await this.fs.exists(envFile)) await this.ssh.upload(ip, envFile, `${remote}/.env.${ctx.env}`);
1339
- }
1340
- });
1341
- }
1342
- /**
1343
- * Ensure the shared Traefik instance is running on the VPS.
1344
- * If already running, this is a no-op.
1345
- */
1346
- async ensureTraefik(ip, run) {
1347
- if ((await this.ssh.exec(ip, `docker ps --filter name=${this.TRAEFIK_CONTAINER} --format '{{.Names}}'`)).trim() === this.TRAEFIK_CONTAINER) return;
1348
- await run({
1349
- name: "provision (shared traefik)",
1350
- handler: async () => {
1351
- const traefikCompose = this.generator.generateTraefik();
1352
- const localPath = this.fs.join("node_modules/.alepha/traefik-compose.yml");
1353
- await this.fs.mkdir(dirname(localPath), { recursive: true });
1354
- await this.fs.writeFile(localPath, traefikCompose);
1355
- await this.ssh.exec(ip, `mkdir -p ${this.TRAEFIK_PATH}`);
1356
- await this.ssh.upload(ip, localPath, `${this.TRAEFIK_PATH}/docker-compose.yml`);
1357
- await this.ssh.exec(ip, `cd ${this.TRAEFIK_PATH} && docker compose up -d`);
1358
- }
1359
- });
1360
- }
1361
- async migrate(ctx, run) {
1362
- if (!ctx.apps.some((app) => app.resources.hasDatabase)) return;
1363
- await run({
1364
- name: "migrate",
1365
- handler: async () => {
1366
- if (this.isRemote(ctx)) {
1367
- const ip = ctx.envConfig.ip;
1368
- const remote = this.remotePath(ctx);
1369
- await this.ssh.exec(ip, `cd ${remote} && docker compose exec app node -e "require('./migrate')"`);
1370
- } else await this.shell.run("alepha db migrations apply", { root: ctx.root });
1371
- }
1372
- });
1373
- }
1374
- async secrets(ctx, run) {
1375
- if (!this.isRemote(ctx)) return;
1376
- const ip = ctx.envConfig.ip;
1377
- const remote = this.remotePath(ctx);
1378
- const envFile = this.fs.join(ctx.root, `.env.${ctx.env}`);
1379
- if (!await this.fs.exists(envFile)) return;
1380
- await run({
1381
- name: "push secrets",
1382
- handler: async () => {
1383
- await this.ssh.upload(ip, envFile, `${remote}/.env.${ctx.env}`);
1384
- }
1385
- });
1386
- }
1387
- async inspect(ctx, run) {
1388
- const state = {
1389
- workers: [],
1390
- databases: [],
1391
- buckets: [],
1392
- kvNamespaces: [],
1393
- queues: [],
1394
- secrets: []
1395
- };
1396
- await run({
1397
- name: "inspect",
1398
- handler: async () => {
1399
- if (this.isRemote(ctx)) {
1400
- const ip = ctx.envConfig.ip;
1401
- const remote = this.remotePath(ctx);
1402
- try {
1403
- const output = await this.ssh.exec(ip, `cd ${remote} && docker compose ps --format json 2>/dev/null || echo "[]"`);
1404
- const containers = this.parseContainers(output);
1405
- for (const c of containers) state.workers.push({
1406
- name: c.name,
1407
- exists: c.state === "running",
1408
- detail: c.state
1409
- });
1410
- } catch {}
1411
- } else {
1412
- const composePath = this.composePath(ctx);
1413
- if (await this.fs.exists(composePath)) try {
1414
- const output = await this.shell.run(`docker compose -f ${composePath} -p ${ctx.project}-${ctx.env} ps --format json`, { capture: true });
1415
- const containers = this.parseContainers(output);
1416
- for (const c of containers) state.workers.push({
1417
- name: c.name,
1418
- exists: c.state === "running",
1419
- detail: c.state
1420
- });
1421
- } catch {}
1422
- }
1423
- }
1424
- });
1425
- return state;
1426
- }
1427
- async teardown(ctx, run) {
1428
- await run({
1429
- name: "teardown",
1430
- handler: async () => {
1431
- if (this.isRemote(ctx)) {
1432
- const ip = ctx.envConfig.ip;
1433
- const remote = this.remotePath(ctx);
1434
- await this.ssh.exec(ip, `cd ${remote} && docker compose down`);
1435
- } else {
1436
- const composePath = this.composePath(ctx);
1437
- if (await this.fs.exists(composePath)) await this.shell.run(`docker compose -f ${composePath} -p ${ctx.project}-${ctx.env} down`);
1438
- }
1439
- }
1440
- });
1441
- }
1442
- parseContainers(output) {
1443
- try {
1444
- return output.trim().split("\n").filter(Boolean).map((line) => {
1445
- const obj = JSON.parse(line);
1446
- return {
1447
- name: obj.Name ?? obj.Service ?? "unknown",
1448
- state: obj.State ?? "unknown"
1449
- };
1450
- });
1451
- } catch {
1452
- return [];
1453
- }
1454
- }
1455
- };
1456
- //#endregion
1457
981
  //#region ../../src/cli/platform/schemas/vercel.ts
1458
982
  const vercelProjectSchema = t.object({
1459
983
  id: t.string(),
@@ -1912,16 +1436,9 @@ const platformOptions = $atom({
1912
1436
  environmentPattern: t.optional(t.text())
1913
1437
  })),
1914
1438
  environments: t.record(t.text(), t.object({
1915
- adapter: t.enum([
1916
- "cloudflare",
1917
- "vercel",
1918
- "docker",
1919
- "docker-compose",
1920
- "aks"
1921
- ]),
1439
+ adapter: t.enum(["cloudflare", "vercel"]),
1922
1440
  domain: t.optional(t.text()),
1923
- domains: t.optional(t.record(t.text(), t.text())),
1924
- ip: t.optional(t.text())
1441
+ domains: t.optional(t.record(t.text(), t.text()))
1925
1442
  }))
1926
1443
  }))
1927
1444
  });
@@ -1982,7 +1499,7 @@ var PlatformInspector = class {
1982
1499
  alepha = $inject(Alepha);
1983
1500
  fs = $inject(FileSystemProvider);
1984
1501
  asker = $inject(Asker);
1985
- options = $use(platformOptions);
1502
+ options = $state(platformOptions);
1986
1503
  naming = $inject(NamingService);
1987
1504
  /**
1988
1505
  * Resolve and validate the full platform configuration.
@@ -2063,15 +1580,11 @@ var PlatformOrchestrator = class {
2063
1580
  inspector = $inject(PlatformInspector);
2064
1581
  naming = $inject(NamingService);
2065
1582
  cloudflareAdapter = $inject(CloudflareAdapter);
2066
- dockerAdapter = $inject(DockerAdapter);
2067
1583
  vercelAdapter = $inject(VercelAdapter);
2068
1584
  resolveAdapter(adapterName) {
2069
1585
  switch (adapterName) {
2070
1586
  case "cloudflare": return this.cloudflareAdapter;
2071
- case "docker":
2072
- case "docker-compose": return this.dockerAdapter;
2073
1587
  case "vercel": return this.vercelAdapter;
2074
- case "aks": throw new AlephaError(`Adapter "${adapterName}" is not yet available. Currently supported: cloudflare, docker, vercel`);
2075
1588
  default: throw new AlephaError(`Unknown adapter: "${adapterName}"`);
2076
1589
  }
2077
1590
  }
@@ -2300,7 +1813,7 @@ var SecretFilterService = class SecretFilterService {
2300
1813
  //#region ../../src/cli/platform/commands/SecretsCommand.ts
2301
1814
  var SecretsCommand = class {
2302
1815
  log = $logger();
2303
- options = $use(platformOptions);
1816
+ options = $state(platformOptions);
2304
1817
  inspector = $inject(PlatformInspector);
2305
1818
  naming = $inject(NamingService);
2306
1819
  envUtils = $inject(EnvUtils);
@@ -2468,7 +1981,7 @@ var SecretsCommand = class {
2468
1981
  //#region ../../src/cli/platform/commands/platform.ts
2469
1982
  var PlatformCommand = class {
2470
1983
  log = $logger();
2471
- options = $use(platformOptions);
1984
+ options = $state(platformOptions);
2472
1985
  orchestrator = $inject(PlatformOrchestrator);
2473
1986
  inspector = $inject(PlatformInspector);
2474
1987
  naming = $inject(NamingService);
@@ -2542,16 +2055,6 @@ var PlatformCommand = class {
2542
2055
  });
2543
2056
  }
2544
2057
  }
2545
- if (adapterName === "docker" || adapterName === "docker-compose") {
2546
- if (hasDB && !envVars.DATABASE_URL) resources.push({
2547
- label: "Postgres",
2548
- value: "postgres:17-alpine"
2549
- });
2550
- if (hasBucket && !envVars.S3_ENDPOINT) resources.push({
2551
- label: "RustFS",
2552
- value: "rustfs/rustfs:latest"
2553
- });
2554
- }
2555
2058
  const excludedKeys = adapterName === "vercel" ? VercelAdapter.EXCLUDED_SECRET_KEYS : CloudflareAdapter.EXCLUDED_SECRET_KEYS;
2556
2059
  const secretCount = Object.entries(envVars).filter(([key, value]) => value && !excludedKeys.has(key) && !key.startsWith("VITE_")).length;
2557
2060
  if (flags.json) {
@@ -3078,17 +2581,46 @@ const platformPlanSchema = t.object({
3078
2581
  });
3079
2582
  //#endregion
3080
2583
  //#region ../../src/cli/platform/index.ts
3081
- const AlephaCliPlatform = $module({
3082
- name: "alepha.cli.platform",
2584
+ /**
2585
+ * CLI plugin for multi-cloud deployment orchestration.
2586
+ *
2587
+ * Manages the full lifecycle of deploying Alepha apps: provision resources,
2588
+ * build, migrate databases, deploy, and sync secrets. Supports Cloudflare
2589
+ * Workers and Vercel.
2590
+ *
2591
+ * Commands:
2592
+ * - `alepha platform plan` — show project topology and resource names
2593
+ * - `alepha platform up` — full deployment pipeline
2594
+ * - `alepha platform down` — teardown an environment
2595
+ * - `alepha platform status` — inspect deployed resources
2596
+ * - `alepha platform build` — build apps locally
2597
+ * - `alepha platform deploy` — deploy to cloud
2598
+ * - `alepha platform migrate` — run database migrations
2599
+ * - `alepha platform secrets` — manage external secret stores
2600
+ *
2601
+ * Configuration in `alepha.config.ts`:
2602
+ *
2603
+ * ```typescript
2604
+ * import { AlephaCliPlatformPlugin } from "alepha/cli/platform";
2605
+ *
2606
+ * export default defineConfig({
2607
+ * services: [AlephaCliPlatformPlugin],
2608
+ * platform: {
2609
+ * environments: {
2610
+ * production: { adapter: "cloudflare", domain: "myapp.com" },
2611
+ * },
2612
+ * },
2613
+ * });
2614
+ * ```
2615
+ */
2616
+ const AlephaCliPlatformPlugin = $module({
2617
+ name: "alepha.cli.plugins.platform",
3083
2618
  services: [
3084
2619
  AlephaCli,
3085
2620
  PlatformCommand,
3086
2621
  SecretsCommand,
3087
2622
  CloudflareAdapter,
3088
2623
  CloudflareApi,
3089
- DockerAdapter,
3090
- DockerComposeGenerator,
3091
- DockerSshService,
3092
2624
  VercelAdapter,
3093
2625
  VercelApi,
3094
2626
  VercelCli,
@@ -3102,7 +2634,10 @@ const AlephaCliPlatform = $module({
3102
2634
  PlatformOrchestrator
3103
2635
  ]
3104
2636
  });
2637
+ cliConfigPlugins.push((config, alepha) => {
2638
+ if (config.platform) alepha.set(platformOptions, config.platform);
2639
+ });
3105
2640
  //#endregion
3106
- export { AlephaCliPlatform, CloudflareAdapter, CloudflareApi, DockerAdapter, DockerComposeGenerator, DockerSshService, GitHubSecretStore, MemorySecretStore, NamingContext, NamingService, PlatformAdapter, PlatformCacheProvider, PlatformCommand, PlatformInspector, PlatformOrchestrator, SecretFilterService, SecretStoreProvider, SecretsCommand, VercelAdapter, VercelApi, VercelCli, WranglerApi, cloudflareAccountSchema, cloudflareApiErrorSchema, cloudflareD1Schema, cloudflareDeploymentListSchema, cloudflareDeploymentSchema, cloudflareDeploymentVersionSchema, cloudflareHyperdriveOriginSchema, cloudflareHyperdriveSchema, cloudflareKVSchema, cloudflareQueueConsumerSchema, cloudflareQueueSchema, cloudflareR2ListSchema, cloudflareR2Schema, cloudflareSecretSchema, cloudflareVersionListSchema, cloudflareVersionSchema, cloudflareWorkerSchema, createD1BodySchema, createEnvVarBodySchema, createHyperdriveBodySchema, createHyperdriveOriginSchema, createKVBodySchema, createProjectBodySchema, createQueueBodySchema, createR2BodySchema, platformOptions, platformPlanAppResourcesSchema, platformPlanAppSchema, platformPlanEnvironmentSchema, platformPlanResourceSchema, platformPlanSchema, platformStatusResourceSchema, platformStatusSchema, platformStatusSecretSchema, platformStatusWorkerSchema, putSecretBodySchema, vercelDeploymentSchema, vercelEnvVarSchema, vercelProjectSchema };
2641
+ export { AlephaCliPlatformPlugin, CloudflareAdapter, CloudflareApi, GitHubSecretStore, MemorySecretStore, NamingContext, NamingService, PlatformAdapter, PlatformCacheProvider, PlatformCommand, PlatformInspector, PlatformOrchestrator, SecretFilterService, SecretStoreProvider, SecretsCommand, VercelAdapter, VercelApi, VercelCli, WranglerApi, cloudflareAccountSchema, cloudflareApiErrorSchema, cloudflareD1Schema, cloudflareDeploymentListSchema, cloudflareDeploymentSchema, cloudflareDeploymentVersionSchema, cloudflareHyperdriveOriginSchema, cloudflareHyperdriveSchema, cloudflareKVSchema, cloudflareQueueConsumerSchema, cloudflareQueueSchema, cloudflareR2ListSchema, cloudflareR2Schema, cloudflareSecretSchema, cloudflareVersionListSchema, cloudflareVersionSchema, cloudflareWorkerSchema, createD1BodySchema, createEnvVarBodySchema, createHyperdriveBodySchema, createHyperdriveOriginSchema, createKVBodySchema, createProjectBodySchema, createQueueBodySchema, createR2BodySchema, platformOptions, platformPlanAppResourcesSchema, platformPlanAppSchema, platformPlanEnvironmentSchema, platformPlanResourceSchema, platformPlanSchema, platformStatusResourceSchema, platformStatusSchema, platformStatusSecretSchema, platformStatusWorkerSchema, putSecretBodySchema, vercelDeploymentSchema, vercelEnvVarSchema, vercelProjectSchema };
3107
2642
 
3108
2643
  //# sourceMappingURL=index.js.map