@geekmidas/cli 10.0.0-alpha.1 → 10.0.0-alpha.100

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 (491) hide show
  1. package/README.md +326 -421
  2. package/bin/adjacent-tsconfig.mjs +97 -0
  3. package/bin/gkm.mjs +16 -2
  4. package/bin/owning-tsconfig-jsx-register.mjs +18 -0
  5. package/bin/owning-tsconfig-jsx.mjs +108 -0
  6. package/dist/EndpointGenerator-Br97xgs_.mjs +1031 -0
  7. package/dist/EndpointGenerator-Br97xgs_.mjs.map +1 -0
  8. package/dist/EndpointGenerator-By5_tYE9.cjs +1090 -0
  9. package/dist/EndpointGenerator-By5_tYE9.cjs.map +1 -0
  10. package/dist/GoDaddyProvider-CVnzcWX5.mjs +388 -0
  11. package/dist/GoDaddyProvider-CVnzcWX5.mjs.map +1 -0
  12. package/dist/GoDaddyProvider-DS4Wgu0c.cjs +388 -0
  13. package/dist/GoDaddyProvider-DS4Wgu0c.cjs.map +1 -0
  14. package/dist/{HostingerProvider-Cft7lEYr.mjs → HostingerProvider-BNpS9aRJ.mjs} +29 -25
  15. package/dist/HostingerProvider-BNpS9aRJ.mjs.map +1 -0
  16. package/dist/{HostingerProvider-h3EbEp-Z.cjs → HostingerProvider-DR1iws1P.cjs} +29 -25
  17. package/dist/HostingerProvider-DR1iws1P.cjs.map +1 -0
  18. package/dist/LegacyStateStore-C2Xlqy4v.mjs +124 -0
  19. package/dist/LegacyStateStore-C2Xlqy4v.mjs.map +1 -0
  20. package/dist/LegacyStateStore-CoHPQMLO.cjs +124 -0
  21. package/dist/LegacyStateStore-CoHPQMLO.cjs.map +1 -0
  22. package/dist/LocalStateStore-BGDzf2f8.cjs +178 -0
  23. package/dist/LocalStateStore-BGDzf2f8.cjs.map +1 -0
  24. package/dist/LocalStateStore-By59pUve.mjs +167 -0
  25. package/dist/LocalStateStore-By59pUve.mjs.map +1 -0
  26. package/dist/OpenApiTsGenerator-BgSX_Z-e.cjs +541 -0
  27. package/dist/OpenApiTsGenerator-BgSX_Z-e.cjs.map +1 -0
  28. package/dist/OpenApiTsGenerator-C8aTX--y.mjs +536 -0
  29. package/dist/OpenApiTsGenerator-C8aTX--y.mjs.map +1 -0
  30. package/dist/{Route53Provider-di2fMM5N.cjs → Route53Provider-Bllus2NR.cjs} +21 -22
  31. package/dist/Route53Provider-Bllus2NR.cjs.map +1 -0
  32. package/dist/{Route53Provider-RdpUDJQk.mjs → Route53Provider-QXxjkZO1.mjs} +13 -13
  33. package/dist/Route53Provider-QXxjkZO1.mjs.map +1 -0
  34. package/dist/S3StateStore-CU485pYn.mjs +223 -0
  35. package/dist/S3StateStore-CU485pYn.mjs.map +1 -0
  36. package/dist/S3StateStore-Re4LfDTl.cjs +222 -0
  37. package/dist/S3StateStore-Re4LfDTl.cjs.map +1 -0
  38. package/dist/SSMStateStore-BquRBbUG.mjs +205 -0
  39. package/dist/SSMStateStore-BquRBbUG.mjs.map +1 -0
  40. package/dist/SSMStateStore-CLX4Dm5d.cjs +204 -0
  41. package/dist/SSMStateStore-CLX4Dm5d.cjs.map +1 -0
  42. package/dist/SubscriberGenerator-1-IsjIwF.mjs +449 -0
  43. package/dist/SubscriberGenerator-1-IsjIwF.mjs.map +1 -0
  44. package/dist/SubscriberGenerator-BlIOdbi-.cjs +490 -0
  45. package/dist/SubscriberGenerator-BlIOdbi-.cjs.map +1 -0
  46. package/dist/add-Blv6Q_YA.mjs +718 -0
  47. package/dist/add-Blv6Q_YA.mjs.map +1 -0
  48. package/dist/add-C6RhiCBX.cjs +720 -0
  49. package/dist/add-C6RhiCBX.cjs.map +1 -0
  50. package/dist/appPorts-C9z9Pzn9.mjs +223 -0
  51. package/dist/appPorts-C9z9Pzn9.mjs.map +1 -0
  52. package/dist/appPorts-Cu79hJF6.cjs +264 -0
  53. package/dist/appPorts-Cu79hJF6.cjs.map +1 -0
  54. package/dist/aws-8QQ8n-t6.mjs +89 -0
  55. package/dist/aws-8QQ8n-t6.mjs.map +1 -0
  56. package/dist/aws-DY9NqQIT.cjs +100 -0
  57. package/dist/aws-DY9NqQIT.cjs.map +1 -0
  58. package/dist/awsStore-Bx5nCFnS.mjs +121 -0
  59. package/dist/awsStore-Bx5nCFnS.mjs.map +1 -0
  60. package/dist/awsStore-u3ehhMoY.cjs +138 -0
  61. package/dist/awsStore-u3ehhMoY.cjs.map +1 -0
  62. package/dist/{backup-provisioner-Bgj5Vi_L.mjs → backup-provisioner-C8DnCmxK.mjs} +11 -8
  63. package/dist/backup-provisioner-C8DnCmxK.mjs.map +1 -0
  64. package/dist/{backup-provisioner-BrsHwYG0.cjs → backup-provisioner-oDEsPj02.cjs} +22 -20
  65. package/dist/backup-provisioner-oDEsPj02.cjs.map +1 -0
  66. package/dist/backups/runner.cjs +519 -0
  67. package/dist/backups/runner.cjs.map +1 -0
  68. package/dist/backups/runner.d.cts +102 -0
  69. package/dist/backups/runner.d.cts.map +1 -0
  70. package/dist/backups/runner.d.mts +102 -0
  71. package/dist/backups/runner.d.mts.map +1 -0
  72. package/dist/backups/runner.mjs +506 -0
  73. package/dist/backups/runner.mjs.map +1 -0
  74. package/dist/{bundler-Be8Zg4Wd.mjs → bundler-Cquc0e8N.mjs} +36 -32
  75. package/dist/bundler-Cquc0e8N.mjs.map +1 -0
  76. package/dist/{bundler-BY1OmV1e.cjs → bundler-DAeBIOlG.cjs} +38 -35
  77. package/dist/bundler-DAeBIOlG.cjs.map +1 -0
  78. package/dist/cli-DbeqYBTs.cjs +71 -0
  79. package/dist/cli-DbeqYBTs.cjs.map +1 -0
  80. package/dist/cli-tWfeiYmO.mjs +71 -0
  81. package/dist/cli-tWfeiYmO.mjs.map +1 -0
  82. package/dist/compose-BftbEv0b.mjs +3154 -0
  83. package/dist/compose-BftbEv0b.mjs.map +1 -0
  84. package/dist/compose-C_mfrSVH.cjs +3267 -0
  85. package/dist/compose-C_mfrSVH.cjs.map +1 -0
  86. package/dist/config-D48erO2j.d.mts +269 -0
  87. package/dist/config-D48erO2j.d.mts.map +1 -0
  88. package/dist/config-DHDtsQrB.d.cts +269 -0
  89. package/dist/config-DHDtsQrB.d.cts.map +1 -0
  90. package/dist/config.cjs +421 -11
  91. package/dist/config.cjs.map +1 -0
  92. package/dist/config.d.cts +4 -120
  93. package/dist/config.d.mts +4 -120
  94. package/dist/config.mjs +405 -4
  95. package/dist/config.mjs.map +1 -0
  96. package/dist/credentialSchemas-DDda4Mmm.cjs +272 -0
  97. package/dist/credentialSchemas-DDda4Mmm.cjs.map +1 -0
  98. package/dist/credentialSchemas-DvitraL-.mjs +237 -0
  99. package/dist/credentialSchemas-DvitraL-.mjs.map +1 -0
  100. package/dist/credentials-B5N5yKk6.mjs +267 -0
  101. package/dist/credentials-B5N5yKk6.mjs.map +1 -0
  102. package/dist/credentials-Zqr3QQYB.cjs +350 -0
  103. package/dist/credentials-Zqr3QQYB.cjs.map +1 -0
  104. package/dist/databases-BeGP5eDh.mjs +495 -0
  105. package/dist/databases-BeGP5eDh.mjs.map +1 -0
  106. package/dist/databases-DGALFDG3.cjs +598 -0
  107. package/dist/databases-DGALFDG3.cjs.map +1 -0
  108. package/dist/define-6poNqm5O.mjs +106 -0
  109. package/dist/define-6poNqm5O.mjs.map +1 -0
  110. package/dist/define-crmMcXFS.cjs +153 -0
  111. package/dist/define-crmMcXFS.cjs.map +1 -0
  112. package/dist/deploy/public.cjs +212 -0
  113. package/dist/deploy/public.cjs.map +1 -0
  114. package/dist/deploy/public.d.cts +653 -0
  115. package/dist/deploy/public.d.cts.map +1 -0
  116. package/dist/deploy/public.d.mts +653 -0
  117. package/dist/deploy/public.d.mts.map +1 -0
  118. package/dist/deploy/public.mjs +145 -0
  119. package/dist/deploy/public.mjs.map +1 -0
  120. package/dist/deploy/sniffer-envkit-patch.cjs +18 -10
  121. package/dist/deploy/sniffer-envkit-patch.cjs.map +1 -1
  122. package/dist/deploy/sniffer-envkit-patch.d.cts +0 -2
  123. package/dist/deploy/sniffer-envkit-patch.d.cts.map +1 -1
  124. package/dist/deploy/sniffer-envkit-patch.d.mts +0 -2
  125. package/dist/deploy/sniffer-envkit-patch.d.mts.map +1 -1
  126. package/dist/deploy/sniffer-envkit-patch.mjs +10 -2
  127. package/dist/deploy/sniffer-envkit-patch.mjs.map +1 -1
  128. package/dist/deploy/sniffer-envparser-worker.cjs +54 -0
  129. package/dist/deploy/sniffer-envparser-worker.cjs.map +1 -0
  130. package/dist/deploy/sniffer-envparser-worker.d.cts +1 -0
  131. package/dist/deploy/sniffer-envparser-worker.d.mts +1 -0
  132. package/dist/deploy/sniffer-envparser-worker.mjs +55 -0
  133. package/dist/deploy/sniffer-envparser-worker.mjs.map +1 -0
  134. package/dist/deploy/sniffer-hooks.cjs +13 -7
  135. package/dist/deploy/sniffer-hooks.cjs.map +1 -1
  136. package/dist/deploy/sniffer-hooks.d.cts +1 -2
  137. package/dist/deploy/sniffer-hooks.d.cts.map +1 -1
  138. package/dist/deploy/sniffer-hooks.d.mts +1 -2
  139. package/dist/deploy/sniffer-hooks.d.mts.map +1 -1
  140. package/dist/deploy/sniffer-hooks.mjs +10 -3
  141. package/dist/deploy/sniffer-hooks.mjs.map +1 -1
  142. package/dist/deploy/sniffer-loader.cjs +16 -7
  143. package/dist/deploy/sniffer-loader.cjs.map +1 -1
  144. package/dist/deploy/sniffer-loader.d.cts +1 -1
  145. package/dist/deploy/sniffer-loader.d.mts +1 -1
  146. package/dist/deploy/sniffer-loader.mjs +14 -3
  147. package/dist/deploy/sniffer-loader.mjs.map +1 -1
  148. package/dist/deploy/sniffer-routes-worker.cjs +11 -11
  149. package/dist/deploy/sniffer-routes-worker.cjs.map +1 -1
  150. package/dist/deploy/sniffer-routes-worker.d.cts +1 -1
  151. package/dist/deploy/sniffer-routes-worker.d.mts +1 -1
  152. package/dist/deploy/sniffer-routes-worker.mjs +4 -4
  153. package/dist/deploy/sniffer-routes-worker.mjs.map +1 -1
  154. package/dist/deploy/sniffer-worker.cjs +15 -6
  155. package/dist/deploy/sniffer-worker.cjs.map +1 -1
  156. package/dist/deploy/sniffer-worker.d.cts +1 -3
  157. package/dist/deploy/sniffer-worker.d.cts.map +1 -1
  158. package/dist/deploy/sniffer-worker.d.mts +1 -3
  159. package/dist/deploy/sniffer-worker.d.mts.map +1 -1
  160. package/dist/deploy/sniffer-worker.mjs +15 -4
  161. package/dist/deploy/sniffer-worker.mjs.map +1 -1
  162. package/dist/deploy-BSilGXuR.mjs +2317 -0
  163. package/dist/deploy-BSilGXuR.mjs.map +1 -0
  164. package/dist/deploy-CktQpmpU.cjs +2390 -0
  165. package/dist/deploy-CktQpmpU.cjs.map +1 -0
  166. package/dist/derive-B4vDpzgP.mjs +150 -0
  167. package/dist/derive-B4vDpzgP.mjs.map +1 -0
  168. package/dist/derive-DAbo49sm.cjs +161 -0
  169. package/dist/derive-DAbo49sm.cjs.map +1 -0
  170. package/dist/discover-BfhVW_kT.cjs +600 -0
  171. package/dist/discover-BfhVW_kT.cjs.map +1 -0
  172. package/dist/discover-CvTtV5ZD.d.cts +108 -0
  173. package/dist/discover-CvTtV5ZD.d.cts.map +1 -0
  174. package/dist/discover-W2kab9Lc.d.mts +108 -0
  175. package/dist/discover-W2kab9Lc.d.mts.map +1 -0
  176. package/dist/discover-kziEht4W.mjs +527 -0
  177. package/dist/discover-kziEht4W.mjs.map +1 -0
  178. package/dist/dns-CQZQL3gj.mjs +926 -0
  179. package/dist/dns-CQZQL3gj.mjs.map +1 -0
  180. package/dist/dns-KPxvcCdL.cjs +1057 -0
  181. package/dist/dns-KPxvcCdL.cjs.map +1 -0
  182. package/dist/dokploy-B7eMa6Pa.cjs +38 -0
  183. package/dist/dokploy-B7eMa6Pa.cjs.map +1 -0
  184. package/dist/dokploy-Dguhz3Uo.mjs +38 -0
  185. package/dist/dokploy-Dguhz3Uo.mjs.map +1 -0
  186. package/dist/drivers-BLU1fNs_.cjs +200 -0
  187. package/dist/drivers-BLU1fNs_.cjs.map +1 -0
  188. package/dist/drivers-C08LL4E8.mjs +177 -0
  189. package/dist/drivers-C08LL4E8.mjs.map +1 -0
  190. package/dist/{emit-CiZS_5Ub.mjs → emit-C1e8qD08.mjs} +13 -26
  191. package/dist/emit-C1e8qD08.mjs.map +1 -0
  192. package/dist/{emit-CbcRolsa.cjs → emit-Dmc1nvdS.cjs} +31 -57
  193. package/dist/emit-Dmc1nvdS.cjs.map +1 -0
  194. package/dist/encryption-CixpDF6e.mjs +89 -0
  195. package/dist/encryption-CixpDF6e.mjs.map +1 -0
  196. package/dist/encryption-DrhCX7G6.cjs +90 -0
  197. package/dist/encryption-DrhCX7G6.cjs.map +1 -0
  198. package/dist/engine-32gL2ju3.mjs +3082 -0
  199. package/dist/engine-32gL2ju3.mjs.map +1 -0
  200. package/dist/engine-CQgycl7o.cjs +3195 -0
  201. package/dist/engine-CQgycl7o.cjs.map +1 -0
  202. package/dist/errors-D8Gwp5kU.mjs +23 -0
  203. package/dist/errors-D8Gwp5kU.mjs.map +1 -0
  204. package/dist/errors-DMC4Umsb.cjs +34 -0
  205. package/dist/errors-DMC4Umsb.cjs.map +1 -0
  206. package/dist/github-DYQ5wvod.mjs +829 -0
  207. package/dist/github-DYQ5wvod.mjs.map +1 -0
  208. package/dist/github-DkSCUoWS.cjs +829 -0
  209. package/dist/github-DkSCUoWS.cjs.map +1 -0
  210. package/dist/identity-CBXr4wNi.mjs +129 -0
  211. package/dist/identity-CBXr4wNi.mjs.map +1 -0
  212. package/dist/identity-CbLfgQNT.cjs +182 -0
  213. package/dist/identity-CbLfgQNT.cjs.map +1 -0
  214. package/dist/{index-BThUzEIp.d.mts → index-8OfpOtSI.d.cts} +39 -24
  215. package/dist/index-8OfpOtSI.d.cts.map +1 -0
  216. package/dist/{index-CHB4tSzX.d.cts → index-Dpji6Bxq.d.mts} +39 -24
  217. package/dist/index-Dpji6Bxq.d.mts.map +1 -0
  218. package/dist/index.cjs +10483 -11859
  219. package/dist/index.cjs.map +1 -1
  220. package/dist/index.d.cts +1 -1
  221. package/dist/index.d.mts +1 -1
  222. package/dist/index.mjs +10527 -11915
  223. package/dist/index.mjs.map +1 -1
  224. package/dist/local-BwC2v2Y8.mjs +224 -0
  225. package/dist/local-BwC2v2Y8.mjs.map +1 -0
  226. package/dist/local-DNhnkugT.cjs +241 -0
  227. package/dist/local-DNhnkugT.cjs.map +1 -0
  228. package/dist/migrate-BoJxKbfR.mjs +181 -0
  229. package/dist/migrate-BoJxKbfR.mjs.map +1 -0
  230. package/dist/migrate-CJTyeBul.cjs +271 -0
  231. package/dist/migrate-CJTyeBul.cjs.map +1 -0
  232. package/dist/migrate-CxmkvMbw.mjs +266 -0
  233. package/dist/migrate-CxmkvMbw.mjs.map +1 -0
  234. package/dist/migrate-ISBZNDKU.cjs +181 -0
  235. package/dist/migrate-ISBZNDKU.cjs.map +1 -0
  236. package/dist/openapi.cjs +214 -8
  237. package/dist/openapi.cjs.map +1 -0
  238. package/dist/openapi.d.cts +72 -15
  239. package/dist/openapi.d.cts.map +1 -1
  240. package/dist/openapi.d.mts +72 -15
  241. package/dist/openapi.d.mts.map +1 -1
  242. package/dist/openapi.mjs +208 -5
  243. package/dist/openapi.mjs.map +1 -0
  244. package/dist/projectBucket-BBbQ1lHF.cjs +263 -0
  245. package/dist/projectBucket-BBbQ1lHF.cjs.map +1 -0
  246. package/dist/projectBucket-C_DN4WzF.mjs +222 -0
  247. package/dist/projectBucket-C_DN4WzF.mjs.map +1 -0
  248. package/dist/provider-BqpjG9QM.cjs +57 -0
  249. package/dist/provider-BqpjG9QM.cjs.map +1 -0
  250. package/dist/provider-CEOKk8NS.mjs +46 -0
  251. package/dist/provider-CEOKk8NS.mjs.map +1 -0
  252. package/dist/ready-BtxiI7Qb.cjs +403 -0
  253. package/dist/ready-BtxiI7Qb.cjs.map +1 -0
  254. package/dist/ready-CzHNHhI6.mjs +374 -0
  255. package/dist/ready-CzHNHhI6.mjs.map +1 -0
  256. package/dist/reconcile/public.cjs +3 -5
  257. package/dist/reconcile/public.d.cts +11 -87
  258. package/dist/reconcile/public.d.cts.map +1 -1
  259. package/dist/reconcile/public.d.mts +11 -87
  260. package/dist/reconcile/public.d.mts.map +1 -1
  261. package/dist/reconcile/public.mjs +3 -4
  262. package/dist/{reconcile-CFs8C_1a.mjs → reconcile--I7V4Klj.mjs} +4 -7
  263. package/dist/reconcile--I7V4Klj.mjs.map +1 -0
  264. package/dist/{reconcile-D0pimNiy.cjs → reconcile-CuCQBa5-.cjs} +5 -8
  265. package/dist/reconcile-CuCQBa5-.cjs.map +1 -0
  266. package/dist/resolve-Bei6BMbw.mjs +263 -0
  267. package/dist/resolve-Bei6BMbw.mjs.map +1 -0
  268. package/dist/resolve-qm7FrBj_.cjs +316 -0
  269. package/dist/resolve-qm7FrBj_.cjs.map +1 -0
  270. package/dist/rollback-BJ3H4kQ8.mjs +136 -0
  271. package/dist/rollback-BJ3H4kQ8.mjs.map +1 -0
  272. package/dist/rollback-Bt4xRXtq.cjs +165 -0
  273. package/dist/rollback-Bt4xRXtq.cjs.map +1 -0
  274. package/dist/rolldown-runtime-BhDjJH2R.mjs +15 -0
  275. package/dist/{chunk-CUT6urMc.cjs → rolldown-runtime-C0BPl7ul.cjs} +23 -10
  276. package/dist/run-BJLIerMM.mjs +133 -0
  277. package/dist/run-BJLIerMM.mjs.map +1 -0
  278. package/dist/run-fVZ-rLnc.cjs +174 -0
  279. package/dist/run-fVZ-rLnc.cjs.map +1 -0
  280. package/dist/runtime-ACdfK59n.d.cts +82 -0
  281. package/dist/runtime-ACdfK59n.d.cts.map +1 -0
  282. package/dist/runtime-YyQuekxi.d.mts +82 -0
  283. package/dist/runtime-YyQuekxi.d.mts.map +1 -0
  284. package/dist/s3-CrPoA89T.cjs +215 -0
  285. package/dist/s3-CrPoA89T.cjs.map +1 -0
  286. package/dist/s3-DQXZdmCM.mjs +215 -0
  287. package/dist/s3-DQXZdmCM.mjs.map +1 -0
  288. package/dist/sandbox/config-worker.cjs +43 -0
  289. package/dist/sandbox/config-worker.cjs.map +1 -0
  290. package/dist/sandbox/config-worker.d.cts +1 -0
  291. package/dist/sandbox/config-worker.d.mts +1 -0
  292. package/dist/sandbox/config-worker.mjs +44 -0
  293. package/dist/sandbox/config-worker.mjs.map +1 -0
  294. package/dist/sandbox/credentials-worker.cjs +54 -0
  295. package/dist/sandbox/credentials-worker.cjs.map +1 -0
  296. package/dist/sandbox/credentials-worker.d.cts +1 -0
  297. package/dist/sandbox/credentials-worker.d.mts +1 -0
  298. package/dist/sandbox/credentials-worker.mjs +55 -0
  299. package/dist/sandbox/credentials-worker.mjs.map +1 -0
  300. package/dist/sandbox/discover-worker.cjs +47 -0
  301. package/dist/sandbox/discover-worker.cjs.map +1 -0
  302. package/dist/sandbox/discover-worker.d.cts +1 -0
  303. package/dist/sandbox/discover-worker.d.mts +1 -0
  304. package/dist/sandbox/discover-worker.mjs +48 -0
  305. package/dist/sandbox/discover-worker.mjs.map +1 -0
  306. package/dist/sandbox/migrate-worker.cjs +75 -0
  307. package/dist/sandbox/migrate-worker.cjs.map +1 -0
  308. package/dist/sandbox/migrate-worker.d.cts +1 -0
  309. package/dist/sandbox/migrate-worker.d.mts +1 -0
  310. package/dist/sandbox/migrate-worker.mjs +76 -0
  311. package/dist/sandbox/migrate-worker.mjs.map +1 -0
  312. package/dist/sandbox-C4g1eG31.d.mts +104 -0
  313. package/dist/sandbox-C4g1eG31.d.mts.map +1 -0
  314. package/dist/sandbox-CHv3OYXg.cjs +165 -0
  315. package/dist/sandbox-CHv3OYXg.cjs.map +1 -0
  316. package/dist/sandbox-CbVB7uOD.mjs +118 -0
  317. package/dist/sandbox-CbVB7uOD.mjs.map +1 -0
  318. package/dist/sandbox-CdKgQ3XU.d.cts +104 -0
  319. package/dist/sandbox-CdKgQ3XU.d.cts.map +1 -0
  320. package/dist/schemas-BCwKKA42.mjs +5961 -0
  321. package/dist/schemas-BCwKKA42.mjs.map +1 -0
  322. package/dist/schemas-BQ_v0lEX.cjs +6068 -0
  323. package/dist/schemas-BQ_v0lEX.cjs.map +1 -0
  324. package/dist/secretsManager-CQORubp9.mjs +97 -0
  325. package/dist/secretsManager-CQORubp9.mjs.map +1 -0
  326. package/dist/secretsManager-RAGcEDX1.cjs +108 -0
  327. package/dist/secretsManager-RAGcEDX1.cjs.map +1 -0
  328. package/dist/seeds-CHIPcMrY.cjs +9115 -0
  329. package/dist/seeds-CHIPcMrY.cjs.map +1 -0
  330. package/dist/seeds-E4nUeXTl.mjs +8148 -0
  331. package/dist/seeds-E4nUeXTl.mjs.map +1 -0
  332. package/dist/sniffer-bUiSXLMj.mjs +1825 -0
  333. package/dist/sniffer-bUiSXLMj.mjs.map +1 -0
  334. package/dist/sniffer-n3TkX6JD.cjs +1998 -0
  335. package/dist/sniffer-n3TkX6JD.cjs.map +1 -0
  336. package/dist/sst-B-Uz4cvm.cjs +464 -0
  337. package/dist/sst-B-Uz4cvm.cjs.map +1 -0
  338. package/dist/sst-C1pxbFEd.mjs +441 -0
  339. package/dist/sst-C1pxbFEd.mjs.map +1 -0
  340. package/dist/stages-DJrOYLZ-.mjs +176 -0
  341. package/dist/stages-DJrOYLZ-.mjs.map +1 -0
  342. package/dist/stages-_3RVNG83.cjs +176 -0
  343. package/dist/stages-_3RVNG83.cjs.map +1 -0
  344. package/dist/target/public.cjs +15 -0
  345. package/dist/target/public.d.cts +28 -0
  346. package/dist/target/public.d.cts.map +1 -0
  347. package/dist/target/public.d.mts +28 -0
  348. package/dist/target/public.d.mts.map +1 -0
  349. package/dist/target/public.mjs +4 -0
  350. package/dist/terminal-Bs_lNQhL.mjs +85 -0
  351. package/dist/terminal-Bs_lNQhL.mjs.map +1 -0
  352. package/dist/terminal-CsQz4oT0.cjs +85 -0
  353. package/dist/terminal-CsQz4oT0.cjs.map +1 -0
  354. package/dist/types-B6UXlEkf.d.cts +7650 -0
  355. package/dist/types-B6UXlEkf.d.cts.map +1 -0
  356. package/dist/types-HqVPddRK.d.mts +7649 -0
  357. package/dist/types-HqVPddRK.d.mts.map +1 -0
  358. package/dist/utils-D2Nk1Nv2.cjs +205 -0
  359. package/dist/utils-D2Nk1Nv2.cjs.map +1 -0
  360. package/dist/utils-D_fxUqvU.mjs +156 -0
  361. package/dist/utils-D_fxUqvU.mjs.map +1 -0
  362. package/dist/vitest.cjs +65 -0
  363. package/dist/vitest.cjs.map +1 -0
  364. package/dist/vitest.d.cts +29 -0
  365. package/dist/vitest.d.cts.map +1 -0
  366. package/dist/vitest.d.mts +29 -0
  367. package/dist/vitest.d.mts.map +1 -0
  368. package/dist/vitest.mjs +65 -0
  369. package/dist/vitest.mjs.map +1 -0
  370. package/dist/workerRuntime-BXfhbe13.cjs +108 -0
  371. package/dist/workerRuntime-BXfhbe13.cjs.map +1 -0
  372. package/dist/workerRuntime-CsOyBRx2.mjs +79 -0
  373. package/dist/workerRuntime-CsOyBRx2.mjs.map +1 -0
  374. package/dist/workspace/index.cjs +8 -4
  375. package/dist/workspace/index.d.cts +3 -3
  376. package/dist/workspace/index.d.mts +3 -3
  377. package/dist/workspace/index.mjs +2 -3
  378. package/dist/workspace-BwqQnool.cjs +2806 -0
  379. package/dist/workspace-BwqQnool.cjs.map +1 -0
  380. package/dist/workspace-D1QbNd55.mjs +2394 -0
  381. package/dist/workspace-D1QbNd55.mjs.map +1 -0
  382. package/package.json +73 -40
  383. package/dist/CachedStateProvider-BLo7zv7S.cjs +0 -3
  384. package/dist/CachedStateProvider-BxoAm-B2.mjs +0 -3
  385. package/dist/CachedStateProvider-CqPdW7CB.cjs +0 -60
  386. package/dist/CachedStateProvider-CqPdW7CB.cjs.map +0 -1
  387. package/dist/CachedStateProvider-DTniehMP.mjs +0 -54
  388. package/dist/CachedStateProvider-DTniehMP.mjs.map +0 -1
  389. package/dist/HostingerProvider-Cft7lEYr.mjs.map +0 -1
  390. package/dist/HostingerProvider-h3EbEp-Z.cjs.map +0 -1
  391. package/dist/LocalStateProvider-Bn6tS-oL.mjs +0 -42
  392. package/dist/LocalStateProvider-Bn6tS-oL.mjs.map +0 -1
  393. package/dist/LocalStateProvider-Db9SEjyH.cjs +0 -43
  394. package/dist/LocalStateProvider-Db9SEjyH.cjs.map +0 -1
  395. package/dist/Route53Provider-RdpUDJQk.mjs.map +0 -1
  396. package/dist/Route53Provider-di2fMM5N.cjs.map +0 -1
  397. package/dist/SSMStateProvider-BRt2py-A.mjs +0 -66
  398. package/dist/SSMStateProvider-BRt2py-A.mjs.map +0 -1
  399. package/dist/SSMStateProvider-DyX8s9HI.cjs +0 -66
  400. package/dist/SSMStateProvider-DyX8s9HI.cjs.map +0 -1
  401. package/dist/backup-provisioner-Bgj5Vi_L.mjs.map +0 -1
  402. package/dist/backup-provisioner-BrsHwYG0.cjs.map +0 -1
  403. package/dist/bundler-BY1OmV1e.cjs.map +0 -1
  404. package/dist/bundler-Be8Zg4Wd.mjs.map +0 -1
  405. package/dist/chunk-Duj1WY3L.mjs +0 -7
  406. package/dist/config-D8o6I_7Z.mjs +0 -469
  407. package/dist/config-D8o6I_7Z.mjs.map +0 -1
  408. package/dist/config-DbPE1KXF.cjs +0 -535
  409. package/dist/config-DbPE1KXF.cjs.map +0 -1
  410. package/dist/config.d.cts.map +0 -1
  411. package/dist/config.d.mts.map +0 -1
  412. package/dist/credentials-B5zRHdAl.mjs +0 -141
  413. package/dist/credentials-B5zRHdAl.mjs.map +0 -1
  414. package/dist/credentials-BapzjyV5.cjs +0 -195
  415. package/dist/credentials-BapzjyV5.cjs.map +0 -1
  416. package/dist/credentials-Dh0Q6HzY.mjs +0 -2548
  417. package/dist/credentials-Dh0Q6HzY.mjs.map +0 -1
  418. package/dist/credentials-K961ThG3.cjs +0 -2680
  419. package/dist/credentials-K961ThG3.cjs.map +0 -1
  420. package/dist/discover-CAlFgYec.mjs +0 -229
  421. package/dist/discover-CAlFgYec.mjs.map +0 -1
  422. package/dist/discover-DTmFeloL.cjs +0 -271
  423. package/dist/discover-DTmFeloL.cjs.map +0 -1
  424. package/dist/dokploy-api-BS2xnJLZ.mjs +0 -3
  425. package/dist/dokploy-api-BsVH0y_s.cjs +0 -718
  426. package/dist/dokploy-api-BsVH0y_s.cjs.map +0 -1
  427. package/dist/dokploy-api-BuxDRo3l.cjs +0 -3
  428. package/dist/dokploy-api-aTFPz7_4.mjs +0 -706
  429. package/dist/dokploy-api-aTFPz7_4.mjs.map +0 -1
  430. package/dist/emit-CbcRolsa.cjs.map +0 -1
  431. package/dist/emit-CiZS_5Ub.mjs.map +0 -1
  432. package/dist/encryption-C6jaU0hE.cjs +0 -54
  433. package/dist/encryption-C6jaU0hE.cjs.map +0 -1
  434. package/dist/encryption-CHzzeR8a.cjs +0 -4
  435. package/dist/encryption-CQUncu7v.mjs +0 -3
  436. package/dist/encryption-D-abyhZx.mjs +0 -42
  437. package/dist/encryption-D-abyhZx.mjs.map +0 -1
  438. package/dist/fullstack-secrets-C-GGohke.cjs +0 -111
  439. package/dist/fullstack-secrets-C-GGohke.cjs.map +0 -1
  440. package/dist/fullstack-secrets-D1o9-G5l.mjs +0 -87
  441. package/dist/fullstack-secrets-D1o9-G5l.mjs.map +0 -1
  442. package/dist/generator-CNzBw7g5.cjs +0 -289
  443. package/dist/generator-CNzBw7g5.cjs.map +0 -1
  444. package/dist/generator-VE2JrFlY.mjs +0 -253
  445. package/dist/generator-VE2JrFlY.mjs.map +0 -1
  446. package/dist/index-BThUzEIp.d.mts.map +0 -1
  447. package/dist/index-CHB4tSzX.d.cts.map +0 -1
  448. package/dist/openapi-CgpMWMmM.mjs +0 -1962
  449. package/dist/openapi-CgpMWMmM.mjs.map +0 -1
  450. package/dist/openapi-CljONd_M.cjs +0 -1998
  451. package/dist/openapi-CljONd_M.cjs.map +0 -1
  452. package/dist/openapi-react-query-Byltvm_7.mjs +0 -167
  453. package/dist/openapi-react-query-Byltvm_7.mjs.map +0 -1
  454. package/dist/openapi-react-query-CmJ1xDbn.cjs +0 -173
  455. package/dist/openapi-react-query-CmJ1xDbn.cjs.map +0 -1
  456. package/dist/openapi-react-query.cjs +0 -4
  457. package/dist/openapi-react-query.d.cts +0 -11
  458. package/dist/openapi-react-query.d.cts.map +0 -1
  459. package/dist/openapi-react-query.d.mts +0 -11
  460. package/dist/openapi-react-query.d.mts.map +0 -1
  461. package/dist/openapi-react-query.mjs +0 -4
  462. package/dist/reconcile-CFs8C_1a.mjs.map +0 -1
  463. package/dist/reconcile-D0pimNiy.cjs.map +0 -1
  464. package/dist/setup-CJiQM2pX.cjs +0 -473
  465. package/dist/setup-CJiQM2pX.cjs.map +0 -1
  466. package/dist/setup-DMtU3p41.cjs +0 -11
  467. package/dist/setup-DOsYueeQ.mjs +0 -443
  468. package/dist/setup-DOsYueeQ.mjs.map +0 -1
  469. package/dist/setup-DSutDAlt.mjs +0 -11
  470. package/dist/storage-BJmzYxt8.cjs +0 -363
  471. package/dist/storage-BJmzYxt8.cjs.map +0 -1
  472. package/dist/storage-BM9hGpgv.cjs +0 -7
  473. package/dist/storage-Bi24WfoW.mjs +0 -297
  474. package/dist/storage-Bi24WfoW.mjs.map +0 -1
  475. package/dist/storage-CYlGwWTj.mjs +0 -3
  476. package/dist/sync-CmEuNZsB.mjs +0 -76
  477. package/dist/sync-CmEuNZsB.mjs.map +0 -1
  478. package/dist/sync-D306yOWu.cjs +0 -4
  479. package/dist/sync-SizaChmC.cjs +0 -93
  480. package/dist/sync-SizaChmC.cjs.map +0 -1
  481. package/dist/sync-hOqAWHR6.mjs +0 -3
  482. package/dist/types-C-arnQ1r.d.mts +0 -2184
  483. package/dist/types-C-arnQ1r.d.mts.map +0 -1
  484. package/dist/types-abJQuk7m.d.cts +0 -2184
  485. package/dist/types-abJQuk7m.d.cts.map +0 -1
  486. package/dist/workspace-7FqprxuJ.mjs +0 -4323
  487. package/dist/workspace-7FqprxuJ.mjs.map +0 -1
  488. package/dist/workspace-8acupeaI.cjs +0 -9
  489. package/dist/workspace-XvqO9jIv.cjs +0 -4472
  490. package/dist/workspace-XvqO9jIv.cjs.map +0 -1
  491. package/dist/workspace-yP5AHnrn.mjs +0 -8
@@ -0,0 +1,204 @@
1
+ const require_sniffer = require("./sniffer-n3TkX6JD.cjs");
2
+ let _aws_sdk_client_ssm = require("@aws-sdk/client-ssm");
3
+ //#region src/deploy/SSMStateStore.ts
4
+ /**
5
+ * AWS SSM Parameter Store state store.
6
+ *
7
+ * - `/gkm/<workspace>/<stage>/state`: the state, a SecureString.
8
+ * - `/gkm/<workspace>/<stage>/lock`: the lock, created only if absent.
9
+ * - `/gkm/<workspace>/<stage>/state.v1`: the v1 state, kept on migration.
10
+ *
11
+ * SSM has no conditional put, so a write checks the parameter's version
12
+ * before it puts, and checks the version the put returns after: a put that
13
+ * did not land exactly one version above the one it was based on raced
14
+ * another writer, and raises `StateVersionConflict` rather than reporting
15
+ * success. Both writes stay in the parameter's history.
16
+ *
17
+ * Size: the state is written with the Intelligent-Tiering tier, so SSM picks
18
+ * the advanced tier (8 KB) once a value passes the standard tier's 4 KB, and a
19
+ * document over {@link SSM_COMPRESS_OVER} bytes is stored gzipped, as `gz:`
20
+ * and base64. Both forms are read, so a document written before either is
21
+ * read as it was. A deploy checks before it starts that the stage's document
22
+ * leaves room under {@link SSM_MAX_BYTES} (`assertStateRoom`); a write SSM
23
+ * refuses anyway raises `StateRejectedBySsm` rather than the SDK's error.
24
+ */
25
+ /** The most an advanced-tier parameter holds — what the state must fit. */
26
+ const SSM_MAX_BYTES = 8192;
27
+ /**
28
+ * `body` as the state parameter stores it: past the threshold, without its
29
+ * indentation and compressed.
30
+ */
31
+ function packSsmBody(body) {
32
+ if (Buffer.byteLength(body) <= 3072) return body;
33
+ let compact = body;
34
+ try {
35
+ compact = JSON.stringify(JSON.parse(body));
36
+ } catch {}
37
+ return require_sniffer.compressBody(compact);
38
+ }
39
+ /** A refusal of the value itself — its size, past the tier's limit. */
40
+ function refusedValue(error) {
41
+ return error?.name === "ValidationException";
42
+ }
43
+ var SSMStateStore = class SSMStateStore extends require_sniffer.DocumentStateStore {
44
+ workspaceName;
45
+ client;
46
+ region;
47
+ constructor(workspaceName, client, region = "<region>") {
48
+ super();
49
+ this.workspaceName = workspaceName;
50
+ this.client = client;
51
+ this.region = region;
52
+ }
53
+ static create(options) {
54
+ const config = {
55
+ region: options.region,
56
+ endpoint: options.endpoint
57
+ };
58
+ if (options.profile) {
59
+ const { fromIni } = require("@aws-sdk/credential-providers");
60
+ config.credentials = fromIni({ profile: options.profile });
61
+ } else if (options.credentials) config.credentials = options.credentials;
62
+ return new SSMStateStore(options.workspaceName, new _aws_sdk_client_ssm.SSMClient(config), options.region);
63
+ }
64
+ name(stage, leaf) {
65
+ return `/gkm/${this.workspaceName}/${stage}/${leaf}`;
66
+ }
67
+ location(stage) {
68
+ return `ssm:${this.name(stage, "state")}`;
69
+ }
70
+ async readRaw(stage) {
71
+ const parameter = await this.get(this.name(stage, "state"));
72
+ if (!parameter) return null;
73
+ return {
74
+ body: require_sniffer.decompressBody(parameter.value),
75
+ version: String(parameter.version)
76
+ };
77
+ }
78
+ /** The stage's document as the next write would store it. */
79
+ async capacity(stage) {
80
+ const raw = await this.readRaw(stage);
81
+ if (!raw) return null;
82
+ return {
83
+ bytes: Buffer.byteLength(packSsmBody(raw.body)),
84
+ limit: SSM_MAX_BYTES,
85
+ location: this.location(stage),
86
+ region: this.region
87
+ };
88
+ }
89
+ async writeRaw(stage, document, expectedVersion) {
90
+ try {
91
+ return await this.put(stage, packSsmBody(document), expectedVersion);
92
+ } catch (error) {
93
+ if (!refusedValue(error)) throw error;
94
+ throw new require_sniffer.StateRejectedBySsm(stage, Buffer.byteLength(packSsmBody(document)), this.location(stage), this.region, error);
95
+ }
96
+ }
97
+ /** The conditional put of `body`, stored as it is given. */
98
+ async put(stage, body, expectedVersion) {
99
+ const Name = this.name(stage, "state");
100
+ const Description = `GKM deployment state for ${this.workspaceName}/${stage}`;
101
+ if (expectedVersion === null) try {
102
+ const { Version } = await this.client.send(new _aws_sdk_client_ssm.PutParameterCommand({
103
+ Name,
104
+ Value: body,
105
+ Type: "SecureString",
106
+ Tier: "Intelligent-Tiering",
107
+ Description
108
+ }));
109
+ return String(Version);
110
+ } catch (error) {
111
+ if (error instanceof _aws_sdk_client_ssm.ParameterAlreadyExists) {
112
+ const current = await this.get(Name);
113
+ throw new require_sniffer.StateVersionConflict(stage, null, current ? String(current.version) : null);
114
+ }
115
+ throw error;
116
+ }
117
+ const current = await this.get(Name);
118
+ const actual = current ? String(current.version) : null;
119
+ if (actual !== expectedVersion) throw new require_sniffer.StateVersionConflict(stage, expectedVersion, actual);
120
+ const { Version } = await this.client.send(new _aws_sdk_client_ssm.PutParameterCommand({
121
+ Name,
122
+ Value: body,
123
+ Type: "SecureString",
124
+ Tier: "Intelligent-Tiering",
125
+ Overwrite: true,
126
+ Description
127
+ }));
128
+ if (Version !== Number(expectedVersion) + 1) throw new require_sniffer.StateVersionConflict(stage, expectedVersion, String((Version ?? 1) - 1));
129
+ const landed = await this.get(Name);
130
+ if (landed && landed.version === Version && landed.value !== body) throw new require_sniffer.StateVersionConflict(stage, expectedVersion, String(Version));
131
+ return String(Version);
132
+ }
133
+ async writeV1Backup(stage, body) {
134
+ try {
135
+ await this.client.send(new _aws_sdk_client_ssm.PutParameterCommand({
136
+ Name: this.name(stage, "state.v1"),
137
+ Value: packSsmBody(body),
138
+ Type: "SecureString",
139
+ Tier: "Intelligent-Tiering",
140
+ Description: `GKM v1 deployment state for ${this.workspaceName}/${stage}, kept on migration`
141
+ }));
142
+ } catch (error) {
143
+ if (!(error instanceof _aws_sdk_client_ssm.ParameterAlreadyExists)) throw error;
144
+ }
145
+ }
146
+ async createLock(stage, holder) {
147
+ const Name = this.name(stage, "lock");
148
+ try {
149
+ await this.client.send(new _aws_sdk_client_ssm.PutParameterCommand({
150
+ Name,
151
+ Value: JSON.stringify(holder),
152
+ Type: "String",
153
+ Description: `GKM deploy lock for ${this.workspaceName}/${stage}`
154
+ }));
155
+ } catch (error) {
156
+ if (error instanceof _aws_sdk_client_ssm.ParameterAlreadyExists) throw new require_sniffer.StateLocked(stage, await this.readLock(stage), `ssm:${Name}`);
157
+ throw error;
158
+ }
159
+ const created = await this.get(Name);
160
+ const recorded = created ? parseHolder(created.value) : null;
161
+ if (created?.version !== 1 || recorded?.id !== holder.id) throw new require_sniffer.StateLocked(stage, recorded, `ssm:${Name}`);
162
+ }
163
+ async readLock(stage) {
164
+ const parameter = await this.get(this.name(stage, "lock"));
165
+ return parameter ? parseHolder(parameter.value) : null;
166
+ }
167
+ async removeLock(stage, holder) {
168
+ if (holder) {
169
+ if ((await this.readLock(stage))?.id !== holder.id) return;
170
+ }
171
+ try {
172
+ await this.client.send(new _aws_sdk_client_ssm.DeleteParameterCommand({ Name: this.name(stage, "lock") }));
173
+ } catch (error) {
174
+ if (!(error instanceof _aws_sdk_client_ssm.ParameterNotFound)) throw error;
175
+ }
176
+ }
177
+ async get(Name) {
178
+ try {
179
+ const { Parameter } = await this.client.send(new _aws_sdk_client_ssm.GetParameterCommand({
180
+ Name,
181
+ WithDecryption: true
182
+ }));
183
+ if (Parameter?.Value === void 0) return null;
184
+ return {
185
+ value: Parameter.Value,
186
+ version: Parameter.Version ?? 1
187
+ };
188
+ } catch (error) {
189
+ if (error instanceof _aws_sdk_client_ssm.ParameterNotFound) return null;
190
+ throw error;
191
+ }
192
+ }
193
+ };
194
+ function parseHolder(value) {
195
+ try {
196
+ return JSON.parse(value);
197
+ } catch {
198
+ return null;
199
+ }
200
+ }
201
+ //#endregion
202
+ exports.SSMStateStore = SSMStateStore;
203
+
204
+ //# sourceMappingURL=SSMStateStore-CLX4Dm5d.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSMStateStore-CLX4Dm5d.cjs","names":["compressBody","DocumentStateStore","SSMClient","decompressBody","StateRejectedBySsm","PutParameterCommand","ParameterAlreadyExists","StateVersionConflict","StateLocked","DeleteParameterCommand","ParameterNotFound","GetParameterCommand"],"sources":["../src/deploy/SSMStateStore.ts"],"sourcesContent":["/**\n * AWS SSM Parameter Store state store.\n *\n * - `/gkm/<workspace>/<stage>/state`: the state, a SecureString.\n * - `/gkm/<workspace>/<stage>/lock`: the lock, created only if absent.\n * - `/gkm/<workspace>/<stage>/state.v1`: the v1 state, kept on migration.\n *\n * SSM has no conditional put, so a write checks the parameter's version\n * before it puts, and checks the version the put returns after: a put that\n * did not land exactly one version above the one it was based on raced\n * another writer, and raises `StateVersionConflict` rather than reporting\n * success. Both writes stay in the parameter's history.\n *\n * Size: the state is written with the Intelligent-Tiering tier, so SSM picks\n * the advanced tier (8 KB) once a value passes the standard tier's 4 KB, and a\n * document over {@link SSM_COMPRESS_OVER} bytes is stored gzipped, as `gz:`\n * and base64. Both forms are read, so a document written before either is\n * read as it was. A deploy checks before it starts that the stage's document\n * leaves room under {@link SSM_MAX_BYTES} (`assertStateRoom`); a write SSM\n * refuses anyway raises `StateRejectedBySsm` rather than the SDK's error.\n */\n\nimport {\n\tDeleteParameterCommand,\n\tGetParameterCommand,\n\tParameterAlreadyExists,\n\tParameterNotFound,\n\tPutParameterCommand,\n\tSSMClient,\n\ttype SSMClientConfig,\n} from '@aws-sdk/client-ssm';\nimport type { AwsRegion } from './StateProvider';\nimport {\n\tcompressBody,\n\tDocumentStateStore,\n\tdecompressBody,\n\ttype LockHolder,\n\ttype RawState,\n\ttype StateCapacity,\n\tStateLocked,\n\tStateRejectedBySsm,\n\ttype StateVersion,\n\tStateVersionConflict,\n} from './StateStore';\n\n/** The most an advanced-tier parameter holds — what the state must fit. */\nexport const SSM_MAX_BYTES = 8192;\n/** A body past this is stored compressed: well under the standard 4 KB. */\nexport const SSM_COMPRESS_OVER = 3072;\n\n/**\n * `body` as the state parameter stores it: past the threshold, without its\n * indentation and compressed.\n */\nexport function packSsmBody(body: string): string {\n\tif (Buffer.byteLength(body) <= SSM_COMPRESS_OVER) return body;\n\tlet compact = body;\n\ttry {\n\t\tcompact = JSON.stringify(JSON.parse(body));\n\t} catch {\n\t\t// Not JSON: stored as it was given, compressed.\n\t}\n\treturn compressBody(compact);\n}\n\n/** A refusal of the value itself — its size, past the tier's limit. */\nfunction refusedValue(error: unknown): boolean {\n\treturn (error as { name?: string })?.name === 'ValidationException';\n}\n\nexport interface SSMStateStoreOptions {\n\tworkspaceName: string;\n\tregion?: AwsRegion;\n\t/** Uses the default credential chain when omitted. */\n\tprofile?: string;\n\tcredentials?: SSMClientConfig['credentials'];\n\t/** For the local AWS emulator. */\n\tendpoint?: string;\n}\n\nexport class SSMStateStore extends DocumentStateStore {\n\tconstructor(\n\t\treadonly workspaceName: string,\n\t\tprivate readonly client: SSMClient,\n\t\t/** For messages; the client's own region is used for every call. */\n\t\treadonly region = '<region>',\n\t) {\n\t\tsuper();\n\t}\n\n\tstatic create(options: SSMStateStoreOptions): SSMStateStore {\n\t\tconst config: SSMClientConfig = {\n\t\t\tregion: options.region,\n\t\t\tendpoint: options.endpoint,\n\t\t};\n\t\tif (options.profile) {\n\t\t\t// Required lazily: only a profile needs the credential providers.\n\t\t\tconst { fromIni } = require('@aws-sdk/credential-providers');\n\t\t\tconfig.credentials = fromIni({ profile: options.profile });\n\t\t} else if (options.credentials) {\n\t\t\tconfig.credentials = options.credentials;\n\t\t}\n\t\treturn new SSMStateStore(\n\t\t\toptions.workspaceName,\n\t\t\tnew SSMClient(config),\n\t\t\toptions.region,\n\t\t);\n\t}\n\n\tprivate name(stage: string, leaf: string): string {\n\t\treturn `/gkm/${this.workspaceName}/${stage}/${leaf}`;\n\t}\n\n\tprotected location(stage: string): string {\n\t\treturn `ssm:${this.name(stage, 'state')}`;\n\t}\n\n\tprotected async readRaw(stage: string): Promise<RawState | null> {\n\t\tconst parameter = await this.get(this.name(stage, 'state'));\n\t\tif (!parameter) return null;\n\t\treturn {\n\t\t\tbody: decompressBody(parameter.value),\n\t\t\tversion: String(parameter.version),\n\t\t};\n\t}\n\n\t/** The stage's document as the next write would store it. */\n\tasync capacity(stage: string): Promise<StateCapacity | null> {\n\t\tconst raw = await this.readRaw(stage);\n\t\tif (!raw) return null;\n\t\treturn {\n\t\t\tbytes: Buffer.byteLength(packSsmBody(raw.body)),\n\t\t\tlimit: SSM_MAX_BYTES,\n\t\t\tlocation: this.location(stage),\n\t\t\tregion: this.region,\n\t\t};\n\t}\n\n\tprotected async writeRaw(\n\t\tstage: string,\n\t\tdocument: string,\n\t\texpectedVersion: StateVersion | null,\n\t): Promise<StateVersion> {\n\t\ttry {\n\t\t\treturn await this.put(stage, packSsmBody(document), expectedVersion);\n\t\t} catch (error) {\n\t\t\tif (!refusedValue(error)) throw error;\n\t\t\tthrow new StateRejectedBySsm(\n\t\t\t\tstage,\n\t\t\t\tBuffer.byteLength(packSsmBody(document)),\n\t\t\t\tthis.location(stage),\n\t\t\t\tthis.region,\n\t\t\t\terror,\n\t\t\t);\n\t\t}\n\t}\n\n\t/** The conditional put of `body`, stored as it is given. */\n\tprivate async put(\n\t\tstage: string,\n\t\tbody: string,\n\t\texpectedVersion: StateVersion | null,\n\t): Promise<StateVersion> {\n\t\tconst Name = this.name(stage, 'state');\n\t\tconst Description = `GKM deployment state for ${this.workspaceName}/${stage}`;\n\n\t\tif (expectedVersion === null) {\n\t\t\ttry {\n\t\t\t\tconst { Version } = await this.client.send(\n\t\t\t\t\tnew PutParameterCommand({\n\t\t\t\t\t\tName,\n\t\t\t\t\t\tValue: body,\n\t\t\t\t\t\tType: 'SecureString',\n\t\t\t\t\t\tTier: 'Intelligent-Tiering',\n\t\t\t\t\t\tDescription,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\treturn String(Version);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof ParameterAlreadyExists) {\n\t\t\t\t\tconst current = await this.get(Name);\n\t\t\t\t\tthrow new StateVersionConflict(\n\t\t\t\t\t\tstage,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tcurrent ? String(current.version) : null,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst current = await this.get(Name);\n\t\tconst actual = current ? String(current.version) : null;\n\t\tif (actual !== expectedVersion) {\n\t\t\tthrow new StateVersionConflict(stage, expectedVersion, actual);\n\t\t}\n\n\t\tconst { Version } = await this.client.send(\n\t\t\tnew PutParameterCommand({\n\t\t\t\tName,\n\t\t\t\tValue: body,\n\t\t\t\tType: 'SecureString',\n\t\t\t\tTier: 'Intelligent-Tiering',\n\t\t\t\tOverwrite: true,\n\t\t\t\tDescription,\n\t\t\t}),\n\t\t);\n\t\tif (Version !== Number(expectedVersion) + 1) {\n\t\t\t// Another put landed between the check and this one. Ours is now\n\t\t\t// on top, but the caller that wrote the other believes its write\n\t\t\t// is current — its next write will conflict too, so neither is\n\t\t\t// lost silently.\n\t\t\tthrow new StateVersionConflict(\n\t\t\t\tstage,\n\t\t\t\texpectedVersion,\n\t\t\t\tString((Version ?? 1) - 1),\n\t\t\t);\n\t\t}\n\n\t\t// The version alone is not enough under an emulator, and need not be\n\t\t// on SSM either: two overwrites that raced can both be answered with\n\t\t// the same version, and both would report success. If the parameter is\n\t\t// still at the version this put returned, it has to hold this body —\n\t\t// otherwise the other put is the one that stuck.\n\t\tconst landed = await this.get(Name);\n\t\tif (landed && landed.version === Version && landed.value !== body) {\n\t\t\tthrow new StateVersionConflict(stage, expectedVersion, String(Version));\n\t\t}\n\t\treturn String(Version);\n\t}\n\n\tprotected async writeV1Backup(stage: string, body: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.client.send(\n\t\t\t\tnew PutParameterCommand({\n\t\t\t\t\tName: this.name(stage, 'state.v1'),\n\t\t\t\t\t// Kept as it was — the v1 state a person restores by hand —\n\t\t\t\t\t// unless it is too big to store that way.\n\t\t\t\t\tValue: packSsmBody(body),\n\t\t\t\t\tType: 'SecureString',\n\t\t\t\t\tTier: 'Intelligent-Tiering',\n\t\t\t\t\tDescription: `GKM v1 deployment state for ${this.workspaceName}/${stage}, kept on migration`,\n\t\t\t\t}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\t// The first migration's backup is the one worth keeping.\n\t\t\tif (!(error instanceof ParameterAlreadyExists)) throw error;\n\t\t}\n\t}\n\n\tprotected async createLock(stage: string, holder: LockHolder): Promise<void> {\n\t\tconst Name = this.name(stage, 'lock');\n\t\ttry {\n\t\t\tawait this.client.send(\n\t\t\t\tnew PutParameterCommand({\n\t\t\t\t\tName,\n\t\t\t\t\tValue: JSON.stringify(holder),\n\t\t\t\t\t// A few hundred bytes: the standard tier, which costs nothing.\n\t\t\t\t\tType: 'String',\n\t\t\t\t\tDescription: `GKM deploy lock for ${this.workspaceName}/${stage}`,\n\t\t\t\t}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (error instanceof ParameterAlreadyExists) {\n\t\t\t\tthrow new StateLocked(stage, await this.readLock(stage), `ssm:${Name}`);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\n\t\t// A create-only put is atomic on SSM, so the lock is ours. Read it back\n\t\t// anyway: on a store where two racing creates can both succeed (the\n\t\t// local emulator does, a few times in a hundred) the later one has\n\t\t// overwritten the earlier — version 2, someone else's holder — and\n\t\t// taking the lock regardless would give the stage two deploys.\n\t\tconst created = await this.get(Name);\n\t\tconst recorded = created ? parseHolder(created.value) : null;\n\t\tif (created?.version !== 1 || recorded?.id !== holder.id) {\n\t\t\tthrow new StateLocked(stage, recorded, `ssm:${Name}`);\n\t\t}\n\t}\n\n\tprotected async readLock(stage: string): Promise<LockHolder | null> {\n\t\tconst parameter = await this.get(this.name(stage, 'lock'));\n\t\treturn parameter ? parseHolder(parameter.value) : null;\n\t}\n\n\tprotected async removeLock(\n\t\tstage: string,\n\t\tholder: LockHolder | null,\n\t): Promise<void> {\n\t\tif (holder) {\n\t\t\tconst current = await this.readLock(stage);\n\t\t\tif (current?.id !== holder.id) return;\n\t\t}\n\t\ttry {\n\t\t\tawait this.client.send(\n\t\t\t\tnew DeleteParameterCommand({ Name: this.name(stage, 'lock') }),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof ParameterNotFound)) throw error;\n\t\t}\n\t}\n\n\tprivate async get(\n\t\tName: string,\n\t): Promise<{ value: string; version: number } | null> {\n\t\ttry {\n\t\t\tconst { Parameter } = await this.client.send(\n\t\t\t\tnew GetParameterCommand({ Name, WithDecryption: true }),\n\t\t\t);\n\t\t\tif (Parameter?.Value === undefined) return null;\n\t\t\treturn { value: Parameter.Value, version: Parameter.Version ?? 1 };\n\t\t} catch (error) {\n\t\t\tif (error instanceof ParameterNotFound) return null;\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n\nfunction parseHolder(value: string): LockHolder | null {\n\ttry {\n\t\treturn JSON.parse(value) as LockHolder;\n\t} catch {\n\t\treturn null;\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,449 @@
1
+ import { t as GkmError } from "./errors-D8Gwp5kU.mjs";
2
+ import { n as runtimeFor } from "./EndpointGenerator-Br97xgs_.mjs";
3
+ import { u as ConstructGenerator } from "./discover-kziEht4W.mjs";
4
+ import { dirname, join, relative } from "node:path";
5
+ import { access, mkdir, writeFile } from "node:fs/promises";
6
+ import { canonicalId, kebabCase, provideKey } from "@geekmidas/manifest";
7
+ import { pathToFileURL } from "node:url";
8
+ import { Subscriber } from "@geekmidas/constructs/subscribers";
9
+ //#region src/types.ts
10
+ /** Whether `value` names a cache backend. */
11
+ function isCacheBackend(value) {
12
+ return value === "upstash" || value === "elasticache" || value === "db" || value === "redis";
13
+ }
14
+ /**
15
+ * Whether a backend holds every declared cache, a cache declared from a
16
+ * database (`database.cache('Sessions')`) included.
17
+ *
18
+ * Every other backend leaves such a cache where its declaration put it: the
19
+ * declaration is the stronger statement. The stack's own Redis is the
20
+ * exception, because a stack that runs one runs it *for* the cache — a table
21
+ * beside it would be a second cache nobody asked for.
22
+ */
23
+ function holdsEveryCache(backend) {
24
+ return backend === "redis";
25
+ }
26
+ /**
27
+ * The backend a project gets when it says nothing, by where it deploys.
28
+ *
29
+ * Flat defaults could not be right for both: `upstash` on a single box means a
30
+ * SaaS round-trip for a cache the database could have held, and `minio` on AWS
31
+ * means running a bucket beside S3. So the default is a function of the target,
32
+ * and an app that says nothing gets the obvious answer in both places — which
33
+ * is the whole of what "zero config" can mean once there is more than one
34
+ * target.
35
+ *
36
+ * `server` covers Dokploy and a bare host alike: the question these answer is
37
+ * whether the app is next to a managed cloud or next to its own containers, and
38
+ * on that question the two are the same.
39
+ *
40
+ * A per-construct, per-stage override is the layer above this — see
41
+ * `constructs-outstanding.md` — so two buckets in one app can differ. This is
42
+ * only what happens when nobody has said anything at all.
43
+ */
44
+ const DEFAULT_CACHE = {
45
+ aws: "upstash",
46
+ server: "db"
47
+ };
48
+ /**
49
+ * Which broker carries a declared queue or topic, by target.
50
+ *
51
+ * Whether there are events at all is the manifest's answer — a declared
52
+ * `Topic` or `Queue` — so this only ever answers the second question. AWS
53
+ * deploys them to SNS and SQS, and locally the AWS emulator stands in, so the
54
+ * broker a developer runs is the one production has. A server has a Postgres
55
+ * already, and pg-boss keeps its queues there.
56
+ */
57
+ const DEFAULT_EVENTS = {
58
+ aws: "sns",
59
+ server: "pgboss"
60
+ };
61
+ /** Where a bucket lives when nobody said — see {@link DEFAULT_CACHE}. */
62
+ const DEFAULT_STORAGE = {
63
+ aws: "s3",
64
+ server: "minio"
65
+ };
66
+ //#endregion
67
+ //#region src/reconcile/fakes.ts
68
+ /**
69
+ * External APIs' fakes, read from where the convention puts them.
70
+ *
71
+ * `test/fakes/<id>.ts` default-exports `fake.app(…)` or `fake.image(…)`. The
72
+ * construct never names it — that is what keeps a fake out of a deployed
73
+ * bundle — so this is the one place it is found, by the same rule that finds a
74
+ * database's factory in `test/factories/<id>.ts`.
75
+ */
76
+ /** Where a project keeps its external APIs' fakes, relative to its root. */
77
+ const DEFAULT_FAKES_DIR = "test/fakes";
78
+ /** The marker `fake.app` and `fake.image` set — the same registered symbol. */
79
+ const FAKE = Symbol.for("@geekmidas/constructs/fake");
80
+ /**
81
+ * The fake for every external API the manifest declares, keyed by id.
82
+ *
83
+ * @throws {NoFake} when an external API has no file, since a local stage would
84
+ * otherwise have nothing to call.
85
+ * @throws {NotAFake} when the file's default export is not one.
86
+ */
87
+ async function readFakes(root, manifest) {
88
+ const fakes = {};
89
+ for (const [id, declaration] of Object.entries(manifest)) {
90
+ if (declaration?.kind !== "external-api") continue;
91
+ const file = await fakeFile(join(root, DEFAULT_FAKES_DIR), id);
92
+ const value = (await import(pathToFileURL(file).href)).default;
93
+ if (!isFakeExport(value)) throw new NotAFake(file);
94
+ fakes[id] = {
95
+ file,
96
+ ...value.kind === "image" ? {
97
+ image: value.image,
98
+ port: value.port
99
+ } : {},
100
+ credentials: JSON.stringify(value.credentials)
101
+ };
102
+ }
103
+ return fakes;
104
+ }
105
+ /** The first of `<id>.ts`, `.mts`, `.js`, `.mjs` that exists. */
106
+ async function fakeFile(folder, id) {
107
+ const base = join(folder, kebabCase(id));
108
+ for (const extension of [
109
+ ".ts",
110
+ ".mts",
111
+ ".js",
112
+ ".mjs"
113
+ ]) {
114
+ const file = `${base}${extension}`;
115
+ if (await access(file).then(() => true, () => false)) return file;
116
+ }
117
+ throw new NoFake(id, `${base}.ts`);
118
+ }
119
+ function isFakeExport(value) {
120
+ return typeof value === "object" && value !== null && value[FAKE] === true;
121
+ }
122
+ /** An external API with no fake for a local stage to call. */
123
+ var NoFake = class extends GkmError {
124
+ id;
125
+ file;
126
+ constructor(id, file) {
127
+ super(`'${id}' is an external API, and a local stage calls its fake rather than the provider — but there is none. Create ${file}, default-exporting fake.app(…) or fake.image(…) from @geekmidas/constructs/external-api.`);
128
+ this.id = id;
129
+ this.file = file;
130
+ this.name = "NoFake";
131
+ }
132
+ };
133
+ /** A file in the fakes folder whose default export is not a fake. */
134
+ var NotAFake = class extends GkmError {
135
+ file;
136
+ constructor(file) {
137
+ super(`${file} is where a fake lives, and its default export is not one. Export default fake.app(handler, { credentials }) or fake.image(image, { port, credentials }).`);
138
+ this.file = file;
139
+ this.name = "NotAFake";
140
+ }
141
+ };
142
+ //#endregion
143
+ //#region src/generators/SubscriberGenerator.ts
144
+ var SubscriberGenerator = class extends ConstructGenerator {
145
+ isConstruct(value) {
146
+ return Subscriber.isSubscriber(value);
147
+ }
148
+ async build(context, constructs, outputDir, options) {
149
+ const target = options?.target ?? "aws";
150
+ const logger = console;
151
+ const subscriberInfos = [];
152
+ if (target === "server") {
153
+ await this.generateServerSubscribersFile(outputDir, constructs, context.eventsBackends?.includes("sns") ?? false);
154
+ logger.log(`Generated server subscribers file with ${constructs.length} subscribers (polling mode)`);
155
+ return subscriberInfos;
156
+ }
157
+ if (constructs.length === 0) return subscriberInfos;
158
+ const subscribersDir = join(outputDir, "subscribers");
159
+ await mkdir(subscribersDir, { recursive: true });
160
+ for (const { key, construct, path } of constructs) {
161
+ const handlerFile = await this.generateSubscriberHandler(subscribersDir, path.relative, key, construct, context, construct.owner);
162
+ subscriberInfos.push({
163
+ name: key,
164
+ handler: relative(options?.root ?? process.cwd(), handlerFile).replace(/\.ts$/, ".handler"),
165
+ subscribedEvents: construct.subscribedEvents || [],
166
+ ...construct.topicName ? {
167
+ transport: "topic",
168
+ topic: construct.topicName
169
+ } : {},
170
+ timeout: construct.timeout,
171
+ memorySize: construct.memorySize,
172
+ environment: await construct.getEnvironment({ markOptional: context.markOptional }),
173
+ dependencies: construct.constructs
174
+ });
175
+ logger.log(`Generated subscriber handler: ${key}`);
176
+ }
177
+ return subscriberInfos;
178
+ }
179
+ async generateSubscriberHandler(outputDir, sourceFile, exportName, _subscriber, context, owner) {
180
+ const handlerFileName = `${exportName}.ts`;
181
+ const handlerPath = join(outputDir, handlerFileName);
182
+ const importPath = relative(dirname(handlerPath), sourceFile).replace(/\.ts$/, ".js");
183
+ const runtime = runtimeFor(context, dirname(handlerPath), owner);
184
+ const content = `import { AWSLambdaSubscriber } from '@geekmidas/constructs/aws';
185
+ import { ${exportName} } from '${importPath}';
186
+ ${runtime.imports}
187
+ ${context.storageDrivers?.imports ?? ""}
188
+ ${runtime.bindings}
189
+ ${context.storageDrivers?.setup ? `\n// The handler registers the drivers its target needs.\n${context.storageDrivers.setup}\n` : ""}
190
+ const adapter = new AWSLambdaSubscriber(envParser, ${exportName});
191
+
192
+ export const handler = adapter.handler;
193
+ `;
194
+ await writeFile(handlerPath, content);
195
+ return handlerPath;
196
+ }
197
+ async generateServerSubscribersFile(outputDir, subscribers, push) {
198
+ await mkdir(outputDir, { recursive: true });
199
+ const subscribersPath = join(outputDir, "subscribers.ts");
200
+ if (subscribers.length === 0) {
201
+ await writeFile(subscribersPath, `/**
202
+ * Generated subscribers setup — this app declares none.
203
+ */
204
+ import type { EnvironmentParser } from '@geekmidas/envkit';
205
+ import type { Logger } from '@geekmidas/logger';
206
+
207
+ export async function setupSubscribers(
208
+ _app: unknown,
209
+ _envParser: EnvironmentParser<any>,
210
+ _logger: Logger,
211
+ ): Promise<(port: number) => Promise<void>> {
212
+ return async () => {};
213
+ }
214
+
215
+ export function subscribersStatus(): { failed: string[]; connections: unknown[] } {
216
+ return { failed: [], connections: [] };
217
+ }
218
+
219
+ export async function stopSubscribers(): Promise<void> {}
220
+ `);
221
+ return subscribersPath;
222
+ }
223
+ const importsByFile = /* @__PURE__ */ new Map();
224
+ for (const { path, key } of subscribers) {
225
+ const importPath = relative(dirname(subscribersPath), path.relative).replace(/\.ts$/, ".js");
226
+ importsByFile.set(importPath, [...importsByFile.get(importPath) ?? [], key]);
227
+ }
228
+ const content = `/**
229
+ * Generated subscribers setup.
230
+ *
231
+ * Each subscriber is run against the topic it is bound to, through that
232
+ * topic's own connection string:
233
+ *
234
+ * - **sns://** — pushed, not polled. The subscriber gets an HTTP route on this
235
+ * server, and the route is subscribed to the topic with a filter policy of
236
+ * the events it named, so SNS fans out to each subscriber. The route runs the
237
+ * subscriber through the same adaptor a Lambda subscription does.
238
+ * - **anything else** (pgboss://, rabbitmq://, sqs://) — polled. On pg-boss
239
+ * each subscriber drains a queue of its own, \`<topic>/<subscriber>\`, so
240
+ * every subscriber sees every event; replicas of one subscriber share it.
241
+ *
242
+ * GKM_SUBSCRIBERS=off (\`gkm dev --no-subscribers\`) runs none of them.
243
+ * GKM_SUBSCRIBER_PUSH_URL is the address SNS pushes to; against the local
244
+ * emulator it defaults to this server through host.docker.internal.
245
+ */
246
+ import { connect } from 'node:net';
247
+ import type { EnvironmentParser } from '@geekmidas/envkit';
248
+ import type { Logger } from '@geekmidas/logger';
249
+ import { EventConnectionFactory, Subscriber } from '@geekmidas/events';
250
+ import type { EventConnection } from '@geekmidas/events';
251
+ import { ServiceDiscovery } from '@geekmidas/services';
252
+ ${Array.from(importsByFile.entries()).map(([importPath, exports]) => `import { ${exports.join(", ")} } from '${importPath}';`).join("\n")}
253
+
254
+ const subscribers = [
255
+ ${subscribers.map(({ key, construct }) => {
256
+ const connectionKey = construct.topicName ? provideKey(canonicalId(construct.topicName), "publisherConnectionString") : void 0;
257
+ return ` { id: '${key}', subscriber: ${key}, topic: ${construct.topicName ? `'${construct.topicName}'` : "undefined"}, connectionKey: ${connectionKey ? `'${connectionKey}'` : "undefined"} },`;
258
+ }).join("\n")}
259
+ ];
260
+
261
+ // What was opened, and what could not be: a worker's health check reads both,
262
+ // and its shutdown closes what was opened.
263
+ const connections = new Map<string, EventConnection>();
264
+ const failed: string[] = [];
265
+
266
+ /** The route a subscriber's pushes arrive on. */
267
+ export const SUBSCRIBER_ROUTE = (id: string) => \`/__gkm/subscribers/\${id}\`;
268
+
269
+ /** Resolves once something is accepting connections on the port. */
270
+ async function listening(port: number): Promise<void> {
271
+ for (let attempt = 0; attempt < 100; attempt++) {
272
+ const open = await new Promise<boolean>((resolve) => {
273
+ const socket = connect(port, '127.0.0.1');
274
+ socket.once('connect', () => { socket.end(); resolve(true); });
275
+ socket.once('error', () => resolve(false));
276
+ });
277
+ if (open) return;
278
+ await new Promise((resolve) => setTimeout(resolve, 50));
279
+ }
280
+ }
281
+
282
+ /**
283
+ * Mount each pushed subscriber's route and start each polled one. Returns what
284
+ * to run once the server is listening: subscribing a route makes SNS send its
285
+ * confirmation at once, so the route has to be reachable first.
286
+ */
287
+ export async function setupSubscribers(
288
+ app: { post: (path: string, handler: (c: any) => unknown) => unknown },
289
+ envParser: EnvironmentParser<any>,
290
+ logger: Logger,
291
+ ): Promise<(port: number) => Promise<void>> {
292
+ if (process.env.GKM_SUBSCRIBERS === 'off') {
293
+ logger.info('Subscribers are off (--no-subscribers)');
294
+ return async () => {};
295
+ }
296
+
297
+ const serviceDiscovery = ServiceDiscovery.getInstance(envParser);
298
+ const afterListening: ((port: number) => Promise<void>)[] = [];
299
+
300
+ for (const { id, subscriber, topic, connectionKey } of subscribers) {
301
+ const events = subscriber.subscribedEvents || [];
302
+ if (events.length === 0) {
303
+ logger.warn({ subscriber: id }, 'Subscriber has no subscribed events, skipping');
304
+ continue;
305
+ }
306
+ const connectionString = connectionKey ? process.env[connectionKey] : undefined;
307
+ if (!connectionString) {
308
+ logger.error(
309
+ { subscriber: id, connectionKey },
310
+ 'No connection string for the topic this subscriber is bound to',
311
+ );
312
+ failed.push(id);
313
+ continue;
314
+ }
315
+
316
+ try {
317
+ ${push ? ` if (connectionString.startsWith('sns:')) {
318
+ const { SNSConnection, snsUrl, subscribeHttpEndpoint } = await import('@geekmidas/events/sns');
319
+ const { SnsPushSubscriberAdaptor } = await import('@geekmidas/constructs/subscribers');
320
+ const address = snsUrl.parse(connectionString);
321
+ const route = SUBSCRIBER_ROUTE(id);
322
+ const adaptor = new SnsPushSubscriberAdaptor(envParser, subscriber, {
323
+ topicArn: address.topicArn,
324
+ // An emulator signs nothing. Decided by the address this server was
325
+ // configured with, never by anything a request says about itself.
326
+ verify: !address.endpoint,
327
+ ...(address.endpoint ? { emulatorEndpoint: address.endpoint } : {}),
328
+ });
329
+
330
+ app.post(route, async (c: any) => {
331
+ const body = JSON.parse(await c.req.text());
332
+ const response = await adaptor.handle(body);
333
+ return c.json(response.body, response.status);
334
+ });
335
+
336
+ afterListening.push(async (port) => {
337
+ const base =
338
+ process.env.GKM_SUBSCRIBER_PUSH_URL ??
339
+ (address.endpoint ? \`http://host.docker.internal:\${port}\` : undefined);
340
+ if (!base) {
341
+ logger.error(
342
+ { subscriber: id },
343
+ 'Set GKM_SUBSCRIBER_PUSH_URL to the public URL of this worker, which SNS pushes to',
344
+ );
345
+ return;
346
+ }
347
+ const connection = await SNSConnection.fromConnectionString(connectionString);
348
+ await subscribeHttpEndpoint(connection, {
349
+ endpoint: new URL(route, base).toString(),
350
+ events,
351
+ });
352
+ logger.info({ subscriber: id, events }, 'Subscriber subscribed for push');
353
+ });
354
+ continue;
355
+ }
356
+ ` : ` if (connectionString.startsWith('sns:')) {
357
+ // Built for a broker other than SNS, so this entry registered no SNS
358
+ // driver and has no push route to offer.
359
+ logger.error(
360
+ { subscriber: id, connectionKey },
361
+ 'This build has no SNS driver: it was built for a target whose broker is not SNS',
362
+ );
363
+ failed.push(id);
364
+ continue;
365
+ }
366
+ `}
367
+
368
+ let connection = connections.get(connectionString);
369
+ if (!connection) {
370
+ connection = await EventConnectionFactory.fromConnectionString(connectionString);
371
+ connections.set(connectionString, connection);
372
+ }
373
+ // Named, so a broker with one address for everything (pg-boss) gives
374
+ // this subscriber a queue of its own: fan-out, not competition.
375
+ const eventSubscriber = await Subscriber.fromConnection(connection, {
376
+ topic,
377
+ subscription: id,
378
+ });
379
+ const services = subscriber.services.length > 0
380
+ ? await serviceDiscovery.register(subscriber.services)
381
+ : {};
382
+ // The subscriber's database — the worker's, or its own — as \`db\`. A
383
+ // pushed subscriber gets it from the adaptor above instead.
384
+ const db = subscriber.databaseService
385
+ ? (await serviceDiscovery.register([subscriber.databaseService]))[
386
+ subscriber.databaseService.serviceName
387
+ ]
388
+ : undefined;
389
+
390
+ await eventSubscriber.subscribe(events, async (event) => {
391
+ try {
392
+ await subscriber.handler({
393
+ events: [event],
394
+ services: services as any,
395
+ logger: subscriber.logger,
396
+ db,
397
+ } as any);
398
+ } catch (error) {
399
+ logger.error({ err: error, event, subscriber: id }, 'Failed to process event');
400
+ // Rethrown so the transport keeps the event for a retry — as a queue
401
+ // consumer's failure does, and as a pushed subscriber's 500 does.
402
+ throw error;
403
+ }
404
+ });
405
+ logger.info({ subscriber: id, events }, 'Subscriber started polling');
406
+ } catch (error) {
407
+ // The message too: a missing module's code alone does not say which.
408
+ logger.error(
409
+ { err: error, subscriber: id },
410
+ 'Failed to set up subscriber',
411
+ );
412
+ failed.push(id);
413
+ }
414
+ }
415
+
416
+ return async (port) => {
417
+ if (afterListening.length === 0) return;
418
+ await listening(port);
419
+ for (const subscribe of afterListening) {
420
+ await subscribe(port).catch((error) => {
421
+ logger.error({ err: error }, 'Failed to subscribe for push');
422
+ });
423
+ }
424
+ };
425
+ }
426
+
427
+ /** The subscribers that could not start, and the connections that did. */
428
+ export function subscribersStatus(): { failed: string[]; connections: EventConnection[] } {
429
+ return { failed: [...failed], connections: [...connections.values()] };
430
+ }
431
+
432
+ /**
433
+ * Stop polling, let the events in flight finish, and close each broker
434
+ * connection — pg-boss's graceful stop does all three. The caller bounds it.
435
+ */
436
+ export async function stopSubscribers(): Promise<void> {
437
+ const open = [...connections.values()];
438
+ connections.clear();
439
+ await Promise.all(open.map((connection) => connection.close()));
440
+ }
441
+ `;
442
+ await writeFile(subscribersPath, content);
443
+ return subscribersPath;
444
+ }
445
+ };
446
+ //#endregion
447
+ export { DEFAULT_STORAGE as a, DEFAULT_EVENTS as i, readFakes as n, holdsEveryCache as o, DEFAULT_CACHE as r, isCacheBackend as s, SubscriberGenerator as t };
448
+
449
+ //# sourceMappingURL=SubscriberGenerator-1-IsjIwF.mjs.map