@intentius/chant-lexicon-terraform 0.124.52 → 0.124.55

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 (641) hide show
  1. package/README.md +14 -10
  2. package/dist/__fixtures__/pr-loop/estate.component.d.ts +7 -0
  3. package/dist/__fixtures__/pr-loop/estate.component.d.ts.map +1 -0
  4. package/dist/__fixtures__/pr-loop/estate.component.js +7 -0
  5. package/dist/__fixtures__/report/generate.d.ts +26 -0
  6. package/dist/__fixtures__/report/generate.d.ts.map +1 -0
  7. package/dist/__fixtures__/report/generate.js +58 -0
  8. package/dist/applied-state.d.ts +27 -0
  9. package/dist/applied-state.d.ts.map +1 -0
  10. package/dist/applied-state.js +44 -0
  11. package/dist/backend-config.d.ts +53 -0
  12. package/dist/backend-config.d.ts.map +1 -0
  13. package/dist/backend-config.js +136 -0
  14. package/dist/behaviour/kinds.d.ts.map +1 -1
  15. package/dist/behaviour/kinds.js +4 -0
  16. package/dist/behaviour/predict.d.ts.map +1 -1
  17. package/dist/behaviour/predict.js +6 -2
  18. package/dist/behaviour/reference-catalog.d.ts +16 -5
  19. package/dist/behaviour/reference-catalog.d.ts.map +1 -1
  20. package/dist/behaviour/reference-catalog.js +16 -5
  21. package/dist/behaviour/request.d.ts.map +1 -1
  22. package/dist/behaviour/request.js +3 -2
  23. package/dist/changed-roots.d.ts +6 -4
  24. package/dist/changed-roots.d.ts.map +1 -1
  25. package/dist/changed-roots.js +14 -18
  26. package/dist/ci-setup.d.ts +11 -0
  27. package/dist/ci-setup.d.ts.map +1 -0
  28. package/dist/ci-setup.js +41 -0
  29. package/dist/commands.d.ts.map +1 -1
  30. package/dist/commands.js +4 -3
  31. package/dist/components/capability-plugin.d.ts +105 -9
  32. package/dist/components/capability-plugin.d.ts.map +1 -1
  33. package/dist/components/capability-plugin.js +357 -36
  34. package/dist/components/compose-group.d.ts +145 -0
  35. package/dist/components/compose-group.d.ts.map +1 -0
  36. package/dist/components/compose-group.js +407 -0
  37. package/dist/components/placeholder-preview.d.ts +78 -0
  38. package/dist/components/placeholder-preview.d.ts.map +1 -0
  39. package/dist/components/placeholder-preview.js +254 -0
  40. package/dist/components/release-inputs.d.ts +29 -0
  41. package/dist/components/release-inputs.d.ts.map +1 -0
  42. package/dist/components/release-inputs.js +57 -0
  43. package/dist/components/trace-facts.d.ts +16 -0
  44. package/dist/components/trace-facts.d.ts.map +1 -0
  45. package/dist/components/trace-facts.js +19 -0
  46. package/dist/compose/apply-events.d.ts +46 -0
  47. package/dist/compose/apply-events.d.ts.map +1 -0
  48. package/dist/compose/apply-events.js +77 -0
  49. package/dist/compose/estate.d.ts +194 -0
  50. package/dist/compose/estate.d.ts.map +1 -0
  51. package/dist/compose/estate.js +363 -0
  52. package/dist/compose/hcl.d.ts +99 -0
  53. package/dist/compose/hcl.d.ts.map +1 -0
  54. package/dist/compose/hcl.js +302 -0
  55. package/dist/compose/module-address.d.ts +24 -0
  56. package/dist/compose/module-address.d.ts.map +1 -0
  57. package/dist/compose/module-address.js +43 -0
  58. package/dist/compose/root.d.ts +127 -0
  59. package/dist/compose/root.d.ts.map +1 -0
  60. package/dist/compose/root.js +586 -0
  61. package/dist/compose/run.d.ts +183 -0
  62. package/dist/compose/run.d.ts.map +1 -0
  63. package/dist/compose/run.js +447 -0
  64. package/dist/compose/slice.d.ts +102 -0
  65. package/dist/compose/slice.d.ts.map +1 -0
  66. package/dist/compose/slice.js +249 -0
  67. package/dist/compose/state-address.d.ts +28 -0
  68. package/dist/compose/state-address.d.ts.map +1 -0
  69. package/dist/compose/state-address.js +154 -0
  70. package/dist/compose/state-merge.d.ts +52 -0
  71. package/dist/compose/state-merge.d.ts.map +1 -0
  72. package/dist/compose/state-merge.js +135 -0
  73. package/dist/compose.d.ts +179 -0
  74. package/dist/compose.d.ts.map +1 -0
  75. package/dist/compose.js +482 -0
  76. package/dist/composites/terraform-apply-op.d.ts.map +1 -1
  77. package/dist/composites/terraform-apply-op.js +7 -3
  78. package/dist/cone.d.ts +53 -0
  79. package/dist/cone.d.ts.map +1 -0
  80. package/dist/cone.js +119 -0
  81. package/dist/config.d.ts +59 -13
  82. package/dist/config.d.ts.map +1 -1
  83. package/dist/config.js +43 -9
  84. package/dist/cost-hold.d.ts +27 -0
  85. package/dist/cost-hold.d.ts.map +1 -0
  86. package/dist/cost-hold.js +21 -0
  87. package/dist/describe-resources.d.ts +74 -12
  88. package/dist/describe-resources.d.ts.map +1 -1
  89. package/dist/describe-resources.js +374 -66
  90. package/dist/drift-read.d.ts +33 -0
  91. package/dist/drift-read.d.ts.map +1 -0
  92. package/dist/drift-read.js +243 -0
  93. package/dist/drift-record.d.ts +147 -0
  94. package/dist/drift-record.d.ts.map +1 -0
  95. package/dist/drift-record.js +383 -0
  96. package/dist/drift-rows.d.ts +61 -0
  97. package/dist/drift-rows.d.ts.map +1 -0
  98. package/dist/drift-rows.js +108 -0
  99. package/dist/exit-codes.d.ts +55 -0
  100. package/dist/exit-codes.d.ts.map +1 -0
  101. package/dist/exit-codes.js +48 -0
  102. package/dist/hcl/edges.d.ts.map +1 -1
  103. package/dist/hcl/edges.js +24 -1
  104. package/dist/hcl/files.d.ts +61 -0
  105. package/dist/hcl/files.d.ts.map +1 -0
  106. package/dist/hcl/files.js +221 -0
  107. package/dist/hcl/instances.d.ts +82 -0
  108. package/dist/hcl/instances.d.ts.map +1 -0
  109. package/dist/hcl/instances.js +390 -0
  110. package/dist/hcl/parse.d.ts +81 -9
  111. package/dist/hcl/parse.d.ts.map +1 -1
  112. package/dist/hcl/parse.js +114 -16
  113. package/dist/hcl/roots.d.ts.map +1 -1
  114. package/dist/hcl/roots.js +5 -0
  115. package/dist/hcl/suppressions.d.ts.map +1 -1
  116. package/dist/hcl/suppressions.js +8 -2
  117. package/dist/index.d.ts +13 -2
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +24 -2
  120. package/dist/integrity.json +8 -5
  121. package/dist/lint/audit-catalog.d.ts.map +1 -1
  122. package/dist/lint/audit-catalog.js +27 -3
  123. package/dist/lint/audit-lineage.d.ts +14 -2
  124. package/dist/lint/audit-lineage.d.ts.map +1 -1
  125. package/dist/lint/post-synth/index.d.ts.map +1 -1
  126. package/dist/lint/post-synth/index.js +4 -0
  127. package/dist/lint/post-synth/record-store.d.ts +54 -0
  128. package/dist/lint/post-synth/record-store.d.ts.map +1 -0
  129. package/dist/lint/post-synth/record-store.js +104 -0
  130. package/dist/lint/post-synth/tf001.d.ts +2 -2
  131. package/dist/lint/post-synth/tf001.js +2 -2
  132. package/dist/lint/post-synth/tf024.d.ts +35 -11
  133. package/dist/lint/post-synth/tf024.d.ts.map +1 -1
  134. package/dist/lint/post-synth/tf024.js +92 -20
  135. package/dist/lint/post-synth/tf046.d.ts +64 -0
  136. package/dist/lint/post-synth/tf046.d.ts.map +1 -0
  137. package/dist/lint/post-synth/tf046.js +175 -0
  138. package/dist/lint/post-synth/tf047.d.ts +36 -0
  139. package/dist/lint/post-synth/tf047.d.ts.map +1 -0
  140. package/dist/lint/post-synth/tf047.js +94 -0
  141. package/dist/live-plan-reasons.d.ts +21 -0
  142. package/dist/live-plan-reasons.d.ts.map +1 -0
  143. package/dist/live-plan-reasons.js +47 -0
  144. package/dist/lock-rows.d.ts +36 -0
  145. package/dist/lock-rows.d.ts.map +1 -0
  146. package/dist/lock-rows.js +60 -0
  147. package/dist/lock-timeout.d.ts +22 -0
  148. package/dist/lock-timeout.d.ts.map +1 -0
  149. package/dist/lock-timeout.js +32 -0
  150. package/dist/lsp/option-keys.d.ts.map +1 -1
  151. package/dist/lsp/option-keys.js +2 -0
  152. package/dist/manifest.json +1 -1
  153. package/dist/module-catalog/index.d.ts +69 -0
  154. package/dist/module-catalog/index.d.ts.map +1 -0
  155. package/dist/module-catalog/index.js +110 -0
  156. package/dist/module-catalog/refresh-cli.d.ts +4 -0
  157. package/dist/module-catalog/refresh-cli.d.ts.map +1 -0
  158. package/dist/module-catalog/refresh-cli.js +64 -0
  159. package/dist/module-catalog/static-tier.d.ts +6 -0
  160. package/dist/module-catalog/static-tier.d.ts.map +1 -0
  161. package/dist/module-catalog/static-tier.js +1650 -0
  162. package/dist/module-catalog/types.d.ts +65 -0
  163. package/dist/module-catalog/types.d.ts.map +1 -0
  164. package/dist/module-catalog/types.js +33 -0
  165. package/dist/okf/index.md +3 -1
  166. package/dist/okf/rules/TF024.md +2 -2
  167. package/dist/okf/rules/TF046.md +11 -0
  168. package/dist/okf/rules/TF047.md +11 -0
  169. package/dist/op/activities/index.d.ts +6 -2
  170. package/dist/op/activities/index.d.ts.map +1 -1
  171. package/dist/op/activities/index.js +5 -1
  172. package/dist/op/activities/live-detect.d.ts +4 -3
  173. package/dist/op/activities/live-detect.d.ts.map +1 -1
  174. package/dist/op/activities/live-detect.js +57 -32
  175. package/dist/op/activities/pin-rollout.d.ts +2 -0
  176. package/dist/op/activities/pin-rollout.d.ts.map +1 -1
  177. package/dist/op/activities/pin-rollout.js +1 -0
  178. package/dist/op/activities/terraform.d.ts +182 -5
  179. package/dist/op/activities/terraform.d.ts.map +1 -1
  180. package/dist/op/activities/terraform.js +224 -24
  181. package/dist/op/activity-contracts.d.ts +27 -0
  182. package/dist/op/activity-contracts.d.ts.map +1 -1
  183. package/dist/op/activity-contracts.js +19 -1
  184. package/dist/op/builders.d.ts +7 -1
  185. package/dist/op/builders.d.ts.map +1 -1
  186. package/dist/op/builders.js +9 -0
  187. package/dist/pin/consumers.d.ts +35 -0
  188. package/dist/pin/consumers.d.ts.map +1 -0
  189. package/dist/pin/consumers.js +70 -0
  190. package/dist/pin/edit.d.ts.map +1 -1
  191. package/dist/pin/edit.js +35 -0
  192. package/dist/pin/rollout.d.ts +2 -0
  193. package/dist/pin/rollout.d.ts.map +1 -1
  194. package/dist/pin/rollout.js +14 -11
  195. package/dist/plan-shape.d.ts +30 -0
  196. package/dist/plan-shape.d.ts.map +1 -0
  197. package/dist/plan-shape.js +125 -0
  198. package/dist/plugin.d.ts.map +1 -1
  199. package/dist/plugin.js +37 -18
  200. package/dist/registry/address.d.ts +63 -0
  201. package/dist/registry/address.d.ts.map +1 -0
  202. package/dist/registry/address.js +65 -0
  203. package/dist/registry/catalog-read.d.ts +14 -0
  204. package/dist/registry/catalog-read.d.ts.map +1 -0
  205. package/dist/registry/catalog-read.js +58 -0
  206. package/dist/registry/deprecated.d.ts +37 -0
  207. package/dist/registry/deprecated.d.ts.map +1 -0
  208. package/dist/registry/deprecated.js +43 -0
  209. package/dist/registry/docs.d.ts +96 -0
  210. package/dist/registry/docs.d.ts.map +1 -0
  211. package/dist/registry/docs.js +210 -0
  212. package/dist/registry/edge/edge.d.ts +46 -0
  213. package/dist/registry/edge/edge.d.ts.map +1 -0
  214. package/dist/registry/edge/edge.js +194 -0
  215. package/dist/registry/edge/index.d.ts +11 -0
  216. package/dist/registry/edge/index.d.ts.map +1 -0
  217. package/dist/registry/edge/index.js +10 -0
  218. package/dist/registry/edge/lambda-edge.d.ts +76 -0
  219. package/dist/registry/edge/lambda-edge.d.ts.map +1 -0
  220. package/dist/registry/edge/lambda-edge.js +95 -0
  221. package/dist/registry/edge/sigv4-web.d.ts +33 -0
  222. package/dist/registry/edge/sigv4-web.d.ts.map +1 -0
  223. package/dist/registry/edge/sigv4-web.js +56 -0
  224. package/dist/registry/edge/token-source.d.ts +73 -0
  225. package/dist/registry/edge/token-source.d.ts.map +1 -0
  226. package/dist/registry/edge/token-source.js +115 -0
  227. package/dist/registry/edge/worker.d.ts +45 -0
  228. package/dist/registry/edge/worker.d.ts.map +1 -0
  229. package/dist/registry/edge/worker.js +26 -0
  230. package/dist/registry/handler.d.ts +25 -0
  231. package/dist/registry/handler.d.ts.map +1 -0
  232. package/dist/registry/handler.js +75 -0
  233. package/dist/registry/headers-file.d.ts +21 -0
  234. package/dist/registry/headers-file.d.ts.map +1 -0
  235. package/dist/registry/headers-file.js +57 -0
  236. package/dist/registry/index.d.ts +31 -0
  237. package/dist/registry/index.d.ts.map +1 -0
  238. package/dist/registry/index.js +30 -0
  239. package/dist/registry/mirror-paths.d.ts +9 -0
  240. package/dist/registry/mirror-paths.d.ts.map +1 -0
  241. package/dist/registry/mirror-paths.js +8 -0
  242. package/dist/registry/mirror.d.ts +130 -0
  243. package/dist/registry/mirror.d.ts.map +1 -0
  244. package/dist/registry/mirror.js +319 -0
  245. package/dist/registry/proxies.d.ts +73 -0
  246. package/dist/registry/proxies.d.ts.map +1 -0
  247. package/dist/registry/proxies.js +111 -0
  248. package/dist/registry/reader.d.ts +57 -0
  249. package/dist/registry/reader.d.ts.map +1 -0
  250. package/dist/registry/reader.js +198 -0
  251. package/dist/registry/semver.d.ts +16 -0
  252. package/dist/registry/semver.d.ts.map +1 -0
  253. package/dist/registry/semver.js +24 -0
  254. package/dist/registry/serve.d.ts +24 -0
  255. package/dist/registry/serve.d.ts.map +1 -0
  256. package/dist/registry/serve.js +64 -0
  257. package/dist/registry/source-forms.d.ts +79 -0
  258. package/dist/registry/source-forms.d.ts.map +1 -0
  259. package/dist/registry/source-forms.js +202 -0
  260. package/dist/registry/targets/artifactory.d.ts +28 -0
  261. package/dist/registry/targets/artifactory.d.ts.map +1 -0
  262. package/dist/registry/targets/artifactory.js +206 -0
  263. package/dist/registry/targets/fake-artifactory.d.ts +30 -0
  264. package/dist/registry/targets/fake-artifactory.d.ts.map +1 -0
  265. package/dist/registry/targets/fake-artifactory.js +142 -0
  266. package/dist/registry/targets/fake-gitlab.d.ts +39 -0
  267. package/dist/registry/targets/fake-gitlab.d.ts.map +1 -0
  268. package/dist/registry/targets/fake-gitlab.js +136 -0
  269. package/dist/registry/targets/fake-hcp.d.ts +50 -0
  270. package/dist/registry/targets/fake-hcp.d.ts.map +1 -0
  271. package/dist/registry/targets/fake-hcp.js +202 -0
  272. package/dist/registry/targets/fake-http.d.ts +31 -0
  273. package/dist/registry/targets/fake-http.d.ts.map +1 -0
  274. package/dist/registry/targets/fake-http.js +87 -0
  275. package/dist/registry/targets/fake-nexus.d.ts +27 -0
  276. package/dist/registry/targets/fake-nexus.d.ts.map +1 -0
  277. package/dist/registry/targets/fake-nexus.js +137 -0
  278. package/dist/registry/targets/gitlab.d.ts +53 -0
  279. package/dist/registry/targets/gitlab.d.ts.map +1 -0
  280. package/dist/registry/targets/gitlab.js +187 -0
  281. package/dist/registry/targets/hcp.d.ts +29 -0
  282. package/dist/registry/targets/hcp.d.ts.map +1 -0
  283. package/dist/registry/targets/hcp.js +310 -0
  284. package/dist/registry/targets/hosted.d.ts +62 -0
  285. package/dist/registry/targets/hosted.d.ts.map +1 -0
  286. package/dist/registry/targets/hosted.js +74 -0
  287. package/dist/registry/targets/index.d.ts +18 -0
  288. package/dist/registry/targets/index.d.ts.map +1 -0
  289. package/dist/registry/targets/index.js +17 -0
  290. package/dist/registry/targets/module-target.d.ts +68 -0
  291. package/dist/registry/targets/module-target.d.ts.map +1 -0
  292. package/dist/registry/targets/module-target.js +63 -0
  293. package/dist/registry/targets/nexus.d.ts +43 -0
  294. package/dist/registry/targets/nexus.d.ts.map +1 -0
  295. package/dist/registry/targets/nexus.js +250 -0
  296. package/dist/registry/targets/zip.d.ts +55 -0
  297. package/dist/registry/targets/zip.d.ts.map +1 -0
  298. package/dist/registry/targets/zip.js +278 -0
  299. package/dist/registry/writer.d.ts +101 -0
  300. package/dist/registry/writer.d.ts.map +1 -0
  301. package/dist/registry/writer.js +109 -0
  302. package/dist/report.d.ts +15 -6
  303. package/dist/report.d.ts.map +1 -1
  304. package/dist/report.js +28 -55
  305. package/dist/rules/record-store.ts +122 -0
  306. package/dist/rules/tf001.ts +2 -2
  307. package/dist/rules/tf024.ts +105 -22
  308. package/dist/rules/tf046.ts +204 -0
  309. package/dist/rules/tf047.ts +114 -0
  310. package/dist/skills/chant-terraform.md +1 -1
  311. package/dist/state/azure-blob.d.ts +9 -0
  312. package/dist/state/azure-blob.d.ts.map +1 -0
  313. package/dist/state/azure-blob.js +8 -0
  314. package/dist/state/backend.d.ts +158 -0
  315. package/dist/state/backend.d.ts.map +1 -0
  316. package/dist/state/backend.js +406 -0
  317. package/dist/state/exec.d.ts +39 -0
  318. package/dist/state/exec.d.ts.map +1 -0
  319. package/dist/state/exec.js +80 -0
  320. package/dist/state/gcs.d.ts +8 -0
  321. package/dist/state/gcs.d.ts.map +1 -0
  322. package/dist/state/gcs.js +7 -0
  323. package/dist/state/index.d.ts +15 -0
  324. package/dist/state/index.d.ts.map +1 -0
  325. package/dist/state/index.js +14 -0
  326. package/dist/state/locks.d.ts +105 -0
  327. package/dist/state/locks.d.ts.map +1 -0
  328. package/dist/state/locks.js +130 -0
  329. package/dist/state/object-store.d.ts +8 -0
  330. package/dist/state/object-store.d.ts.map +1 -0
  331. package/dist/state/object-store.js +7 -0
  332. package/dist/state/root-states.d.ts +131 -0
  333. package/dist/state/root-states.d.ts.map +1 -0
  334. package/dist/state/root-states.js +241 -0
  335. package/dist/state/s3.d.ts +21 -0
  336. package/dist/state/s3.d.ts.map +1 -0
  337. package/dist/state/s3.js +19 -0
  338. package/dist/state/store.d.ts +51 -0
  339. package/dist/state/store.d.ts.map +1 -0
  340. package/dist/state/store.js +185 -0
  341. package/dist/state-ops.d.ts +255 -0
  342. package/dist/state-ops.d.ts.map +1 -0
  343. package/dist/state-ops.js +305 -0
  344. package/dist/state-reads.d.ts +57 -0
  345. package/dist/state-reads.d.ts.map +1 -0
  346. package/dist/state-reads.js +104 -0
  347. package/dist/terragrunt/affected.d.ts.map +1 -1
  348. package/dist/terragrunt/affected.js +2 -1
  349. package/dist/used-sources.d.ts +54 -0
  350. package/dist/used-sources.d.ts.map +1 -0
  351. package/dist/used-sources.js +157 -0
  352. package/package.json +24 -4
  353. package/src/__fixtures__/ACCEPTANCE.md +69 -7
  354. package/src/__fixtures__/compose/apply-failed-in-app.jsonl +12 -0
  355. package/src/__fixtures__/compose/state-app.json +66 -0
  356. package/src/__fixtures__/compose/state-edge.json +40 -0
  357. package/src/__fixtures__/compose/state-net.json +58 -0
  358. package/src/__fixtures__/compose/three-app.plan.json +184 -0
  359. package/src/__fixtures__/compose/three-composed.plan.json +509 -0
  360. package/src/__fixtures__/compose/three-edge.plan.json +144 -0
  361. package/src/__fixtures__/compose/three-net.plan.json +174 -0
  362. package/src/__fixtures__/compose/unknown-composed.plan.json +228 -0
  363. package/src/__fixtures__/compose/working-after-apply.json +145 -0
  364. package/src/__fixtures__/config-blocks/app/main.tf +61 -0
  365. package/src/__fixtures__/config-blocks/app/modules/network/main.tf +4 -0
  366. package/src/__fixtures__/config-blocks/app-json/main.tf.json +39 -0
  367. package/src/__fixtures__/config-files/shadow/main.tf +3 -0
  368. package/src/__fixtures__/config-files/shadow/main.tofu +3 -0
  369. package/src/__fixtures__/config-files/shadow/other.tf +3 -0
  370. package/src/__fixtures__/config-files/tf/main.tf +11 -0
  371. package/src/__fixtures__/config-files/tf-json/main.tf.json +18 -0
  372. package/src/__fixtures__/config-files/tofu/main.tofu +11 -0
  373. package/src/__fixtures__/config-files/tofu-json/main.tofu.json +18 -0
  374. package/src/__fixtures__/config-files/tofu-only/main.tofu +3 -0
  375. package/src/__fixtures__/drift-record/README.md +16 -0
  376. package/src/__fixtures__/drift-record/live-plan-sections.json +27 -0
  377. package/src/__fixtures__/drift-rows/live-root-plan.json +70 -0
  378. package/src/__fixtures__/drift-rows/refresh-plan.json +61 -0
  379. package/src/__fixtures__/instance-forms/app/main.tf +110 -0
  380. package/src/__fixtures__/instance-forms/app/modules/svc/main.tf +3 -0
  381. package/src/__fixtures__/instance-vars/app/main.tf +52 -0
  382. package/src/__fixtures__/instance-vars/app/modules/app/main.tf +12 -0
  383. package/src/__fixtures__/instance-vars/app/modules/edge/main.tf +3 -0
  384. package/src/__fixtures__/instance-vars/app/terraform.tfvars +1 -0
  385. package/src/__fixtures__/live-module-keyed/live-graph.json +259 -0
  386. package/src/__fixtures__/live-module-keyed/live-plan.json +87 -0
  387. package/src/__fixtures__/live-module-keyed/root/estate.chdf.hcl +1 -0
  388. package/src/__fixtures__/live-module-keyed/root/main.tf +21 -0
  389. package/src/__fixtures__/live-module-keyed/root/modules/app/main.tf +17 -0
  390. package/src/__fixtures__/live-module-keyed/root/modules/edge/main.tf +7 -0
  391. package/src/__fixtures__/live-module-keyed/root/versions.tf +30 -0
  392. package/src/__fixtures__/live-module-keyed/show-state.json +146 -0
  393. package/src/__fixtures__/pr-loop/README.md +50 -0
  394. package/src/__fixtures__/pr-loop/chant.config.json +13 -0
  395. package/src/__fixtures__/pr-loop/estate.component.ts +10 -0
  396. package/src/__fixtures__/pr-loop/roots/a/main.tf +11 -0
  397. package/src/__fixtures__/pr-loop/roots/app/main.tf +19 -0
  398. package/src/__fixtures__/pr-loop/roots/b/main.tf +7 -0
  399. package/src/__fixtures__/pr-loop/roots/dns/main.tf +3 -0
  400. package/src/__fixtures__/pr-loop/roots/net/main.tf +7 -0
  401. package/src/__fixtures__/report/applied.show.json +51 -0
  402. package/src/__fixtures__/report/generate.ts +63 -0
  403. package/src/__fixtures__/report/plan.show.json +200 -0
  404. package/src/__fixtures__/report/tf-apply/change-set.json +170 -0
  405. package/src/__fixtures__/report/tf-apply/report.json +338 -0
  406. package/src/__fixtures__/report/tf-plan/change-set.json +170 -0
  407. package/src/__fixtures__/report/tf-plan/report.json +320 -0
  408. package/src/__fixtures__/three-cloud-azure.graph.json +290 -0
  409. package/src/__fixtures__/used-sources/root/extra.tofu +1 -0
  410. package/src/__fixtures__/used-sources/root/main.tf +31 -0
  411. package/src/__fixtures__/used-sources/root/modules/net/main.tf +14 -0
  412. package/src/__fixtures__/used-sources/root/modules/net/versions.tf.json +7 -0
  413. package/src/__fixtures__/used-sources/unit/terragrunt.hcl +3 -0
  414. package/src/applied-state.ts +52 -0
  415. package/src/backend-config.test.ts +105 -0
  416. package/src/backend-config.ts +133 -0
  417. package/src/behaviour/kinds.ts +4 -0
  418. package/src/behaviour/predict.ts +5 -2
  419. package/src/behaviour/reference-catalog.plugin.test.ts +65 -0
  420. package/src/behaviour/reference-catalog.ts +16 -5
  421. package/src/behaviour/request.ts +3 -2
  422. package/src/change-set-instances.test.ts +98 -0
  423. package/src/changed-roots.ts +14 -16
  424. package/src/ci-setup.ts +42 -0
  425. package/src/commands.ts +4 -3
  426. package/src/components/capability-plugin.test.ts +198 -19
  427. package/src/components/capability-plugin.ts +383 -35
  428. package/src/components/change-set-graph.e2e.test.ts +11 -5
  429. package/src/components/compose-group.test.ts +486 -0
  430. package/src/components/compose-group.ts +489 -0
  431. package/src/components/demo-composed-roots.e2e.test.ts +440 -0
  432. package/src/components/member-outputs.test.ts +76 -0
  433. package/src/components/placeholder-preview.test.ts +147 -0
  434. package/src/components/placeholder-preview.ts +257 -0
  435. package/src/components/pr-loop-compose.tofu.e2e.test.ts +363 -0
  436. package/src/components/pr-loop.tofu.test.ts +113 -57
  437. package/src/components/release-inputs.ts +69 -0
  438. package/src/components/trace-facts.test.ts +21 -0
  439. package/src/components/trace-facts.ts +27 -0
  440. package/src/compose/apply-events.test.ts +62 -0
  441. package/src/compose/apply-events.ts +100 -0
  442. package/src/compose/estate.choudoufu.e2e.test.ts +112 -0
  443. package/src/compose/estate.test.ts +421 -0
  444. package/src/compose/estate.ts +443 -0
  445. package/src/compose/hcl.ts +311 -0
  446. package/src/compose/module-address.ts +49 -0
  447. package/src/compose/root.test.ts +416 -0
  448. package/src/compose/root.ts +592 -0
  449. package/src/compose/run.test.ts +440 -0
  450. package/src/compose/run.tofu.test.ts +176 -0
  451. package/src/compose/run.ts +527 -0
  452. package/src/compose/slice.test.ts +184 -0
  453. package/src/compose/slice.ts +290 -0
  454. package/src/compose/state-address.ts +157 -0
  455. package/src/compose/state-merge.test.ts +131 -0
  456. package/src/compose/state-merge.ts +148 -0
  457. package/src/compose.test.ts +248 -0
  458. package/src/compose.ts +627 -0
  459. package/src/composites/terraform-apply-op.test.ts +9 -0
  460. package/src/composites/terraform-apply-op.ts +7 -3
  461. package/src/cone.ts +138 -0
  462. package/src/config-file-listers.test.ts +265 -0
  463. package/src/config.ts +44 -9
  464. package/src/cost-hold.ts +29 -0
  465. package/src/describe-resources.engine-facts.test.ts +411 -0
  466. package/src/describe-resources.live-module-keyed.test.ts +290 -0
  467. package/src/describe-resources.ts +416 -70
  468. package/src/drift-read.ts +284 -0
  469. package/src/drift-record.test.ts +223 -0
  470. package/src/drift-record.ts +455 -0
  471. package/src/drift-rows.test.ts +135 -0
  472. package/src/drift-rows.ts +137 -0
  473. package/src/exit-codes.test.ts +23 -0
  474. package/src/exit-codes.ts +59 -0
  475. package/src/hcl/config-blocks.test.ts +174 -0
  476. package/src/hcl/edges.ts +21 -1
  477. package/src/hcl/files.ts +234 -0
  478. package/src/hcl/instance-forms.test.ts +94 -0
  479. package/src/hcl/instances.test.ts +137 -0
  480. package/src/hcl/instances.ts +422 -0
  481. package/src/hcl/parse.test.ts +139 -1
  482. package/src/hcl/parse.ts +149 -16
  483. package/src/hcl/roots.ts +6 -0
  484. package/src/hcl/suppressions.ts +8 -2
  485. package/src/index.ts +79 -0
  486. package/src/lint/audit-catalog.ts +29 -3
  487. package/src/lint/audit-lineage.ts +14 -2
  488. package/src/lint/post-synth/fixtures/TF024/live-with-record-store/main.tf +18 -0
  489. package/src/lint/post-synth/fixtures/TF024/sidecar-with-backend/estate.chdf.hcl +1 -0
  490. package/src/lint/post-synth/fixtures/TF024/sidecar-with-backend/main.tf +10 -0
  491. package/src/lint/post-synth/fixtures/TF046/azurerm-no-resource-group/main.tf +15 -0
  492. package/src/lint/post-synth/fixtures/TF046/backend-config-only/main.tf +14 -0
  493. package/src/lint/post-synth/fixtures/TF046/derived-s3/backend.tf +7 -0
  494. package/src/lint/post-synth/fixtures/TF046/derived-s3/main.tf +9 -0
  495. package/src/lint/post-synth/fixtures/TF046/explicit-local/main.tf +16 -0
  496. package/src/lint/post-synth/fixtures/TF046/explicit-s3-beside-local-backend/main.tf +15 -0
  497. package/src/lint/post-synth/fixtures/TF046/implied-local/main.tf +9 -0
  498. package/src/lint/post-synth/fixtures/TF046/sidecar-implied/estate.chdf.hcl +1 -0
  499. package/src/lint/post-synth/fixtures/TF046/sidecar-implied/main.tf +5 -0
  500. package/src/lint/post-synth/fixtures/TF047/clear/main.tf +12 -0
  501. package/src/lint/post-synth/fixtures/TF047/refused/main.tf +12 -0
  502. package/src/lint/post-synth/fixtures/TF047/unknown-module/main.tf +12 -0
  503. package/src/lint/post-synth/fixtures/TF047/unknown-version/main.tf +12 -0
  504. package/src/lint/post-synth/index.ts +4 -0
  505. package/src/lint/post-synth/record-store.ts +122 -0
  506. package/src/lint/post-synth/tf001.ts +2 -2
  507. package/src/lint/post-synth/tf024.test.ts +26 -5
  508. package/src/lint/post-synth/tf024.ts +105 -22
  509. package/src/lint/post-synth/tf046.test.ts +137 -0
  510. package/src/lint/post-synth/tf046.ts +204 -0
  511. package/src/lint/post-synth/tf047.test.ts +56 -0
  512. package/src/lint/post-synth/tf047.ts +114 -0
  513. package/src/live-plan-reasons.ts +54 -0
  514. package/src/lock-rows.test.ts +70 -0
  515. package/src/lock-rows.ts +82 -0
  516. package/src/lock-timeout.ts +34 -0
  517. package/src/lsp/completions.test.ts +1 -1
  518. package/src/lsp/option-keys.ts +2 -0
  519. package/src/module-catalog/index.test.ts +93 -0
  520. package/src/module-catalog/index.ts +159 -0
  521. package/src/module-catalog/refresh-cli.ts +68 -0
  522. package/src/module-catalog/static-tier.ts +1659 -0
  523. package/src/module-catalog/types.ts +88 -0
  524. package/src/op/activities/choudoufu-plan-set-op.test.ts +111 -0
  525. package/src/op/activities/index.ts +9 -0
  526. package/src/op/activities/live-detect.ts +55 -26
  527. package/src/op/activities/pin-rollout.ts +3 -0
  528. package/src/op/activities/registry.test.ts +2 -1
  529. package/src/op/activities/terraform.test.ts +55 -0
  530. package/src/op/activities/terraform.ts +312 -27
  531. package/src/op/activity-contracts.test.ts +1 -0
  532. package/src/op/activity-contracts.ts +24 -1
  533. package/src/op/builders.ts +14 -0
  534. package/src/op-wave-step.test.ts +109 -0
  535. package/src/pin/__fixtures__/consumers/live/dev/main.tf +4 -0
  536. package/src/pin/__fixtures__/consumers/live/prod/main.tf +21 -0
  537. package/src/pin/__fixtures__/consumers/units/vpc/terragrunt.hcl +7 -0
  538. package/src/pin/bundle.test.ts +2 -0
  539. package/src/pin/consumers.test.ts +57 -0
  540. package/src/pin/consumers.ts +95 -0
  541. package/src/pin/edit.ts +30 -0
  542. package/src/pin/rollout.ts +16 -11
  543. package/src/plan-shape.test.ts +148 -0
  544. package/src/plan-shape.ts +128 -0
  545. package/src/plugin.ts +39 -19
  546. package/src/registry/__fixtures__/docs/documented/.terraform-docs.yml +3 -0
  547. package/src/registry/__fixtures__/docs/documented/README.md +1 -0
  548. package/src/registry/__fixtures__/docs/documented/main.tf +8 -0
  549. package/src/registry/__fixtures__/docs/json/main.tf.json +14 -0
  550. package/src/registry/__fixtures__/docs/vpc/README.md +3 -0
  551. package/src/registry/__fixtures__/docs/vpc/examples/complete/main.tf +5 -0
  552. package/src/registry/__fixtures__/docs/vpc/examples/simple/README.md +1 -0
  553. package/src/registry/__fixtures__/docs/vpc/examples/simple/main.tf +4 -0
  554. package/src/registry/__fixtures__/docs/vpc/main.tf +14 -0
  555. package/src/registry/__fixtures__/docs/vpc/outputs.tf +9 -0
  556. package/src/registry/__fixtures__/docs/vpc/variables.tf +16 -0
  557. package/src/registry/__fixtures__/proxied-root/main.tf +12 -0
  558. package/src/registry/address.ts +100 -0
  559. package/src/registry/catalog-read.ts +56 -0
  560. package/src/registry/deprecated.test.ts +139 -0
  561. package/src/registry/deprecated.ts +76 -0
  562. package/src/registry/docs.test.ts +140 -0
  563. package/src/registry/docs.ts +299 -0
  564. package/src/registry/edge/bundle.test.ts +50 -0
  565. package/src/registry/edge/edge.test.ts +176 -0
  566. package/src/registry/edge/edge.ts +211 -0
  567. package/src/registry/edge/index.ts +10 -0
  568. package/src/registry/edge/lambda-edge.ts +127 -0
  569. package/src/registry/edge/sigv4-web.ts +79 -0
  570. package/src/registry/edge/token-source.test.ts +258 -0
  571. package/src/registry/edge/token-source.ts +169 -0
  572. package/src/registry/edge/worker.ts +61 -0
  573. package/src/registry/handler.ts +89 -0
  574. package/src/registry/headers-file.ts +61 -0
  575. package/src/registry/index.ts +31 -0
  576. package/src/registry/mirror-paths.ts +10 -0
  577. package/src/registry/mirror.test.ts +198 -0
  578. package/src/registry/mirror.ts +395 -0
  579. package/src/registry/proxies.test.ts +153 -0
  580. package/src/registry/proxies.ts +132 -0
  581. package/src/registry/reader.ts +225 -0
  582. package/src/registry/registry.test.ts +262 -0
  583. package/src/registry/semver.ts +34 -0
  584. package/src/registry/serve.ts +82 -0
  585. package/src/registry/source-forms.test.ts +87 -0
  586. package/src/registry/source-forms.ts +216 -0
  587. package/src/registry/targets/artifactory.test.ts +248 -0
  588. package/src/registry/targets/artifactory.ts +257 -0
  589. package/src/registry/targets/fake-artifactory.ts +158 -0
  590. package/src/registry/targets/fake-gitlab.ts +161 -0
  591. package/src/registry/targets/fake-hcp.ts +233 -0
  592. package/src/registry/targets/fake-http.ts +97 -0
  593. package/src/registry/targets/fake-nexus.ts +152 -0
  594. package/src/registry/targets/gitlab.test.ts +208 -0
  595. package/src/registry/targets/gitlab.ts +223 -0
  596. package/src/registry/targets/hcp.test.ts +230 -0
  597. package/src/registry/targets/hcp.ts +360 -0
  598. package/src/registry/targets/hosted.ts +117 -0
  599. package/src/registry/targets/index.ts +17 -0
  600. package/src/registry/targets/module-target.ts +131 -0
  601. package/src/registry/targets/nexus.test.ts +220 -0
  602. package/src/registry/targets/nexus.ts +314 -0
  603. package/src/registry/targets/zip.test.ts +65 -0
  604. package/src/registry/targets/zip.ts +287 -0
  605. package/src/registry/writer.ts +155 -0
  606. package/src/report.test.ts +82 -1
  607. package/src/report.ts +31 -54
  608. package/src/signal-only-root.test.ts +72 -0
  609. package/src/skills/chant-terraform.md +1 -1
  610. package/src/state/azure-blob.ts +8 -0
  611. package/src/state/backend-verdict.test.ts +187 -0
  612. package/src/state/backend.test.ts +127 -0
  613. package/src/state/backend.ts +488 -0
  614. package/src/state/exec.ts +111 -0
  615. package/src/state/gcs.ts +7 -0
  616. package/src/state/index.ts +15 -0
  617. package/src/state/locks.test.ts +84 -0
  618. package/src/state/locks.ts +201 -0
  619. package/src/state/object-store.ts +7 -0
  620. package/src/state/root-states-floci.e2e.test.ts +66 -0
  621. package/src/state/root-states.test.ts +462 -0
  622. package/src/state/root-states.ts +309 -0
  623. package/src/state/s3.ts +21 -0
  624. package/src/state/store.ts +225 -0
  625. package/src/state-ops.test.ts +182 -0
  626. package/src/state-ops.ts +462 -0
  627. package/src/state-reads.ts +116 -0
  628. package/src/terragrunt/affected.ts +2 -1
  629. package/src/used-sources.test.ts +75 -0
  630. package/src/used-sources.ts +204 -0
  631. package/src/workspace-kinds.test.ts +4 -17
  632. package/workspace-kinds.json +1 -24
  633. package/dist/workspace-member.d.ts +0 -30
  634. package/dist/workspace-member.d.ts.map +0 -1
  635. package/dist/workspace-member.js +0 -91
  636. package/schemas/pulumi.schema.json +0 -34
  637. package/src/testdata/pulumi-member/Pulumi.yaml +0 -2
  638. package/src/testdata/pulumi-member/stack-export.json +0 -53
  639. package/src/testdata/pulumi-unexported/Pulumi.yaml +0 -2
  640. package/src/workspace-member.test.ts +0 -89
  641. package/src/workspace-member.ts +0 -126
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Previewing a root whose `vars` read outputs not known yet (#4463).
3
+ *
4
+ * terraform takes no unknown variable, so such a root used to get no plan at
5
+ * pull-request time, only a hole. Now it is planned with a stand-in for each
6
+ * variable that holds no value yet, typed from the root's own `variable`
7
+ * block ({@link terraformPlaceholder}). Every attribute and output the
8
+ * stand-ins drive is then marked unknown after apply in the plan JSON
9
+ * ({@link markPlaceholderDriven}) before the change set, the shape and the
10
+ * planned outputs are read from it, so no stand-in value reaches the note or
11
+ * the digest. The member's change-set part lists the variables under
12
+ * `placeholders`.
13
+ *
14
+ * What a stand-in drives is read from the plan's own `configuration`: an
15
+ * attribute whose expression references `var.<name>`, through module inputs
16
+ * too, plus any string attribute or output whose planned value carries
17
+ * {@link TERRAFORM_UNKNOWN_MARK}. A value that reaches an attribute another
18
+ * way (a number through a `local`) is not marked; the fresh plan at apply
19
+ * then differs from the preview and asks for an approval of its own, which
20
+ * costs a round and never applies a change nobody approved.
21
+ *
22
+ * A preview is not possible when a variable that holds the unknown read is
23
+ * not declared, when the unknown sits inside a larger value, when a `count`
24
+ * or `for_each` reads a stand-in (the preview would show a count the real
25
+ * value does not have), or when the placeholder plan fails, say on a
26
+ * `validation` block. The member then stays a hole, as before, and the
27
+ * hole's reason says why (the 2026-10-25 ruling on #4463).
28
+ */
29
+ /** The marker every string stand-in carries, so a reader can tell it from a real value. */
30
+ export const TERRAFORM_UNKNOWN_MARK = "known-after-apply";
31
+ const isObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
32
+ /** Split `text` on `sep` where no bracket is open. */
33
+ function splitTop(text, sep) {
34
+ const out = [];
35
+ let depth = 0;
36
+ let quoted = false;
37
+ let start = 0;
38
+ for (let i = 0; i < text.length; i++) {
39
+ const c = text[i];
40
+ if (c === '"' && text[i - 1] !== "\\")
41
+ quoted = !quoted;
42
+ if (quoted)
43
+ continue;
44
+ if (c === "(" || c === "[" || c === "{")
45
+ depth++;
46
+ else if (c === ")" || c === "]" || c === "}")
47
+ depth--;
48
+ else if (depth === 0 && (typeof sep === "string" ? c === sep : sep.test(c))) {
49
+ out.push(text.slice(start, i));
50
+ start = i + 1;
51
+ }
52
+ }
53
+ out.push(text.slice(start));
54
+ return out.map((s) => s.trim()).filter((s) => s !== "");
55
+ }
56
+ /** `name(inner)` read off a type expression, or `undefined` when it is not one. */
57
+ function call(type, name) {
58
+ const m = type.match(new RegExp(`^${name}\\s*\\(([\\s\\S]*)\\)$`));
59
+ return m ? m[1].trim() : undefined;
60
+ }
61
+ /**
62
+ * A stand-in for a variable of `type`, a Terraform type expression as the
63
+ * `variable` block writes it (`string`, `list(string)`, `object({ id = string })`).
64
+ *
65
+ * - `string`, `any` or no type: {@link TERRAFORM_UNKNOWN_MARK}.
66
+ * - `number`: 0. `bool`: false.
67
+ * - `list(...)`, `set(...)`: an empty list. `map(...)`: an empty map.
68
+ * - `tuple([a, b])`: one stand-in per element type.
69
+ * - `object({ a = t })`: one stand-in per attribute, `optional(t)` read as `t`.
70
+ *
71
+ * An empty collection plans no element, so a resource that iterates one
72
+ * plans none; the fresh plan at apply then asks for its own approval.
73
+ */
74
+ export function terraformPlaceholder(type) {
75
+ const t = (type ?? "").trim().replace(/^\$\{([\s\S]*)\}$/, "$1").trim();
76
+ if (t === "" || t === "any" || t === "string")
77
+ return TERRAFORM_UNKNOWN_MARK;
78
+ if (t === "number")
79
+ return 0;
80
+ if (t === "bool")
81
+ return false;
82
+ const optional = call(t, "optional");
83
+ if (optional !== undefined)
84
+ return terraformPlaceholder(splitTop(optional, ",")[0]);
85
+ if (call(t, "list") !== undefined || call(t, "set") !== undefined)
86
+ return [];
87
+ if (call(t, "map") !== undefined)
88
+ return {};
89
+ const tuple = call(t, "tuple");
90
+ if (tuple !== undefined) {
91
+ const inner = tuple.replace(/^\[([\s\S]*)\]$/, "$1");
92
+ return splitTop(inner, ",").map((e) => terraformPlaceholder(e));
93
+ }
94
+ const object = call(t, "object");
95
+ if (object !== undefined) {
96
+ const inner = object.replace(/^\{([\s\S]*)\}$/, "$1");
97
+ const out = {};
98
+ for (const attr of splitTop(inner, /[,\n]/)) {
99
+ const at = attr.indexOf("=");
100
+ if (at < 0)
101
+ continue;
102
+ const name = attr.slice(0, at).trim().replace(/^"(.*)"$/, "$1");
103
+ out[name] = terraformPlaceholder(attr.slice(at + 1));
104
+ }
105
+ return out;
106
+ }
107
+ return TERRAFORM_UNKNOWN_MARK;
108
+ }
109
+ const containsUndefined = (v) => v === undefined || (Array.isArray(v) ? v.some(containsUndefined) : isObject(v) ? Object.values(v).some(containsUndefined) : false);
110
+ /**
111
+ * The stand-ins for a step's `vars` (#4463): each variable whose value is
112
+ * `undefined` (a `stackOutput()` read with nothing to read yet) gets
113
+ * {@link terraformPlaceholder} of its declared type. Returns why instead when
114
+ * no preview can be made: no variable holds the unknown read, one that does
115
+ * is not declared in the root, or the unknown sits inside a larger value.
116
+ */
117
+ export function placeholderVars(vars, declared) {
118
+ const given = vars ?? {};
119
+ const placeholders = [];
120
+ const out = {};
121
+ for (const [name, value] of Object.entries(given)) {
122
+ if (value === undefined) {
123
+ const decl = declared.get(name);
124
+ if (!decl)
125
+ return `var.${name} holds the unknown read and the root declares no variable "${name}" to type a stand-in from`;
126
+ placeholders.push(name);
127
+ out[name] = terraformPlaceholder(decl.type);
128
+ }
129
+ else if (containsUndefined(value)) {
130
+ return `the unknown read sits inside var.${name}, which a stand-in cannot fill in part`;
131
+ }
132
+ else
133
+ out[name] = value;
134
+ }
135
+ if (placeholders.length === 0)
136
+ return "no variable of the step holds the unknown read";
137
+ return { placeholders: placeholders.sort(), vars: out };
138
+ }
139
+ /** Every `references` entry under an expression, at any depth (nested blocks are arrays of expression objects). */
140
+ function referencesIn(expr, out = []) {
141
+ if (Array.isArray(expr))
142
+ for (const e of expr)
143
+ referencesIn(e, out);
144
+ else if (isObject(expr)) {
145
+ if (Array.isArray(expr.references))
146
+ for (const r of expr.references)
147
+ if (typeof r === "string")
148
+ out.push(r);
149
+ for (const [k, v] of Object.entries(expr))
150
+ if (k !== "references" && k !== "constant_value")
151
+ referencesIn(v, out);
152
+ }
153
+ return out;
154
+ }
155
+ const readsVar = (expr, vars) => referencesIn(expr).some((r) => {
156
+ const m = r.match(/^var\.([^.[]+)/);
157
+ return m !== null && vars.has(m[1]);
158
+ });
159
+ const resourceKey = (modulePath, mode, type, name) => `${modulePath}|${mode === "data" ? "data." : ""}${type}.${name}`;
160
+ function walkModule(mod, path, vars, driven) {
161
+ if (!isObject(mod) || vars.size === 0)
162
+ return;
163
+ const at = (address) => (path ? `${path}.${address}` : address);
164
+ for (const r of Array.isArray(mod.resources) ? mod.resources : []) {
165
+ if (!isObject(r))
166
+ continue;
167
+ const mode = String(r.mode ?? "managed");
168
+ const address = String(r.address ?? `${r.type}.${r.name}`);
169
+ if (readsVar(r.count_expression, vars) || readsVar(r.for_each_expression, vars))
170
+ driven.expansions.push(at(address));
171
+ const exprs = isObject(r.expressions) ? r.expressions : {};
172
+ const attrs = new Set(Object.entries(exprs).filter(([, e]) => readsVar(e, vars)).map(([k]) => k));
173
+ if (attrs.size > 0)
174
+ driven.attributes.set(resourceKey(path, mode, String(r.type), String(r.name)), attrs);
175
+ }
176
+ for (const [name, c] of Object.entries(isObject(mod.module_calls) ? mod.module_calls : {})) {
177
+ if (!isObject(c))
178
+ continue;
179
+ if (readsVar(c.count_expression, vars) || readsVar(c.for_each_expression, vars))
180
+ driven.expansions.push(at(`module.${name}`));
181
+ const exprs = isObject(c.expressions) ? c.expressions : {};
182
+ const inputs = new Set(Object.entries(exprs).filter(([, e]) => readsVar(e, vars)).map(([k]) => k));
183
+ walkModule(c.module, at(`module.${name}`), inputs, driven);
184
+ }
185
+ if (path === "") {
186
+ for (const [name, o] of Object.entries(isObject(mod.outputs) ? mod.outputs : {})) {
187
+ if (isObject(o) && readsVar(o.expression, vars))
188
+ driven.outputs.add(name);
189
+ }
190
+ }
191
+ }
192
+ const carriesMark = (v) => typeof v === "string" ? v.includes(TERRAFORM_UNKNOWN_MARK) : Array.isArray(v) ? v.some(carriesMark) : isObject(v) ? Object.values(v).some(carriesMark) : false;
193
+ /** A `resource_changes` item's key in {@link Driven.attributes}: its module path without instance keys. */
194
+ function changeKey(rc) {
195
+ const modulePath = typeof rc.module_address === "string" ? rc.module_address.replace(/\[[^\]]*\]/g, "") : "";
196
+ return resourceKey(modulePath, String(rc.mode ?? "managed"), String(rc.type), String(rc.name));
197
+ }
198
+ /**
199
+ * `planJson` (`show -json` of the placeholder plan) with every attribute and
200
+ * root output the stand-ins for `placeholders` drive marked unknown after
201
+ * apply, their planned values dropped. Returns why instead when a `count` or
202
+ * `for_each` reads a stand-in. The input is not changed.
203
+ */
204
+ export function markPlaceholderDriven(planJson, placeholders) {
205
+ const plan = structuredClone(isObject(planJson) ? planJson : {});
206
+ const driven = { attributes: new Map(), outputs: new Set(), expansions: [] };
207
+ const config = isObject(plan.configuration) ? plan.configuration : {};
208
+ walkModule(config.root_module, "", new Set(placeholders), driven);
209
+ if (driven.expansions.length > 0) {
210
+ return { refused: `the count or for_each of ${[...new Set(driven.expansions)].sort().join(", ")} reads a stand-in, so the preview cannot say how many instances there are` };
211
+ }
212
+ for (const r of Array.isArray(plan.resource_changes) ? plan.resource_changes : []) {
213
+ if (!isObject(r) || !isObject(r.change))
214
+ continue;
215
+ const change = r.change;
216
+ const after = isObject(change.after) ? change.after : undefined;
217
+ const attrs = new Set(driven.attributes.get(changeKey(r)) ?? []);
218
+ for (const [k, v] of Object.entries(after ?? {}))
219
+ if (carriesMark(v))
220
+ attrs.add(k);
221
+ if (attrs.size === 0)
222
+ continue;
223
+ const afterUnknown = isObject(change.after_unknown) ? change.after_unknown : {};
224
+ for (const k of attrs) {
225
+ afterUnknown[k] = true;
226
+ if (after)
227
+ delete after[k];
228
+ }
229
+ change.after_unknown = afterUnknown;
230
+ }
231
+ const outputChanges = isObject(plan.output_changes) ? plan.output_changes : {};
232
+ const plannedOutputs = isObject(plan.planned_values) && isObject(plan.planned_values.outputs) ? plan.planned_values.outputs : {};
233
+ for (const [name, o] of Object.entries(outputChanges))
234
+ if (isObject(o) && carriesMark(o.after))
235
+ driven.outputs.add(name);
236
+ for (const [name, o] of Object.entries(plannedOutputs))
237
+ if (isObject(o) && carriesMark(o.value))
238
+ driven.outputs.add(name);
239
+ for (const name of driven.outputs) {
240
+ const o = isObject(outputChanges[name]) ? outputChanges[name] : (outputChanges[name] = {});
241
+ delete o.after;
242
+ o.after_unknown = true;
243
+ delete plannedOutputs[name];
244
+ }
245
+ return { plan };
246
+ }
247
+ /** The hole a root keeps when its preview is not possible: the old reason, and why there is no preview. */
248
+ export function waitingHole(root, unresolved, why) {
249
+ return {
250
+ address: root,
251
+ type: "terraform_root",
252
+ reason: `inputs from ${unresolved.join(", ")}; planned again once they apply${why ? `; no preview: ${why}` : ""}`,
253
+ };
254
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The files a release records for a `terraform-apply` step (chant#4542).
3
+ *
4
+ * The step names its root by key, so core can't see which files it deploys.
5
+ * `terraformReleaseInputs` answers core's `releaseInputs` with the set a
6
+ * pull request's plan treats as the root's change (`rootWatchPaths`): the
7
+ * root's directory, each local module it reaches, and its var files, plus
8
+ * its backend-config files. A release cut records them for the component,
9
+ * and a promote or rollback under the release writes them under
10
+ * `.chant/release-templates/<digest>/` and sets the step's `dir` to the copy
11
+ * of the root, so `terraform-apply` plans the release's configuration against
12
+ * the environment's state.
13
+ *
14
+ * A root whose state is a file in its own directory (the `local` backend) is
15
+ * unbound: a plan run in a copy elsewhere would read no state and propose
16
+ * creating everything. Such a root rolls back through `chant lifecycle
17
+ * rollback --to`. A live choudoufu root has no state file and is recorded.
18
+ */
19
+ import type { ReleaseInputs, ReleaseInputsContext, ReleaseInputsUnbound } from "@intentius/chant/components/capability";
20
+ /** The parts of the `terraform-apply` input this reads. */
21
+ interface StepInput {
22
+ root: string;
23
+ cwd?: string;
24
+ dir?: string;
25
+ }
26
+ /** What a release records for one `terraform-apply` step, relative to the member's directory. Null when the root is not declared. */
27
+ export declare function terraformReleaseInputs(input: StepInput, ctx: ReleaseInputsContext): Promise<ReleaseInputs | ReleaseInputsUnbound | null>;
28
+ export {};
29
+ //# sourceMappingURL=release-inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-inputs.d.ts","sourceRoot":"","sources":["../../src/components/release-inputs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAOxH,2DAA2D;AAC3D,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID,qIAAqI;AACrI,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,GAAG,oBAAoB,GAAG,IAAI,CAAC,CA+B9I"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * The files a release records for a `terraform-apply` step (chant#4542).
3
+ *
4
+ * The step names its root by key, so core can't see which files it deploys.
5
+ * `terraformReleaseInputs` answers core's `releaseInputs` with the set a
6
+ * pull request's plan treats as the root's change (`rootWatchPaths`): the
7
+ * root's directory, each local module it reaches, and its var files, plus
8
+ * its backend-config files. A release cut records them for the component,
9
+ * and a promote or rollback under the release writes them under
10
+ * `.chant/release-templates/<digest>/` and sets the step's `dir` to the copy
11
+ * of the root, so `terraform-apply` plans the release's configuration against
12
+ * the environment's state.
13
+ *
14
+ * A root whose state is a file in its own directory (the `local` backend) is
15
+ * unbound: a plan run in a copy elsewhere would read no state and propose
16
+ * creating everything. Such a root rolls back through `chant lifecycle
17
+ * rollback --to`. A live choudoufu root has no state file and is recorded.
18
+ */
19
+ import { dirname, relative, resolve } from "node:path";
20
+ import { loadChantConfigUpward } from "@intentius/chant/config";
21
+ import { rootWatchPaths } from "../changed-roots.js";
22
+ import { liveEstate } from "../compose/hcl.js";
23
+ import { readBackend } from "../state/backend.js";
24
+ const toPosix = (p) => p.split("\\").join("/") || ".";
25
+ /** What a release records for one `terraform-apply` step, relative to the member's directory. Null when the root is not declared. */
26
+ export async function terraformReleaseInputs(input, ctx) {
27
+ if (typeof input.root !== "string" || input.root === "")
28
+ return null;
29
+ const start = resolve(ctx.memberDir, input.cwd ?? ".");
30
+ const { config, configPath } = await loadChantConfigUpward(start);
31
+ const projectRoot = configPath ? dirname(configPath) : start;
32
+ const terraform = config.terraform;
33
+ const root = terraform?.roots?.[input.root];
34
+ if (!root)
35
+ return null;
36
+ const binary = terraform?.binary;
37
+ const rootDir = resolve(projectRoot, input.dir ?? root.dir);
38
+ const live = binary === "choudoufu" && (root.estate !== undefined || liveEstate(rootDir, binary).live);
39
+ if (!live) {
40
+ const { backend } = readBackend(rootDir, {
41
+ ...(root.backendConfig ? { backendConfig: root.backendConfig } : {}),
42
+ ...(root.backendConfigFiles ? { backendConfigFiles: root.backendConfigFiles } : {}),
43
+ ...(binary ? { binary } : {}),
44
+ });
45
+ if (backend.type === "local") {
46
+ return {
47
+ unbound: `root "${input.root}" keeps its state in a local file under ${toPosix(relative(ctx.memberDir, rootDir))}, ` +
48
+ "so a plan of a recorded copy would read no state; roll it back with chant lifecycle rollback --to <ref>",
49
+ };
50
+ }
51
+ }
52
+ const fromMember = (abs) => toPosix(relative(ctx.memberDir, abs));
53
+ const paths = rootWatchPaths(projectRoot, { dir: relative(projectRoot, rootDir) || ".", ...(root.varFiles ? { varFiles: root.varFiles } : {}) }, binary).map((p) => fromMember(resolve(projectRoot, p)));
54
+ for (const file of root.backendConfigFiles ?? [])
55
+ paths.push(fromMember(resolve(rootDir, file)));
56
+ return { field: "dir", dir: fromMember(rootDir), paths: [...new Set(paths)].sort() };
57
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `terraform-apply`'s engine facts for its span and op-wave run record
3
+ * (INTENTIUS/chant#4555): the root, the binary that applied it, and whether
4
+ * it applied the plan the wave decided. Core adds the plan's resource counts
5
+ * by action, and writes every key under the CI product's prefix
6
+ * (`terragucci.root`, `terragucci.binary`).
7
+ */
8
+ import type { CapabilityTraceFacts } from "@intentius/chant/otlp";
9
+ import type { TerraformApplyStepInput, TerraformApplyStepOutput } from "./capability-plugin.js";
10
+ /** `traceFacts` for `terraform-apply` (#4555). `binary` is the config's `terraform.binary`, `terraform` when it names none. */
11
+ export declare function terraformTraceFacts(input: TerraformApplyStepInput, outcome: {
12
+ output: TerraformApplyStepOutput;
13
+ } | {
14
+ error: unknown;
15
+ }, binary: string | undefined): CapabilityTraceFacts;
16
+ //# sourceMappingURL=trace-facts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-facts.d.ts","sourceRoot":"","sources":["../../src/components/trace-facts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE7F,+HAA+H;AAC/H,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE;IAAE,MAAM,EAAE,wBAAwB,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,EAClE,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,oBAAoB,CAUtB"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `terraform-apply`'s engine facts for its span and op-wave run record
3
+ * (INTENTIUS/chant#4555): the root, the binary that applied it, and whether
4
+ * it applied the plan the wave decided. Core adds the plan's resource counts
5
+ * by action, and writes every key under the CI product's prefix
6
+ * (`terragucci.root`, `terragucci.binary`).
7
+ */
8
+ /** `traceFacts` for `terraform-apply` (#4555). `binary` is the config's `terraform.binary`, `terraform` when it names none. */
9
+ export function terraformTraceFacts(input, outcome, binary) {
10
+ const bin = (binary ?? "terraform").split(/[\\/]/).pop() || "terraform";
11
+ return {
12
+ attributes: {
13
+ root: input.root,
14
+ binary: bin,
15
+ ...("output" in outcome && outcome.output ? { "apply.from_wave_plan": outcome.output.fromWavePlan, "apply.outputs": Object.keys(outcome.output.outputs ?? {}).length } : {}),
16
+ ...(input.cone ? { "plan.cone": input.cone } : {}),
17
+ },
18
+ };
19
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * How each member's part of a composed apply ended (chant#4442, epic #4419),
3
+ * read from the binary's `apply -json` lines: `applied`, `partial`,
4
+ * `failed`, `not-started` or `no-changes`, core's `GroupMemberStatus`
5
+ * (ws-107).
6
+ *
7
+ * Lifted from terragucci's `packages/terragucci/src/compose.ts` at c493e0e
8
+ * (`readApplyEvents`, `memberApply`).
9
+ */
10
+ import type { GroupMemberStatus } from "@intentius/chant/components/capability";
11
+ import type { Composition } from "../compose.js";
12
+ /** How one member's part of the apply ended. */
13
+ export type MemberApply = GroupMemberStatus;
14
+ /** What `apply -json` said of each module: the changes that completed, started, or errored, and the first error. */
15
+ export interface ApplyEvents {
16
+ done: Map<string, number>;
17
+ started: Map<string, number>;
18
+ errored: Map<string, string>;
19
+ /** Errors no module's resource names. */
20
+ other: string[];
21
+ }
22
+ /** Read `apply -json` lines into each module's progress. A line that is not JSON is skipped. */
23
+ export declare function readApplyEvents(out: string, modules: readonly string[]): ApplyEvents;
24
+ /** How a member's part of the apply ended, from its planned changes and the events. */
25
+ export declare function memberApply(m: string, planned: number, ev: ApplyEvents): {
26
+ apply: MemberApply;
27
+ done: number;
28
+ };
29
+ /** One member's outcome of a composed apply. */
30
+ export interface MemberApplyOutcome {
31
+ status: MemberApply;
32
+ /** Its planned changes that completed. */
33
+ done: number;
34
+ /** The first error its part named. */
35
+ error?: string;
36
+ }
37
+ /**
38
+ * Every member's outcome of a composed apply, by component, from the
39
+ * `apply -json` output and each member's planned changes
40
+ * (`PlanCounts.changes` of its slice).
41
+ */
42
+ export declare function composedApplyOutcomes(c: Pick<Composition, "order" | "modules">, planned: ReadonlyMap<string, number>, out: string): {
43
+ members: Record<string, MemberApplyOutcome>;
44
+ other: string[];
45
+ };
46
+ //# sourceMappingURL=apply-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-events.d.ts","sourceRoot":"","sources":["../../src/compose/apply-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,gDAAgD;AAChD,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAE5C,oHAAoH;AACpH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,yCAAyC;IACzC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AASD,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CA6BpF;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAO7G;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,WAAW,CAAC;IACpB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAUpM"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * How each member's part of a composed apply ended (chant#4442, epic #4419),
3
+ * read from the binary's `apply -json` lines: `applied`, `partial`,
4
+ * `failed`, `not-started` or `no-changes`, core's `GroupMemberStatus`
5
+ * (ws-107).
6
+ *
7
+ * Lifted from terragucci's `packages/terragucci/src/compose.ts` at c493e0e
8
+ * (`readApplyEvents`, `memberApply`).
9
+ */
10
+ import { stripModule, topModule } from "./module-address.js";
11
+ /** Read `apply -json` lines into each module's progress. A line that is not JSON is skipped. */
12
+ export function readApplyEvents(out, modules) {
13
+ const ev = { done: new Map(), started: new Map(), errored: new Map(), other: [] };
14
+ const known = new Set(modules);
15
+ const moduleOf = (addr) => {
16
+ const m = addr !== undefined ? topModule(addr) : undefined;
17
+ return m !== undefined && known.has(m) && addr !== `module.${m}` ? m : undefined;
18
+ };
19
+ const bump = (map, m) => map.set(m, (map.get(m) ?? 0) + 1);
20
+ for (const line of out.split("\n")) {
21
+ if (!line.startsWith("{"))
22
+ continue;
23
+ let e;
24
+ try {
25
+ e = JSON.parse(line);
26
+ }
27
+ catch {
28
+ continue;
29
+ }
30
+ const addr = e.hook?.resource?.addr;
31
+ const m = moduleOf(addr);
32
+ if (e.type === "apply_start" && m)
33
+ bump(ev.started, m);
34
+ else if (e.type === "apply_complete" && m)
35
+ bump(ev.done, m);
36
+ else if (e.type === "apply_errored" && m && !ev.errored.has(m))
37
+ ev.errored.set(m, `${stripModule(addr)}: ${e.hook?.error ?? e["@message"] ?? "errored"}`);
38
+ else if (e.type === "diagnostic" && e.diagnostic?.severity === "error") {
39
+ const dm = moduleOf(e.diagnostic.address);
40
+ const text = `${e.diagnostic.summary ?? "Error"}${e.diagnostic.detail ? `: ${e.diagnostic.detail.split("\n")[0]}` : ""}`;
41
+ if (dm && !ev.errored.has(dm))
42
+ ev.errored.set(dm, `${stripModule(e.diagnostic.address)}: Error: ${text}`);
43
+ else if (!dm)
44
+ ev.other.push(text);
45
+ }
46
+ }
47
+ return ev;
48
+ }
49
+ /** How a member's part of the apply ended, from its planned changes and the events. */
50
+ export function memberApply(m, planned, ev) {
51
+ const done = Math.min(ev.done.get(m) ?? 0, planned);
52
+ if (planned === 0)
53
+ return { apply: "no-changes", done: 0 };
54
+ if (done >= planned)
55
+ return { apply: "applied", done };
56
+ if (done > 0)
57
+ return { apply: "partial", done };
58
+ if (ev.errored.has(m) || (ev.started.get(m) ?? 0) > 0)
59
+ return { apply: "failed", done };
60
+ return { apply: "not-started", done };
61
+ }
62
+ /**
63
+ * Every member's outcome of a composed apply, by component, from the
64
+ * `apply -json` output and each member's planned changes
65
+ * (`PlanCounts.changes` of its slice).
66
+ */
67
+ export function composedApplyOutcomes(c, planned, out) {
68
+ const ev = readApplyEvents(out, c.order.map((member) => c.modules.get(member)));
69
+ const members = {};
70
+ for (const member of c.order) {
71
+ const m = c.modules.get(member);
72
+ const { apply, done } = memberApply(m, planned.get(member) ?? 0, ev);
73
+ const error = ev.errored.get(m);
74
+ members[member] = { status: apply, done, ...(error && apply !== "applied" ? { error } : {}) };
75
+ }
76
+ return { members, other: ev.other };
77
+ }