@geekmidas/cli 10.0.0-alpha.88 → 10.0.0-alpha.89

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 (176) hide show
  1. package/dist/GoDaddyProvider--36rw8cP.mjs +387 -0
  2. package/dist/GoDaddyProvider--36rw8cP.mjs.map +1 -0
  3. package/dist/GoDaddyProvider-DnRor066.cjs +387 -0
  4. package/dist/GoDaddyProvider-DnRor066.cjs.map +1 -0
  5. package/dist/{HostingerProvider-CVc3rLPB.mjs → HostingerProvider-BI6J7oJr.mjs} +2 -2
  6. package/dist/{HostingerProvider-CVc3rLPB.mjs.map → HostingerProvider-BI6J7oJr.mjs.map} +1 -1
  7. package/dist/{HostingerProvider-BCB1QJj1.cjs → HostingerProvider-CyTpG_jy.cjs} +2 -2
  8. package/dist/{HostingerProvider-BCB1QJj1.cjs.map → HostingerProvider-CyTpG_jy.cjs.map} +1 -1
  9. package/dist/{LegacyStateStore-CWG_HVC0.cjs → LegacyStateStore-BaBoYl59.cjs} +2 -2
  10. package/dist/{LegacyStateStore-CWG_HVC0.cjs.map → LegacyStateStore-BaBoYl59.cjs.map} +1 -1
  11. package/dist/{LegacyStateStore-B0R4LlX_.mjs → LegacyStateStore-CO7bzJCU.mjs} +2 -2
  12. package/dist/{LegacyStateStore-B0R4LlX_.mjs.map → LegacyStateStore-CO7bzJCU.mjs.map} +1 -1
  13. package/dist/{LocalStateStore-CLwa2DpK.cjs → LocalStateStore-CUWh2BWU.cjs} +2 -2
  14. package/dist/{LocalStateStore-CLwa2DpK.cjs.map → LocalStateStore-CUWh2BWU.cjs.map} +1 -1
  15. package/dist/{LocalStateStore-Q4vXg2ua.mjs → LocalStateStore-C_hYDv6I.mjs} +2 -2
  16. package/dist/{LocalStateStore-Q4vXg2ua.mjs.map → LocalStateStore-C_hYDv6I.mjs.map} +1 -1
  17. package/dist/{S3StateStore-Cea9_5gF.cjs → S3StateStore-O8EYfjfG.cjs} +2 -2
  18. package/dist/{S3StateStore-Cea9_5gF.cjs.map → S3StateStore-O8EYfjfG.cjs.map} +1 -1
  19. package/dist/{S3StateStore-CksKYKRa.mjs → S3StateStore-hIm8Rrmu.mjs} +2 -2
  20. package/dist/{S3StateStore-CksKYKRa.mjs.map → S3StateStore-hIm8Rrmu.mjs.map} +1 -1
  21. package/dist/{SSMStateStore-aBOTF018.cjs → SSMStateStore-DIzbiqCz.cjs} +2 -2
  22. package/dist/{SSMStateStore-aBOTF018.cjs.map → SSMStateStore-DIzbiqCz.cjs.map} +1 -1
  23. package/dist/{SSMStateStore-BszSCAS2.mjs → SSMStateStore-IvcjTk8h.mjs} +2 -2
  24. package/dist/{SSMStateStore-BszSCAS2.mjs.map → SSMStateStore-IvcjTk8h.mjs.map} +1 -1
  25. package/dist/SubscriberGenerator-BPqQf8fB.mjs.map +1 -1
  26. package/dist/SubscriberGenerator-BVn7cQ-2.cjs.map +1 -1
  27. package/dist/{add-5MZAXybv.cjs → add-C9qX4Juc.cjs} +30 -7
  28. package/dist/add-C9qX4Juc.cjs.map +1 -0
  29. package/dist/{add-D_jNqnfZ.mjs → add-v3tCbrpE.mjs} +30 -7
  30. package/dist/add-v3tCbrpE.mjs.map +1 -0
  31. package/dist/{bundler-1REMhKps.cjs → bundler-C4NmpRTD.cjs} +5 -5
  32. package/dist/{bundler-1REMhKps.cjs.map → bundler-C4NmpRTD.cjs.map} +1 -1
  33. package/dist/{bundler-BMo-JP5s.mjs → bundler-C_fCgcVO.mjs} +5 -5
  34. package/dist/{bundler-BMo-JP5s.mjs.map → bundler-C_fCgcVO.mjs.map} +1 -1
  35. package/dist/{cli-BL8ZHsLQ.cjs → cli-C85Dut8K.cjs} +6 -5
  36. package/dist/cli-C85Dut8K.cjs.map +1 -0
  37. package/dist/{cli-7edNFwGk.mjs → cli-REdO9X5b.mjs} +7 -6
  38. package/dist/cli-REdO9X5b.mjs.map +1 -0
  39. package/dist/{compose-xw86kVYi.cjs → compose-BvrhDwJ6.cjs} +556 -30
  40. package/dist/compose-BvrhDwJ6.cjs.map +1 -0
  41. package/dist/{compose-DbJhRQlh.mjs → compose-Dn0oAgQ0.mjs} +509 -31
  42. package/dist/compose-Dn0oAgQ0.mjs.map +1 -0
  43. package/dist/{config-DrCAyoH5.d.mts → config-CdEcTrjG.d.mts} +3 -3
  44. package/dist/{config-CpjsVxru.d.cts.map → config-CdEcTrjG.d.mts.map} +1 -1
  45. package/dist/{config-CpjsVxru.d.cts → config-pST7E0CS.d.cts} +3 -3
  46. package/dist/{config-DrCAyoH5.d.mts.map → config-pST7E0CS.d.cts.map} +1 -1
  47. package/dist/config.cjs +1 -1
  48. package/dist/config.d.cts +3 -3
  49. package/dist/config.d.mts +3 -3
  50. package/dist/config.mjs +1 -1
  51. package/dist/{credentials-tr26-KML.cjs → credentials-BKfIugu2.cjs} +47 -2
  52. package/dist/credentials-BKfIugu2.cjs.map +1 -0
  53. package/dist/{credentials-BgJ5mS_d.mjs → credentials-CnVqoXMb.mjs} +30 -3
  54. package/dist/credentials-CnVqoXMb.mjs.map +1 -0
  55. package/dist/deploy/public.cjs +10 -10
  56. package/dist/deploy/public.d.cts +9 -3
  57. package/dist/deploy/public.d.cts.map +1 -1
  58. package/dist/deploy/public.d.mts +9 -3
  59. package/dist/deploy/public.d.mts.map +1 -1
  60. package/dist/deploy/public.mjs +10 -10
  61. package/dist/{deploy-BTfmXd3g.mjs → deploy-BaERRh0Q.mjs} +10 -8
  62. package/dist/deploy-BaERRh0Q.mjs.map +1 -0
  63. package/dist/{deploy-CtbZj4zN.cjs → deploy-DbBGo3a6.cjs} +10 -8
  64. package/dist/deploy-DbBGo3a6.cjs.map +1 -0
  65. package/dist/{dokploy-r69yZaIt.mjs → dokploy-CMmD_ddX.mjs} +2 -2
  66. package/dist/{dokploy-r69yZaIt.mjs.map → dokploy-CMmD_ddX.mjs.map} +1 -1
  67. package/dist/{dokploy-TGk3oPwr.cjs → dokploy-DwAaKA9B.cjs} +2 -2
  68. package/dist/{dokploy-TGk3oPwr.cjs.map → dokploy-DwAaKA9B.cjs.map} +1 -1
  69. package/dist/{encryption-C-8Tt5Hh.mjs → encryption-BQmhq9_y.mjs} +3 -3
  70. package/dist/{encryption-C-8Tt5Hh.mjs.map → encryption-BQmhq9_y.mjs.map} +1 -1
  71. package/dist/{encryption-CDn7BH5O.cjs → encryption-BrN_9_CM.cjs} +3 -3
  72. package/dist/{encryption-CDn7BH5O.cjs.map → encryption-BrN_9_CM.cjs.map} +1 -1
  73. package/dist/{engine-jAINgiOB.mjs → engine-DILocOOH.mjs} +23 -404
  74. package/dist/engine-DILocOOH.mjs.map +1 -0
  75. package/dist/{engine-Bt5k_UMq.cjs → engine-DgHoFBMw.cjs} +25 -406
  76. package/dist/engine-DgHoFBMw.cjs.map +1 -0
  77. package/dist/{github-DFhuJQlp.cjs → github-Bf7pz6AV.cjs} +3 -3
  78. package/dist/{github-DFhuJQlp.cjs.map → github-Bf7pz6AV.cjs.map} +1 -1
  79. package/dist/{github-CZHAtwPT.mjs → github-xzg99wz8.mjs} +3 -3
  80. package/dist/{github-CZHAtwPT.mjs.map → github-xzg99wz8.mjs.map} +1 -1
  81. package/dist/{index-MnUJuUlj.d.mts → index-D-F_hTDz.d.cts} +21 -4
  82. package/dist/index-D-F_hTDz.d.cts.map +1 -0
  83. package/dist/{index-elsLJTUv.d.cts → index-YFNxR5Ns.d.mts} +21 -4
  84. package/dist/index-YFNxR5Ns.d.mts.map +1 -0
  85. package/dist/index.cjs +246 -63
  86. package/dist/index.cjs.map +1 -1
  87. package/dist/index.mjs +247 -65
  88. package/dist/index.mjs.map +1 -1
  89. package/dist/{local-Cq8qdgNX.cjs → local-BjxDfPvy.cjs} +2 -2
  90. package/dist/{local-Cq8qdgNX.cjs.map → local-BjxDfPvy.cjs.map} +1 -1
  91. package/dist/{local-Ciq-bTPr.mjs → local-IuoIF3CT.mjs} +2 -2
  92. package/dist/{local-Ciq-bTPr.mjs.map → local-IuoIF3CT.mjs.map} +1 -1
  93. package/dist/{migrate-B1rVlwj1.cjs → migrate-7xayVtzL.cjs} +3 -3
  94. package/dist/{migrate-B1rVlwj1.cjs.map → migrate-7xayVtzL.cjs.map} +1 -1
  95. package/dist/{migrate-ggkPVJRC.mjs → migrate-CKLJ73OO.mjs} +4 -4
  96. package/dist/{migrate-ggkPVJRC.mjs.map → migrate-CKLJ73OO.mjs.map} +1 -1
  97. package/dist/{migrate-Dn7nK6sh.mjs → migrate-CpmO5qnl.mjs} +3 -3
  98. package/dist/{migrate-Dn7nK6sh.mjs.map → migrate-CpmO5qnl.mjs.map} +1 -1
  99. package/dist/{migrate-B16qgYTn.cjs → migrate-DPF7ZF8M.cjs} +3 -3
  100. package/dist/{migrate-B16qgYTn.cjs.map → migrate-DPF7ZF8M.cjs.map} +1 -1
  101. package/dist/openapi.cjs +1 -1
  102. package/dist/openapi.d.cts +1 -1
  103. package/dist/openapi.d.mts +1 -1
  104. package/dist/openapi.mjs +1 -1
  105. package/dist/reconcile/public.d.cts +1 -1
  106. package/dist/reconcile/public.d.mts +1 -1
  107. package/dist/{reconcile--I7V4Klj.mjs → reconcile-Dh1Jk7WE.mjs} +2 -2
  108. package/dist/{reconcile--I7V4Klj.mjs.map → reconcile-Dh1Jk7WE.mjs.map} +1 -1
  109. package/dist/{resolve-BSke45k6.mjs → resolve-Dv_weZoh.mjs} +4 -4
  110. package/dist/{resolve-BSke45k6.mjs.map → resolve-Dv_weZoh.mjs.map} +1 -1
  111. package/dist/{resolve-BXeXzpmU.cjs → resolve-dlKPFNgv.cjs} +4 -4
  112. package/dist/{resolve-BXeXzpmU.cjs.map → resolve-dlKPFNgv.cjs.map} +1 -1
  113. package/dist/{rollback-DFMiBWf0.cjs → rollback-65VVIdBM.cjs} +6 -6
  114. package/dist/{rollback-DFMiBWf0.cjs.map → rollback-65VVIdBM.cjs.map} +1 -1
  115. package/dist/{rollback-CEE6dse4.mjs → rollback-DpSU2DsD.mjs} +6 -6
  116. package/dist/{rollback-CEE6dse4.mjs.map → rollback-DpSU2DsD.mjs.map} +1 -1
  117. package/dist/{runtime-HabiNBtJ.d.mts → runtime-CN_kmqxo.d.cts} +2 -2
  118. package/dist/{runtime-D48ZKk8_.d.cts.map → runtime-CN_kmqxo.d.cts.map} +1 -1
  119. package/dist/{runtime-D48ZKk8_.d.cts → runtime-Cjvon3oj.d.mts} +2 -2
  120. package/dist/{runtime-HabiNBtJ.d.mts.map → runtime-Cjvon3oj.d.mts.map} +1 -1
  121. package/dist/{seeds-CsI0A_Ef.cjs → seeds-CN6tB-va.cjs} +646 -187
  122. package/dist/{seeds-CsI0A_Ef.cjs.map → seeds-CN6tB-va.cjs.map} +1 -1
  123. package/dist/{seeds-BYdrtZsC.mjs → seeds-perzdN81.mjs} +599 -164
  124. package/dist/seeds-perzdN81.mjs.map +1 -0
  125. package/dist/{sniffer-B0EU73bj.mjs → sniffer-BTtX3NUM.mjs} +3 -3
  126. package/dist/{sniffer-B0EU73bj.mjs.map → sniffer-BTtX3NUM.mjs.map} +1 -1
  127. package/dist/{sniffer-DJYupBeK.cjs → sniffer-IAQEpsQb.cjs} +3 -3
  128. package/dist/{sniffer-DJYupBeK.cjs.map → sniffer-IAQEpsQb.cjs.map} +1 -1
  129. package/dist/{sst-DAqUoZKG.cjs → sst-BgcOsaBi.cjs} +3 -3
  130. package/dist/{sst-DAqUoZKG.cjs.map → sst-BgcOsaBi.cjs.map} +1 -1
  131. package/dist/{sst-D1Qj4sIs.mjs → sst-CJzvyrEz.mjs} +3 -3
  132. package/dist/{sst-D1Qj4sIs.mjs.map → sst-CJzvyrEz.mjs.map} +1 -1
  133. package/dist/{stages-Brn3vcdy.cjs → stages-CUn6gvXL.cjs} +2 -2
  134. package/dist/{stages-Brn3vcdy.cjs.map → stages-CUn6gvXL.cjs.map} +1 -1
  135. package/dist/{stages-DoHHz6pS.mjs → stages-CnZRYmkI.mjs} +2 -2
  136. package/dist/{stages-DoHHz6pS.mjs.map → stages-CnZRYmkI.mjs.map} +1 -1
  137. package/dist/target/public.cjs +1 -1
  138. package/dist/target/public.d.cts +2 -2
  139. package/dist/target/public.d.mts +2 -2
  140. package/dist/target/public.mjs +1 -1
  141. package/dist/{terminal-BTbZlrFV.mjs → terminal-D8TPK7o9.mjs} +3 -3
  142. package/dist/{terminal-BTbZlrFV.mjs.map → terminal-D8TPK7o9.mjs.map} +1 -1
  143. package/dist/{terminal-COv23heb.cjs → terminal-DuapRxh6.cjs} +2 -2
  144. package/dist/{terminal-COv23heb.cjs.map → terminal-DuapRxh6.cjs.map} +1 -1
  145. package/dist/{types-0oAyFOfR.d.cts → types-NqX1Hz4P.d.cts} +210 -205
  146. package/dist/types-NqX1Hz4P.d.cts.map +1 -0
  147. package/dist/{types-BZ01tZs-.d.mts → types-ZHuZ89hv.d.mts} +210 -205
  148. package/dist/types-ZHuZ89hv.d.mts.map +1 -0
  149. package/dist/workspace/index.cjs +3 -1
  150. package/dist/workspace/index.d.cts +3 -3
  151. package/dist/workspace/index.d.mts +3 -3
  152. package/dist/workspace/index.mjs +2 -2
  153. package/dist/{workspace-D2CYLMCW.mjs → workspace-CJ0lKFq-.mjs} +231 -10
  154. package/dist/workspace-CJ0lKFq-.mjs.map +1 -0
  155. package/dist/{workspace-CT0JM3Y8.cjs → workspace-CwW3Gkru.cjs} +266 -9
  156. package/dist/workspace-CwW3Gkru.cjs.map +1 -0
  157. package/package.json +15 -15
  158. package/dist/add-5MZAXybv.cjs.map +0 -1
  159. package/dist/add-D_jNqnfZ.mjs.map +0 -1
  160. package/dist/cli-7edNFwGk.mjs.map +0 -1
  161. package/dist/cli-BL8ZHsLQ.cjs.map +0 -1
  162. package/dist/compose-DbJhRQlh.mjs.map +0 -1
  163. package/dist/compose-xw86kVYi.cjs.map +0 -1
  164. package/dist/credentials-BgJ5mS_d.mjs.map +0 -1
  165. package/dist/credentials-tr26-KML.cjs.map +0 -1
  166. package/dist/deploy-BTfmXd3g.mjs.map +0 -1
  167. package/dist/deploy-CtbZj4zN.cjs.map +0 -1
  168. package/dist/engine-Bt5k_UMq.cjs.map +0 -1
  169. package/dist/engine-jAINgiOB.mjs.map +0 -1
  170. package/dist/index-MnUJuUlj.d.mts.map +0 -1
  171. package/dist/index-elsLJTUv.d.cts.map +0 -1
  172. package/dist/seeds-BYdrtZsC.mjs.map +0 -1
  173. package/dist/types-0oAyFOfR.d.cts.map +0 -1
  174. package/dist/types-BZ01tZs-.d.mts.map +0 -1
  175. package/dist/workspace-CT0JM3Y8.cjs.map +0 -1
  176. package/dist/workspace-D2CYLMCW.mjs.map +0 -1
@@ -1,12 +1,12 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
2
- const require_credentials = require("./credentials-tr26-KML.cjs");
2
+ const require_credentials = require("./credentials-BKfIugu2.cjs");
3
3
  const require_discover = require("./discover-D1It5r_h.cjs");
4
4
  const require_derive = require("./derive-DAbo49sm.cjs");
5
- const require_workspace = require("./workspace-CT0JM3Y8.cjs");
5
+ const require_workspace = require("./workspace-CwW3Gkru.cjs");
6
6
  const require_config = require("./config.cjs");
7
7
  const require_EndpointGenerator = require("./EndpointGenerator-CwLjBCFE.cjs");
8
8
  const require_SubscriberGenerator = require("./SubscriberGenerator-BVn7cQ-2.cjs");
9
- const require_resolve = require("./resolve-BXeXzpmU.cjs");
9
+ const require_resolve = require("./resolve-dlKPFNgv.cjs");
10
10
  let node_path = require("node:path");
11
11
  let node_fs = require("node:fs");
12
12
  let node_fs_promises = require("node:fs/promises");
@@ -31,6 +31,7 @@ let _aws_sdk_client_sns = require("@aws-sdk/client-sns");
31
31
  let _aws_sdk_client_sqs = require("@aws-sdk/client-sqs");
32
32
  let pg = require("pg");
33
33
  let _geekmidas_cache_postgres = require("@geekmidas/cache/postgres");
34
+ let node_dns_promises = require("node:dns/promises");
34
35
  let _geekmidas_storage_s3_url = require("@geekmidas/storage/s3-url");
35
36
  _geekmidas_storage_s3_url = require_rolldown_runtime.__toESM(_geekmidas_storage_s3_url, 1);
36
37
  //#region src/workspace/rootSite.ts
@@ -77,11 +78,11 @@ var AmbiguousRootSite = class extends Error {
77
78
  };
78
79
  //#endregion
79
80
  //#region src/target/dokploy/domain.ts
80
- /** A stage was deployed that `deploy.domains` gives no domain. */
81
+ /** A stage was deployed that `domains` gives no domain. */
81
82
  var NoDomainForStage = class extends Error {
82
83
  stage;
83
84
  constructor(stage) {
84
- super(`No domain for stage "${stage}". Add it to gkm.config.ts: deploy: { domains: { ${stage}: 'example.com' } }.`);
85
+ super(`No domain for stage "${stage}". Add it to gkm.config.ts: domains: { ${stage}: 'example.com' }.`);
85
86
  this.stage = stage;
86
87
  this.name = "NoDomainForStage";
87
88
  }
@@ -90,11 +91,11 @@ var NoDomainForStage = class extends Error {
90
91
  * The hostname an app answers on for a stage.
91
92
  *
92
93
  * 1. An explicit `app.domain` — a string, or one per stage — wins.
93
- * 2. Otherwise from the stage's base domain in `deploy.domains`: the root site
94
+ * 2. Otherwise from the stage's base domain in `domains`: the root site
94
95
  * answers on the domain itself, and every other app on
95
96
  * `{subdomain}.{domain}` — its declaration's `subdomain`, or its own name.
96
97
  *
97
- * @throws {NoDomainForStage} when `deploy.domains` names no domain for it
98
+ * @throws {NoDomainForStage} when `domains` names no domain for it
98
99
  */
99
100
  function resolveHost(appName, app, stage, domains, isMainFrontend) {
100
101
  if (app.domain) {
@@ -303,6 +304,11 @@ function logsAccess(logs, ctx) {
303
304
  }
304
305
  //#endregion
305
306
  //#region src/secrets/storage.ts
307
+ /**
308
+ * What a stage's secrets are, independent of where they are kept: building
309
+ * them, changing them, and handing them to a process. Where they are kept is a
310
+ * {@link SecretsStore}'s business — see `secretsStoreFor`.
311
+ */
306
312
  var storage_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
307
313
  initStageSecrets: () => initStageSecrets,
308
314
  maskPassword: () => maskPassword,
@@ -331,7 +337,7 @@ function initStageSecrets(stage) {
331
337
  function toEmbeddableSecrets(secrets) {
332
338
  return {
333
339
  ...secrets.urls,
334
- ...secrets.custom,
340
+ ...Object.fromEntries(Object.entries(secrets.custom).filter(([key]) => !require_workspace.isReservedStageKey(key))),
335
341
  ...secrets.services.postgres && {
336
342
  POSTGRES_USER: secrets.services.postgres.username,
337
343
  POSTGRES_PASSWORD: secrets.services.postgres.password,
@@ -857,7 +863,7 @@ function isRemoteStore(workspace, stage) {
857
863
  }
858
864
  //#endregion
859
865
  //#region src/credentials/index.ts
860
- const logger$1 = console;
866
+ const logger$2 = console;
861
867
  /**
862
868
  * Load environment files
863
869
  * @internal Exported for testing
@@ -908,7 +914,7 @@ async function findAvailablePort(preferredPort, maxAttempts = 10) {
908
914
  for (let i = 0; i < maxAttempts; i++) {
909
915
  const port = preferredPort + i;
910
916
  if (await isPortAvailable(port)) return port;
911
- logger$1.log(`⚠️ Port ${port} is in use, trying ${port + 1}...`);
917
+ logger$2.log(`⚠️ Port ${port} is in use, trying ${port + 1}...`);
912
918
  }
913
919
  throw new Error(`Could not find an available port after trying ${maxAttempts} ports starting from ${preferredPort}`);
914
920
  }
@@ -945,7 +951,7 @@ async function savePortState(workspaceRoot, ports) {
945
951
  async function loadSecretsForApp(store, stage) {
946
952
  const stageSecrets = await store.read(stage);
947
953
  if (!stageSecrets) return {};
948
- logger$1.log(`🔐 Loading secrets from stage: ${stage}`);
954
+ logger$2.log(`🔐 Loading secrets from stage: ${stage}`);
949
955
  return toEmbeddableSecrets(stageSecrets);
950
956
  }
951
957
  /**
@@ -1043,7 +1049,7 @@ async function prepareEntryCredentials(options) {
1043
1049
  free: isPortAvailable,
1044
1050
  holder: holderOf
1045
1051
  });
1046
- for (const { app, from, to, holder } of assigned.moved) logger$1.log(`↪️ ${app}: ${from} is held by ${describeHolder(holder)}, which is not this workspace's — using ${to}`);
1052
+ for (const { app, from, to, holder } of assigned.moved) logger$2.log(`↪️ ${app}: ${from} is held by ${describeHolder(holder)}, which is not this workspace's — using ${to}`);
1047
1053
  workspace = withAppPorts(workspace, assigned.ports);
1048
1054
  workspaceAppPort = assigned.ports[appName] ?? workspaceAppPort;
1049
1055
  }
@@ -1067,7 +1073,7 @@ async function prepareEntryCredentials(options) {
1067
1073
  });
1068
1074
  Object.assign(credentials, reconciled.env);
1069
1075
  declaredKeys.push(...Object.keys(reconciled.env));
1070
- if (Object.keys(reconciled.env).length > 0) logger$1.log(`🔌 Resolved ${Object.keys(reconciled.env).length} declared URL(s)`);
1076
+ if (Object.keys(reconciled.env).length > 0) logger$2.log(`🔌 Resolved ${Object.keys(reconciled.env).length} declared URL(s)`);
1071
1077
  }
1072
1078
  const secretsDir = (0, node_path.join)(secretsRoot, ".gkm");
1073
1079
  await (0, node_fs_promises.mkdir)(secretsDir, { recursive: true });
@@ -6774,6 +6780,14 @@ function requiredStageKeys(input) {
6774
6780
  ...apps(d)
6775
6781
  });
6776
6782
  }
6783
+ if (!input.local && input.server) add({
6784
+ key: require_workspace.SERVER_IPV4_KEY,
6785
+ id: "server",
6786
+ kind: "server",
6787
+ what: "the public IPv4 address of the server the stage's stack runs on — its hosts' DNS records point at it, and every deploy checks they do",
6788
+ note: `${require_workspace.SERVER_IPV6_KEY} adds its IPv6 address (AAAA records); neither is ever handed to an app`,
6789
+ example: "203.0.113.10"
6790
+ });
6777
6791
  for (const d of byId(input.credentials)) add({
6778
6792
  key: (0, _geekmidas_manifest.provideKey)(d.id, "credentials"),
6779
6793
  id: d.id,
@@ -7204,17 +7218,17 @@ function isStateStore(value) {
7204
7218
  async function createStateStore(options) {
7205
7219
  const { config, workspaceRoot, workspaceName } = options;
7206
7220
  if (!config || config.provider === "local") {
7207
- const { LocalStateStore } = await Promise.resolve().then(() => require("./LocalStateStore-CLwa2DpK.cjs")).then((n) => n.LocalStateStore_exports);
7221
+ const { LocalStateStore } = await Promise.resolve().then(() => require("./LocalStateStore-CUWh2BWU.cjs")).then((n) => n.LocalStateStore_exports);
7208
7222
  return new LocalStateStore(workspaceRoot);
7209
7223
  }
7210
7224
  if (isStateStore(config.provider)) return config.provider;
7211
7225
  if (isStateProvider(config.provider)) {
7212
- const { LegacyStateStore } = await Promise.resolve().then(() => require("./LegacyStateStore-CWG_HVC0.cjs"));
7226
+ const { LegacyStateStore } = await Promise.resolve().then(() => require("./LegacyStateStore-BaBoYl59.cjs"));
7213
7227
  return new LegacyStateStore(config.provider, { warn: options.warn });
7214
7228
  }
7215
7229
  if (config.provider === "ssm") {
7216
7230
  if (!workspaceName) throw new StateStoreNeedsWorkspaceName("ssm");
7217
- const { SSMStateStore } = await Promise.resolve().then(() => require("./SSMStateStore-aBOTF018.cjs"));
7231
+ const { SSMStateStore } = await Promise.resolve().then(() => require("./SSMStateStore-DIzbiqCz.cjs"));
7218
7232
  const ssm = config;
7219
7233
  return SSMStateStore.create({
7220
7234
  workspaceName,
@@ -7224,7 +7238,7 @@ async function createStateStore(options) {
7224
7238
  }
7225
7239
  if (config.provider === "s3") {
7226
7240
  if (!workspaceName) throw new StateStoreNeedsWorkspaceName("s3");
7227
- const { S3StateStore } = await Promise.resolve().then(() => require("./S3StateStore-Cea9_5gF.cjs"));
7241
+ const { S3StateStore } = await Promise.resolve().then(() => require("./S3StateStore-O8EYfjfG.cjs"));
7228
7242
  const s3 = config;
7229
7243
  return S3StateStore.create({
7230
7244
  workspaceName,
@@ -7237,6 +7251,576 @@ async function createStateStore(options) {
7237
7251
  throw new UnknownStateProvider(config);
7238
7252
  }
7239
7253
  //#endregion
7254
+ //#region src/target/dokploy/dns/DnsProvider.ts
7255
+ /**
7256
+ * Check if value is a DnsProvider implementation.
7257
+ */
7258
+ function isDnsProvider(value) {
7259
+ return typeof value === "object" && value !== null && typeof value.name === "string" && typeof value.getRecords === "function" && typeof value.upsertRecords === "function" && typeof value.deleteRecords === "function";
7260
+ }
7261
+ /**
7262
+ * Create a DNS provider based on configuration.
7263
+ *
7264
+ * - 'hostinger': HostingerProvider
7265
+ * - 'route53': Route53Provider
7266
+ * - 'godaddy': GoDaddyProvider
7267
+ * - 'manual': Returns null (user handles DNS)
7268
+ * - Custom: Use provided DnsProvider implementation
7269
+ */
7270
+ async function createDnsProvider(options) {
7271
+ const { config } = options;
7272
+ if (config.provider === "manual") return null;
7273
+ if (isDnsProvider(config.provider)) return config.provider;
7274
+ const provider = config.provider;
7275
+ if (provider === "hostinger") {
7276
+ const { HostingerProvider } = await Promise.resolve().then(() => require("./HostingerProvider-CyTpG_jy.cjs"));
7277
+ return new HostingerProvider();
7278
+ }
7279
+ if (provider === "route53") {
7280
+ const { Route53Provider } = await Promise.resolve().then(() => require("./Route53Provider-Bllus2NR.cjs"));
7281
+ const route53Config = config;
7282
+ return new Route53Provider({
7283
+ region: route53Config.region,
7284
+ profile: route53Config.profile,
7285
+ hostedZoneId: route53Config.hostedZoneId
7286
+ });
7287
+ }
7288
+ if (provider === "godaddy") {
7289
+ const { GoDaddyProvider } = await Promise.resolve().then(() => require("./GoDaddyProvider-DnRor066.cjs"));
7290
+ return new GoDaddyProvider(options.godaddy ?? {});
7291
+ }
7292
+ if (provider === "cloudflare") throw new DnsProviderNotImplemented("cloudflare");
7293
+ throw new DnsProviderUnknown(config);
7294
+ }
7295
+ /**
7296
+ * The provider's credentials can write records and not read them — a key
7297
+ * scoped to updates only. What reads them falls back to writing every record,
7298
+ * which is idempotent, without a diff.
7299
+ */
7300
+ var DnsRecordsUnreadable = class extends Error {
7301
+ provider;
7302
+ domain;
7303
+ reason;
7304
+ constructor(provider, domain, reason) {
7305
+ super(`The ${provider} key cannot read ${domain}'s DNS records (${reason}), so changes cannot be compared with what is there: every record is written, which leaves one that already has its value as it was.`);
7306
+ this.provider = provider;
7307
+ this.domain = domain;
7308
+ this.reason = reason;
7309
+ this.name = "DnsRecordsUnreadable";
7310
+ }
7311
+ };
7312
+ /** A DNS provider gkm names and does not have yet. */
7313
+ var DnsProviderNotImplemented = class extends Error {
7314
+ provider;
7315
+ constructor(provider) {
7316
+ super(`The ${provider} DNS provider is not implemented yet. Use 'route53', 'godaddy', 'hostinger' or 'manual' for this domain in dns, or pass your own DnsProvider object.`);
7317
+ this.provider = provider;
7318
+ this.name = "DnsProviderNotImplemented";
7319
+ }
7320
+ };
7321
+ /** A `provider:` that is none of the built-ins, nor a DnsProvider object. */
7322
+ var DnsProviderUnknown = class extends Error {
7323
+ config;
7324
+ constructor(config) {
7325
+ super(`Unknown DNS provider: ${JSON.stringify(config)}. dns takes 'route53', 'godaddy', 'hostinger', 'manual', or an object implementing DnsProvider.`);
7326
+ this.config = config;
7327
+ this.name = "DnsProviderUnknown";
7328
+ }
7329
+ };
7330
+ //#endregion
7331
+ //#region src/deploy/state.ts
7332
+ /**
7333
+ * Deploy state management for Dokploy deployments
7334
+ *
7335
+ * Stores resource IDs (applications, services) per stage to avoid
7336
+ * re-creating resources on subsequent deploys.
7337
+ */
7338
+ /**
7339
+ * Create a new empty state for a stage
7340
+ */
7341
+ function createEmptyState(stage, projectId, environmentId) {
7342
+ return {
7343
+ provider: "dokploy",
7344
+ stage,
7345
+ projectId,
7346
+ environmentId,
7347
+ applications: {},
7348
+ services: {},
7349
+ lastDeployedAt: (/* @__PURE__ */ new Date()).toISOString()
7350
+ };
7351
+ }
7352
+ /**
7353
+ * Set application ID in state (mutates state)
7354
+ */
7355
+ function setApplicationId(state, appName, applicationId) {
7356
+ state.applications[appName] = applicationId;
7357
+ }
7358
+ /** Two records naming the same image: by digest when both have one. */
7359
+ function sameImage(a, b) {
7360
+ return a.digest && b.digest ? a.digest === b.digest : a.ref === b.ref;
7361
+ }
7362
+ /** The newest release in `history` after `index` that a rollback may restore. */
7363
+ function restorable(history, index, current) {
7364
+ return history.slice(index + 1).find((entry) => !entry.rolledBack && !sameImage(entry, current));
7365
+ }
7366
+ /**
7367
+ * Record that `image` went live for `appName` (mutates state): it becomes
7368
+ * `current`, and what was current becomes `previous`. Releasing what already
7369
+ * runs — a redeploy of the same digest — changes nothing.
7370
+ */
7371
+ function recordRelease(state, appName, image, releasedAt = /* @__PURE__ */ new Date()) {
7372
+ const releases = state.releases?.[appName];
7373
+ if (releases && sameImage(releases.current, image)) return;
7374
+ const entry = {
7375
+ ...image,
7376
+ releasedAt: releasedAt.toISOString()
7377
+ };
7378
+ const history = [entry, ...releases?.history ?? []].slice(0, 10);
7379
+ const previous = releases?.current;
7380
+ state.releases = {
7381
+ ...state.releases,
7382
+ [appName]: {
7383
+ current: entry,
7384
+ ...previous ? { previous } : {},
7385
+ history
7386
+ }
7387
+ };
7388
+ }
7389
+ /**
7390
+ * Record that `appName` was rolled back to `to` (mutates state): every
7391
+ * release newer than it is marked rolled back, so neither this rollback nor
7392
+ * a later one restores it, and `previous` moves to the release before `to`.
7393
+ */
7394
+ function recordRollback(state, appName, to) {
7395
+ const releases = state.releases?.[appName];
7396
+ if (!releases) return;
7397
+ const index = releases.history.findIndex((entry) => !entry.rolledBack && sameImage(entry, to));
7398
+ if (index === -1) return;
7399
+ const history = releases.history.map((entry, i) => i < index ? {
7400
+ ...entry,
7401
+ rolledBack: true
7402
+ } : entry);
7403
+ const current = history[index];
7404
+ const previous = restorable(history, index, current);
7405
+ state.releases = {
7406
+ ...state.releases,
7407
+ [appName]: {
7408
+ current,
7409
+ ...previous ? { previous } : {},
7410
+ history
7411
+ }
7412
+ };
7413
+ }
7414
+ /**
7415
+ * Get a generated secret for an app
7416
+ */
7417
+ function getGeneratedSecret(state, appName, secretName) {
7418
+ return state?.generatedSecrets?.[appName]?.[secretName];
7419
+ }
7420
+ /**
7421
+ * Set a generated secret for an app (mutates state)
7422
+ */
7423
+ function setGeneratedSecret(state, appName, secretName, value) {
7424
+ if (!state.generatedSecrets) state.generatedSecrets = {};
7425
+ if (!state.generatedSecrets[appName]) state.generatedSecrets[appName] = {};
7426
+ state.generatedSecrets[appName][secretName] = value;
7427
+ }
7428
+ /**
7429
+ * Set DNS verification record for a hostname (mutates state)
7430
+ */
7431
+ function setDnsVerification(state, hostname, serverIp) {
7432
+ if (!state.dnsVerified) state.dnsVerified = {};
7433
+ state.dnsVerified[hostname] = {
7434
+ serverIp,
7435
+ verifiedAt: (/* @__PURE__ */ new Date()).toISOString()
7436
+ };
7437
+ }
7438
+ /**
7439
+ * Check if a hostname is already verified with the given IP
7440
+ */
7441
+ function isDnsVerified(state, hostname, serverIp) {
7442
+ return (state?.dnsVerified?.[hostname])?.serverIp === serverIp;
7443
+ }
7444
+ /**
7445
+ * Get the key for a DNS record in state
7446
+ */
7447
+ function getDnsRecordKey(name, type) {
7448
+ return `${name}:${type}`;
7449
+ }
7450
+ /**
7451
+ * Set a created DNS record in state (mutates state)
7452
+ */
7453
+ function setDnsRecord(state, record) {
7454
+ if (!state.dnsRecords) state.dnsRecords = {};
7455
+ const key = getDnsRecordKey(record.name, record.type);
7456
+ state.dnsRecords[key] = {
7457
+ ...record,
7458
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
7459
+ };
7460
+ }
7461
+ /**
7462
+ * Get backup state from state
7463
+ */
7464
+ function getBackupState(state) {
7465
+ return state?.backups;
7466
+ }
7467
+ /**
7468
+ * Set backup state (mutates state)
7469
+ */
7470
+ function setBackupState(state, backupState) {
7471
+ state.backups = backupState;
7472
+ }
7473
+ /**
7474
+ * Set postgres backup ID in state (mutates state)
7475
+ */
7476
+ function setPostgresBackupId(state, backupId) {
7477
+ if (state.backups) state.backups.postgresBackupId = backupId;
7478
+ }
7479
+ //#endregion
7480
+ //#region src/target/dokploy/dns/index.ts
7481
+ /**
7482
+ * DNS orchestration for deployments
7483
+ *
7484
+ * Handles automatic DNS record creation for deployed applications.
7485
+ */
7486
+ const logger$1 = require_discover.output;
7487
+ /**
7488
+ * Check if DNS config is legacy format (single domain with `domain` property)
7489
+ */
7490
+ function isLegacyDnsConfig(config) {
7491
+ return typeof config === "object" && config !== null && "provider" in config && "domain" in config;
7492
+ }
7493
+ /**
7494
+ * Normalize DNS config to new multi-domain format
7495
+ */
7496
+ function normalizeDnsConfig(config) {
7497
+ if (isLegacyDnsConfig(config)) {
7498
+ const { domain, ...providerConfig } = config;
7499
+ return { [domain]: providerConfig };
7500
+ }
7501
+ return config;
7502
+ }
7503
+ /**
7504
+ * Find the root domain for a hostname from available DNS configs
7505
+ *
7506
+ * @example
7507
+ * findRootDomain('api.geekmidas.com', { 'geekmidas.com': {...}, 'geekmidas.dev': {...} })
7508
+ * // Returns 'geekmidas.com'
7509
+ */
7510
+ function findRootDomain(hostname, dnsConfig) {
7511
+ const domains = Object.keys(dnsConfig).sort((a, b) => b.length - a.length);
7512
+ for (const domain of domains) if (hostname === domain || hostname.endsWith(`.${domain}`)) return domain;
7513
+ return null;
7514
+ }
7515
+ /**
7516
+ * Group hostnames by their root domain
7517
+ */
7518
+ function groupHostnamesByDomain(appHostnames, dnsConfig) {
7519
+ const grouped = /* @__PURE__ */ new Map();
7520
+ for (const [appName, hostname] of appHostnames) {
7521
+ const rootDomain = findRootDomain(hostname, dnsConfig);
7522
+ if (!rootDomain) {
7523
+ logger$1.log(` ⚠ No DNS config found for hostname: ${hostname}`);
7524
+ continue;
7525
+ }
7526
+ if (!grouped.has(rootDomain)) grouped.set(rootDomain, /* @__PURE__ */ new Map());
7527
+ grouped.get(rootDomain).set(appName, hostname);
7528
+ }
7529
+ return grouped;
7530
+ }
7531
+ /**
7532
+ * Resolve IP address from a hostname
7533
+ */
7534
+ async function resolveHostnameToIp(hostname) {
7535
+ try {
7536
+ return (await (0, node_dns_promises.lookup)(hostname, { family: 4 })).address;
7537
+ } catch (error) {
7538
+ throw new Error(`Failed to resolve IP for ${hostname}: ${error instanceof Error ? error.message : "Unknown error"}`);
7539
+ }
7540
+ }
7541
+ /**
7542
+ * Extract subdomain from full hostname relative to root domain
7543
+ *
7544
+ * @example
7545
+ * extractSubdomain('api.joemoer.traflabs.io', 'traflabs.io') => 'api.joemoer'
7546
+ * extractSubdomain('joemoer.traflabs.io', 'traflabs.io') => 'joemoer'
7547
+ */
7548
+ function extractSubdomain(hostname, rootDomain) {
7549
+ if (!hostname.endsWith(rootDomain)) throw new Error(`Hostname ${hostname} is not under root domain ${rootDomain}`);
7550
+ return hostname.slice(0, -(rootDomain.length + 1)) || "@";
7551
+ }
7552
+ /**
7553
+ * Generate required DNS records for a deployment
7554
+ */
7555
+ function generateRequiredRecords(appHostnames, rootDomain, serverIp) {
7556
+ const records = [];
7557
+ for (const [appName, hostname] of appHostnames) {
7558
+ const subdomain = extractSubdomain(hostname, rootDomain);
7559
+ records.push({
7560
+ hostname,
7561
+ subdomain,
7562
+ type: "A",
7563
+ value: serverIp,
7564
+ appName
7565
+ });
7566
+ }
7567
+ return records;
7568
+ }
7569
+ /**
7570
+ * Print DNS records table
7571
+ */
7572
+ function printDnsRecordsTable(records, rootDomain) {
7573
+ logger$1.log(`\n 📋 DNS Records for ${rootDomain}:`);
7574
+ logger$1.log(" ┌─────────────────────────────────────┬──────┬─────────────────┬────────┐");
7575
+ logger$1.log(" │ Subdomain │ Type │ Value │ Status │");
7576
+ logger$1.log(" ├─────────────────────────────────────┼──────┼─────────────────┼────────┤");
7577
+ for (const record of records) {
7578
+ const subdomain = record.subdomain.padEnd(35);
7579
+ const type = record.type.padEnd(4);
7580
+ const value = record.value.padEnd(15);
7581
+ let status;
7582
+ if (record.error) status = "✗";
7583
+ else if (record.created) status = "✓ new";
7584
+ else if (record.existed) status = "✓";
7585
+ else status = "?";
7586
+ logger$1.log(` │ ${subdomain} │ ${type} │ ${value} │ ${status.padEnd(6)} │`);
7587
+ }
7588
+ logger$1.log(" └─────────────────────────────────────┴──────┴─────────────────┴────────┘");
7589
+ }
7590
+ /**
7591
+ * Print DNS records in a simple format for manual setup
7592
+ */
7593
+ function printDnsRecordsSimple(records, rootDomain) {
7594
+ logger$1.log("\n 📋 Required DNS Records:");
7595
+ logger$1.log(` Add these A records to your DNS provider (${rootDomain}):\n`);
7596
+ for (const record of records) logger$1.log(` ${record.subdomain} → ${record.value} (A record)`);
7597
+ logger$1.log("");
7598
+ }
7599
+ /**
7600
+ * Create DNS records for a single domain using its configured provider
7601
+ */
7602
+ async function createDnsRecordsForDomain(records, rootDomain, providerConfig) {
7603
+ const ttl = "ttl" in providerConfig && providerConfig.ttl ? providerConfig.ttl : 300;
7604
+ let provider;
7605
+ try {
7606
+ provider = await createDnsProvider({ config: providerConfig });
7607
+ } catch (error) {
7608
+ const message = error instanceof Error ? error.message : "Unknown error";
7609
+ logger$1.log(` ⚠ Failed to create DNS provider for ${rootDomain}: ${message}`);
7610
+ return records.map((r) => ({
7611
+ ...r,
7612
+ error: message
7613
+ }));
7614
+ }
7615
+ if (!provider) return records.map((r) => ({
7616
+ ...r,
7617
+ created: false,
7618
+ existed: false
7619
+ }));
7620
+ const results = [];
7621
+ const upsertRecords = records.map((r) => ({
7622
+ name: r.subdomain,
7623
+ type: r.type,
7624
+ ttl,
7625
+ value: r.value
7626
+ }));
7627
+ try {
7628
+ const upsertResults = await provider.upsertRecords(rootDomain, upsertRecords);
7629
+ for (const [i, record] of records.entries()) {
7630
+ const result = upsertResults[i];
7631
+ if (!result) {
7632
+ results.push({
7633
+ hostname: record.hostname,
7634
+ subdomain: record.subdomain,
7635
+ type: record.type,
7636
+ value: record.value,
7637
+ appName: record.appName,
7638
+ error: "No result returned from provider"
7639
+ });
7640
+ continue;
7641
+ }
7642
+ if (result.unchanged) results.push({
7643
+ hostname: record.hostname,
7644
+ subdomain: record.subdomain,
7645
+ type: record.type,
7646
+ value: record.value,
7647
+ appName: record.appName,
7648
+ existed: true,
7649
+ created: false
7650
+ });
7651
+ else results.push({
7652
+ hostname: record.hostname,
7653
+ subdomain: record.subdomain,
7654
+ type: record.type,
7655
+ value: record.value,
7656
+ appName: record.appName,
7657
+ created: result.created,
7658
+ existed: !result.created
7659
+ });
7660
+ }
7661
+ } catch (error) {
7662
+ const message = error instanceof Error ? error.message : "Unknown error";
7663
+ logger$1.log(` ⚠ Failed to create DNS records for ${rootDomain}: ${message}`);
7664
+ return records.map((r) => ({
7665
+ hostname: r.hostname,
7666
+ subdomain: r.subdomain,
7667
+ type: r.type,
7668
+ value: r.value,
7669
+ appName: r.appName,
7670
+ error: message
7671
+ }));
7672
+ }
7673
+ return results;
7674
+ }
7675
+ /**
7676
+ * Main DNS orchestration function for deployments
7677
+ *
7678
+ * Supports both legacy single-domain format and new multi-domain format:
7679
+ * - Legacy: { provider: 'hostinger', domain: 'example.com' }
7680
+ * - Multi: { 'example.com': { provider: 'hostinger' }, 'example.dev': { provider: 'route53' } }
7681
+ *
7682
+ * @param appHostnames - Map of app names to hostnames
7683
+ * @param dnsConfig - DNS configuration (legacy or multi-domain)
7684
+ * @param dokployEndpoint - Dokploy server endpoint to resolve IP from
7685
+ * @param state - Optional state to save created records for later deletion
7686
+ */
7687
+ async function orchestrateDns(appHostnames, dnsConfig, dokployEndpoint, state) {
7688
+ if (!dnsConfig) return null;
7689
+ const normalizedConfig = normalizeDnsConfig(dnsConfig);
7690
+ logger$1.log("\n🌐 Setting up DNS records...");
7691
+ let serverIp;
7692
+ try {
7693
+ const endpointUrl = new URL(dokployEndpoint);
7694
+ serverIp = await resolveHostnameToIp(endpointUrl.hostname);
7695
+ logger$1.log(` Server IP: ${serverIp} (from ${endpointUrl.hostname})`);
7696
+ } catch (error) {
7697
+ const message = error instanceof Error ? error.message : "Unknown error";
7698
+ logger$1.log(` ⚠ Failed to resolve server IP: ${message}`);
7699
+ return null;
7700
+ }
7701
+ const groupedHostnames = groupHostnamesByDomain(appHostnames, normalizedConfig);
7702
+ if (groupedHostnames.size === 0) {
7703
+ logger$1.log(" No DNS records needed (no hostnames match configured domains)");
7704
+ return {
7705
+ records: [],
7706
+ success: true,
7707
+ serverIp
7708
+ };
7709
+ }
7710
+ const allRecords = [];
7711
+ let hasFailures = false;
7712
+ for (const [rootDomain, domainHostnames] of groupedHostnames) {
7713
+ const providerConfig = normalizedConfig[rootDomain];
7714
+ if (!providerConfig) {
7715
+ logger$1.log(` ⚠ No provider config for ${rootDomain}`);
7716
+ continue;
7717
+ }
7718
+ const providerName = typeof providerConfig.provider === "string" ? providerConfig.provider : "custom";
7719
+ const requiredRecords = generateRequiredRecords(domainHostnames, rootDomain, serverIp);
7720
+ if (requiredRecords.length === 0) continue;
7721
+ logger$1.log(` Creating DNS records for ${rootDomain} (${providerName})...`);
7722
+ const domainRecords = await createDnsRecordsForDomain(requiredRecords, rootDomain, providerConfig);
7723
+ allRecords.push(...domainRecords);
7724
+ const created = domainRecords.filter((r) => r.created).length;
7725
+ const existed = domainRecords.filter((r) => r.existed).length;
7726
+ const failed = domainRecords.filter((r) => r.error).length;
7727
+ if (created > 0) logger$1.log(` ✓ Created ${created} DNS record(s) for ${rootDomain}`);
7728
+ if (existed > 0) logger$1.log(` ✓ ${existed} record(s) already exist for ${rootDomain}`);
7729
+ if (failed > 0) {
7730
+ logger$1.log(` ⚠ ${failed} record(s) failed for ${rootDomain}`);
7731
+ hasFailures = true;
7732
+ }
7733
+ if (state) {
7734
+ for (const record of domainRecords) if (record.created || record.existed) setDnsRecord(state, {
7735
+ domain: rootDomain,
7736
+ name: record.subdomain,
7737
+ type: record.type,
7738
+ value: record.value,
7739
+ ttl: "ttl" in providerConfig && providerConfig.ttl ? providerConfig.ttl : 300
7740
+ });
7741
+ }
7742
+ printDnsRecordsTable(domainRecords, rootDomain);
7743
+ if (providerConfig.provider === "manual" || failed > 0) printDnsRecordsSimple(domainRecords.filter((r) => !r.created && !r.existed), rootDomain);
7744
+ }
7745
+ return {
7746
+ records: allRecords,
7747
+ success: !hasFailures,
7748
+ serverIp
7749
+ };
7750
+ }
7751
+ /**
7752
+ * Verify DNS records resolve correctly after deployment.
7753
+ *
7754
+ * This function:
7755
+ * 1. Checks state for previously verified hostnames (skips if already verified with same IP)
7756
+ * 2. Attempts to resolve each hostname to an IP
7757
+ * 3. Compares resolved IP with expected server IP
7758
+ * 4. Updates state with verification results
7759
+ *
7760
+ * @param appHostnames - Map of app names to hostnames
7761
+ * @param serverIp - Expected IP address the hostnames should resolve to
7762
+ * @param state - Deploy state for caching verification results
7763
+ * @returns Array of verification results
7764
+ */
7765
+ async function verifyDnsRecords(appHostnames, serverIp, state) {
7766
+ const results = [];
7767
+ logger$1.log("\n🔍 Verifying DNS records...");
7768
+ for (const [appName, hostname] of appHostnames) {
7769
+ if (isDnsVerified(state, hostname, serverIp)) {
7770
+ logger$1.log(` ✓ ${hostname} (previously verified)`);
7771
+ results.push({
7772
+ hostname,
7773
+ appName,
7774
+ verified: true,
7775
+ expectedIp: serverIp,
7776
+ skipped: true
7777
+ });
7778
+ continue;
7779
+ }
7780
+ try {
7781
+ const resolvedIp = await resolveHostnameToIp(hostname);
7782
+ if (resolvedIp === serverIp) {
7783
+ setDnsVerification(state, hostname, serverIp);
7784
+ logger$1.log(` ✓ ${hostname} → ${resolvedIp}`);
7785
+ results.push({
7786
+ hostname,
7787
+ appName,
7788
+ verified: true,
7789
+ resolvedIp,
7790
+ expectedIp: serverIp
7791
+ });
7792
+ } else {
7793
+ logger$1.log(` ⚠ ${hostname} resolves to ${resolvedIp}, expected ${serverIp}`);
7794
+ results.push({
7795
+ hostname,
7796
+ appName,
7797
+ verified: false,
7798
+ resolvedIp,
7799
+ expectedIp: serverIp
7800
+ });
7801
+ }
7802
+ } catch (error) {
7803
+ const message = error instanceof Error ? error.message : "Unknown error";
7804
+ logger$1.log(` ⚠ ${hostname} DNS not propagated (${message})`);
7805
+ results.push({
7806
+ hostname,
7807
+ appName,
7808
+ verified: false,
7809
+ expectedIp: serverIp,
7810
+ error: message
7811
+ });
7812
+ }
7813
+ }
7814
+ const verified = results.filter((r) => r.verified).length;
7815
+ const skipped = results.filter((r) => r.skipped).length;
7816
+ const pending = results.filter((r) => !r.verified).length;
7817
+ if (pending > 0) {
7818
+ logger$1.log(`\n ${verified} verified, ${pending} pending propagation`);
7819
+ logger$1.log(" DNS changes may take 5-30 minutes to propagate");
7820
+ } else if (skipped > 0) logger$1.log(` ${verified} verified (${skipped} from cache)`);
7821
+ return results;
7822
+ }
7823
+ //#endregion
7240
7824
  //#region src/docker/imageRef.ts
7241
7825
  /**
7242
7826
  * An image reference, checked before it reaches `docker`.
@@ -7720,155 +8304,6 @@ var DeployJournal = class DeployJournal {
7720
8304
  }
7721
8305
  };
7722
8306
  //#endregion
7723
- //#region src/deploy/state.ts
7724
- /**
7725
- * Deploy state management for Dokploy deployments
7726
- *
7727
- * Stores resource IDs (applications, services) per stage to avoid
7728
- * re-creating resources on subsequent deploys.
7729
- */
7730
- /**
7731
- * Create a new empty state for a stage
7732
- */
7733
- function createEmptyState(stage, projectId, environmentId) {
7734
- return {
7735
- provider: "dokploy",
7736
- stage,
7737
- projectId,
7738
- environmentId,
7739
- applications: {},
7740
- services: {},
7741
- lastDeployedAt: (/* @__PURE__ */ new Date()).toISOString()
7742
- };
7743
- }
7744
- /**
7745
- * Set application ID in state (mutates state)
7746
- */
7747
- function setApplicationId(state, appName, applicationId) {
7748
- state.applications[appName] = applicationId;
7749
- }
7750
- /** Two records naming the same image: by digest when both have one. */
7751
- function sameImage(a, b) {
7752
- return a.digest && b.digest ? a.digest === b.digest : a.ref === b.ref;
7753
- }
7754
- /** The newest release in `history` after `index` that a rollback may restore. */
7755
- function restorable(history, index, current) {
7756
- return history.slice(index + 1).find((entry) => !entry.rolledBack && !sameImage(entry, current));
7757
- }
7758
- /**
7759
- * Record that `image` went live for `appName` (mutates state): it becomes
7760
- * `current`, and what was current becomes `previous`. Releasing what already
7761
- * runs — a redeploy of the same digest — changes nothing.
7762
- */
7763
- function recordRelease(state, appName, image, releasedAt = /* @__PURE__ */ new Date()) {
7764
- const releases = state.releases?.[appName];
7765
- if (releases && sameImage(releases.current, image)) return;
7766
- const entry = {
7767
- ...image,
7768
- releasedAt: releasedAt.toISOString()
7769
- };
7770
- const history = [entry, ...releases?.history ?? []].slice(0, 10);
7771
- const previous = releases?.current;
7772
- state.releases = {
7773
- ...state.releases,
7774
- [appName]: {
7775
- current: entry,
7776
- ...previous ? { previous } : {},
7777
- history
7778
- }
7779
- };
7780
- }
7781
- /**
7782
- * Record that `appName` was rolled back to `to` (mutates state): every
7783
- * release newer than it is marked rolled back, so neither this rollback nor
7784
- * a later one restores it, and `previous` moves to the release before `to`.
7785
- */
7786
- function recordRollback(state, appName, to) {
7787
- const releases = state.releases?.[appName];
7788
- if (!releases) return;
7789
- const index = releases.history.findIndex((entry) => !entry.rolledBack && sameImage(entry, to));
7790
- if (index === -1) return;
7791
- const history = releases.history.map((entry, i) => i < index ? {
7792
- ...entry,
7793
- rolledBack: true
7794
- } : entry);
7795
- const current = history[index];
7796
- const previous = restorable(history, index, current);
7797
- state.releases = {
7798
- ...state.releases,
7799
- [appName]: {
7800
- current,
7801
- ...previous ? { previous } : {},
7802
- history
7803
- }
7804
- };
7805
- }
7806
- /**
7807
- * Get a generated secret for an app
7808
- */
7809
- function getGeneratedSecret(state, appName, secretName) {
7810
- return state?.generatedSecrets?.[appName]?.[secretName];
7811
- }
7812
- /**
7813
- * Set a generated secret for an app (mutates state)
7814
- */
7815
- function setGeneratedSecret(state, appName, secretName, value) {
7816
- if (!state.generatedSecrets) state.generatedSecrets = {};
7817
- if (!state.generatedSecrets[appName]) state.generatedSecrets[appName] = {};
7818
- state.generatedSecrets[appName][secretName] = value;
7819
- }
7820
- /**
7821
- * Set DNS verification record for a hostname (mutates state)
7822
- */
7823
- function setDnsVerification(state, hostname, serverIp) {
7824
- if (!state.dnsVerified) state.dnsVerified = {};
7825
- state.dnsVerified[hostname] = {
7826
- serverIp,
7827
- verifiedAt: (/* @__PURE__ */ new Date()).toISOString()
7828
- };
7829
- }
7830
- /**
7831
- * Check if a hostname is already verified with the given IP
7832
- */
7833
- function isDnsVerified(state, hostname, serverIp) {
7834
- return (state?.dnsVerified?.[hostname])?.serverIp === serverIp;
7835
- }
7836
- /**
7837
- * Get the key for a DNS record in state
7838
- */
7839
- function getDnsRecordKey(name, type) {
7840
- return `${name}:${type}`;
7841
- }
7842
- /**
7843
- * Set a created DNS record in state (mutates state)
7844
- */
7845
- function setDnsRecord(state, record) {
7846
- if (!state.dnsRecords) state.dnsRecords = {};
7847
- const key = getDnsRecordKey(record.name, record.type);
7848
- state.dnsRecords[key] = {
7849
- ...record,
7850
- createdAt: (/* @__PURE__ */ new Date()).toISOString()
7851
- };
7852
- }
7853
- /**
7854
- * Get backup state from state
7855
- */
7856
- function getBackupState(state) {
7857
- return state?.backups;
7858
- }
7859
- /**
7860
- * Set backup state (mutates state)
7861
- */
7862
- function setBackupState(state, backupState) {
7863
- state.backups = backupState;
7864
- }
7865
- /**
7866
- * Set postgres backup ID in state (mutates state)
7867
- */
7868
- function setPostgresBackupId(state, backupId) {
7869
- if (state.backups) state.backups.postgresBackupId = backupId;
7870
- }
7871
- //#endregion
7872
8307
  //#region src/providers/aws.ts
7873
8308
  /**
7874
8309
  * The AWS account a provider provisions in — the stage's, found the way the
@@ -8064,7 +8499,7 @@ function bucketOrigins(input) {
8064
8499
  continue;
8065
8500
  }
8066
8501
  try {
8067
- const host = resolveHost(name, app, stage, workspace.deploy?.domains, isMainFrontendApp(name, app, workspace.apps));
8502
+ const host = resolveHost(name, app, stage, workspace.domains, isMainFrontendApp(name, app, workspace.apps));
8068
8503
  origins.add(`https://${host}`);
8069
8504
  } catch (error) {
8070
8505
  if (!(error instanceof NoDomainForStage)) throw error;
@@ -8506,7 +8941,7 @@ async function ensureBucketSettings(ctx, clients, input) {
8506
8941
  stage: ctx.stage,
8507
8942
  bucket: id
8508
8943
  });
8509
- if (unresolved.length > 0) ctx.log(` ${unresolved.join(", ")} ${unresolved.length === 1 ? "has" : "have"} no address on '${ctx.stage}' (deploy.domains.${ctx.stage}), so ${unresolved.length === 1 ? "is" : "are"} not in '${bucket}''s CORS`);
8944
+ if (unresolved.length > 0) ctx.log(` ${unresolved.join(", ")} ${unresolved.length === 1 ? "has" : "have"} no address on '${ctx.stage}' (domains.${ctx.stage}), so ${unresolved.length === 1 ? "is" : "are"} not in '${bucket}''s CORS`);
8510
8945
  if (origins.length === 0) return;
8511
8946
  const rule = corsRule(origins);
8512
8947
  const cors = await read(() => s3.send(new S3.GetBucketCorsCommand({ Bucket })), ["NoSuchCORSConfiguration"]);
@@ -9103,6 +9538,12 @@ Object.defineProperty(exports, "DevServicesNeedServerTarget", {
9103
9538
  return DevServicesNeedServerTarget;
9104
9539
  }
9105
9540
  });
9541
+ Object.defineProperty(exports, "DnsRecordsUnreadable", {
9542
+ enumerable: true,
9543
+ get: function() {
9544
+ return DnsRecordsUnreadable;
9545
+ }
9546
+ });
9106
9547
  Object.defineProperty(exports, "DockerBuildFailed", {
9107
9548
  enumerable: true,
9108
9549
  get: function() {
@@ -9385,6 +9826,12 @@ Object.defineProperty(exports, "createCredentialsPreload", {
9385
9826
  return createCredentialsPreload;
9386
9827
  }
9387
9828
  });
9829
+ Object.defineProperty(exports, "createDnsProvider", {
9830
+ enumerable: true,
9831
+ get: function() {
9832
+ return createDnsProvider;
9833
+ }
9834
+ });
9388
9835
  Object.defineProperty(exports, "createEmptyState", {
9389
9836
  enumerable: true,
9390
9837
  get: function() {
@@ -9475,6 +9922,12 @@ Object.defineProperty(exports, "externalServices", {
9475
9922
  return externalServices;
9476
9923
  }
9477
9924
  });
9925
+ Object.defineProperty(exports, "extractSubdomain", {
9926
+ enumerable: true,
9927
+ get: function() {
9928
+ return extractSubdomain;
9929
+ }
9930
+ });
9478
9931
  Object.defineProperty(exports, "fakeKey", {
9479
9932
  enumerable: true,
9480
9933
  get: function() {
@@ -9493,6 +9946,12 @@ Object.defineProperty(exports, "findBuildRoot", {
9493
9946
  return findBuildRoot;
9494
9947
  }
9495
9948
  });
9949
+ Object.defineProperty(exports, "findRootDomain", {
9950
+ enumerable: true,
9951
+ get: function() {
9952
+ return findRootDomain;
9953
+ }
9954
+ });
9496
9955
  Object.defineProperty(exports, "forgetState", {
9497
9956
  enumerable: true,
9498
9957
  get: function() {
@@ -9553,12 +10012,6 @@ Object.defineProperty(exports, "initStageSecrets", {
9553
10012
  return initStageSecrets;
9554
10013
  }
9555
10014
  });
9556
- Object.defineProperty(exports, "isDnsVerified", {
9557
- enumerable: true,
9558
- get: function() {
9559
- return isDnsVerified;
9560
- }
9561
- });
9562
10015
  Object.defineProperty(exports, "isImageBuild", {
9563
10016
  enumerable: true,
9564
10017
  get: function() {
@@ -9673,6 +10126,18 @@ Object.defineProperty(exports, "newLockHolder", {
9673
10126
  return newLockHolder;
9674
10127
  }
9675
10128
  });
10129
+ Object.defineProperty(exports, "normalizeDnsConfig", {
10130
+ enumerable: true,
10131
+ get: function() {
10132
+ return normalizeDnsConfig;
10133
+ }
10134
+ });
10135
+ Object.defineProperty(exports, "orchestrateDns", {
10136
+ enumerable: true,
10137
+ get: function() {
10138
+ return orchestrateDns;
10139
+ }
10140
+ });
9676
10141
  Object.defineProperty(exports, "ownershipMarker", {
9677
10142
  enumerable: true,
9678
10143
  get: function() {
@@ -9871,18 +10336,6 @@ Object.defineProperty(exports, "setBackupState", {
9871
10336
  return setBackupState;
9872
10337
  }
9873
10338
  });
9874
- Object.defineProperty(exports, "setDnsRecord", {
9875
- enumerable: true,
9876
- get: function() {
9877
- return setDnsRecord;
9878
- }
9879
- });
9880
- Object.defineProperty(exports, "setDnsVerification", {
9881
- enumerable: true,
9882
- get: function() {
9883
- return setDnsVerification;
9884
- }
9885
- });
9886
10339
  Object.defineProperty(exports, "setGeneratedSecret", {
9887
10340
  enumerable: true,
9888
10341
  get: function() {
@@ -9973,6 +10426,12 @@ Object.defineProperty(exports, "validateImageRef", {
9973
10426
  return validateImageRef;
9974
10427
  }
9975
10428
  });
10429
+ Object.defineProperty(exports, "verifyDnsRecords", {
10430
+ enumerable: true,
10431
+ get: function() {
10432
+ return verifyDnsRecords;
10433
+ }
10434
+ });
9976
10435
  Object.defineProperty(exports, "verifyStageProviders", {
9977
10436
  enumerable: true,
9978
10437
  get: function() {
@@ -10046,4 +10505,4 @@ Object.defineProperty(exports, "workspace_exports", {
10046
10505
  }
10047
10506
  });
10048
10507
 
10049
- //# sourceMappingURL=seeds-CsI0A_Ef.cjs.map
10508
+ //# sourceMappingURL=seeds-CN6tB-va.cjs.map