alepha 0.18.2 → 0.18.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 (397) hide show
  1. package/assets/devtools-ui/200.html +2 -2
  2. package/assets/devtools-ui/200.html.br +0 -0
  3. package/assets/devtools-ui/404.html +2 -2
  4. package/assets/devtools-ui/404.html.br +0 -0
  5. package/assets/devtools-ui/{asset.BfSBZ5Dd.css → asset.hG_f8HuK.css} +1 -1
  6. package/assets/devtools-ui/asset.hG_f8HuK.css.br +0 -0
  7. package/assets/devtools-ui/chunk.B3au4Lhg.js +1 -0
  8. package/assets/devtools-ui/chunk.B3au4Lhg.js.br +0 -0
  9. package/assets/devtools-ui/chunk.BLOrlnMB.js +1 -0
  10. package/assets/devtools-ui/chunk.BLOrlnMB.js.br +0 -0
  11. package/assets/devtools-ui/chunk.BLR01ljW.js +1 -0
  12. package/assets/devtools-ui/chunk.BLR01ljW.js.br +0 -0
  13. package/assets/devtools-ui/chunk.BTXaIUlA.js +1 -0
  14. package/assets/devtools-ui/chunk.BTXaIUlA.js.br +0 -0
  15. package/assets/devtools-ui/{chunk.lJL-lgnW.js → chunk.BhJaxmm8.js} +1 -1
  16. package/assets/devtools-ui/chunk.BhJaxmm8.js.br +0 -0
  17. package/assets/devtools-ui/chunk.BtoNxFuL.js +1 -0
  18. package/assets/devtools-ui/chunk.BtoNxFuL.js.br +0 -0
  19. package/assets/devtools-ui/chunk.C8YUV2Wd.js +1 -0
  20. package/assets/devtools-ui/chunk.C8YUV2Wd.js.br +0 -0
  21. package/assets/devtools-ui/{chunk.M6wyKO_3.js → chunk.CBbIgDzE.js} +2 -2
  22. package/assets/devtools-ui/chunk.CBbIgDzE.js.br +0 -0
  23. package/assets/devtools-ui/chunk.CFqIniwA.js +1 -0
  24. package/assets/devtools-ui/chunk.CFqIniwA.js.br +0 -0
  25. package/assets/devtools-ui/chunk.CLFF7f7-.js +1 -0
  26. package/assets/devtools-ui/chunk.CLFF7f7-.js.br +0 -0
  27. package/assets/devtools-ui/chunk.CRsBbA10.js +1 -0
  28. package/assets/devtools-ui/chunk.CRsBbA10.js.br +0 -0
  29. package/assets/devtools-ui/{chunk.DbEH1oOB.js → chunk.CZPo6v95.js} +1 -1
  30. package/assets/devtools-ui/chunk.CZPo6v95.js.br +0 -0
  31. package/assets/devtools-ui/chunk.D0fWgNos.js +1 -0
  32. package/assets/devtools-ui/chunk.D0fWgNos.js.br +1 -0
  33. package/assets/devtools-ui/chunk.D7-0ziQ6.js +1 -0
  34. package/assets/devtools-ui/chunk.D7-0ziQ6.js.br +0 -0
  35. package/assets/devtools-ui/chunk.DAewe0vm.js +1 -0
  36. package/assets/devtools-ui/chunk.DAewe0vm.js.br +0 -0
  37. package/assets/devtools-ui/chunk.DJRQEYqK.js +1 -0
  38. package/assets/devtools-ui/chunk.DJRQEYqK.js.br +0 -0
  39. package/assets/devtools-ui/{chunk.CZl6J9DF.js → chunk.DMAxv14p.js} +1 -1
  40. package/assets/devtools-ui/chunk.DMAxv14p.js.br +0 -0
  41. package/assets/devtools-ui/{chunk.BT2IiBkZ.js → chunk.DMImnNjU.js} +1 -1
  42. package/assets/devtools-ui/chunk.DMImnNjU.js.br +0 -0
  43. package/assets/devtools-ui/chunk.DeeQsidk.js +9 -0
  44. package/assets/devtools-ui/chunk.DeeQsidk.js.br +0 -0
  45. package/assets/devtools-ui/chunk.DqEwn9Vj.js +7 -0
  46. package/assets/devtools-ui/chunk.DqEwn9Vj.js.br +0 -0
  47. package/assets/devtools-ui/chunk.Dt8OsQey.js +1 -0
  48. package/assets/devtools-ui/chunk.Dt8OsQey.js.br +0 -0
  49. package/assets/devtools-ui/{chunk.B9pX3zit.js → chunk.Dtp8oa_f.js} +1 -1
  50. package/assets/devtools-ui/chunk.Dtp8oa_f.js.br +0 -0
  51. package/assets/devtools-ui/chunk.Dx3JzAYM.js +1 -0
  52. package/assets/devtools-ui/chunk.Dx3JzAYM.js.br +0 -0
  53. package/assets/devtools-ui/chunk.GCOj1-5E.js +1 -0
  54. package/assets/devtools-ui/chunk.GCOj1-5E.js.br +0 -0
  55. package/assets/devtools-ui/chunk.IC1LD8BH.js +1 -0
  56. package/assets/devtools-ui/chunk.IC1LD8BH.js.br +0 -0
  57. package/assets/devtools-ui/chunk.IwuB_TqW.js +1 -0
  58. package/assets/devtools-ui/chunk.IwuB_TqW.js.br +0 -0
  59. package/assets/devtools-ui/chunk.Qqapj2zq.js +1 -0
  60. package/assets/devtools-ui/chunk.Qqapj2zq.js.br +0 -0
  61. package/assets/devtools-ui/{chunk.C79YouPp.js → chunk.TKKKndOy.js} +1 -1
  62. package/assets/devtools-ui/chunk.TKKKndOy.js.br +0 -0
  63. package/assets/devtools-ui/chunk.YHTVhFQT.js +1 -0
  64. package/assets/devtools-ui/chunk.YHTVhFQT.js.br +0 -0
  65. package/assets/devtools-ui/chunk.fnod6uEi.js +1 -0
  66. package/assets/devtools-ui/chunk.fnod6uEi.js.br +0 -0
  67. package/assets/devtools-ui/chunk.mOCRmXjo.js +1 -0
  68. package/assets/devtools-ui/chunk.mOCRmXjo.js.br +0 -0
  69. package/assets/devtools-ui/chunk.qZTNEAK0.js +1 -0
  70. package/assets/devtools-ui/chunk.qZTNEAK0.js.br +0 -0
  71. package/assets/devtools-ui/chunk.rc9m0y4-.js +1 -0
  72. package/assets/devtools-ui/chunk.rc9m0y4-.js.br +0 -0
  73. package/assets/devtools-ui/entry.Cxc5QLCU.js +80 -0
  74. package/assets/devtools-ui/entry.Cxc5QLCU.js.br +0 -0
  75. package/assets/devtools-ui/index.html +2 -2
  76. package/assets/devtools-ui/index.html.br +0 -0
  77. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  78. package/assets/swagger-ui/swagger-ui.css +1 -1
  79. package/dist/api/audits/index.d.ts +61 -5
  80. package/dist/api/audits/index.d.ts.map +1 -1
  81. package/dist/api/files/index.d.ts +61 -5
  82. package/dist/api/files/index.d.ts.map +1 -1
  83. package/dist/api/jobs/index.d.ts +61 -5
  84. package/dist/api/jobs/index.d.ts.map +1 -1
  85. package/dist/api/jobs/index.js +4 -2
  86. package/dist/api/jobs/index.js.map +1 -1
  87. package/dist/api/keys/index.d.ts +5 -5
  88. package/dist/api/notifications/index.browser.js +44 -1
  89. package/dist/api/notifications/index.browser.js.map +1 -1
  90. package/dist/api/notifications/index.d.ts +187 -2
  91. package/dist/api/notifications/index.d.ts.map +1 -1
  92. package/dist/api/notifications/index.js +143 -8
  93. package/dist/api/notifications/index.js.map +1 -1
  94. package/dist/api/parameters/index.d.ts +61 -5
  95. package/dist/api/parameters/index.d.ts.map +1 -1
  96. package/dist/api/users/index.d.ts +330 -93
  97. package/dist/api/users/index.d.ts.map +1 -1
  98. package/dist/api/users/index.js +27 -36
  99. package/dist/api/users/index.js.map +1 -1
  100. package/dist/cli/config/index.d.ts +46 -0
  101. package/dist/cli/config/index.d.ts.map +1 -0
  102. package/dist/cli/config/index.js +20 -0
  103. package/dist/cli/config/index.js.map +1 -0
  104. package/dist/cli/core/index.d.ts +69 -66
  105. package/dist/cli/core/index.d.ts.map +1 -1
  106. package/dist/cli/core/index.js +329 -196
  107. package/dist/cli/core/index.js.map +1 -1
  108. package/dist/cli/platform/index.d.ts +302 -63
  109. package/dist/cli/platform/index.d.ts.map +1 -1
  110. package/dist/cli/platform/index.js +455 -25
  111. package/dist/cli/platform/index.js.map +1 -1
  112. package/dist/core/index.browser.js +125 -87
  113. package/dist/core/index.browser.js.map +1 -1
  114. package/dist/core/index.d.ts +62 -53
  115. package/dist/core/index.d.ts.map +1 -1
  116. package/dist/core/index.js +125 -87
  117. package/dist/core/index.js.map +1 -1
  118. package/dist/core/index.native.js +125 -87
  119. package/dist/core/index.native.js.map +1 -1
  120. package/dist/core/index.workerd.js +125 -87
  121. package/dist/core/index.workerd.js.map +1 -1
  122. package/dist/crypto/index.d.ts +18 -1
  123. package/dist/crypto/index.d.ts.map +1 -1
  124. package/dist/crypto/index.js +29 -3
  125. package/dist/crypto/index.js.map +1 -1
  126. package/dist/devtools/index.js +3 -12
  127. package/dist/devtools/index.js.map +1 -1
  128. package/dist/logger/index.d.ts +10 -1
  129. package/dist/logger/index.d.ts.map +1 -1
  130. package/dist/logger/index.js +19 -9
  131. package/dist/logger/index.js.map +1 -1
  132. package/dist/orm/core/index.browser.js +57 -1
  133. package/dist/orm/core/index.browser.js.map +1 -1
  134. package/dist/orm/core/index.bun.js +378 -19
  135. package/dist/orm/core/index.bun.js.map +1 -1
  136. package/dist/orm/core/index.d.ts +328 -9
  137. package/dist/orm/core/index.d.ts.map +1 -1
  138. package/dist/orm/core/index.js +384 -21
  139. package/dist/orm/core/index.js.map +1 -1
  140. package/dist/orm/postgres/index.bun.js +49 -17
  141. package/dist/orm/postgres/index.bun.js.map +1 -1
  142. package/dist/orm/postgres/index.d.ts +47 -21
  143. package/dist/orm/postgres/index.d.ts.map +1 -1
  144. package/dist/orm/postgres/index.js +52 -17
  145. package/dist/orm/postgres/index.js.map +1 -1
  146. package/dist/react/core/index.d.ts +1 -1
  147. package/dist/react/core/index.d.ts.map +1 -1
  148. package/dist/react/core/index.js +6 -1
  149. package/dist/react/core/index.js.map +1 -1
  150. package/dist/react/form/index.d.ts +28 -18
  151. package/dist/react/form/index.d.ts.map +1 -1
  152. package/dist/react/form/index.js +92 -56
  153. package/dist/react/form/index.js.map +1 -1
  154. package/dist/react/router/index.browser.js +448 -116
  155. package/dist/react/router/index.browser.js.map +1 -1
  156. package/dist/react/router/index.d.ts +102 -40
  157. package/dist/react/router/index.d.ts.map +1 -1
  158. package/dist/react/router/index.js +453 -92
  159. package/dist/react/router/index.js.map +1 -1
  160. package/dist/security/index.d.ts +3 -11
  161. package/dist/security/index.d.ts.map +1 -1
  162. package/dist/security/index.js +6 -11
  163. package/dist/security/index.js.map +1 -1
  164. package/dist/server/auth/index.d.ts +22 -24
  165. package/dist/server/auth/index.d.ts.map +1 -1
  166. package/dist/server/auth/index.js +102 -82
  167. package/dist/server/auth/index.js.map +1 -1
  168. package/dist/server/cookies/index.d.ts +7 -4
  169. package/dist/server/cookies/index.d.ts.map +1 -1
  170. package/dist/server/cookies/index.js +13 -12
  171. package/dist/server/cookies/index.js.map +1 -1
  172. package/dist/server/core/index.d.ts +288 -4
  173. package/dist/server/core/index.d.ts.map +1 -1
  174. package/dist/server/core/index.js +375 -2
  175. package/dist/server/core/index.js.map +1 -1
  176. package/dist/server/links/index.browser.js +10 -71
  177. package/dist/server/links/index.browser.js.map +1 -1
  178. package/dist/server/links/index.d.ts +32 -49
  179. package/dist/server/links/index.d.ts.map +1 -1
  180. package/dist/server/links/index.js +73 -100
  181. package/dist/server/links/index.js.map +1 -1
  182. package/dist/system/index.browser.js +221 -2
  183. package/dist/system/index.browser.js.map +1 -1
  184. package/dist/system/index.d.ts +63 -1
  185. package/dist/system/index.d.ts.map +1 -1
  186. package/dist/system/index.js +221 -1
  187. package/dist/system/index.js.map +1 -1
  188. package/dist/system/index.workerd.js +224 -4
  189. package/dist/system/index.workerd.js.map +1 -1
  190. package/package.json +10 -5
  191. package/src/api/jobs/providers/JobProvider.ts +6 -3
  192. package/src/api/notifications/controllers/AdminNotificationController.ts +83 -0
  193. package/src/api/notifications/index.browser.ts +3 -0
  194. package/src/api/notifications/index.ts +14 -2
  195. package/src/api/notifications/jobs/NotificationJobs.ts +11 -2
  196. package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +20 -0
  197. package/src/api/notifications/schemas/notificationQuerySchema.ts +19 -0
  198. package/src/api/notifications/schemas/notificationResourceSchema.ts +18 -0
  199. package/src/api/notifications/services/NotificationSenderService.ts +15 -2
  200. package/src/api/users/atoms/realmAuthSettingsAtom.ts +28 -32
  201. package/src/api/users/buckets/UserBuckets.ts +1 -1
  202. package/src/api/users/jobs/UserJobs.ts +1 -1
  203. package/src/api/users/primitives/$realm.ts +8 -49
  204. package/src/api/users/providers/RealmProvider.ts +2 -3
  205. package/src/api/users/services/RegistrationService.spec.ts +7 -7
  206. package/src/api/users/services/RegistrationService.ts +3 -3
  207. package/src/api/users/services/SessionService.spec.ts +4 -4
  208. package/src/api/users/services/SessionService.ts +3 -3
  209. package/src/cli/{core → config}/defineConfig.ts +14 -20
  210. package/src/cli/config/index.ts +1 -0
  211. package/src/cli/core/commands/db.ts +65 -1
  212. package/src/cli/core/commands/dev.ts +1 -0
  213. package/src/cli/core/commands/init.ts +2 -192
  214. package/src/cli/core/index.ts +34 -11
  215. package/src/cli/core/providers/ViteDevServerProvider.ts +52 -13
  216. package/src/cli/core/services/PackageManagerUtils.ts +43 -21
  217. package/src/cli/core/services/ProjectScaffolder.ts +214 -2
  218. package/src/cli/core/services/ViteUtils.ts +57 -0
  219. package/src/cli/core/tasks/BuildClientTask.ts +7 -2
  220. package/src/cli/core/tasks/BuildCloudflareTask.ts +4 -12
  221. package/src/cli/core/tasks/BuildServerTask.ts +2 -0
  222. package/src/cli/core/tasks/BuildVercelTask.ts +165 -168
  223. package/src/cli/core/templates/alephaConfigTs.ts +1 -1
  224. package/src/cli/core/templates/apiAppSecurityTs.ts +5 -8
  225. package/src/cli/core/templates/tsconfigJson.ts +6 -1
  226. package/src/cli/platform/adapters/CloudflareAdapter.spec.ts +1 -1
  227. package/src/cli/platform/adapters/CloudflareAdapter.ts +30 -29
  228. package/src/cli/platform/atoms/platformOptions.ts +21 -0
  229. package/src/cli/platform/commands/SecretsCommand.spec.ts +298 -0
  230. package/src/cli/platform/commands/SecretsCommand.ts +283 -0
  231. package/src/cli/platform/commands/platform.ts +12 -0
  232. package/src/cli/platform/index.ts +14 -28
  233. package/src/cli/platform/providers/GitHubSecretStore.spec.ts +153 -0
  234. package/src/cli/platform/providers/GitHubSecretStore.ts +112 -0
  235. package/src/cli/platform/providers/MemorySecretStore.ts +114 -0
  236. package/src/cli/platform/providers/SecretStoreProvider.ts +39 -0
  237. package/src/cli/platform/schemas/cloudflare.ts +2 -0
  238. package/src/cli/platform/services/CloudflareApi.ts +5 -2
  239. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +115 -0
  240. package/src/cli/platform/services/DockerComposeGenerator.ts +46 -1
  241. package/src/cli/platform/services/SecretFilterService.spec.ts +111 -0
  242. package/src/cli/platform/services/SecretFilterService.ts +54 -0
  243. package/src/core/Alepha.ts +94 -25
  244. package/src/core/__tests__/Alepha-parseEnv.spec.ts +20 -0
  245. package/src/core/primitives/$memoize.ts +38 -26
  246. package/src/core/providers/AlsProvider.ts +2 -0
  247. package/src/core/providers/EventManager.ts +4 -0
  248. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +1 -4
  249. package/src/core/providers/KeylessJsonSchemaCodec.ts +19 -125
  250. package/src/core/providers/SchemaValidator.spec.ts +36 -0
  251. package/src/core/providers/SchemaValidator.ts +9 -0
  252. package/src/crypto/index.ts +6 -1
  253. package/src/crypto/providers/SecretProvider.ts +36 -0
  254. package/src/devtools/providers/DevToolsProvider.ts +3 -12
  255. package/src/logger/index.ts +33 -6
  256. package/src/logger/providers/PrettyFormatterProvider.ts +5 -3
  257. package/src/orm/__tests__/orm-next-tests.ts +492 -0
  258. package/src/orm/__tests__/orm-next.spec.ts +140 -0
  259. package/src/orm/core/constants/PG_SYMBOLS.ts +17 -0
  260. package/src/orm/core/index.bun.ts +3 -6
  261. package/src/orm/core/index.shared-server.ts +2 -0
  262. package/src/orm/core/index.shared.ts +2 -0
  263. package/src/orm/core/index.ts +5 -7
  264. package/src/orm/core/interfaces/AggregateQuery.ts +103 -0
  265. package/src/orm/core/interfaces/PgQueryWhere.ts +7 -0
  266. package/src/orm/core/primitives/$entity.ts +8 -0
  267. package/src/orm/core/primitives/$repository.ts +6 -3
  268. package/src/orm/core/primitives/$view.ts +88 -0
  269. package/src/orm/core/providers/DbCacheProvider.ts +66 -0
  270. package/src/orm/core/providers/DrizzleKitProvider.ts +42 -0
  271. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -3
  272. package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +12 -0
  273. package/src/orm/core/providers/drivers/DatabaseProvider.ts +39 -0
  274. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +2 -3
  275. package/src/orm/core/schemas/databaseEnvSchema.ts +31 -0
  276. package/src/orm/core/schemas/insertSchema.ts +13 -3
  277. package/src/orm/core/schemas/updateSchema.ts +14 -3
  278. package/src/orm/core/services/ModelBuilder.ts +26 -14
  279. package/src/orm/core/services/QueryManager.ts +13 -0
  280. package/src/orm/core/services/Repository.ts +307 -5
  281. package/src/orm/core/services/SqliteModelBuilder.ts +38 -0
  282. package/src/orm/postgres/index.bun.ts +4 -7
  283. package/src/orm/postgres/index.ts +4 -7
  284. package/src/orm/postgres/providers/BunPostgresProvider.ts +12 -2
  285. package/src/orm/postgres/providers/NodePostgresProvider.ts +7 -0
  286. package/src/orm/postgres/providers/PglitePostgresProvider.ts +10 -17
  287. package/src/orm/postgres/providers/PostgresProvider.ts +7 -36
  288. package/src/orm/postgres/schemas/postgresEnvSchema.ts +32 -0
  289. package/src/orm/postgres/services/PostgresModelBuilder.ts +40 -0
  290. package/src/react/core/components/ErrorBoundary.tsx +5 -2
  291. package/src/react/form/hooks/useFieldValue.ts +34 -0
  292. package/src/react/form/hooks/useForm.browser.spec.tsx +94 -9
  293. package/src/react/form/hooks/useForm.ts +14 -2
  294. package/src/react/form/hooks/useFormState.ts +10 -10
  295. package/src/react/form/hooks/useFormValues.ts +29 -0
  296. package/src/react/form/index.ts +3 -1
  297. package/src/react/form/services/FormModel.ts +53 -122
  298. package/src/react/router/components/ErrorViewer.tsx +333 -34
  299. package/src/react/router/components/NestedView.tsx +10 -3
  300. package/src/react/router/primitives/$page.browser.spec.tsx +34 -0
  301. package/src/react/router/primitives/$page.spec.tsx +20 -0
  302. package/src/react/router/primitives/$page.ts +24 -0
  303. package/src/react/router/providers/ReactBrowserRouterProvider.ts +14 -2
  304. package/src/react/router/providers/ReactPageProvider.ts +156 -73
  305. package/src/react/router/providers/ReactServerProvider.ts +40 -2
  306. package/src/react/router/providers/ReactServerTemplateProvider.ts +13 -1
  307. package/src/security/providers/SecurityProvider.ts +5 -27
  308. package/src/server/auth/primitives/$auth.ts +52 -19
  309. package/src/server/auth/providers/ServerAuthProvider.ts +145 -139
  310. package/src/server/cookies/providers/ServerCookiesProvider.ts +12 -24
  311. package/src/server/core/index.ts +3 -1
  312. package/src/server/core/primitives/$sse.spec.ts +315 -0
  313. package/src/server/core/primitives/$sse.ts +715 -0
  314. package/src/server/links/index.browser.ts +1 -3
  315. package/src/server/links/index.ts +0 -3
  316. package/src/server/links/providers/LinkProvider.spec.ts +12 -21
  317. package/src/server/links/providers/LinkProvider.ts +20 -52
  318. package/src/server/links/providers/ServerLinksProvider.spec.ts +106 -0
  319. package/src/server/links/providers/ServerLinksProvider.ts +113 -73
  320. package/src/server/links/schemas/apiLinksResponseSchema.ts +4 -21
  321. package/src/server/links/services/BatchCollector.ts +5 -3
  322. package/src/system/index.browser.ts +1 -0
  323. package/src/system/index.ts +3 -0
  324. package/src/system/index.workerd.ts +39 -1
  325. package/src/system/providers/WorkerdFileSystemProvider.ts +365 -0
  326. package/assets/devtools-ui/asset.BfSBZ5Dd.css.br +0 -0
  327. package/assets/devtools-ui/chunk.2NYaoqWt.js +0 -1
  328. package/assets/devtools-ui/chunk.2NYaoqWt.js.br +0 -0
  329. package/assets/devtools-ui/chunk.B052Z_xQ.js +0 -1
  330. package/assets/devtools-ui/chunk.B052Z_xQ.js.br +0 -0
  331. package/assets/devtools-ui/chunk.B4kVY90C.js +0 -1
  332. package/assets/devtools-ui/chunk.B4kVY90C.js.br +0 -0
  333. package/assets/devtools-ui/chunk.B7QJXctB.js +0 -1
  334. package/assets/devtools-ui/chunk.B7QJXctB.js.br +0 -0
  335. package/assets/devtools-ui/chunk.B9pX3zit.js.br +0 -0
  336. package/assets/devtools-ui/chunk.BKF9JxIo.js +0 -1
  337. package/assets/devtools-ui/chunk.BKF9JxIo.js.br +0 -0
  338. package/assets/devtools-ui/chunk.BOHgdTP-.js +0 -1
  339. package/assets/devtools-ui/chunk.BOHgdTP-.js.br +0 -0
  340. package/assets/devtools-ui/chunk.BOVFxkYC.js +0 -1
  341. package/assets/devtools-ui/chunk.BOVFxkYC.js.br +0 -0
  342. package/assets/devtools-ui/chunk.BR842zj5.js +0 -1
  343. package/assets/devtools-ui/chunk.BR842zj5.js.br +0 -0
  344. package/assets/devtools-ui/chunk.BT2IiBkZ.js.br +0 -0
  345. package/assets/devtools-ui/chunk.C79YouPp.js.br +0 -0
  346. package/assets/devtools-ui/chunk.C8mlBrjW.js +0 -9
  347. package/assets/devtools-ui/chunk.C8mlBrjW.js.br +0 -0
  348. package/assets/devtools-ui/chunk.CK0ow3AZ.js +0 -1
  349. package/assets/devtools-ui/chunk.CK0ow3AZ.js.br +0 -0
  350. package/assets/devtools-ui/chunk.CZl6J9DF.js.br +0 -0
  351. package/assets/devtools-ui/chunk.CdNr0YzS.js +0 -1
  352. package/assets/devtools-ui/chunk.CdNr0YzS.js.br +0 -0
  353. package/assets/devtools-ui/chunk.Ce6_6iIF.js +0 -1
  354. package/assets/devtools-ui/chunk.Ce6_6iIF.js.br +0 -0
  355. package/assets/devtools-ui/chunk.CpyDMr6O.js +0 -1
  356. package/assets/devtools-ui/chunk.CpyDMr6O.js.br +0 -0
  357. package/assets/devtools-ui/chunk.CyPmvPnY.js +0 -1
  358. package/assets/devtools-ui/chunk.CyPmvPnY.js.br +0 -0
  359. package/assets/devtools-ui/chunk.DTI_geWu.js +0 -1
  360. package/assets/devtools-ui/chunk.DTI_geWu.js.br +0 -0
  361. package/assets/devtools-ui/chunk.DbEH1oOB.js.br +0 -0
  362. package/assets/devtools-ui/chunk.Ddeqj5gv.js +0 -1
  363. package/assets/devtools-ui/chunk.Ddeqj5gv.js.br +0 -0
  364. package/assets/devtools-ui/chunk.DpRnB4vJ.js +0 -1
  365. package/assets/devtools-ui/chunk.DpRnB4vJ.js.br +0 -0
  366. package/assets/devtools-ui/chunk.DxPGTlsg.js +0 -1
  367. package/assets/devtools-ui/chunk.DxPGTlsg.js.br +0 -0
  368. package/assets/devtools-ui/chunk.G7_MMBJS.js +0 -1
  369. package/assets/devtools-ui/chunk.G7_MMBJS.js.br +0 -0
  370. package/assets/devtools-ui/chunk.M6wyKO_3.js.br +0 -0
  371. package/assets/devtools-ui/chunk.OUxNGmQ6.js +0 -1
  372. package/assets/devtools-ui/chunk.OUxNGmQ6.js.br +0 -0
  373. package/assets/devtools-ui/chunk.T1kle-fF.js +0 -1
  374. package/assets/devtools-ui/chunk.T1kle-fF.js.br +0 -0
  375. package/assets/devtools-ui/chunk.WjpsbQAv.js +0 -1
  376. package/assets/devtools-ui/chunk.WjpsbQAv.js.br +0 -0
  377. package/assets/devtools-ui/chunk.c6YgVx86.js +0 -1
  378. package/assets/devtools-ui/chunk.c6YgVx86.js.br +0 -0
  379. package/assets/devtools-ui/chunk.dwU3E_MU.js +0 -1
  380. package/assets/devtools-ui/chunk.dwU3E_MU.js.br +0 -0
  381. package/assets/devtools-ui/chunk.lJL-lgnW.js.br +0 -0
  382. package/assets/devtools-ui/chunk.lPWRmvA-.js +0 -7
  383. package/assets/devtools-ui/chunk.lPWRmvA-.js.br +0 -0
  384. package/assets/devtools-ui/chunk.p3HJvugM.js +0 -1
  385. package/assets/devtools-ui/chunk.p3HJvugM.js.br +0 -0
  386. package/assets/devtools-ui/chunk.r_Xoa_CI.js +0 -1
  387. package/assets/devtools-ui/chunk.r_Xoa_CI.js.br +0 -0
  388. package/assets/devtools-ui/chunk.sRNuTYXb.js +0 -1
  389. package/assets/devtools-ui/chunk.sRNuTYXb.js.br +0 -0
  390. package/assets/devtools-ui/chunk.tUjcyX5C.js +0 -1
  391. package/assets/devtools-ui/chunk.tUjcyX5C.js.br +0 -0
  392. package/assets/devtools-ui/chunk.thjBxvCA.js +0 -1
  393. package/assets/devtools-ui/chunk.thjBxvCA.js.br +0 -0
  394. package/assets/devtools-ui/entry.GYhBVRpC.js +0 -78
  395. package/assets/devtools-ui/entry.GYhBVRpC.js.br +0 -0
  396. package/src/server/links/services/DefinitionsPool.spec.ts +0 -86
  397. package/src/server/links/services/DefinitionsPool.ts +0 -43
@@ -1,5 +1,5 @@
1
1
  import { $atom, $inject, $module, $use, Alepha, AlephaError, t } from "alepha";
2
- import { AlephaCli, AlephaCliUtils, AppEntryProvider, PackageManagerUtils, ViteBuildProvider, registerConfigProcessor } from "alepha/cli";
2
+ import { AlephaCli, AlephaCliUtils, AppEntryProvider, PackageManagerUtils, ViteBuildProvider } from "alepha/cli";
3
3
  import { $command, Asker, EnvUtils, Runner } from "alepha/command";
4
4
  import { $logger, ConsoleColorProvider } from "alepha/logger";
5
5
  import { FileSystemProvider, ShellProvider } from "alepha/system";
@@ -112,7 +112,11 @@ const cloudflareSecretSchema = t.object({
112
112
  name: t.string(),
113
113
  type: t.string()
114
114
  });
115
- const createD1BodySchema = t.object({ name: t.string() });
115
+ const createD1BodySchema = t.object({
116
+ name: t.string(),
117
+ primary_location_hint: t.optional(t.string()),
118
+ jurisdiction: t.optional(t.string())
119
+ });
116
120
  const createKVBodySchema = t.object({ title: t.string() });
117
121
  const createR2BodySchema = t.object({ name: t.string() });
118
122
  const createQueueBodySchema = t.object({ queue_name: t.string() });
@@ -270,11 +274,14 @@ var CloudflareApi = class CloudflareApi {
270
274
  const accountId = await this.resolveAccountId();
271
275
  return await this.fetch(`/accounts/${accountId}/d1/database`, { schema: t.array(cloudflareD1Schema) });
272
276
  }
273
- async createD1(name) {
277
+ async createD1(name, location = "weur") {
274
278
  const accountId = await this.resolveAccountId();
275
279
  return await this.fetch(`/accounts/${accountId}/d1/database`, {
276
280
  method: "POST",
277
- body: { name },
281
+ body: {
282
+ name,
283
+ primary_location_hint: location
284
+ },
278
285
  bodySchema: createD1BodySchema,
279
286
  schema: cloudflareD1Schema
280
287
  });
@@ -899,21 +906,6 @@ var CloudflareAdapter = class CloudflareAdapter extends PlatformAdapter {
899
906
  }
900
907
  });
901
908
  }
902
- if (ctx.apps.some((a) => a.resources.hasBucket)) {
903
- const name = ctx.naming.r2();
904
- await run({
905
- name: `delete r2 ${name}`,
906
- handler: async () => {
907
- try {
908
- await this.api.deleteR2(name);
909
- } catch (error) {
910
- const msg = String(error.message || "");
911
- if (msg.includes("does not exist") || msg.includes("NoSuchBucket")) {} else if (msg.includes("not empty") || msg.includes("BucketNotEmpty")) this.log.warn(`Bucket ${name} is not empty -- skipped. Empty it manually.`);
912
- else this.log.warn(`Failed to delete r2 ${name}: ${msg}`);
913
- }
914
- }
915
- });
916
- }
917
909
  if (ctx.apps.some((a) => a.resources.hasDatabase)) if (await this.isPostgres(ctx)) {
918
910
  const name = ctx.naming.hyperdrive();
919
911
  await run({
@@ -1045,6 +1037,7 @@ var DockerComposeGenerator = class {
1045
1037
  const volumes = [];
1046
1038
  const needsPostgres = this.anyAppHas(options.apps, "hasDatabase") && !options.envVars.DATABASE_URL;
1047
1039
  const needsRedis = (this.anyAppHas(options.apps, "hasKV") || this.anyAppHas(options.apps, "hasQueue")) && !options.envVars.REDIS_URL;
1040
+ const needsRustFS = this.anyAppHas(options.apps, "hasBucket") && !options.envVars.S3_ENDPOINT;
1048
1041
  if (needsPostgres) {
1049
1042
  const dbName = `${options.project}_${options.env}`.replace(/-/g, "_");
1050
1043
  services.push([
@@ -1065,6 +1058,19 @@ var DockerComposeGenerator = class {
1065
1058
  " image: redis:7-alpine",
1066
1059
  " ports: [\"6379:6379\"]"
1067
1060
  ].join("\n"));
1061
+ if (needsRustFS) {
1062
+ services.push([
1063
+ " rustfs:",
1064
+ " image: rustfs/rustfs:latest",
1065
+ " ports: [\"9000:9000\"]",
1066
+ " environment:",
1067
+ " RUSTFS_ROOT_USER: alepha",
1068
+ " RUSTFS_ROOT_PASSWORD: alepha",
1069
+ " volumes:",
1070
+ " - rustfs_data:/data"
1071
+ ].join("\n"));
1072
+ volumes.push(" rustfs_data:");
1073
+ }
1068
1074
  if (services.length === 0) return null;
1069
1075
  const parts = [
1070
1076
  "# Auto-generated by Alepha. Do not edit.",
@@ -1110,6 +1116,7 @@ var DockerComposeGenerator = class {
1110
1116
  const deps = [];
1111
1117
  if (app.resources.hasDatabase && !options.envVars.DATABASE_URL) deps.push(" - postgres");
1112
1118
  if ((app.resources.hasKV || app.resources.hasQueue) && !options.envVars.REDIS_URL) deps.push(" - redis");
1119
+ if (app.resources.hasBucket && !options.envVars.S3_ENDPOINT) deps.push(" - rustfs");
1113
1120
  if (deps.length > 0) appLines.push(" depends_on:", ...deps);
1114
1121
  services.push(appLines.join("\n"));
1115
1122
  }
@@ -1135,6 +1142,21 @@ var DockerComposeGenerator = class {
1135
1142
  redisLines.push(" restart: unless-stopped");
1136
1143
  services.push(redisLines.join("\n"));
1137
1144
  }
1145
+ if (this.anyAppHas(options.apps, "hasBucket") && !options.envVars.S3_ENDPOINT) {
1146
+ const rustfsLines = [
1147
+ " rustfs:",
1148
+ " image: rustfs/rustfs:latest",
1149
+ " environment:",
1150
+ " RUSTFS_ROOT_USER: alepha",
1151
+ " RUSTFS_ROOT_PASSWORD: ${S3_SECRET_KEY}",
1152
+ " volumes:",
1153
+ " - rustfs_data:/data"
1154
+ ];
1155
+ if (hasDomain) rustfsLines.push(" networks:", " - internal");
1156
+ rustfsLines.push(" restart: unless-stopped");
1157
+ services.push(rustfsLines.join("\n"));
1158
+ volumes.push(" rustfs_data:");
1159
+ }
1138
1160
  const parts = [
1139
1161
  "# Auto-generated by Alepha. Do not edit.",
1140
1162
  "services:",
@@ -1164,7 +1186,7 @@ var DockerComposeGenerator = class {
1164
1186
  return apps.some((app) => app.resources[resource]);
1165
1187
  }
1166
1188
  anyAppNeedsInternal(apps, envVars) {
1167
- return this.anyAppHas(apps, "hasDatabase") && !envVars.DATABASE_URL || (this.anyAppHas(apps, "hasKV") || this.anyAppHas(apps, "hasQueue")) && !envVars.REDIS_URL;
1189
+ 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;
1168
1190
  }
1169
1191
  };
1170
1192
 
@@ -1879,6 +1901,10 @@ const platformOptions = $atom({
1879
1901
  name: t.optional(t.text()),
1880
1902
  apps: t.optional(t.array(t.text())),
1881
1903
  default: t.optional(t.text()),
1904
+ secrets: t.optional(t.object({
1905
+ store: t.enum(["github"]),
1906
+ environmentPattern: t.optional(t.text())
1907
+ })),
1882
1908
  environments: t.record(t.text(), t.object({
1883
1909
  adapter: t.enum([
1884
1910
  "cloudflare",
@@ -2149,6 +2175,296 @@ var PlatformOrchestrator = class {
2149
2175
  }
2150
2176
  };
2151
2177
 
2178
+ //#endregion
2179
+ //#region ../../src/cli/platform/providers/GitHubSecretStore.ts
2180
+ /**
2181
+ * GitHub Actions secret store backed by the `gh` CLI.
2182
+ *
2183
+ * Requires the GitHub CLI (`gh`) to be installed and authenticated.
2184
+ * Pushes secrets into GitHub Actions environments.
2185
+ */
2186
+ var GitHubSecretStore = class {
2187
+ log = $logger();
2188
+ shell = $inject(ShellProvider);
2189
+ fs = $inject(FileSystemProvider);
2190
+ /**
2191
+ * Verify that `gh` is installed and authenticated.
2192
+ */
2193
+ async ensureAvailable() {
2194
+ if (!await this.shell.isInstalled("gh")) throw new AlephaError("GitHub CLI (gh) is not installed. Install it from https://cli.github.com");
2195
+ try {
2196
+ await this.shell.run("gh auth status", { capture: true });
2197
+ } catch {
2198
+ throw new AlephaError("GitHub CLI is not authenticated. Run `gh auth login` first.");
2199
+ }
2200
+ }
2201
+ /**
2202
+ * Create the GitHub Actions environment if it doesn't exist.
2203
+ */
2204
+ async ensureEnvironment(environment) {
2205
+ await this.shell.run(`gh api --method PUT /repos/{owner}/{repo}/environments/${environment} --silent`, { capture: true });
2206
+ this.log.debug(`Ensured environment "${environment}" exists`);
2207
+ }
2208
+ /**
2209
+ * List all secrets in a GitHub Actions environment.
2210
+ */
2211
+ async list(environment) {
2212
+ try {
2213
+ const output = await this.shell.run(`gh secret list --env ${environment} --json name,updatedAt`, { capture: true });
2214
+ return JSON.parse(output || "[]").map((s) => ({
2215
+ name: s.name,
2216
+ updatedAt: s.updatedAt
2217
+ }));
2218
+ } catch (error) {
2219
+ this.log.debug("Failed to list secrets", {
2220
+ environment,
2221
+ error
2222
+ });
2223
+ return [];
2224
+ }
2225
+ }
2226
+ /**
2227
+ * Set a secret in a GitHub Actions environment.
2228
+ *
2229
+ * Writes a dotenv-formatted file and uses `gh secret set --env-file` to
2230
+ * avoid shell pipe issues with NodeShellProvider escaping the `|` character.
2231
+ */
2232
+ async set(environment, key, value) {
2233
+ const tmpFile = `/tmp/alepha-secret-${key}-${Date.now()}`;
2234
+ const escaped = value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, "\\n");
2235
+ await this.fs.writeFile(tmpFile, `${key}="${escaped}"\n`);
2236
+ try {
2237
+ const output = await this.shell.run(`gh secret set -f ${tmpFile} --env ${environment}`, { capture: true });
2238
+ this.log.debug(`Secret set: ${key}`, { output });
2239
+ } finally {
2240
+ await this.fs.rm(tmpFile);
2241
+ }
2242
+ }
2243
+ /**
2244
+ * Delete a secret from a GitHub Actions environment.
2245
+ */
2246
+ async delete(environment, key) {
2247
+ await this.shell.run(`gh secret delete ${key} --env ${environment}`, { capture: true });
2248
+ }
2249
+ };
2250
+
2251
+ //#endregion
2252
+ //#region ../../src/cli/platform/services/SecretFilterService.ts
2253
+ /**
2254
+ * Filters environment variables for secret store syncing.
2255
+ *
2256
+ * Excludes platform-managed vars (NODE_ENV), build-time vars (VITE_*),
2257
+ * and empty values. Keeps everything else — including DATABASE_URL
2258
+ * and POSTGRES_SCHEMA which GitHub Actions needs.
2259
+ *
2260
+ * Also handles renaming GITHUB_* keys since GitHub Actions rejects
2261
+ * secret names starting with GITHUB_.
2262
+ */
2263
+ var SecretFilterService = class SecretFilterService {
2264
+ static EXCLUDED_KEYS = new Set(["NODE_ENV"]);
2265
+ static GITHUB_PREFIX = "GITHUB_";
2266
+ static REMOTE_PREFIX = "APP_GITHUB_";
2267
+ /**
2268
+ * Return only the entries that should be pushed to a secret store.
2269
+ */
2270
+ filter(envVars) {
2271
+ const result = {};
2272
+ for (const [key, value] of Object.entries(envVars)) {
2273
+ if (!value) continue;
2274
+ if (SecretFilterService.EXCLUDED_KEYS.has(key)) continue;
2275
+ if (key.startsWith("VITE_")) continue;
2276
+ result[key] = value;
2277
+ }
2278
+ return result;
2279
+ }
2280
+ /**
2281
+ * Convert a local env key to a remote secret name.
2282
+ *
2283
+ * GITHUB_* keys are prefixed with APP_ since GitHub Actions rejects
2284
+ * secret names starting with GITHUB_.
2285
+ */
2286
+ toRemoteName(key) {
2287
+ if (key.startsWith(SecretFilterService.GITHUB_PREFIX)) return `${SecretFilterService.REMOTE_PREFIX}${key.slice(SecretFilterService.GITHUB_PREFIX.length)}`;
2288
+ return key;
2289
+ }
2290
+ /**
2291
+ * Convert a remote secret name back to the local env key.
2292
+ */
2293
+ toLocalName(remoteName) {
2294
+ if (remoteName.startsWith(SecretFilterService.REMOTE_PREFIX)) return `${SecretFilterService.GITHUB_PREFIX}${remoteName.slice(SecretFilterService.REMOTE_PREFIX.length)}`;
2295
+ return remoteName;
2296
+ }
2297
+ };
2298
+
2299
+ //#endregion
2300
+ //#region ../../src/cli/platform/commands/SecretsCommand.ts
2301
+ var SecretsCommand = class {
2302
+ log = $logger();
2303
+ options = $use(platformOptions);
2304
+ inspector = $inject(PlatformInspector);
2305
+ naming = $inject(NamingService);
2306
+ envUtils = $inject(EnvUtils);
2307
+ githubStore = $inject(GitHubSecretStore);
2308
+ filter = $inject(SecretFilterService);
2309
+ color = $inject(ConsoleColorProvider);
2310
+ envFlags = t.object({ env: t.optional(t.text({
2311
+ aliases: ["e"],
2312
+ description: "Target environment"
2313
+ })) });
2314
+ list = $command({
2315
+ name: "list",
2316
+ aliases: ["ls"],
2317
+ description: "List secrets in the remote store",
2318
+ flags: t.object({
2319
+ env: t.optional(t.text({
2320
+ aliases: ["e"],
2321
+ description: "Target environment"
2322
+ })),
2323
+ format: t.optional(t.text({
2324
+ aliases: ["f"],
2325
+ description: "Output format: table (default), gha"
2326
+ }))
2327
+ }),
2328
+ handler: async ({ flags, root, run }) => {
2329
+ const config = await this.inspector.resolveConfig(root);
2330
+ const env = flags.env ?? config.defaultEnv;
2331
+ const envName = this.resolveEnvironmentName(config.project, env);
2332
+ const format = flags.format ?? "table";
2333
+ const store = this.resolveStore();
2334
+ await store.ensureAvailable();
2335
+ const remoteSecrets = await store.list(envName);
2336
+ run.end();
2337
+ if (format === "gha") {
2338
+ process.stdout.write(`# Generated by alepha — environment: ${envName}\n`);
2339
+ process.stdout.write("env:\n");
2340
+ for (const secret of remoteSecrets) {
2341
+ const localName = this.filter.toLocalName(secret.name);
2342
+ process.stdout.write(` ${localName}: \${{ secrets.${secret.name} }}\n`);
2343
+ }
2344
+ return;
2345
+ }
2346
+ const c = this.color;
2347
+ if (remoteSecrets.length === 0) {
2348
+ process.stdout.write(`\nNo secrets in environment ${c.set("CYAN", envName)}.\n\n`);
2349
+ return;
2350
+ }
2351
+ process.stdout.write(`\n${c.set("GREY_LIGHT", "Environment:")} ${c.set("CYAN", envName)}\n\n`);
2352
+ const maxNameLen = Math.max(...remoteSecrets.map((s) => s.name.length), 4);
2353
+ process.stdout.write(` ${c.set("GREY_LIGHT", "NAME".padEnd(maxNameLen + 2))}${c.set("GREY_LIGHT", "UPDATED")}\n`);
2354
+ for (const secret of remoteSecrets) {
2355
+ const updated = secret.updatedAt ? new Date(secret.updatedAt).toLocaleString() : "-";
2356
+ process.stdout.write(` ${c.set("CYAN", secret.name.padEnd(maxNameLen + 2))}${c.set("GREY_DARK", updated)}\n`);
2357
+ }
2358
+ process.stdout.write("\n");
2359
+ }
2360
+ });
2361
+ diff = $command({
2362
+ name: "diff",
2363
+ description: "Compare local .env keys with remote store",
2364
+ flags: this.envFlags,
2365
+ handler: async ({ flags, root, run }) => {
2366
+ const config = await this.inspector.resolveConfig(root);
2367
+ const env = flags.env ?? config.defaultEnv;
2368
+ const envName = this.resolveEnvironmentName(config.project, env);
2369
+ const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);
2370
+ const filtered = this.filter.filter(envVars);
2371
+ const localKeys = new Set(Object.keys(filtered).map((k) => this.filter.toRemoteName(k)));
2372
+ const store = this.resolveStore();
2373
+ await store.ensureAvailable();
2374
+ const remoteSecrets = await store.list(envName);
2375
+ const remoteKeys = new Set(remoteSecrets.map((s) => s.name));
2376
+ run.end();
2377
+ const c = this.color;
2378
+ const allKeys = [...new Set([...localKeys, ...remoteKeys])].sort();
2379
+ process.stdout.write(`\n${c.set("GREY_LIGHT", "Environment:")} ${c.set("CYAN", envName)}\n\n`);
2380
+ let hasChanges = false;
2381
+ for (const key of allKeys) {
2382
+ const inLocal = localKeys.has(key);
2383
+ const inRemote = remoteKeys.has(key);
2384
+ if (inLocal && !inRemote) {
2385
+ process.stdout.write(` ${c.set("GREEN", "+")} ${key}\n`);
2386
+ hasChanges = true;
2387
+ } else if (!inLocal && inRemote) {
2388
+ process.stdout.write(` ${c.set("RED", "-")} ${key}\n`);
2389
+ hasChanges = true;
2390
+ } else process.stdout.write(` ${c.set("GREY_DARK", "=")} ${key}\n`);
2391
+ }
2392
+ if (!hasChanges) process.stdout.write(` ${c.set("GREEN", "Local and remote are in sync.")}\n`);
2393
+ process.stdout.write("\n");
2394
+ }
2395
+ });
2396
+ apply = $command({
2397
+ name: "apply",
2398
+ description: "Push local .env secrets to the remote store",
2399
+ flags: t.object({
2400
+ env: t.optional(t.text({
2401
+ aliases: ["e"],
2402
+ description: "Target environment"
2403
+ })),
2404
+ "dry-run": t.optional(t.boolean({ description: "Preview changes without pushing" }))
2405
+ }),
2406
+ handler: async ({ flags, root, run }) => {
2407
+ const config = await this.inspector.resolveConfig(root);
2408
+ const env = flags.env ?? config.defaultEnv;
2409
+ const envName = this.resolveEnvironmentName(config.project, env);
2410
+ const dryRun = flags["dry-run"] ?? false;
2411
+ const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);
2412
+ const filtered = this.filter.filter(envVars);
2413
+ const keys = Object.keys(filtered);
2414
+ if (keys.length === 0) {
2415
+ run.end();
2416
+ process.stdout.write("\nNo secrets to push.\n\n");
2417
+ return;
2418
+ }
2419
+ if (dryRun) {
2420
+ run.end();
2421
+ const c = this.color;
2422
+ process.stdout.write(`\n${c.set("GREY_LIGHT", "Dry run — environment:")} ${c.set("CYAN", envName)}\n\n`);
2423
+ for (const key of keys) process.stdout.write(` ${c.set("GREEN", "+")} ${key}\n`);
2424
+ process.stdout.write(`\n ${keys.length} secret(s) would be pushed.\n\n`);
2425
+ return;
2426
+ }
2427
+ const store = this.resolveStore();
2428
+ await store.ensureAvailable();
2429
+ await store.ensureEnvironment(envName);
2430
+ for (const key of keys) {
2431
+ const remoteName = this.filter.toRemoteName(key);
2432
+ await run({
2433
+ name: `push ${remoteName}`,
2434
+ handler: async () => {
2435
+ await store.set(envName, remoteName, filtered[key]);
2436
+ }
2437
+ });
2438
+ }
2439
+ run.end();
2440
+ process.stdout.write(`\n${keys.length} secret(s) pushed to ${envName}.\n`);
2441
+ }
2442
+ });
2443
+ secrets = $command({
2444
+ name: "secrets",
2445
+ aliases: ["sec"],
2446
+ description: "Manage secrets in external stores",
2447
+ children: [
2448
+ this.list,
2449
+ this.diff,
2450
+ this.apply
2451
+ ],
2452
+ handler: async ({ help }) => {
2453
+ help();
2454
+ }
2455
+ });
2456
+ resolveStore() {
2457
+ const storeName = this.options?.secrets?.store ?? "github";
2458
+ switch (storeName) {
2459
+ case "github": return this.githubStore;
2460
+ default: throw new AlephaError(`Unknown secret store "${storeName}". Available: github`);
2461
+ }
2462
+ }
2463
+ resolveEnvironmentName(project, env) {
2464
+ return (this.options?.secrets?.environmentPattern ?? "{project}-{env}").replace("{project}", this.naming.slugify(project)).replace("{env}", this.naming.slugify(env));
2465
+ }
2466
+ };
2467
+
2152
2468
  //#endregion
2153
2469
  //#region ../../src/cli/platform/commands/platform.ts
2154
2470
  var PlatformCommand = class {
@@ -2161,6 +2477,7 @@ var PlatformCommand = class {
2161
2477
  viteBuild = $inject(ViteBuildProvider);
2162
2478
  color = $inject(ConsoleColorProvider);
2163
2479
  envUtils = $inject(EnvUtils);
2480
+ secretsCommand = $inject(SecretsCommand);
2164
2481
  /**
2165
2482
  * Common flags for env/app targeting.
2166
2483
  */
@@ -2226,6 +2543,16 @@ var PlatformCommand = class {
2226
2543
  });
2227
2544
  }
2228
2545
  }
2546
+ if (adapterName === "docker" || adapterName === "docker-compose") {
2547
+ if (hasDB && !envVars.DATABASE_URL) resources.push({
2548
+ label: "Postgres",
2549
+ value: "postgres:17-alpine"
2550
+ });
2551
+ if (hasBucket && !envVars.S3_ENDPOINT) resources.push({
2552
+ label: "RustFS",
2553
+ value: "rustfs/rustfs:latest"
2554
+ });
2555
+ }
2229
2556
  const excludedKeys = adapterName === "vercel" ? VercelAdapter.EXCLUDED_SECRET_KEYS : CloudflareAdapter.EXCLUDED_SECRET_KEYS;
2230
2557
  const secretCount = Object.entries(envVars).filter(([key, value]) => value && !excludedKeys.has(key) && !key.startsWith("VITE_")).length;
2231
2558
  if (flags.json) {
@@ -2507,7 +2834,8 @@ var PlatformCommand = class {
2507
2834
  this.status,
2508
2835
  this.build,
2509
2836
  this.deploy,
2510
- this.migrate
2837
+ this.migrate,
2838
+ this.secretsCommand.secrets
2511
2839
  ],
2512
2840
  handler: async ({ help, root }) => {
2513
2841
  await this.inspector.resolveConfig(root);
@@ -2590,6 +2918,107 @@ var PlatformCommand = class {
2590
2918
  }
2591
2919
  };
2592
2920
 
2921
+ //#endregion
2922
+ //#region ../../src/cli/platform/providers/MemorySecretStore.ts
2923
+ /**
2924
+ * In-memory implementation of SecretStoreProvider for testing.
2925
+ * Records all operations and stores secrets in a nested Map.
2926
+ */
2927
+ var MemorySecretStore = class {
2928
+ /**
2929
+ * Secrets keyed by environment, then by key.
2930
+ */
2931
+ secrets = /* @__PURE__ */ new Map();
2932
+ /**
2933
+ * All recorded operations.
2934
+ */
2935
+ calls = [];
2936
+ /**
2937
+ * When set, ensureAvailable() will throw with this message.
2938
+ */
2939
+ availableError = null;
2940
+ async ensureAvailable() {
2941
+ this.calls.push({ method: "ensureAvailable" });
2942
+ if (this.availableError) throw new Error(this.availableError);
2943
+ }
2944
+ async ensureEnvironment(environment) {
2945
+ this.calls.push({
2946
+ method: "ensureEnvironment",
2947
+ environment
2948
+ });
2949
+ if (!this.secrets.has(environment)) this.secrets.set(environment, /* @__PURE__ */ new Map());
2950
+ }
2951
+ async list(environment) {
2952
+ this.calls.push({
2953
+ method: "list",
2954
+ environment
2955
+ });
2956
+ const envSecrets = this.secrets.get(environment);
2957
+ if (!envSecrets) return [];
2958
+ return Array.from(envSecrets.keys()).map((name) => ({ name }));
2959
+ }
2960
+ async set(environment, key, value) {
2961
+ this.calls.push({
2962
+ method: "set",
2963
+ environment,
2964
+ key,
2965
+ value
2966
+ });
2967
+ let envSecrets = this.secrets.get(environment);
2968
+ if (!envSecrets) {
2969
+ envSecrets = /* @__PURE__ */ new Map();
2970
+ this.secrets.set(environment, envSecrets);
2971
+ }
2972
+ envSecrets.set(key, value);
2973
+ }
2974
+ async delete(environment, key) {
2975
+ this.calls.push({
2976
+ method: "delete",
2977
+ environment,
2978
+ key
2979
+ });
2980
+ this.secrets.get(environment)?.delete(key);
2981
+ }
2982
+ /**
2983
+ * Check if set() was called for a given environment and key.
2984
+ */
2985
+ wasSet(environment, key) {
2986
+ return this.calls.some((c) => c.method === "set" && c.environment === environment && c.key === key);
2987
+ }
2988
+ /**
2989
+ * Check if delete() was called for a given environment and key.
2990
+ */
2991
+ wasDeleted(environment, key) {
2992
+ return this.calls.some((c) => c.method === "delete" && c.environment === environment && c.key === key);
2993
+ }
2994
+ /**
2995
+ * Get all set() calls for a given environment.
2996
+ */
2997
+ getSetCalls(environment) {
2998
+ return this.calls.filter((c) => c.method === "set" && c.environment === environment).map((c) => ({
2999
+ key: c.key,
3000
+ value: c.value
3001
+ }));
3002
+ }
3003
+ /**
3004
+ * Reset all state.
3005
+ */
3006
+ reset() {
3007
+ this.secrets.clear();
3008
+ this.calls = [];
3009
+ this.availableError = null;
3010
+ }
3011
+ };
3012
+
3013
+ //#endregion
3014
+ //#region ../../src/cli/platform/providers/SecretStoreProvider.ts
3015
+ /**
3016
+ * Abstract provider for managing secrets in an external store.
3017
+ *
3018
+ * Implementations: GitHubSecretStore, MemorySecretStore
3019
+ */
3020
+ var SecretStoreProvider = class {};
3021
+
2593
3022
  //#endregion
2594
3023
  //#region ../../src/cli/platform/schemas/platform.ts
2595
3024
  const platformStatusWorkerSchema = t.object({
@@ -2654,14 +3083,12 @@ const platformPlanSchema = t.object({
2654
3083
 
2655
3084
  //#endregion
2656
3085
  //#region ../../src/cli/platform/index.ts
2657
- registerConfigProcessor((alepha, config) => {
2658
- if (config.platform) alepha.set(platformOptions, config.platform);
2659
- });
2660
3086
  const AlephaCliPlatform = $module({
2661
3087
  name: "alepha.cli.platform",
2662
3088
  services: [
2663
3089
  AlephaCli,
2664
3090
  PlatformCommand,
3091
+ SecretsCommand,
2665
3092
  CloudflareAdapter,
2666
3093
  CloudflareApi,
2667
3094
  DockerAdapter,
@@ -2672,12 +3099,15 @@ const AlephaCliPlatform = $module({
2672
3099
  VercelCli,
2673
3100
  WranglerApi,
2674
3101
  PlatformCacheProvider,
3102
+ GitHubSecretStore,
3103
+ MemorySecretStore,
2675
3104
  NamingService,
3105
+ SecretFilterService,
2676
3106
  PlatformInspector,
2677
3107
  PlatformOrchestrator
2678
3108
  ]
2679
3109
  });
2680
3110
 
2681
3111
  //#endregion
2682
- export { AlephaCliPlatform, CloudflareAdapter, CloudflareApi, DockerAdapter, DockerComposeGenerator, DockerSshService, NamingContext, NamingService, PlatformAdapter, PlatformCacheProvider, PlatformCommand, PlatformInspector, PlatformOrchestrator, 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 };
3112
+ 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 };
2683
3113
  //# sourceMappingURL=index.js.map