@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.
- package/README.md +14 -10
- package/dist/__fixtures__/pr-loop/estate.component.d.ts +7 -0
- package/dist/__fixtures__/pr-loop/estate.component.d.ts.map +1 -0
- package/dist/__fixtures__/pr-loop/estate.component.js +7 -0
- package/dist/__fixtures__/report/generate.d.ts +26 -0
- package/dist/__fixtures__/report/generate.d.ts.map +1 -0
- package/dist/__fixtures__/report/generate.js +58 -0
- package/dist/applied-state.d.ts +27 -0
- package/dist/applied-state.d.ts.map +1 -0
- package/dist/applied-state.js +44 -0
- package/dist/backend-config.d.ts +53 -0
- package/dist/backend-config.d.ts.map +1 -0
- package/dist/backend-config.js +136 -0
- package/dist/behaviour/kinds.d.ts.map +1 -1
- package/dist/behaviour/kinds.js +4 -0
- package/dist/behaviour/predict.d.ts.map +1 -1
- package/dist/behaviour/predict.js +6 -2
- package/dist/behaviour/reference-catalog.d.ts +16 -5
- package/dist/behaviour/reference-catalog.d.ts.map +1 -1
- package/dist/behaviour/reference-catalog.js +16 -5
- package/dist/behaviour/request.d.ts.map +1 -1
- package/dist/behaviour/request.js +3 -2
- package/dist/changed-roots.d.ts +6 -4
- package/dist/changed-roots.d.ts.map +1 -1
- package/dist/changed-roots.js +14 -18
- package/dist/ci-setup.d.ts +11 -0
- package/dist/ci-setup.d.ts.map +1 -0
- package/dist/ci-setup.js +41 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +4 -3
- package/dist/components/capability-plugin.d.ts +105 -9
- package/dist/components/capability-plugin.d.ts.map +1 -1
- package/dist/components/capability-plugin.js +357 -36
- package/dist/components/compose-group.d.ts +145 -0
- package/dist/components/compose-group.d.ts.map +1 -0
- package/dist/components/compose-group.js +407 -0
- package/dist/components/placeholder-preview.d.ts +78 -0
- package/dist/components/placeholder-preview.d.ts.map +1 -0
- package/dist/components/placeholder-preview.js +254 -0
- package/dist/components/release-inputs.d.ts +29 -0
- package/dist/components/release-inputs.d.ts.map +1 -0
- package/dist/components/release-inputs.js +57 -0
- package/dist/components/trace-facts.d.ts +16 -0
- package/dist/components/trace-facts.d.ts.map +1 -0
- package/dist/components/trace-facts.js +19 -0
- package/dist/compose/apply-events.d.ts +46 -0
- package/dist/compose/apply-events.d.ts.map +1 -0
- package/dist/compose/apply-events.js +77 -0
- package/dist/compose/estate.d.ts +194 -0
- package/dist/compose/estate.d.ts.map +1 -0
- package/dist/compose/estate.js +363 -0
- package/dist/compose/hcl.d.ts +99 -0
- package/dist/compose/hcl.d.ts.map +1 -0
- package/dist/compose/hcl.js +302 -0
- package/dist/compose/module-address.d.ts +24 -0
- package/dist/compose/module-address.d.ts.map +1 -0
- package/dist/compose/module-address.js +43 -0
- package/dist/compose/root.d.ts +127 -0
- package/dist/compose/root.d.ts.map +1 -0
- package/dist/compose/root.js +586 -0
- package/dist/compose/run.d.ts +183 -0
- package/dist/compose/run.d.ts.map +1 -0
- package/dist/compose/run.js +447 -0
- package/dist/compose/slice.d.ts +102 -0
- package/dist/compose/slice.d.ts.map +1 -0
- package/dist/compose/slice.js +249 -0
- package/dist/compose/state-address.d.ts +28 -0
- package/dist/compose/state-address.d.ts.map +1 -0
- package/dist/compose/state-address.js +154 -0
- package/dist/compose/state-merge.d.ts +52 -0
- package/dist/compose/state-merge.d.ts.map +1 -0
- package/dist/compose/state-merge.js +135 -0
- package/dist/compose.d.ts +179 -0
- package/dist/compose.d.ts.map +1 -0
- package/dist/compose.js +482 -0
- package/dist/composites/terraform-apply-op.d.ts.map +1 -1
- package/dist/composites/terraform-apply-op.js +7 -3
- package/dist/cone.d.ts +53 -0
- package/dist/cone.d.ts.map +1 -0
- package/dist/cone.js +119 -0
- package/dist/config.d.ts +59 -13
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +43 -9
- package/dist/cost-hold.d.ts +27 -0
- package/dist/cost-hold.d.ts.map +1 -0
- package/dist/cost-hold.js +21 -0
- package/dist/describe-resources.d.ts +74 -12
- package/dist/describe-resources.d.ts.map +1 -1
- package/dist/describe-resources.js +374 -66
- package/dist/drift-read.d.ts +33 -0
- package/dist/drift-read.d.ts.map +1 -0
- package/dist/drift-read.js +243 -0
- package/dist/drift-record.d.ts +147 -0
- package/dist/drift-record.d.ts.map +1 -0
- package/dist/drift-record.js +383 -0
- package/dist/drift-rows.d.ts +61 -0
- package/dist/drift-rows.d.ts.map +1 -0
- package/dist/drift-rows.js +108 -0
- package/dist/exit-codes.d.ts +55 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +48 -0
- package/dist/hcl/edges.d.ts.map +1 -1
- package/dist/hcl/edges.js +24 -1
- package/dist/hcl/files.d.ts +61 -0
- package/dist/hcl/files.d.ts.map +1 -0
- package/dist/hcl/files.js +221 -0
- package/dist/hcl/instances.d.ts +82 -0
- package/dist/hcl/instances.d.ts.map +1 -0
- package/dist/hcl/instances.js +390 -0
- package/dist/hcl/parse.d.ts +81 -9
- package/dist/hcl/parse.d.ts.map +1 -1
- package/dist/hcl/parse.js +114 -16
- package/dist/hcl/roots.d.ts.map +1 -1
- package/dist/hcl/roots.js +5 -0
- package/dist/hcl/suppressions.d.ts.map +1 -1
- package/dist/hcl/suppressions.js +8 -2
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -2
- package/dist/integrity.json +8 -5
- package/dist/lint/audit-catalog.d.ts.map +1 -1
- package/dist/lint/audit-catalog.js +27 -3
- package/dist/lint/audit-lineage.d.ts +14 -2
- package/dist/lint/audit-lineage.d.ts.map +1 -1
- package/dist/lint/post-synth/index.d.ts.map +1 -1
- package/dist/lint/post-synth/index.js +4 -0
- package/dist/lint/post-synth/record-store.d.ts +54 -0
- package/dist/lint/post-synth/record-store.d.ts.map +1 -0
- package/dist/lint/post-synth/record-store.js +104 -0
- package/dist/lint/post-synth/tf001.d.ts +2 -2
- package/dist/lint/post-synth/tf001.js +2 -2
- package/dist/lint/post-synth/tf024.d.ts +35 -11
- package/dist/lint/post-synth/tf024.d.ts.map +1 -1
- package/dist/lint/post-synth/tf024.js +92 -20
- package/dist/lint/post-synth/tf046.d.ts +64 -0
- package/dist/lint/post-synth/tf046.d.ts.map +1 -0
- package/dist/lint/post-synth/tf046.js +175 -0
- package/dist/lint/post-synth/tf047.d.ts +36 -0
- package/dist/lint/post-synth/tf047.d.ts.map +1 -0
- package/dist/lint/post-synth/tf047.js +94 -0
- package/dist/live-plan-reasons.d.ts +21 -0
- package/dist/live-plan-reasons.d.ts.map +1 -0
- package/dist/live-plan-reasons.js +47 -0
- package/dist/lock-rows.d.ts +36 -0
- package/dist/lock-rows.d.ts.map +1 -0
- package/dist/lock-rows.js +60 -0
- package/dist/lock-timeout.d.ts +22 -0
- package/dist/lock-timeout.d.ts.map +1 -0
- package/dist/lock-timeout.js +32 -0
- package/dist/lsp/option-keys.d.ts.map +1 -1
- package/dist/lsp/option-keys.js +2 -0
- package/dist/manifest.json +1 -1
- package/dist/module-catalog/index.d.ts +69 -0
- package/dist/module-catalog/index.d.ts.map +1 -0
- package/dist/module-catalog/index.js +110 -0
- package/dist/module-catalog/refresh-cli.d.ts +4 -0
- package/dist/module-catalog/refresh-cli.d.ts.map +1 -0
- package/dist/module-catalog/refresh-cli.js +64 -0
- package/dist/module-catalog/static-tier.d.ts +6 -0
- package/dist/module-catalog/static-tier.d.ts.map +1 -0
- package/dist/module-catalog/static-tier.js +1650 -0
- package/dist/module-catalog/types.d.ts +65 -0
- package/dist/module-catalog/types.d.ts.map +1 -0
- package/dist/module-catalog/types.js +33 -0
- package/dist/okf/index.md +3 -1
- package/dist/okf/rules/TF024.md +2 -2
- package/dist/okf/rules/TF046.md +11 -0
- package/dist/okf/rules/TF047.md +11 -0
- package/dist/op/activities/index.d.ts +6 -2
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/index.js +5 -1
- package/dist/op/activities/live-detect.d.ts +4 -3
- package/dist/op/activities/live-detect.d.ts.map +1 -1
- package/dist/op/activities/live-detect.js +57 -32
- package/dist/op/activities/pin-rollout.d.ts +2 -0
- package/dist/op/activities/pin-rollout.d.ts.map +1 -1
- package/dist/op/activities/pin-rollout.js +1 -0
- package/dist/op/activities/terraform.d.ts +182 -5
- package/dist/op/activities/terraform.d.ts.map +1 -1
- package/dist/op/activities/terraform.js +224 -24
- package/dist/op/activity-contracts.d.ts +27 -0
- package/dist/op/activity-contracts.d.ts.map +1 -1
- package/dist/op/activity-contracts.js +19 -1
- package/dist/op/builders.d.ts +7 -1
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +9 -0
- package/dist/pin/consumers.d.ts +35 -0
- package/dist/pin/consumers.d.ts.map +1 -0
- package/dist/pin/consumers.js +70 -0
- package/dist/pin/edit.d.ts.map +1 -1
- package/dist/pin/edit.js +35 -0
- package/dist/pin/rollout.d.ts +2 -0
- package/dist/pin/rollout.d.ts.map +1 -1
- package/dist/pin/rollout.js +14 -11
- package/dist/plan-shape.d.ts +30 -0
- package/dist/plan-shape.d.ts.map +1 -0
- package/dist/plan-shape.js +125 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +37 -18
- package/dist/registry/address.d.ts +63 -0
- package/dist/registry/address.d.ts.map +1 -0
- package/dist/registry/address.js +65 -0
- package/dist/registry/catalog-read.d.ts +14 -0
- package/dist/registry/catalog-read.d.ts.map +1 -0
- package/dist/registry/catalog-read.js +58 -0
- package/dist/registry/deprecated.d.ts +37 -0
- package/dist/registry/deprecated.d.ts.map +1 -0
- package/dist/registry/deprecated.js +43 -0
- package/dist/registry/docs.d.ts +96 -0
- package/dist/registry/docs.d.ts.map +1 -0
- package/dist/registry/docs.js +210 -0
- package/dist/registry/edge/edge.d.ts +46 -0
- package/dist/registry/edge/edge.d.ts.map +1 -0
- package/dist/registry/edge/edge.js +194 -0
- package/dist/registry/edge/index.d.ts +11 -0
- package/dist/registry/edge/index.d.ts.map +1 -0
- package/dist/registry/edge/index.js +10 -0
- package/dist/registry/edge/lambda-edge.d.ts +76 -0
- package/dist/registry/edge/lambda-edge.d.ts.map +1 -0
- package/dist/registry/edge/lambda-edge.js +95 -0
- package/dist/registry/edge/sigv4-web.d.ts +33 -0
- package/dist/registry/edge/sigv4-web.d.ts.map +1 -0
- package/dist/registry/edge/sigv4-web.js +56 -0
- package/dist/registry/edge/token-source.d.ts +73 -0
- package/dist/registry/edge/token-source.d.ts.map +1 -0
- package/dist/registry/edge/token-source.js +115 -0
- package/dist/registry/edge/worker.d.ts +45 -0
- package/dist/registry/edge/worker.d.ts.map +1 -0
- package/dist/registry/edge/worker.js +26 -0
- package/dist/registry/handler.d.ts +25 -0
- package/dist/registry/handler.d.ts.map +1 -0
- package/dist/registry/handler.js +75 -0
- package/dist/registry/headers-file.d.ts +21 -0
- package/dist/registry/headers-file.d.ts.map +1 -0
- package/dist/registry/headers-file.js +57 -0
- package/dist/registry/index.d.ts +31 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +30 -0
- package/dist/registry/mirror-paths.d.ts +9 -0
- package/dist/registry/mirror-paths.d.ts.map +1 -0
- package/dist/registry/mirror-paths.js +8 -0
- package/dist/registry/mirror.d.ts +130 -0
- package/dist/registry/mirror.d.ts.map +1 -0
- package/dist/registry/mirror.js +319 -0
- package/dist/registry/proxies.d.ts +73 -0
- package/dist/registry/proxies.d.ts.map +1 -0
- package/dist/registry/proxies.js +111 -0
- package/dist/registry/reader.d.ts +57 -0
- package/dist/registry/reader.d.ts.map +1 -0
- package/dist/registry/reader.js +198 -0
- package/dist/registry/semver.d.ts +16 -0
- package/dist/registry/semver.d.ts.map +1 -0
- package/dist/registry/semver.js +24 -0
- package/dist/registry/serve.d.ts +24 -0
- package/dist/registry/serve.d.ts.map +1 -0
- package/dist/registry/serve.js +64 -0
- package/dist/registry/source-forms.d.ts +79 -0
- package/dist/registry/source-forms.d.ts.map +1 -0
- package/dist/registry/source-forms.js +202 -0
- package/dist/registry/targets/artifactory.d.ts +28 -0
- package/dist/registry/targets/artifactory.d.ts.map +1 -0
- package/dist/registry/targets/artifactory.js +206 -0
- package/dist/registry/targets/fake-artifactory.d.ts +30 -0
- package/dist/registry/targets/fake-artifactory.d.ts.map +1 -0
- package/dist/registry/targets/fake-artifactory.js +142 -0
- package/dist/registry/targets/fake-gitlab.d.ts +39 -0
- package/dist/registry/targets/fake-gitlab.d.ts.map +1 -0
- package/dist/registry/targets/fake-gitlab.js +136 -0
- package/dist/registry/targets/fake-hcp.d.ts +50 -0
- package/dist/registry/targets/fake-hcp.d.ts.map +1 -0
- package/dist/registry/targets/fake-hcp.js +202 -0
- package/dist/registry/targets/fake-http.d.ts +31 -0
- package/dist/registry/targets/fake-http.d.ts.map +1 -0
- package/dist/registry/targets/fake-http.js +87 -0
- package/dist/registry/targets/fake-nexus.d.ts +27 -0
- package/dist/registry/targets/fake-nexus.d.ts.map +1 -0
- package/dist/registry/targets/fake-nexus.js +137 -0
- package/dist/registry/targets/gitlab.d.ts +53 -0
- package/dist/registry/targets/gitlab.d.ts.map +1 -0
- package/dist/registry/targets/gitlab.js +187 -0
- package/dist/registry/targets/hcp.d.ts +29 -0
- package/dist/registry/targets/hcp.d.ts.map +1 -0
- package/dist/registry/targets/hcp.js +310 -0
- package/dist/registry/targets/hosted.d.ts +62 -0
- package/dist/registry/targets/hosted.d.ts.map +1 -0
- package/dist/registry/targets/hosted.js +74 -0
- package/dist/registry/targets/index.d.ts +18 -0
- package/dist/registry/targets/index.d.ts.map +1 -0
- package/dist/registry/targets/index.js +17 -0
- package/dist/registry/targets/module-target.d.ts +68 -0
- package/dist/registry/targets/module-target.d.ts.map +1 -0
- package/dist/registry/targets/module-target.js +63 -0
- package/dist/registry/targets/nexus.d.ts +43 -0
- package/dist/registry/targets/nexus.d.ts.map +1 -0
- package/dist/registry/targets/nexus.js +250 -0
- package/dist/registry/targets/zip.d.ts +55 -0
- package/dist/registry/targets/zip.d.ts.map +1 -0
- package/dist/registry/targets/zip.js +278 -0
- package/dist/registry/writer.d.ts +101 -0
- package/dist/registry/writer.d.ts.map +1 -0
- package/dist/registry/writer.js +109 -0
- package/dist/report.d.ts +15 -6
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +28 -55
- package/dist/rules/record-store.ts +122 -0
- package/dist/rules/tf001.ts +2 -2
- package/dist/rules/tf024.ts +105 -22
- package/dist/rules/tf046.ts +204 -0
- package/dist/rules/tf047.ts +114 -0
- package/dist/skills/chant-terraform.md +1 -1
- package/dist/state/azure-blob.d.ts +9 -0
- package/dist/state/azure-blob.d.ts.map +1 -0
- package/dist/state/azure-blob.js +8 -0
- package/dist/state/backend.d.ts +158 -0
- package/dist/state/backend.d.ts.map +1 -0
- package/dist/state/backend.js +406 -0
- package/dist/state/exec.d.ts +39 -0
- package/dist/state/exec.d.ts.map +1 -0
- package/dist/state/exec.js +80 -0
- package/dist/state/gcs.d.ts +8 -0
- package/dist/state/gcs.d.ts.map +1 -0
- package/dist/state/gcs.js +7 -0
- package/dist/state/index.d.ts +15 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +14 -0
- package/dist/state/locks.d.ts +105 -0
- package/dist/state/locks.d.ts.map +1 -0
- package/dist/state/locks.js +130 -0
- package/dist/state/object-store.d.ts +8 -0
- package/dist/state/object-store.d.ts.map +1 -0
- package/dist/state/object-store.js +7 -0
- package/dist/state/root-states.d.ts +131 -0
- package/dist/state/root-states.d.ts.map +1 -0
- package/dist/state/root-states.js +241 -0
- package/dist/state/s3.d.ts +21 -0
- package/dist/state/s3.d.ts.map +1 -0
- package/dist/state/s3.js +19 -0
- package/dist/state/store.d.ts +51 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +185 -0
- package/dist/state-ops.d.ts +255 -0
- package/dist/state-ops.d.ts.map +1 -0
- package/dist/state-ops.js +305 -0
- package/dist/state-reads.d.ts +57 -0
- package/dist/state-reads.d.ts.map +1 -0
- package/dist/state-reads.js +104 -0
- package/dist/terragrunt/affected.d.ts.map +1 -1
- package/dist/terragrunt/affected.js +2 -1
- package/dist/used-sources.d.ts +54 -0
- package/dist/used-sources.d.ts.map +1 -0
- package/dist/used-sources.js +157 -0
- package/package.json +24 -4
- package/src/__fixtures__/ACCEPTANCE.md +69 -7
- package/src/__fixtures__/compose/apply-failed-in-app.jsonl +12 -0
- package/src/__fixtures__/compose/state-app.json +66 -0
- package/src/__fixtures__/compose/state-edge.json +40 -0
- package/src/__fixtures__/compose/state-net.json +58 -0
- package/src/__fixtures__/compose/three-app.plan.json +184 -0
- package/src/__fixtures__/compose/three-composed.plan.json +509 -0
- package/src/__fixtures__/compose/three-edge.plan.json +144 -0
- package/src/__fixtures__/compose/three-net.plan.json +174 -0
- package/src/__fixtures__/compose/unknown-composed.plan.json +228 -0
- package/src/__fixtures__/compose/working-after-apply.json +145 -0
- package/src/__fixtures__/config-blocks/app/main.tf +61 -0
- package/src/__fixtures__/config-blocks/app/modules/network/main.tf +4 -0
- package/src/__fixtures__/config-blocks/app-json/main.tf.json +39 -0
- package/src/__fixtures__/config-files/shadow/main.tf +3 -0
- package/src/__fixtures__/config-files/shadow/main.tofu +3 -0
- package/src/__fixtures__/config-files/shadow/other.tf +3 -0
- package/src/__fixtures__/config-files/tf/main.tf +11 -0
- package/src/__fixtures__/config-files/tf-json/main.tf.json +18 -0
- package/src/__fixtures__/config-files/tofu/main.tofu +11 -0
- package/src/__fixtures__/config-files/tofu-json/main.tofu.json +18 -0
- package/src/__fixtures__/config-files/tofu-only/main.tofu +3 -0
- package/src/__fixtures__/drift-record/README.md +16 -0
- package/src/__fixtures__/drift-record/live-plan-sections.json +27 -0
- package/src/__fixtures__/drift-rows/live-root-plan.json +70 -0
- package/src/__fixtures__/drift-rows/refresh-plan.json +61 -0
- package/src/__fixtures__/instance-forms/app/main.tf +110 -0
- package/src/__fixtures__/instance-forms/app/modules/svc/main.tf +3 -0
- package/src/__fixtures__/instance-vars/app/main.tf +52 -0
- package/src/__fixtures__/instance-vars/app/modules/app/main.tf +12 -0
- package/src/__fixtures__/instance-vars/app/modules/edge/main.tf +3 -0
- package/src/__fixtures__/instance-vars/app/terraform.tfvars +1 -0
- package/src/__fixtures__/live-module-keyed/live-graph.json +259 -0
- package/src/__fixtures__/live-module-keyed/live-plan.json +87 -0
- package/src/__fixtures__/live-module-keyed/root/estate.chdf.hcl +1 -0
- package/src/__fixtures__/live-module-keyed/root/main.tf +21 -0
- package/src/__fixtures__/live-module-keyed/root/modules/app/main.tf +17 -0
- package/src/__fixtures__/live-module-keyed/root/modules/edge/main.tf +7 -0
- package/src/__fixtures__/live-module-keyed/root/versions.tf +30 -0
- package/src/__fixtures__/live-module-keyed/show-state.json +146 -0
- package/src/__fixtures__/pr-loop/README.md +50 -0
- package/src/__fixtures__/pr-loop/chant.config.json +13 -0
- package/src/__fixtures__/pr-loop/estate.component.ts +10 -0
- package/src/__fixtures__/pr-loop/roots/a/main.tf +11 -0
- package/src/__fixtures__/pr-loop/roots/app/main.tf +19 -0
- package/src/__fixtures__/pr-loop/roots/b/main.tf +7 -0
- package/src/__fixtures__/pr-loop/roots/dns/main.tf +3 -0
- package/src/__fixtures__/pr-loop/roots/net/main.tf +7 -0
- package/src/__fixtures__/report/applied.show.json +51 -0
- package/src/__fixtures__/report/generate.ts +63 -0
- package/src/__fixtures__/report/plan.show.json +200 -0
- package/src/__fixtures__/report/tf-apply/change-set.json +170 -0
- package/src/__fixtures__/report/tf-apply/report.json +338 -0
- package/src/__fixtures__/report/tf-plan/change-set.json +170 -0
- package/src/__fixtures__/report/tf-plan/report.json +320 -0
- package/src/__fixtures__/three-cloud-azure.graph.json +290 -0
- package/src/__fixtures__/used-sources/root/extra.tofu +1 -0
- package/src/__fixtures__/used-sources/root/main.tf +31 -0
- package/src/__fixtures__/used-sources/root/modules/net/main.tf +14 -0
- package/src/__fixtures__/used-sources/root/modules/net/versions.tf.json +7 -0
- package/src/__fixtures__/used-sources/unit/terragrunt.hcl +3 -0
- package/src/applied-state.ts +52 -0
- package/src/backend-config.test.ts +105 -0
- package/src/backend-config.ts +133 -0
- package/src/behaviour/kinds.ts +4 -0
- package/src/behaviour/predict.ts +5 -2
- package/src/behaviour/reference-catalog.plugin.test.ts +65 -0
- package/src/behaviour/reference-catalog.ts +16 -5
- package/src/behaviour/request.ts +3 -2
- package/src/change-set-instances.test.ts +98 -0
- package/src/changed-roots.ts +14 -16
- package/src/ci-setup.ts +42 -0
- package/src/commands.ts +4 -3
- package/src/components/capability-plugin.test.ts +198 -19
- package/src/components/capability-plugin.ts +383 -35
- package/src/components/change-set-graph.e2e.test.ts +11 -5
- package/src/components/compose-group.test.ts +486 -0
- package/src/components/compose-group.ts +489 -0
- package/src/components/demo-composed-roots.e2e.test.ts +440 -0
- package/src/components/member-outputs.test.ts +76 -0
- package/src/components/placeholder-preview.test.ts +147 -0
- package/src/components/placeholder-preview.ts +257 -0
- package/src/components/pr-loop-compose.tofu.e2e.test.ts +363 -0
- package/src/components/pr-loop.tofu.test.ts +113 -57
- package/src/components/release-inputs.ts +69 -0
- package/src/components/trace-facts.test.ts +21 -0
- package/src/components/trace-facts.ts +27 -0
- package/src/compose/apply-events.test.ts +62 -0
- package/src/compose/apply-events.ts +100 -0
- package/src/compose/estate.choudoufu.e2e.test.ts +112 -0
- package/src/compose/estate.test.ts +421 -0
- package/src/compose/estate.ts +443 -0
- package/src/compose/hcl.ts +311 -0
- package/src/compose/module-address.ts +49 -0
- package/src/compose/root.test.ts +416 -0
- package/src/compose/root.ts +592 -0
- package/src/compose/run.test.ts +440 -0
- package/src/compose/run.tofu.test.ts +176 -0
- package/src/compose/run.ts +527 -0
- package/src/compose/slice.test.ts +184 -0
- package/src/compose/slice.ts +290 -0
- package/src/compose/state-address.ts +157 -0
- package/src/compose/state-merge.test.ts +131 -0
- package/src/compose/state-merge.ts +148 -0
- package/src/compose.test.ts +248 -0
- package/src/compose.ts +627 -0
- package/src/composites/terraform-apply-op.test.ts +9 -0
- package/src/composites/terraform-apply-op.ts +7 -3
- package/src/cone.ts +138 -0
- package/src/config-file-listers.test.ts +265 -0
- package/src/config.ts +44 -9
- package/src/cost-hold.ts +29 -0
- package/src/describe-resources.engine-facts.test.ts +411 -0
- package/src/describe-resources.live-module-keyed.test.ts +290 -0
- package/src/describe-resources.ts +416 -70
- package/src/drift-read.ts +284 -0
- package/src/drift-record.test.ts +223 -0
- package/src/drift-record.ts +455 -0
- package/src/drift-rows.test.ts +135 -0
- package/src/drift-rows.ts +137 -0
- package/src/exit-codes.test.ts +23 -0
- package/src/exit-codes.ts +59 -0
- package/src/hcl/config-blocks.test.ts +174 -0
- package/src/hcl/edges.ts +21 -1
- package/src/hcl/files.ts +234 -0
- package/src/hcl/instance-forms.test.ts +94 -0
- package/src/hcl/instances.test.ts +137 -0
- package/src/hcl/instances.ts +422 -0
- package/src/hcl/parse.test.ts +139 -1
- package/src/hcl/parse.ts +149 -16
- package/src/hcl/roots.ts +6 -0
- package/src/hcl/suppressions.ts +8 -2
- package/src/index.ts +79 -0
- package/src/lint/audit-catalog.ts +29 -3
- package/src/lint/audit-lineage.ts +14 -2
- package/src/lint/post-synth/fixtures/TF024/live-with-record-store/main.tf +18 -0
- package/src/lint/post-synth/fixtures/TF024/sidecar-with-backend/estate.chdf.hcl +1 -0
- package/src/lint/post-synth/fixtures/TF024/sidecar-with-backend/main.tf +10 -0
- package/src/lint/post-synth/fixtures/TF046/azurerm-no-resource-group/main.tf +15 -0
- package/src/lint/post-synth/fixtures/TF046/backend-config-only/main.tf +14 -0
- package/src/lint/post-synth/fixtures/TF046/derived-s3/backend.tf +7 -0
- package/src/lint/post-synth/fixtures/TF046/derived-s3/main.tf +9 -0
- package/src/lint/post-synth/fixtures/TF046/explicit-local/main.tf +16 -0
- package/src/lint/post-synth/fixtures/TF046/explicit-s3-beside-local-backend/main.tf +15 -0
- package/src/lint/post-synth/fixtures/TF046/implied-local/main.tf +9 -0
- package/src/lint/post-synth/fixtures/TF046/sidecar-implied/estate.chdf.hcl +1 -0
- package/src/lint/post-synth/fixtures/TF046/sidecar-implied/main.tf +5 -0
- package/src/lint/post-synth/fixtures/TF047/clear/main.tf +12 -0
- package/src/lint/post-synth/fixtures/TF047/refused/main.tf +12 -0
- package/src/lint/post-synth/fixtures/TF047/unknown-module/main.tf +12 -0
- package/src/lint/post-synth/fixtures/TF047/unknown-version/main.tf +12 -0
- package/src/lint/post-synth/index.ts +4 -0
- package/src/lint/post-synth/record-store.ts +122 -0
- package/src/lint/post-synth/tf001.ts +2 -2
- package/src/lint/post-synth/tf024.test.ts +26 -5
- package/src/lint/post-synth/tf024.ts +105 -22
- package/src/lint/post-synth/tf046.test.ts +137 -0
- package/src/lint/post-synth/tf046.ts +204 -0
- package/src/lint/post-synth/tf047.test.ts +56 -0
- package/src/lint/post-synth/tf047.ts +114 -0
- package/src/live-plan-reasons.ts +54 -0
- package/src/lock-rows.test.ts +70 -0
- package/src/lock-rows.ts +82 -0
- package/src/lock-timeout.ts +34 -0
- package/src/lsp/completions.test.ts +1 -1
- package/src/lsp/option-keys.ts +2 -0
- package/src/module-catalog/index.test.ts +93 -0
- package/src/module-catalog/index.ts +159 -0
- package/src/module-catalog/refresh-cli.ts +68 -0
- package/src/module-catalog/static-tier.ts +1659 -0
- package/src/module-catalog/types.ts +88 -0
- package/src/op/activities/choudoufu-plan-set-op.test.ts +111 -0
- package/src/op/activities/index.ts +9 -0
- package/src/op/activities/live-detect.ts +55 -26
- package/src/op/activities/pin-rollout.ts +3 -0
- package/src/op/activities/registry.test.ts +2 -1
- package/src/op/activities/terraform.test.ts +55 -0
- package/src/op/activities/terraform.ts +312 -27
- package/src/op/activity-contracts.test.ts +1 -0
- package/src/op/activity-contracts.ts +24 -1
- package/src/op/builders.ts +14 -0
- package/src/op-wave-step.test.ts +109 -0
- package/src/pin/__fixtures__/consumers/live/dev/main.tf +4 -0
- package/src/pin/__fixtures__/consumers/live/prod/main.tf +21 -0
- package/src/pin/__fixtures__/consumers/units/vpc/terragrunt.hcl +7 -0
- package/src/pin/bundle.test.ts +2 -0
- package/src/pin/consumers.test.ts +57 -0
- package/src/pin/consumers.ts +95 -0
- package/src/pin/edit.ts +30 -0
- package/src/pin/rollout.ts +16 -11
- package/src/plan-shape.test.ts +148 -0
- package/src/plan-shape.ts +128 -0
- package/src/plugin.ts +39 -19
- package/src/registry/__fixtures__/docs/documented/.terraform-docs.yml +3 -0
- package/src/registry/__fixtures__/docs/documented/README.md +1 -0
- package/src/registry/__fixtures__/docs/documented/main.tf +8 -0
- package/src/registry/__fixtures__/docs/json/main.tf.json +14 -0
- package/src/registry/__fixtures__/docs/vpc/README.md +3 -0
- package/src/registry/__fixtures__/docs/vpc/examples/complete/main.tf +5 -0
- package/src/registry/__fixtures__/docs/vpc/examples/simple/README.md +1 -0
- package/src/registry/__fixtures__/docs/vpc/examples/simple/main.tf +4 -0
- package/src/registry/__fixtures__/docs/vpc/main.tf +14 -0
- package/src/registry/__fixtures__/docs/vpc/outputs.tf +9 -0
- package/src/registry/__fixtures__/docs/vpc/variables.tf +16 -0
- package/src/registry/__fixtures__/proxied-root/main.tf +12 -0
- package/src/registry/address.ts +100 -0
- package/src/registry/catalog-read.ts +56 -0
- package/src/registry/deprecated.test.ts +139 -0
- package/src/registry/deprecated.ts +76 -0
- package/src/registry/docs.test.ts +140 -0
- package/src/registry/docs.ts +299 -0
- package/src/registry/edge/bundle.test.ts +50 -0
- package/src/registry/edge/edge.test.ts +176 -0
- package/src/registry/edge/edge.ts +211 -0
- package/src/registry/edge/index.ts +10 -0
- package/src/registry/edge/lambda-edge.ts +127 -0
- package/src/registry/edge/sigv4-web.ts +79 -0
- package/src/registry/edge/token-source.test.ts +258 -0
- package/src/registry/edge/token-source.ts +169 -0
- package/src/registry/edge/worker.ts +61 -0
- package/src/registry/handler.ts +89 -0
- package/src/registry/headers-file.ts +61 -0
- package/src/registry/index.ts +31 -0
- package/src/registry/mirror-paths.ts +10 -0
- package/src/registry/mirror.test.ts +198 -0
- package/src/registry/mirror.ts +395 -0
- package/src/registry/proxies.test.ts +153 -0
- package/src/registry/proxies.ts +132 -0
- package/src/registry/reader.ts +225 -0
- package/src/registry/registry.test.ts +262 -0
- package/src/registry/semver.ts +34 -0
- package/src/registry/serve.ts +82 -0
- package/src/registry/source-forms.test.ts +87 -0
- package/src/registry/source-forms.ts +216 -0
- package/src/registry/targets/artifactory.test.ts +248 -0
- package/src/registry/targets/artifactory.ts +257 -0
- package/src/registry/targets/fake-artifactory.ts +158 -0
- package/src/registry/targets/fake-gitlab.ts +161 -0
- package/src/registry/targets/fake-hcp.ts +233 -0
- package/src/registry/targets/fake-http.ts +97 -0
- package/src/registry/targets/fake-nexus.ts +152 -0
- package/src/registry/targets/gitlab.test.ts +208 -0
- package/src/registry/targets/gitlab.ts +223 -0
- package/src/registry/targets/hcp.test.ts +230 -0
- package/src/registry/targets/hcp.ts +360 -0
- package/src/registry/targets/hosted.ts +117 -0
- package/src/registry/targets/index.ts +17 -0
- package/src/registry/targets/module-target.ts +131 -0
- package/src/registry/targets/nexus.test.ts +220 -0
- package/src/registry/targets/nexus.ts +314 -0
- package/src/registry/targets/zip.test.ts +65 -0
- package/src/registry/targets/zip.ts +287 -0
- package/src/registry/writer.ts +155 -0
- package/src/report.test.ts +82 -1
- package/src/report.ts +31 -54
- package/src/signal-only-root.test.ts +72 -0
- package/src/skills/chant-terraform.md +1 -1
- package/src/state/azure-blob.ts +8 -0
- package/src/state/backend-verdict.test.ts +187 -0
- package/src/state/backend.test.ts +127 -0
- package/src/state/backend.ts +488 -0
- package/src/state/exec.ts +111 -0
- package/src/state/gcs.ts +7 -0
- package/src/state/index.ts +15 -0
- package/src/state/locks.test.ts +84 -0
- package/src/state/locks.ts +201 -0
- package/src/state/object-store.ts +7 -0
- package/src/state/root-states-floci.e2e.test.ts +66 -0
- package/src/state/root-states.test.ts +462 -0
- package/src/state/root-states.ts +309 -0
- package/src/state/s3.ts +21 -0
- package/src/state/store.ts +225 -0
- package/src/state-ops.test.ts +182 -0
- package/src/state-ops.ts +462 -0
- package/src/state-reads.ts +116 -0
- package/src/terragrunt/affected.ts +2 -1
- package/src/used-sources.test.ts +75 -0
- package/src/used-sources.ts +204 -0
- package/src/workspace-kinds.test.ts +4 -17
- package/workspace-kinds.json +1 -24
- package/dist/workspace-member.d.ts +0 -30
- package/dist/workspace-member.d.ts.map +0 -1
- package/dist/workspace-member.js +0 -91
- package/schemas/pulumi.schema.json +0 -34
- package/src/testdata/pulumi-member/Pulumi.yaml +0 -2
- package/src/testdata/pulumi-member/stack-export.json +0 -53
- package/src/testdata/pulumi-unexported/Pulumi.yaml +0 -2
- package/src/workspace-member.test.ts +0 -89
- 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
|
+
}
|