@geekmidas/cli 10.0.0-alpha.117 → 10.0.0-alpha.119

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 (188) hide show
  1. package/README.md +7 -2
  2. package/dist/{EndpointGenerator-BwbYTMtB.cjs → EndpointGenerator-BDa6pPgE.cjs} +2 -2
  3. package/dist/{EndpointGenerator-BwbYTMtB.cjs.map → EndpointGenerator-BDa6pPgE.cjs.map} +1 -1
  4. package/dist/{EndpointGenerator-CvLX8bpx.mjs → EndpointGenerator-CP_z_E3e.mjs} +2 -2
  5. package/dist/{EndpointGenerator-CvLX8bpx.mjs.map → EndpointGenerator-CP_z_E3e.mjs.map} +1 -1
  6. package/dist/{GoDaddyProvider-I3WR0Irc.mjs → GoDaddyProvider-B4JKSuX-.mjs} +2 -2
  7. package/dist/{GoDaddyProvider-I3WR0Irc.mjs.map → GoDaddyProvider-B4JKSuX-.mjs.map} +1 -1
  8. package/dist/{GoDaddyProvider-DY4QFpCg.cjs → GoDaddyProvider-DMLcXGTd.cjs} +2 -2
  9. package/dist/{GoDaddyProvider-DY4QFpCg.cjs.map → GoDaddyProvider-DMLcXGTd.cjs.map} +1 -1
  10. package/dist/{LegacyStateStore-E2rUw9Vu.cjs → LegacyStateStore-88Etk3M3.cjs} +3 -3
  11. package/dist/{LegacyStateStore-E2rUw9Vu.cjs.map → LegacyStateStore-88Etk3M3.cjs.map} +1 -1
  12. package/dist/{LegacyStateStore-RG7min0B.mjs → LegacyStateStore-ByNEjBbh.mjs} +3 -3
  13. package/dist/{LegacyStateStore-RG7min0B.mjs.map → LegacyStateStore-ByNEjBbh.mjs.map} +1 -1
  14. package/dist/{LocalStateStore-kI2cUMCn.mjs → LocalStateStore-BoHhG3tu.mjs} +2 -2
  15. package/dist/{LocalStateStore-kI2cUMCn.mjs.map → LocalStateStore-BoHhG3tu.mjs.map} +1 -1
  16. package/dist/{LocalStateStore-CjzhVPcn.cjs → LocalStateStore-D1I3DJu2.cjs} +2 -2
  17. package/dist/{LocalStateStore-CjzhVPcn.cjs.map → LocalStateStore-D1I3DJu2.cjs.map} +1 -1
  18. package/dist/{OpenApiTsGenerator-DXXFXSbO.mjs → OpenApiTsGenerator-CsrukCE-.mjs} +2 -2
  19. package/dist/{OpenApiTsGenerator-DXXFXSbO.mjs.map → OpenApiTsGenerator-CsrukCE-.mjs.map} +1 -1
  20. package/dist/{OpenApiTsGenerator-BD6ZOQ51.cjs → OpenApiTsGenerator-FNhY7Ssz.cjs} +2 -2
  21. package/dist/{OpenApiTsGenerator-BD6ZOQ51.cjs.map → OpenApiTsGenerator-FNhY7Ssz.cjs.map} +1 -1
  22. package/dist/{S3StateStore-DZ8TCie0.mjs → S3StateStore-BE1Fl_cm.mjs} +2 -2
  23. package/dist/{S3StateStore-DZ8TCie0.mjs.map → S3StateStore-BE1Fl_cm.mjs.map} +1 -1
  24. package/dist/{S3StateStore-C-IrziGt.cjs → S3StateStore-DTLmfO3U.cjs} +2 -2
  25. package/dist/{S3StateStore-C-IrziGt.cjs.map → S3StateStore-DTLmfO3U.cjs.map} +1 -1
  26. package/dist/{SSMStateStore-WRcHtpTy.cjs → SSMStateStore-BaKk8zeI.cjs} +2 -2
  27. package/dist/{SSMStateStore-WRcHtpTy.cjs.map → SSMStateStore-BaKk8zeI.cjs.map} +1 -1
  28. package/dist/{SSMStateStore-BqCLuXrh.mjs → SSMStateStore-kEogq4Wx.mjs} +2 -2
  29. package/dist/{SSMStateStore-BqCLuXrh.mjs.map → SSMStateStore-kEogq4Wx.mjs.map} +1 -1
  30. package/dist/{SubscriberGenerator-CeH7wbYt.cjs → SubscriberGenerator-C8CPxrCK.cjs} +25 -4
  31. package/dist/SubscriberGenerator-C8CPxrCK.cjs.map +1 -0
  32. package/dist/{SubscriberGenerator-DHnIYwUU.mjs → SubscriberGenerator-y3pncae_.mjs} +20 -5
  33. package/dist/SubscriberGenerator-y3pncae_.mjs.map +1 -0
  34. package/dist/{add-CZYOIVw8.mjs → add-BZr_o-Xm.mjs} +5 -5
  35. package/dist/{add-CZYOIVw8.mjs.map → add-BZr_o-Xm.mjs.map} +1 -1
  36. package/dist/{add-D31_V4oL.cjs → add-C8mRgq2x.cjs} +5 -5
  37. package/dist/{add-D31_V4oL.cjs.map → add-C8mRgq2x.cjs.map} +1 -1
  38. package/dist/{bundler-BY_-iPge.cjs → bundler-7-pO7L0X.cjs} +5 -5
  39. package/dist/{bundler-BY_-iPge.cjs.map → bundler-7-pO7L0X.cjs.map} +1 -1
  40. package/dist/{bundler-BADrhw79.mjs → bundler-USaMrVEO.mjs} +5 -5
  41. package/dist/{bundler-BADrhw79.mjs.map → bundler-USaMrVEO.mjs.map} +1 -1
  42. package/dist/{cli-CfB5RjJS.cjs → cli-Bdf7CdQB.cjs} +3 -3
  43. package/dist/{cli-CfB5RjJS.cjs.map → cli-Bdf7CdQB.cjs.map} +1 -1
  44. package/dist/{cli-BI2wjJaB.mjs → cli-DWRYbsA2.mjs} +3 -3
  45. package/dist/{cli-BI2wjJaB.mjs.map → cli-DWRYbsA2.mjs.map} +1 -1
  46. package/dist/{compose-C9VN0iMJ.mjs → compose-DAPoyiny.mjs} +101 -19
  47. package/dist/compose-DAPoyiny.mjs.map +1 -0
  48. package/dist/{compose-BEMY3EwM.cjs → compose-tZLAZZp6.cjs} +101 -19
  49. package/dist/compose-tZLAZZp6.cjs.map +1 -0
  50. package/dist/config.cjs +1 -1
  51. package/dist/config.mjs +1 -1
  52. package/dist/{credentialSchemas-D_VUCDUh.cjs → credentialSchemas-B67WJOOm.cjs} +2 -2
  53. package/dist/{credentialSchemas-D_VUCDUh.cjs.map → credentialSchemas-B67WJOOm.cjs.map} +1 -1
  54. package/dist/{credentialSchemas-Cf5Pf8VE.mjs → credentialSchemas-DDOLRCLF.mjs} +2 -2
  55. package/dist/{credentialSchemas-Cf5Pf8VE.mjs.map → credentialSchemas-DDOLRCLF.mjs.map} +1 -1
  56. package/dist/deploy/public.cjs +7 -7
  57. package/dist/deploy/public.d.cts +2 -1
  58. package/dist/deploy/public.d.cts.map +1 -1
  59. package/dist/deploy/public.d.mts +2 -1
  60. package/dist/deploy/public.d.mts.map +1 -1
  61. package/dist/deploy/public.mjs +7 -7
  62. package/dist/{deploy-BD70bgTu.mjs → deploy-CyQ36GSx.mjs} +20 -9
  63. package/dist/deploy-CyQ36GSx.mjs.map +1 -0
  64. package/dist/{deploy-Ch45lV7q.cjs → deploy-rwfdH_Uw.cjs} +20 -9
  65. package/dist/deploy-rwfdH_Uw.cjs.map +1 -0
  66. package/dist/{discover-Ca8U75dl.mjs → discover-C5roJuc9.mjs} +25 -2
  67. package/dist/discover-C5roJuc9.mjs.map +1 -0
  68. package/dist/{discover-CvTtV5ZD.d.cts → discover-CSW_BMWa.d.cts} +18 -1
  69. package/dist/discover-CSW_BMWa.d.cts.map +1 -0
  70. package/dist/{discover-Bsr7HjqJ.cjs → discover-DozUKs8f.cjs} +25 -2
  71. package/dist/discover-DozUKs8f.cjs.map +1 -0
  72. package/dist/{discover-W2kab9Lc.d.mts → discover-xtT7fgWg.d.mts} +18 -1
  73. package/dist/discover-xtT7fgWg.d.mts.map +1 -0
  74. package/dist/{dns-thzjBFvQ.mjs → dns-BHveRzd8.mjs} +2 -2
  75. package/dist/{dns-thzjBFvQ.mjs.map → dns-BHveRzd8.mjs.map} +1 -1
  76. package/dist/{dns-0tfef9SR.cjs → dns-CJ3izGTo.cjs} +2 -2
  77. package/dist/{dns-0tfef9SR.cjs.map → dns-CJ3izGTo.cjs.map} +1 -1
  78. package/dist/{dokploy-QvxY0Ywi.mjs → dokploy-BaaNWN-B.mjs} +2 -2
  79. package/dist/{dokploy-QvxY0Ywi.mjs.map → dokploy-BaaNWN-B.mjs.map} +1 -1
  80. package/dist/{dokploy-B3wEC6-2.cjs → dokploy-BmlMt2Rb.cjs} +2 -2
  81. package/dist/{dokploy-B3wEC6-2.cjs.map → dokploy-BmlMt2Rb.cjs.map} +1 -1
  82. package/dist/{drivers-3klmg9Sk.mjs → drivers-BjGDYfnC.mjs} +2 -2
  83. package/dist/{drivers-3klmg9Sk.mjs.map → drivers-BjGDYfnC.mjs.map} +1 -1
  84. package/dist/{drivers-CoqD5zYP.cjs → drivers-DbjiYpW6.cjs} +2 -2
  85. package/dist/{drivers-CoqD5zYP.cjs.map → drivers-DbjiYpW6.cjs.map} +1 -1
  86. package/dist/{eas-C5UZCZER.mjs → eas-CKS1YxT3.mjs} +2 -2
  87. package/dist/{eas-C5UZCZER.mjs.map → eas-CKS1YxT3.mjs.map} +1 -1
  88. package/dist/{eas-C8lIhY8B.cjs → eas-ClEvznV9.cjs} +2 -2
  89. package/dist/{eas-C8lIhY8B.cjs.map → eas-ClEvznV9.cjs.map} +1 -1
  90. package/dist/{encryption-xgKJ_098.cjs → encryption-CpydNX0B.cjs} +2 -2
  91. package/dist/{encryption-xgKJ_098.cjs.map → encryption-CpydNX0B.cjs.map} +1 -1
  92. package/dist/{encryption-BhAA51gs.mjs → encryption-DxKJLlYn.mjs} +2 -2
  93. package/dist/{encryption-BhAA51gs.mjs.map → encryption-DxKJLlYn.mjs.map} +1 -1
  94. package/dist/{engine-BCC7wUqs.cjs → engine-C9qO5k6r.cjs} +12 -6
  95. package/dist/engine-C9qO5k6r.cjs.map +1 -0
  96. package/dist/{engine-CV0krWXP.mjs → engine-tmvpAPHz.mjs} +13 -7
  97. package/dist/engine-tmvpAPHz.mjs.map +1 -0
  98. package/dist/{github-CeeFKscD.cjs → github-BdVRMNzc.cjs} +8 -6
  99. package/dist/github-BdVRMNzc.cjs.map +1 -0
  100. package/dist/{github-BASpyAs7.mjs → github-vA9jAJjI.mjs} +8 -6
  101. package/dist/github-vA9jAJjI.mjs.map +1 -0
  102. package/dist/{googlePlay-C7sOjdR5.cjs → googlePlay-BafFoF13.cjs} +3 -3
  103. package/dist/{googlePlay-C7sOjdR5.cjs.map → googlePlay-BafFoF13.cjs.map} +1 -1
  104. package/dist/{googlePlay-CD2Y0j8c.mjs → googlePlay-Kr2etW2y.mjs} +3 -3
  105. package/dist/{googlePlay-CD2Y0j8c.mjs.map → googlePlay-Kr2etW2y.mjs.map} +1 -1
  106. package/dist/index.cjs +243 -141
  107. package/dist/index.cjs.map +1 -1
  108. package/dist/index.mjs +243 -141
  109. package/dist/index.mjs.map +1 -1
  110. package/dist/{migrate-BSnZFik_.mjs → migrate-4EdfUpjQ.mjs} +3 -3
  111. package/dist/{migrate-BSnZFik_.mjs.map → migrate-4EdfUpjQ.mjs.map} +1 -1
  112. package/dist/{migrate-D8HKeUGo.cjs → migrate-BMGpVvFg.cjs} +3 -3
  113. package/dist/{migrate-D8HKeUGo.cjs.map → migrate-BMGpVvFg.cjs.map} +1 -1
  114. package/dist/{migrate-Ba-pFRWc.mjs → migrate-C_IaJz8A.mjs} +2 -2
  115. package/dist/{migrate-Ba-pFRWc.mjs.map → migrate-C_IaJz8A.mjs.map} +1 -1
  116. package/dist/{migrate-Bmgy1mh4.cjs → migrate-DeIkRsXm.cjs} +2 -2
  117. package/dist/{migrate-Bmgy1mh4.cjs.map → migrate-DeIkRsXm.cjs.map} +1 -1
  118. package/dist/openapi.cjs +2 -2
  119. package/dist/openapi.mjs +2 -2
  120. package/dist/{publish-BOivOLLp.mjs → publish-AdbhYxX6.mjs} +2 -2
  121. package/dist/{publish-BOivOLLp.mjs.map → publish-AdbhYxX6.mjs.map} +1 -1
  122. package/dist/{publish-Cfe-drEb.cjs → publish-BWVQ9PZy.cjs} +2 -2
  123. package/dist/{publish-Cfe-drEb.cjs.map → publish-BWVQ9PZy.cjs.map} +1 -1
  124. package/dist/{ready-gc9IFByS.cjs → ready-BFFP838V.cjs} +6 -6
  125. package/dist/{ready-gc9IFByS.cjs.map → ready-BFFP838V.cjs.map} +1 -1
  126. package/dist/{ready-4hEoQ_cr.mjs → ready-BOfogqzr.mjs} +6 -6
  127. package/dist/{ready-4hEoQ_cr.mjs.map → ready-BOfogqzr.mjs.map} +1 -1
  128. package/dist/reconcile/public.cjs +1 -1
  129. package/dist/reconcile/public.d.cts +1 -1
  130. package/dist/reconcile/public.d.mts +1 -1
  131. package/dist/reconcile/public.mjs +1 -1
  132. package/dist/{resolve-CsJ1zX6m.mjs → resolve-CJwadE_F.mjs} +3 -3
  133. package/dist/{resolve-CsJ1zX6m.mjs.map → resolve-CJwadE_F.mjs.map} +1 -1
  134. package/dist/{resolve-BHR-Ewxo.cjs → resolve-Dtrp53jt.cjs} +3 -3
  135. package/dist/{resolve-BHR-Ewxo.cjs.map → resolve-Dtrp53jt.cjs.map} +1 -1
  136. package/dist/{rollback-j38F1Jn-.mjs → rollback-Cx89OK9S.mjs} +4 -4
  137. package/dist/{rollback-j38F1Jn-.mjs.map → rollback-Cx89OK9S.mjs.map} +1 -1
  138. package/dist/{rollback-B4yQkUSH.cjs → rollback-DAKtcSCy.cjs} +4 -4
  139. package/dist/{rollback-B4yQkUSH.cjs.map → rollback-DAKtcSCy.cjs.map} +1 -1
  140. package/dist/sandbox/credentials-worker.cjs +2 -2
  141. package/dist/sandbox/credentials-worker.mjs +2 -2
  142. package/dist/sandbox/discover-worker.cjs +6 -3
  143. package/dist/sandbox/discover-worker.cjs.map +1 -1
  144. package/dist/sandbox/discover-worker.mjs +6 -3
  145. package/dist/sandbox/discover-worker.mjs.map +1 -1
  146. package/dist/sandbox/migrate-worker.cjs +1 -1
  147. package/dist/sandbox/migrate-worker.mjs +1 -1
  148. package/dist/{seeds-h4Wf-_hA.mjs → seeds-BBnvSEgG.mjs} +164 -24
  149. package/dist/seeds-BBnvSEgG.mjs.map +1 -0
  150. package/dist/{seeds-DWaiMMi3.cjs → seeds-CPFoexOv.cjs} +180 -22
  151. package/dist/seeds-CPFoexOv.cjs.map +1 -0
  152. package/dist/{serverSetup-Dog5151C.cjs → serverSetup-BHoXbPit.cjs} +5 -5
  153. package/dist/{serverSetup-Dog5151C.cjs.map → serverSetup-BHoXbPit.cjs.map} +1 -1
  154. package/dist/{serverSetup-CKqCaDhI.mjs → serverSetup-BoD9Vp4B.mjs} +5 -5
  155. package/dist/{serverSetup-CKqCaDhI.mjs.map → serverSetup-BoD9Vp4B.mjs.map} +1 -1
  156. package/dist/{sniffer-Dilwm65v.mjs → sniffer-DDUAlVqp.mjs} +7 -7
  157. package/dist/{sniffer-Dilwm65v.mjs.map → sniffer-DDUAlVqp.mjs.map} +1 -1
  158. package/dist/{sniffer-B99iLT79.cjs → sniffer-DIVpELrO.cjs} +7 -7
  159. package/dist/{sniffer-B99iLT79.cjs.map → sniffer-DIVpELrO.cjs.map} +1 -1
  160. package/dist/{stage-dG5B6nC9.mjs → stage-D9R5j5Xa.mjs} +5 -5
  161. package/dist/{stage-dG5B6nC9.mjs.map → stage-D9R5j5Xa.mjs.map} +1 -1
  162. package/dist/{stage-D1Qmw-Pd.cjs → stage-ElqMbLNH.cjs} +5 -5
  163. package/dist/{stage-D1Qmw-Pd.cjs.map → stage-ElqMbLNH.cjs.map} +1 -1
  164. package/dist/target/public.cjs +1 -1
  165. package/dist/target/public.mjs +1 -1
  166. package/dist/{terminal-CybB-cjk.mjs → terminal-CW_dWeTe.mjs} +2 -2
  167. package/dist/{terminal-CybB-cjk.mjs.map → terminal-CW_dWeTe.mjs.map} +1 -1
  168. package/dist/{terminal-D_NRPW4W.cjs → terminal-DJlqcW_U.cjs} +2 -2
  169. package/dist/{terminal-D_NRPW4W.cjs.map → terminal-DJlqcW_U.cjs.map} +1 -1
  170. package/dist/vitest.cjs +1 -1
  171. package/dist/vitest.mjs +1 -1
  172. package/package.json +15 -15
  173. package/dist/SubscriberGenerator-CeH7wbYt.cjs.map +0 -1
  174. package/dist/SubscriberGenerator-DHnIYwUU.mjs.map +0 -1
  175. package/dist/compose-BEMY3EwM.cjs.map +0 -1
  176. package/dist/compose-C9VN0iMJ.mjs.map +0 -1
  177. package/dist/deploy-BD70bgTu.mjs.map +0 -1
  178. package/dist/deploy-Ch45lV7q.cjs.map +0 -1
  179. package/dist/discover-Bsr7HjqJ.cjs.map +0 -1
  180. package/dist/discover-Ca8U75dl.mjs.map +0 -1
  181. package/dist/discover-CvTtV5ZD.d.cts.map +0 -1
  182. package/dist/discover-W2kab9Lc.d.mts.map +0 -1
  183. package/dist/engine-BCC7wUqs.cjs.map +0 -1
  184. package/dist/engine-CV0krWXP.mjs.map +0 -1
  185. package/dist/github-BASpyAs7.mjs.map +0 -1
  186. package/dist/github-CeeFKscD.cjs.map +0 -1
  187. package/dist/seeds-DWaiMMi3.cjs.map +0 -1
  188. package/dist/seeds-h4Wf-_hA.mjs.map +0 -1
@@ -3,12 +3,12 @@ import { t as GkmError } from "./errors-D8Gwp5kU.mjs";
3
3
  import { i as run$1, s as gkmHome } from "./run-BJLIerMM.mjs";
4
4
  import { B as LOGS_PORT, H as provisioningOf, R as stageSampleRate, U as stageProvider, _ as PUBLIC_ENV_PREFIXES, a as allConstructGlobs, ct as UnknownSecretsStoreProvider, ft as SERVER_IPV4_KEY, ht as isReservedStageKey, j as TEST_STAGE, pt as SERVER_IPV6_KEY, ut as s3SecretsLocation, v as getPublicEnvPrefix, z as telemetryEnv } from "./workspace-D1QbNd55.mjs";
5
5
  import { t as appKey } from "./derive-B4vDpzgP.mjs";
6
- import { a as DEFAULT_CACHE, c as holdsEveryCache, i as readFakes, o as DEFAULT_EVENTS$1, r as readCredentialFakes, s as DEFAULT_STORAGE, t as SubscriberGenerator } from "./SubscriberGenerator-DHnIYwUU.mjs";
6
+ import { a as readFakes, c as DEFAULT_STORAGE, i as readCredentialFakes, l as holdsEveryCache, o as DEFAULT_CACHE, s as DEFAULT_EVENTS$1, t as SubscriberGenerator } from "./SubscriberGenerator-y3pncae_.mjs";
7
7
  import { n as deployIdentity } from "./identity-CBXr4wNi.mjs";
8
- import { a as startTelemetryCode, n as runtimeFor, s as writeTelemetryModule, u as telemetryArgs } from "./EndpointGenerator-CvLX8bpx.mjs";
9
- import { d as ConstructGenerator, f as output, i as discover } from "./discover-Ca8U75dl.mjs";
8
+ import { a as startTelemetryCode, n as runtimeFor, s as writeTelemetryModule, u as telemetryArgs } from "./EndpointGenerator-CP_z_E3e.mjs";
9
+ import { d as ConstructGenerator, f as output, i as discover } from "./discover-C5roJuc9.mjs";
10
10
  import { ConfigNotFound, NotInAnApp, loadWorkspaceAppInfo, loadWorkspaceConfig } from "./config.mjs";
11
- import { c as runtimeOf } from "./resolve-CsJ1zX6m.mjs";
11
+ import { c as runtimeOf } from "./resolve-CJwadE_F.mjs";
12
12
  import { basename, dirname, isAbsolute, join, parse, relative, resolve, sep } from "node:path";
13
13
  import { constants, existsSync, readFileSync } from "node:fs";
14
14
  import { appendFile, chmod, copyFile, mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
@@ -26,7 +26,7 @@ import { config } from "dotenv";
26
26
  import { promisify } from "node:util";
27
27
  import { Cron } from "@geekmidas/constructs/crons";
28
28
  import { Queue } from "@geekmidas/constructs/queue";
29
- import { CreateBucketCommand, GetBucketPolicyCommand, HeadBucketCommand, ListBucketsCommand, PutBucketPolicyCommand, S3Client } from "@aws-sdk/client-s3";
29
+ import { CreateBucketCommand, DeleteBucketLifecycleCommand, GetBucketLifecycleConfigurationCommand, GetBucketPolicyCommand, HeadBucketCommand, ListBucketsCommand, PutBucketLifecycleConfigurationCommand, PutBucketPolicyCommand, S3Client } from "@aws-sdk/client-s3";
30
30
  import { CreateTopicCommand, GetTopicAttributesCommand, SNSClient } from "@aws-sdk/client-sns";
31
31
  import { CreateQueueCommand, GetQueueUrlCommand, SQSClient } from "@aws-sdk/client-sqs";
32
32
  import { Client } from "pg";
@@ -327,8 +327,9 @@ function postgresImage(version) {
327
327
  * The default image for each container.
328
328
  *
329
329
  * Pinned to a major rather than `latest` where the image publishes one, so a
330
- * rebuild does not silently move a developer's Postgres a version. Overridable
331
- * per project: a project needing `postgis/postgis` says so in config.
330
+ * rebuild does not silently move a developer's Postgres a version. A database
331
+ * can name its own (`image: 'postgis/postgis:…'`); any other pin is the
332
+ * project's own `docker-compose.yml`.
332
333
  */
333
334
  const DEFAULT_IMAGES = {
334
335
  postgres: postgresImage(DEFAULT_POSTGRES_VERSION),
@@ -1024,6 +1025,7 @@ function planFor(manifest, stage, order, options = {}) {
1024
1025
  ...declaration.scheme ? { scheme: declaration.scheme } : {}
1025
1026
  } : {},
1026
1027
  ...declaration.kind === "file-server" && declaration.open?.length ? { open: declaration.open } : {},
1028
+ ...declaration.kind === "objects" && declaration.expire ? { expire: declaration.expire } : {},
1027
1029
  ...(declaration.kind === "rest-api" || declaration.kind === "site") && declaration.subdomain ? { subdomain: declaration.subdomain } : {},
1028
1030
  ...fake ? { fake: {
1029
1031
  key: fake.key,
@@ -1038,6 +1040,8 @@ function planFor(manifest, stage, order, options = {}) {
1038
1040
  ..."of" in declaration && !detached ? { of: declaration.of } : {},
1039
1041
  ..."schema" in declaration && declaration.schema ? { schema: declaration.schema } : {},
1040
1042
  ..."version" in declaration && declaration.version ? { version: declaration.version } : {},
1043
+ ..."image" in declaration && declaration.image ? { image: declaration.image } : {},
1044
+ ..."extensions" in declaration && declaration.extensions?.length ? { extensions: declaration.extensions } : {},
1041
1045
  ..."roles" in declaration && declaration.roles === false ? { roles: false } : {},
1042
1046
  ..."table" in declaration && declaration.table && !detached ? { table: declaration.table } : {}
1043
1047
  });
@@ -2224,24 +2228,74 @@ async function withLock(lock, body) {
2224
2228
  }
2225
2229
  }
2226
2230
  //#endregion
2227
- //#region src/reconcile/provision.ts
2231
+ //#region src/providers/s3/lifecycle.ts
2228
2232
  /**
2229
- * Creating what the URLs name.
2233
+ * A bucket's lifecycle, as the constructs declare it: one expiry rule per
2234
+ * prefix, merged into whatever else the bucket's lifecycle already holds.
2230
2235
  *
2231
- * Convergent and idempotent: every statement asks whether the thing exists
2232
- * first, so reconciling repeatedly is free and a half-applied run recovers by
2233
- * being run again. That property is what lets `gkm dev` do this on every start.
2236
+ * S3 — and MinIO, which speaks the same API — keeps one lifecycle document
2237
+ * per bucket, and a write replaces all of it. So gkm owns only the rules it
2238
+ * names (`gkm-…`): every other rule is read and put back as it was, a rule of
2239
+ * gkm's that is no longer declared is dropped, and nothing is written when
2240
+ * gkm's rules already say what the manifest does.
2234
2241
  *
2235
- * The line the design draws is at data, not at side effects — this creates
2236
- * databases, schemas, and buckets, and it never seeds, resets, or drops. A
2237
- * developer who wants their data gone asks for it explicitly.
2242
+ * Shared by the `s3` provider and the MinIO a local or compose stack runs,
2243
+ * so a prefix expires the same way on both.
2244
+ */
2245
+ /** The id every rule gkm writes starts with — and the only ones it touches. */
2246
+ const GKM_RULE_PREFIX = "gkm-";
2247
+ /**
2248
+ * The rule id for one prefix: readable, and unique however the prefix is
2249
+ * spelled — `a/b` and `a-b` read alike once sanitised, so a short hash of the
2250
+ * prefix itself follows.
2251
+ */
2252
+ function expireRuleId(prefix) {
2253
+ const readable = prefix.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 200);
2254
+ const hash = createHash("sha256").update(prefix).digest("hex").slice(0, 8);
2255
+ return `${GKM_RULE_PREFIX}expire-${readable ? `${readable}-` : ""}${hash}`;
2256
+ }
2257
+ /** The rules a bucket's expiry asks for, in a stable order. */
2258
+ function expireRules(expire) {
2259
+ return Object.entries(expire ?? {}).map(([prefix, days]) => ({
2260
+ ID: expireRuleId(prefix),
2261
+ Status: "Enabled",
2262
+ Filter: { Prefix: prefix },
2263
+ Expiration: { Days: days }
2264
+ })).sort((a, b) => a.ID.localeCompare(b.ID));
2265
+ }
2266
+ /**
2267
+ * Merge the declared expiry into the bucket's current rules.
2238
2268
  *
2239
- * Statement generation is separated from application for the reason the design
2240
- * gives: the same DDL has to run in-process locally and from a provisioner in a
2241
- * VPC, and one implementation is what stops "works locally, fails deployed".
2242
- * When the role DDL lands in `@geekmidas/db` this delegates to it rather than
2243
- * growing its own.
2269
+ * @param current the bucket's rules, or nothing when it has no lifecycle
2244
2270
  */
2271
+ function mergeLifecycle(current, expire) {
2272
+ const wanted = expireRules(expire);
2273
+ const rules = current ?? [];
2274
+ const others = rules.filter((r) => !r.ID?.startsWith(GKM_RULE_PREFIX));
2275
+ const ours = rules.filter((r) => r.ID?.startsWith(GKM_RULE_PREFIX));
2276
+ return {
2277
+ changed: canonical(ours) !== canonical(wanted) || new Set(ours.map((r) => r.ID)).size !== ours.length,
2278
+ rules: [...others, ...wanted],
2279
+ describe: describeExpiry(expire)
2280
+ };
2281
+ }
2282
+ /** `expire quotes/ after 30 days, tmp/ after 1 day` — or what removing says. */
2283
+ function describeExpiry(expire) {
2284
+ const entries = Object.entries(expire ?? {}).sort(([a], [b]) => a.localeCompare(b));
2285
+ if (entries.length === 0) return "remove expiry rules";
2286
+ return `expire ${entries.map(([prefix, days]) => `${prefix} after ${days} day${days === 1 ? "" : "s"}`).join(", ")}`;
2287
+ }
2288
+ /** gkm's rules as the fields it sets, order-free. */
2289
+ function canonical(rules) {
2290
+ return JSON.stringify(rules.map((r) => ({
2291
+ id: r.ID,
2292
+ status: r.Status,
2293
+ prefix: r.Filter?.Prefix ?? r.Prefix ?? "",
2294
+ days: r.Expiration?.Days ?? null
2295
+ })).sort((a, b) => (a.id ?? "").localeCompare(b.id ?? "")));
2296
+ }
2297
+ //#endregion
2298
+ //#region src/reconcile/provision.ts
2245
2299
  /**
2246
2300
  * The Postgres work a plan implies.
2247
2301
  *
@@ -2341,6 +2395,7 @@ function rolesFor(resource, schema, plan, project, seed) {
2341
2395
  ...reader ? { reader } : {},
2342
2396
  schema,
2343
2397
  ...resource.kind === "database" ? { database: rootDatabase(resource, plan) } : {},
2398
+ ...resource.extensions ? { extensions: resource.extensions } : {},
2344
2399
  passwords: {
2345
2400
  runtime: localRolePassword(project, plan, runtime, seed),
2346
2401
  owner: localRolePassword(project, plan, owner, seed),
@@ -2426,6 +2481,20 @@ function bucketPolicies(plan) {
2426
2481
  })).sort((a, b) => a.bucket.localeCompare(b.bucket));
2427
2482
  }
2428
2483
  /**
2484
+ * What each bucket keeps, and for how long: the buckets that declare an
2485
+ * expiry, by their stage-scoped name.
2486
+ *
2487
+ * Every bucket in the plan, not only those that declare one, is what a
2488
+ * removed expiry needs — its rules are dropped from a bucket that no longer
2489
+ * asks for them — so a bucket with none is listed with an empty expiry.
2490
+ */
2491
+ function bucketLifecycles(plan) {
2492
+ return plan.resources.filter((r) => r.kind === "objects" && r.provisions).map((r) => ({
2493
+ bucket: r.name,
2494
+ expire: r.expire ?? {}
2495
+ })).sort((a, b) => a.bucket.localeCompare(b.bucket));
2496
+ }
2497
+ /**
2429
2498
  * One bucket's open paths as an S3 bucket policy.
2430
2499
  *
2431
2500
  * Anonymous `s3:GetObject` on the named prefixes and nothing else — which is
@@ -2513,6 +2582,34 @@ async function databasesExist(client, names) {
2513
2582
  }
2514
2583
  }
2515
2584
  /**
2585
+ * Apply each bucket's expiry, beside whatever other rules it has, skipping
2586
+ * those already correct — the same merge the `s3` provider makes deployed.
2587
+ */
2588
+ async function applyLifecycles(client, lifecycles) {
2589
+ const applied = [];
2590
+ for (const { bucket, expire } of lifecycles) {
2591
+ const merge = mergeLifecycle(await client.lifecycle(bucket), expire);
2592
+ const id = `${bucket}:lifecycle`;
2593
+ const describe = `${merge.describe} on ${bucket}`;
2594
+ if (!merge.changed && Object.keys(expire).length === 0) continue;
2595
+ if (!merge.changed) {
2596
+ applied.push({
2597
+ id,
2598
+ describe,
2599
+ created: false
2600
+ });
2601
+ continue;
2602
+ }
2603
+ await client.setLifecycle(bucket, merge.rules);
2604
+ applied.push({
2605
+ id,
2606
+ describe,
2607
+ created: true
2608
+ });
2609
+ }
2610
+ return applied;
2611
+ }
2612
+ /**
2516
2613
  * Apply each served bucket's open-path policy, skipping those already correct.
2517
2614
  *
2518
2615
  * Compared as parsed JSON rather than as text: the same policy re-serialised
@@ -4179,8 +4276,9 @@ function composeFor(plan, options) {
4179
4276
  const volumes = {};
4180
4277
  for (const container of [...plan.containers].sort()) {
4181
4278
  const declared = container === "postgres" ? plan.resources.find((r) => r.version)?.version : void 0;
4279
+ const named = container === "postgres" ? declaredPostgresImage(plan) : void 0;
4182
4280
  const fake = plan.fakes?.[container];
4183
- const image = declared ? postgresImage(declared) : fake?.image ?? DEFAULT_IMAGES[container];
4281
+ const image = named ?? (declared ? postgresImage(declared) : fake?.image ?? DEFAULT_IMAGES[container]);
4184
4282
  if (!image) throw new UnknownContainer(container);
4185
4283
  const published = publish(container, options.ports, plan.fakes);
4186
4284
  services[container] = fake ? {
@@ -4215,6 +4313,28 @@ function toYaml(file) {
4215
4313
  ${stringify(file, { lineWidth: 0 })}`;
4216
4314
  }
4217
4315
  /** A container with no image, from config or from the defaults. */
4316
+ /**
4317
+ * The image the databases in the plan named for the shared local cluster, if
4318
+ * any did.
4319
+ */
4320
+ function declaredPostgresImage(plan) {
4321
+ const named = plan.resources.filter((r) => r.kind === "database" && Boolean(r.image));
4322
+ const images = [...new Set(named.map((r) => r.image))];
4323
+ if (images.length > 1) throw new ConflictingPostgresImages(named.map((r) => ({
4324
+ id: r.id,
4325
+ image: r.image
4326
+ })));
4327
+ return images[0];
4328
+ }
4329
+ /** Two databases on the one local cluster named different images for it. */
4330
+ var ConflictingPostgresImages = class extends Error {
4331
+ databases;
4332
+ constructor(databases) {
4333
+ super(`Locally every database runs in one Postgres container, and these name different images for it: ${databases.map((d) => `${d.id} (${d.image})`).join(", ")}. Give them the same image — one that ships every extension they declare.`);
4334
+ this.databases = databases;
4335
+ this.name = "ConflictingPostgresImages";
4336
+ }
4337
+ };
4218
4338
  var UnknownContainer = class extends Error {
4219
4339
  /** The container that could not be resolved. */
4220
4340
  container;
@@ -4524,6 +4644,24 @@ function bucketClient(port, credentials) {
4524
4644
  Bucket: bucket,
4525
4645
  Policy: policy
4526
4646
  }));
4647
+ },
4648
+ async lifecycle(bucket) {
4649
+ try {
4650
+ return (await s3.send(new GetBucketLifecycleConfigurationCommand({ Bucket: bucket }))).Rules;
4651
+ } catch (error) {
4652
+ if (error.name === "NoSuchLifecycleConfiguration") return;
4653
+ throw error;
4654
+ }
4655
+ },
4656
+ async setLifecycle(bucket, rules) {
4657
+ if (rules.length === 0) {
4658
+ await s3.send(new DeleteBucketLifecycleCommand({ Bucket: bucket }));
4659
+ return;
4660
+ }
4661
+ await s3.send(new PutBucketLifecycleConfigurationCommand({
4662
+ Bucket: bucket,
4663
+ LifecycleConfiguration: { Rules: rules }
4664
+ }));
4527
4665
  }
4528
4666
  };
4529
4667
  }
@@ -5463,10 +5601,12 @@ async function create(plan, ports, credentials, sql, buckets, emulatorCarriers,
5463
5601
  const minioPort = ports[primaryPortKey("minio")];
5464
5602
  const names = bucketNames(plan);
5465
5603
  const policies = bucketPolicies(plan);
5604
+ const lifecycles = bucketLifecycles(plan);
5466
5605
  if (minioPort !== void 0 && (names.length > 0 || policies.length > 0)) {
5467
5606
  const client = buckets(minioPort, credentials.minio);
5468
5607
  if (names.length > 0) applied.push(...await applyBuckets(client, names));
5469
5608
  if (policies.length > 0) applied.push(...await applyPolicies(client, policies));
5609
+ if (lifecycles.length > 0) applied.push(...await applyLifecycles(client, lifecycles));
5470
5610
  }
5471
5611
  const emulatorPort = ports[primaryPortKey("localstack")];
5472
5612
  const carriers = carrierNames(plan);
@@ -7356,7 +7496,7 @@ async function createDnsProvider(options) {
7356
7496
  });
7357
7497
  }
7358
7498
  if (provider === "godaddy") {
7359
- const { GoDaddyProvider } = await import("./GoDaddyProvider-I3WR0Irc.mjs");
7499
+ const { GoDaddyProvider } = await import("./GoDaddyProvider-B4JKSuX-.mjs");
7360
7500
  return new GoDaddyProvider(options.godaddy ?? {});
7361
7501
  }
7362
7502
  if (provider === "cloudflare") throw new DnsProviderNotImplemented("cloudflare");
@@ -8205,6 +8345,6 @@ function reportPlannedSeeds(planned, log) {
8205
8345
  for (const { folder, seeds } of planned) log(`🌱 ${folder}: would run ${seeds.length} (${seeds.join(", ")})`);
8206
8346
  }
8207
8347
  //#endregion
8208
- export { devServicesUsed as $, resolveHost as $n, isUnder as $t, assertStageProvidersEnabled as A, appTelemetry as An, isPortAvailable as At, workerDockerfileOf as B, fakeKey as Bn, maskPassword as Bt, setApplicationId as C, stackRedis as Cn, cacheBackendFor as Ct, DnsRecordsUnreadable as D, TELEMETRY_CONTAINER as Dn, createCredentialsPreload as Dt, setPostgresBackupId as E, localRolePassword as En, storageBackendFor as Et, DockerPushFailed as F, usesTelemetry as Fn, isRemoteStore as Ft, CronGenerator as G, LOCAL_LOGS_EMAIL as Gn, imageLayout as Gt, workerBundleName as H, portsOf as Hn, toEmbeddableSecrets as Ht, appDockerfile as I, EMULATOR_ACCESS_KEY_ID as In, secretsStoreFor as It, DEV_SERVICES as J, logsService as Jn, detectPackageManager as Jt, validateImageRef as K, LOGS_SERVICE as Kn, TURBO_VERSION as Kt, dockerCommand as L, hostFor as Ln, storeFromConfig as Lt, stageProviderNotes as M, scopeTelemetryEnv as Mn, loadPortState as Mt, PROVIDER_KINDS as N, surfaceClientTraced as Nn, loadSecretsForApp as Nt, createDnsProvider as O, planFor as On, createEntryWrapper as Ot, DockerBuildFailed as P, telemetryOf as Pn, prepareEntryCredentials as Pt, assertDevServicesFlag as Q, isMainFrontendApp as Qn, publicBuildValues as Qt, ensureDockerignore as R, DEFAULT_IMAGES as Rn, store_exports as Rt, recordRollback as S, runsRedis as Sn, composeFor as St, setGeneratedSecret as T, envFor as Tn, providerOf as Tt, workerEntryDir as U, postgresImage as Un, withCustomSecret as Ut, WorkerGenerator as V, portKeys as Vn, storage_exports as Vt, QueueGenerator as W, primaryPortKey as Wn, composeBuildPaths as Wt, ExternalServicesNotConfigured as X, withLogsPassword as Xn, imageBuildCredentials as Xt, DevServicesNeedServerTarget as Y, stackLogs as Yn, findBuildRoot as Yt, STORAGE_KEY_PAIR as Z, NoDomainForStage as Zn, isImageBuild as Zt, createComposeState as _, readKey as _n, LEGACY_LOCAL_LOGIN as _t, dnsResources as a, postgresDatabaseNames as an, appEnvKeys as at, getGeneratedSecret as b, STACK_CACHE as bn, pgClient as bt, describeActor as c, LOCAL_RABBITMQ_USER as cn, workerEnvKeys as ct, extractSubdomain as d, postgresSuperuser as dn, constructGlobs as dt, workerUnits as en, externalServices as et, findRootDomain as f, readLocalCredentials as fn, derivedContainers as ft, asDokployState as g, projectKey as gn, forgetState as gt, verifyDnsRecords as h, keystoreProject as hn, LOCAL_CA_PATH as ht, dnsRecordResource as i, bucketPolicies as in, suppliedOnly as it, provisionCommand as j, isTelemetryKey as jn, loadEnvFiles as jt, StageProviderDisabled as k, resourceName as kn, findAvailablePort as kt, isCi as l, loadLocalCredentials as ln, FAKE_ENV as lt, orchestrateDns as m, getKeyPath as mn, workspace_exports as mt, reportDatabaseRuns as n, applyPolicies as nn, requiredStageKeys as nt, recordDnsChanges as o, postgresStatements as on, dockerfileOf as ot, normalizeDnsConfig as p, FileSecretsStore as pn, reconcileWorkspace as pt, AllowDevServicesTakesNoValue as q, logsAccess as qn, WORKER_PORT as qt, reportPlannedSeeds as r, applyPostgres as rn, stageServiceDeclarations as rt, currentActor as s, quoteIdentifier as sn, networkEnv as st, DeploySeedsFailed as t, applyBuckets as tn, reportDevServices as tt, DeployJournal as u, postgresRoleSlug as un, backendsOf as ut, createEmptyState as v, withGeneratedSecrets as vn, ensurePostgresLogin as vt, setBackupState as w, withRedisPassword as wn, eventsBackendFor as wt, recordRelease as x, redisService as xn, CLUSTER_DATABASE as xt, getBackupState as y, REDIS_SERVICE as yn, bucketClient as yt, workerDockerfile as z, describeServices as zn, initStageSecrets as zt };
8348
+ export { devServicesUsed as $, withLogsPassword as $n, isUnder as $t, assertStageProvidersEnabled as A, TELEMETRY_CONTAINER as An, isPortAvailable as At, workerDockerfileOf as B, hostFor as Bn, maskPassword as Bt, setApplicationId as C, STACK_CACHE as Cn, cacheBackendFor as Ct, DnsRecordsUnreadable as D, withRedisPassword as Dn, createCredentialsPreload as Dt, setPostgresBackupId as E, stackRedis as En, storageBackendFor as Et, DockerPushFailed as F, scopeTelemetryEnv as Fn, isRemoteStore as Ft, CronGenerator as G, portsOf as Gn, imageLayout as Gt, workerBundleName as H, describeServices as Hn, toEmbeddableSecrets as Ht, appDockerfile as I, surfaceClientTraced as In, secretsStoreFor as It, DEV_SERVICES as J, LOCAL_LOGS_EMAIL as Jn, detectPackageManager as Jt, validateImageRef as K, postgresImage as Kn, TURBO_VERSION as Kt, dockerCommand as L, telemetryOf as Ln, storeFromConfig as Lt, stageProviderNotes as M, resourceName as Mn, loadPortState as Mt, PROVIDER_KINDS as N, appTelemetry as Nn, loadSecretsForApp as Nt, createDnsProvider as O, envFor as On, createEntryWrapper as Ot, DockerBuildFailed as P, isTelemetryKey as Pn, prepareEntryCredentials as Pt, assertDevServicesFlag as Q, stackLogs as Qn, publicBuildValues as Qt, ensureDockerignore as R, usesTelemetry as Rn, store_exports as Rt, recordRollback as S, REDIS_SERVICE as Sn, composeFor as St, setGeneratedSecret as T, runsRedis as Tn, providerOf as Tt, workerEntryDir as U, fakeKey as Un, withCustomSecret as Ut, WorkerGenerator as V, DEFAULT_IMAGES as Vn, storage_exports as Vt, QueueGenerator as W, portKeys as Wn, composeBuildPaths as Wt, ExternalServicesNotConfigured as X, logsAccess as Xn, imageBuildCredentials as Xt, DevServicesNeedServerTarget as Y, LOGS_SERVICE as Yn, findBuildRoot as Yt, STORAGE_KEY_PAIR as Z, logsService as Zn, isImageBuild as Zt, createComposeState as _, getKeyPath as _n, LEGACY_LOCAL_LOGIN as _t, dnsResources as a, bucketLifecycles as an, appEnvKeys as at, getGeneratedSecret as b, readKey as bn, pgClient as bt, describeActor as c, postgresStatements as cn, workerEnvKeys as ct, extractSubdomain as d, LOCAL_RABBITMQ_USER as dn, constructGlobs as dt, workerUnits as en, NoDomainForStage as er, externalServices as et, findRootDomain as f, loadLocalCredentials as fn, derivedContainers as ft, asDokployState as g, FileSecretsStore as gn, forgetState as gt, verifyDnsRecords as h, readLocalCredentials as hn, LOCAL_CA_PATH as ht, dnsRecordResource as i, applyPostgres as in, suppliedOnly as it, provisionCommand as j, planFor as jn, loadEnvFiles as jt, StageProviderDisabled as k, localRolePassword as kn, findAvailablePort as kt, isCi as l, quoteIdentifier as ln, FAKE_ENV as lt, orchestrateDns as m, postgresSuperuser as mn, workspace_exports as mt, reportDatabaseRuns as n, applyLifecycles as nn, resolveHost as nr, requiredStageKeys as nt, recordDnsChanges as o, bucketPolicies as on, dockerfileOf as ot, normalizeDnsConfig as p, postgresRoleSlug as pn, reconcileWorkspace as pt, AllowDevServicesTakesNoValue as q, primaryPortKey as qn, WORKER_PORT as qt, reportPlannedSeeds as r, applyPolicies as rn, stageServiceDeclarations as rt, currentActor as s, postgresDatabaseNames as sn, networkEnv as st, DeploySeedsFailed as t, applyBuckets as tn, isMainFrontendApp as tr, reportDevServices as tt, DeployJournal as u, mergeLifecycle as un, backendsOf as ut, createEmptyState as v, keystoreProject as vn, ensurePostgresLogin as vt, setBackupState as w, redisService as wn, eventsBackendFor as wt, recordRelease as x, withGeneratedSecrets as xn, CLUSTER_DATABASE as xt, getBackupState as y, projectKey as yn, bucketClient as yt, workerDockerfile as z, EMULATOR_ACCESS_KEY_ID as zn, initStageSecrets as zt };
8209
8349
 
8210
- //# sourceMappingURL=seeds-h4Wf-_hA.mjs.map
8350
+ //# sourceMappingURL=seeds-BBnvSEgG.mjs.map