@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,482 @@
1
+ /**
2
+ * Which roots a change composes, in what order, and why the others fall back
3
+ * (chant#4438, epic #4419). Pure functions over a project's config, its
4
+ * components and its roots' files: nothing here runs a binary.
5
+ *
6
+ * A composed run plans the `terraform-apply` components a change reaches,
7
+ * and the ones they read, as one plan of a composed root of `module` calls,
8
+ * and applies it as one apply, so a value one root creates reaches the roots
9
+ * that read it inside that apply. Writing the composed root is #4441;
10
+ * splitting its state is #4442; running it is #4444.
11
+ *
12
+ * Lifted from terragucci's `packages/terragucci/src/compose.ts` at c493e0e
13
+ * (`Composition`, `composeSet`, `readOrder`, `moduleNames`, `compositionFor`,
14
+ * `fallbackOf`, `fallbackLine`), with chant's inputs in place of terragucci's:
15
+ *
16
+ * - The roots are `terraform.roots`, each deployed by a component whose step
17
+ * is `{ kind: "terraform-apply", root }`. A member is a component.
18
+ * - A read between members is a `stackOutput()` in the step's `vars`, a
19
+ * `terraform_remote_state` block whose address is another member's
20
+ * backend, or a `terraform_estate_outputs` block naming another member's
21
+ * estate.
22
+ * - `waves.after` is the component's `dependsOn`; `oidc.roles` is the apply
23
+ * identity the caller resolves per member (`ci.identity.cloud`, #4296);
24
+ * `TF_CLI_ARGS*` is read from the environment as before.
25
+ *
26
+ * Unlike terragucci, part of a change can compose (#4419 ruling 1): each
27
+ * member that cannot is left out with its own reason, and the rest compose
28
+ * when two or more remain. A component of another kind, or a root left out,
29
+ * on a dependency path between two members splits them (ruling 2), and only
30
+ * a component whose deploy is that one step joins (ruling 3).
31
+ *
32
+ * Off unless `terraform.compose.enabled` is set: {@link compositionIfEnabled}
33
+ * is the entry point, and calls nothing when it is not.
34
+ */
35
+ import { isAbsolute, resolve } from "node:path";
36
+ import { wiringReads } from "@intentius/chant/components/driver";
37
+ import { lockRefusal, readBackend } from "./state/backend.js";
38
+ import { estateOutputReads, importLiteral, jsonImportRefused, liveEstate, localModules, lockedProviders, relPath, rootState, rootTexts, sameState, blockBody, } from "./compose/hcl.js";
39
+ export { blankComments, lockedProviders, blockBody, hclAttr, rootState, liveEstate, estateOutputReads } from "./compose/hcl.js";
40
+ /** `terraform.compose.max` when unset. */
41
+ export const DEFAULT_COMPOSE_MAX = 10;
42
+ /** The step kind a member's deploy is. */
43
+ export const COMPOSE_STEP_KIND = "terraform-apply";
44
+ /** A member's identity as {@link CompositionInput.identity} compares it: its apply trade, or `""` for none. */
45
+ export function identityKey(identity) {
46
+ return identity ? JSON.stringify(identity.apply) : "";
47
+ }
48
+ const plural = (n, one, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;
49
+ const list = (xs) => xs.map((x) => `\`${x}\``).join(", ");
50
+ /**
51
+ * The module name of each root: its name with every character a name cannot
52
+ * hold as `_` (`envs/prod-app` is `envs_prod_app`), `root` for an empty one,
53
+ * `r_` before a leading digit, and `_2`, `_3` on a clash, given in name order.
54
+ */
55
+ export function moduleNames(roots) {
56
+ const out = new Map();
57
+ const taken = new Set();
58
+ for (const r of [...new Set(roots)].sort()) {
59
+ let base = r === "." || r === "" ? "root" : r.replace(/[^A-Za-z0-9_]/g, "_").replace(/^_+|_+$/g, "") || "root";
60
+ if (/^[0-9]/.test(base))
61
+ base = `r_${base}`;
62
+ let name = base;
63
+ for (let i = 2; taken.has(name); i++)
64
+ name = `${base}_${i}`;
65
+ taken.add(name);
66
+ out.set(r, name);
67
+ }
68
+ return out;
69
+ }
70
+ /** The members of `set`, each after every member of the set it reads; members that read none of each other in name order. */
71
+ export function readOrder(set, deps) {
72
+ const left = new Set(set);
73
+ const out = [];
74
+ while (left.size > 0) {
75
+ const ready = [...left].filter((r) => [...(deps.get(r) ?? [])].every((u) => !left.has(u))).sort();
76
+ // A cycle the waves would refuse: take the rest in name order rather than stop.
77
+ const take = ready.length > 0 ? ready : [...left].sort();
78
+ for (const r of take) {
79
+ out.push(r);
80
+ left.delete(r);
81
+ }
82
+ }
83
+ return out;
84
+ }
85
+ /** The members a composed run covers: those of `all` the change reaches and every one of `all` they read, followed upstream. */
86
+ export function composeSet(all, selected, deps) {
87
+ const set = new Set(selected ? [...selected].filter((r) => all.includes(r)) : all);
88
+ const queue = [...set];
89
+ while (queue.length > 0) {
90
+ const r = queue.pop();
91
+ for (const u of deps.get(r) ?? []) {
92
+ if (!set.has(u) && all.includes(u)) {
93
+ set.add(u);
94
+ queue.push(u);
95
+ }
96
+ }
97
+ }
98
+ return [...set].sort();
99
+ }
100
+ // ── components ────────────────────────────────────────────────────────────
101
+ /** Every leaf step of a deploy, gates included, in order. */
102
+ function leafSteps(phases) {
103
+ const out = [];
104
+ const walk = (steps) => {
105
+ for (const s of steps) {
106
+ if (typeof s.phase === "string" && Array.isArray(s.steps))
107
+ walk(s.steps);
108
+ else
109
+ out.push(s);
110
+ }
111
+ };
112
+ for (const p of phases)
113
+ walk(p.steps);
114
+ return out;
115
+ }
116
+ /** A component's kind, for a reason: its first step's kind. */
117
+ const kindOf = (c) => leafSteps(c.deploy)[0]?.kind ?? "empty";
118
+ /** The top-level vars of a step and the members' outputs each reads through `stackOutput()` or `@<component>.publish.*`. */
119
+ function varsReads(step) {
120
+ const vars = step.vars && typeof step.vars === "object" && !Array.isArray(step.vars) ? step.vars : {};
121
+ const out = [];
122
+ for (const [variable, value] of Object.entries(vars)) {
123
+ for (const r of wiringReads({ [variable]: value }, {}))
124
+ out.push({ variable, upstream: r.source, output: r.ref.slice(r.source.length + 1) });
125
+ }
126
+ return out;
127
+ }
128
+ /** Every component another reads or depends on, from any step's wiring and its `dependsOn`, plus the HCL reads between roots. */
129
+ function dependencyGraph(components, hcl) {
130
+ const names = new Set(components.map((c) => c.name));
131
+ const out = new Map();
132
+ for (const c of components) {
133
+ const deps = new Set((c.dependsOn ?? []).filter((d) => names.has(d)));
134
+ for (const step of leafSteps(c.deploy)) {
135
+ for (const r of wiringReads(step, {}))
136
+ if (names.has(r.source) && r.source !== c.name)
137
+ deps.add(r.source);
138
+ }
139
+ for (const r of hcl.get(c.name) ?? [])
140
+ deps.add(r.upstream);
141
+ out.set(c.name, deps);
142
+ }
143
+ return out;
144
+ }
145
+ /** Each root component's HCL reads of another root component. */
146
+ function hclReads(rcs) {
147
+ const out = new Map();
148
+ for (const r of rcs) {
149
+ const reads = [];
150
+ if (r.state && r.dir) {
151
+ for (const read of r.state.reads) {
152
+ for (const o of rcs)
153
+ if (o.name !== r.name && o.state?.own && sameState(o.state.own, read))
154
+ reads.push({ via: "remote-state", upstream: o.name, name: read.name });
155
+ }
156
+ for (const read of estateOutputReads(r.dir, r.binary)) {
157
+ for (const o of rcs)
158
+ if (o.name !== r.name && o.estate === read.estate)
159
+ reads.push({ via: "estate-outputs", upstream: o.name, name: read.name });
160
+ }
161
+ }
162
+ out.set(r.name, reads);
163
+ }
164
+ return out;
165
+ }
166
+ /** Every component of `input` that deploys a root, its files read once. */
167
+ function rootComponents(input) {
168
+ const tf = input.terraform;
169
+ const projectRoot = resolve(input.projectRoot);
170
+ const rcs = [];
171
+ for (const c of input.components) {
172
+ const steps = leafSteps(c.deploy);
173
+ const step = steps.find((s) => s.kind === COMPOSE_STEP_KIND);
174
+ if (!step)
175
+ continue;
176
+ const root = typeof step.root === "string" ? step.root : undefined;
177
+ const config = root !== undefined ? tf.roots[root] : undefined;
178
+ const rc = { name: c.name, step, steps: steps.length, live: false, ...(root !== undefined ? { root } : {}) };
179
+ if (config && step.cwd === undefined) {
180
+ const dir = isAbsolute(config.dir) ? config.dir : resolve(projectRoot, config.dir);
181
+ const rel = relPath(projectRoot, dir);
182
+ const binary = tf.binary;
183
+ const live = liveEstate(dir, binary ?? "terraform");
184
+ const estate = config.estate ?? live.estate;
185
+ // The state address from the one backend verdict (chant#4478): the code, TF_CLI_ARGS*, the backend-config files and pairs, and what init recorded.
186
+ const state = rootState(dir, rel, {
187
+ ...(input.env ? { env: input.env } : {}),
188
+ ...(binary ? { binary } : {}),
189
+ ...(config.backendConfig ? { backendConfig: config.backendConfig } : {}),
190
+ ...(config.backendConfigFiles ? { backendConfigFiles: config.backendConfigFiles } : {}),
191
+ });
192
+ Object.assign(rc, { config, dir, rel, state, live: live.live, ...(estate ? { estate } : {}), ...(binary ? { binary } : {}) });
193
+ }
194
+ rcs.push(rc);
195
+ }
196
+ return rcs;
197
+ }
198
+ /**
199
+ * Each component's `terraform_remote_state` and `terraform_estate_outputs`
200
+ * reads of another component of `input` that deploys a root, as the
201
+ * composition finds them (#4447): what `terraform-apply`'s `groupReads`
202
+ * reports to core. Components with no such read are left out.
203
+ */
204
+ export function rootHclReads(input) {
205
+ return new Map([...hclReads(rootComponents(input))].filter(([, reads]) => reads.length > 0));
206
+ }
207
+ const readKey = (r) => `${r.upstream}\0${r.via}\0${r.via === "vars" ? `${r.variable}\0${r.output}` : r.name}`;
208
+ // ── the composition ───────────────────────────────────────────────────────
209
+ /** `TF_CLI_ARGS*` flags a composed run cannot take: their addresses name a root's resources without the module in front, and `-var` names no root. */
210
+ const CLI_REFUSED = /(^|\s)-{1,2}(target|exclude|replace|var)(=|\s|$)/;
211
+ /**
212
+ * The `off` fallback when `terraform.compose` is not enabled, else undefined:
213
+ * what `terraform-apply`'s `groupFallback` answers first (ws-107).
214
+ */
215
+ export function composeOff(terraform) {
216
+ return terraform.compose?.enabled === true ? undefined : { kind: "off", reason: "`terraform.compose` is not enabled" };
217
+ }
218
+ /**
219
+ * The composition when `terraform.compose.enabled` is set, else undefined
220
+ * without reading anything. The only caller of {@link compositionFor} a run
221
+ * should use.
222
+ */
223
+ export function compositionIfEnabled(input) {
224
+ if (input.terraform.compose?.enabled !== true)
225
+ return undefined;
226
+ return compositionFor(input);
227
+ }
228
+ /**
229
+ * What `terraform.compose` comes to for a change: the members, their order,
230
+ * modules and reads, each candidate left out with its reason, or why nothing
231
+ * composes. Per-member checks run first (root, steps, targets, binary,
232
+ * backend, identity, provider lock, reads, imports and paths, order, split);
233
+ * a member left out gets the first that applies to it. `cli-args`,
234
+ * `too-many-roots` and `one-root` then judge what is left as a whole.
235
+ */
236
+ export function compositionFor(input) {
237
+ const tf = input.terraform;
238
+ const max = tf.compose?.max ?? DEFAULT_COMPOSE_MAX;
239
+ const projectRoot = resolve(input.projectRoot);
240
+ const byName = new Map(input.components.map((c) => [c.name, c]));
241
+ const rcs = rootComponents(input);
242
+ const rcOf = new Map(rcs.map((r) => [r.name, r]));
243
+ const hcl = hclReads(rcs);
244
+ const graph = dependencyGraph(input.components, hcl);
245
+ const candidates = composeSet(rcs.map((r) => r.name), input.selected, graph);
246
+ const roots = new Map(candidates.flatMap((m) => (rcOf.get(m).root !== undefined ? [[m, rcOf.get(m).root]] : [])));
247
+ const dirs = new Map(candidates.flatMap((m) => (rcOf.get(m).dir ? [[m, rcOf.get(m).dir]] : [])));
248
+ // Each member's reads of every other candidate; narrowed to members at the end.
249
+ const allReads = new Map();
250
+ for (const m of candidates) {
251
+ const rc = rcOf.get(m);
252
+ const reads = [...varsReads(rc.step).map((r) => ({ via: "vars", ...r })), ...(hcl.get(m) ?? [])];
253
+ allReads.set(m, reads.filter((r) => r.upstream !== m && rcOf.has(r.upstream)));
254
+ }
255
+ const left = new Map();
256
+ let members = [...candidates];
257
+ const drop = (m, kind, reason) => {
258
+ left.set(m, { kind, member: m, reason });
259
+ members = members.filter((x) => x !== m);
260
+ };
261
+ const each = (check) => {
262
+ for (const m of [...members]) {
263
+ const hit = check(m, rcOf.get(m));
264
+ if (hit)
265
+ drop(m, hit[0], hit[1]);
266
+ }
267
+ };
268
+ // Where the root is, and that its deploy is that one step.
269
+ each((m, rc) => {
270
+ if (rc.root === undefined)
271
+ return ["path", `\`${m}\`'s terraform-apply step names no \`root\``];
272
+ if (rc.step.cwd !== undefined)
273
+ return ["path", `\`${m}\`'s terraform-apply step sets \`cwd\`, so its root is read from another chant.config`];
274
+ if (!rc.config)
275
+ return ["path", `\`${m}\` deploys root \`${rc.root}\`, which \`terraform.roots\` does not list`];
276
+ return undefined;
277
+ });
278
+ const rootTaken = new Map();
279
+ each((m, rc) => {
280
+ const had = rootTaken.get(rc.root);
281
+ if (had)
282
+ return ["same-root", `\`${m}\` deploys root \`${rc.root}\`, which \`${had}\` deploys too, and a composed run calls each root once`];
283
+ rootTaken.set(rc.root, m);
284
+ return undefined;
285
+ });
286
+ each((m, rc) => rc.steps !== 1 ? ["steps", `\`${m}\`'s deploy has ${plural(rc.steps, "step")}, and only a component whose deploy is one terraform-apply step composes`] : undefined);
287
+ each((m) => {
288
+ const t = input.targets?.[m] ?? [];
289
+ return t.length > 0 ? ["targets", `\`${m}\` is given ${plural(t.length, "target")} (\`--target\`), and a composed run plans each member whole`] : undefined;
290
+ });
291
+ // One binary process: one binary at one version.
292
+ const binaryOf = (m) => input.binary?.(m) ?? { name: tf.binary ?? "terraform" };
293
+ const binName = (b) => `${b.name}${b.version ? ` ${b.version}` : ""}`;
294
+ const binRef = majority(members, (m) => binName(binaryOf(m)));
295
+ each((m) => {
296
+ if (!binRef || binName(binaryOf(m)) === binRef.key)
297
+ return undefined;
298
+ return ["binary", `\`${m}\` runs ${binName(binaryOf(m))} and \`${binRef.first}\` ${binRef.key}, and one run has one binary`];
299
+ });
300
+ // Every member runs choudoufu and one has a `live` block: the members compose as estates (choudoufu#2059).
301
+ const estate = members.length > 1 && members.every((m) => binaryOf(m).name === "choudoufu") && members.some((m) => rcOf.get(m).live);
302
+ each((m, rc) => {
303
+ if (estate)
304
+ return rc.live ? undefined : ["backend", `\`${m}\` has no \`live\` block, and a composed run of estates calls only directories that carry one`];
305
+ const ws = rc.config.workspace;
306
+ if (ws && ws !== "default")
307
+ return ["workspace", `\`${m}\` plans in workspace ${ws}, and a composed run plans in default`];
308
+ // The one backend verdict (chant#4478): the code and flags before init, compared with what init recorded after.
309
+ const refusal = lockRefusal(readBackend(rc.dir, {
310
+ env: input.env,
311
+ ...(rc.binary ? { binary: rc.binary } : {}),
312
+ ...(rc.config.backendConfig ? { backendConfig: rc.config.backendConfig } : {}),
313
+ ...(rc.config.backendConfigFiles ? { backendConfigFiles: rc.config.backendConfigFiles } : {}),
314
+ }));
315
+ if (refusal)
316
+ return ["backend", `\`${m}\`: ${refusal.reason}`];
317
+ return undefined;
318
+ });
319
+ // One binary process has one set of credentials. Estates take each one's role from its own provider blocks.
320
+ if (!estate && input.identity) {
321
+ const idOf = (m) => input.identity(m) ?? "";
322
+ const idRef = majority(members, idOf);
323
+ each((m) => {
324
+ if (!idRef || idOf(m) === idRef.key)
325
+ return undefined;
326
+ const same = members.filter((x) => idOf(x) === idRef.key);
327
+ return ["identity", `\`${m}\` applies under another cloud identity (\`ci.identity.cloud\`) than ${list(same)}, and one run has one set of credentials`];
328
+ });
329
+ }
330
+ // One run installs one version of each provider: the first member in name order to lock it sets it.
331
+ const locked = new Map();
332
+ each((m, rc) => {
333
+ const mine = lockedProviders(rc.dir);
334
+ for (const [p, v] of mine) {
335
+ const had = locked.get(p);
336
+ if (had && had.version !== v)
337
+ return ["provider-lock", `\`${m}\` locks ${p} at ${v} and \`${had.member}\` at ${had.version}, and one run installs one version`];
338
+ }
339
+ for (const [p, v] of mine)
340
+ if (!locked.has(p))
341
+ locked.set(p, { version: v, member: m });
342
+ return undefined;
343
+ });
344
+ // Reads a composed root cannot rewrite.
345
+ each((m, rc) => {
346
+ for (const r of allReads.get(m) ?? []) {
347
+ if (r.via !== "remote-state" || !members.includes(r.upstream))
348
+ continue;
349
+ if (rc.state.reads.find((x) => x.name === r.name)?.repeated) {
350
+ return ["read", `\`${m}\` reads \`${r.upstream}\` through a block with count or for_each (\`data.terraform_remote_state.${r.name}\`)`];
351
+ }
352
+ }
353
+ for (const mod of localModules(rc.dir, rc.binary)) {
354
+ const modRel = relPath(projectRoot, mod);
355
+ for (const read of rootState(mod, modRel, { recorded: null, env: {}, ...(rc.binary ? { binary: rc.binary } : {}) }).reads) {
356
+ const up = members.find((o) => o !== m && rcOf.get(o).state?.own && sameState(rcOf.get(o).state.own, read));
357
+ if (up)
358
+ return ["read", `\`${m}\` reads \`${up}\` from its module \`${modRel}\`, and a composed run rewrites only a root's own reads`];
359
+ }
360
+ }
361
+ return undefined;
362
+ });
363
+ // What a module call cannot carry.
364
+ each((m, rc) => {
365
+ for (const t of rootTexts(rc.dir, rc.binary)) {
366
+ if (t.json) {
367
+ if (jsonImportRefused(t.text))
368
+ return ["import", `an \`import\` block of \`${m}\` takes no literal string \`id\`, so it cannot be lifted into the composed root`];
369
+ continue;
370
+ }
371
+ for (const im of t.text.matchAll(/(^|\n)\s*import\s*\{/g)) {
372
+ if (!importLiteral(blockBody(t.text, im.index + im[1].length))) {
373
+ return ["import", `an \`import\` block of \`${m}\` takes no literal string \`id\`, so it cannot be lifted into the composed root`];
374
+ }
375
+ }
376
+ if (/\bpath\.(root|cwd)\b/.test(t.text))
377
+ return ["path", `\`${m}\` uses \`path.root\` or \`path.cwd\`, which would name the composed root instead of \`${rc.rel}\``];
378
+ }
379
+ return undefined;
380
+ });
381
+ // An order with no read: a module with its own providers takes no depends_on.
382
+ each((m) => {
383
+ const reads = new Set((allReads.get(m) ?? []).map((r) => r.upstream));
384
+ const u = (byName.get(m)?.dependsOn ?? []).find((d) => members.includes(d) && !reads.has(d));
385
+ return u ? ["order-only", `\`${m}\` depends on \`${u}\` (\`dependsOn\`) with no read between them, and a module with its own providers takes no depends_on`] : undefined;
386
+ });
387
+ // A component outside the run on a path between two members splits them (#4419 ruling 2): the one after it leaves.
388
+ for (let moved = true; moved;) {
389
+ moved = false;
390
+ for (const m of [...members]) {
391
+ const hit = pathOutside(m, members, graph);
392
+ if (!hit)
393
+ continue;
394
+ const via = byName.get(hit.via);
395
+ const what = rcOf.has(hit.via) ? "which is left out of the composed run and applies between them" : `a ${via ? kindOf(via) : "other"} component that applies between them`;
396
+ drop(m, "split", `\`${m}\` depends on \`${hit.member}\` through \`${hit.via}\`, ${what}`);
397
+ moved = true;
398
+ break;
399
+ }
400
+ }
401
+ const fallbacks = candidates.flatMap((m) => (left.has(m) ? [left.get(m)] : []));
402
+ const base = { candidates, max, roots, dirs, fallbacks, ...(tf.binary ? { binary: tf.binary } : {}) };
403
+ const none = (fallback) => ({ ...base, members: [], order: [], modules: new Map(), reads: new Map(), fallback });
404
+ if (members.length >= 2) {
405
+ for (const k of ["TF_CLI_ARGS", "TF_CLI_ARGS_plan", "TF_CLI_ARGS_apply"]) {
406
+ const cli = (input.env[k] ?? "").match(CLI_REFUSED);
407
+ if (cli)
408
+ return none({ kind: "cli-args", reason: `\`${k}\` carries \`-${cli[2]}\`, which names a root's own addresses or variables, not the composed run's` });
409
+ }
410
+ }
411
+ if (members.length > max)
412
+ return none({ kind: "too-many-roots", reason: `this change composes ${plural(members.length, "root")}, more than \`terraform.compose.max\` (${max})` });
413
+ if (members.length <= 1) {
414
+ if (candidates.length === 0)
415
+ return none({ kind: "one-root", reason: "this change reaches no root" });
416
+ if (candidates.length === 1)
417
+ return none({ kind: "one-root", member: candidates[0], reason: `this change reaches one root, \`${candidates[0]}\`, which applies in its own run` });
418
+ return none({
419
+ kind: "one-root",
420
+ ...(members[0] ? { member: members[0] } : {}),
421
+ reason: members.length === 0 ? "no root of this change can compose" : `only \`${members[0]}\` of this change can compose, and one root applies in its own run`,
422
+ });
423
+ }
424
+ const inGroup = new Map(members.map((m) => [m, new Set([...(graph.get(m) ?? [])].filter((u) => members.includes(u)))]));
425
+ const order = readOrder(members, inGroup);
426
+ const names = moduleNames(members.map((m) => roots.get(m)));
427
+ const modules = new Map(members.map((m) => [m, names.get(roots.get(m))]));
428
+ const reads = new Map(members.map((m) => {
429
+ const seen = new Map();
430
+ for (const r of allReads.get(m) ?? [])
431
+ if (members.includes(r.upstream))
432
+ seen.set(readKey(r), r);
433
+ return [m, [...seen.entries()].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)).map(([, r]) => r)];
434
+ }));
435
+ return { ...base, members, order, modules, reads, ...(estate ? { estate } : {}) };
436
+ }
437
+ /** The value most members share, and the first member in name order that has it; a tie goes to the value the earliest member has. */
438
+ function majority(members, key) {
439
+ const groups = new Map();
440
+ for (const m of [...members].sort())
441
+ groups.set(key(m), [...(groups.get(key(m)) ?? []), m]);
442
+ let best;
443
+ for (const [k, ms] of groups)
444
+ if (!best || ms.length > best.n)
445
+ best = { key: k, first: ms[0], n: ms.length };
446
+ return best ? { key: best.key, first: best.first } : undefined;
447
+ }
448
+ /**
449
+ * A member that `m` depends on through a component that is not a member,
450
+ * and the first such component on the way, or undefined. Paths through
451
+ * another member stop there: that member is checked on its own.
452
+ */
453
+ function pathOutside(m, members, graph) {
454
+ const seen = new Set();
455
+ const stack = [...(graph.get(m) ?? [])].sort().map((at) => ({ at }));
456
+ while (stack.length > 0) {
457
+ const { at, via } = stack.shift();
458
+ const key = `${at}\0${via ?? ""}`;
459
+ if (seen.has(key) || at === m)
460
+ continue;
461
+ seen.add(key);
462
+ if (members.includes(at)) {
463
+ if (via)
464
+ return { member: at, via };
465
+ continue;
466
+ }
467
+ for (const u of [...(graph.get(at) ?? [])].sort())
468
+ stack.push({ at: u, via: via ?? at });
469
+ }
470
+ return undefined;
471
+ }
472
+ /** The composition with its plan failed: nothing composes, and each member plans wave by wave. */
473
+ export function withPlanFailed(c, message) {
474
+ const first = message.trim().split("\n")[0] ?? "";
475
+ return { ...c, members: [], order: [], modules: new Map(), reads: new Map(), fallback: { kind: "plan-failed", reason: `the composed plan failed${first ? `: ${first}` : ""}` } };
476
+ }
477
+ /** The one line a note, a log and the report say for a fallback: the whole change's, or one member's. */
478
+ export function fallbackLine(f) {
479
+ return f.member !== undefined && f.kind !== "one-root"
480
+ ? `**\`${f.member}\` applies in waves** (\`terraform.compose\`): ${f.reason}.`
481
+ : `**Applies in waves** (\`terraform.compose\`): ${f.reason}.`;
482
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"terraform-apply-op.d.ts","sourceRoot":"","sources":["../../src/composites/terraform-apply-op.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFG;AAEH,OAAO,EAA6B,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAW/F;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACrC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,+GAA+G;IAC/G,IAAI,EAAE,MAAM,CAAC;IACb,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,qGAAqG;QACrG,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,mEAAmE;IACnE,EAAE,EAAE,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;CACrC;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,yBAAyB,CAkH1F"}
1
+ {"version":3,"file":"terraform-apply-op.d.ts","sourceRoot":"","sources":["../../src/composites/terraform-apply-op.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFG;AAEH,OAAO,EAA6B,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAW/F;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACrC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,+GAA+G;IAC/G,IAAI,EAAE,MAAM,CAAC;IACb,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,qGAAqG;QACrG,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,mEAAmE;IACnE,EAAE,EAAE,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;CACrC;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,yBAAyB,CAsH1F"}
@@ -130,9 +130,13 @@ export function TerraformApplyOp(config) {
130
130
  "answer instead of the account's.");
131
131
  }
132
132
  }
133
- const phases = [
134
- phase("Init", [initStep(config.root, { ...where, ...(config.upgrade ? { upgrade: true } : {}) })]),
135
- ];
133
+ // The Init step names the root's directory in the workspace (chant#4482),
134
+ // so a read of the run ledger can tell which member's root this run applied
135
+ // when the Op is declared in another member: `chant ledger runs`'s
136
+ // `root_member` column comes from this outcome.
137
+ const init = initStep(config.root, { ...where, ...(config.upgrade ? { upgrade: true } : {}) });
138
+ init.outcomeAttribute = { name: "TerraformRootPath", from: "rootPath" };
139
+ const phases = [phase("Init", [init])];
136
140
  // `id` is what makes `plan.out` legal, and `plan.out.planFile` is how the
137
141
  // Apply step below names this step's saved plan. On a live root that file
138
142
  // is also the approval artifact the apply re-plans against, so the same
package/dist/cone.d.ts ADDED
@@ -0,0 +1,53 @@
1
+ /** The flags choudoufu refuses beside `-cone`, or plans in full with: a plan that carries one gets no `-cone`. */
2
+ export declare const CONE_EXCLUDES: readonly ["-target", "-exclude", "-destroy", "-refresh-only", "-json", "-estate"];
3
+ /** What choudoufu writes beside a saved cone plan, `FILE.cone.json`. */
4
+ export interface ConeRecord {
5
+ base: string;
6
+ base_sha: string;
7
+ targets: string[];
8
+ }
9
+ /** What one root's cone plan did: planned the cone, or planned the whole estate for the guard's reason. */
10
+ export interface PlanCone {
11
+ /** The revision the plan was asked to measure the change from. */
12
+ base: string;
13
+ /** With a cone: its blocks, and the estate's, as choudoufu counted them. Absent when it did not say. */
14
+ blocks?: number;
15
+ of?: number;
16
+ /** With a cone: the record beside the plan file. */
17
+ record?: ConeRecord;
18
+ /** The guard planned the whole estate: its kind and why. */
19
+ fallback?: {
20
+ kind: string;
21
+ reason: string;
22
+ };
23
+ }
24
+ /** Whether `binary` (a name or a path) is choudoufu. */
25
+ export declare const isChoudoufu: (binary: string) => boolean;
26
+ /**
27
+ * The `-cone` argument a plan takes: `-cone=<base>` for choudoufu with a
28
+ * base, on a root that takes it (`live`), when none of `args` is a flag in
29
+ * {@link CONE_EXCLUDES}. Otherwise none, and the plan is full.
30
+ */
31
+ export declare function coneArgs(binary: string, base: string | undefined, args: readonly string[], cone: boolean): string[];
32
+ /** The path of the cone record beside a plan file. */
33
+ export declare const coneRecordPath: (planFile: string) => string;
34
+ /** The cone record beside `planFile`, or none when there is none or it does not read as one. */
35
+ export declare function readConeRecord(planFile: string): ConeRecord | undefined;
36
+ /**
37
+ * What a plan run with `-cone=<base>` did, from its output and the record
38
+ * beside `planFile`. A fallback warning means the whole estate was planned,
39
+ * even after a cone warning. With no fallback, the record is the cone. With
40
+ * neither, choudoufu said nothing this reads, and the plan counts as full.
41
+ */
42
+ export declare function readPlanCone(output: string, planFile: string, base: string): PlanCone;
43
+ /** What a cone plan did, in words: its size, or why it planned the whole estate. */
44
+ export declare function coneText(cone: PlanCone): string;
45
+ /**
46
+ * A root's plan digest with its cone in it: the plan's own digest, unchanged,
47
+ * when the plan was full; with a cone, the digest over the plan's digest and
48
+ * the cone's targets, so an approval of one cone counts for no other. The
49
+ * digest's kind is terragucci's, so approvals recorded before the move still
50
+ * name the same digest.
51
+ */
52
+ export declare function conePlanDigest(planDigest: string, cone: PlanCone | undefined): string;
53
+ //# sourceMappingURL=cone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cone.d.ts","sourceRoot":"","sources":["../src/cone.ts"],"names":[],"mappings":"AA4BA,kHAAkH;AAClH,eAAO,MAAM,aAAa,YAAI,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,CAAU,CAAC;AAE/G,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,2GAA2G;AAC3G,MAAM,WAAW,QAAQ;IACvB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,wGAAwG;IACxG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED,wDAAwD;AACxD,eAAO,MAAM,WAAW,WAAY,MAAM,KAAG,OAA2C,CAAC;AAEzF;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CAInH;AAED,sDAAsD;AACtD,eAAO,MAAM,cAAc,aAAc,MAAM,KAAG,MAAiC,CAAC;AAEpF,gGAAgG;AAChG,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAUvE;AAsBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAUrF;AAED,oFAAoF;AACpF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAK/C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAGrF"}