@intentius/chant-lexicon-terraform 0.57.0 → 0.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/composites/terraform-adopt-op.d.ts +131 -0
- package/dist/composites/terraform-adopt-op.d.ts.map +1 -0
- package/dist/composites/terraform-apply-op.d.ts +70 -17
- package/dist/composites/terraform-apply-op.d.ts.map +1 -1
- package/dist/composites/terraform-watch-op.d.ts +104 -37
- package/dist/composites/terraform-watch-op.d.ts.map +1 -1
- package/dist/config.d.ts +49 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/describe-resources.d.ts +256 -16
- package/dist/describe-resources.d.ts.map +1 -1
- package/dist/hcl/descend.d.ts +98 -0
- package/dist/hcl/descend.d.ts.map +1 -0
- package/dist/hcl/marker.d.ts +130 -0
- package/dist/hcl/marker.d.ts.map +1 -0
- package/dist/hcl/parse.d.ts +156 -9
- package/dist/hcl/parse.d.ts.map +1 -1
- package/dist/hcl/references.d.ts +76 -0
- package/dist/hcl/references.d.ts.map +1 -0
- package/dist/hcl/roots.d.ts +22 -3
- package/dist/hcl/roots.d.ts.map +1 -1
- package/dist/hcl/suppressions.d.ts +54 -0
- package/dist/hcl/suppressions.d.ts.map +1 -0
- package/dist/hcl/value.d.ts +77 -0
- package/dist/hcl/value.d.ts.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/integrity.json +34 -5
- package/dist/lint/audit-catalog.d.ts +3 -2
- package/dist/lint/audit-catalog.d.ts.map +1 -1
- package/dist/lint/audit-lineage.d.ts +95 -0
- package/dist/lint/audit-lineage.d.ts.map +1 -1
- package/dist/lint/post-synth/blocks.d.ts +53 -0
- package/dist/lint/post-synth/blocks.d.ts.map +1 -0
- package/dist/lint/post-synth/fixtures/load.d.ts +37 -0
- package/dist/lint/post-synth/fixtures/load.d.ts.map +1 -0
- package/dist/lint/post-synth/index.d.ts.map +1 -1
- package/dist/lint/post-synth/module-source.d.ts +38 -0
- package/dist/lint/post-synth/module-source.d.ts.map +1 -0
- package/dist/lint/post-synth/scope.d.ts +65 -0
- package/dist/lint/post-synth/scope.d.ts.map +1 -0
- package/dist/lint/post-synth/tf001.d.ts +58 -6
- package/dist/lint/post-synth/tf001.d.ts.map +1 -1
- package/dist/lint/post-synth/tf002.d.ts +32 -0
- package/dist/lint/post-synth/tf002.d.ts.map +1 -0
- package/dist/lint/post-synth/tf003.d.ts +22 -0
- package/dist/lint/post-synth/tf003.d.ts.map +1 -0
- package/dist/lint/post-synth/tf004.d.ts +22 -0
- package/dist/lint/post-synth/tf004.d.ts.map +1 -0
- package/dist/lint/post-synth/tf005.d.ts +28 -0
- package/dist/lint/post-synth/tf005.d.ts.map +1 -0
- package/dist/lint/post-synth/tf006.d.ts +21 -0
- package/dist/lint/post-synth/tf006.d.ts.map +1 -0
- package/dist/lint/post-synth/tf007.d.ts +21 -0
- package/dist/lint/post-synth/tf007.d.ts.map +1 -0
- package/dist/lint/post-synth/tf008.d.ts +22 -0
- package/dist/lint/post-synth/tf008.d.ts.map +1 -0
- package/dist/lint/post-synth/tf009.d.ts +24 -0
- package/dist/lint/post-synth/tf009.d.ts.map +1 -0
- package/dist/lint/post-synth/tf010.d.ts +19 -0
- package/dist/lint/post-synth/tf010.d.ts.map +1 -0
- package/dist/lint/post-synth/tf011.d.ts +18 -0
- package/dist/lint/post-synth/tf011.d.ts.map +1 -0
- package/dist/lint/post-synth/tf012.d.ts +17 -0
- package/dist/lint/post-synth/tf012.d.ts.map +1 -0
- package/dist/lint/post-synth/tf013.d.ts +21 -0
- package/dist/lint/post-synth/tf013.d.ts.map +1 -0
- package/dist/lint/post-synth/tf014.d.ts +25 -0
- package/dist/lint/post-synth/tf014.d.ts.map +1 -0
- package/dist/lint/post-synth/tf015.d.ts +30 -0
- package/dist/lint/post-synth/tf015.d.ts.map +1 -0
- package/dist/lint/post-synth/tf016.d.ts +30 -0
- package/dist/lint/post-synth/tf016.d.ts.map +1 -0
- package/dist/lint/post-synth/tf017.d.ts +19 -0
- package/dist/lint/post-synth/tf017.d.ts.map +1 -0
- package/dist/lint/post-synth/tf018.d.ts +20 -0
- package/dist/lint/post-synth/tf018.d.ts.map +1 -0
- package/dist/lint/post-synth/tf019.d.ts +25 -0
- package/dist/lint/post-synth/tf019.d.ts.map +1 -0
- package/dist/lint/post-synth/tf020.d.ts +38 -0
- package/dist/lint/post-synth/tf020.d.ts.map +1 -0
- package/dist/lint/post-synth/tf021.d.ts +41 -0
- package/dist/lint/post-synth/tf021.d.ts.map +1 -0
- package/dist/lint/post-synth/tf022.d.ts +24 -0
- package/dist/lint/post-synth/tf022.d.ts.map +1 -0
- package/dist/lint/post-synth/tf024.d.ts +24 -0
- package/dist/lint/post-synth/tf024.d.ts.map +1 -0
- package/dist/lint/post-synth/tf025.d.ts +29 -0
- package/dist/lint/post-synth/tf025.d.ts.map +1 -0
- package/dist/lint/post-synth/tf026.d.ts +28 -0
- package/dist/lint/post-synth/tf026.d.ts.map +1 -0
- package/dist/lint/post-synth/tf027.d.ts +30 -0
- package/dist/lint/post-synth/tf027.d.ts.map +1 -0
- package/dist/lint/post-synth/tf028.d.ts +33 -0
- package/dist/lint/post-synth/tf028.d.ts.map +1 -0
- package/dist/lint/rules/fixtures/load.d.ts +13 -0
- package/dist/lint/rules/fixtures/load.d.ts.map +1 -0
- package/dist/lint/rules/plan-before-apply.d.ts +11 -0
- package/dist/lint/rules/plan-before-apply.d.ts.map +1 -1
- package/dist/lint/secret-shape.d.ts +68 -0
- package/dist/lint/secret-shape.d.ts.map +1 -0
- package/dist/live-ownership.d.ts +55 -0
- package/dist/live-ownership.d.ts.map +1 -0
- package/dist/lsp/option-keys.d.ts.map +1 -1
- package/dist/manifest.json +1 -1
- package/dist/okf/index.md +26 -0
- package/dist/okf/rules/TF002.md +11 -0
- package/dist/okf/rules/TF003.md +11 -0
- package/dist/okf/rules/TF004.md +11 -0
- package/dist/okf/rules/TF005.md +11 -0
- package/dist/okf/rules/TF006.md +11 -0
- package/dist/okf/rules/TF007.md +11 -0
- package/dist/okf/rules/TF008.md +11 -0
- package/dist/okf/rules/TF009.md +11 -0
- package/dist/okf/rules/TF010.md +11 -0
- package/dist/okf/rules/TF011.md +11 -0
- package/dist/okf/rules/TF012.md +11 -0
- package/dist/okf/rules/TF013.md +11 -0
- package/dist/okf/rules/TF014.md +11 -0
- package/dist/okf/rules/TF015.md +11 -0
- package/dist/okf/rules/TF016.md +11 -0
- package/dist/okf/rules/TF017.md +11 -0
- package/dist/okf/rules/TF018.md +11 -0
- package/dist/okf/rules/TF019.md +11 -0
- package/dist/okf/rules/TF020.md +11 -0
- package/dist/okf/rules/TF021.md +11 -0
- package/dist/okf/rules/TF022.md +11 -0
- package/dist/okf/rules/TF024.md +11 -0
- package/dist/okf/rules/TF025.md +11 -0
- package/dist/okf/rules/TF026.md +11 -0
- package/dist/okf/rules/TF027.md +11 -0
- package/dist/okf/rules/TF028.md +11 -0
- package/dist/op/activities/index.d.ts +13 -6
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/live-detect.d.ts +51 -0
- package/dist/op/activities/live-detect.d.ts.map +1 -0
- package/dist/op/activities/terraform.d.ts +466 -17
- package/dist/op/activities/terraform.d.ts.map +1 -1
- package/dist/op/activity-contracts.d.ts +148 -0
- package/dist/op/activity-contracts.d.ts.map +1 -0
- package/dist/op/adoption.d.ts +118 -0
- package/dist/op/adoption.d.ts.map +1 -0
- package/dist/op/builders.d.ts +48 -6
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/resolve-root-mode.d.ts +59 -0
- package/dist/op/resolve-root-mode.d.ts.map +1 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/rules/blocks.ts +109 -0
- package/dist/rules/module-source.ts +121 -0
- package/dist/rules/plan-before-apply.ts +11 -0
- package/dist/rules/scope.ts +107 -0
- package/dist/rules/tf001.ts +98 -18
- package/dist/rules/tf002.ts +151 -0
- package/dist/rules/tf003.ts +71 -0
- package/dist/rules/tf004.ts +63 -0
- package/dist/rules/tf005.ts +76 -0
- package/dist/rules/tf006.ts +53 -0
- package/dist/rules/tf007.ts +78 -0
- package/dist/rules/tf008.ts +75 -0
- package/dist/rules/tf009.ts +59 -0
- package/dist/rules/tf010.ts +51 -0
- package/dist/rules/tf011.ts +49 -0
- package/dist/rules/tf012.ts +47 -0
- package/dist/rules/tf013.ts +63 -0
- package/dist/rules/tf014.ts +72 -0
- package/dist/rules/tf015.ts +72 -0
- package/dist/rules/tf016.ts +75 -0
- package/dist/rules/tf017.ts +50 -0
- package/dist/rules/tf018.ts +72 -0
- package/dist/rules/tf019.ts +72 -0
- package/dist/rules/tf020.ts +123 -0
- package/dist/rules/tf021.ts +126 -0
- package/dist/rules/tf022.ts +61 -0
- package/dist/rules/tf024.ts +70 -0
- package/dist/rules/tf025.ts +101 -0
- package/dist/rules/tf026.ts +84 -0
- package/dist/rules/tf027.ts +74 -0
- package/dist/rules/tf028.ts +96 -0
- package/dist/skills/chant-terraform.md +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/package.json +7 -2
- package/src/__fixtures__/ACCEPTANCE.md +181 -0
- package/src/__fixtures__/live/main.tf +28 -0
- package/src/__fixtures__/live-adopt/estate.chdf.hcl +6 -0
- package/src/__fixtures__/live-adopt/main.tf +21 -0
- package/src/__fixtures__/live-estate/README.md +58 -0
- package/src/__fixtures__/live-estate/compute.tf +10 -0
- package/src/__fixtures__/live-estate/estate.chdf.hcl +1 -0
- package/src/__fixtures__/live-estate/logs.tf +8 -0
- package/src/__fixtures__/live-estate/network.tf +24 -0
- package/src/__fixtures__/live-estate/rule.tf +11 -0
- package/src/__fixtures__/live-estate/unowned.tf +21 -0
- package/src/__fixtures__/live-estate/versions.tf +31 -0
- package/src/__fixtures__/live-ls.json +98 -0
- package/src/__fixtures__/live-plan.json +285 -0
- package/src/__fixtures__/live-sidecar/estate.chdf.hcl +3 -0
- package/src/__fixtures__/live-sidecar/main.tf +24 -0
- package/src/__fixtures__/module-tree/README.md +16 -0
- package/src/__fixtures__/module-tree/cycle/main.tf +3 -0
- package/src/__fixtures__/module-tree/cycle/modules/a/main.tf +9 -0
- package/src/__fixtures__/module-tree/cycle/modules/b/main.tf +9 -0
- package/src/__fixtures__/module-tree/missing/main.tf +9 -0
- package/src/__fixtures__/module-tree/outside/root/main.tf +9 -0
- package/src/__fixtures__/module-tree/root/main.tf +28 -0
- package/src/__fixtures__/module-tree/root/modules/cdn/main.tf +15 -0
- package/src/__fixtures__/module-tree/root/modules/cdn/modules/bucket/main.tf +11 -0
- package/src/__fixtures__/module-tree/shared/main.tf +5 -0
- package/src/__fixtures__/references/main.tf +56 -0
- package/src/__fixtures__/remote-backend/main.tf +34 -0
- package/src/__fixtures__/with-backend/main.tf +7 -0
- package/src/codegen/lint-rules-page.test.ts +45 -0
- package/src/composites/terraform-adopt-op.acceptance.test.ts +193 -0
- package/src/composites/terraform-adopt-op.test.ts +175 -0
- package/src/composites/terraform-adopt-op.ts +202 -0
- package/src/composites/terraform-apply-op.acceptance.test.ts +188 -5
- package/src/composites/terraform-apply-op.test.ts +179 -19
- package/src/composites/terraform-apply-op.ts +123 -30
- package/src/composites/terraform-watch-op.test.ts +169 -29
- package/src/composites/terraform-watch-op.ts +183 -75
- package/src/config.ts +32 -3
- package/src/describe-resources.live.test.ts +598 -0
- package/src/describe-resources.test.ts +53 -0
- package/src/describe-resources.ts +811 -28
- package/src/hcl/descend.test.ts +162 -0
- package/src/hcl/descend.ts +273 -0
- package/src/hcl/marker.test.ts +147 -0
- package/src/hcl/marker.ts +235 -0
- package/src/hcl/parse.test.ts +69 -0
- package/src/hcl/parse.ts +269 -27
- package/src/hcl/references.test.ts +116 -0
- package/src/hcl/references.ts +172 -0
- package/src/hcl/roots.ts +59 -5
- package/src/hcl/suppressions.test.ts +147 -0
- package/src/hcl/suppressions.ts +204 -0
- package/src/hcl/value.test.ts +73 -0
- package/src/hcl/value.ts +106 -0
- package/src/index.ts +31 -1
- package/src/lint/audit-catalog.ts +288 -3
- package/src/lint/audit-lineage.ts +384 -1
- package/src/lint/audit.test.ts +210 -3
- package/src/lint/post-synth/blocks.ts +109 -0
- package/src/lint/post-synth/fixtures/TF001/negative-cloud.tf +28 -0
- package/src/lint/post-synth/fixtures/TF001/negative.tf +30 -0
- package/src/lint/post-synth/fixtures/TF001/positive-local.tf +31 -0
- package/src/lint/post-synth/fixtures/TF001/positive.tf +24 -0
- package/src/lint/post-synth/fixtures/TF002/negative.tf +17 -0
- package/src/lint/post-synth/fixtures/TF002/positive-legacy.tf +10 -0
- package/src/lint/post-synth/fixtures/TF002/positive-no-version.tf +12 -0
- package/src/lint/post-synth/fixtures/TF002/positive.tf +7 -0
- package/src/lint/post-synth/fixtures/TF003/negative.tf +10 -0
- package/src/lint/post-synth/fixtures/TF003/positive.tf +8 -0
- package/src/lint/post-synth/fixtures/TF004/negative-git.tf +3 -0
- package/src/lint/post-synth/fixtures/TF004/negative-local.tf +3 -0
- package/src/lint/post-synth/fixtures/TF004/negative.tf +4 -0
- package/src/lint/post-synth/fixtures/TF004/positive.tf +3 -0
- package/src/lint/post-synth/fixtures/TF005/negative-local.tf +3 -0
- package/src/lint/post-synth/fixtures/TF005/negative-registry.tf +3 -0
- package/src/lint/post-synth/fixtures/TF005/negative-sha.tf +3 -0
- package/src/lint/post-synth/fixtures/TF005/negative.tf +3 -0
- package/src/lint/post-synth/fixtures/TF005/positive-branch.tf +3 -0
- package/src/lint/post-synth/fixtures/TF005/positive-non-semver.tf +3 -0
- package/src/lint/post-synth/fixtures/TF005/positive.tf +3 -0
- package/src/lint/post-synth/fixtures/TF006/negative.tf +5 -0
- package/src/lint/post-synth/fixtures/TF006/positive-empty-default.tf +11 -0
- package/src/lint/post-synth/fixtures/TF006/positive.tf +6 -0
- package/src/lint/post-synth/fixtures/TF007/negative.tf +10 -0
- package/src/lint/post-synth/fixtures/TF007/positive.tf +9 -0
- package/src/lint/post-synth/fixtures/TF008/negative-variable.tf +10 -0
- package/src/lint/post-synth/fixtures/TF008/negative.tf +8 -0
- package/src/lint/post-synth/fixtures/TF008/positive-other-provider.tf +10 -0
- package/src/lint/post-synth/fixtures/TF008/positive.tf +5 -0
- package/src/lint/post-synth/fixtures/TF009/negative.tf +10 -0
- package/src/lint/post-synth/fixtures/TF009/positive.tf +4 -0
- package/src/lint/post-synth/fixtures/TF010/negative.tf +5 -0
- package/src/lint/post-synth/fixtures/TF010/positive.tf +4 -0
- package/src/lint/post-synth/fixtures/TF011/negative.tf +5 -0
- package/src/lint/post-synth/fixtures/TF011/positive-blank.tf +5 -0
- package/src/lint/post-synth/fixtures/TF011/positive.tf +4 -0
- package/src/lint/post-synth/fixtures/TF012/negative.tf +4 -0
- package/src/lint/post-synth/fixtures/TF012/positive.tf +3 -0
- package/src/lint/post-synth/fixtures/TF013/negative.tf +8 -0
- package/src/lint/post-synth/fixtures/TF013/positive-data.tf +8 -0
- package/src/lint/post-synth/fixtures/TF013/positive.tf +8 -0
- package/src/lint/post-synth/fixtures/TF014/negative/main.tf +26 -0
- package/src/lint/post-synth/fixtures/TF014/negative/modules/cdn/main.tf +19 -0
- package/src/lint/post-synth/fixtures/TF014/positive/main.tf +16 -0
- package/src/lint/post-synth/fixtures/TF014/positive/modules/cdn/main.tf +15 -0
- package/src/lint/post-synth/fixtures/TF015/negative/main.tf +13 -0
- package/src/lint/post-synth/fixtures/TF015/negative/modules/cdn/main.tf +16 -0
- package/src/lint/post-synth/fixtures/TF015/positive/main.tf +13 -0
- package/src/lint/post-synth/fixtures/TF015/positive/modules/cdn/main.tf +14 -0
- package/src/lint/post-synth/fixtures/TF016/negative-template.tf +7 -0
- package/src/lint/post-synth/fixtures/TF016/negative.tf +16 -0
- package/src/lint/post-synth/fixtures/TF016/positive-shared-file.tf +12 -0
- package/src/lint/post-synth/fixtures/TF016/positive.tf +13 -0
- package/src/lint/post-synth/fixtures/TF017/negative.tf +4 -0
- package/src/lint/post-synth/fixtures/TF017/positive.tf +5 -0
- package/src/lint/post-synth/fixtures/TF018/negative.tf +9 -0
- package/src/lint/post-synth/fixtures/TF018/positive-data.tf +9 -0
- package/src/lint/post-synth/fixtures/TF018/positive.tf +4 -0
- package/src/lint/post-synth/fixtures/TF019/negative.tf +14 -0
- package/src/lint/post-synth/fixtures/TF019/positive-output.tf +5 -0
- package/src/lint/post-synth/fixtures/TF019/positive.tf +16 -0
- package/src/lint/post-synth/fixtures/TF020/negative.tf +43 -0
- package/src/lint/post-synth/fixtures/TF020/positive.tf +32 -0
- package/src/lint/post-synth/fixtures/TF020/scoped/main.tf +21 -0
- package/src/lint/post-synth/fixtures/TF020/scoped/modules/cdn/main.tf +13 -0
- package/src/lint/post-synth/fixtures/TF021/negative.tf +31 -0
- package/src/lint/post-synth/fixtures/TF021/positive-length.tf +8 -0
- package/src/lint/post-synth/fixtures/TF021/positive.tf +8 -0
- package/src/lint/post-synth/fixtures/TF022/negative-locator.tf +7 -0
- package/src/lint/post-synth/fixtures/TF022/negative.tf +10 -0
- package/src/lint/post-synth/fixtures/TF022/positive-nested.tf +10 -0
- package/src/lint/post-synth/fixtures/TF022/positive.tf +6 -0
- package/src/lint/post-synth/fixtures/TF023/negative/main.tf +15 -0
- package/src/lint/post-synth/fixtures/TF023/positive/main.tf +9 -0
- package/src/lint/post-synth/fixtures/TF023/positive/state.json +24 -0
- package/src/lint/post-synth/fixtures/TF024/live-clean/main.tf +9 -0
- package/src/lint/post-synth/fixtures/TF024/live-with-backend/main.tf +14 -0
- package/src/lint/post-synth/fixtures/TF024/live-with-cloud/main.tf +16 -0
- package/src/lint/post-synth/fixtures/TF025/live-clean/main.tf +13 -0
- package/src/lint/post-synth/fixtures/TF025/live-with-workspace-ref/main.tf +13 -0
- package/src/lint/post-synth/fixtures/TF026/live-default/main.tf +9 -0
- package/src/lint/post-synth/fixtures/TF026/live-explicit-delete/main.tf +13 -0
- package/src/lint/post-synth/fixtures/TF026/live-keep/main.tf +13 -0
- package/src/lint/post-synth/fixtures/TF027/live-default/main.tf +9 -0
- package/src/lint/post-synth/fixtures/TF027/live-untagged-delete/main.tf +13 -0
- package/src/lint/post-synth/fixtures/TF027/live-untagged-delete-scoped/main.tf +17 -0
- package/src/lint/post-synth/fixtures/TF027/live-untagged-report/main.tf +13 -0
- package/src/lint/post-synth/fixtures/TF028/live/main.tf +9 -0
- package/src/lint/post-synth/fixtures/TF028/stock/main.tf +10 -0
- package/src/lint/post-synth/fixtures/load.ts +108 -0
- package/src/lint/post-synth/index.ts +52 -0
- package/src/lint/post-synth/live-refusals-config-format.test.ts +143 -0
- package/src/lint/post-synth/module-rules.test.ts +153 -0
- package/src/lint/post-synth/module-source.test.ts +75 -0
- package/src/lint/post-synth/module-source.ts +121 -0
- package/src/lint/post-synth/post-synth.test.ts +73 -16
- package/src/lint/post-synth/scope.ts +107 -0
- package/src/lint/post-synth/single-block.test.ts +263 -0
- package/src/lint/post-synth/suppression.test.ts +110 -0
- package/src/lint/post-synth/tf001.ts +98 -18
- package/src/lint/post-synth/tf002.test.ts +93 -0
- package/src/lint/post-synth/tf002.ts +151 -0
- package/src/lint/post-synth/tf003.test.ts +75 -0
- package/src/lint/post-synth/tf003.ts +71 -0
- package/src/lint/post-synth/tf004.test.ts +47 -0
- package/src/lint/post-synth/tf004.ts +63 -0
- package/src/lint/post-synth/tf005.test.ts +57 -0
- package/src/lint/post-synth/tf005.ts +76 -0
- package/src/lint/post-synth/tf006.ts +53 -0
- package/src/lint/post-synth/tf007.ts +78 -0
- package/src/lint/post-synth/tf008.ts +75 -0
- package/src/lint/post-synth/tf009.ts +59 -0
- package/src/lint/post-synth/tf010.ts +51 -0
- package/src/lint/post-synth/tf011.ts +49 -0
- package/src/lint/post-synth/tf012.ts +47 -0
- package/src/lint/post-synth/tf013.ts +63 -0
- package/src/lint/post-synth/tf014.ts +72 -0
- package/src/lint/post-synth/tf015.ts +72 -0
- package/src/lint/post-synth/tf016.ts +75 -0
- package/src/lint/post-synth/tf017.ts +50 -0
- package/src/lint/post-synth/tf018.ts +72 -0
- package/src/lint/post-synth/tf019.ts +72 -0
- package/src/lint/post-synth/tf020.ts +123 -0
- package/src/lint/post-synth/tf021.ts +126 -0
- package/src/lint/post-synth/tf022.ts +61 -0
- package/src/lint/post-synth/tf024.test.ts +42 -0
- package/src/lint/post-synth/tf024.ts +70 -0
- package/src/lint/post-synth/tf025.test.ts +46 -0
- package/src/lint/post-synth/tf025.ts +101 -0
- package/src/lint/post-synth/tf026.test.ts +56 -0
- package/src/lint/post-synth/tf026.ts +84 -0
- package/src/lint/post-synth/tf027.test.ts +62 -0
- package/src/lint/post-synth/tf027.ts +74 -0
- package/src/lint/post-synth/tf028.test.ts +92 -0
- package/src/lint/post-synth/tf028.ts +96 -0
- package/src/lint/presets.test.ts +72 -0
- package/src/lint/rules/fixtures/TF101/negative-op.ts +2 -0
- package/src/lint/rules/fixtures/TF101/positive-op.ts +2 -0
- package/src/lint/rules/fixtures/load.ts +53 -0
- package/src/lint/rules/plan-before-apply.test.ts +112 -7
- package/src/lint/rules/plan-before-apply.ts +11 -0
- package/src/lint/secret-shape.test.ts +150 -0
- package/src/lint/secret-shape.ts +159 -0
- package/src/live-ownership.ts +60 -0
- package/src/lsp/completions.test.ts +3 -2
- package/src/lsp/option-keys.ts +12 -6
- package/src/op/activities/choudoufu.acceptance.test.ts +127 -0
- package/src/op/activities/choudoufu.test.ts +725 -0
- package/src/op/activities/index.ts +40 -4
- package/src/op/activities/live-detect.test.ts +143 -0
- package/src/op/activities/live-detect.ts +162 -0
- package/src/op/activities/registry.test.ts +11 -3
- package/src/op/activities/terraform.test.ts +7 -3
- package/src/op/activities/terraform.ts +861 -69
- package/src/op/activity-contracts.test.ts +147 -0
- package/src/op/activity-contracts.ts +178 -0
- package/src/op/adoption.test.ts +170 -0
- package/src/op/adoption.ts +241 -0
- package/src/op/builders.test.ts +60 -5
- package/src/op/builders.ts +95 -5
- package/src/op/resolve-root-mode.test.ts +85 -0
- package/src/op/resolve-root-mode.ts +86 -0
- package/src/plugin.test.ts +106 -0
- package/src/plugin.ts +186 -29
- package/src/skills/chant-terraform.md +1 -1
- package/src/validate.ts +10 -1
package/README.md
CHANGED
|
@@ -51,3 +51,12 @@ just docs
|
|
|
51
51
|
- `src/lint/rules/`, source-level lint rules
|
|
52
52
|
- `src/lint/post-synth/`, checks over the parsed roots (TF001 and up)
|
|
53
53
|
- `src/lsp/`, LSP completions and hover
|
|
54
|
+
|
|
55
|
+
## Acceptance evidence
|
|
56
|
+
|
|
57
|
+
Four `describe` blocks run this lexicon against a real `terraform`, `tofu` or
|
|
58
|
+
`choudoufu` binary, and each of them skips rather than fails when its
|
|
59
|
+
dependency is absent. `src/__fixtures__/ACCEPTANCE.md` records, per block,
|
|
60
|
+
what it proves, what gates it, the command that runs it, and the last binary
|
|
61
|
+
and emulator it passed against with the date. Two of the four have never
|
|
62
|
+
passed against anything, and that file says so.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TerraformAdoptOp composite (#2105): claim the live resources a choudoufu
|
|
3
|
+
* estate's configuration already describes.
|
|
4
|
+
*
|
|
5
|
+
* The reconcile position on the lifecycle dial, for the one backend that has
|
|
6
|
+
* a typed path from live back to the configuration. chant #2089 deferred
|
|
7
|
+
* reconcile for the terraform lexicon because stock Terraform has none: a live
|
|
8
|
+
* resource nobody has imported is knowable only as HCL somebody writes, and
|
|
9
|
+
* generating that is a different problem. choudoufu changes the question
|
|
10
|
+
* rather than answering the old one. Ownership there is two tags on the
|
|
11
|
+
* resource (`live/MARKERS.md`), `live-plan` already names every live resource
|
|
12
|
+
* that exactly matches a declared block and carries no marker, and it prints
|
|
13
|
+
* the two values that would claim it. Cloud-to-code here is "claim what the
|
|
14
|
+
* configuration already describes" — a tag write, not a regeneration.
|
|
15
|
+
*
|
|
16
|
+
* Phases: Check, Ledger, Gate, Adopt.
|
|
17
|
+
*
|
|
18
|
+
* - **Check** runs `live-check`, which makes no cloud calls and says whether
|
|
19
|
+
* this configuration can move under markers at all. It runs first because
|
|
20
|
+
* a root that `live-check` refuses will produce an adoption ledger that
|
|
21
|
+
* reads as authoritative and is not, and the cheapest place to find that
|
|
22
|
+
* out is before the estate-wide sweep.
|
|
23
|
+
* - **Ledger** runs `live-plan` with `adoptionOnly`, so the run's human half
|
|
24
|
+
* is choudoufu's own adoption ledger (GitHub issue #587) and its machine
|
|
25
|
+
* half is the bound/omissions/unowned document (#788). The ledger is the
|
|
26
|
+
* approval subject; the document is what the Adopt step acts on.
|
|
27
|
+
* - **Gate** always. Adoption writes tags onto resources this estate does
|
|
28
|
+
* not yet own, which is the moment the estate's boundary moves, and no
|
|
29
|
+
* reading of that is routine enough to skip. There is no `gate: "never"`
|
|
30
|
+
* here, unlike `TerraformApplyOp`, so every run stops at the gate until
|
|
31
|
+
* someone has approved it. A gate is a fact on the gate ledger (#2119):
|
|
32
|
+
* `chant run` records that the run is waiting, ends with status `gated`
|
|
33
|
+
* and exits 3, `chant approve <op> <gate>` writes the resolution, and the
|
|
34
|
+
* next run reads it and walks through to the Adopt phase.
|
|
35
|
+
* - **Adopt** writes the markers. See `choudoufuAdopt`'s own doc for the
|
|
36
|
+
* mechanism and why it is the tag write rather than choudoufu's `adopt`
|
|
37
|
+
* policy verb.
|
|
38
|
+
*
|
|
39
|
+
* ## The adopt mechanism, and why it is not the policy verb
|
|
40
|
+
*
|
|
41
|
+
* choudoufu's `policy` block has an `adopt` verb for the declared-but-unmarked
|
|
42
|
+
* quadrant, and its migration guide names `policy { declared_untagged =
|
|
43
|
+
* "adopt" }` as the way to claim a whole estate at once. That is the smaller
|
|
44
|
+
* write, and #2105 tried to reach it from outside the configuration. It is not
|
|
45
|
+
* reachable: a `live` block in a terraform override file is dropped in silence
|
|
46
|
+
* (choudoufu's `Module.mergeFile` has no `Lives` case), a second primary file
|
|
47
|
+
* carrying one is refused as a duplicate, and a sidecar beside an in-block
|
|
48
|
+
* form is refused as two sources of truth. What is left is editing the root's
|
|
49
|
+
* own checked-in live configuration around an apply, which leaves an estate
|
|
50
|
+
* declaring "adopt everything declared and unmarked" if the run dies between
|
|
51
|
+
* the two edits.
|
|
52
|
+
*
|
|
53
|
+
* So the mechanism is the tag write, which choudoufu's migration guide calls
|
|
54
|
+
* the whole contract: "There is no `choudoufu adopt` command and no need for
|
|
55
|
+
* one. Two tags is the whole contract, so any tool that writes two tags can
|
|
56
|
+
* adopt a resource." Each write runs the paste-ready command choudoufu itself
|
|
57
|
+
* printed in the ledger, carrying its own provider configuration's region and
|
|
58
|
+
* endpoint. `choudoufuAdopt` has the measurements behind that ruling.
|
|
59
|
+
*
|
|
60
|
+
* ## Ambiguity is reported, never resolved
|
|
61
|
+
*
|
|
62
|
+
* Two live resources at one declared identity are two `unowned` entries with
|
|
63
|
+
* the same address, and no single tag write claims that address. Those
|
|
64
|
+
* candidates never enter the adoptable set; the Adopt step is handed them
|
|
65
|
+
* separately so the Op's own result names what it declined and why, beside
|
|
66
|
+
* what it wrote.
|
|
67
|
+
*
|
|
68
|
+
* ## Compensation
|
|
69
|
+
*
|
|
70
|
+
* Refused without a command, the same stance `TerraformApplyOp` takes.
|
|
71
|
+
* Un-adopting is `untag`: dropping this estate's marker from a live resource,
|
|
72
|
+
* which is a decision about the estate rather than something chant can
|
|
73
|
+
* synthesize. It is also not always the right undo — a resource that was
|
|
74
|
+
* already carrying the markers before this run is not one this run adopted.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* import { TerraformAdoptOp } from "@intentius/chant-lexicon-terraform";
|
|
79
|
+
*
|
|
80
|
+
* export const { op } = TerraformAdoptOp({ name: "estate-adopt", root: "estate" });
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
import { OpResource } from "@intentius/chant/op";
|
|
84
|
+
export interface TerraformAdoptOpConfig {
|
|
85
|
+
/** Op name (kebab-case). `gateName` defaults to `approve-<name>`. */
|
|
86
|
+
name: string;
|
|
87
|
+
/** Key into the project's `terraform.roots`. Must be a live root: choudoufu, with a declared estate. */
|
|
88
|
+
root: string;
|
|
89
|
+
/**
|
|
90
|
+
* The estate whose markers this run looks for. Omitted, `choudoufuLivePlan`
|
|
91
|
+
* auto-detects it from the root's own `live` block or `estate.chdf.hcl`
|
|
92
|
+
* sidecar, which is the usual case.
|
|
93
|
+
*/
|
|
94
|
+
estate?: string;
|
|
95
|
+
/** The gate's name. Default: `approve-<name>`, as `TerraformApplyOp` does. */
|
|
96
|
+
gateName?: string;
|
|
97
|
+
/**
|
|
98
|
+
* @deprecated The gate's name was `signalName` through 0.58.0 and is
|
|
99
|
+
* `gateName` since #2202, matching `TerraformApplyOp`. Removed in 0.60.0.
|
|
100
|
+
*/
|
|
101
|
+
signalName?: string;
|
|
102
|
+
/** How long a recorded pending gate stays valid, as a duration string. Default: core's own (48h). */
|
|
103
|
+
gateTimeout?: string;
|
|
104
|
+
/** Override the gate description shown to the approver. */
|
|
105
|
+
gateDescription?: string;
|
|
106
|
+
/**
|
|
107
|
+
* Directory each step starts the `chant.config.*` search from, which is what
|
|
108
|
+
* `terraform.roots` and the root's relative `dir` resolve against. Default:
|
|
109
|
+
* the running process's cwd.
|
|
110
|
+
*/
|
|
111
|
+
cwd?: string;
|
|
112
|
+
/**
|
|
113
|
+
* Saga-style rollback on a failed adoption, run as an `onFailure` phase.
|
|
114
|
+
*
|
|
115
|
+
* Refused without a command. Undoing an adoption is `untag` — removing this
|
|
116
|
+
* estate's marker from a live resource — which is a decision about the
|
|
117
|
+
* estate, and one this Op cannot even scope correctly: a resource that
|
|
118
|
+
* already carried the markers is not one this run claimed. So `true`, or an
|
|
119
|
+
* object with no `command`, throws when the Op is built, naming the Op,
|
|
120
|
+
* rather than warning at the moment a rollback is already wanted.
|
|
121
|
+
*/
|
|
122
|
+
compensate?: boolean | {
|
|
123
|
+
command?: string;
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export interface TerraformAdoptOpResources {
|
|
127
|
+
/** Op resource. Generates the Check/Ledger/Gate/Adopt workflow. */
|
|
128
|
+
op: InstanceType<typeof OpResource>;
|
|
129
|
+
}
|
|
130
|
+
export declare function TerraformAdoptOp(config: TerraformAdoptOpConfig): TerraformAdoptOpResources;
|
|
131
|
+
//# sourceMappingURL=terraform-adopt-op.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terraform-adopt-op.d.ts","sourceRoot":"","sources":["../../src/composites/terraform-adopt-op.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiFG;AAEH,OAAO,EAA6B,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAO5E,MAAM,WAAW,sBAAsB;IACrC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,wGAAwG;IACxG,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;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,CAiE1F"}
|
|
@@ -1,17 +1,66 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* TerraformApplyOp composite (#2086)
|
|
2
|
+
* TerraformApplyOp composite (#2086), init, plan, approve, apply for one root
|
|
3
3
|
* module named in `terraform.roots`.
|
|
4
4
|
*
|
|
5
5
|
* Authority stays with terraform: chant runs the binary, reads its plan, and
|
|
6
|
-
* hands the same saved plan to apply. The Apply step never
|
|
7
|
-
* it takes the Plan step's own `planFile` as a
|
|
8
|
-
*
|
|
6
|
+
* hands the same saved plan to apply. The Apply step never applies something
|
|
7
|
+
* no gate saw, because it takes the Plan step's own `planFile` as a
|
|
8
|
+
* `StepOutputRef`.
|
|
9
9
|
*
|
|
10
|
-
* Phases: Init, Plan, Gate, Apply.
|
|
10
|
+
* Phases: Init, Plan, Gate, Apply. One shape, both kinds of root. A live root
|
|
11
|
+
* (#2103, `terraform.binary: "choudoufu"` plus a declared estate) ran a
|
|
12
|
+
* different shape for one release, because choudoufu refused `-out` and
|
|
13
|
+
* `apply <planfile>`; choudoufu v0.13.0 admits both under a `live` block
|
|
14
|
+
* ([choudoufu #878](https://github.com/INTENTIUS/choudoufu/issues/878),
|
|
15
|
+
* PR 889), so the plan-file discipline is back and the two shapes are one
|
|
16
|
+
* again.
|
|
11
17
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
18
|
+
* **What the approval covers on a live root.** `plan -out=<planFile>` writes
|
|
19
|
+
* stock's own plan file, and that file is what the approver reads and what
|
|
20
|
+
* the Apply step names. `apply <planFile>` does not replay it: prior state on
|
|
21
|
+
* a live root is a projection rebuilt from the live system every run, so the
|
|
22
|
+
* apply re-plans against the live system the way every live-markers run does,
|
|
23
|
+
* then compares its fresh plan with the file's. Same addresses, same actions,
|
|
24
|
+
* same live objects, and the same planned values, or it refuses before
|
|
25
|
+
* anything changes:
|
|
26
|
+
*
|
|
27
|
+
* - `The approved plan no longer matches the live system`, and
|
|
28
|
+
* - `The approved plan belongs to a different estate`,
|
|
29
|
+
*
|
|
30
|
+
* both with exit status **3**, which is neither 1 (any ordinary failure) nor
|
|
31
|
+
* `-detailed-exitcode`'s 2. `terraformApply` maps that status to a named
|
|
32
|
+
* result rather than a thrown error (`refused: "approval-mismatch" |
|
|
33
|
+
* "wrong-estate"`, with choudoufu's message in `refusal`), so a workflow
|
|
34
|
+
* reading the Apply step's output can route the run back to review instead of
|
|
35
|
+
* treating it as a broken step. The seam #2106 left named and unused on the
|
|
36
|
+
* apply args is now the plan file itself.
|
|
37
|
+
*
|
|
38
|
+
* TF101 therefore fires on a live root's `terraformApply` call again: there
|
|
39
|
+
* is a plan file to pair once more, and pairing it is what the refusal above
|
|
40
|
+
* has to compare against.
|
|
41
|
+
*
|
|
42
|
+
* **Delete modes.** chant's `delete: "never" | "owned-only" | "gated"`
|
|
43
|
+
* (`terraform.roots.<name>.delete`, `../config.ts`) maps onto choudoufu's
|
|
44
|
+
* `policy` block. `"owned-only"` is choudoufu's own default verb for the
|
|
45
|
+
* `undeclared_tagged` quadrant (an orphaned marked resource) and needs
|
|
46
|
+
* nothing; `"gated"` needs nothing beyond this composite's own approval gate;
|
|
47
|
+
* `"never"` requires the root's `policy` block to set `undeclared_tagged` to
|
|
48
|
+
* `"keep"`, `"untag"` or `"report"`, and TF026 (`../lint/post-synth/tf026.ts`)
|
|
49
|
+
* enforces that at build time, naming the setting to add. Separately, and
|
|
50
|
+
* regardless of `delete`, this composite refuses outright to build against a
|
|
51
|
+
* root whose `policy` sets `undeclared_untagged = "delete"` (account-scoped
|
|
52
|
+
* reconciliation, which needs a `scope` block): that quadrant deletes
|
|
53
|
+
* resources the estate never claimed, anywhere the scope reaches, and chant
|
|
54
|
+
* never proposes deleting a resource it does not own, not for a root, and not
|
|
55
|
+
* for an Op it generated.
|
|
56
|
+
*
|
|
57
|
+
* A gate is a fact on the gate ledger, not a wait (#2119). Reaching one,
|
|
58
|
+
* `chant run` consults the ledger (`packages/core/src/op/gate.ts`): a
|
|
59
|
+
* resolution newer than the gate's newest pending fact lets the run walk
|
|
60
|
+
* through, and anything else records the pending fact and ends the run with
|
|
61
|
+
* status `gated` and exit 3. `chant approve <op> <gate>` writes the
|
|
62
|
+
* resolution, and the next run reads it. `gate: "never"` drops the Gate phase
|
|
63
|
+
* entirely, so a run never stops.
|
|
15
64
|
*
|
|
16
65
|
* @example
|
|
17
66
|
* ```typescript
|
|
@@ -29,13 +78,13 @@ import { OpResource } from "@intentius/chant/op";
|
|
|
29
78
|
* cannot branch at build time on a count the plan only produces at run time.
|
|
30
79
|
* The workable v1 is that `"on-destroy"` and `"always"` emit the same Gate
|
|
31
80
|
* phase, and the approver is told what is at stake instead: the phase reports
|
|
32
|
-
* the plan's `destroys` count as the `Destroys`
|
|
33
|
-
*
|
|
34
|
-
* plan turns out additive is a new step kind, out of scope here.
|
|
81
|
+
* the plan's `destroys` count as the `Destroys` run outcome before the
|
|
82
|
+
* gate is reached, and the gate description says so. A gate that skips itself
|
|
83
|
+
* when the plan turns out additive is a new step kind, out of scope here.
|
|
35
84
|
*/
|
|
36
85
|
export type TerraformGateMode = "on-destroy" | "always" | "never";
|
|
37
86
|
export interface TerraformApplyOpConfig {
|
|
38
|
-
/** Op name (kebab-case).
|
|
87
|
+
/** Op name (kebab-case). `gateName` defaults to `approve-<name>`. */
|
|
39
88
|
name: string;
|
|
40
89
|
/** Key into the project's `terraform.roots`. The root carries dir, workspace, var files and backend config. */
|
|
41
90
|
root: string;
|
|
@@ -47,9 +96,15 @@ export interface TerraformApplyOpConfig {
|
|
|
47
96
|
* same phase.
|
|
48
97
|
*/
|
|
49
98
|
gate?: TerraformGateMode;
|
|
50
|
-
/**
|
|
99
|
+
/** The gate's name. Default: `approve-<name>`, as `ApplyOp` does. */
|
|
100
|
+
gateName?: string;
|
|
101
|
+
/**
|
|
102
|
+
* @deprecated The gate's name was `signalName` through 0.58.0 and is
|
|
103
|
+
* `gateName` since #2202 (`gate` is taken here by {@link TerraformGateMode}).
|
|
104
|
+
* Still read; removed in 0.60.0.
|
|
105
|
+
*/
|
|
51
106
|
signalName?: string;
|
|
52
|
-
/**
|
|
107
|
+
/** How long a recorded pending gate stays valid, as a duration string. Default: core's own (48h). */
|
|
53
108
|
gateTimeout?: string;
|
|
54
109
|
/** Override the gate description shown to the approver. */
|
|
55
110
|
gateDescription?: string;
|
|
@@ -68,7 +123,7 @@ export interface TerraformApplyOpConfig {
|
|
|
68
123
|
* Terraform has no automatic rollback: a half-applied plan is undone by
|
|
69
124
|
* planning and applying the inverse, which is a decision about the estate
|
|
70
125
|
* rather than something chant can synthesize. So compensation here is
|
|
71
|
-
* total or refused, the same stance `ApplyOp` takes (`
|
|
126
|
+
* total or refused, the same stance `ApplyOp` takes (`packages/core/src/op/
|
|
72
127
|
* composites/apply-op.ts`) — `true`, or an object with no `command`, throws
|
|
73
128
|
* when the Op is built, naming the Op, rather than warning at the moment a
|
|
74
129
|
* rollback is already needed. Supply `compensate: { command: "..." }` with a
|
|
@@ -77,8 +132,6 @@ export interface TerraformApplyOpConfig {
|
|
|
77
132
|
compensate?: boolean | {
|
|
78
133
|
command?: string;
|
|
79
134
|
};
|
|
80
|
-
/** Override the task queue. Defaults to `name`. */
|
|
81
|
-
taskQueue?: string;
|
|
82
135
|
}
|
|
83
136
|
export interface TerraformApplyOpResources {
|
|
84
137
|
/** Op resource — generates the Init/Plan/[Gate]/Apply workflow. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terraform-apply-op.d.ts","sourceRoot":"","sources":["../../src/composites/terraform-apply-op.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"terraform-apply-op.d.ts","sourceRoot":"","sources":["../../src/composites/terraform-apply-op.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AAEH,OAAO,EAA6B,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAW5E;;;;;;;;;;;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,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;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,CA2G1F"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* the plan found. `terraform plan -detailed-exitcode` is the whole mechanism.
|
|
8
8
|
* Exit 0 is "the world matches the configuration", exit 2 is drift, and
|
|
9
9
|
* `terraformPlan` turns that into the boolean `changed`, which rides out of
|
|
10
|
-
* the Op as the `Drift`
|
|
10
|
+
* the Op as the run's `Drift` outcome.
|
|
11
11
|
*
|
|
12
12
|
* Phases: Init, Plan, and (for a finding mode that opens something) Report.
|
|
13
13
|
*
|
|
@@ -23,37 +23,59 @@
|
|
|
23
23
|
* post the JSON, and `terraform-watch-op.test.ts` asserts no reference to it
|
|
24
24
|
* reaches the finding step.
|
|
25
25
|
*
|
|
26
|
+
* The same rule holds on a live root, where the JSON is choudoufu's own
|
|
27
|
+
* bound/omissions/unowned document rather than a plan representation, and
|
|
28
|
+
* carries live identities and tag values for every resource the estate
|
|
29
|
+
* touched. `choudoufuLivePlan` composes the plan text and the adoption ledger
|
|
30
|
+
* into one `finding` string for exactly this reason: the body is one
|
|
31
|
+
* reference to one text field, so there is no arrangement of the args in
|
|
32
|
+
* which the document reaches a body.
|
|
33
|
+
*
|
|
34
|
+
* ## A live root reports three things, not one (#2105)
|
|
35
|
+
*
|
|
36
|
+
* `live: true` swaps the Plan step for `choudoufuLivePlan`. On a choudoufu
|
|
37
|
+
* root ownership is a pair of tags on the resource rather than an entry in a
|
|
38
|
+
* state file, so a plan against the live system can answer three questions
|
|
39
|
+
* where a stock plan answers one: whether the estate drifted (the
|
|
40
|
+
* `-detailed-exitcode` exit, `Drift` as before), how many live resources sit
|
|
41
|
+
* at a declared identity carrying no marker (`Unowned`), and how many of those
|
|
42
|
+
* an exact content match makes claimable (`Adoptable`). All three come off a
|
|
43
|
+
* single live read, published as three run outcomes from the one step.
|
|
44
|
+
*
|
|
45
|
+
* The finding modes then carry the adoption ledger under the plan text: one
|
|
46
|
+
* line per adoptable match with its address, its live identity and the
|
|
47
|
+
* `tofu-estate`/`tofu-address` values that claim it, in the row form
|
|
48
|
+
* `live-plan -adoption-only` prints, followed by any contested address. That
|
|
49
|
+
* is a report, not an action. `TerraformAdoptOp` next door is what writes the
|
|
50
|
+
* markers, and it gates first.
|
|
51
|
+
*
|
|
26
52
|
* ## Findings reuse `reconcilePr`
|
|
27
53
|
*
|
|
28
|
-
* `issue` and `pull-request` call
|
|
29
|
-
*
|
|
30
|
-
*
|
|
54
|
+
* `issue`, `comment` and `pull-request` call core's `reconcilePr` activity,
|
|
55
|
+
* the one place in chant that shells to `gh`, rather than growing a second
|
|
56
|
+
* copy of those calls here.
|
|
31
57
|
* That activity built its own change-set summary and had no way to be handed
|
|
32
58
|
* one, so #2087 added a single field to it (`ReconcilePrArgs.body`), which is
|
|
33
59
|
* what carries the `-no-color` plan through. Note that the pull-request mode
|
|
34
60
|
* of `reconcilePr` regenerates chant TypeScript via `chant import`; a
|
|
35
|
-
* terraform-native regeneration of HCL from live state is #2089, so
|
|
36
|
-
*
|
|
37
|
-
* `"pull-request"` opens a PR whose body is the plan.
|
|
61
|
+
* terraform-native regeneration of HCL from live state is #2089, so
|
|
62
|
+
* `findingMode: "issue"` is the mode with an end-to-end answer and
|
|
63
|
+
* `"pull-request"` opens a PR whose body is the plan. `"comment"` (#2231) is
|
|
64
|
+
* the mode for the plan-on-pull-request shape: the plan is posted onto the
|
|
65
|
+
* pull request that triggered the run and re-edited there on the next push,
|
|
66
|
+
* which is where a reviewer is already looking. It needs that trigger; a run
|
|
67
|
+
* without one fails the Report step by name rather than posting elsewhere. On a live root #2089's
|
|
68
|
+
* question has a different answer rather than a pending one, and it is not
|
|
69
|
+
* regeneration: see `TerraformAdoptOp`.
|
|
38
70
|
*
|
|
39
71
|
* ## The schedule
|
|
40
72
|
*
|
|
41
|
-
* A cron
|
|
42
|
-
* `
|
|
43
|
-
* `
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* project that installs terraform and runs `chant run` on the local executor
|
|
48
|
-
* could not load `@intentius/chant-lexicon-terraform` at all without also
|
|
49
|
-
* installing temporal. The declarable is the same one temporal's
|
|
50
|
-
* `TemporalSchedule` produces (`createResource("Temporal::Schedule",
|
|
51
|
-
* "temporal", {})`, `lexicons/temporal/src/resources.ts`), so temporal's
|
|
52
|
-
* serializer renders it unchanged when a project has both.
|
|
53
|
-
*
|
|
54
|
-
* A project with no Temporal at all runs the same Op on a CI cron instead:
|
|
55
|
-
* `generateOpsPipeline` against the github lexicon turns the Op plus its cron
|
|
56
|
-
* into a workflow. `examples/scheduled-watch/` is that recipe.
|
|
73
|
+
* A cron lands on the Op itself as `schedule` (#2120), the same field
|
|
74
|
+
* `WatchOp` and `ConvergeOp` set. It is runtime-neutral data: `chant
|
|
75
|
+
* operator` reads it as this Op's tick cadence, `generateOpsPipeline` against
|
|
76
|
+
* the github lexicon renders it as a CI cron, and a hosting lexicon hands it
|
|
77
|
+
* to its own scheduler. The one-shot `chant run app-watch` path ignores it.
|
|
78
|
+
* `examples/scheduled-watch/` is the CI recipe.
|
|
57
79
|
*
|
|
58
80
|
* @example
|
|
59
81
|
* ```typescript
|
|
@@ -62,41 +84,90 @@
|
|
|
62
84
|
* // one-shot, local executor: chant run app-watch
|
|
63
85
|
* export const { op } = TerraformWatchOp({ name: "app-watch", root: "app" });
|
|
64
86
|
*
|
|
87
|
+
* // the plan as a sticky comment on the pull request that triggered the run
|
|
88
|
+
* export const { op } = TerraformWatchOp({
|
|
89
|
+
* name: "app-plan",
|
|
90
|
+
* root: "app",
|
|
91
|
+
* findingMode: "comment",
|
|
92
|
+
* });
|
|
93
|
+
*
|
|
65
94
|
* // nightly, opening an issue when the plan is non-empty
|
|
66
|
-
* export const { op
|
|
95
|
+
* export const { op } = TerraformWatchOp({
|
|
67
96
|
* name: "app-watch",
|
|
68
97
|
* root: "app",
|
|
69
98
|
* schedule: "0 6 * * *",
|
|
70
99
|
* findingMode: "issue",
|
|
71
100
|
* });
|
|
101
|
+
*
|
|
102
|
+
* // a choudoufu estate: drift, unowned and adoptable, with the ledger in the issue
|
|
103
|
+
* export const { op } = TerraformWatchOp({
|
|
104
|
+
* name: "estate-watch",
|
|
105
|
+
* root: "estate",
|
|
106
|
+
* live: true,
|
|
107
|
+
* findingMode: "issue",
|
|
108
|
+
* });
|
|
72
109
|
* ```
|
|
73
110
|
*/
|
|
74
111
|
import { OpResource } from "@intentius/chant/op";
|
|
75
|
-
import type { Declarable } from "@intentius/chant/declarable";
|
|
76
112
|
/**
|
|
77
113
|
* What to do with a non-empty plan. A subset of core's `OpFindingMode`
|
|
78
114
|
* (`packages/core/src/lexicon.ts`): `merge-request` is GitLab's spelling of
|
|
79
115
|
* `pull-request` and is produced by the CI generator, not chosen here.
|
|
116
|
+
*
|
|
117
|
+
* `comment` (#2231) is the mode a plan-on-pull-request Op wants: the plan
|
|
118
|
+
* lands as one comment on the pull request that triggered the run and the
|
|
119
|
+
* next push edits that same comment. It needs a `pull_request` trigger on the
|
|
120
|
+
* `ScheduledOpSpec` the workflow is generated from, and the github generator
|
|
121
|
+
* refuses it by name on any other trigger.
|
|
80
122
|
*/
|
|
81
|
-
export type TerraformFindingMode = "report" | "issue" | "pull-request";
|
|
123
|
+
export type TerraformFindingMode = "report" | "issue" | "comment" | "pull-request";
|
|
82
124
|
export interface TerraformWatchOpConfig {
|
|
83
|
-
/** Op name (kebab-case).
|
|
125
|
+
/** Op name (kebab-case). */
|
|
84
126
|
name: string;
|
|
85
127
|
/** Key into the project's `terraform.roots`. The root carries dir, workspace, var files and backend config. */
|
|
86
128
|
root: string;
|
|
87
129
|
/**
|
|
88
|
-
* Cron expression. When set,
|
|
89
|
-
*
|
|
90
|
-
*
|
|
130
|
+
* Cron expression. When set, it lands on the Op as `schedule` — the cadence
|
|
131
|
+
* `chant operator` ticks on and `generateOpsPipeline` renders as a CI cron.
|
|
132
|
+
* Omit for one-shot `chant run` on the local executor.
|
|
91
133
|
*/
|
|
92
134
|
schedule?: string;
|
|
93
135
|
/**
|
|
94
136
|
* What to do when the plan proposes changes. Default: `"report"`, which
|
|
95
|
-
* opens nothing. The `Drift`
|
|
137
|
+
* opens nothing. The `Drift` run outcome and the run's own log are
|
|
96
138
|
* the report.
|
|
97
139
|
*/
|
|
98
140
|
findingMode?: TerraformFindingMode;
|
|
99
|
-
/**
|
|
141
|
+
/**
|
|
142
|
+
* Watch a live root (#2105): the root runs `terraform.binary: "choudoufu"`
|
|
143
|
+
* and declares an estate, so the Plan phase is `choudoufuLivePlan` rather
|
|
144
|
+
* than `terraformPlan`. See the module doc for what changes.
|
|
145
|
+
*
|
|
146
|
+
* Declared here rather than detected, because a composite is built by
|
|
147
|
+
* `chant build` without reading a root module's `.tf` files. The activities
|
|
148
|
+
* detect the estate at run time (`op/activities/live-detect.ts`), but by then
|
|
149
|
+
* the phases are already serialized.
|
|
150
|
+
*
|
|
151
|
+
* Two things check the answer against the root's real mode, since a wrong
|
|
152
|
+
* one is otherwise silent (#2216). This function refuses a mismatch outright
|
|
153
|
+
* when it can resolve the mode synchronously, which is a
|
|
154
|
+
* `chant.config.json` project (`op/resolve-root-mode.ts`); TF028
|
|
155
|
+
* (`lint/post-synth/tf028.ts`) reports the same mismatch off the parsed HCL
|
|
156
|
+
* for every project, `chant.config.ts` included.
|
|
157
|
+
*/
|
|
158
|
+
live?: boolean;
|
|
159
|
+
/**
|
|
160
|
+
* The estate to plan against, for a live root whose estate this Op should
|
|
161
|
+
* name explicitly. Omitted, `choudoufuLivePlan` auto-detects it from the
|
|
162
|
+
* root's own `live` block or `estate.chdf.hcl` sidecar, which is the usual
|
|
163
|
+
* case. Refused on a stock root.
|
|
164
|
+
*/
|
|
165
|
+
estate?: string;
|
|
166
|
+
/**
|
|
167
|
+
* Plan file the Plan step writes, relative to the root dir. Default:
|
|
168
|
+
* `chant.tfplan`. Refused on a live root, where choudoufu takes no plan file
|
|
169
|
+
* at all.
|
|
170
|
+
*/
|
|
100
171
|
planFile?: string;
|
|
101
172
|
/** `-upgrade` on the Init step: re-resolve provider and module versions. */
|
|
102
173
|
upgrade?: boolean;
|
|
@@ -111,14 +182,10 @@ export interface TerraformWatchOpConfig {
|
|
|
111
182
|
title?: string;
|
|
112
183
|
/** Branch the pull-request mode opens from. Default: `reconcilePr`'s own. */
|
|
113
184
|
branch?: string;
|
|
114
|
-
/** Override the task queue. Defaults to `name`. */
|
|
115
|
-
taskQueue?: string;
|
|
116
185
|
}
|
|
117
186
|
export interface TerraformWatchOpResources {
|
|
118
|
-
/** Op resource. Generates the Init/Plan/[Report]
|
|
187
|
+
/** Op resource. Generates the Init/Plan/[Report] phases. */
|
|
119
188
|
op: InstanceType<typeof OpResource>;
|
|
120
|
-
/** `Temporal::Schedule`, present only when `schedule` was given. */
|
|
121
|
-
schedule?: Declarable;
|
|
122
189
|
}
|
|
123
190
|
export declare function TerraformWatchOp(config: TerraformWatchOpConfig): TerraformWatchOpResources;
|
|
124
191
|
//# sourceMappingURL=terraform-watch-op.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terraform-watch-op.d.ts","sourceRoot":"","sources":["../../src/composites/terraform-watch-op.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"terraform-watch-op.d.ts","sourceRoot":"","sources":["../../src/composites/terraform-watch-op.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6GG;AAEH,OAAO,EAAa,UAAU,EAAqB,MAAM,qBAAqB,CAAC;AAS/E;;;;;;;;;;GAUG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,cAAc,CAAC;AAEnF,MAAM,WAAW,sBAAsB;IACrC,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,+GAA+G;IAC/G,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC;;;;;;;;;;;;;;;;OAgBG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,4DAA4D;IAC5D,EAAE,EAAE,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;CACrC;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,yBAAyB,CA8G1F"}
|
package/dist/config.d.ts
CHANGED
|
@@ -23,6 +23,23 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import { z } from "zod";
|
|
25
25
|
import type { ChantConfig } from "@intentius/chant/config";
|
|
26
|
+
/**
|
|
27
|
+
* chant's cross-lexicon delete-mode vocabulary (`lexicons/k8s/src/op/
|
|
28
|
+
* activities/kubectl.ts`'s `ApplyDeleteMode`, `packages/core/src/op/
|
|
29
|
+
* activities/apply.ts`'s `DeleteMode`), read here for a live root and mapped
|
|
30
|
+
* onto choudoufu's `policy` block (#2106): `"never"` requires the root's
|
|
31
|
+
* `policy` to set `undeclared_tagged` to `"keep"`, `"untag"` or `"report"`
|
|
32
|
+
* (TF026 enforces this at build time); `"owned-only"` is choudoufu's own
|
|
33
|
+
* default verb for that quadrant (`delete`) and needs nothing; `"gated"`
|
|
34
|
+
* needs nothing beyond `TerraformApplyOp`'s own approval gate. Inert on a
|
|
35
|
+
* stock root: choudoufu's `policy` block does not exist there.
|
|
36
|
+
*/
|
|
37
|
+
export declare const terraformDeleteModeSchema: z.ZodEnum<{
|
|
38
|
+
gated: "gated";
|
|
39
|
+
never: "never";
|
|
40
|
+
"owned-only": "owned-only";
|
|
41
|
+
}>;
|
|
42
|
+
export type TerraformDeleteMode = z.infer<typeof terraformDeleteModeSchema>;
|
|
26
43
|
/**
|
|
27
44
|
* One Terraform root module chant reads. `dir` is the only required field:
|
|
28
45
|
* everything else names how the root is invoked rather than what it declares.
|
|
@@ -41,16 +58,40 @@ export declare const terraformRootSchema: z.ZodObject<{
|
|
|
41
58
|
varFiles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
42
59
|
/** `-backend-config` key/value pairs handed to `init`. */
|
|
43
60
|
backendConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
61
|
+
/** This root's declared delete mode. See {@link terraformDeleteModeSchema}. */
|
|
62
|
+
delete: z.ZodOptional<z.ZodEnum<{
|
|
63
|
+
gated: "gated";
|
|
64
|
+
never: "never";
|
|
65
|
+
"owned-only": "owned-only";
|
|
66
|
+
}>>;
|
|
44
67
|
}, z.core.$strict>;
|
|
45
68
|
export declare const terraformConfigSchema: z.ZodObject<{
|
|
46
69
|
/**
|
|
47
|
-
* Which CLI drives the roots.
|
|
48
|
-
* this lexicon does, so the choice is recorded rather than
|
|
70
|
+
* Which CLI drives the roots. `terraform` and `tofu` are wire-compatible
|
|
71
|
+
* for everything this lexicon does, so the choice is recorded rather than
|
|
72
|
+
* inferred. `choudoufu` (#2103) is an OpenTofu fork: a root running it also
|
|
73
|
+
* needs a declared estate (a `live` block or an `estate.chdf.hcl` sidecar,
|
|
74
|
+
* seen by the shared HCL parse) before it counts as live. Declaring the
|
|
75
|
+
* binary alone runs the root stock, exactly as `terraform`/`tofu` do.
|
|
49
76
|
*/
|
|
50
77
|
binary: z.ZodOptional<z.ZodEnum<{
|
|
78
|
+
choudoufu: "choudoufu";
|
|
51
79
|
terraform: "terraform";
|
|
52
80
|
tofu: "tofu";
|
|
53
81
|
}>>;
|
|
82
|
+
/**
|
|
83
|
+
* How far a root's parse follows its `module` calls (#2112), spelled the
|
|
84
|
+
* way tflint spells it. `local` (the default) reads modules sourced from a
|
|
85
|
+
* relative path, so TF014, TF015 and TF020 see inside them; `none` reads
|
|
86
|
+
* only each root's own directory; `all` is reserved for fetching registry
|
|
87
|
+
* and git modules and is refused with a message, since chant fetches
|
|
88
|
+
* nothing. See `hcl/descend.ts`.
|
|
89
|
+
*/
|
|
90
|
+
callModuleType: z.ZodOptional<z.ZodEnum<{
|
|
91
|
+
local: "local";
|
|
92
|
+
none: "none";
|
|
93
|
+
all: "all";
|
|
94
|
+
}>>;
|
|
54
95
|
/** Named root modules. The name is the entity-key prefix, so keep it stable. */
|
|
55
96
|
roots: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
56
97
|
/** Root module directory, relative to the project root (where `chant.config.*` lives). */
|
|
@@ -61,6 +102,12 @@ export declare const terraformConfigSchema: z.ZodObject<{
|
|
|
61
102
|
varFiles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
62
103
|
/** `-backend-config` key/value pairs handed to `init`. */
|
|
63
104
|
backendConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
105
|
+
/** This root's declared delete mode. See {@link terraformDeleteModeSchema}. */
|
|
106
|
+
delete: z.ZodOptional<z.ZodEnum<{
|
|
107
|
+
gated: "gated";
|
|
108
|
+
never: "never";
|
|
109
|
+
"owned-only": "owned-only";
|
|
110
|
+
}>>;
|
|
64
111
|
}, z.core.$strict>>;
|
|
65
112
|
}, z.core.$strict>;
|
|
66
113
|
export type TerraformRootConfig = z.infer<typeof terraformRootSchema>;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB;IAC9B,0FAA0F;;IAE1F,4EAA4E;;IAE5E,0DAA0D;;IAE1D,0DAA0D;;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,yBAAyB;;;;EAA2C,CAAC;AAClF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB;IAC9B,0FAA0F;;IAE1F,4EAA4E;;IAE5E,0DAA0D;;IAE1D,0DAA0D;;IAE1D,+EAA+E;;;;;;kBAE/E,CAAC;AAEH,eAAO,MAAM,qBAAqB;IAChC;;;;;;;OAOG;;;;;;IAEH;;;;;;;OAOG;;;;;;IAEH,gFAAgF;;QA/BhF,0FAA0F;;QAE1F,4EAA4E;;QAE5E,0DAA0D;;QAE1D,0DAA0D;;QAE1D,+EAA+E;;;;;;;kBAyB/E,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,OAAO,QAAQ,yBAAyB,CAAC;IACvC,UAAU,WAAW;QACnB,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC"}
|