@ankhorage/infra 4.1.12 → 5.0.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 (521) hide show
  1. package/CHANGELOG.md +10 -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/domain/orderInfraPlanActions.d.ts +4 -0
  192. package/dist/features/environment-lifecycle/domain/orderInfraPlanActions.d.ts.map +1 -0
  193. package/dist/features/environment-lifecycle/domain/orderInfraPlanActions.js +54 -0
  194. package/dist/features/environment-lifecycle/domain/orderInfraPlanActions.js.map +1 -0
  195. package/dist/features/environment-lifecycle/domain/resolveInfraEnvironment.d.ts +5 -0
  196. package/dist/features/environment-lifecycle/domain/resolveInfraEnvironment.d.ts.map +1 -0
  197. package/dist/features/environment-lifecycle/domain/resolveInfraEnvironment.js +39 -0
  198. package/dist/features/environment-lifecycle/domain/resolveInfraEnvironment.js.map +1 -0
  199. package/dist/features/environment-lifecycle/utils/appendInfraFailure.d.ts +7 -0
  200. package/dist/features/environment-lifecycle/utils/appendInfraFailure.d.ts.map +1 -0
  201. package/dist/features/environment-lifecycle/utils/appendInfraFailure.js +5 -0
  202. package/dist/features/environment-lifecycle/utils/appendInfraFailure.js.map +1 -0
  203. package/dist/features/environment-lifecycle/utils/createInfraExecutionContext.d.ts +5 -0
  204. package/dist/features/environment-lifecycle/utils/createInfraExecutionContext.d.ts.map +1 -0
  205. package/dist/features/environment-lifecycle/utils/createInfraExecutionContext.js +13 -0
  206. package/dist/features/environment-lifecycle/utils/createInfraExecutionContext.js.map +1 -0
  207. package/dist/features/environment-lifecycle/utils/createInfraFailure.d.ts +4 -0
  208. package/dist/features/environment-lifecycle/utils/createInfraFailure.d.ts.map +1 -0
  209. package/dist/features/environment-lifecycle/utils/createInfraFailure.js +5 -0
  210. package/dist/features/environment-lifecycle/utils/createInfraFailure.js.map +1 -0
  211. package/dist/features/environment-lifecycle/utils/createInfraLedger.d.ts +12 -0
  212. package/dist/features/environment-lifecycle/utils/createInfraLedger.d.ts.map +1 -0
  213. package/dist/features/environment-lifecycle/utils/createInfraLedger.js +14 -0
  214. package/dist/features/environment-lifecycle/utils/createInfraLedger.js.map +1 -0
  215. package/dist/features/environment-lifecycle/utils/infraIdentityKey.d.ts +4 -0
  216. package/dist/features/environment-lifecycle/utils/infraIdentityKey.d.ts.map +1 -0
  217. package/dist/features/environment-lifecycle/utils/infraIdentityKey.js +5 -0
  218. package/dist/features/environment-lifecycle/utils/infraIdentityKey.js.map +1 -0
  219. package/dist/features/environment-lifecycle/utils/isInfraStoredState.d.ts +4 -0
  220. package/dist/features/environment-lifecycle/utils/isInfraStoredState.d.ts.map +1 -0
  221. package/dist/features/environment-lifecycle/utils/isInfraStoredState.js +103 -0
  222. package/dist/features/environment-lifecycle/utils/isInfraStoredState.js.map +1 -0
  223. package/dist/features/environment-lifecycle/utils/mergeInfraOutputs.d.ts +4 -0
  224. package/dist/features/environment-lifecycle/utils/mergeInfraOutputs.d.ts.map +1 -0
  225. package/dist/features/environment-lifecycle/utils/mergeInfraOutputs.js +10 -0
  226. package/dist/features/environment-lifecycle/utils/mergeInfraOutputs.js.map +1 -0
  227. package/dist/features/environment-lifecycle/utils/mergeInfraResources.d.ts +4 -0
  228. package/dist/features/environment-lifecycle/utils/mergeInfraResources.d.ts.map +1 -0
  229. package/dist/features/environment-lifecycle/utils/mergeInfraResources.js +10 -0
  230. package/dist/features/environment-lifecycle/utils/mergeInfraResources.js.map +1 -0
  231. package/dist/features/environment-lifecycle/utils/normalizeInfraEnvironmentKey.d.ts +3 -0
  232. package/dist/features/environment-lifecycle/utils/normalizeInfraEnvironmentKey.d.ts.map +1 -0
  233. package/dist/features/environment-lifecycle/utils/normalizeInfraEnvironmentKey.js +8 -0
  234. package/dist/features/environment-lifecycle/utils/normalizeInfraEnvironmentKey.js.map +1 -0
  235. package/dist/features/environment-lifecycle/utils/resolveInfraStatePath.d.ts +4 -0
  236. package/dist/features/environment-lifecycle/utils/resolveInfraStatePath.d.ts.map +1 -0
  237. package/dist/features/environment-lifecycle/utils/resolveInfraStatePath.js +11 -0
  238. package/dist/features/environment-lifecycle/utils/resolveInfraStatePath.js.map +1 -0
  239. package/dist/features/environment-lifecycle/utils/resolveProjectFile.d.ts +3 -0
  240. package/dist/features/environment-lifecycle/utils/resolveProjectFile.d.ts.map +1 -0
  241. package/dist/features/environment-lifecycle/utils/resolveProjectFile.js +19 -0
  242. package/dist/features/environment-lifecycle/utils/resolveProjectFile.js.map +1 -0
  243. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterOutputs.d.ts +4 -0
  244. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterOutputs.d.ts.map +1 -0
  245. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterOutputs.js +6 -0
  246. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterOutputs.js.map +1 -0
  247. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterResources.d.ts +4 -0
  248. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterResources.d.ts.map +1 -0
  249. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterResources.js +6 -0
  250. package/dist/features/environment-lifecycle/utils/retainUnchangedAdapterResources.js.map +1 -0
  251. package/dist/index.d.ts +16 -6
  252. package/dist/index.d.ts.map +1 -1
  253. package/dist/index.js +14 -15
  254. package/dist/index.js.map +1 -1
  255. package/dist/metadata/index.d.ts +1 -1
  256. package/dist/metadata/index.d.ts.map +1 -1
  257. package/dist/metadata/index.js +1 -1
  258. package/dist/metadata/index.js.map +1 -1
  259. package/dist/project/index.d.ts +7 -5
  260. package/dist/project/index.d.ts.map +1 -1
  261. package/dist/project/index.js +6 -5
  262. package/dist/project/index.js.map +1 -1
  263. package/dist/readme-usage.js +17 -26
  264. package/dist/readme-usage.js.map +1 -1
  265. package/dist/testSupport.d.ts +1 -1
  266. package/dist/testSupport.d.ts.map +1 -1
  267. package/dist/testSupport.js +11 -1
  268. package/dist/testSupport.js.map +1 -1
  269. package/dist/types/infraCli.d.ts +91 -0
  270. package/dist/types/infraCli.d.ts.map +1 -0
  271. package/dist/types/infraCli.js +2 -0
  272. package/dist/types/infraCli.js.map +1 -0
  273. package/dist/types/infraOrchestration.d.ts +84 -0
  274. package/dist/types/infraOrchestration.d.ts.map +1 -0
  275. package/dist/types/infraOrchestration.js +2 -0
  276. package/dist/types/infraOrchestration.js.map +1 -0
  277. package/dist/{project.d.ts → types/infraProject.d.ts} +6 -6
  278. package/dist/types/infraProject.d.ts.map +1 -0
  279. package/dist/types/infraProject.js +2 -0
  280. package/dist/types/infraProject.js.map +1 -0
  281. package/package.json +20 -10
  282. package/src/adapterPackages.integration.test.ts +79 -0
  283. package/src/cli/bin.ts +2 -61
  284. package/src/cli/cli.test.ts +35 -126
  285. package/src/cli/commands/destroy.ts +57 -0
  286. package/src/cli/commands/down.ts +28 -0
  287. package/src/cli/commands/generate.ts +34 -0
  288. package/src/cli/commands/outputs.ts +25 -0
  289. package/src/cli/commands/plan.ts +20 -0
  290. package/src/cli/commands/status.ts +20 -0
  291. package/src/cli/commands/up.ts +29 -0
  292. package/src/cli/commands/validate.ts +20 -0
  293. package/src/cli/constants.ts +19 -0
  294. package/src/cli/createDefaultInfraCommandContext.ts +17 -0
  295. package/src/cli/createInfraRuntimeProvider.ts +35 -0
  296. package/src/cli/createProviderCommandDescriptors.ts +8 -0
  297. package/src/cli/findInfraCommand.ts +7 -0
  298. package/src/cli/index.test.ts +12 -20
  299. package/src/cli/index.ts +7 -49
  300. package/src/cli/renderInfraRootHelp.ts +23 -0
  301. package/src/cli/renderUnknownInfraCommand.ts +4 -0
  302. package/src/cli/runInfraCliAsync.ts +51 -0
  303. package/src/cli/runInfraCommandAsync.ts +114 -0
  304. package/src/cli/utils/prepareInfraCommandOperationAsync.ts +64 -0
  305. package/src/cli/utils/requireInfraSuccess.ts +24 -0
  306. package/src/cli/utils/resolveInfraPersistence.ts +22 -0
  307. package/src/cli/utils/writeInfraEnvironmentOutputs.ts +24 -0
  308. package/src/cli/utils/writeInfraStructured.ts +11 -0
  309. package/src/commands.test.ts +198 -196
  310. package/src/{packageMetadata.ts → constants.ts} +5 -2
  311. package/src/environmentLifecycle.test.ts +193 -0
  312. package/src/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraCredentialPort.ts +52 -0
  313. package/src/features/environment-lifecycle/adapters/outbound/createEnvironmentInfraSecretPort.ts +32 -0
  314. package/src/features/environment-lifecycle/adapters/outbound/createNodeInfraAdapterPackageResolver.ts +10 -0
  315. package/src/features/environment-lifecycle/adapters/outbound/readStoredInfraStateAsync.ts +34 -0
  316. package/src/features/environment-lifecycle/adapters/outbound/removeStoredInfraStateAsync.ts +12 -0
  317. package/src/{project.ts → features/environment-lifecycle/adapters/outbound/resolveInfraProjectAsync.ts} +10 -45
  318. package/src/features/environment-lifecycle/adapters/outbound/writeInfraGeneratedArtifactsAsync.ts +34 -0
  319. package/src/features/environment-lifecycle/adapters/outbound/writeStoredInfraStateAsync.ts +21 -0
  320. package/src/features/environment-lifecycle/application/ports/outbound/infraAdapterPackage.ts +10 -0
  321. package/src/features/environment-lifecycle/application/use-cases/collectInfraWorkloadsAsync.ts +25 -0
  322. package/src/features/environment-lifecycle/application/use-cases/destroyInfraEnvironmentAsync.ts +119 -0
  323. package/src/features/environment-lifecycle/application/use-cases/downInfraEnvironmentAsync.ts +65 -0
  324. package/src/features/environment-lifecycle/application/use-cases/generateInfraEnvironmentAsync.ts +51 -0
  325. package/src/features/environment-lifecycle/application/use-cases/getInfraEnvironmentOutputs.ts +41 -0
  326. package/src/features/environment-lifecycle/application/use-cases/planInfraEnvironmentAsync.ts +67 -0
  327. package/src/features/environment-lifecycle/application/use-cases/prepareInfraOperationAsync.ts +137 -0
  328. package/src/features/environment-lifecycle/application/use-cases/resolveInfraAdaptersAsync.ts +257 -0
  329. package/src/features/environment-lifecycle/application/use-cases/statusInfraEnvironmentAsync.ts +80 -0
  330. package/src/features/environment-lifecycle/application/use-cases/upInfraEnvironmentAsync.ts +126 -0
  331. package/src/features/environment-lifecycle/application/use-cases/validateInfraAdaptersAsync.ts +25 -0
  332. package/src/features/environment-lifecycle/application/use-cases/validateInfraEnvironmentAsync.ts +21 -0
  333. package/src/features/environment-lifecycle/composition/createInfraCommandServices.ts +47 -0
  334. package/src/features/environment-lifecycle/domain/orderInfraPlanActions.ts +64 -0
  335. package/src/features/environment-lifecycle/domain/resolveInfraEnvironment.ts +62 -0
  336. package/src/features/environment-lifecycle/utils/appendInfraFailure.ts +9 -0
  337. package/src/features/environment-lifecycle/utils/createInfraExecutionContext.ts +24 -0
  338. package/src/features/environment-lifecycle/utils/createInfraFailure.ts +6 -0
  339. package/src/features/environment-lifecycle/utils/createInfraLedger.ts +30 -0
  340. package/src/features/environment-lifecycle/utils/infraIdentityKey.ts +6 -0
  341. package/src/features/environment-lifecycle/utils/isInfraStoredState.ts +141 -0
  342. package/src/features/environment-lifecycle/utils/mergeInfraOutputs.ts +14 -0
  343. package/src/features/environment-lifecycle/utils/mergeInfraResources.ts +14 -0
  344. package/src/features/environment-lifecycle/utils/normalizeInfraEnvironmentKey.ts +7 -0
  345. package/src/features/environment-lifecycle/utils/resolveInfraStatePath.ts +12 -0
  346. package/src/features/environment-lifecycle/utils/resolveProjectFile.ts +22 -0
  347. package/src/features/environment-lifecycle/utils/retainUnchangedAdapterOutputs.ts +15 -0
  348. package/src/features/environment-lifecycle/utils/retainUnchangedAdapterResources.ts +15 -0
  349. package/src/index.test.ts +22 -315
  350. package/src/index.ts +41 -53
  351. package/src/infraComposition.integration.test.ts +128 -0
  352. package/src/infraOperations.test.ts +386 -0
  353. package/src/infraUp.test.ts +260 -0
  354. package/src/metadata/index.ts +1 -1
  355. package/src/package.test.ts +4 -2
  356. package/src/project/index.test.ts +8 -188
  357. package/src/project/index.ts +7 -22
  358. package/src/project.test.ts +39 -189
  359. package/src/projectContractsParser.test.ts +2 -2
  360. package/src/projectInfrastructure.test.ts +121 -167
  361. package/src/readme-usage.ts +17 -26
  362. package/src/testSupport.ts +12 -2
  363. package/src/types/infraCli.ts +115 -0
  364. package/src/types/infraOrchestration.ts +126 -0
  365. package/src/types/infraProject.ts +15 -0
  366. package/dist/adapters/minikube/auth/index.d.ts +0 -8
  367. package/dist/adapters/minikube/auth/index.d.ts.map +0 -1
  368. package/dist/adapters/minikube/auth/index.js +0 -29
  369. package/dist/adapters/minikube/auth/index.js.map +0 -1
  370. package/dist/adapters/minikube/auth/oauthRuntime.d.ts +0 -4
  371. package/dist/adapters/minikube/auth/oauthRuntime.d.ts.map +0 -1
  372. package/dist/adapters/minikube/auth/oauthRuntime.js +0 -138
  373. package/dist/adapters/minikube/auth/oauthRuntime.js.map +0 -1
  374. package/dist/adapters/minikube/auth/supabase/index.d.ts +0 -7
  375. package/dist/adapters/minikube/auth/supabase/index.d.ts.map +0 -1
  376. package/dist/adapters/minikube/auth/supabase/index.js +0 -232
  377. package/dist/adapters/minikube/auth/supabase/index.js.map +0 -1
  378. package/dist/adapters/minikube/auth/supabase/profile.d.ts +0 -20
  379. package/dist/adapters/minikube/auth/supabase/profile.d.ts.map +0 -1
  380. package/dist/adapters/minikube/auth/supabase/profile.js +0 -452
  381. package/dist/adapters/minikube/auth/supabase/profile.js.map +0 -1
  382. package/dist/adapters/minikube/auth/targetAwareOAuthRuntime.d.ts +0 -7
  383. package/dist/adapters/minikube/auth/targetAwareOAuthRuntime.d.ts.map +0 -1
  384. package/dist/adapters/minikube/auth/targetAwareOAuthRuntime.js +0 -104
  385. package/dist/adapters/minikube/auth/targetAwareOAuthRuntime.js.map +0 -1
  386. package/dist/adapters/minikube/authz/cerbos/index.d.ts +0 -13
  387. package/dist/adapters/minikube/authz/cerbos/index.d.ts.map +0 -1
  388. package/dist/adapters/minikube/authz/cerbos/index.js +0 -382
  389. package/dist/adapters/minikube/authz/cerbos/index.js.map +0 -1
  390. package/dist/adapters/minikube/authz/index.d.ts +0 -9
  391. package/dist/adapters/minikube/authz/index.d.ts.map +0 -1
  392. package/dist/adapters/minikube/authz/index.js +0 -23
  393. package/dist/adapters/minikube/authz/index.js.map +0 -1
  394. package/dist/adapters/minikube/base/index.d.ts +0 -14
  395. package/dist/adapters/minikube/base/index.d.ts.map +0 -1
  396. package/dist/adapters/minikube/base/index.js +0 -3433
  397. package/dist/adapters/minikube/base/index.js.map +0 -1
  398. package/dist/adapters/minikube/base/supabaseMigrations.d.ts +0 -2
  399. package/dist/adapters/minikube/base/supabaseMigrations.d.ts.map +0 -1
  400. package/dist/adapters/minikube/base/supabaseMigrations.js +0 -6
  401. package/dist/adapters/minikube/base/supabaseMigrations.js.map +0 -1
  402. package/dist/adapters/minikube/contracts.d.ts +0 -34
  403. package/dist/adapters/minikube/contracts.d.ts.map +0 -1
  404. package/dist/adapters/minikube/contracts.js +0 -10
  405. package/dist/adapters/minikube/contracts.js.map +0 -1
  406. package/dist/adapters/minikube/index.d.ts +0 -3
  407. package/dist/adapters/minikube/index.d.ts.map +0 -1
  408. package/dist/adapters/minikube/index.js +0 -136
  409. package/dist/adapters/minikube/index.js.map +0 -1
  410. package/dist/adapters/minikube/secrets/index.d.ts +0 -7
  411. package/dist/adapters/minikube/secrets/index.d.ts.map +0 -1
  412. package/dist/adapters/minikube/secrets/index.js +0 -13
  413. package/dist/adapters/minikube/secrets/index.js.map +0 -1
  414. package/dist/adapters/minikube/secrets/supabase-vault/index.d.ts +0 -8
  415. package/dist/adapters/minikube/secrets/supabase-vault/index.d.ts.map +0 -1
  416. package/dist/adapters/minikube/secrets/supabase-vault/index.js +0 -118
  417. package/dist/adapters/minikube/secrets/supabase-vault/index.js.map +0 -1
  418. package/dist/adapters/minikube/storage/index.d.ts +0 -7
  419. package/dist/adapters/minikube/storage/index.d.ts.map +0 -1
  420. package/dist/adapters/minikube/storage/index.js +0 -77
  421. package/dist/adapters/minikube/storage/index.js.map +0 -1
  422. package/dist/adapters/minikube/storage/supabase/index.d.ts +0 -7
  423. package/dist/adapters/minikube/storage/supabase/index.d.ts.map +0 -1
  424. package/dist/adapters/minikube/storage/supabase/index.js +0 -82
  425. package/dist/adapters/minikube/storage/supabase/index.js.map +0 -1
  426. package/dist/authRedirects.d.ts +0 -19
  427. package/dist/authRedirects.d.ts.map +0 -1
  428. package/dist/authRedirects.js +0 -80
  429. package/dist/authRedirects.js.map +0 -1
  430. package/dist/authTargetRedirects.d.ts +0 -12
  431. package/dist/authTargetRedirects.d.ts.map +0 -1
  432. package/dist/authTargetRedirects.js +0 -32
  433. package/dist/authTargetRedirects.js.map +0 -1
  434. package/dist/commandContext.d.ts +0 -12
  435. package/dist/commandContext.d.ts.map +0 -1
  436. package/dist/commandContext.js.map +0 -1
  437. package/dist/commands.d.ts +0 -95
  438. package/dist/commands.d.ts.map +0 -1
  439. package/dist/commands.js +0 -256
  440. package/dist/commands.js.map +0 -1
  441. package/dist/infraValidation.d.ts +0 -4
  442. package/dist/infraValidation.d.ts.map +0 -1
  443. package/dist/infraValidation.js +0 -63
  444. package/dist/infraValidation.js.map +0 -1
  445. package/dist/packageMetadata.d.ts +0 -10
  446. package/dist/packageMetadata.d.ts.map +0 -1
  447. package/dist/packageMetadata.js.map +0 -1
  448. package/dist/project.d.ts.map +0 -1
  449. package/dist/project.js.map +0 -1
  450. package/dist/projectDatabase.d.ts +0 -5
  451. package/dist/projectDatabase.d.ts.map +0 -1
  452. package/dist/projectDatabase.js +0 -22
  453. package/dist/projectDatabase.js.map +0 -1
  454. package/dist/projectEnvironment.d.ts +0 -6
  455. package/dist/projectEnvironment.d.ts.map +0 -1
  456. package/dist/projectEnvironment.js +0 -45
  457. package/dist/projectEnvironment.js.map +0 -1
  458. package/dist/projectInfrastructure.d.ts +0 -38
  459. package/dist/projectInfrastructure.d.ts.map +0 -1
  460. package/dist/projectInfrastructure.js +0 -145
  461. package/dist/projectInfrastructure.js.map +0 -1
  462. package/dist/runtime.d.ts +0 -54
  463. package/dist/runtime.d.ts.map +0 -1
  464. package/dist/runtime.js +0 -151
  465. package/dist/runtime.js.map +0 -1
  466. package/dist/secretStore.d.ts +0 -19
  467. package/dist/secretStore.d.ts.map +0 -1
  468. package/dist/secretStore.js +0 -22
  469. package/dist/secretStore.js.map +0 -1
  470. package/dist/types.d.ts +0 -70
  471. package/dist/types.d.ts.map +0 -1
  472. package/dist/types.js +0 -2
  473. package/dist/types.js.map +0 -1
  474. package/src/adapters/minikube/README.md +0 -115
  475. package/src/adapters/minikube/appRuntimeServing.test.ts +0 -28
  476. package/src/adapters/minikube/auth/index.ts +0 -40
  477. package/src/adapters/minikube/auth/oauthRuntime.ts +0 -163
  478. package/src/adapters/minikube/auth/supabase/index.test.ts +0 -227
  479. package/src/adapters/minikube/auth/supabase/index.ts +0 -293
  480. package/src/adapters/minikube/auth/supabase/oauthRuntime.test.ts +0 -154
  481. package/src/adapters/minikube/auth/supabase/profile.integration.test.ts +0 -1028
  482. package/src/adapters/minikube/auth/supabase/profile.ts +0 -526
  483. package/src/adapters/minikube/auth/supabase/providerAssignments.test.ts +0 -36
  484. package/src/adapters/minikube/auth/targetAwareOAuthRuntime.test.ts +0 -83
  485. package/src/adapters/minikube/auth/targetAwareOAuthRuntime.ts +0 -136
  486. package/src/adapters/minikube/authz/cerbos/index.ts +0 -486
  487. package/src/adapters/minikube/authz/index.ts +0 -32
  488. package/src/adapters/minikube/base/appImageBuild.test.ts +0 -352
  489. package/src/adapters/minikube/base/index.test.ts +0 -693
  490. package/src/adapters/minikube/base/index.ts +0 -3763
  491. package/src/adapters/minikube/base/portForwardRuntime.test.ts +0 -624
  492. package/src/adapters/minikube/base/supabaseMigrations.test.ts +0 -168
  493. package/src/adapters/minikube/base/supabaseMigrations.ts +0 -5
  494. package/src/adapters/minikube/base/twoAppIsolation.integration.test.ts +0 -898
  495. package/src/adapters/minikube/base/upgradeReconciliation.test.ts +0 -135
  496. package/src/adapters/minikube/contracts.ts +0 -46
  497. package/src/adapters/minikube/index.ts +0 -172
  498. package/src/adapters/minikube/secrets/index.test.ts +0 -147
  499. package/src/adapters/minikube/secrets/index.ts +0 -19
  500. package/src/adapters/minikube/secrets/supabase-vault/index.ts +0 -139
  501. package/src/adapters/minikube/storage/index.ts +0 -91
  502. package/src/adapters/minikube/storage/supabase/index.ts +0 -108
  503. package/src/apiInfrastructure.test.ts +0 -69
  504. package/src/authRedirects.test.ts +0 -63
  505. package/src/authRedirects.ts +0 -113
  506. package/src/authTargetRedirects.test.ts +0 -62
  507. package/src/authTargetRedirects.ts +0 -46
  508. package/src/commandContext.ts +0 -27
  509. package/src/commands.ts +0 -404
  510. package/src/generatedApiLedgerCleanup.test.ts +0 -72
  511. package/src/infraApiValidation.test.ts +0 -42
  512. package/src/infraValidation.ts +0 -99
  513. package/src/minikubeImageLifecycle.test.ts +0 -35
  514. package/src/projectDatabase.ts +0 -27
  515. package/src/projectEnvironment.ts +0 -51
  516. package/src/projectInfrastructure.ts +0 -221
  517. package/src/runtime.test.ts +0 -124
  518. package/src/runtime.ts +0 -234
  519. package/src/secretStore.test.ts +0 -76
  520. package/src/secretStore.ts +0 -44
  521. package/src/types.ts +0 -82
@@ -1,693 +0,0 @@
1
- import { describe, expect, test } from 'bun:test';
2
-
3
- import { generateInfrastructure } from '../../../index';
4
- import { createAppManifest } from '../../../testSupport';
5
- import type { InfraManifestInput } from '../../../types';
6
-
7
- describe('generateMinikubeBaseArtifacts app-owned cluster model', () => {
8
- test('uses the canonical app slug as the only Minikube profile identity', () => {
9
- const result = generateInfrastructure(createSupabaseManifest(), {
10
- namespaceHint: 'ignored',
11
- appManifest: createAppManifest('chess'),
12
- });
13
- const envExample = getFile(result.files, 'infra/minikube/.env.example');
14
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
15
- const downScript = getFile(result.files, 'infra/minikube/scripts/down.sh');
16
- const destroyScript = getFile(result.files, 'infra/minikube/scripts/destroy.sh');
17
-
18
- expect(envExample).toContain('ANKH_APP_SLUG=chess');
19
- expect(envExample).not.toContain('MINIKUBE_PROFILE=');
20
- expect(upScript).toContain('PROFILE="${ANKH_APP_SLUG:-chess}"');
21
- expect(upScript).toContain('minikube start -p "${PROFILE}"');
22
- expect(upScript).not.toContain('PROFILE="${MINIKUBE_PROFILE:-minikube}"');
23
- expect(downScript).toContain('minikube stop -p "${PROFILE}"');
24
- expect(destroyScript).toContain('minikube delete -p "${PROFILE}"');
25
- });
26
-
27
- test('generates fixed app and supabase namespaces instead of slug namespaces', () => {
28
- const result = generateInfrastructure(createSupabaseManifest(), {
29
- appManifest: createAppManifest('uwm'),
30
- });
31
- const paths = result.files.map((file) => file.path);
32
- const appNamespace = getFile(result.files, 'infra/minikube/k8s/namespaces/app.yaml');
33
- const supabaseNamespace = getFile(result.files, 'infra/minikube/k8s/namespaces/supabase.yaml');
34
- const appDeployment = getFile(result.files, 'infra/minikube/k8s/app/deployment.yaml');
35
- const postgres = getFile(result.files, 'infra/minikube/k8s/supabase/postgres.yaml');
36
-
37
- expect(paths).toContain('infra/minikube/k8s/namespaces/app.yaml');
38
- expect(paths).toContain('infra/minikube/k8s/namespaces/supabase.yaml');
39
- expect(paths).not.toContain('infra/minikube/k8s/namespace.yaml');
40
- expect(appNamespace).toContain('name: app');
41
- expect(supabaseNamespace).toContain('name: supabase');
42
- expect(appDeployment).toContain('namespace: app');
43
- expect(appDeployment).toContain('name: supabase-public-runtime');
44
- expect(postgres).toContain('namespace: supabase');
45
- });
46
-
47
- test('removes host-level Supabase runtime ownership from generated files', () => {
48
- const result = generateInfrastructure(createSupabaseManifest(), {
49
- appManifest: createAppManifest('scanner'),
50
- });
51
- const serialized = JSON.stringify(result.files);
52
-
53
- expect(result.files.map((file) => file.path)).not.toContain(
54
- 'infra/minikube/scripts/supabase-local-env.sh',
55
- );
56
- expect(serialized).not.toContain('supabase start');
57
- expect(serialized).not.toContain('supabase stop');
58
- expect(serialized).not.toContain('supabase status');
59
- expect(serialized).not.toContain('SUPABASE_PROJECT_DIR');
60
- expect(serialized).not.toContain('SUPABASE_LOCAL_PORT');
61
- expect(serialized).not.toContain('supabase_*_');
62
- expect(serialized).not.toContain('supabase-auth-secrets');
63
- });
64
-
65
- test('keeps Supabase migration history but executes against the Kubernetes DB URL', () => {
66
- const result = generateInfrastructure(createSupabaseManifest(), {
67
- appManifest: createAppManifest('scanner'),
68
- });
69
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
70
- const readme = getFile(result.files, 'infra/minikube/README.md');
71
-
72
- const migrationFunction = upScript.slice(
73
- upScript.indexOf('run_supabase_migrations()'),
74
- upScript.indexOf('reconcile_supabase_profile()'),
75
- );
76
-
77
- expect(migrationFunction).toContain(
78
- 'SUPABASE_TELEMETRY_DISABLED=1 supabase --yes migration up --db-url "${SUPABASE_DB_URL}"',
79
- );
80
- expect(migrationFunction).not.toContain('supabase migration up --db-url "${SUPABASE_DB_URL}"');
81
- expect(migrationFunction).toContain('echo "Applying pending Supabase migrations..."');
82
- expect(migrationFunction).toContain('echo "Supabase migrations applied."');
83
- expect(upScript).toContain('export SUPABASE_DB_URL PGSSLMODE=disable');
84
- expect(upScript).not.toContain('migration up --local');
85
- expect(upScript).toContain('cd "${ROOT_DIR}"');
86
- expect(migrationFunction).toContain('if [[ "${SUPABASE_RUNTIME_ENABLED}" != "true" ]]; then');
87
- expect(migrationFunction).toContain('if [[ -d "${ROOT_DIR}/supabase/migrations" ]]; then');
88
- expect(upScript).toContain('set_required_env_default POSTGRES_PASSWORD "$(random_hex 32)"');
89
- expect(upScript).not.toContain('set_env_default POSTGRES_PASSWORD "$(random_base64');
90
- expect(upScript).toContain(
91
- 'set_required_env_default SUPABASE_DB_URL "postgres://postgres:${POSTGRES_PASSWORD}@127.0.0.1:${SUPABASE_DB_FORWARD_LOCAL_PORT}/postgres?sslmode=disable"',
92
- );
93
- expect(upScript).toContain('bootstrap_supabase_database');
94
- expect(readme).toContain('Migration authoring/history remains Supabase');
95
- });
96
-
97
- test('preserves Supabase-disabled migration behavior', () => {
98
- const result = generateInfrastructure(
99
- {
100
- deployment: {
101
- target: 'minikube',
102
- monitoring: false,
103
- },
104
- modules: [],
105
- },
106
- {
107
- appManifest: createAppManifest('frontend-only'),
108
- },
109
- );
110
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
111
- const migrationFunction = upScript.slice(
112
- upScript.indexOf('run_supabase_migrations()'),
113
- upScript.indexOf('reconcile_supabase_profile()'),
114
- );
115
-
116
- expect(upScript).toContain('SUPABASE_RUNTIME_ENABLED="false"');
117
- expect(migrationFunction).toContain('if [[ "${SUPABASE_RUNTIME_ENABLED}" != "true" ]]; then');
118
- expect(migrationFunction).toContain('return 0');
119
- });
120
-
121
- test('lists and generates Supabase Kubernetes bootstrap and gateway contract files', () => {
122
- const result = generateInfrastructure(createSupabaseManifest(), {
123
- appManifest: createAppManifest('scanner'),
124
- });
125
- const paths = result.files.map((file) => file.path);
126
- const readme = getFile(result.files, 'infra/minikube/README.md');
127
- const kustomization = getFile(result.files, 'infra/minikube/k8s/kustomization.yaml');
128
- const bootstrap = getFile(result.files, 'infra/minikube/k8s/supabase/bootstrap.sql');
129
- const postgresInit = getFile(
130
- result.files,
131
- 'infra/minikube/k8s/supabase/postgres.init.configmap.yaml',
132
- );
133
- const postgres = getFile(result.files, 'infra/minikube/k8s/supabase/postgres.yaml');
134
- const auth = getFile(result.files, 'infra/minikube/k8s/supabase/auth.yaml');
135
- const envExample = getFile(result.files, 'infra/minikube/.env.example');
136
- const gatewayTemplate = getFile(
137
- result.files,
138
- 'infra/minikube/k8s/supabase/gateway.template.yml',
139
- );
140
- const gateway = getFile(result.files, 'infra/minikube/k8s/supabase/gateway.yaml');
141
- const storage = getFile(result.files, 'infra/minikube/k8s/supabase/storage.yaml');
142
- const kongEntrypoint = getFile(result.files, 'infra/minikube/k8s/supabase/kong-entrypoint.sh');
143
-
144
- expect(paths).toContain('infra/minikube/k8s/supabase/bootstrap.sql');
145
- expect(paths).toContain('infra/minikube/k8s/supabase/postgres.init.configmap.yaml');
146
- expect(paths).toContain('infra/minikube/k8s/supabase/gateway.template.yml');
147
- expect(paths).toContain('infra/minikube/k8s/supabase/kong-entrypoint.sh');
148
- expect(paths).not.toContain('infra/minikube/k8s/supabase/secrets.yaml');
149
- expect(readme).toContain('supabase/bootstrap.sql');
150
- expect(readme).toContain('supabase/postgres.init.configmap.yaml');
151
- expect(readme).toContain('supabase/gateway.template.yml');
152
- expect(readme).toContain('supabase/kong-entrypoint.sh');
153
- expect(kustomization).not.toContain('supabase/secrets.yaml');
154
- expect(kustomization).not.toContain('gateway.configmap.yaml');
155
- expect(kustomization).toContain('supabase/postgres.init.configmap.yaml');
156
- expect(bootstrap).toContain('CREATE SCHEMA IF NOT EXISTS auth');
157
- expect(bootstrap).toContain(
158
- 'GRANT anon, authenticated, service_role TO supabase_storage_admin',
159
- );
160
- expect(postgresInit).toContain('alter role postgres with superuser');
161
- expect(postgresInit).toContain('grant pg_read_server_files to supabase_admin');
162
- expect(postgresInit).toContain('grant execute on function pg_read_file(text) to public');
163
- expect(postgres).toContain('name: POSTGRES_USER');
164
- expect(postgres).toContain('value: postgres');
165
- expect(postgres).toContain('name: PGPORT');
166
- expect(postgres).toContain(
167
- 'mountPath: /docker-entrypoint-initdb.d/99-ankhorage-local-dev-extensions.sql',
168
- );
169
- expect(postgres).toContain('config_file=/etc/postgresql/postgresql.conf');
170
- expect(gatewayTemplate).toContain('keyauth_credentials');
171
- expect(gatewayTemplate).toContain('request-transformer');
172
- expect(gatewayTemplate).toContain('_format_version: "2.1"');
173
- expect(gatewayTemplate).toContain('username: "$DASHBOARD_USERNAME"');
174
- expect(gatewayTemplate).toContain('password: "$DASHBOARD_PASSWORD"');
175
- expect(kongEntrypoint).toContain('LUA_AUTH_EXPR');
176
- expect(auth).toContain('name: GOTRUE_JWT_EXP');
177
- expect(auth).toContain('key: JWT_EXPIRY');
178
- expect(auth).toContain(
179
- 'postgres://supabase_auth_admin:$(POSTGRES_PASSWORD)@postgres.supabase.svc.cluster.local:5432/postgres?search_path=auth&sslmode=disable',
180
- );
181
- expect(storage).toContain(
182
- 'postgres://supabase_storage_admin:$(POSTGRES_PASSWORD)@postgres.supabase.svc.cluster.local:5432/postgres?search_path=storage&sslmode=disable',
183
- );
184
- expect(envExample).toContain('PGRST_DB_SCHEMAS=public,storage,graphql_public');
185
- expect(auth).toContain('name: GOTRUE_EXTERNAL_EMAIL_ENABLED');
186
- expect(auth).toContain('key: ENABLE_EMAIL_SIGNUP');
187
- expect(auth).toContain('name: GOTRUE_SMTP_HOST');
188
- expect(auth).toContain('name: GOTRUE_SMTP_PORT');
189
- expect(auth).toContain('name: GOTRUE_SMTP_USER');
190
- expect(auth).toContain('name: GOTRUE_SMTP_PASS');
191
- expect(gatewayTemplate).toContain('name: realtime-v1-rest-openapi');
192
- expect(gatewayTemplate).toContain('paths: [/realtime/v1/api/openapi]');
193
- expect(gatewayTemplate).toContain('name: realtime-v1-rest-tenants');
194
- expect(gatewayTemplate).toContain('paths: [/realtime/v1/api/tenants]');
195
- expect(gatewayTemplate).toContain('name: request-termination');
196
- expect(gatewayTemplate).toContain('status_code: 403');
197
- expect(gateway).toContain('mountPath: /home/kong/temp.yml');
198
- expect(gateway).toContain('subPath: temp.yml');
199
- expect(gateway).toContain('mountPath: /home/kong/kong-entrypoint.sh');
200
- expect(gateway).toContain('command: ["kong", "health"]');
201
- });
202
-
203
- test('defines reset separately from down and destroy', () => {
204
- const result = generateInfrastructure(createSupabaseManifest(), {
205
- appManifest: createAppManifest('uwm'),
206
- });
207
- const resetScript = getFile(result.files, 'infra/minikube/scripts/reset.sh');
208
- const downScript = getFile(result.files, 'infra/minikube/scripts/down.sh');
209
-
210
- expect(resetScript).toContain('ANKH_RESET_CONFIRM');
211
- expect(resetScript).toContain('delete namespace app');
212
- expect(resetScript).toContain('delete namespace supabase');
213
- expect(resetScript).toContain('does not delete the Minikube profile');
214
- expect(downScript).toContain('minikube stop -p "${PROFILE}"');
215
- expect(downScript).not.toContain('delete namespace');
216
- });
217
-
218
- test('keeps reset scoped to app namespace when Supabase is not generated', () => {
219
- const result = generateInfrastructure(
220
- {
221
- deployment: {
222
- target: 'minikube',
223
- monitoring: false,
224
- },
225
- },
226
- {
227
- appManifest: createAppManifest('plain'),
228
- },
229
- );
230
- const paths = result.files.map((file) => file.path);
231
- const resetScript = getFile(result.files, 'infra/minikube/scripts/reset.sh');
232
- const statusScript = getFile(result.files, 'infra/minikube/scripts/status.sh');
233
-
234
- expect(paths).not.toContain('infra/minikube/k8s/namespaces/supabase.yaml');
235
- expect(resetScript).toContain('delete namespace app');
236
- expect(resetScript).not.toContain('delete namespace supabase');
237
- expect(resetScript).not.toContain('namespaces/supabase.yaml');
238
- expect(statusScript).toContain('for namespace in app; do');
239
- });
240
-
241
- test('places standalone provider workloads in provider-owned namespaces', () => {
242
- const result = generateInfrastructure(
243
- {
244
- ...createSupabaseManifest(),
245
- auth: {
246
- scope: 'global',
247
- provider: 'supabase',
248
- authorization: {
249
- engine: 'cerbos',
250
- kind: 'RBAC',
251
- },
252
- },
253
- },
254
- {
255
- appManifest: createAppManifest('authz-app'),
256
- },
257
- );
258
- const paths = result.files.map((file) => file.path);
259
- const kustomization = getFile(result.files, 'infra/minikube/k8s/kustomization.yaml');
260
- const readme = getFile(result.files, 'infra/minikube/README.md');
261
- const cerbosDeployment = getFile(
262
- result.files,
263
- 'infra/minikube/k8s/authz/cerbos/cerbos.deployment.yaml',
264
- );
265
- const envExample = getFile(result.files, 'infra/minikube/.env.example');
266
- const resetScript = getFile(result.files, 'infra/minikube/scripts/reset.sh');
267
- const statusScript = getFile(result.files, 'infra/minikube/scripts/status.sh');
268
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
269
-
270
- expect(paths).toContain('infra/minikube/k8s/namespaces/cerbos.yaml');
271
- expect(kustomization).toContain('namespaces/cerbos.yaml');
272
- expect(readme).toContain('- Provider namespaces: `cerbos`');
273
- expect(readme).toContain('## Provider Lifecycle Contributions');
274
- expect(readme).not.toContain('\n\n\n## Provider Lifecycle Contributions');
275
- expect(readme).toContain('`cerbos`: namespace `cerbos`');
276
- expect(readme).toContain('`deployment/cerbos` in namespace `cerbos`');
277
- expect(readme).toContain('`http` = `http://cerbos.cerbos.svc.cluster.local:3592`');
278
- expect(cerbosDeployment).toContain('namespace: cerbos');
279
- expect(cerbosDeployment).not.toContain('namespace: app');
280
- expect(envExample).toContain('CERBOS_URL=http://cerbos.cerbos.svc.cluster.local:3592');
281
- expect(resetScript).toContain('delete namespace cerbos');
282
- expect(upScript).toContain('wait_for_provider_readiness');
283
- expect(upScript).toContain('run_provider_migrations');
284
- expect(upScript).toContain('run_provider_reconciliation');
285
- expect(upScript).toContain('rollout status "deployment/cerbos" --timeout=180s');
286
- expect(upScript.indexOf('kubectl --context "${PROFILE}" apply -k "${K8S_DIR}"')).toBeLessThan(
287
- upScript.lastIndexOf('wait_for_provider_readiness'),
288
- );
289
- expect(statusScript).toContain('for namespace in app supabase cerbos; do');
290
- expect(statusScript).toContain(
291
- '- provider cerbos endpoint/http: http://cerbos.cerbos.svc.cluster.local:3592',
292
- );
293
- expect(statusScript).toContain('- provider cerbos/cerbos: ready');
294
- });
295
-
296
- test('uses generated Supabase runtime ownership as an immutable script decision', () => {
297
- const result = generateInfrastructure(createSupabaseManifest(), {
298
- appManifest: createAppManifest('scanner'),
299
- });
300
- const envExample = getFile(result.files, 'infra/minikube/.env.example');
301
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
302
-
303
- expect(envExample).not.toContain('SUPABASE_RUNTIME_ENABLED=');
304
- expect(upScript).toContain('SUPABASE_RUNTIME_ENABLED="true"');
305
- expect(upScript).not.toContain('SUPABASE_RUNTIME_ENABLED="${SUPABASE_RUNTIME_ENABLED');
306
- });
307
-
308
- test('wires configured OAuth providers into GoTrue runtime env without serializing secrets', () => {
309
- const result = generateInfrastructure(
310
- {
311
- ...createSupabaseManifest(),
312
- secretStore: {
313
- provider: 'supabase-vault',
314
- },
315
- auth: {
316
- scope: 'global',
317
- provider: 'supabase',
318
- oauth: {
319
- enabled: true,
320
- callbackRoute: '/auth/callback',
321
- providers: [
322
- {
323
- id: 'google',
324
- enabled: true,
325
- credentialsRef: 'auth/oauth/google',
326
- },
327
- ],
328
- },
329
- },
330
- },
331
- {
332
- appManifest: createAppManifest('oauth-app'),
333
- },
334
- );
335
- const envExample = getFile(result.files, 'infra/minikube/.env.example');
336
- const readme = getFile(result.files, 'infra/minikube/README.md');
337
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
338
-
339
- expect(envExample).toContain('# google: auth/oauth/google');
340
- expect(readme).not.toContain('credentialsRef` entries.\n\n\nPinned images:');
341
- expect(envExample).toContain('GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID=');
342
- expect(envExample).toContain('GOTRUE_EXTERNAL_GOOGLE_SECRET=');
343
- expect(upScript).toContain('GOTRUE_EXTERNAL_GOOGLE_ENABLED=true');
344
- expect(upScript).toContain(
345
- 'GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID=${GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID}',
346
- );
347
- expect(upScript).toContain('credentialsRef auth/oauth/google');
348
- expect(upScript).toContain("resolve_vault_secret_field 'auth/oauth/google' 'clientSecret'");
349
- expect(upScript).toContain(
350
- 'set_required_env_default ADDITIONAL_REDIRECT_URLS "$(derive_additional_redirect_urls)"',
351
- );
352
- expect(upScript).toContain('site_url_without_slash}/${callback_path}');
353
- expect(upScript).toContain('OAUTH_NATIVE_REDIRECT_URLS');
354
- expect(upScript).not.toContain('write_env_value GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID');
355
- expect(upScript).not.toContain('write_env_value GOTRUE_EXTERNAL_GOOGLE_SECRET');
356
- expect(upScript).not.toContain('sentinel-client-secret-value');
357
- });
358
-
359
- test('generates required secrets even when copied env example contains empty keys', () => {
360
- const result = generateInfrastructure(createSupabaseManifest(), {
361
- appManifest: createAppManifest('scanner'),
362
- });
363
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
364
-
365
- expect(upScript).toContain('load_env_file_preserving_process_env');
366
- expect(upScript).toContain('APP_IMAGE="${APP_IMAGE:-}"');
367
- expect(upScript).toContain(
368
- 'load_env_file_preserving_process_env\nSUPABASE_RUNTIME_ENABLED="true"',
369
- );
370
- expect(upScript.indexOf('load_env_file_preserving_process_env')).toBeLessThan(
371
- upScript.lastIndexOf('APP_IMAGE="${APP_IMAGE:-ankh/scanner:dev}"'),
372
- );
373
- expect(upScript).toContain('set_required_env_default POSTGRES_PASSWORD "$(random_hex 32)"');
374
- expect(upScript).toContain('write_env_value "${key}" "${value}"');
375
- expect(upScript).toContain('set_optional_env_default SMTP_USER ""');
376
- });
377
-
378
- test('syncs browser-safe Supabase env into the generated app env.local before build', () => {
379
- const result = generateInfrastructure(createSupabaseManifest(), {
380
- appManifest: createAppManifest('books'),
381
- });
382
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
383
- const buildScript = getFile(result.files, 'infra/minikube/scripts/build-app-image.sh');
384
- const readme = getFile(result.files, 'infra/minikube/README.md');
385
-
386
- expect(upScript).toContain('sync_app_public_supabase_env()');
387
- expect(upScript).toContain('local app_env_file="${APP_SOURCE_DIR}/.env.local"');
388
- expect(upScript).toContain(
389
- 'write_key_value_file_value "${app_env_file}" "EXPO_PUBLIC_SUPABASE_URL" "${EXPO_PUBLIC_SUPABASE_URL}"',
390
- );
391
- expect(upScript).toContain(
392
- 'write_key_value_file_value "${app_env_file}" "EXPO_PUBLIC_SUPABASE_ANON_KEY" "${EXPO_PUBLIC_SUPABASE_ANON_KEY}"',
393
- );
394
- expect(upScript).toContain('ensure_supabase_runtime_env\nsync_app_public_supabase_env');
395
- expect(upScript.lastIndexOf('sync_app_public_supabase_env')).toBeLessThan(
396
- upScript.indexOf(
397
- 'if [[ "${APP_RUNTIME_ENABLED}" == "true" && "${APP_BUILD_ENABLED}" == "true" ]]',
398
- ),
399
- );
400
- expect(upScript).not.toContain('SUPABASE_SERVICE_ROLE_KEY" "${SUPABASE_SERVICE_ROLE_KEY}"');
401
- expect(buildScript).toContain('EXPO_CLI="${APP_SOURCE_DIR}/node_modules/.bin/expo"');
402
- expect(buildScript).toContain(
403
- '"${EXPO_CLI}" export --platform web --clear --output-dir "${APP_WEB_EXPORT_DIR}"',
404
- );
405
- expect(buildScript).not.toContain('bunx');
406
- expect(readme).toContain(
407
- '`build-app-image.sh` requires the app-installed `node_modules/.bin/expo` and never resolves',
408
- );
409
- expect(readme).toContain('Expo globally or through the network.');
410
- expect(readme).toContain('It clears the Expo/Metro bundler cache before every web');
411
- });
412
-
413
- test('starts Supabase schema owners before app migrations and profile reconciliation', () => {
414
- const result = generateInfrastructure(createSupabaseManifest(), {
415
- appManifest: createAppManifest('scanner'),
416
- });
417
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
418
-
419
- expect(upScript).toContain('apply_supabase_runtime_workloads');
420
- expect(upScript).toContain('exec deployment/postgres -- psql -U postgres');
421
- expect(upScript).toContain('create schema if not exists vault');
422
- expect(upScript).toContain('grant execute on function pg_read_file(text) to public');
423
- expect(upScript.indexOf('postgres.init.configmap.yaml')).toBeLessThan(
424
- upScript.indexOf('postgres.pvc.yaml'),
425
- );
426
- expect(upScript.lastIndexOf(' wait_for_supabase_database')).toBeLessThan(
427
- upScript.lastIndexOf(' bootstrap_supabase_database'),
428
- );
429
- expect(upScript).toContain('rollout status deployment/postgres --timeout=900s');
430
- expect(upScript).toContain('rollout status deployment/gateway --timeout=600s');
431
- const runMigrationsCallIndex = upScript.lastIndexOf(' run_supabase_migrations');
432
- const reconcileProfileCallIndex = upScript.lastIndexOf(' reconcile_supabase_profile');
433
- const appRuntimeApplyIndex = upScript.lastIndexOf(
434
- 'kubectl --context "${PROFILE}" apply -k "${K8S_DIR}"',
435
- );
436
-
437
- expect(upScript.lastIndexOf(' apply_supabase_runtime_workloads')).toBeLessThan(
438
- upScript.indexOf('rollout status deployment/auth'),
439
- );
440
- expect(upScript.indexOf('rollout status deployment/auth')).toBeLessThan(runMigrationsCallIndex);
441
- expect(upScript.indexOf('rollout status deployment/storage')).toBeLessThan(
442
- runMigrationsCallIndex,
443
- );
444
- expect(upScript.indexOf(' reconcile_supabase_profile')).toBeLessThan(
445
- upScript.indexOf(' reload_postgrest_schema'),
446
- );
447
- expect(upScript.indexOf('rollout status deployment/studio')).toBeLessThan(
448
- upScript.indexOf('"${PORT_FORWARD_SCRIPT}" start studio'),
449
- );
450
- expect(runMigrationsCallIndex).toBeLessThan(reconcileProfileCallIndex);
451
- expect(reconcileProfileCallIndex).toBeLessThan(appRuntimeApplyIndex);
452
- });
453
-
454
- test('treats port-forwards as slug-owned lifecycle resources', () => {
455
- const result = generateInfrastructure(createSupabaseManifest(), {
456
- appManifest: createAppManifest('uwm'),
457
- });
458
- const portForwardScript = getFile(result.files, 'infra/minikube/scripts/port-forward.sh');
459
- const statusScript = getFile(result.files, 'infra/minikube/scripts/status.sh');
460
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
461
- const downScript = getFile(result.files, 'infra/minikube/scripts/down.sh');
462
-
463
- expect(portForwardScript).toContain('service/app-runtime');
464
- expect(portForwardScript).toContain('service/gateway');
465
- expect(portForwardScript).toContain('service/studio');
466
- expect(portForwardScript).toContain('service/postgres');
467
- expect(portForwardScript).toContain('RUNTIME_FORWARD_NAMES=(app supabase-gateway)');
468
- expect(portForwardScript).toContain(
469
- 'ALL_FORWARD_NAMES=(app supabase-gateway studio db-migration)',
470
- );
471
- expect(portForwardScript).toContain(
472
- 'start:runtime) for_each_forward start app supabase-gateway',
473
- );
474
- expect(portForwardScript).toContain('for_each_forward stop app supabase-gateway');
475
- expect(portForwardScript).toContain(
476
- 'status:runtime) for_each_forward status app supabase-gateway',
477
- );
478
- expect(portForwardScript).toContain('${PROFILE}-${1}.pid');
479
- expect(portForwardScript).toContain('crashed stale_pid');
480
- expect(portForwardScript).toContain('is_port_accepting()');
481
- expect(portForwardScript).toContain('recent kubectl port-forward log');
482
- expect(portForwardScript).toContain('did not become ready on local port');
483
- expect(portForwardScript).toContain('not ready pid=');
484
- expect(portForwardScript).toContain('terminate_forward_process()');
485
- expect(portForwardScript).toContain('ps -p "${pid}" -o command=');
486
- expect(portForwardScript).toContain('ps -p "${pid}" -o comm=');
487
- expect(portForwardScript).toContain('is_owned_forward_process()');
488
- expect(portForwardScript).toContain(
489
- '*"kubectl --context ${PROFILE} -n ${namespace} port-forward ${resource} ${local_port}:${remote_port}"*',
490
- );
491
- expect(portForwardScript).toContain('kill -KILL "${pid}"');
492
- expect(portForwardScript).toContain('failed to stop owned port-forward pid');
493
- expect(portForwardScript).toContain('local port ${local_port} is still accepting connections');
494
- expect(portForwardScript).toContain('refusing to terminate non-owned live pid');
495
- expect(portForwardScript).toContain(
496
- 'stale pid file pointed at non-owned live pid ${pid}; removing ownership record ${pid_file}',
497
- );
498
- expect(portForwardScript).toContain(
499
- 'port occupied by non-owned process on local port ${local_port}',
500
- );
501
- expect(portForwardScript).toContain('stale_pid_non_owned=${pid}');
502
- expect(statusScript).toContain('port-forward.sh" status all');
503
- expect(upScript).toContain('set -Eeuo pipefail');
504
- expect(upScript).toContain('trap cleanup_failed_up ERR');
505
- expect(upScript).toContain('start supabase-gateway');
506
- expect(upScript).toContain('start db-migration');
507
- expect(upScript).toContain('Failed to start db-migration port-forward for Supabase bootstrap.');
508
- expect(upScript.indexOf('trap cleanup_failed_up ERR')).toBeLessThan(
509
- upScript.indexOf('require_command minikube'),
510
- );
511
- expect(upScript).toContain('trap - ERR');
512
- expect(downScript).toContain('port-forward.sh" stop all');
513
- });
514
-
515
- test('generates an app-only runtime forward group without Supabase', () => {
516
- const result = generateInfrastructure(
517
- {
518
- deployment: {
519
- target: 'minikube',
520
- monitoring: false,
521
- },
522
- modules: [],
523
- },
524
- {
525
- appManifest: createAppManifest('frontend-only'),
526
- },
527
- );
528
- const portForwardScript = getFile(result.files, 'infra/minikube/scripts/port-forward.sh');
529
-
530
- expect(portForwardScript).toContain('RUNTIME_FORWARD_NAMES=(app)');
531
- expect(portForwardScript).toContain('ALL_FORWARD_NAMES=(app)');
532
- expect(portForwardScript).toContain(
533
- 'OBSOLETE_FORWARD_NAMES=(supabase-gateway studio db-migration)',
534
- );
535
- expect(portForwardScript).not.toContain('RUNTIME_FORWARD_NAMES=(app supabase-gateway)');
536
- });
537
-
538
- test('reconciles a generated Web topology to the exact native-only desired topology', () => {
539
- const baseManifest = createAppManifest('topology-upgrade');
540
- const webResult = generateInfrastructure(createSupabaseManifest(), {
541
- appManifest: {
542
- ...baseManifest,
543
- deploy: { targets: { web: { enabled: true } } },
544
- },
545
- });
546
- const nativeResult = generateInfrastructure(createSupabaseManifest(), {
547
- appManifest: {
548
- ...baseManifest,
549
- deploy: {
550
- targets: {
551
- android: { enabled: true, package: 'com.ankh.topologyupgrade' },
552
- },
553
- },
554
- },
555
- });
556
- const webPaths = webResult.files.map((file) => file.path);
557
- const nativePaths = nativeResult.files.map((file) => file.path);
558
- const webAppConfig = getFile(webResult.files, 'infra/minikube/k8s/app.configmap.yaml');
559
- const webUpScript = getFile(webResult.files, 'infra/minikube/scripts/up.sh');
560
- const nativeUpScript = getFile(nativeResult.files, 'infra/minikube/scripts/up.sh');
561
- const nativePortForwardScript = getFile(
562
- nativeResult.files,
563
- 'infra/minikube/scripts/port-forward.sh',
564
- );
565
- const exactDelete =
566
- 'delete deployment/app-runtime service/app-runtime configmap/app-infra-config --ignore-not-found';
567
-
568
- expect(webPaths).toContain('infra/minikube/k8s/app/deployment.yaml');
569
- expect(webPaths).toContain('infra/minikube/k8s/app/service.yaml');
570
- expect(webPaths).toContain('infra/minikube/k8s/app.configmap.yaml');
571
- expect(webAppConfig).toContain('name: app-infra-config');
572
- expect(getFile(webResult.files, 'infra/minikube/scripts/port-forward.sh')).toContain(
573
- 'RUNTIME_FORWARD_NAMES=(app supabase-gateway)',
574
- );
575
-
576
- expect(nativePaths).not.toContain('infra/minikube/k8s/app/deployment.yaml');
577
- expect(nativePaths).not.toContain('infra/minikube/k8s/app/service.yaml');
578
- expect(nativePaths).not.toContain('infra/minikube/k8s/app.configmap.yaml');
579
- expect(nativeUpScript).toContain(exactDelete);
580
- expect(nativeUpScript).toContain('"${PORT_FORWARD_SCRIPT}" stop obsolete');
581
- expect(nativeUpScript.indexOf(exactDelete)).toBeLessThan(
582
- nativeUpScript.indexOf('"${PORT_FORWARD_SCRIPT}" stop obsolete'),
583
- );
584
- expect(nativePortForwardScript).toContain(
585
- 'MANAGED_FORWARD_NAMES=(app supabase-gateway studio db-migration)',
586
- );
587
- expect(nativePortForwardScript).toContain('OBSOLETE_FORWARD_NAMES=(app)');
588
- expect(webUpScript).not.toContain(exactDelete);
589
- expect(webUpScript).not.toContain('stop obsolete');
590
- });
591
-
592
- test('derives native-only runtime topology without a fictional Kubernetes app service', () => {
593
- const appManifest = {
594
- ...createAppManifest('native-only'),
595
- deploy: {
596
- targets: {
597
- android: { enabled: true, package: 'com.ankh.nativeonly' },
598
- ios: { enabled: true, bundleIdentifier: 'com.ankh.nativeonly' },
599
- },
600
- },
601
- };
602
- const result = generateInfrastructure(createSupabaseManifest(), { appManifest });
603
- const paths = result.files.map((file) => file.path);
604
- const kustomization = getFile(result.files, 'infra/minikube/k8s/kustomization.yaml');
605
- const portForwardScript = getFile(result.files, 'infra/minikube/scripts/port-forward.sh');
606
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
607
- const readme = getFile(result.files, 'infra/minikube/README.md');
608
-
609
- expect(paths).not.toContain('infra/minikube/k8s/app/deployment.yaml');
610
- expect(paths).not.toContain('infra/minikube/k8s/app/service.yaml');
611
- expect(paths).not.toContain('infra/minikube/k8s/app.configmap.yaml');
612
- expect(kustomization).not.toContain('app/deployment.yaml');
613
- expect(kustomization).not.toContain('app/service.yaml');
614
- expect(portForwardScript).toContain('RUNTIME_FORWARD_NAMES=(supabase-gateway)');
615
- expect(portForwardScript).toContain('ALL_FORWARD_NAMES=(supabase-gateway studio db-migration)');
616
- expect(portForwardScript).toContain(
617
- 'MANAGED_FORWARD_NAMES=(app supabase-gateway studio db-migration)',
618
- );
619
- expect(portForwardScript).toContain('OBSOLETE_FORWARD_NAMES=(app)');
620
- expect(portForwardScript).toContain('${name}: skipped (Web app runtime disabled)');
621
- expect(upScript).toContain('APP_RUNTIME_ENABLED="false"');
622
- expect(upScript).toContain(
623
- 'delete deployment/app-runtime service/app-runtime configmap/app-infra-config --ignore-not-found',
624
- );
625
- expect(readme).toContain('disabled (no enabled Web deploy target)');
626
- expect(JSON.stringify(result.files)).not.toContain('adb');
627
- expect(JSON.stringify(result.files)).not.toContain('10.0.2.2');
628
- });
629
-
630
- test('keeps legacy manifests without deploy targets on the Web app runtime topology', () => {
631
- const result = generateInfrastructure(createSupabaseManifest(), {
632
- appManifest: createAppManifest('legacy-web'),
633
- });
634
- const paths = result.files.map((file) => file.path);
635
- const portForwardScript = getFile(result.files, 'infra/minikube/scripts/port-forward.sh');
636
- const upScript = getFile(result.files, 'infra/minikube/scripts/up.sh');
637
-
638
- expect(paths).toContain('infra/minikube/k8s/app/service.yaml');
639
- expect(portForwardScript).toContain('RUNTIME_FORWARD_NAMES=(app supabase-gateway)');
640
- expect(portForwardScript).toContain('OBSOLETE_FORWARD_NAMES=()');
641
- expect(upScript).not.toContain('delete deployment/app-runtime');
642
- });
643
-
644
- test('generates an empty provider-agnostic runtime group when no host target exists', () => {
645
- const appManifest = {
646
- ...createAppManifest('native-no-provider'),
647
- deploy: {
648
- targets: {
649
- android: { enabled: true, package: 'com.ankh.nativeproviderless' },
650
- },
651
- },
652
- };
653
- const result = generateInfrastructure(
654
- { deployment: { target: 'minikube', monitoring: false }, modules: [] },
655
- { appManifest },
656
- );
657
- const portForwardScript = getFile(result.files, 'infra/minikube/scripts/port-forward.sh');
658
-
659
- expect(portForwardScript).toContain('RUNTIME_FORWARD_NAMES=()');
660
- expect(portForwardScript).toContain('ALL_FORWARD_NAMES=()');
661
- expect(portForwardScript).toContain(
662
- 'OBSOLETE_FORWARD_NAMES=(app supabase-gateway studio db-migration)',
663
- );
664
- });
665
- });
666
-
667
- function createSupabaseManifest(): InfraManifestInput {
668
- return {
669
- deployment: {
670
- target: 'minikube',
671
- monitoring: false,
672
- },
673
- auth: {
674
- scope: 'global',
675
- provider: 'supabase',
676
- },
677
- database: {
678
- provider: 'supabase',
679
- tier: 'dev',
680
- },
681
- storage: {
682
- provider: 'supabase',
683
- buckets: ['assets'],
684
- },
685
- modules: [],
686
- };
687
- }
688
-
689
- function getFile(files: readonly { path: string; content: string }[], path: string): string {
690
- const file = files.find((candidate) => candidate.path === path);
691
- if (!file) throw new Error(`Missing generated file: ${path}`);
692
- return file.content;
693
- }