@geekmidas/cli 10.0.0-alpha.12 → 10.0.0-alpha.120

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 (517) hide show
  1. package/README.md +310 -377
  2. package/bin/adjacent-tsconfig.mjs +46 -8
  3. package/bin/gkm.mjs +11 -3
  4. package/bin/owning-tsconfig-jsx-register.mjs +18 -0
  5. package/bin/owning-tsconfig-jsx.mjs +108 -0
  6. package/dist/EndpointGenerator-BDa6pPgE.cjs +1090 -0
  7. package/dist/EndpointGenerator-BDa6pPgE.cjs.map +1 -0
  8. package/dist/EndpointGenerator-CP_z_E3e.mjs +1031 -0
  9. package/dist/EndpointGenerator-CP_z_E3e.mjs.map +1 -0
  10. package/dist/GoDaddyProvider-3C8U_tVu.cjs +388 -0
  11. package/dist/GoDaddyProvider-3C8U_tVu.cjs.map +1 -0
  12. package/dist/GoDaddyProvider-D0MQoOM4.mjs +388 -0
  13. package/dist/GoDaddyProvider-D0MQoOM4.mjs.map +1 -0
  14. package/dist/{HostingerProvider-BcyFRbqV.mjs → HostingerProvider-BNpS9aRJ.mjs} +29 -25
  15. package/dist/HostingerProvider-BNpS9aRJ.mjs.map +1 -0
  16. package/dist/{HostingerProvider-BOvsgATO.cjs → HostingerProvider-DR1iws1P.cjs} +29 -25
  17. package/dist/HostingerProvider-DR1iws1P.cjs.map +1 -0
  18. package/dist/LegacyStateStore-CRi7TosX.mjs +124 -0
  19. package/dist/LegacyStateStore-CRi7TosX.mjs.map +1 -0
  20. package/dist/LegacyStateStore-DHsoQGOo.cjs +124 -0
  21. package/dist/LegacyStateStore-DHsoQGOo.cjs.map +1 -0
  22. package/dist/LocalStateStore-BQXTkeoS.cjs +178 -0
  23. package/dist/LocalStateStore-BQXTkeoS.cjs.map +1 -0
  24. package/dist/LocalStateStore-Dkth0jXX.mjs +167 -0
  25. package/dist/LocalStateStore-Dkth0jXX.mjs.map +1 -0
  26. package/dist/OpenApiTsGenerator-CsrukCE-.mjs +536 -0
  27. package/dist/OpenApiTsGenerator-CsrukCE-.mjs.map +1 -0
  28. package/dist/OpenApiTsGenerator-FNhY7Ssz.cjs +541 -0
  29. package/dist/OpenApiTsGenerator-FNhY7Ssz.cjs.map +1 -0
  30. package/dist/{Route53Provider-CH9XH7bz.cjs → Route53Provider-Bllus2NR.cjs} +21 -22
  31. package/dist/Route53Provider-Bllus2NR.cjs.map +1 -0
  32. package/dist/{Route53Provider-C0xmer8U.mjs → Route53Provider-QXxjkZO1.mjs} +13 -13
  33. package/dist/Route53Provider-QXxjkZO1.mjs.map +1 -0
  34. package/dist/S3StateStore-DGKZgyKz.cjs +222 -0
  35. package/dist/S3StateStore-DGKZgyKz.cjs.map +1 -0
  36. package/dist/S3StateStore-pZZnLLBd.mjs +223 -0
  37. package/dist/S3StateStore-pZZnLLBd.mjs.map +1 -0
  38. package/dist/SSMStateStore-CZRMERDA.mjs +205 -0
  39. package/dist/SSMStateStore-CZRMERDA.mjs.map +1 -0
  40. package/dist/SSMStateStore-DzkyjQ5D.cjs +204 -0
  41. package/dist/SSMStateStore-DzkyjQ5D.cjs.map +1 -0
  42. package/dist/SubscriberGenerator-C8CPxrCK.cjs +592 -0
  43. package/dist/SubscriberGenerator-C8CPxrCK.cjs.map +1 -0
  44. package/dist/SubscriberGenerator-y3pncae_.mjs +533 -0
  45. package/dist/SubscriberGenerator-y3pncae_.mjs.map +1 -0
  46. package/dist/add-C0kXOsWS.mjs +717 -0
  47. package/dist/add-C0kXOsWS.mjs.map +1 -0
  48. package/dist/add-Df8cmz0H.cjs +719 -0
  49. package/dist/add-Df8cmz0H.cjs.map +1 -0
  50. package/dist/appPorts-BoXMwolc.mjs +249 -0
  51. package/dist/appPorts-BoXMwolc.mjs.map +1 -0
  52. package/dist/appPorts-IW-OZmRi.cjs +296 -0
  53. package/dist/appPorts-IW-OZmRi.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-DXXg6FIL.mjs → backup-provisioner-C8DnCmxK.mjs} +11 -8
  63. package/dist/backup-provisioner-C8DnCmxK.mjs.map +1 -0
  64. package/dist/{backup-provisioner-cE2PuCTb.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-Bux2iF-v.mjs → bundler-B-I4Du99.mjs} +35 -16
  75. package/dist/bundler-B-I4Du99.mjs.map +1 -0
  76. package/dist/{bundler-BMekgx7a.cjs → bundler-Dx_grUmc.cjs} +37 -19
  77. package/dist/bundler-Dx_grUmc.cjs.map +1 -0
  78. package/dist/cli-Cd9exatJ.cjs +71 -0
  79. package/dist/cli-Cd9exatJ.cjs.map +1 -0
  80. package/dist/cli-DL7GxGAe.mjs +71 -0
  81. package/dist/cli-DL7GxGAe.mjs.map +1 -0
  82. package/dist/compose-C43c03WZ.mjs +3284 -0
  83. package/dist/compose-C43c03WZ.mjs.map +1 -0
  84. package/dist/compose-Mdgea4Yt.cjs +3427 -0
  85. package/dist/compose-Mdgea4Yt.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-B67WJOOm.cjs +272 -0
  97. package/dist/credentialSchemas-B67WJOOm.cjs.map +1 -0
  98. package/dist/credentialSchemas-DDOLRCLF.mjs +237 -0
  99. package/dist/credentialSchemas-DDOLRCLF.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-BPOgTn1u.mjs +522 -0
  105. package/dist/databases-BPOgTn1u.mjs.map +1 -0
  106. package/dist/databases-fOaoBInm.cjs +625 -0
  107. package/dist/databases-fOaoBInm.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 +654 -0
  115. package/dist/deploy/public.d.cts.map +1 -0
  116. package/dist/deploy/public.d.mts +654 -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-BMM2hx-K.cjs +2401 -0
  163. package/dist/deploy-BMM2hx-K.cjs.map +1 -0
  164. package/dist/deploy-D5YhwDng.mjs +2328 -0
  165. package/dist/deploy-D5YhwDng.mjs.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-C5roJuc9.mjs +560 -0
  171. package/dist/discover-C5roJuc9.mjs.map +1 -0
  172. package/dist/discover-CSW_BMWa.d.cts +125 -0
  173. package/dist/discover-CSW_BMWa.d.cts.map +1 -0
  174. package/dist/discover-DozUKs8f.cjs +639 -0
  175. package/dist/discover-DozUKs8f.cjs.map +1 -0
  176. package/dist/discover-xtT7fgWg.d.mts +125 -0
  177. package/dist/discover-xtT7fgWg.d.mts.map +1 -0
  178. package/dist/dns-BIYf20p7.cjs +1057 -0
  179. package/dist/dns-BIYf20p7.cjs.map +1 -0
  180. package/dist/dns-agf2VCdV.mjs +926 -0
  181. package/dist/dns-agf2VCdV.mjs.map +1 -0
  182. package/dist/dokploy-2p4PK6ej.mjs +38 -0
  183. package/dist/dokploy-2p4PK6ej.mjs.map +1 -0
  184. package/dist/dokploy-BANMTroy.cjs +38 -0
  185. package/dist/dokploy-BANMTroy.cjs.map +1 -0
  186. package/dist/drivers-BjGDYfnC.mjs +195 -0
  187. package/dist/drivers-BjGDYfnC.mjs.map +1 -0
  188. package/dist/drivers-DbjiYpW6.cjs +224 -0
  189. package/dist/drivers-DbjiYpW6.cjs.map +1 -0
  190. package/dist/eas-CNi16SoO.cjs +337 -0
  191. package/dist/eas-CNi16SoO.cjs.map +1 -0
  192. package/dist/eas-iT2JDHCh.mjs +334 -0
  193. package/dist/eas-iT2JDHCh.mjs.map +1 -0
  194. package/dist/{emit-CIlvnDvV.mjs → emit-C1e8qD08.mjs} +13 -26
  195. package/dist/emit-C1e8qD08.mjs.map +1 -0
  196. package/dist/{emit-CUD1BWls.cjs → emit-Dmc1nvdS.cjs} +31 -57
  197. package/dist/emit-Dmc1nvdS.cjs.map +1 -0
  198. package/dist/encryption-DkXVbyZc.mjs +89 -0
  199. package/dist/encryption-DkXVbyZc.mjs.map +1 -0
  200. package/dist/encryption-d2lLtkYx.cjs +90 -0
  201. package/dist/encryption-d2lLtkYx.cjs.map +1 -0
  202. package/dist/engine-CatKW6E-.mjs +3089 -0
  203. package/dist/engine-CatKW6E-.mjs.map +1 -0
  204. package/dist/engine-DlEHexED.cjs +3202 -0
  205. package/dist/engine-DlEHexED.cjs.map +1 -0
  206. package/dist/errors-D8Gwp5kU.mjs +23 -0
  207. package/dist/errors-D8Gwp5kU.mjs.map +1 -0
  208. package/dist/errors-DMC4Umsb.cjs +34 -0
  209. package/dist/errors-DMC4Umsb.cjs.map +1 -0
  210. package/dist/github-BAeaC1Pl.cjs +833 -0
  211. package/dist/github-BAeaC1Pl.cjs.map +1 -0
  212. package/dist/github-DErsqKGN.mjs +832 -0
  213. package/dist/github-DErsqKGN.mjs.map +1 -0
  214. package/dist/googlePlay-BVcfFWRO.cjs +931 -0
  215. package/dist/googlePlay-BVcfFWRO.cjs.map +1 -0
  216. package/dist/googlePlay-BXJ5ZjMK.mjs +931 -0
  217. package/dist/googlePlay-BXJ5ZjMK.mjs.map +1 -0
  218. package/dist/identity-CBXr4wNi.mjs +129 -0
  219. package/dist/identity-CBXr4wNi.mjs.map +1 -0
  220. package/dist/identity-CbLfgQNT.cjs +182 -0
  221. package/dist/identity-CbLfgQNT.cjs.map +1 -0
  222. package/dist/{index-BzJ7QJ9c.d.mts → index-8OfpOtSI.d.cts} +39 -20
  223. package/dist/index-8OfpOtSI.d.cts.map +1 -0
  224. package/dist/{index-CfMjtdVC.d.cts → index-Dpji6Bxq.d.mts} +39 -20
  225. package/dist/index-Dpji6Bxq.d.mts.map +1 -0
  226. package/dist/index.cjs +14291 -11898
  227. package/dist/index.cjs.map +1 -1
  228. package/dist/index.d.cts +1 -1
  229. package/dist/index.d.mts +1 -1
  230. package/dist/index.mjs +13938 -11560
  231. package/dist/index.mjs.map +1 -1
  232. package/dist/local-BwC2v2Y8.mjs +224 -0
  233. package/dist/local-BwC2v2Y8.mjs.map +1 -0
  234. package/dist/local-DNhnkugT.cjs +241 -0
  235. package/dist/local-DNhnkugT.cjs.map +1 -0
  236. package/dist/migrate-Bb1MmGHl.mjs +181 -0
  237. package/dist/migrate-Bb1MmGHl.mjs.map +1 -0
  238. package/dist/migrate-D79GI0XM.cjs +271 -0
  239. package/dist/migrate-D79GI0XM.cjs.map +1 -0
  240. package/dist/migrate-L4a273dY.cjs +181 -0
  241. package/dist/migrate-L4a273dY.cjs.map +1 -0
  242. package/dist/migrate-s4QizIoM.mjs +266 -0
  243. package/dist/migrate-s4QizIoM.mjs.map +1 -0
  244. package/dist/openapi.cjs +214 -10
  245. package/dist/openapi.cjs.map +1 -0
  246. package/dist/openapi.d.cts +38 -17
  247. package/dist/openapi.d.cts.map +1 -1
  248. package/dist/openapi.d.mts +38 -17
  249. package/dist/openapi.d.mts.map +1 -1
  250. package/dist/openapi.mjs +208 -5
  251. package/dist/openapi.mjs.map +1 -0
  252. package/dist/projectBucket-BBbQ1lHF.cjs +263 -0
  253. package/dist/projectBucket-BBbQ1lHF.cjs.map +1 -0
  254. package/dist/projectBucket-C_DN4WzF.mjs +222 -0
  255. package/dist/projectBucket-C_DN4WzF.mjs.map +1 -0
  256. package/dist/provider-BqpjG9QM.cjs +57 -0
  257. package/dist/provider-BqpjG9QM.cjs.map +1 -0
  258. package/dist/provider-CEOKk8NS.mjs +46 -0
  259. package/dist/provider-CEOKk8NS.mjs.map +1 -0
  260. package/dist/publish-CcTlmJT6.mjs +123 -0
  261. package/dist/publish-CcTlmJT6.mjs.map +1 -0
  262. package/dist/publish-ydscCYsW.cjs +124 -0
  263. package/dist/publish-ydscCYsW.cjs.map +1 -0
  264. package/dist/ready-BFFP838V.cjs +404 -0
  265. package/dist/ready-BFFP838V.cjs.map +1 -0
  266. package/dist/ready-BOfogqzr.mjs +375 -0
  267. package/dist/ready-BOfogqzr.mjs.map +1 -0
  268. package/dist/reconcile/public.cjs +3 -5
  269. package/dist/reconcile/public.d.cts +11 -87
  270. package/dist/reconcile/public.d.cts.map +1 -1
  271. package/dist/reconcile/public.d.mts +11 -87
  272. package/dist/reconcile/public.d.mts.map +1 -1
  273. package/dist/reconcile/public.mjs +3 -4
  274. package/dist/{reconcile-BI0tWkwz.mjs → reconcile--I7V4Klj.mjs} +4 -7
  275. package/dist/reconcile--I7V4Klj.mjs.map +1 -0
  276. package/dist/{reconcile-Bhw5fmKu.cjs → reconcile-CuCQBa5-.cjs} +5 -8
  277. package/dist/reconcile-CuCQBa5-.cjs.map +1 -0
  278. package/dist/resolve-BLp2trep.mjs +263 -0
  279. package/dist/resolve-BLp2trep.mjs.map +1 -0
  280. package/dist/resolve-BgL-brF9.cjs +316 -0
  281. package/dist/resolve-BgL-brF9.cjs.map +1 -0
  282. package/dist/rollback-2cyLXEH1.cjs +165 -0
  283. package/dist/rollback-2cyLXEH1.cjs.map +1 -0
  284. package/dist/rollback-DwqZ8zzj.mjs +136 -0
  285. package/dist/rollback-DwqZ8zzj.mjs.map +1 -0
  286. package/dist/rolldown-runtime-BhDjJH2R.mjs +15 -0
  287. package/dist/{chunk-CUT6urMc.cjs → rolldown-runtime-C0BPl7ul.cjs} +23 -10
  288. package/dist/run-BJLIerMM.mjs +133 -0
  289. package/dist/run-BJLIerMM.mjs.map +1 -0
  290. package/dist/run-fVZ-rLnc.cjs +174 -0
  291. package/dist/run-fVZ-rLnc.cjs.map +1 -0
  292. package/dist/runtime-ACdfK59n.d.cts +82 -0
  293. package/dist/runtime-ACdfK59n.d.cts.map +1 -0
  294. package/dist/runtime-YyQuekxi.d.mts +82 -0
  295. package/dist/runtime-YyQuekxi.d.mts.map +1 -0
  296. package/dist/s3-CrPoA89T.cjs +215 -0
  297. package/dist/s3-CrPoA89T.cjs.map +1 -0
  298. package/dist/s3-DQXZdmCM.mjs +215 -0
  299. package/dist/s3-DQXZdmCM.mjs.map +1 -0
  300. package/dist/sandbox/config-worker.cjs +43 -0
  301. package/dist/sandbox/config-worker.cjs.map +1 -0
  302. package/dist/sandbox/config-worker.d.cts +1 -0
  303. package/dist/sandbox/config-worker.d.mts +1 -0
  304. package/dist/sandbox/config-worker.mjs +44 -0
  305. package/dist/sandbox/config-worker.mjs.map +1 -0
  306. package/dist/sandbox/credentials-worker.cjs +54 -0
  307. package/dist/sandbox/credentials-worker.cjs.map +1 -0
  308. package/dist/sandbox/credentials-worker.d.cts +1 -0
  309. package/dist/sandbox/credentials-worker.d.mts +1 -0
  310. package/dist/sandbox/credentials-worker.mjs +55 -0
  311. package/dist/sandbox/credentials-worker.mjs.map +1 -0
  312. package/dist/sandbox/discover-worker.cjs +50 -0
  313. package/dist/sandbox/discover-worker.cjs.map +1 -0
  314. package/dist/sandbox/discover-worker.d.cts +1 -0
  315. package/dist/sandbox/discover-worker.d.mts +1 -0
  316. package/dist/sandbox/discover-worker.mjs +51 -0
  317. package/dist/sandbox/discover-worker.mjs.map +1 -0
  318. package/dist/sandbox/migrate-worker.cjs +75 -0
  319. package/dist/sandbox/migrate-worker.cjs.map +1 -0
  320. package/dist/sandbox/migrate-worker.d.cts +1 -0
  321. package/dist/sandbox/migrate-worker.d.mts +1 -0
  322. package/dist/sandbox/migrate-worker.mjs +76 -0
  323. package/dist/sandbox/migrate-worker.mjs.map +1 -0
  324. package/dist/sandbox-C4g1eG31.d.mts +104 -0
  325. package/dist/sandbox-C4g1eG31.d.mts.map +1 -0
  326. package/dist/sandbox-CHv3OYXg.cjs +165 -0
  327. package/dist/sandbox-CHv3OYXg.cjs.map +1 -0
  328. package/dist/sandbox-CbVB7uOD.mjs +118 -0
  329. package/dist/sandbox-CbVB7uOD.mjs.map +1 -0
  330. package/dist/sandbox-CdKgQ3XU.d.cts +104 -0
  331. package/dist/sandbox-CdKgQ3XU.d.cts.map +1 -0
  332. package/dist/{workspace-DPV7FtAv.cjs → schemas-BCwKKA42.mjs} +958 -1816
  333. package/dist/schemas-BCwKKA42.mjs.map +1 -0
  334. package/dist/{workspace-CtnZnWsa.mjs → schemas-BQ_v0lEX.cjs} +1048 -1626
  335. package/dist/schemas-BQ_v0lEX.cjs.map +1 -0
  336. package/dist/secretsManager-CQORubp9.mjs +97 -0
  337. package/dist/secretsManager-CQORubp9.mjs.map +1 -0
  338. package/dist/secretsManager-RAGcEDX1.cjs +108 -0
  339. package/dist/secretsManager-RAGcEDX1.cjs.map +1 -0
  340. package/dist/seeds-C2w4UqVP.cjs +9347 -0
  341. package/dist/seeds-C2w4UqVP.cjs.map +1 -0
  342. package/dist/seeds-Cwtv-U9-.mjs +8350 -0
  343. package/dist/seeds-Cwtv-U9-.mjs.map +1 -0
  344. package/dist/serverSetup-CKs4K9gD.cjs +630 -0
  345. package/dist/serverSetup-CKs4K9gD.cjs.map +1 -0
  346. package/dist/serverSetup-P68H5Lal.mjs +630 -0
  347. package/dist/serverSetup-P68H5Lal.mjs.map +1 -0
  348. package/dist/sniffer-8C4q6Szd.mjs +1825 -0
  349. package/dist/sniffer-8C4q6Szd.mjs.map +1 -0
  350. package/dist/sniffer-CF7wNxMo.cjs +1998 -0
  351. package/dist/sniffer-CF7wNxMo.cjs.map +1 -0
  352. package/dist/sst-B-Uz4cvm.cjs +464 -0
  353. package/dist/sst-B-Uz4cvm.cjs.map +1 -0
  354. package/dist/sst-C1pxbFEd.mjs +441 -0
  355. package/dist/sst-C1pxbFEd.mjs.map +1 -0
  356. package/dist/stage-BvM_u2z4.mjs +302 -0
  357. package/dist/stage-BvM_u2z4.mjs.map +1 -0
  358. package/dist/stage-DEQJGW3r.cjs +313 -0
  359. package/dist/stage-DEQJGW3r.cjs.map +1 -0
  360. package/dist/stages-Cb9rqRbN.mjs +190 -0
  361. package/dist/stages-Cb9rqRbN.mjs.map +1 -0
  362. package/dist/stages-D4SnG5yl.cjs +190 -0
  363. package/dist/stages-D4SnG5yl.cjs.map +1 -0
  364. package/dist/target/public.cjs +15 -0
  365. package/dist/target/public.d.cts +28 -0
  366. package/dist/target/public.d.cts.map +1 -0
  367. package/dist/target/public.d.mts +28 -0
  368. package/dist/target/public.d.mts.map +1 -0
  369. package/dist/target/public.mjs +4 -0
  370. package/dist/terminal-CW_dWeTe.mjs +85 -0
  371. package/dist/terminal-CW_dWeTe.mjs.map +1 -0
  372. package/dist/terminal-DJlqcW_U.cjs +85 -0
  373. package/dist/terminal-DJlqcW_U.cjs.map +1 -0
  374. package/dist/types-B6UXlEkf.d.cts +7650 -0
  375. package/dist/types-B6UXlEkf.d.cts.map +1 -0
  376. package/dist/types-HqVPddRK.d.mts +7649 -0
  377. package/dist/types-HqVPddRK.d.mts.map +1 -0
  378. package/dist/utils-D2Nk1Nv2.cjs +205 -0
  379. package/dist/utils-D2Nk1Nv2.cjs.map +1 -0
  380. package/dist/utils-D_fxUqvU.mjs +156 -0
  381. package/dist/utils-D_fxUqvU.mjs.map +1 -0
  382. package/dist/vitest.cjs +65 -0
  383. package/dist/vitest.cjs.map +1 -0
  384. package/dist/vitest.d.cts +29 -0
  385. package/dist/vitest.d.cts.map +1 -0
  386. package/dist/vitest.d.mts +29 -0
  387. package/dist/vitest.d.mts.map +1 -0
  388. package/dist/vitest.mjs +65 -0
  389. package/dist/vitest.mjs.map +1 -0
  390. package/dist/workerRuntime-BXfhbe13.cjs +108 -0
  391. package/dist/workerRuntime-BXfhbe13.cjs.map +1 -0
  392. package/dist/workerRuntime-CsOyBRx2.mjs +79 -0
  393. package/dist/workerRuntime-CsOyBRx2.mjs.map +1 -0
  394. package/dist/workspace/index.cjs +8 -4
  395. package/dist/workspace/index.d.cts +3 -3
  396. package/dist/workspace/index.d.mts +3 -3
  397. package/dist/workspace/index.mjs +2 -3
  398. package/dist/workspace-BwqQnool.cjs +2806 -0
  399. package/dist/workspace-BwqQnool.cjs.map +1 -0
  400. package/dist/workspace-D1QbNd55.mjs +2394 -0
  401. package/dist/workspace-D1QbNd55.mjs.map +1 -0
  402. package/package.json +54 -22
  403. package/dist/CachedStateProvider-BEBl2wQT.cjs +0 -60
  404. package/dist/CachedStateProvider-BEBl2wQT.cjs.map +0 -1
  405. package/dist/CachedStateProvider-C-8wtlto.mjs +0 -3
  406. package/dist/CachedStateProvider-Co4n5Wvs.mjs +0 -54
  407. package/dist/CachedStateProvider-Co4n5Wvs.mjs.map +0 -1
  408. package/dist/CachedStateProvider-DqhGpzsm.cjs +0 -3
  409. package/dist/HostingerProvider-BOvsgATO.cjs.map +0 -1
  410. package/dist/HostingerProvider-BcyFRbqV.mjs.map +0 -1
  411. package/dist/LocalStateProvider-Bq-0C0sg.mjs +0 -42
  412. package/dist/LocalStateProvider-Bq-0C0sg.mjs.map +0 -1
  413. package/dist/LocalStateProvider-yjXZXZDM.cjs +0 -43
  414. package/dist/LocalStateProvider-yjXZXZDM.cjs.map +0 -1
  415. package/dist/Route53Provider-C0xmer8U.mjs.map +0 -1
  416. package/dist/Route53Provider-CH9XH7bz.cjs.map +0 -1
  417. package/dist/SSMStateProvider-CXtNgPfy.cjs +0 -66
  418. package/dist/SSMStateProvider-CXtNgPfy.cjs.map +0 -1
  419. package/dist/SSMStateProvider-DOZifZfE.mjs +0 -66
  420. package/dist/SSMStateProvider-DOZifZfE.mjs.map +0 -1
  421. package/dist/backup-provisioner-DXXg6FIL.mjs.map +0 -1
  422. package/dist/backup-provisioner-cE2PuCTb.cjs.map +0 -1
  423. package/dist/bundler-BMekgx7a.cjs.map +0 -1
  424. package/dist/bundler-Bux2iF-v.mjs.map +0 -1
  425. package/dist/chunk-Duj1WY3L.mjs +0 -7
  426. package/dist/config-DTsVjKZD.mjs +0 -402
  427. package/dist/config-DTsVjKZD.mjs.map +0 -1
  428. package/dist/config-RYR9j6EF.cjs +0 -462
  429. package/dist/config-RYR9j6EF.cjs.map +0 -1
  430. package/dist/config.d.cts.map +0 -1
  431. package/dist/config.d.mts.map +0 -1
  432. package/dist/credentials-B5zRHdAl.mjs +0 -141
  433. package/dist/credentials-B5zRHdAl.mjs.map +0 -1
  434. package/dist/credentials-BapzjyV5.cjs +0 -195
  435. package/dist/credentials-BapzjyV5.cjs.map +0 -1
  436. package/dist/credentials-DQRvPz2S.cjs +0 -2769
  437. package/dist/credentials-DQRvPz2S.cjs.map +0 -1
  438. package/dist/credentials-jMJC63qs.mjs +0 -2625
  439. package/dist/credentials-jMJC63qs.mjs.map +0 -1
  440. package/dist/discover-BYHQwQqu.mjs +0 -242
  441. package/dist/discover-BYHQwQqu.mjs.map +0 -1
  442. package/dist/discover-DmW9Bscc.cjs +0 -290
  443. package/dist/discover-DmW9Bscc.cjs.map +0 -1
  444. package/dist/dokploy-api-5cK2InBm.cjs +0 -3
  445. package/dist/dokploy-api-D2Ny4Jrc.mjs +0 -3
  446. package/dist/dokploy-api-pdaBryoY.mjs +0 -706
  447. package/dist/dokploy-api-pdaBryoY.mjs.map +0 -1
  448. package/dist/dokploy-api-zqKe9lHH.cjs +0 -718
  449. package/dist/dokploy-api-zqKe9lHH.cjs.map +0 -1
  450. package/dist/emit-CIlvnDvV.mjs.map +0 -1
  451. package/dist/emit-CUD1BWls.cjs.map +0 -1
  452. package/dist/encryption-D2pL3tHH.cjs +0 -54
  453. package/dist/encryption-D2pL3tHH.cjs.map +0 -1
  454. package/dist/encryption-YDsXXi6w.mjs +0 -3
  455. package/dist/encryption-_4zwjOAR.mjs +0 -42
  456. package/dist/encryption-_4zwjOAR.mjs.map +0 -1
  457. package/dist/encryption-sQ2Oxx0d.cjs +0 -4
  458. package/dist/fullstack-secrets-B6KBHf-g.mjs +0 -87
  459. package/dist/fullstack-secrets-B6KBHf-g.mjs.map +0 -1
  460. package/dist/fullstack-secrets-DL8v0y4D.cjs +0 -99
  461. package/dist/fullstack-secrets-DL8v0y4D.cjs.map +0 -1
  462. package/dist/generator-CNzBw7g5.cjs +0 -289
  463. package/dist/generator-CNzBw7g5.cjs.map +0 -1
  464. package/dist/generator-VE2JrFlY.mjs +0 -253
  465. package/dist/generator-VE2JrFlY.mjs.map +0 -1
  466. package/dist/github-BThvbf2W.cjs +0 -197
  467. package/dist/github-BThvbf2W.cjs.map +0 -1
  468. package/dist/github-DpMZurEK.mjs +0 -196
  469. package/dist/github-DpMZurEK.mjs.map +0 -1
  470. package/dist/index-BzJ7QJ9c.d.mts.map +0 -1
  471. package/dist/index-CfMjtdVC.d.cts.map +0 -1
  472. package/dist/keystore-C9rint2E.cjs +0 -101
  473. package/dist/keystore-C9rint2E.cjs.map +0 -1
  474. package/dist/keystore-TxeYM7an.mjs +0 -83
  475. package/dist/keystore-TxeYM7an.mjs.map +0 -1
  476. package/dist/openapi-Bs3-5q_r.mjs +0 -2021
  477. package/dist/openapi-Bs3-5q_r.mjs.map +0 -1
  478. package/dist/openapi-DWLTsYLL.cjs +0 -2075
  479. package/dist/openapi-DWLTsYLL.cjs.map +0 -1
  480. package/dist/openapi-react-query-Byltvm_7.mjs +0 -167
  481. package/dist/openapi-react-query-Byltvm_7.mjs.map +0 -1
  482. package/dist/openapi-react-query-CmJ1xDbn.cjs +0 -173
  483. package/dist/openapi-react-query-CmJ1xDbn.cjs.map +0 -1
  484. package/dist/openapi-react-query.cjs +0 -4
  485. package/dist/openapi-react-query.d.cts +0 -11
  486. package/dist/openapi-react-query.d.cts.map +0 -1
  487. package/dist/openapi-react-query.d.mts +0 -11
  488. package/dist/openapi-react-query.d.mts.map +0 -1
  489. package/dist/openapi-react-query.mjs +0 -4
  490. package/dist/reconcile-BI0tWkwz.mjs.map +0 -1
  491. package/dist/reconcile-Bhw5fmKu.cjs.map +0 -1
  492. package/dist/setup-BmLoNrDX.mjs +0 -12
  493. package/dist/setup-BrR1_xGy.cjs +0 -12
  494. package/dist/setup-BsNR2LBG.cjs +0 -467
  495. package/dist/setup-BsNR2LBG.cjs.map +0 -1
  496. package/dist/setup-D5-JMknk.mjs +0 -437
  497. package/dist/setup-D5-JMknk.mjs.map +0 -1
  498. package/dist/storage-B020InPW.mjs +0 -222
  499. package/dist/storage-B020InPW.mjs.map +0 -1
  500. package/dist/storage-CSNplaJn.cjs +0 -282
  501. package/dist/storage-CSNplaJn.cjs.map +0 -1
  502. package/dist/storage-DGBzMLZa.mjs +0 -4
  503. package/dist/storage-DlVol_oj.cjs +0 -8
  504. package/dist/sync-0ILCb-1S.cjs +0 -93
  505. package/dist/sync-0ILCb-1S.cjs.map +0 -1
  506. package/dist/sync-CzHXiR9c.mjs +0 -76
  507. package/dist/sync-CzHXiR9c.mjs.map +0 -1
  508. package/dist/sync-DYENfOt4.cjs +0 -4
  509. package/dist/sync-HAau6h_R.mjs +0 -3
  510. package/dist/types-DVIx8I1N.d.mts +0 -1950
  511. package/dist/types-DVIx8I1N.d.mts.map +0 -1
  512. package/dist/types-PMP_qXRY.d.cts +0 -1950
  513. package/dist/types-PMP_qXRY.d.cts.map +0 -1
  514. package/dist/workspace-Cji6lE8E.cjs +0 -10
  515. package/dist/workspace-CkJAtRIX.mjs +0 -9
  516. package/dist/workspace-CtnZnWsa.mjs.map +0 -1
  517. package/dist/workspace-DPV7FtAv.cjs.map +0 -1
@@ -0,0 +1,296 @@
1
+ const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
2
+ let node_path = require("node:path");
3
+ let node_fs = require("node:fs");
4
+ let node_fs_promises = require("node:fs/promises");
5
+ let node_child_process = require("node:child_process");
6
+ //#region src/dev/appPorts.ts
7
+ /**
8
+ * Which local port each app answers on — and what to do when it is taken.
9
+ *
10
+ * An app's port used to be fixed: 3000, 3001, … and `gkm dev` refused to start
11
+ * if anything held one. That is right when the holder is this same app, left
12
+ * running by a previous `gkm dev` — moving would start a second copy beside it.
13
+ * It is wrong when the holder is another project's dev server, which also
14
+ * defaults to 3000: two projects could not run at once, and nothing about the
15
+ * app needs that port. A browser reaches it through the edge, whose URL carries
16
+ * no app port, and every address a phone or a route uses is derived on each
17
+ * start.
18
+ *
19
+ * So the holder is asked who it is. Every app process gkm starts is tagged with
20
+ * {@link APP_TAG_ENV} — the workspace and the app — and children inherit it, so
21
+ * whatever actually binds the port (`next-server`, a Metro worker, the tsx
22
+ * server) carries it — or, when its own can't be read, one of its parents does.
23
+ * A held port whose holder carries this app's tag is a
24
+ * leftover, and is refused; anything else — untagged, another workspace's,
25
+ * unreadable — is not ours, and the app moves to the next free port.
26
+ *
27
+ * The choice is kept in `.gkm/app-ports.json`, not recomputed: an app that
28
+ * moved stays where it moved, so a bookmark or a phone's saved address does not
29
+ * break the next time the other project happens to be stopped. Local only —
30
+ * `gkm deploy` and `gkm docker` never read it.
31
+ */
32
+ var appPorts_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
33
+ APP_TAG_ENV: () => APP_TAG_ENV,
34
+ appTag: () => appTag,
35
+ assignAppPorts: () => assignAppPorts,
36
+ describeHolder: () => describeHolder,
37
+ describeMove: () => describeMove,
38
+ holderOf: () => holderOf,
39
+ savedAppPorts: () => savedAppPorts,
40
+ withAppPorts: () => withAppPorts
41
+ });
42
+ /** Carried by every app process gkm starts: `<workspace root>#<app>`. */
43
+ const APP_TAG_ENV = "GKM_DEV_APP";
44
+ const APP_PORTS_PATH = ".gkm/app-ports.json";
45
+ /** The tag an app's processes carry. The root is encoded, so it has no spaces. */
46
+ function appTag(root, app) {
47
+ return `${encodeURIComponent((0, node_path.resolve)(root))}#${app}`;
48
+ }
49
+ /** Says, as `command (pid N)`, what holds a port. */
50
+ function describeHolder(holder) {
51
+ if (!holder) return "another process";
52
+ return `${holder.command ?? "a process"} (pid ${holder.pid})`;
53
+ }
54
+ /**
55
+ * Who is listening on a port, read the way a person would: `lsof` for the
56
+ * pid, then that process's environment for its tag — `/proc/<pid>/environ` on
57
+ * Linux, `ps eww` elsewhere. Both work for the user's own processes, which is
58
+ * every process gkm starts; one that cannot be read has no tag, so is not ours.
59
+ */
60
+ function holderOf(port) {
61
+ let out;
62
+ try {
63
+ out = (0, node_child_process.execFileSync)("lsof", [
64
+ "-nP",
65
+ `-iTCP:${port}`,
66
+ "-sTCP:LISTEN",
67
+ "-Fpc"
68
+ ], {
69
+ encoding: "utf8",
70
+ stdio: [
71
+ "ignore",
72
+ "pipe",
73
+ "ignore"
74
+ ]
75
+ });
76
+ } catch {
77
+ return;
78
+ }
79
+ const pid = Number(out.match(/^p(\d+)/m)?.[1]);
80
+ if (!pid) return void 0;
81
+ const command = out.match(/^c(.+)$/m)?.[1];
82
+ const tag = lineageTagOf(pid);
83
+ return {
84
+ pid,
85
+ ...command ? { command } : {},
86
+ ...tag ? { tag } : {}
87
+ };
88
+ }
89
+ /** How far up a holder's parents to look before calling it untagged. */
90
+ const MAX_ANCESTORS = 8;
91
+ /**
92
+ * The tag of `pid`, or of its nearest parent that has one.
93
+ *
94
+ * A process can hide the tag it inherited: `next-server` renames itself, which
95
+ * on macOS overwrites the memory `ps eww` reads its environment from, so `ps`
96
+ * shows only its title. Its parent, the `next dev` gkm started, still carries
97
+ * the tag. A child is only ever started by its parent, so a tagged parent makes
98
+ * the holder this app's.
99
+ */
100
+ function lineageTagOf(pid) {
101
+ let current = pid;
102
+ for (let depth = 0; current && current > 1; depth += 1) {
103
+ const tag = tagOf(current);
104
+ if (tag || depth === MAX_ANCESTORS) return tag;
105
+ current = parentOf(current);
106
+ }
107
+ }
108
+ function tagOf(pid) {
109
+ const prefix = `${APP_TAG_ENV}=`;
110
+ try {
111
+ return (process.platform === "linux" ? (0, node_fs.readFileSync)(`/proc/${pid}/environ`, "utf8").split("\0") : (0, node_child_process.execFileSync)("ps", [
112
+ "eww",
113
+ "-o",
114
+ "command=",
115
+ "-p",
116
+ String(pid)
117
+ ], {
118
+ encoding: "utf8",
119
+ stdio: [
120
+ "ignore",
121
+ "pipe",
122
+ "ignore"
123
+ ]
124
+ }).split(/\s+/)).find((entry) => entry.startsWith(prefix))?.slice(prefix.length);
125
+ } catch {
126
+ return;
127
+ }
128
+ }
129
+ function parentOf(pid) {
130
+ try {
131
+ const ppid = Number((0, node_child_process.execFileSync)("ps", [
132
+ "-o",
133
+ "ppid=",
134
+ "-p",
135
+ String(pid)
136
+ ], {
137
+ encoding: "utf8",
138
+ stdio: [
139
+ "ignore",
140
+ "pipe",
141
+ "ignore"
142
+ ]
143
+ }).trim());
144
+ return ppid > 0 ? ppid : void 0;
145
+ } catch {
146
+ return;
147
+ }
148
+ }
149
+ /** The ports apps were given before, by app name. */
150
+ async function savedAppPorts(root) {
151
+ try {
152
+ return JSON.parse(await (0, node_fs_promises.readFile)((0, node_path.join)(root, APP_PORTS_PATH), "utf8"));
153
+ } catch {
154
+ return {};
155
+ }
156
+ }
157
+ async function saveAppPorts(root, ports) {
158
+ await (0, node_fs_promises.mkdir)((0, node_path.join)(root, ".gkm"), { recursive: true });
159
+ await (0, node_fs_promises.writeFile)((0, node_path.join)(root, APP_PORTS_PATH), `${JSON.stringify(ports, null, 2)}\n`);
160
+ }
161
+ /** The workspace, with each app on the port it was given locally. */
162
+ function withAppPorts(workspace, ports) {
163
+ const apps = Object.fromEntries(Object.entries(workspace.apps).map(([name, app]) => [name, ports[name] ? {
164
+ ...app,
165
+ port: ports[name]
166
+ } : app]));
167
+ return {
168
+ ...workspace,
169
+ apps
170
+ };
171
+ }
172
+ /** Says where an app moved from, to, and why. */
173
+ function describeMove({ app, from, to, holder, sibling }) {
174
+ return `↪️ ${app}: ${from} ${sibling ? `is ${sibling}'s` : `is held by ${describeHolder(holder)}, which is not this workspace's`} — using ${to}`;
175
+ }
176
+ /**
177
+ * Give each named app a local port: the one it had, or its usual one, unless
178
+ * another project holds it — then the next free one, which is kept.
179
+ *
180
+ * @returns every app's port, the apps that moved, and the apps this workspace
181
+ * already has running (the caller refuses to start those).
182
+ */
183
+ async function assignAppPorts(workspace, names, deps) {
184
+ const saved = await savedAppPorts(workspace.root);
185
+ const wanted = {};
186
+ for (const name of names) {
187
+ const port = saved[name] ?? workspace.apps[name]?.port;
188
+ if (port) wanted[name] = port;
189
+ }
190
+ const taken = /* @__PURE__ */ new Set([...Object.values(saved), ...Object.values(wanted)]);
191
+ const ports = { ...saved };
192
+ const moved = [];
193
+ const running = [];
194
+ const owner = /* @__PURE__ */ new Map();
195
+ for (const [name, port] of Object.entries(saved)) if (!owner.has(port)) owner.set(port, name);
196
+ for (const name of Object.keys(wanted).sort()) {
197
+ const want = wanted[name];
198
+ ports[name] = want;
199
+ const sibling = owner.get(want);
200
+ if (sibling !== void 0 && sibling !== name) {
201
+ const next = await nextFree(want, taken, deps);
202
+ owner.set(next, name);
203
+ ports[name] = next;
204
+ moved.push({
205
+ app: name,
206
+ from: want,
207
+ to: next,
208
+ sibling
209
+ });
210
+ continue;
211
+ }
212
+ if (await deps.free(want)) continue;
213
+ const holder = deps.holder(want);
214
+ if (holder?.tag === appTag(workspace.root, name)) {
215
+ running.push({
216
+ app: name,
217
+ port: want,
218
+ holder
219
+ });
220
+ continue;
221
+ }
222
+ const next = await nextFree(want, taken, deps);
223
+ owner.set(next, name);
224
+ ports[name] = next;
225
+ moved.push({
226
+ app: name,
227
+ from: want,
228
+ to: next,
229
+ ...holder ? { holder } : {}
230
+ });
231
+ }
232
+ await saveAppPorts(workspace.root, ports);
233
+ return {
234
+ ports,
235
+ moved,
236
+ running
237
+ };
238
+ }
239
+ /** The first port after `from` that no app has and nothing holds — reserved. */
240
+ async function nextFree(from, taken, deps) {
241
+ let next = from + 1;
242
+ while (taken.has(next) || !await deps.free(next)) next += 1;
243
+ taken.add(next);
244
+ return next;
245
+ }
246
+ //#endregion
247
+ Object.defineProperty(exports, "APP_TAG_ENV", {
248
+ enumerable: true,
249
+ get: function() {
250
+ return APP_TAG_ENV;
251
+ }
252
+ });
253
+ Object.defineProperty(exports, "appPorts_exports", {
254
+ enumerable: true,
255
+ get: function() {
256
+ return appPorts_exports;
257
+ }
258
+ });
259
+ Object.defineProperty(exports, "appTag", {
260
+ enumerable: true,
261
+ get: function() {
262
+ return appTag;
263
+ }
264
+ });
265
+ Object.defineProperty(exports, "assignAppPorts", {
266
+ enumerable: true,
267
+ get: function() {
268
+ return assignAppPorts;
269
+ }
270
+ });
271
+ Object.defineProperty(exports, "describeHolder", {
272
+ enumerable: true,
273
+ get: function() {
274
+ return describeHolder;
275
+ }
276
+ });
277
+ Object.defineProperty(exports, "describeMove", {
278
+ enumerable: true,
279
+ get: function() {
280
+ return describeMove;
281
+ }
282
+ });
283
+ Object.defineProperty(exports, "holderOf", {
284
+ enumerable: true,
285
+ get: function() {
286
+ return holderOf;
287
+ }
288
+ });
289
+ Object.defineProperty(exports, "withAppPorts", {
290
+ enumerable: true,
291
+ get: function() {
292
+ return withAppPorts;
293
+ }
294
+ });
295
+
296
+ //# sourceMappingURL=appPorts-IW-OZmRi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appPorts-IW-OZmRi.cjs","names":["resolve","execFileSync","readFileSync","readFile","join","mkdir","writeFile"],"sources":["../src/dev/appPorts.ts"],"sourcesContent":["/**\n * Which local port each app answers on — and what to do when it is taken.\n *\n * An app's port used to be fixed: 3000, 3001, … and `gkm dev` refused to start\n * if anything held one. That is right when the holder is this same app, left\n * running by a previous `gkm dev` — moving would start a second copy beside it.\n * It is wrong when the holder is another project's dev server, which also\n * defaults to 3000: two projects could not run at once, and nothing about the\n * app needs that port. A browser reaches it through the edge, whose URL carries\n * no app port, and every address a phone or a route uses is derived on each\n * start.\n *\n * So the holder is asked who it is. Every app process gkm starts is tagged with\n * {@link APP_TAG_ENV} — the workspace and the app — and children inherit it, so\n * whatever actually binds the port (`next-server`, a Metro worker, the tsx\n * server) carries it — or, when its own can't be read, one of its parents does.\n * A held port whose holder carries this app's tag is a\n * leftover, and is refused; anything else — untagged, another workspace's,\n * unreadable — is not ours, and the app moves to the next free port.\n *\n * The choice is kept in `.gkm/app-ports.json`, not recomputed: an app that\n * moved stays where it moved, so a bookmark or a phone's saved address does not\n * break the next time the other project happens to be stopped. Local only —\n * `gkm deploy` and `gkm docker` never read it.\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport type { NormalizedWorkspace } from '../workspace/types.js';\n\n/** Carried by every app process gkm starts: `<workspace root>#<app>`. */\nexport const APP_TAG_ENV = 'GKM_DEV_APP';\n\nconst APP_PORTS_PATH = '.gkm/app-ports.json';\n\n/** The tag an app's processes carry. The root is encoded, so it has no spaces. */\nexport function appTag(root: string, app: string): string {\n\treturn `${encodeURIComponent(resolve(root))}#${app}`;\n}\n\n/** What listens on a port, and the tag it carries if it can be read. */\nexport interface PortHolder {\n\tpid: number;\n\tcommand?: string;\n\ttag?: string;\n}\n\n/** Says, as `command (pid N)`, what holds a port. */\nexport function describeHolder(holder: PortHolder | undefined): string {\n\tif (!holder) return 'another process';\n\treturn `${holder.command ?? 'a process'} (pid ${holder.pid})`;\n}\n\n/**\n * Who is listening on a port, read the way a person would: `lsof` for the\n * pid, then that process's environment for its tag — `/proc/<pid>/environ` on\n * Linux, `ps eww` elsewhere. Both work for the user's own processes, which is\n * every process gkm starts; one that cannot be read has no tag, so is not ours.\n */\nexport function holderOf(port: number): PortHolder | undefined {\n\tlet out: string;\n\ttry {\n\t\tout = execFileSync(\n\t\t\t'lsof',\n\t\t\t['-nP', `-iTCP:${port}`, '-sTCP:LISTEN', '-Fpc'],\n\t\t\t{ encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] },\n\t\t);\n\t} catch {\n\t\treturn undefined;\n\t}\n\n\tconst pid = Number(out.match(/^p(\\d+)/m)?.[1]);\n\tif (!pid) return undefined;\n\tconst command = out.match(/^c(.+)$/m)?.[1];\n\tconst tag = lineageTagOf(pid);\n\n\treturn {\n\t\tpid,\n\t\t...(command ? { command } : {}),\n\t\t...(tag ? { tag } : {}),\n\t};\n}\n\n/** How far up a holder's parents to look before calling it untagged. */\nconst MAX_ANCESTORS = 8;\n\n/**\n * The tag of `pid`, or of its nearest parent that has one.\n *\n * A process can hide the tag it inherited: `next-server` renames itself, which\n * on macOS overwrites the memory `ps eww` reads its environment from, so `ps`\n * shows only its title. Its parent, the `next dev` gkm started, still carries\n * the tag. A child is only ever started by its parent, so a tagged parent makes\n * the holder this app's.\n */\nfunction lineageTagOf(pid: number): string | undefined {\n\tlet current: number | undefined = pid;\n\tfor (let depth = 0; current && current > 1; depth += 1) {\n\t\tconst tag = tagOf(current);\n\t\tif (tag || depth === MAX_ANCESTORS) return tag;\n\t\tcurrent = parentOf(current);\n\t}\n\treturn undefined;\n}\n\nfunction tagOf(pid: number): string | undefined {\n\tconst prefix = `${APP_TAG_ENV}=`;\n\ttry {\n\t\tconst entries =\n\t\t\tprocess.platform === 'linux'\n\t\t\t\t? readFileSync(`/proc/${pid}/environ`, 'utf8').split('\\0')\n\t\t\t\t: execFileSync('ps', ['eww', '-o', 'command=', '-p', String(pid)], {\n\t\t\t\t\t\tencoding: 'utf8',\n\t\t\t\t\t\tstdio: ['ignore', 'pipe', 'ignore'],\n\t\t\t\t\t}).split(/\\s+/);\n\t\treturn entries\n\t\t\t.find((entry) => entry.startsWith(prefix))\n\t\t\t?.slice(prefix.length);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction parentOf(pid: number): number | undefined {\n\ttry {\n\t\tconst ppid = Number(\n\t\t\texecFileSync('ps', ['-o', 'ppid=', '-p', String(pid)], {\n\t\t\t\tencoding: 'utf8',\n\t\t\t\tstdio: ['ignore', 'pipe', 'ignore'],\n\t\t\t}).trim(),\n\t\t);\n\t\treturn ppid > 0 ? ppid : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** The ports apps were given before, by app name. */\nexport async function savedAppPorts(\n\troot: string,\n): Promise<Record<string, number>> {\n\ttry {\n\t\treturn JSON.parse(await readFile(join(root, APP_PORTS_PATH), 'utf8'));\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nasync function saveAppPorts(\n\troot: string,\n\tports: Record<string, number>,\n): Promise<void> {\n\tawait mkdir(join(root, '.gkm'), { recursive: true });\n\tawait writeFile(\n\t\tjoin(root, APP_PORTS_PATH),\n\t\t`${JSON.stringify(ports, null, 2)}\\n`,\n\t);\n}\n\n/** The workspace, with each app on the port it was given locally. */\nexport function withAppPorts(\n\tworkspace: NormalizedWorkspace,\n\tports: Readonly<Record<string, number>>,\n): NormalizedWorkspace {\n\tconst apps = Object.fromEntries(\n\t\tObject.entries(workspace.apps).map(([name, app]) => [\n\t\t\tname,\n\t\t\tports[name] ? { ...app, port: ports[name] } : app,\n\t\t]),\n\t);\n\treturn { ...workspace, apps };\n}\n\n/** Says where an app moved from, to, and why. */\nexport function describeMove({\n\tapp,\n\tfrom,\n\tto,\n\tholder,\n\tsibling,\n}: AppMoved): string {\n\tconst why = sibling\n\t\t? `is ${sibling}'s`\n\t\t: `is held by ${describeHolder(holder)}, which is not this workspace's`;\n\treturn `↪️ ${app}: ${from} ${why} — using ${to}`;\n}\n\n/** An app this workspace already has running — left by a previous start. */\nexport interface AppRunning {\n\tapp: string;\n\tport: number;\n\tholder: PortHolder;\n}\n\n/** An app that moved, because another project or a sibling has its port. */\nexport interface AppMoved {\n\tapp: string;\n\tfrom: number;\n\tto: number;\n\t/** What holds the port, when another project's process does. */\n\tholder?: PortHolder;\n\t/** The app in this workspace the port is already given to. */\n\tsibling?: string;\n}\n\nexport interface AppPortsDeps {\n\t/** Whether a port can be bound right now. */\n\tfree: (port: number) => Promise<boolean>;\n\t/** Who holds a port. */\n\tholder: (port: number) => PortHolder | undefined;\n}\n\n/**\n * Give each named app a local port: the one it had, or its usual one, unless\n * another project holds it — then the next free one, which is kept.\n *\n * @returns every app's port, the apps that moved, and the apps this workspace\n * already has running (the caller refuses to start those).\n */\nexport async function assignAppPorts(\n\tworkspace: NormalizedWorkspace,\n\tnames: readonly string[],\n\tdeps: AppPortsDeps,\n): Promise<{\n\tports: Record<string, number>;\n\tmoved: AppMoved[];\n\trunning: AppRunning[];\n}> {\n\tconst saved = await savedAppPorts(workspace.root);\n\tconst wanted: Record<string, number> = {};\n\tfor (const name of names) {\n\t\tconst port = saved[name] ?? workspace.apps[name]?.port;\n\t\tif (port) wanted[name] = port;\n\t}\n\n\t// Every app's wanted port is reserved before any moves, so one that moves\n\t// never lands on a sibling's.\n\tconst taken = new Set([...Object.values(saved), ...Object.values(wanted)]);\n\tconst ports: Record<string, number> = { ...saved };\n\tconst moved: AppMoved[] = [];\n\tconst running: AppRunning[] = [];\n\n\t// A saved port is owned: by the app that saved it, or the first in the\n\t// file when a file saved before this rule holds one port twice. An app\n\t// moves off a port a sibling owns. Default ports are numbered across every\n\t// app, so one added later can be given a port a sibling kept from before\n\t// it existed. Two apps *configured* on one port own neither, and are left\n\t// to the conflict check, which refuses them.\n\tconst owner = new Map<number, string>();\n\tfor (const [name, port] of Object.entries(saved)) {\n\t\tif (!owner.has(port)) owner.set(port, name);\n\t}\n\n\t// Sorted, so which app moves first — and where — does not depend on order.\n\tfor (const name of Object.keys(wanted).sort()) {\n\t\tconst want = wanted[name]!;\n\t\tports[name] = want;\n\n\t\tconst sibling = owner.get(want);\n\t\tif (sibling !== undefined && sibling !== name) {\n\t\t\tconst next = await nextFree(want, taken, deps);\n\t\t\towner.set(next, name);\n\t\t\tports[name] = next;\n\t\t\tmoved.push({ app: name, from: want, to: next, sibling });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (await deps.free(want)) continue;\n\n\t\tconst holder = deps.holder(want);\n\t\tif (holder?.tag === appTag(workspace.root, name)) {\n\t\t\trunning.push({ app: name, port: want, holder });\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst next = await nextFree(want, taken, deps);\n\t\towner.set(next, name);\n\t\tports[name] = next;\n\t\tmoved.push({\n\t\t\tapp: name,\n\t\t\tfrom: want,\n\t\t\tto: next,\n\t\t\t...(holder ? { holder } : {}),\n\t\t});\n\t}\n\n\tawait saveAppPorts(workspace.root, ports);\n\treturn { ports, moved, running };\n}\n\n/** The first port after `from` that no app has and nothing holds — reserved. */\nasync function nextFree(\n\tfrom: number,\n\ttaken: Set<number>,\n\tdeps: AppPortsDeps,\n): Promise<number> {\n\tlet next = from + 1;\n\twhile (taken.has(next) || !(await deps.free(next))) next += 1;\n\ttaken.add(next);\n\treturn next;\n}\n"],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-BhDjJH2R.mjs";
2
+ import { n as serializeWithin, r as withStageCredentials, t as awsClientConfig } from "./awsStore-Bx5nCFnS.mjs";
3
+ import { GetParameterCommand, ParameterNotFound, PutParameterCommand, SSMClient } from "@aws-sdk/client-ssm";
4
+ //#region src/secrets/aws.ts
5
+ /**
6
+ * A stage's secrets in SSM Parameter Store, in the stage's own AWS account.
7
+ *
8
+ * One parameter per stage, `/gkm/<project>/<stage>/secrets`, a SecureString —
9
+ * encrypted at rest by KMS, so nothing about it needs a key file anywhere.
10
+ * Which account it is in is whichever credentials are active: the stage's
11
+ * OIDC role in a deploy job, or `--profile` on a developer's machine. With
12
+ * staging and production in different accounts, each stage's secrets sit
13
+ * beside its infrastructure, and a staging role cannot read production's.
14
+ *
15
+ * Written in the Intelligent-Tiering tier: a stage under 4 KB stays a free
16
+ * standard parameter, a larger one becomes advanced (up to 8 KB). Past 8 KB
17
+ * the write is refused with {@link StageSecretsTooLarge} before AWS is
18
+ * called; Secrets Manager (`secretsManager.ts`) holds up to 64 KB.
19
+ */
20
+ var aws_exports = /* @__PURE__ */ __exportAll({
21
+ AwsSecretsStore: () => AwsSecretsStore,
22
+ SSM_PARAMETER_LIMIT: () => SSM_PARAMETER_LIMIT,
23
+ secretsParameterName: () => secretsParameterName
24
+ });
25
+ /** The most an SSM parameter holds: 8 KB, in the advanced tier. */
26
+ const SSM_PARAMETER_LIMIT = 8192;
27
+ /** The parameter a stage's secrets are kept in. */
28
+ function secretsParameterName(project, stage) {
29
+ return `/gkm/${project}/${stage}/secrets`;
30
+ }
31
+ var AwsSecretsStore = class {
32
+ options;
33
+ name = "ssm";
34
+ client;
35
+ constructor(options) {
36
+ this.options = options;
37
+ }
38
+ async ssm() {
39
+ if (this.client) return this.client;
40
+ this.client = new SSMClient(await awsClientConfig(this.options));
41
+ return this.client;
42
+ }
43
+ /** Where a call for `stage` is, for an error saying it has no credentials. */
44
+ context(stage, access) {
45
+ return {
46
+ stage,
47
+ store: this.name,
48
+ profile: this.options.profile,
49
+ access
50
+ };
51
+ }
52
+ /**
53
+ * @throws {StageSecretsUnreadable} when there are no AWS credentials to
54
+ * read it with, or they have expired
55
+ */
56
+ async read(stage) {
57
+ const ssm = await this.ssm();
58
+ try {
59
+ const { Parameter } = await withStageCredentials(this.context(stage, "read"), () => ssm.send(new GetParameterCommand({
60
+ Name: secretsParameterName(this.options.project, stage),
61
+ WithDecryption: true
62
+ })));
63
+ return Parameter?.Value ? JSON.parse(Parameter.Value) : null;
64
+ } catch (error) {
65
+ if (error instanceof ParameterNotFound) return null;
66
+ throw error;
67
+ }
68
+ }
69
+ /**
70
+ * @throws {StageSecretsUnreadable} when there are no AWS credentials to
71
+ * write it with, or they have expired
72
+ */
73
+ async write(stage, secrets) {
74
+ const value = serializeWithin(stage, this.name, secrets, SSM_PARAMETER_LIMIT);
75
+ const ssm = await this.ssm();
76
+ await withStageCredentials(this.context(stage, "write"), () => ssm.send(new PutParameterCommand({
77
+ Name: secretsParameterName(this.options.project, stage),
78
+ Value: value,
79
+ Type: "SecureString",
80
+ Tier: "Intelligent-Tiering",
81
+ Overwrite: true,
82
+ Description: `gkm secrets for ${this.options.project}/${stage}`
83
+ })));
84
+ }
85
+ };
86
+ //#endregion
87
+ export { secretsParameterName as n, aws_exports as t };
88
+
89
+ //# sourceMappingURL=aws-8QQ8n-t6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-8QQ8n-t6.mjs","names":[],"sources":["../src/secrets/aws.ts"],"sourcesContent":["/**\n * A stage's secrets in SSM Parameter Store, in the stage's own AWS account.\n *\n * One parameter per stage, `/gkm/<project>/<stage>/secrets`, a SecureString —\n * encrypted at rest by KMS, so nothing about it needs a key file anywhere.\n * Which account it is in is whichever credentials are active: the stage's\n * OIDC role in a deploy job, or `--profile` on a developer's machine. With\n * staging and production in different accounts, each stage's secrets sit\n * beside its infrastructure, and a staging role cannot read production's.\n *\n * Written in the Intelligent-Tiering tier: a stage under 4 KB stays a free\n * standard parameter, a larger one becomes advanced (up to 8 KB). Past 8 KB\n * the write is refused with {@link StageSecretsTooLarge} before AWS is\n * called; Secrets Manager (`secretsManager.ts`) holds up to 64 KB.\n */\n\nimport {\n\tGetParameterCommand,\n\tParameterNotFound,\n\tPutParameterCommand,\n\tSSMClient,\n} from '@aws-sdk/client-ssm';\nimport {\n\ttype AwsStoreOptions,\n\tawsClientConfig,\n\tserializeWithin,\n\twithStageCredentials,\n} from './awsStore.js';\nimport type { SecretsStore } from './store.js';\nimport type { StageSecrets } from './types.js';\n\nexport type AwsSecretsStoreOptions = AwsStoreOptions;\n\n/** The most an SSM parameter holds: 8 KB, in the advanced tier. */\nexport const SSM_PARAMETER_LIMIT = 8 * 1024;\n\n/** The parameter a stage's secrets are kept in. */\nexport function secretsParameterName(project: string, stage: string): string {\n\treturn `/gkm/${project}/${stage}/secrets`;\n}\n\nexport class AwsSecretsStore implements SecretsStore {\n\treadonly name = 'ssm';\n\n\tprivate client?: SSMClient;\n\n\tconstructor(private readonly options: AwsSecretsStoreOptions) {}\n\n\tprivate async ssm(): Promise<SSMClient> {\n\t\tif (this.client) return this.client;\n\n\t\tthis.client = new SSMClient(await awsClientConfig(this.options));\n\t\treturn this.client;\n\t}\n\n\t/** Where a call for `stage` is, for an error saying it has no credentials. */\n\tprivate context(stage: string, access: 'read' | 'write') {\n\t\treturn { stage, store: this.name, profile: this.options.profile, access };\n\t}\n\n\t/**\n\t * @throws {StageSecretsUnreadable} when there are no AWS credentials to\n\t * read it with, or they have expired\n\t */\n\tasync read(stage: string): Promise<StageSecrets | null> {\n\t\tconst ssm = await this.ssm();\n\n\t\ttry {\n\t\t\tconst { Parameter } = await withStageCredentials(\n\t\t\t\tthis.context(stage, 'read'),\n\t\t\t\t() =>\n\t\t\t\t\tssm.send(\n\t\t\t\t\t\tnew GetParameterCommand({\n\t\t\t\t\t\t\tName: secretsParameterName(this.options.project, stage),\n\t\t\t\t\t\t\tWithDecryption: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t);\n\t\t\treturn Parameter?.Value\n\t\t\t\t? (JSON.parse(Parameter.Value) as StageSecrets)\n\t\t\t\t: null;\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\t/**\n\t * @throws {StageSecretsUnreadable} when there are no AWS credentials to\n\t * write it with, or they have expired\n\t */\n\tasync write(stage: string, secrets: StageSecrets): Promise<void> {\n\t\tconst value = serializeWithin(\n\t\t\tstage,\n\t\t\tthis.name,\n\t\t\tsecrets,\n\t\t\tSSM_PARAMETER_LIMIT,\n\t\t);\n\t\tconst ssm = await this.ssm();\n\n\t\tawait withStageCredentials(this.context(stage, 'write'), () =>\n\t\t\tssm.send(\n\t\t\t\tnew PutParameterCommand({\n\t\t\t\t\tName: secretsParameterName(this.options.project, stage),\n\t\t\t\t\tValue: value,\n\t\t\t\t\tType: 'SecureString',\n\t\t\t\t\t// Standard (free) under 4 KB, advanced past it; never the other way.\n\t\t\t\t\tTier: 'Intelligent-Tiering',\n\t\t\t\t\tOverwrite: true,\n\t\t\t\t\tDescription: `gkm secrets for ${this.options.project}/${stage}`,\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAa,sBAAsB;;AAGnC,SAAgB,qBAAqB,SAAiB,OAAuB;CAC5E,OAAO,QAAQ,QAAQ,GAAG,MAAM;AACjC;AAEA,IAAa,kBAAb,MAAqD;CAKvB;CAJ7B,OAAgB;CAEhB;CAEA,YAAY,SAAkD;EAAjC,KAAA,UAAA;CAAkC;CAE/D,MAAc,MAA0B;EACvC,IAAI,KAAK,QAAQ,OAAO,KAAK;EAE7B,KAAK,SAAS,IAAI,UAAU,MAAM,gBAAgB,KAAK,OAAO,CAAC;EAC/D,OAAO,KAAK;CACb;;CAGA,QAAgB,OAAe,QAA0B;EACxD,OAAO;GAAE;GAAO,OAAO,KAAK;GAAM,SAAS,KAAK,QAAQ;GAAS;EAAO;CACzE;;;;;CAMA,MAAM,KAAK,OAA6C;EACvD,MAAM,MAAM,MAAM,KAAK,IAAI;EAE3B,IAAI;GACH,MAAM,EAAE,cAAc,MAAM,qBAC3B,KAAK,QAAQ,OAAO,MAAM,SAEzB,IAAI,KACH,IAAI,oBAAoB;IACvB,MAAM,qBAAqB,KAAK,QAAQ,SAAS,KAAK;IACtD,gBAAgB;GACjB,CAAC,CACF,CACF;GACA,OAAO,WAAW,QACd,KAAK,MAAM,UAAU,KAAK,IAC3B;EACJ,SAAS,OAAO;GACf,IAAI,iBAAiB,mBAAmB,OAAO;GAC/C,MAAM;EACP;CACD;;;;;CAMA,MAAM,MAAM,OAAe,SAAsC;EAChE,MAAM,QAAQ,gBACb,OACA,KAAK,MACL,SACA,mBACD;EACA,MAAM,MAAM,MAAM,KAAK,IAAI;EAE3B,MAAM,qBAAqB,KAAK,QAAQ,OAAO,OAAO,SACrD,IAAI,KACH,IAAI,oBAAoB;GACvB,MAAM,qBAAqB,KAAK,QAAQ,SAAS,KAAK;GACtD,OAAO;GACP,MAAM;GAEN,MAAM;GACN,WAAW;GACX,aAAa,mBAAmB,KAAK,QAAQ,QAAQ,GAAG;EACzD,CAAC,CACF,CACD;CACD;AACD"}
@@ -0,0 +1,100 @@
1
+ const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
2
+ const require_awsStore = require("./awsStore-u3ehhMoY.cjs");
3
+ let _aws_sdk_client_ssm = require("@aws-sdk/client-ssm");
4
+ //#region src/secrets/aws.ts
5
+ /**
6
+ * A stage's secrets in SSM Parameter Store, in the stage's own AWS account.
7
+ *
8
+ * One parameter per stage, `/gkm/<project>/<stage>/secrets`, a SecureString —
9
+ * encrypted at rest by KMS, so nothing about it needs a key file anywhere.
10
+ * Which account it is in is whichever credentials are active: the stage's
11
+ * OIDC role in a deploy job, or `--profile` on a developer's machine. With
12
+ * staging and production in different accounts, each stage's secrets sit
13
+ * beside its infrastructure, and a staging role cannot read production's.
14
+ *
15
+ * Written in the Intelligent-Tiering tier: a stage under 4 KB stays a free
16
+ * standard parameter, a larger one becomes advanced (up to 8 KB). Past 8 KB
17
+ * the write is refused with {@link StageSecretsTooLarge} before AWS is
18
+ * called; Secrets Manager (`secretsManager.ts`) holds up to 64 KB.
19
+ */
20
+ var aws_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
21
+ AwsSecretsStore: () => AwsSecretsStore,
22
+ SSM_PARAMETER_LIMIT: () => SSM_PARAMETER_LIMIT,
23
+ secretsParameterName: () => secretsParameterName
24
+ });
25
+ /** The most an SSM parameter holds: 8 KB, in the advanced tier. */
26
+ const SSM_PARAMETER_LIMIT = 8192;
27
+ /** The parameter a stage's secrets are kept in. */
28
+ function secretsParameterName(project, stage) {
29
+ return `/gkm/${project}/${stage}/secrets`;
30
+ }
31
+ var AwsSecretsStore = class {
32
+ options;
33
+ name = "ssm";
34
+ client;
35
+ constructor(options) {
36
+ this.options = options;
37
+ }
38
+ async ssm() {
39
+ if (this.client) return this.client;
40
+ this.client = new _aws_sdk_client_ssm.SSMClient(await require_awsStore.awsClientConfig(this.options));
41
+ return this.client;
42
+ }
43
+ /** Where a call for `stage` is, for an error saying it has no credentials. */
44
+ context(stage, access) {
45
+ return {
46
+ stage,
47
+ store: this.name,
48
+ profile: this.options.profile,
49
+ access
50
+ };
51
+ }
52
+ /**
53
+ * @throws {StageSecretsUnreadable} when there are no AWS credentials to
54
+ * read it with, or they have expired
55
+ */
56
+ async read(stage) {
57
+ const ssm = await this.ssm();
58
+ try {
59
+ const { Parameter } = await require_awsStore.withStageCredentials(this.context(stage, "read"), () => ssm.send(new _aws_sdk_client_ssm.GetParameterCommand({
60
+ Name: secretsParameterName(this.options.project, stage),
61
+ WithDecryption: true
62
+ })));
63
+ return Parameter?.Value ? JSON.parse(Parameter.Value) : null;
64
+ } catch (error) {
65
+ if (error instanceof _aws_sdk_client_ssm.ParameterNotFound) return null;
66
+ throw error;
67
+ }
68
+ }
69
+ /**
70
+ * @throws {StageSecretsUnreadable} when there are no AWS credentials to
71
+ * write it with, or they have expired
72
+ */
73
+ async write(stage, secrets) {
74
+ const value = require_awsStore.serializeWithin(stage, this.name, secrets, SSM_PARAMETER_LIMIT);
75
+ const ssm = await this.ssm();
76
+ await require_awsStore.withStageCredentials(this.context(stage, "write"), () => ssm.send(new _aws_sdk_client_ssm.PutParameterCommand({
77
+ Name: secretsParameterName(this.options.project, stage),
78
+ Value: value,
79
+ Type: "SecureString",
80
+ Tier: "Intelligent-Tiering",
81
+ Overwrite: true,
82
+ Description: `gkm secrets for ${this.options.project}/${stage}`
83
+ })));
84
+ }
85
+ };
86
+ //#endregion
87
+ Object.defineProperty(exports, "aws_exports", {
88
+ enumerable: true,
89
+ get: function() {
90
+ return aws_exports;
91
+ }
92
+ });
93
+ Object.defineProperty(exports, "secretsParameterName", {
94
+ enumerable: true,
95
+ get: function() {
96
+ return secretsParameterName;
97
+ }
98
+ });
99
+
100
+ //# sourceMappingURL=aws-DY9NqQIT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-DY9NqQIT.cjs","names":["SSMClient","awsClientConfig","withStageCredentials","GetParameterCommand","ParameterNotFound","serializeWithin","PutParameterCommand"],"sources":["../src/secrets/aws.ts"],"sourcesContent":["/**\n * A stage's secrets in SSM Parameter Store, in the stage's own AWS account.\n *\n * One parameter per stage, `/gkm/<project>/<stage>/secrets`, a SecureString —\n * encrypted at rest by KMS, so nothing about it needs a key file anywhere.\n * Which account it is in is whichever credentials are active: the stage's\n * OIDC role in a deploy job, or `--profile` on a developer's machine. With\n * staging and production in different accounts, each stage's secrets sit\n * beside its infrastructure, and a staging role cannot read production's.\n *\n * Written in the Intelligent-Tiering tier: a stage under 4 KB stays a free\n * standard parameter, a larger one becomes advanced (up to 8 KB). Past 8 KB\n * the write is refused with {@link StageSecretsTooLarge} before AWS is\n * called; Secrets Manager (`secretsManager.ts`) holds up to 64 KB.\n */\n\nimport {\n\tGetParameterCommand,\n\tParameterNotFound,\n\tPutParameterCommand,\n\tSSMClient,\n} from '@aws-sdk/client-ssm';\nimport {\n\ttype AwsStoreOptions,\n\tawsClientConfig,\n\tserializeWithin,\n\twithStageCredentials,\n} from './awsStore.js';\nimport type { SecretsStore } from './store.js';\nimport type { StageSecrets } from './types.js';\n\nexport type AwsSecretsStoreOptions = AwsStoreOptions;\n\n/** The most an SSM parameter holds: 8 KB, in the advanced tier. */\nexport const SSM_PARAMETER_LIMIT = 8 * 1024;\n\n/** The parameter a stage's secrets are kept in. */\nexport function secretsParameterName(project: string, stage: string): string {\n\treturn `/gkm/${project}/${stage}/secrets`;\n}\n\nexport class AwsSecretsStore implements SecretsStore {\n\treadonly name = 'ssm';\n\n\tprivate client?: SSMClient;\n\n\tconstructor(private readonly options: AwsSecretsStoreOptions) {}\n\n\tprivate async ssm(): Promise<SSMClient> {\n\t\tif (this.client) return this.client;\n\n\t\tthis.client = new SSMClient(await awsClientConfig(this.options));\n\t\treturn this.client;\n\t}\n\n\t/** Where a call for `stage` is, for an error saying it has no credentials. */\n\tprivate context(stage: string, access: 'read' | 'write') {\n\t\treturn { stage, store: this.name, profile: this.options.profile, access };\n\t}\n\n\t/**\n\t * @throws {StageSecretsUnreadable} when there are no AWS credentials to\n\t * read it with, or they have expired\n\t */\n\tasync read(stage: string): Promise<StageSecrets | null> {\n\t\tconst ssm = await this.ssm();\n\n\t\ttry {\n\t\t\tconst { Parameter } = await withStageCredentials(\n\t\t\t\tthis.context(stage, 'read'),\n\t\t\t\t() =>\n\t\t\t\t\tssm.send(\n\t\t\t\t\t\tnew GetParameterCommand({\n\t\t\t\t\t\t\tName: secretsParameterName(this.options.project, stage),\n\t\t\t\t\t\t\tWithDecryption: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t);\n\t\t\treturn Parameter?.Value\n\t\t\t\t? (JSON.parse(Parameter.Value) as StageSecrets)\n\t\t\t\t: null;\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\t/**\n\t * @throws {StageSecretsUnreadable} when there are no AWS credentials to\n\t * write it with, or they have expired\n\t */\n\tasync write(stage: string, secrets: StageSecrets): Promise<void> {\n\t\tconst value = serializeWithin(\n\t\t\tstage,\n\t\t\tthis.name,\n\t\t\tsecrets,\n\t\t\tSSM_PARAMETER_LIMIT,\n\t\t);\n\t\tconst ssm = await this.ssm();\n\n\t\tawait withStageCredentials(this.context(stage, 'write'), () =>\n\t\t\tssm.send(\n\t\t\t\tnew PutParameterCommand({\n\t\t\t\t\tName: secretsParameterName(this.options.project, stage),\n\t\t\t\t\tValue: value,\n\t\t\t\t\tType: 'SecureString',\n\t\t\t\t\t// Standard (free) under 4 KB, advanced past it; never the other way.\n\t\t\t\t\tTier: 'Intelligent-Tiering',\n\t\t\t\t\tOverwrite: true,\n\t\t\t\t\tDescription: `gkm secrets for ${this.options.project}/${stage}`,\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAa,sBAAsB;;AAGnC,SAAgB,qBAAqB,SAAiB,OAAuB;CAC5E,OAAO,QAAQ,QAAQ,GAAG,MAAM;AACjC;AAEA,IAAa,kBAAb,MAAqD;CAKvB;CAJ7B,OAAgB;CAEhB;CAEA,YAAY,SAAkD;EAAjC,KAAA,UAAA;CAAkC;CAE/D,MAAc,MAA0B;EACvC,IAAI,KAAK,QAAQ,OAAO,KAAK;EAE7B,KAAK,SAAS,IAAIA,oBAAAA,UAAU,MAAMC,iBAAAA,gBAAgB,KAAK,OAAO,CAAC;EAC/D,OAAO,KAAK;CACb;;CAGA,QAAgB,OAAe,QAA0B;EACxD,OAAO;GAAE;GAAO,OAAO,KAAK;GAAM,SAAS,KAAK,QAAQ;GAAS;EAAO;CACzE;;;;;CAMA,MAAM,KAAK,OAA6C;EACvD,MAAM,MAAM,MAAM,KAAK,IAAI;EAE3B,IAAI;GACH,MAAM,EAAE,cAAc,MAAMC,iBAAAA,qBAC3B,KAAK,QAAQ,OAAO,MAAM,SAEzB,IAAI,KACH,IAAIC,oBAAAA,oBAAoB;IACvB,MAAM,qBAAqB,KAAK,QAAQ,SAAS,KAAK;IACtD,gBAAgB;GACjB,CAAC,CACF,CACF;GACA,OAAO,WAAW,QACd,KAAK,MAAM,UAAU,KAAK,IAC3B;EACJ,SAAS,OAAO;GACf,IAAI,iBAAiBC,oBAAAA,mBAAmB,OAAO;GAC/C,MAAM;EACP;CACD;;;;;CAMA,MAAM,MAAM,OAAe,SAAsC;EAChE,MAAM,QAAQC,iBAAAA,gBACb,OACA,KAAK,MACL,SACA,mBACD;EACA,MAAM,MAAM,MAAM,KAAK,IAAI;EAE3B,MAAMH,iBAAAA,qBAAqB,KAAK,QAAQ,OAAO,OAAO,SACrD,IAAI,KACH,IAAII,oBAAAA,oBAAoB;GACvB,MAAM,qBAAqB,KAAK,QAAQ,SAAS,KAAK;GACtD,OAAO;GACP,MAAM;GAEN,MAAM;GACN,WAAW;GACX,aAAa,mBAAmB,KAAK,QAAQ,QAAQ,GAAG;EACzD,CAAC,CACF,CACD;CACD;AACD"}
@@ -0,0 +1,121 @@
1
+ import { t as GkmError } from "./errors-D8Gwp5kU.mjs";
2
+ //#region src/secrets/awsStore.ts
3
+ /**
4
+ * What the AWS secrets stores share: how a client finds its credentials, what
5
+ * it says when it has none, and — for SSM and Secrets Manager, which hold a
6
+ * stage in one value of a fixed size — how big a stage may be before AWS
7
+ * would refuse it. S3 has no such limit.
8
+ */
9
+ /** The client config both stores build their SDK client from. */
10
+ async function awsClientConfig(options) {
11
+ const config = { region: options.region };
12
+ if (options.profile) {
13
+ const { fromIni } = await import("@aws-sdk/credential-providers");
14
+ config.credentials = fromIni({ profile: options.profile });
15
+ }
16
+ if (options.endpoint) config.endpoint = options.endpoint;
17
+ return config;
18
+ }
19
+ /**
20
+ * A stage's secrets, serialized, are larger than the store can hold: 8 KB for
21
+ * an SSM parameter (advanced tier), 64 KB for a Secrets Manager secret.
22
+ *
23
+ * Refused before AWS is called, so nothing half-written is left behind and
24
+ * the answer is not a bare `ValidationException`.
25
+ */
26
+ var StageSecretsTooLarge = class extends GkmError {
27
+ stage;
28
+ store;
29
+ bytes;
30
+ limit;
31
+ constructor(stage, store, bytes, limit) {
32
+ super(`The secrets for stage "${stage}" are ${bytes} bytes, more than the ${limit} bytes ${store} holds in one ${store === "ssm" ? "parameter" : "secret"}. ` + (store === "ssm" ? `Keep them in S3 instead, which has no such limit: copy the stage with gkm secrets:migrate --stage ${stage} --to s3, then set secrets.store to { provider: 's3' } in gkm.config.ts.` : "Remove credentials the stage no longer uses, or keep the largest ones somewhere they are fetched from at runtime."));
33
+ this.stage = stage;
34
+ this.store = store;
35
+ this.bytes = bytes;
36
+ this.limit = limit;
37
+ this.name = "StageSecretsTooLarge";
38
+ }
39
+ };
40
+ /** The stage serialized, refused if it is larger than `limit` bytes. */
41
+ function serializeWithin(stage, store, value, limit) {
42
+ const serialized = JSON.stringify(value);
43
+ const bytes = Buffer.byteLength(serialized, "utf8");
44
+ if (bytes > limit) throw new StageSecretsTooLarge(stage, store, bytes, limit);
45
+ return serialized;
46
+ }
47
+ /** Where each AWS store keeps a stage's secrets, as a person reads it. */
48
+ const AWS_STORES = {
49
+ ssm: "SSM Parameter Store",
50
+ "secrets-manager": "Secrets Manager",
51
+ s3: "S3"
52
+ };
53
+ /**
54
+ * A deployed stage's secrets are kept in its AWS account, and no AWS
55
+ * credentials were found to reach them with — or the ones found have expired.
56
+ *
57
+ * Raised by the AWS stores themselves, on a read or a write, so every command
58
+ * that touches a stage's secrets says it the same way.
59
+ */
60
+ var StageSecretsUnreadable = class extends GkmError {
61
+ stage;
62
+ store;
63
+ profile;
64
+ access;
65
+ reason;
66
+ constructor(input, cause) {
67
+ const { stage, store, profile } = input;
68
+ const access = input.access ?? "read";
69
+ const reason = input.reason ?? "no-credentials";
70
+ const where = AWS_STORES[store] ?? `the '${store}' store`;
71
+ const named = "--profile <profile> where the command takes it, or AWS_PROFILE=<profile>";
72
+ const lacking = reason === "expired" ? profile ? `the AWS profile '${profile}' signed in, but its session has expired. ` : "the AWS credentials found have expired. " : profile ? `the AWS profile '${profile}' has no credentials to ${access} them with. ` : `no AWS credentials were found to ${access} them with. `;
73
+ const fix = profile ? `Sign in to it (aws sso login --profile ${profile}) or name another: ${named}.` : reason === "expired" ? `Export fresh ones, or name the account's profile: ${named}.` : `Name the account's profile: ${named}.`;
74
+ super(`The '${stage}' stage's secrets are kept in ${where}, in the stage's AWS account, and ` + lacking + fix, cause === void 0 ? void 0 : { cause });
75
+ this.name = "StageSecretsUnreadable";
76
+ this.stage = stage;
77
+ this.store = store;
78
+ this.profile = profile;
79
+ this.access = access;
80
+ this.reason = reason;
81
+ }
82
+ };
83
+ /**
84
+ * Why an AWS call failed for want of credentials, by the SDK's error name —
85
+ * its message being free to change — or undefined when it failed for any
86
+ * other reason.
87
+ *
88
+ * - `CredentialsProviderError`: the credential chain found nothing, or a
89
+ * profile's SSO session is missing or expired (the SSO provider wraps its
90
+ * token errors in this one).
91
+ * - `TokenProviderError`: an SSO token, should one reach here unwrapped.
92
+ * - `ExpiredTokenException`/`ExpiredToken`: credentials were found, and AWS
93
+ * refused them as expired.
94
+ */
95
+ function credentialsFailure(error) {
96
+ const name = error?.name;
97
+ if (name === "CredentialsProviderError" || name === "TokenProviderError") return "no-credentials";
98
+ if (name === "ExpiredTokenException" || name === "ExpiredToken") return "expired";
99
+ }
100
+ /**
101
+ * Run one AWS call of a store, refusing a failure for want of credentials
102
+ * with {@link StageSecretsUnreadable}. Any other failure is the store's own,
103
+ * and passes through.
104
+ */
105
+ async function withStageCredentials(context, call) {
106
+ try {
107
+ return await call();
108
+ } catch (error) {
109
+ const reason = credentialsFailure(error);
110
+ if (reason === void 0) throw error;
111
+ throw new StageSecretsUnreadable({
112
+ ...context,
113
+ profile: context.profile ?? (process.env.AWS_PROFILE || void 0),
114
+ reason
115
+ }, error);
116
+ }
117
+ }
118
+ //#endregion
119
+ export { serializeWithin as n, withStageCredentials as r, awsClientConfig as t };
120
+
121
+ //# sourceMappingURL=awsStore-Bx5nCFnS.mjs.map