@ankhorage/infra 4.1.12 → 5.1.0

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 (528) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +21 -32
  3. package/dist/cli/bin.d.ts +1 -8
  4. package/dist/cli/bin.d.ts.map +1 -1
  5. package/dist/cli/bin.js +2 -34
  6. package/dist/cli/bin.js.map +1 -1
  7. package/dist/cli/commands/destroy.d.ts +11 -0
  8. package/dist/cli/commands/destroy.d.ts.map +1 -0
  9. package/dist/cli/commands/destroy.js +51 -0
  10. package/dist/cli/commands/destroy.js.map +1 -0
  11. package/dist/cli/commands/down.d.ts +11 -0
  12. package/dist/cli/commands/down.d.ts.map +1 -0
  13. package/dist/cli/commands/down.js +27 -0
  14. package/dist/cli/commands/down.js.map +1 -0
  15. package/dist/cli/commands/generate.d.ts +11 -0
  16. package/dist/cli/commands/generate.d.ts.map +1 -0
  17. package/dist/cli/commands/generate.js +29 -0
  18. package/dist/cli/commands/generate.js.map +1 -0
  19. package/dist/cli/commands/outputs.d.ts +11 -0
  20. package/dist/cli/commands/outputs.d.ts.map +1 -0
  21. package/dist/cli/commands/outputs.js +25 -0
  22. package/dist/cli/commands/outputs.js.map +1 -0
  23. package/dist/cli/commands/plan.d.ts +11 -0
  24. package/dist/cli/commands/plan.d.ts.map +1 -0
  25. package/dist/cli/commands/plan.js +19 -0
  26. package/dist/cli/commands/plan.js.map +1 -0
  27. package/dist/cli/commands/status.d.ts +11 -0
  28. package/dist/cli/commands/status.d.ts.map +1 -0
  29. package/dist/cli/commands/status.js +19 -0
  30. package/dist/cli/commands/status.js.map +1 -0
  31. package/dist/cli/commands/up.d.ts +11 -0
  32. package/dist/cli/commands/up.d.ts.map +1 -0
  33. package/dist/cli/commands/up.js +28 -0
  34. package/dist/cli/commands/up.js.map +1 -0
  35. package/dist/cli/commands/validate.d.ts +11 -0
  36. package/dist/cli/commands/validate.d.ts.map +1 -0
  37. package/dist/cli/commands/validate.js +19 -0
  38. package/dist/cli/commands/validate.js.map +1 -0
  39. package/dist/cli/constants.d.ts +66 -0
  40. package/dist/cli/constants.d.ts.map +1 -0
  41. package/dist/cli/constants.js +19 -0
  42. package/dist/cli/constants.js.map +1 -0
  43. package/dist/cli/createDefaultInfraCommandContext.d.ts +4 -0
  44. package/dist/cli/createDefaultInfraCommandContext.d.ts.map +1 -0
  45. package/dist/{commandContext.js → cli/createDefaultInfraCommandContext.js} +4 -3
  46. package/dist/cli/createDefaultInfraCommandContext.js.map +1 -0
  47. package/dist/cli/createInfraRuntimeProvider.d.ts +5 -0
  48. package/dist/cli/createInfraRuntimeProvider.d.ts.map +1 -0
  49. package/dist/cli/createInfraRuntimeProvider.js +22 -0
  50. package/dist/cli/createInfraRuntimeProvider.js.map +1 -0
  51. package/dist/cli/createProviderCommandDescriptors.d.ts +4 -0
  52. package/dist/cli/createProviderCommandDescriptors.d.ts.map +1 -0
  53. package/dist/cli/createProviderCommandDescriptors.js +6 -0
  54. package/dist/cli/createProviderCommandDescriptors.js.map +1 -0
  55. package/dist/cli/findInfraCommand.d.ts +4 -0
  56. package/dist/cli/findInfraCommand.d.ts.map +1 -0
  57. package/dist/cli/findInfraCommand.js +6 -0
  58. package/dist/cli/findInfraCommand.js.map +1 -0
  59. package/dist/cli/index.d.ts +3 -8
  60. package/dist/cli/index.d.ts.map +1 -1
  61. package/dist/cli/index.js +2 -24
  62. package/dist/cli/index.js.map +1 -1
  63. package/dist/cli/renderInfraRootHelp.d.ts +3 -0
  64. package/dist/cli/renderInfraRootHelp.d.ts.map +1 -0
  65. package/dist/cli/renderInfraRootHelp.js +21 -0
  66. package/dist/cli/renderInfraRootHelp.js.map +1 -0
  67. package/dist/cli/renderUnknownInfraCommand.d.ts +3 -0
  68. package/dist/cli/renderUnknownInfraCommand.d.ts.map +1 -0
  69. package/dist/cli/renderUnknownInfraCommand.js +5 -0
  70. package/dist/cli/renderUnknownInfraCommand.js.map +1 -0
  71. package/dist/cli/runInfraCliAsync.d.ts +10 -0
  72. package/dist/cli/runInfraCliAsync.d.ts.map +1 -0
  73. package/dist/cli/runInfraCliAsync.js +34 -0
  74. package/dist/cli/runInfraCliAsync.js.map +1 -0
  75. package/dist/cli/runInfraCommandAsync.d.ts +4 -0
  76. package/dist/cli/runInfraCommandAsync.d.ts.map +1 -0
  77. package/dist/cli/runInfraCommandAsync.js +100 -0
  78. package/dist/cli/runInfraCommandAsync.js.map +1 -0
  79. package/dist/cli/utils/prepareInfraCommandOperationAsync.d.ts +4 -0
  80. package/dist/cli/utils/prepareInfraCommandOperationAsync.d.ts.map +1 -0
  81. package/dist/cli/utils/prepareInfraCommandOperationAsync.js +45 -0
  82. package/dist/cli/utils/prepareInfraCommandOperationAsync.js.map +1 -0
  83. package/dist/cli/utils/requireInfraSuccess.d.ts +7 -0
  84. package/dist/cli/utils/requireInfraSuccess.d.ts.map +1 -0
  85. package/dist/cli/utils/requireInfraSuccess.js +17 -0
  86. package/dist/cli/utils/requireInfraSuccess.js.map +1 -0
  87. package/dist/cli/utils/resolveInfraPersistence.d.ts +4 -0
  88. package/dist/cli/utils/resolveInfraPersistence.d.ts.map +1 -0
  89. package/dist/cli/utils/resolveInfraPersistence.js +17 -0
  90. package/dist/cli/utils/resolveInfraPersistence.js.map +1 -0
  91. package/dist/cli/utils/writeInfraEnvironmentOutputs.d.ts +5 -0
  92. package/dist/cli/utils/writeInfraEnvironmentOutputs.d.ts.map +1 -0
  93. package/dist/cli/utils/writeInfraEnvironmentOutputs.js +16 -0
  94. package/dist/cli/utils/writeInfraEnvironmentOutputs.js.map +1 -0
  95. package/dist/cli/utils/writeInfraStructured.d.ts +4 -0
  96. package/dist/cli/utils/writeInfraStructured.d.ts.map +1 -0
  97. package/dist/cli/utils/writeInfraStructured.js +8 -0
  98. package/dist/cli/utils/writeInfraStructured.js.map +1 -0
  99. package/dist/constants.d.ts +10 -0
  100. package/dist/constants.d.ts.map +1 -0
  101. package/dist/{packageMetadata.js → constants.js} +6 -3
  102. package/dist/constants.js.map +1 -0
  103. package/dist/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraCredentialPort.d.ts +4 -0
  104. package/dist/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraCredentialPort.d.ts.map +1 -0
  105. package/dist/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraCredentialPort.js +35 -0
  106. package/dist/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraCredentialPort.js.map +1 -0
  107. package/dist/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraSecretPort.d.ts +4 -0
  108. package/dist/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraSecretPort.d.ts.map +1 -0
  109. package/dist/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraSecretPort.js +23 -0
  110. package/dist/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraSecretPort.js.map +1 -0
  111. package/dist/features/environment-lifecycle/adapters/outbound/createNodeInfraAdapterPackageResolver.d.ts +4 -0
  112. package/dist/features/environment-lifecycle/adapters/outbound/createNodeInfraAdapterPackageResolver.d.ts.map +1 -0
  113. package/dist/features/environment-lifecycle/adapters/outbound/createNodeInfraAdapterPackageResolver.js +9 -0
  114. package/dist/features/environment-lifecycle/adapters/outbound/createNodeInfraAdapterPackageResolver.js.map +1 -0
  115. package/dist/features/environment-lifecycle/adapters/outbound/readStoredInfraStateAsync.d.ts +5 -0
  116. package/dist/features/environment-lifecycle/adapters/outbound/readStoredInfraStateAsync.d.ts.map +1 -0
  117. package/dist/features/environment-lifecycle/adapters/outbound/readStoredInfraStateAsync.js +28 -0
  118. package/dist/features/environment-lifecycle/adapters/outbound/readStoredInfraStateAsync.js.map +1 -0
  119. package/dist/features/environment-lifecycle/adapters/outbound/removeStoredInfraStateAsync.d.ts +4 -0
  120. package/dist/features/environment-lifecycle/adapters/outbound/removeStoredInfraStateAsync.d.ts.map +1 -0
  121. package/dist/features/environment-lifecycle/adapters/outbound/removeStoredInfraStateAsync.js +7 -0
  122. package/dist/features/environment-lifecycle/adapters/outbound/removeStoredInfraStateAsync.js.map +1 -0
  123. package/dist/features/environment-lifecycle/adapters/outbound/resolveInfraProjectAsync.d.ts +7 -0
  124. package/dist/features/environment-lifecycle/adapters/outbound/resolveInfraProjectAsync.d.ts.map +1 -0
  125. package/dist/{project.js → features/environment-lifecycle/adapters/outbound/resolveInfraProjectAsync.js} +10 -34
  126. package/dist/features/environment-lifecycle/adapters/outbound/resolveInfraProjectAsync.js.map +1 -0
  127. package/dist/features/environment-lifecycle/adapters/outbound/writeInfraGeneratedArtifactsAsync.d.ts +5 -0
  128. package/dist/features/environment-lifecycle/adapters/outbound/writeInfraGeneratedArtifactsAsync.d.ts.map +1 -0
  129. package/dist/features/environment-lifecycle/adapters/outbound/writeInfraGeneratedArtifactsAsync.js +28 -0
  130. package/dist/features/environment-lifecycle/adapters/outbound/writeInfraGeneratedArtifactsAsync.js.map +1 -0
  131. package/dist/features/environment-lifecycle/adapters/outbound/writeStoredInfraStateAsync.d.ts +4 -0
  132. package/dist/features/environment-lifecycle/adapters/outbound/writeStoredInfraStateAsync.d.ts.map +1 -0
  133. package/dist/features/environment-lifecycle/adapters/outbound/writeStoredInfraStateAsync.js +16 -0
  134. package/dist/features/environment-lifecycle/adapters/outbound/writeStoredInfraStateAsync.js.map +1 -0
  135. package/dist/features/environment-lifecycle/application/ports/outbound/infraAdapterPackage.d.ts +9 -0
  136. package/dist/features/environment-lifecycle/application/ports/outbound/infraAdapterPackage.d.ts.map +1 -0
  137. package/dist/features/environment-lifecycle/application/ports/outbound/infraAdapterPackage.js +2 -0
  138. package/dist/features/environment-lifecycle/application/ports/outbound/infraAdapterPackage.js.map +1 -0
  139. package/dist/features/environment-lifecycle/application/use-cases/collectInfraWorkloadsAsync.d.ts +4 -0
  140. package/dist/features/environment-lifecycle/application/use-cases/collectInfraWorkloadsAsync.d.ts.map +1 -0
  141. package/dist/features/environment-lifecycle/application/use-cases/collectInfraWorkloadsAsync.js +15 -0
  142. package/dist/features/environment-lifecycle/application/use-cases/collectInfraWorkloadsAsync.js.map +1 -0
  143. package/dist/features/environment-lifecycle/application/use-cases/destroyInfraEnvironmentAsync.d.ts +4 -0
  144. package/dist/features/environment-lifecycle/application/use-cases/destroyInfraEnvironmentAsync.d.ts.map +1 -0
  145. package/dist/features/environment-lifecycle/application/use-cases/destroyInfraEnvironmentAsync.js +84 -0
  146. package/dist/features/environment-lifecycle/application/use-cases/destroyInfraEnvironmentAsync.js.map +1 -0
  147. package/dist/features/environment-lifecycle/application/use-cases/downInfraEnvironmentAsync.d.ts +4 -0
  148. package/dist/features/environment-lifecycle/application/use-cases/downInfraEnvironmentAsync.d.ts.map +1 -0
  149. package/dist/features/environment-lifecycle/application/use-cases/downInfraEnvironmentAsync.js +55 -0
  150. package/dist/features/environment-lifecycle/application/use-cases/downInfraEnvironmentAsync.js.map +1 -0
  151. package/dist/features/environment-lifecycle/application/use-cases/generateInfraEnvironmentAsync.d.ts +4 -0
  152. package/dist/features/environment-lifecycle/application/use-cases/generateInfraEnvironmentAsync.d.ts.map +1 -0
  153. package/dist/features/environment-lifecycle/application/use-cases/generateInfraEnvironmentAsync.js +38 -0
  154. package/dist/features/environment-lifecycle/application/use-cases/generateInfraEnvironmentAsync.js.map +1 -0
  155. package/dist/features/environment-lifecycle/application/use-cases/getInfraEnvironmentOutputs.d.ts +4 -0
  156. package/dist/features/environment-lifecycle/application/use-cases/getInfraEnvironmentOutputs.d.ts.map +1 -0
  157. package/dist/features/environment-lifecycle/application/use-cases/getInfraEnvironmentOutputs.js +34 -0
  158. package/dist/features/environment-lifecycle/application/use-cases/getInfraEnvironmentOutputs.js.map +1 -0
  159. package/dist/features/environment-lifecycle/application/use-cases/planInfraEnvironmentAsync.d.ts +4 -0
  160. package/dist/features/environment-lifecycle/application/use-cases/planInfraEnvironmentAsync.d.ts.map +1 -0
  161. package/dist/features/environment-lifecycle/application/use-cases/planInfraEnvironmentAsync.js +57 -0
  162. package/dist/features/environment-lifecycle/application/use-cases/planInfraEnvironmentAsync.js.map +1 -0
  163. package/dist/features/environment-lifecycle/application/use-cases/prepareInfraOperationAsync.d.ts +5 -0
  164. package/dist/features/environment-lifecycle/application/use-cases/prepareInfraOperationAsync.d.ts.map +1 -0
  165. package/dist/features/environment-lifecycle/application/use-cases/prepareInfraOperationAsync.js +109 -0
  166. package/dist/features/environment-lifecycle/application/use-cases/prepareInfraOperationAsync.js.map +1 -0
  167. package/dist/features/environment-lifecycle/application/use-cases/resolveInfraAdaptersAsync.d.ts +6 -0
  168. package/dist/features/environment-lifecycle/application/use-cases/resolveInfraAdaptersAsync.d.ts.map +1 -0
  169. package/dist/features/environment-lifecycle/application/use-cases/resolveInfraAdaptersAsync.js +181 -0
  170. package/dist/features/environment-lifecycle/application/use-cases/resolveInfraAdaptersAsync.js.map +1 -0
  171. package/dist/features/environment-lifecycle/application/use-cases/statusInfraEnvironmentAsync.d.ts +4 -0
  172. package/dist/features/environment-lifecycle/application/use-cases/statusInfraEnvironmentAsync.d.ts.map +1 -0
  173. package/dist/features/environment-lifecycle/application/use-cases/statusInfraEnvironmentAsync.js +68 -0
  174. package/dist/features/environment-lifecycle/application/use-cases/statusInfraEnvironmentAsync.js.map +1 -0
  175. package/dist/features/environment-lifecycle/application/use-cases/upInfraEnvironmentAsync.d.ts +4 -0
  176. package/dist/features/environment-lifecycle/application/use-cases/upInfraEnvironmentAsync.d.ts.map +1 -0
  177. package/dist/features/environment-lifecycle/application/use-cases/upInfraEnvironmentAsync.js +98 -0
  178. package/dist/features/environment-lifecycle/application/use-cases/upInfraEnvironmentAsync.js.map +1 -0
  179. package/dist/features/environment-lifecycle/application/use-cases/validateInfraAdaptersAsync.d.ts +5 -0
  180. package/dist/features/environment-lifecycle/application/use-cases/validateInfraAdaptersAsync.d.ts.map +1 -0
  181. package/dist/features/environment-lifecycle/application/use-cases/validateInfraAdaptersAsync.js +17 -0
  182. package/dist/features/environment-lifecycle/application/use-cases/validateInfraAdaptersAsync.js.map +1 -0
  183. package/dist/features/environment-lifecycle/application/use-cases/validateInfraEnvironmentAsync.d.ts +4 -0
  184. package/dist/features/environment-lifecycle/application/use-cases/validateInfraEnvironmentAsync.d.ts.map +1 -0
  185. package/dist/features/environment-lifecycle/application/use-cases/validateInfraEnvironmentAsync.js +13 -0
  186. package/dist/features/environment-lifecycle/application/use-cases/validateInfraEnvironmentAsync.js.map +1 -0
  187. package/dist/features/environment-lifecycle/composition/createInfraCommandServices.d.ts +4 -0
  188. package/dist/features/environment-lifecycle/composition/createInfraCommandServices.d.ts.map +1 -0
  189. package/dist/features/environment-lifecycle/composition/createInfraCommandServices.js +43 -0
  190. package/dist/features/environment-lifecycle/composition/createInfraCommandServices.js.map +1 -0
  191. package/dist/features/environment-lifecycle/composition/createProjectInfraLifecycle.d.ts +4 -0
  192. package/dist/features/environment-lifecycle/composition/createProjectInfraLifecycle.d.ts.map +1 -0
  193. package/dist/features/environment-lifecycle/composition/createProjectInfraLifecycle.js +123 -0
  194. package/dist/features/environment-lifecycle/composition/createProjectInfraLifecycle.js.map +1 -0
  195. package/dist/features/environment-lifecycle/domain/orderInfraPlanActions.d.ts +4 -0
  196. package/dist/features/environment-lifecycle/domain/orderInfraPlanActions.d.ts.map +1 -0
  197. package/dist/features/environment-lifecycle/domain/orderInfraPlanActions.js +54 -0
  198. package/dist/features/environment-lifecycle/domain/orderInfraPlanActions.js.map +1 -0
  199. package/dist/features/environment-lifecycle/domain/resolveInfraEnvironment.d.ts +5 -0
  200. package/dist/features/environment-lifecycle/domain/resolveInfraEnvironment.d.ts.map +1 -0
  201. package/dist/features/environment-lifecycle/domain/resolveInfraEnvironment.js +39 -0
  202. package/dist/features/environment-lifecycle/domain/resolveInfraEnvironment.js.map +1 -0
  203. package/dist/features/environment-lifecycle/utils/appendInfraFailure.d.ts +7 -0
  204. package/dist/features/environment-lifecycle/utils/appendInfraFailure.d.ts.map +1 -0
  205. package/dist/features/environment-lifecycle/utils/appendInfraFailure.js +5 -0
  206. package/dist/features/environment-lifecycle/utils/appendInfraFailure.js.map +1 -0
  207. package/dist/features/environment-lifecycle/utils/createInfraExecutionContext.d.ts +5 -0
  208. package/dist/features/environment-lifecycle/utils/createInfraExecutionContext.d.ts.map +1 -0
  209. package/dist/features/environment-lifecycle/utils/createInfraExecutionContext.js +13 -0
  210. package/dist/features/environment-lifecycle/utils/createInfraExecutionContext.js.map +1 -0
  211. package/dist/features/environment-lifecycle/utils/createInfraFailure.d.ts +4 -0
  212. package/dist/features/environment-lifecycle/utils/createInfraFailure.d.ts.map +1 -0
  213. package/dist/features/environment-lifecycle/utils/createInfraFailure.js +5 -0
  214. package/dist/features/environment-lifecycle/utils/createInfraFailure.js.map +1 -0
  215. package/dist/features/environment-lifecycle/utils/createInfraLedger.d.ts +12 -0
  216. package/dist/features/environment-lifecycle/utils/createInfraLedger.d.ts.map +1 -0
  217. package/dist/features/environment-lifecycle/utils/createInfraLedger.js +14 -0
  218. package/dist/features/environment-lifecycle/utils/createInfraLedger.js.map +1 -0
  219. package/dist/features/environment-lifecycle/utils/infraIdentityKey.d.ts +4 -0
  220. package/dist/features/environment-lifecycle/utils/infraIdentityKey.d.ts.map +1 -0
  221. package/dist/features/environment-lifecycle/utils/infraIdentityKey.js +5 -0
  222. package/dist/features/environment-lifecycle/utils/infraIdentityKey.js.map +1 -0
  223. package/dist/features/environment-lifecycle/utils/isInfraStoredState.d.ts +4 -0
  224. package/dist/features/environment-lifecycle/utils/isInfraStoredState.d.ts.map +1 -0
  225. package/dist/features/environment-lifecycle/utils/isInfraStoredState.js +103 -0
  226. package/dist/features/environment-lifecycle/utils/isInfraStoredState.js.map +1 -0
  227. package/dist/features/environment-lifecycle/utils/mergeInfraOutputs.d.ts +4 -0
  228. package/dist/features/environment-lifecycle/utils/mergeInfraOutputs.d.ts.map +1 -0
  229. package/dist/features/environment-lifecycle/utils/mergeInfraOutputs.js +10 -0
  230. package/dist/features/environment-lifecycle/utils/mergeInfraOutputs.js.map +1 -0
  231. package/dist/features/environment-lifecycle/utils/mergeInfraResources.d.ts +4 -0
  232. package/dist/features/environment-lifecycle/utils/mergeInfraResources.d.ts.map +1 -0
  233. package/dist/features/environment-lifecycle/utils/mergeInfraResources.js +10 -0
  234. package/dist/features/environment-lifecycle/utils/mergeInfraResources.js.map +1 -0
  235. package/dist/features/environment-lifecycle/utils/normalizeInfraEnvironmentKey.d.ts +3 -0
  236. package/dist/features/environment-lifecycle/utils/normalizeInfraEnvironmentKey.d.ts.map +1 -0
  237. package/dist/features/environment-lifecycle/utils/normalizeInfraEnvironmentKey.js +8 -0
  238. package/dist/features/environment-lifecycle/utils/normalizeInfraEnvironmentKey.js.map +1 -0
  239. package/dist/features/environment-lifecycle/utils/resolveInfraStatePath.d.ts +4 -0
  240. package/dist/features/environment-lifecycle/utils/resolveInfraStatePath.d.ts.map +1 -0
  241. package/dist/features/environment-lifecycle/utils/resolveInfraStatePath.js +11 -0
  242. package/dist/features/environment-lifecycle/utils/resolveInfraStatePath.js.map +1 -0
  243. package/dist/features/environment-lifecycle/utils/resolveProjectFile.d.ts +3 -0
  244. package/dist/features/environment-lifecycle/utils/resolveProjectFile.d.ts.map +1 -0
  245. package/dist/features/environment-lifecycle/utils/resolveProjectFile.js +19 -0
  246. package/dist/features/environment-lifecycle/utils/resolveProjectFile.js.map +1 -0
  247. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterOutputs.d.ts +4 -0
  248. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterOutputs.d.ts.map +1 -0
  249. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterOutputs.js +6 -0
  250. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterOutputs.js.map +1 -0
  251. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterResources.d.ts +4 -0
  252. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterResources.d.ts.map +1 -0
  253. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterResources.js +6 -0
  254. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterResources.js.map +1 -0
  255. package/dist/index.d.ts +16 -6
  256. package/dist/index.d.ts.map +1 -1
  257. package/dist/index.js +14 -15
  258. package/dist/index.js.map +1 -1
  259. package/dist/metadata/index.d.ts +1 -1
  260. package/dist/metadata/index.d.ts.map +1 -1
  261. package/dist/metadata/index.js +1 -1
  262. package/dist/metadata/index.js.map +1 -1
  263. package/dist/project/index.d.ts +8 -5
  264. package/dist/project/index.d.ts.map +1 -1
  265. package/dist/project/index.js +7 -5
  266. package/dist/project/index.js.map +1 -1
  267. package/dist/readme-usage.js +17 -26
  268. package/dist/readme-usage.js.map +1 -1
  269. package/dist/testSupport.d.ts +1 -1
  270. package/dist/testSupport.d.ts.map +1 -1
  271. package/dist/testSupport.js +11 -1
  272. package/dist/testSupport.js.map +1 -1
  273. package/dist/types/infraCli.d.ts +91 -0
  274. package/dist/types/infraCli.d.ts.map +1 -0
  275. package/dist/types/infraCli.js +2 -0
  276. package/dist/types/infraCli.js.map +1 -0
  277. package/dist/types/infraOrchestration.d.ts +84 -0
  278. package/dist/types/infraOrchestration.d.ts.map +1 -0
  279. package/dist/types/infraOrchestration.js +2 -0
  280. package/dist/types/infraOrchestration.js.map +1 -0
  281. package/dist/types/infraProject.d.ts +43 -0
  282. package/dist/types/infraProject.d.ts.map +1 -0
  283. package/dist/types/infraProject.js +2 -0
  284. package/dist/types/infraProject.js.map +1 -0
  285. package/package.json +20 -10
  286. package/src/adapterPackages.integration.test.ts +79 -0
  287. package/src/cli/bin.ts +2 -61
  288. package/src/cli/cli.test.ts +35 -126
  289. package/src/cli/commands/destroy.ts +57 -0
  290. package/src/cli/commands/down.ts +28 -0
  291. package/src/cli/commands/generate.ts +34 -0
  292. package/src/cli/commands/outputs.ts +25 -0
  293. package/src/cli/commands/plan.ts +20 -0
  294. package/src/cli/commands/status.ts +20 -0
  295. package/src/cli/commands/up.ts +29 -0
  296. package/src/cli/commands/validate.ts +20 -0
  297. package/src/cli/constants.ts +19 -0
  298. package/src/cli/createDefaultInfraCommandContext.ts +17 -0
  299. package/src/cli/createInfraRuntimeProvider.ts +35 -0
  300. package/src/cli/createProviderCommandDescriptors.ts +8 -0
  301. package/src/cli/findInfraCommand.ts +7 -0
  302. package/src/cli/index.test.ts +12 -20
  303. package/src/cli/index.ts +7 -49
  304. package/src/cli/renderInfraRootHelp.ts +23 -0
  305. package/src/cli/renderUnknownInfraCommand.ts +4 -0
  306. package/src/cli/runInfraCliAsync.ts +51 -0
  307. package/src/cli/runInfraCommandAsync.ts +114 -0
  308. package/src/cli/utils/prepareInfraCommandOperationAsync.ts +64 -0
  309. package/src/cli/utils/requireInfraSuccess.ts +24 -0
  310. package/src/cli/utils/resolveInfraPersistence.ts +22 -0
  311. package/src/cli/utils/writeInfraEnvironmentOutputs.ts +24 -0
  312. package/src/cli/utils/writeInfraStructured.ts +11 -0
  313. package/src/commands.test.ts +198 -196
  314. package/src/{packageMetadata.ts → constants.ts} +5 -2
  315. package/src/environmentLifecycle.test.ts +193 -0
  316. package/src/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraCredentialPort.ts +52 -0
  317. package/src/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraSecretPort.ts +32 -0
  318. package/src/features/environment-lifecycle/adapters/outbound/createNodeInfraAdapterPackageResolver.ts +10 -0
  319. package/src/features/environment-lifecycle/adapters/outbound/readStoredInfraStateAsync.ts +34 -0
  320. package/src/features/environment-lifecycle/adapters/outbound/removeStoredInfraStateAsync.ts +12 -0
  321. package/src/{project.ts → features/environment-lifecycle/adapters/outbound/resolveInfraProjectAsync.ts} +10 -45
  322. package/src/features/environment-lifecycle/adapters/outbound/writeInfraGeneratedArtifactsAsync.ts +34 -0
  323. package/src/features/environment-lifecycle/adapters/outbound/writeStoredInfraStateAsync.ts +21 -0
  324. package/src/features/environment-lifecycle/application/ports/outbound/infraAdapterPackage.ts +10 -0
  325. package/src/features/environment-lifecycle/application/use-cases/collectInfraWorkloadsAsync.ts +25 -0
  326. package/src/features/environment-lifecycle/application/use-cases/destroyInfraEnvironmentAsync.ts +119 -0
  327. package/src/features/environment-lifecycle/application/use-cases/downInfraEnvironmentAsync.ts +65 -0
  328. package/src/features/environment-lifecycle/application/use-cases/generateInfraEnvironmentAsync.ts +51 -0
  329. package/src/features/environment-lifecycle/application/use-cases/getInfraEnvironmentOutputs.ts +41 -0
  330. package/src/features/environment-lifecycle/application/use-cases/planInfraEnvironmentAsync.ts +67 -0
  331. package/src/features/environment-lifecycle/application/use-cases/prepareInfraOperationAsync.ts +137 -0
  332. package/src/features/environment-lifecycle/application/use-cases/resolveInfraAdaptersAsync.ts +257 -0
  333. package/src/features/environment-lifecycle/application/use-cases/statusInfraEnvironmentAsync.ts +80 -0
  334. package/src/features/environment-lifecycle/application/use-cases/upInfraEnvironmentAsync.ts +126 -0
  335. package/src/features/environment-lifecycle/application/use-cases/validateInfraAdaptersAsync.ts +25 -0
  336. package/src/features/environment-lifecycle/application/use-cases/validateInfraEnvironmentAsync.ts +21 -0
  337. package/src/features/environment-lifecycle/composition/createInfraCommandServices.ts +47 -0
  338. package/src/features/environment-lifecycle/composition/createProjectInfraLifecycle.ts +157 -0
  339. package/src/features/environment-lifecycle/domain/orderInfraPlanActions.ts +64 -0
  340. package/src/features/environment-lifecycle/domain/resolveInfraEnvironment.ts +62 -0
  341. package/src/features/environment-lifecycle/utils/appendInfraFailure.ts +9 -0
  342. package/src/features/environment-lifecycle/utils/createInfraExecutionContext.ts +24 -0
  343. package/src/features/environment-lifecycle/utils/createInfraFailure.ts +6 -0
  344. package/src/features/environment-lifecycle/utils/createInfraLedger.ts +30 -0
  345. package/src/features/environment-lifecycle/utils/infraIdentityKey.ts +6 -0
  346. package/src/features/environment-lifecycle/utils/isInfraStoredState.ts +141 -0
  347. package/src/features/environment-lifecycle/utils/mergeInfraOutputs.ts +14 -0
  348. package/src/features/environment-lifecycle/utils/mergeInfraResources.ts +14 -0
  349. package/src/features/environment-lifecycle/utils/normalizeInfraEnvironmentKey.ts +7 -0
  350. package/src/features/environment-lifecycle/utils/resolveInfraStatePath.ts +12 -0
  351. package/src/features/environment-lifecycle/utils/resolveProjectFile.ts +22 -0
  352. package/src/features/environment-lifecycle/utils/retainUnchangedAdapterOutputs.ts +15 -0
  353. package/src/features/environment-lifecycle/utils/retainUnchangedAdapterResources.ts +15 -0
  354. package/src/index.test.ts +22 -315
  355. package/src/index.ts +41 -53
  356. package/src/infraComposition.integration.test.ts +128 -0
  357. package/src/infraOperations.test.ts +386 -0
  358. package/src/infraUp.test.ts +260 -0
  359. package/src/metadata/index.ts +1 -1
  360. package/src/package.test.ts +4 -2
  361. package/src/project/index.test.ts +10 -188
  362. package/src/project/index.ts +15 -22
  363. package/src/project.test.ts +39 -189
  364. package/src/projectContractsParser.test.ts +2 -2
  365. package/src/projectInfrastructure.test.ts +121 -167
  366. package/src/projectLifecycle.test.ts +136 -0
  367. package/src/readme-usage.ts +17 -26
  368. package/src/testSupport.ts +12 -2
  369. package/src/types/infraCli.ts +115 -0
  370. package/src/types/infraOrchestration.ts +126 -0
  371. package/src/types/infraProject.ts +58 -0
  372. package/dist/adapters/minikube/auth/index.d.ts +0 -8
  373. package/dist/adapters/minikube/auth/index.d.ts.map +0 -1
  374. package/dist/adapters/minikube/auth/index.js +0 -29
  375. package/dist/adapters/minikube/auth/index.js.map +0 -1
  376. package/dist/adapters/minikube/auth/oauthRuntime.d.ts +0 -4
  377. package/dist/adapters/minikube/auth/oauthRuntime.d.ts.map +0 -1
  378. package/dist/adapters/minikube/auth/oauthRuntime.js +0 -138
  379. package/dist/adapters/minikube/auth/oauthRuntime.js.map +0 -1
  380. package/dist/adapters/minikube/auth/supabase/index.d.ts +0 -7
  381. package/dist/adapters/minikube/auth/supabase/index.d.ts.map +0 -1
  382. package/dist/adapters/minikube/auth/supabase/index.js +0 -232
  383. package/dist/adapters/minikube/auth/supabase/index.js.map +0 -1
  384. package/dist/adapters/minikube/auth/supabase/profile.d.ts +0 -20
  385. package/dist/adapters/minikube/auth/supabase/profile.d.ts.map +0 -1
  386. package/dist/adapters/minikube/auth/supabase/profile.js +0 -452
  387. package/dist/adapters/minikube/auth/supabase/profile.js.map +0 -1
  388. package/dist/adapters/minikube/auth/targetAwareOAuthRuntime.d.ts +0 -7
  389. package/dist/adapters/minikube/auth/targetAwareOAuthRuntime.d.ts.map +0 -1
  390. package/dist/adapters/minikube/auth/targetAwareOAuthRuntime.js +0 -104
  391. package/dist/adapters/minikube/auth/targetAwareOAuthRuntime.js.map +0 -1
  392. package/dist/adapters/minikube/authz/cerbos/index.d.ts +0 -13
  393. package/dist/adapters/minikube/authz/cerbos/index.d.ts.map +0 -1
  394. package/dist/adapters/minikube/authz/cerbos/index.js +0 -382
  395. package/dist/adapters/minikube/authz/cerbos/index.js.map +0 -1
  396. package/dist/adapters/minikube/authz/index.d.ts +0 -9
  397. package/dist/adapters/minikube/authz/index.d.ts.map +0 -1
  398. package/dist/adapters/minikube/authz/index.js +0 -23
  399. package/dist/adapters/minikube/authz/index.js.map +0 -1
  400. package/dist/adapters/minikube/base/index.d.ts +0 -14
  401. package/dist/adapters/minikube/base/index.d.ts.map +0 -1
  402. package/dist/adapters/minikube/base/index.js +0 -3433
  403. package/dist/adapters/minikube/base/index.js.map +0 -1
  404. package/dist/adapters/minikube/base/supabaseMigrations.d.ts +0 -2
  405. package/dist/adapters/minikube/base/supabaseMigrations.d.ts.map +0 -1
  406. package/dist/adapters/minikube/base/supabaseMigrations.js +0 -6
  407. package/dist/adapters/minikube/base/supabaseMigrations.js.map +0 -1
  408. package/dist/adapters/minikube/contracts.d.ts +0 -34
  409. package/dist/adapters/minikube/contracts.d.ts.map +0 -1
  410. package/dist/adapters/minikube/contracts.js +0 -10
  411. package/dist/adapters/minikube/contracts.js.map +0 -1
  412. package/dist/adapters/minikube/index.d.ts +0 -3
  413. package/dist/adapters/minikube/index.d.ts.map +0 -1
  414. package/dist/adapters/minikube/index.js +0 -136
  415. package/dist/adapters/minikube/index.js.map +0 -1
  416. package/dist/adapters/minikube/secrets/index.d.ts +0 -7
  417. package/dist/adapters/minikube/secrets/index.d.ts.map +0 -1
  418. package/dist/adapters/minikube/secrets/index.js +0 -13
  419. package/dist/adapters/minikube/secrets/index.js.map +0 -1
  420. package/dist/adapters/minikube/secrets/supabase-vault/index.d.ts +0 -8
  421. package/dist/adapters/minikube/secrets/supabase-vault/index.d.ts.map +0 -1
  422. package/dist/adapters/minikube/secrets/supabase-vault/index.js +0 -118
  423. package/dist/adapters/minikube/secrets/supabase-vault/index.js.map +0 -1
  424. package/dist/adapters/minikube/storage/index.d.ts +0 -7
  425. package/dist/adapters/minikube/storage/index.d.ts.map +0 -1
  426. package/dist/adapters/minikube/storage/index.js +0 -77
  427. package/dist/adapters/minikube/storage/index.js.map +0 -1
  428. package/dist/adapters/minikube/storage/supabase/index.d.ts +0 -7
  429. package/dist/adapters/minikube/storage/supabase/index.d.ts.map +0 -1
  430. package/dist/adapters/minikube/storage/supabase/index.js +0 -82
  431. package/dist/adapters/minikube/storage/supabase/index.js.map +0 -1
  432. package/dist/authRedirects.d.ts +0 -19
  433. package/dist/authRedirects.d.ts.map +0 -1
  434. package/dist/authRedirects.js +0 -80
  435. package/dist/authRedirects.js.map +0 -1
  436. package/dist/authTargetRedirects.d.ts +0 -12
  437. package/dist/authTargetRedirects.d.ts.map +0 -1
  438. package/dist/authTargetRedirects.js +0 -32
  439. package/dist/authTargetRedirects.js.map +0 -1
  440. package/dist/commandContext.d.ts +0 -12
  441. package/dist/commandContext.d.ts.map +0 -1
  442. package/dist/commandContext.js.map +0 -1
  443. package/dist/commands.d.ts +0 -95
  444. package/dist/commands.d.ts.map +0 -1
  445. package/dist/commands.js +0 -256
  446. package/dist/commands.js.map +0 -1
  447. package/dist/infraValidation.d.ts +0 -4
  448. package/dist/infraValidation.d.ts.map +0 -1
  449. package/dist/infraValidation.js +0 -63
  450. package/dist/infraValidation.js.map +0 -1
  451. package/dist/packageMetadata.d.ts +0 -10
  452. package/dist/packageMetadata.d.ts.map +0 -1
  453. package/dist/packageMetadata.js.map +0 -1
  454. package/dist/project.d.ts +0 -14
  455. package/dist/project.d.ts.map +0 -1
  456. package/dist/project.js.map +0 -1
  457. package/dist/projectDatabase.d.ts +0 -5
  458. package/dist/projectDatabase.d.ts.map +0 -1
  459. package/dist/projectDatabase.js +0 -22
  460. package/dist/projectDatabase.js.map +0 -1
  461. package/dist/projectEnvironment.d.ts +0 -6
  462. package/dist/projectEnvironment.d.ts.map +0 -1
  463. package/dist/projectEnvironment.js +0 -45
  464. package/dist/projectEnvironment.js.map +0 -1
  465. package/dist/projectInfrastructure.d.ts +0 -38
  466. package/dist/projectInfrastructure.d.ts.map +0 -1
  467. package/dist/projectInfrastructure.js +0 -145
  468. package/dist/projectInfrastructure.js.map +0 -1
  469. package/dist/runtime.d.ts +0 -54
  470. package/dist/runtime.d.ts.map +0 -1
  471. package/dist/runtime.js +0 -151
  472. package/dist/runtime.js.map +0 -1
  473. package/dist/secretStore.d.ts +0 -19
  474. package/dist/secretStore.d.ts.map +0 -1
  475. package/dist/secretStore.js +0 -22
  476. package/dist/secretStore.js.map +0 -1
  477. package/dist/types.d.ts +0 -70
  478. package/dist/types.d.ts.map +0 -1
  479. package/dist/types.js +0 -2
  480. package/dist/types.js.map +0 -1
  481. package/src/adapters/minikube/README.md +0 -115
  482. package/src/adapters/minikube/appRuntimeServing.test.ts +0 -28
  483. package/src/adapters/minikube/auth/index.ts +0 -40
  484. package/src/adapters/minikube/auth/oauthRuntime.ts +0 -163
  485. package/src/adapters/minikube/auth/supabase/index.test.ts +0 -227
  486. package/src/adapters/minikube/auth/supabase/index.ts +0 -293
  487. package/src/adapters/minikube/auth/supabase/oauthRuntime.test.ts +0 -154
  488. package/src/adapters/minikube/auth/supabase/profile.integration.test.ts +0 -1028
  489. package/src/adapters/minikube/auth/supabase/profile.ts +0 -526
  490. package/src/adapters/minikube/auth/supabase/providerAssignments.test.ts +0 -36
  491. package/src/adapters/minikube/auth/targetAwareOAuthRuntime.test.ts +0 -83
  492. package/src/adapters/minikube/auth/targetAwareOAuthRuntime.ts +0 -136
  493. package/src/adapters/minikube/authz/cerbos/index.ts +0 -486
  494. package/src/adapters/minikube/authz/index.ts +0 -32
  495. package/src/adapters/minikube/base/appImageBuild.test.ts +0 -352
  496. package/src/adapters/minikube/base/index.test.ts +0 -693
  497. package/src/adapters/minikube/base/index.ts +0 -3763
  498. package/src/adapters/minikube/base/portForwardRuntime.test.ts +0 -624
  499. package/src/adapters/minikube/base/supabaseMigrations.test.ts +0 -168
  500. package/src/adapters/minikube/base/supabaseMigrations.ts +0 -5
  501. package/src/adapters/minikube/base/twoAppIsolation.integration.test.ts +0 -898
  502. package/src/adapters/minikube/base/upgradeReconciliation.test.ts +0 -135
  503. package/src/adapters/minikube/contracts.ts +0 -46
  504. package/src/adapters/minikube/index.ts +0 -172
  505. package/src/adapters/minikube/secrets/index.test.ts +0 -147
  506. package/src/adapters/minikube/secrets/index.ts +0 -19
  507. package/src/adapters/minikube/secrets/supabase-vault/index.ts +0 -139
  508. package/src/adapters/minikube/storage/index.ts +0 -91
  509. package/src/adapters/minikube/storage/supabase/index.ts +0 -108
  510. package/src/apiInfrastructure.test.ts +0 -69
  511. package/src/authRedirects.test.ts +0 -63
  512. package/src/authRedirects.ts +0 -113
  513. package/src/authTargetRedirects.test.ts +0 -62
  514. package/src/authTargetRedirects.ts +0 -46
  515. package/src/commandContext.ts +0 -27
  516. package/src/commands.ts +0 -404
  517. package/src/generatedApiLedgerCleanup.test.ts +0 -72
  518. package/src/infraApiValidation.test.ts +0 -42
  519. package/src/infraValidation.ts +0 -99
  520. package/src/minikubeImageLifecycle.test.ts +0 -35
  521. package/src/projectDatabase.ts +0 -27
  522. package/src/projectEnvironment.ts +0 -51
  523. package/src/projectInfrastructure.ts +0 -221
  524. package/src/runtime.test.ts +0 -124
  525. package/src/runtime.ts +0 -234
  526. package/src/secretStore.test.ts +0 -76
  527. package/src/secretStore.ts +0 -44
  528. package/src/types.ts +0 -82
@@ -0,0 +1,28 @@
1
+ import { INFRA_CAPABILITIES } from '../../constants.js';
2
+ import type { InfraCommandDefinition } from '../../types/infraCli.js';
3
+ import { prepareInfraCommandOperationAsync } from '../utils/prepareInfraCommandOperationAsync.js';
4
+ import { requireInfraSuccess } from '../utils/requireInfraSuccess.js';
5
+ import { writeInfraStructured } from '../utils/writeInfraStructured.js';
6
+
7
+ /*** Define reversible runtime suspension while retaining persistent resources. */
8
+ export const down = {
9
+ standaloneName: 'down',
10
+ path: ['down'],
11
+ capability: INFRA_CAPABILITIES[6],
12
+ summary: 'Reversibly suspend runtime workloads while retaining persistent data.',
13
+ async run(request, services) {
14
+ const operation = await prepareInfraCommandOperationAsync(request, services);
15
+ const result = await services.operations.down(operation.operation, operation.dependencies);
16
+ requireInfraSuccess(result, request.context);
17
+ await services.writeState(operation.project.projectPath, {
18
+ schemaVersion: 1,
19
+ desired: operation.desired,
20
+ ledger: result.value.ledger,
21
+ });
22
+ writeInfraStructured(request.context, request.arguments.format, {
23
+ environment: result.value.environment,
24
+ state: 'stopped',
25
+ });
26
+ return { exitCode: 0 };
27
+ },
28
+ } as const satisfies InfraCommandDefinition;
@@ -0,0 +1,34 @@
1
+ import { INFRA_CAPABILITIES } from '../../constants.js';
2
+ import type { InfraCommandDefinition } from '../../types/infraCli.js';
3
+ import { prepareInfraCommandOperationAsync } from '../utils/prepareInfraCommandOperationAsync.js';
4
+ import { requireInfraSuccess } from '../utils/requireInfraSuccess.js';
5
+ import { writeInfraStructured } from '../utils/writeInfraStructured.js';
6
+
7
+ /*** Define deterministic review-artifact generation without remote side effects. */
8
+ export const generate = {
9
+ standaloneName: 'generate',
10
+ path: ['generate'],
11
+ capability: INFRA_CAPABILITIES[2],
12
+ summary: 'Generate deterministic review artifacts without remote side effects.',
13
+ async run(request, services) {
14
+ const operation = await prepareInfraCommandOperationAsync(request, services);
15
+ const result = await services.operations.generate(operation.operation, operation.dependencies);
16
+ requireInfraSuccess(result, request.context);
17
+ const written = await services.writeArtifacts(
18
+ operation.project.projectPath,
19
+ result.value.artifacts,
20
+ operation.state?.ledger,
21
+ );
22
+ await services.writeState(operation.project.projectPath, {
23
+ schemaVersion: 1,
24
+ desired: operation.desired,
25
+ ledger: result.value.ledger,
26
+ });
27
+ writeInfraStructured(request.context, request.arguments.format, {
28
+ environment: result.value.environment,
29
+ ...written,
30
+ artifacts: result.value.artifacts.map(({ path }) => path),
31
+ });
32
+ return { exitCode: 0 };
33
+ },
34
+ } as const satisfies InfraCommandDefinition;
@@ -0,0 +1,25 @@
1
+ import { INFRA_CAPABILITIES } from '../../constants.js';
2
+ import type { InfraCommandDefinition } from '../../types/infraCli.js';
3
+ import { prepareInfraCommandOperationAsync } from '../utils/prepareInfraCommandOperationAsync.js';
4
+ import { requireInfraSuccess } from '../utils/requireInfraSuccess.js';
5
+ import { writeInfraEnvironmentOutputs } from '../utils/writeInfraEnvironmentOutputs.js';
6
+ import { writeInfraStructured } from '../utils/writeInfraStructured.js';
7
+
8
+ /*** Define safe public-output and secret-reference presentation. */
9
+ export const outputs = {
10
+ standaloneName: 'outputs',
11
+ path: ['outputs'],
12
+ capability: INFRA_CAPABILITIES[5],
13
+ summary: 'Print safe public outputs and secret references.',
14
+ async run(request, services) {
15
+ const operation = await prepareInfraCommandOperationAsync(request, services);
16
+ const result = services.operations.outputs(operation.operation);
17
+ requireInfraSuccess(result, request.context);
18
+ if (request.arguments.format === 'env') {
19
+ writeInfraEnvironmentOutputs(request.context, result.value.outputs);
20
+ } else {
21
+ writeInfraStructured(request.context, request.arguments.format, result.value);
22
+ }
23
+ return { exitCode: 0 };
24
+ },
25
+ } as const satisfies InfraCommandDefinition;
@@ -0,0 +1,20 @@
1
+ import { INFRA_CAPABILITIES } from '../../constants.js';
2
+ import type { InfraCommandDefinition } from '../../types/infraCli.js';
3
+ import { prepareInfraCommandOperationAsync } from '../utils/prepareInfraCommandOperationAsync.js';
4
+ import { requireInfraSuccess } from '../utils/requireInfraSuccess.js';
5
+ import { writeInfraStructured } from '../utils/writeInfraStructured.js';
6
+
7
+ /*** Define the ordered side-effect-free infrastructure planning command. */
8
+ export const plan = {
9
+ standaloneName: 'plan',
10
+ path: ['plan'],
11
+ capability: INFRA_CAPABILITIES[1],
12
+ summary: 'Print an ordered side-effect-free infrastructure plan.',
13
+ async run(request, services) {
14
+ const operation = await prepareInfraCommandOperationAsync(request, services);
15
+ const result = await services.operations.plan(operation.operation, operation.dependencies);
16
+ requireInfraSuccess(result, request.context);
17
+ writeInfraStructured(request.context, request.arguments.format, result.value);
18
+ return { exitCode: 0 };
19
+ },
20
+ } as const satisfies InfraCommandDefinition;
@@ -0,0 +1,20 @@
1
+ import { INFRA_CAPABILITIES } from '../../constants.js';
2
+ import type { InfraCommandDefinition } from '../../types/infraCli.js';
3
+ import { prepareInfraCommandOperationAsync } from '../utils/prepareInfraCommandOperationAsync.js';
4
+ import { requireInfraSuccess } from '../utils/requireInfraSuccess.js';
5
+ import { writeInfraStructured } from '../utils/writeInfraStructured.js';
6
+
7
+ /*** Define provider-neutral environment status aggregation. */
8
+ export const status = {
9
+ standaloneName: 'status',
10
+ path: ['status'],
11
+ capability: INFRA_CAPABILITIES[4],
12
+ summary: 'Aggregate provider-neutral environment status.',
13
+ async run(request, services) {
14
+ const operation = await prepareInfraCommandOperationAsync(request, services);
15
+ const result = await services.operations.status(operation.operation, operation.dependencies);
16
+ requireInfraSuccess(result, request.context);
17
+ writeInfraStructured(request.context, request.arguments.format, result.value);
18
+ return { exitCode: 0 };
19
+ },
20
+ } as const satisfies InfraCommandDefinition;
@@ -0,0 +1,29 @@
1
+ import { INFRA_CAPABILITIES } from '../../constants.js';
2
+ import type { InfraCommandDefinition } from '../../types/infraCli.js';
3
+ import { prepareInfraCommandOperationAsync } from '../utils/prepareInfraCommandOperationAsync.js';
4
+ import { requireInfraSuccess } from '../utils/requireInfraSuccess.js';
5
+ import { writeInfraStructured } from '../utils/writeInfraStructured.js';
6
+
7
+ /*** Define idempotent environment creation and reconciliation. */
8
+ export const up = {
9
+ standaloneName: 'up',
10
+ path: ['up'],
11
+ capability: INFRA_CAPABILITIES[3],
12
+ summary: 'Idempotently ensure and reconcile the selected environment.',
13
+ async run(request, services) {
14
+ const operation = await prepareInfraCommandOperationAsync(request, services);
15
+ const result = await services.operations.up(operation.operation, operation.dependencies);
16
+ requireInfraSuccess(result, request.context);
17
+ await services.writeState(operation.project.projectPath, {
18
+ schemaVersion: 1,
19
+ desired: operation.desired,
20
+ ledger: result.value.ledger,
21
+ });
22
+ writeInfraStructured(request.context, request.arguments.format, {
23
+ environment: result.value.environment,
24
+ resources: result.value.resources.length,
25
+ outputs: result.value.outputs,
26
+ });
27
+ return { exitCode: 0 };
28
+ },
29
+ } as const satisfies InfraCommandDefinition;
@@ -0,0 +1,20 @@
1
+ import { INFRA_CAPABILITIES } from '../../constants.js';
2
+ import type { InfraCommandDefinition } from '../../types/infraCli.js';
3
+ import { prepareInfraCommandOperationAsync } from '../utils/prepareInfraCommandOperationAsync.js';
4
+ import { requireInfraSuccess } from '../utils/requireInfraSuccess.js';
5
+ import { writeInfraStructured } from '../utils/writeInfraStructured.js';
6
+
7
+ /*** Define the manifest, compatibility, credential and selected-adapter validation command. */
8
+ export const validate = {
9
+ standaloneName: 'validate',
10
+ path: ['validate'],
11
+ capability: INFRA_CAPABILITIES[0],
12
+ summary: 'Validate manifest, compatibility, credentials and selected adapters.',
13
+ async run(request, services) {
14
+ const operation = await prepareInfraCommandOperationAsync(request, services);
15
+ const result = await services.operations.validate(operation.operation, operation.dependencies);
16
+ requireInfraSuccess(result, request.context);
17
+ writeInfraStructured(request.context, request.arguments.format, result.value);
18
+ return { exitCode: 0 };
19
+ },
20
+ } as const satisfies InfraCommandDefinition;
@@ -0,0 +1,19 @@
1
+ import { destroy } from './commands/destroy.js';
2
+ import { down } from './commands/down.js';
3
+ import { generate } from './commands/generate.js';
4
+ import { outputs } from './commands/outputs.js';
5
+ import { plan } from './commands/plan.js';
6
+ import { status } from './commands/status.js';
7
+ import { up } from './commands/up.js';
8
+ import { validate } from './commands/validate.js';
9
+
10
+ export const INFRA_COMMANDS = [
11
+ validate,
12
+ plan,
13
+ generate,
14
+ up,
15
+ status,
16
+ outputs,
17
+ down,
18
+ destroy,
19
+ ] as const;
@@ -0,0 +1,17 @@
1
+ import { INFRA_PACKAGE_VERSION } from '../constants.js';
2
+ import type { InfraCommandContext } from '../types/infraCli.js';
3
+
4
+ /*** Create the process-backed command context used by the standalone executable. */
5
+ export function createDefaultInfraCommandContext(): InfraCommandContext {
6
+ return {
7
+ cwd: process.cwd(),
8
+ env: process.env,
9
+ version: INFRA_PACKAGE_VERSION,
10
+ writeStdout(text: string) {
11
+ process.stdout.write(text);
12
+ },
13
+ writeStderr(text: string) {
14
+ process.stderr.write(text);
15
+ },
16
+ };
17
+ }
@@ -0,0 +1,35 @@
1
+ import type { AnkhRuntimeCommandProvider } from '@ankhorage/ankh';
2
+
3
+ import {
4
+ INFRA_CAPABILITIES,
5
+ INFRA_COMMAND_CATEGORY,
6
+ INFRA_PACKAGE_NAME,
7
+ INFRA_PACKAGE_VERSION,
8
+ } from '../constants.js';
9
+ import type { CreateInfraRuntimeProviderOptions } from '../types/infraCli.js';
10
+ import { INFRA_COMMANDS } from './constants.js';
11
+ import { createProviderCommandDescriptors } from './createProviderCommandDescriptors.js';
12
+ import { runInfraCommandAsync } from './runInfraCommandAsync.js';
13
+
14
+ /*** Compose the canonical Infra command surface as an Ankh runtime provider. */
15
+ export function createInfraRuntimeProvider(
16
+ options: CreateInfraRuntimeProviderOptions = {},
17
+ ): AnkhRuntimeCommandProvider {
18
+ const runCommandImpl = options.runCommandImpl ?? runInfraCommandAsync;
19
+ return {
20
+ id: INFRA_PACKAGE_NAME,
21
+ category: INFRA_COMMAND_CATEGORY,
22
+ version: INFRA_PACKAGE_VERSION,
23
+ capabilities: [...INFRA_CAPABILITIES],
24
+ commands: createProviderCommandDescriptors(),
25
+ handlers: INFRA_COMMANDS.map((command) => ({
26
+ path: command.path,
27
+ handler(request) {
28
+ return runCommandImpl(
29
+ { argv: request.argv, command, context: request.context },
30
+ { services: options.services },
31
+ );
32
+ },
33
+ })),
34
+ } satisfies AnkhRuntimeCommandProvider;
35
+ }
@@ -0,0 +1,8 @@
1
+ import type { AnkhCommandDescriptor } from '@ankhorage/contracts/cli';
2
+
3
+ import { INFRA_COMMANDS } from './constants.js';
4
+
5
+ /*** Expose the same eight commands through Ankh provider discovery. */
6
+ export function createProviderCommandDescriptors(): readonly AnkhCommandDescriptor[] {
7
+ return INFRA_COMMANDS.map(({ capability, path, summary }) => ({ capability, path, summary }));
8
+ }
@@ -0,0 +1,7 @@
1
+ import type { InfraCommandDefinition } from '../types/infraCli.js';
2
+ import { INFRA_COMMANDS } from './constants.js';
3
+
4
+ /*** Resolve one exact standalone Infra command name without guessing intent. */
5
+ export function findInfraCommand(value: string): InfraCommandDefinition | null {
6
+ return INFRA_COMMANDS.find((candidate) => candidate.standaloneName === value) ?? null;
7
+ }
@@ -1,32 +1,24 @@
1
1
  import type { AnkhRuntimeCommandProvider } from '@ankhorage/ankh';
2
2
  import { describe, expect, test } from 'bun:test';
3
3
 
4
- import { createProviderCommandDescriptors, INFRA_COMMANDS } from '../commands.js';
4
+ import { createProviderCommandDescriptors } from './createProviderCommandDescriptors.js';
5
5
  import provider, { createInfraRuntimeProvider } from './index.js';
6
6
 
7
- describe('infra package cli provider', () => {
8
- test('publishes the expected runtime provider shape', () => {
9
- const expectedProvider = createInfraRuntimeProvider() satisfies AnkhRuntimeCommandProvider;
10
-
11
- expect(expectedProvider.id).toBe('@ankhorage/infra');
12
- expect(expectedProvider.category).toBe('infra');
13
- expect(expectedProvider.capabilities).toEqual([
7
+ describe('Infra Ankh provider', () => {
8
+ test('publishes all eight canonical capabilities and handlers', () => {
9
+ const expected = createInfraRuntimeProvider() satisfies AnkhRuntimeCommandProvider;
10
+ expect(expected.capabilities).toEqual([
14
11
  'infra.validate',
12
+ 'infra.plan',
15
13
  'infra.generate',
16
- 'infra.status',
17
14
  'infra.up',
15
+ 'infra.status',
16
+ 'infra.outputs',
18
17
  'infra.down',
18
+ 'infra.destroy',
19
19
  ]);
20
- expect(expectedProvider.commands).toEqual(createProviderCommandDescriptors());
21
- expect(expectedProvider.handlers?.map((handler) => handler.path.join(' '))).toEqual(
22
- INFRA_COMMANDS.map((command) => command.path.join(' ')),
23
- );
24
- expect(JSON.stringify(expectedProvider)).not.toContain('port-forward');
25
- });
26
-
27
- test('default export is the runtime provider', () => {
28
- expect(provider.category).toBe('infra');
29
- expect(provider.commands).toHaveLength(5);
30
- expect(provider.handlers).toHaveLength(5);
20
+ expect(expected.commands).toEqual(createProviderCommandDescriptors());
21
+ expect(expected.handlers).toHaveLength(8);
22
+ expect(provider.handlers).toHaveLength(8);
31
23
  });
32
24
  });
package/src/cli/index.ts CHANGED
@@ -1,53 +1,11 @@
1
- import type { AnkhRuntimeCommandProvider } from '@ankhorage/ankh';
2
-
3
- import {
4
- createProviderCommandDescriptors,
5
- INFRA_COMMANDS,
6
- type InfraCommandServices,
7
- runInfraCommand,
8
- type RunInfraCommandImpl,
9
- } from '../commands.js';
10
- import {
11
- INFRA_CAPABILITIES,
12
- INFRA_COMMAND_CATEGORY,
13
- INFRA_PACKAGE_NAME,
14
- INFRA_PACKAGE_VERSION,
15
- } from '../packageMetadata.js';
16
-
17
- export interface CreateInfraRuntimeProviderOptions {
18
- readonly runCommandImpl?: RunInfraCommandImpl;
19
- readonly services?: Partial<InfraCommandServices>;
20
- }
21
-
22
- export function createInfraRuntimeProvider(
23
- options: CreateInfraRuntimeProviderOptions = {},
24
- ): AnkhRuntimeCommandProvider {
25
- const runCommandImpl = options.runCommandImpl ?? runInfraCommand;
26
-
27
- return {
28
- id: INFRA_PACKAGE_NAME,
29
- category: INFRA_COMMAND_CATEGORY,
30
- version: INFRA_PACKAGE_VERSION,
31
- capabilities: [...INFRA_CAPABILITIES],
32
- commands: createProviderCommandDescriptors(),
33
- handlers: INFRA_COMMANDS.map((command) => ({
34
- path: command.path,
35
- handler(request) {
36
- return runCommandImpl(
37
- {
38
- argv: request.argv,
39
- command,
40
- context: request.context,
41
- },
42
- {
43
- services: options.services,
44
- },
45
- );
46
- },
47
- })),
48
- } satisfies AnkhRuntimeCommandProvider;
49
- }
1
+ import { createInfraRuntimeProvider } from './createInfraRuntimeProvider.js';
50
2
 
51
3
  const provider = createInfraRuntimeProvider();
52
4
 
5
+ export type {
6
+ CreateInfraRuntimeProviderOptions,
7
+ InfraCommandServices,
8
+ RunInfraCommandImpl,
9
+ } from '../types/infraCli.js';
10
+ export { createInfraRuntimeProvider } from './createInfraRuntimeProvider.js';
53
11
  export default provider;
@@ -0,0 +1,23 @@
1
+ import { INFRA_COMMAND_CATEGORY } from '../constants.js';
2
+ import { INFRA_COMMANDS } from './constants.js';
3
+
4
+ /*** Render the standalone Infra command surface and environment safety rules. */
5
+ export function renderInfraRootHelp(version: string): string {
6
+ const commands = INFRA_COMMANDS.map(
7
+ ({ standaloneName, summary }) => ` ${standaloneName.padEnd(8, ' ')} ${summary}`,
8
+ ).join('\n');
9
+ return [
10
+ `@ankhorage/infra v${version}`,
11
+ '',
12
+ 'Usage:',
13
+ ' ankhorage-infra <command> [project] [--environment <environment>]',
14
+ ` ankh ${INFRA_COMMAND_CATEGORY} <command> [project] [--environment <environment>]`,
15
+ '',
16
+ 'Commands:',
17
+ commands,
18
+ '',
19
+ 'Safety:',
20
+ ' local is the only implicit environment; destroy always requires --environment and --confirm.',
21
+ '',
22
+ ].join('\n');
23
+ }
@@ -0,0 +1,4 @@
1
+ /*** Render an invalid standalone Infra command without guessing intent. */
2
+ export function renderUnknownInfraCommand(value: string): string {
3
+ return [`Unknown infra command: ${value}`, '', 'Run ankhorage-infra --help', ''].join('\n');
4
+ }
@@ -0,0 +1,51 @@
1
+ import type {
2
+ InfraCommandContext,
3
+ InfraCommandRunResult,
4
+ InfraCommandServices,
5
+ RunInfraCommandImpl,
6
+ } from '../types/infraCli.js';
7
+ import { createDefaultInfraCommandContext } from './createDefaultInfraCommandContext.js';
8
+ import { findInfraCommand } from './findInfraCommand.js';
9
+ import { renderInfraRootHelp } from './renderInfraRootHelp.js';
10
+ import { renderUnknownInfraCommand } from './renderUnknownInfraCommand.js';
11
+ import { runInfraCommandAsync } from './runInfraCommandAsync.js';
12
+
13
+ /*** Dispatch the standalone executable arguments through the canonical Infra command surface. */
14
+ export async function runInfraCliAsync(
15
+ argv: readonly string[],
16
+ options: InfraCliOptions = {},
17
+ ): Promise<InfraCommandRunResult> {
18
+ const context = options.context ?? createDefaultInfraCommandContext();
19
+ const runCommand = options.runCommandImpl ?? runInfraCommandAsync;
20
+ const [firstToken, ...restTokens] = argv;
21
+ if (firstToken === undefined || isHelpToken(firstToken)) {
22
+ context.writeStdout(renderInfraRootHelp(context.version));
23
+ return { exitCode: 0 };
24
+ }
25
+ if (isVersionToken(firstToken)) {
26
+ context.writeStdout(`${context.version}\n`);
27
+ return { exitCode: 0 };
28
+ }
29
+ const command = findInfraCommand(firstToken);
30
+ if (command === null) {
31
+ context.writeStderr(renderUnknownInfraCommand(firstToken));
32
+ return { exitCode: 1 };
33
+ }
34
+ return runCommand({ argv: restTokens, command, context }, { services: options.services });
35
+ }
36
+
37
+ interface InfraCliOptions {
38
+ readonly context?: InfraCommandContext;
39
+ readonly runCommandImpl?: RunInfraCommandImpl;
40
+ readonly services?: Partial<InfraCommandServices>;
41
+ }
42
+
43
+ /*** Recognize standalone help tokens. */
44
+ function isHelpToken(value: string): boolean {
45
+ return value === '--help' || value === '-h' || value === 'help';
46
+ }
47
+
48
+ /*** Recognize standalone version tokens. */
49
+ function isVersionToken(value: string): boolean {
50
+ return value === '--version' || value === '-v' || value === 'version';
51
+ }
@@ -0,0 +1,114 @@
1
+ import { APP_ENVIRONMENT_IDS } from '@ankhorage/contracts/environments';
2
+
3
+ import { INFRA_COMMAND_CATEGORY } from '../constants.js';
4
+ import { createInfraCommandServices } from '../features/environment-lifecycle/composition/createInfraCommandServices.js';
5
+ import type {
6
+ InfraCommandDefinition,
7
+ InfraCommandInvocation,
8
+ InfraCommandRunResult,
9
+ ParsedInfraArguments,
10
+ RunInfraCommandOptions,
11
+ } from '../types/infraCli.js';
12
+
13
+ /*** Run one standalone or provider-backed Infra command through the shared typed lifecycle. */
14
+ export async function runInfraCommandAsync(
15
+ request: InfraCommandInvocation,
16
+ options: RunInfraCommandOptions = {},
17
+ ): Promise<InfraCommandRunResult> {
18
+ const services = createInfraCommandServices(options.services);
19
+ try {
20
+ const parsed = parseCommandArguments(request.command, request.argv);
21
+ if (parsed === null) {
22
+ request.context.writeStdout(renderCommandHelp(request.command));
23
+ return { exitCode: 0 };
24
+ }
25
+ return await request.command.run({ context: request.context, arguments: parsed }, services);
26
+ } catch (error) {
27
+ request.context.writeStderr(
28
+ `Infra ${request.command.standaloneName} failed: ${getErrorMessage(error)}\n`,
29
+ );
30
+ return { exitCode: 1 };
31
+ }
32
+ }
33
+
34
+ /*** Parse the common project, environment, output and destruction options. */
35
+ function parseCommandArguments(
36
+ commandDefinition: InfraCommandDefinition,
37
+ argv: readonly string[],
38
+ ): ParsedInfraArguments | null {
39
+ if (argv.length === 1 && isHelpToken(argv.at(0))) return null;
40
+ let projectId: string | undefined;
41
+ let environment: ParsedInfraArguments['environment'];
42
+ let format: ParsedInfraArguments['format'] = 'human';
43
+ let confirmation: string | undefined;
44
+ const deleteResources: string[] = [];
45
+ for (let index = 0; index < argv.length; index += 1) {
46
+ const token = argv.at(index);
47
+ if (token === '--environment') {
48
+ environment = parseEnvironment(readOptionValue(argv, ++index, token));
49
+ } else if (token === '--format') {
50
+ format = parseFormat(readOptionValue(argv, ++index, token));
51
+ } else if (token === '--confirm') {
52
+ confirmation = readOptionValue(argv, ++index, token);
53
+ } else if (token === '--delete-resource') {
54
+ deleteResources.push(readOptionValue(argv, ++index, token));
55
+ } else if (token?.startsWith('-') === true) {
56
+ throw new Error(`Unknown Infra ${commandDefinition.standaloneName} option: ${token}`);
57
+ } else if (projectId === undefined && token !== undefined) {
58
+ projectId = token;
59
+ } else {
60
+ throw new Error(
61
+ `Infra ${commandDefinition.standaloneName} accepts at most one project argument.`,
62
+ );
63
+ }
64
+ }
65
+ if (format === 'env' && commandDefinition.standaloneName !== 'outputs') {
66
+ throw new Error('--format env is supported only by Infra outputs.');
67
+ }
68
+ if (commandDefinition.standaloneName === 'destroy' && environment === undefined) {
69
+ throw new Error('Infra destroy requires --environment <local|preview|production>.');
70
+ }
71
+ return { projectId, environment, format, confirmation, deleteResources };
72
+ }
73
+
74
+ /*** Parse one environment identifier against the canonical closed set. */
75
+ function parseEnvironment(value: string): ParsedInfraArguments['environment'] {
76
+ const environment = APP_ENVIRONMENT_IDS.find((candidate) => candidate === value);
77
+ if (environment === undefined) throw new Error(`Unknown Infra environment: ${value}.`);
78
+ return environment;
79
+ }
80
+
81
+ /*** Parse the supported command output formats. */
82
+ function parseFormat(value: string): ParsedInfraArguments['format'] {
83
+ if (value === 'human' || value === 'json' || value === 'env') return value;
84
+ throw new Error(`Unknown Infra output format: ${value}.`);
85
+ }
86
+
87
+ /*** Read one required CLI option value. */
88
+ function readOptionValue(argv: readonly string[], index: number, option: string): string {
89
+ const value = argv.at(index);
90
+ if (value === undefined || value.startsWith('-')) throw new Error(`${option} requires a value.`);
91
+ return value;
92
+ }
93
+
94
+ /*** Render command-specific standalone and provider usage. */
95
+ function renderCommandHelp(commandDefinition: InfraCommandDefinition): string {
96
+ return [
97
+ commandDefinition.summary,
98
+ '',
99
+ 'Usage:',
100
+ ` ankhorage-infra ${commandDefinition.standaloneName} [project] [--environment <environment>]`,
101
+ ` ankh ${INFRA_COMMAND_CATEGORY} ${commandDefinition.path.join(' ')} [project] [--environment <environment>]`,
102
+ '',
103
+ ].join('\n');
104
+ }
105
+
106
+ /*** Normalize arbitrary command failures for the CLI boundary. */
107
+ function getErrorMessage(error: unknown): string {
108
+ return error instanceof Error ? error.message : String(error);
109
+ }
110
+
111
+ /*** Recognize the command-local help tokens. */
112
+ function isHelpToken(value: string | undefined): boolean {
113
+ return value === '--help' || value === '-h' || value === 'help';
114
+ }
@@ -0,0 +1,64 @@
1
+ import type { AppEnvironmentId } from '@ankhorage/contracts/environments';
2
+ import type { InfraEnvironmentSpec, InfraManifest } from '@ankhorage/contracts/infra';
3
+
4
+ import type {
5
+ InfraCommandRunRequest,
6
+ InfraCommandServices,
7
+ PreparedInfraCommandOperation,
8
+ } from '../../types/infraCli.js';
9
+
10
+ /*** Resolve one command's project, desired environment, stored ownership and adapter dependencies. */
11
+ export async function prepareInfraCommandOperationAsync(
12
+ request: InfraCommandRunRequest,
13
+ services: InfraCommandServices,
14
+ useStoredDesired = false,
15
+ ): Promise<PreparedInfraCommandOperation> {
16
+ const project = await services.resolveProject({
17
+ cwd: request.context.cwd,
18
+ ...(request.arguments.projectId === undefined
19
+ ? {}
20
+ : { projectId: request.arguments.projectId }),
21
+ });
22
+ const environment = request.arguments.environment ?? 'local';
23
+ const state = await services.readState(project.projectPath, environment);
24
+ const currentDesired = environmentDesired(project.manifest.infra, environment);
25
+ const desired = useStoredDesired && state !== null ? state.desired : currentDesired;
26
+ if (desired === undefined) {
27
+ throw new Error(`Infra environment "${environment}" is not configured.`);
28
+ }
29
+ const manifest = replaceEnvironment(project.manifest.infra, environment, desired);
30
+ return {
31
+ project,
32
+ state,
33
+ desired,
34
+ operation: {
35
+ projectId: project.projectId,
36
+ manifest,
37
+ ...(request.arguments.environment === undefined ? {} : { environment }),
38
+ ...(state === null ? {} : { previous: state.ledger, previousDesired: state.desired }),
39
+ },
40
+ dependencies: services.createDependencies(request.context),
41
+ };
42
+ }
43
+
44
+ /*** Select one exact environment specification from the canonical manifest. */
45
+ function environmentDesired(
46
+ manifest: InfraManifest,
47
+ environment: AppEnvironmentId,
48
+ ): InfraEnvironmentSpec | undefined {
49
+ if (environment === 'local') return manifest.environments.local;
50
+ if (environment === 'preview') return manifest.environments.preview;
51
+ return manifest.environments.production;
52
+ }
53
+
54
+ /*** Replace one environment while preserving the rest of the canonical manifest. */
55
+ function replaceEnvironment(
56
+ manifest: InfraManifest,
57
+ environment: AppEnvironmentId,
58
+ desired: InfraEnvironmentSpec,
59
+ ): InfraManifest {
60
+ return {
61
+ ...manifest,
62
+ environments: { ...manifest.environments, [environment]: desired },
63
+ };
64
+ }