@intentius/chant 0.124.45 → 0.124.48
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/dist/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-hold.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-pass.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-skip.json +10 -0
- package/dist/__golden__/wave-loop/op-cost-member-clash.json +6 -0
- package/dist/__golden__/wave-loop/op-cost-member.json +13 -0
- package/dist/__golden__/wave-loop/op-denied-source.json +16 -0
- package/dist/__golden__/wave-loop/op-denied.json +16 -0
- package/dist/__golden__/wave-loop/op-discover-rest-short.json +6 -0
- package/dist/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
- package/dist/__golden__/wave-loop/op-discover-rest.json +26 -0
- package/dist/__golden__/wave-loop/op-discover-wide.json +26 -0
- package/dist/__golden__/wave-loop/op-held-on-again.json +16 -0
- package/dist/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
- package/dist/__golden__/wave-loop/op-held-on.json +16 -0
- package/dist/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-held.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-pass.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-share.json +33 -0
- package/dist/__golden__/wave-loop/op-outcome-held.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
- package/dist/__golden__/wave-loop/op-overridden.json +16 -0
- package/dist/__golden__/wave-loop/op-per-run.json +20 -0
- package/dist/__golden__/wave-loop/op-point.json +13 -0
- package/dist/__golden__/wave-loop/op-pr-review.json +10 -0
- package/dist/__golden__/wave-loop/op-sealed.json +10 -0
- package/dist/__golden__/wave-loop/op-spend-change-only.json +10 -0
- package/dist/__golden__/wave-loop/op-spend.json +10 -0
- package/dist/__golden__/wave-loop/op-wave-commands.json +55 -0
- package/dist/__golden__/wave-loop/op-wide-refused.json +26 -0
- package/dist/__golden__/wave-loop/op-wide-waiting.json +29 -0
- package/dist/__golden__/wave-loop/op-wide.json +39 -0
- package/dist/action-pins.d.ts +61 -0
- package/dist/action-pins.d.ts.map +1 -0
- package/dist/action-pins.js +77 -0
- package/dist/capabilities/aws.paths +148 -0
- package/dist/capabilities/base-mappings.json +122 -0
- package/dist/capabilities/catalog.d.ts +89 -0
- package/dist/capabilities/catalog.d.ts.map +1 -0
- package/dist/capabilities/catalog.js +204 -0
- package/dist/capabilities/language.d.ts +103 -0
- package/dist/capabilities/language.d.ts.map +1 -0
- package/dist/capabilities/language.js +335 -0
- package/dist/capabilities/matcher.d.ts +65 -0
- package/dist/capabilities/matcher.d.ts.map +1 -0
- package/dist/capabilities/matcher.js +299 -0
- package/dist/capabilities/view.d.ts +207 -0
- package/dist/capabilities/view.d.ts.map +1 -0
- package/dist/capabilities/view.js +484 -0
- package/dist/cli/commands/carve.d.ts +3 -0
- package/dist/cli/commands/carve.d.ts.map +1 -1
- package/dist/cli/commands/carve.js +36 -7
- package/dist/cli/commands/import-report.d.ts +26 -0
- package/dist/cli/commands/import-report.d.ts.map +1 -0
- package/dist/cli/commands/import-report.js +65 -0
- package/dist/cli/commands/import.d.ts +11 -1
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/import.js +22 -3
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +1 -0
- package/dist/cli/commands/migrate.d.ts +13 -1
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +134 -10
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +21 -2
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +6 -1
- package/dist/cli/handlers/declared-graph.d.ts +44 -0
- package/dist/cli/handlers/declared-graph.d.ts.map +1 -0
- package/dist/cli/handlers/declared-graph.js +87 -0
- package/dist/cli/handlers/graph.d.ts +25 -0
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/graph.js +93 -87
- package/dist/cli/handlers/ledger.d.ts +3 -0
- package/dist/cli/handlers/ledger.d.ts.map +1 -0
- package/dist/cli/handlers/ledger.js +55 -0
- package/dist/cli/handlers/migrate.d.ts.map +1 -1
- package/dist/cli/handlers/migrate.js +18 -11
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/misc.js +12 -1
- package/dist/cli/handlers/pr-env.d.ts.map +1 -1
- package/dist/cli/handlers/pr-env.js +4 -3
- package/dist/cli/handlers/pr.d.ts +15 -1
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +143 -39
- package/dist/cli/handlers/query.d.ts +7 -2
- package/dist/cli/handlers/query.d.ts.map +1 -1
- package/dist/cli/handlers/query.js +16 -4
- package/dist/cli/handlers/release.d.ts.map +1 -1
- package/dist/cli/handlers/release.js +6 -3
- package/dist/cli/handlers/search-count.d.ts +89 -0
- package/dist/cli/handlers/search-count.d.ts.map +1 -0
- package/dist/cli/handlers/search-count.js +132 -0
- package/dist/cli/handlers/search.d.ts +356 -6
- package/dist/cli/handlers/search.d.ts.map +1 -1
- package/dist/cli/handlers/search.js +1039 -155
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +88 -17
- package/dist/cli/mcp/server.d.ts.map +1 -1
- package/dist/cli/mcp/server.js +3 -0
- package/dist/cli/mcp/tools/capabilities.d.ts +7 -0
- package/dist/cli/mcp/tools/capabilities.d.ts.map +1 -0
- package/dist/cli/mcp/tools/capabilities.js +27 -0
- package/dist/cli/mcp/workspace-tools.d.ts +3 -1
- package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
- package/dist/cli/mcp/workspace-tools.js +47 -2
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +100 -19
- package/dist/cli/registry.d.ts +36 -4
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/components/builders.d.ts +5 -1
- package/dist/components/builders.d.ts.map +1 -1
- package/dist/components/builders.js +5 -0
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.js +16 -1
- package/dist/components/capability-plugin.d.ts +14 -0
- package/dist/components/capability-plugin.d.ts.map +1 -1
- package/dist/components/pr-env-ports.d.ts +29 -0
- package/dist/components/pr-env-ports.d.ts.map +1 -0
- package/dist/components/pr-env-ports.js +77 -0
- package/dist/components/pr-env-run.d.ts +5 -21
- package/dist/components/pr-env-run.d.ts.map +1 -1
- package/dist/components/pr-env-run.js +6 -70
- package/dist/components/pr-environment.d.ts +2 -1
- package/dist/components/pr-environment.d.ts.map +1 -1
- package/dist/components/pr-environment.js +1 -1
- package/dist/components/pr-hooks.d.ts +21 -1
- package/dist/components/pr-hooks.d.ts.map +1 -1
- package/dist/components/pr-hooks.js +72 -4
- package/dist/components/pr-pipeline.d.ts +45 -10
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +47 -14
- package/dist/components/pr-policy.d.ts +36 -0
- package/dist/components/pr-policy.d.ts.map +1 -1
- package/dist/components/pr-policy.js +36 -0
- package/dist/components/starter-plugin.d.ts +1 -0
- package/dist/components/starter-plugin.d.ts.map +1 -1
- package/dist/components/starter-plugin.js +5 -1
- package/dist/components/verbs/index.d.ts +2 -0
- package/dist/components/verbs/index.d.ts.map +1 -1
- package/dist/components/verbs/index.js +2 -0
- package/dist/components/verbs/publish-artifact.d.ts +65 -0
- package/dist/components/verbs/publish-artifact.d.ts.map +1 -0
- package/dist/components/verbs/publish-artifact.js +74 -0
- package/dist/components/verbs/publish-image.d.ts +129 -0
- package/dist/components/verbs/publish-image.d.ts.map +1 -0
- package/dist/components/verbs/publish-image.js +145 -0
- package/dist/config-environments.d.ts +112 -0
- package/dist/config-environments.d.ts.map +1 -0
- package/dist/config-environments.js +114 -0
- package/dist/config.d.ts +32 -84
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -96
- package/dist/gate-decision.d.ts +11 -2
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +15 -3
- package/dist/graph-detail.d.ts.map +1 -1
- package/dist/graph-detail.js +15 -3
- package/dist/graph-effective.d.ts +33 -2
- package/dist/graph-effective.d.ts.map +1 -1
- package/dist/graph-effective.js +215 -68
- package/dist/graph-ir.d.ts +48 -0
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-ir.js +130 -0
- package/dist/graph-sub-template.d.ts +11 -0
- package/dist/graph-sub-template.d.ts.map +1 -0
- package/dist/graph-sub-template.js +19 -0
- package/dist/graph-walk.d.ts +66 -0
- package/dist/graph-walk.d.ts.map +1 -0
- package/dist/graph-walk.js +70 -0
- package/dist/import/parser.d.ts +19 -0
- package/dist/import/parser.d.ts.map +1 -1
- package/dist/lexicon.d.ts +80 -6
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +11 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts +2 -5
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/ledger-read.d.ts +65 -0
- package/dist/lifecycle/ledger-read.d.ts.map +1 -0
- package/dist/lifecycle/ledger-read.js +160 -0
- package/dist/lifecycle/observe.d.ts +28 -0
- package/dist/lifecycle/observe.d.ts.map +1 -1
- package/dist/lifecycle/observe.js +23 -1
- package/dist/lifecycle/release-workstation.d.ts +7 -0
- package/dist/lifecycle/release-workstation.d.ts.map +1 -1
- package/dist/lifecycle/release-workstation.js +25 -0
- package/dist/lifecycle/run-ledger.d.ts +4 -3
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +1 -0
- package/dist/lint/discover.js +3 -1
- package/dist/lint/post-synth.d.ts +127 -1
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lint/post-synth.js +84 -2
- package/dist/lint/rule.d.ts +6 -0
- package/dist/lint/rule.d.ts.map +1 -1
- package/dist/lint/rules/op/index.d.ts +1 -0
- package/dist/lint/rules/op/index.d.ts.map +1 -1
- package/dist/lint/rules/op/index.js +2 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.d.ts +32 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.d.ts.map +1 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.js +63 -0
- package/dist/live-endpoint.d.ts +1 -1
- package/dist/live-endpoint.d.ts.map +1 -1
- package/dist/live-endpoint.js +1 -1
- package/dist/observation.d.ts +48 -1
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +21 -5
- package/dist/op/activities/activity-contracts.d.ts +9 -6
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.js +5 -2
- package/dist/op/activities/index.d.ts +2 -2
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/index.js +1 -1
- package/dist/op/activities/review-agent.d.ts +90 -4
- package/dist/op/activities/review-agent.d.ts.map +1 -1
- package/dist/op/activities/review-agent.js +217 -19
- package/dist/op/activities/work-evidence.d.ts +8 -1
- package/dist/op/activities/work-evidence.d.ts.map +1 -1
- package/dist/op/activities/work-evidence.js +1 -0
- package/dist/op/builders.d.ts +9 -5
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +9 -5
- package/dist/op/composites/apply-op.d.ts +29 -2
- package/dist/op/composites/apply-op.d.ts.map +1 -1
- package/dist/op/composites/apply-op.js +20 -1
- package/dist/op/gate-approval.d.ts +11 -5
- package/dist/op/gate-approval.d.ts.map +1 -1
- package/dist/op/gate-approval.js +11 -6
- package/dist/op/gate-quorum.d.ts +100 -3
- package/dist/op/gate-quorum.d.ts.map +1 -1
- package/dist/op/gate-quorum.js +108 -6
- package/dist/op/gate-review.d.ts +9 -0
- package/dist/op/gate-review.d.ts.map +1 -1
- package/dist/op/gate-review.js +13 -0
- package/dist/op/gate.d.ts +44 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/gate.js +25 -4
- package/dist/op/index.d.ts +3 -3
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/index.js +1 -1
- package/dist/op/local-executor.d.ts +38 -3
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +48 -6
- package/dist/op/op-waves-run.d.ts +26 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +259 -13
- package/dist/op/op-waves.d.ts +72 -5
- package/dist/op/op-waves.d.ts.map +1 -1
- package/dist/op/op-waves.js +110 -15
- package/dist/op/runtime.d.ts +11 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/schedule-overdue.d.ts +16 -0
- package/dist/op/schedule-overdue.d.ts.map +1 -1
- package/dist/op/schedule-overdue.js +36 -0
- package/dist/op/stage-hooks.d.ts +9 -2
- package/dist/op/stage-hooks.d.ts.map +1 -1
- package/dist/op/stage-hooks.js +7 -5
- package/dist/op/workspace-run-env.d.ts +22 -0
- package/dist/op/workspace-run-env.d.ts.map +1 -0
- package/dist/op/workspace-run-env.js +21 -0
- package/dist/pr-forge.d.ts +24 -0
- package/dist/pr-forge.d.ts.map +1 -1
- package/dist/pr-forge.js +47 -0
- package/dist/pr-post.d.ts +42 -0
- package/dist/pr-post.d.ts.map +1 -1
- package/dist/pr-post.js +67 -1
- package/dist/read-filter.d.ts +65 -0
- package/dist/read-filter.d.ts.map +1 -0
- package/dist/read-filter.js +179 -0
- package/dist/run-event.d.ts +1 -1
- package/dist/run-event.d.ts.map +1 -1
- package/dist/terraform/carve.d.ts +24 -3
- package/dist/terraform/carve.d.ts.map +1 -1
- package/dist/terraform/carve.js +32 -14
- package/dist/terraform/cuts.d.ts +97 -0
- package/dist/terraform/cuts.d.ts.map +1 -0
- package/dist/terraform/cuts.js +138 -0
- package/dist/terraform/folds.d.ts +26 -0
- package/dist/terraform/folds.d.ts.map +1 -0
- package/dist/terraform/folds.js +38 -0
- package/dist/terraform/graph.d.ts.map +1 -1
- package/dist/terraform/graph.js +10 -0
- package/dist/terraform/reach.d.ts +140 -0
- package/dist/terraform/reach.d.ts.map +1 -0
- package/dist/terraform/reach.js +170 -0
- package/dist/terraform/score.d.ts +14 -0
- package/dist/terraform/score.d.ts.map +1 -1
- package/dist/terraform/score.js +14 -31
- package/dist/terraform/state.d.ts.map +1 -1
- package/dist/terraform/state.js +4 -2
- package/dist/terraform/types.d.ts +8 -0
- package/dist/terraform/types.d.ts.map +1 -1
- package/dist/wave-blocked.d.ts +10 -1
- package/dist/wave-blocked.d.ts.map +1 -1
- package/dist/wave-blocked.js +31 -3
- package/dist/wave-runtime.mjs +266 -256
- package/dist/workspace/capabilities-contract.d.ts +66 -0
- package/dist/workspace/capabilities-contract.d.ts.map +1 -0
- package/dist/workspace/capabilities-contract.js +107 -0
- package/dist/workspace/capabilities.schema.json +229 -0
- package/dist/workspace/check.schema.json +11 -2
- package/dist/workspace/checks/ci-branch.d.ts +44 -0
- package/dist/workspace/checks/ci-branch.d.ts.map +1 -0
- package/dist/workspace/checks/ci-branch.js +133 -0
- package/dist/workspace/checks/links.d.ts +3 -0
- package/dist/workspace/checks/links.d.ts.map +1 -1
- package/dist/workspace/checks/links.js +12 -1
- package/dist/workspace/checks/org.d.ts +48 -0
- package/dist/workspace/checks/org.d.ts.map +1 -0
- package/dist/workspace/checks/org.js +156 -0
- package/dist/workspace/checks.d.ts +11 -1
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +59 -7
- package/dist/workspace/ci-branches.d.ts +16 -0
- package/dist/workspace/ci-branches.d.ts.map +1 -1
- package/dist/workspace/ci-branches.js +27 -0
- package/dist/workspace/ci-green-cli.js +7 -7
- package/dist/workspace/ci-green-workflow.d.ts +1 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +13 -8
- package/dist/workspace/ci-green.d.ts +14 -0
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +44 -11
- package/dist/workspace/ci-run.d.ts +9 -1
- package/dist/workspace/ci-run.d.ts.map +1 -1
- package/dist/workspace/ci-run.js +67 -6
- package/dist/workspace/ci-serve.d.ts +9 -0
- package/dist/workspace/ci-serve.d.ts.map +1 -1
- package/dist/workspace/ci-serve.js +114 -76
- package/dist/workspace/compose-graph.d.ts +23 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/compose-graph.js +3 -1
- package/dist/workspace/composites.d.ts +4 -1
- package/dist/workspace/composites.d.ts.map +1 -1
- package/dist/workspace/composites.js +5 -2
- package/dist/workspace/composites.schema.json +22 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
- package/dist/workspace/conformance/index.d.ts +1 -1
- package/dist/workspace/conformance/index.d.ts.map +1 -1
- package/dist/workspace/conformance/index.js +39 -2
- package/dist/workspace/cross-root-lint.d.ts +56 -0
- package/dist/workspace/cross-root-lint.d.ts.map +1 -0
- package/dist/workspace/cross-root-lint.js +111 -0
- package/dist/workspace/dbt-models-reader.d.ts +44 -0
- package/dist/workspace/dbt-models-reader.d.ts.map +1 -0
- package/dist/workspace/dbt-models-reader.js +356 -0
- package/dist/workspace/dbt-project-common.d.ts +40 -0
- package/dist/workspace/dbt-project-common.d.ts.map +1 -0
- package/dist/workspace/dbt-project-common.js +106 -0
- package/dist/workspace/dbt-project-reader.d.ts +4 -3
- package/dist/workspace/dbt-project-reader.d.ts.map +1 -1
- package/dist/workspace/dbt-project-reader.js +14 -108
- package/dist/workspace/decision-rank.d.ts +26 -0
- package/dist/workspace/decision-rank.d.ts.map +1 -0
- package/dist/workspace/decision-rank.js +16 -0
- package/dist/workspace/declaration.d.ts +43 -2
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +45 -11
- package/dist/workspace/declaration.schema.json +133 -24
- package/dist/workspace/environments.d.ts +26 -2
- package/dist/workspace/environments.d.ts.map +1 -1
- package/dist/workspace/environments.js +26 -2
- package/dist/workspace/flyway-dir.d.ts +39 -0
- package/dist/workspace/flyway-dir.d.ts.map +1 -0
- package/dist/workspace/flyway-dir.js +104 -0
- package/dist/workspace/flyway-layout.d.ts +96 -0
- package/dist/workspace/flyway-layout.d.ts.map +1 -0
- package/dist/workspace/flyway-layout.js +308 -0
- package/dist/workspace/graph-cache.d.ts +8 -0
- package/dist/workspace/graph-cache.d.ts.map +1 -1
- package/dist/workspace/graph-cache.js +27 -3
- package/dist/workspace/graph-cli.d.ts +39 -2
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/graph-cli.js +92 -32
- package/dist/workspace/graph.schema.json +182 -0
- package/dist/workspace/intent.d.ts +2 -3
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/intent.js +5 -9
- package/dist/workspace/kind-link-readers.d.ts +59 -2
- package/dist/workspace/kind-link-readers.d.ts.map +1 -1
- package/dist/workspace/kind-link-readers.js +17 -1
- package/dist/workspace/kind-readers.d.ts +3 -0
- package/dist/workspace/kind-readers.d.ts.map +1 -1
- package/dist/workspace/kind-readers.js +7 -1
- package/dist/workspace/kinds.d.ts +66 -2
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +98 -4
- package/dist/workspace/ledger.schema.json +158 -0
- package/dist/workspace/lexicon-outputs.d.ts +20 -1
- package/dist/workspace/lexicon-outputs.d.ts.map +1 -1
- package/dist/workspace/lexicon-outputs.js +102 -10
- package/dist/workspace/lineage-check.d.ts +3 -0
- package/dist/workspace/lineage-check.d.ts.map +1 -1
- package/dist/workspace/lineage-check.js +23 -4
- package/dist/workspace/links.d.ts +8 -1
- package/dist/workspace/links.d.ts.map +1 -1
- package/dist/workspace/links.js +25 -1
- package/dist/workspace/ls.d.ts +8 -0
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/ls.js +7 -1
- package/dist/workspace/ls.schema.json +7 -0
- package/dist/workspace/member-commands.d.ts +10 -1
- package/dist/workspace/member-commands.d.ts.map +1 -1
- package/dist/workspace/member-commands.js +71 -6
- package/dist/workspace/migrate-links.d.ts +45 -0
- package/dist/workspace/migrate-links.d.ts.map +1 -0
- package/dist/workspace/migrate-links.js +100 -0
- package/dist/workspace/migration-dirs.d.ts +74 -0
- package/dist/workspace/migration-dirs.d.ts.map +1 -0
- package/dist/workspace/migration-dirs.js +254 -0
- package/dist/workspace/nested-graph.d.ts +2 -0
- package/dist/workspace/nested-graph.d.ts.map +1 -1
- package/dist/workspace/nested-graph.js +32 -1
- package/dist/workspace/reason-codes.d.ts +18 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +23 -0
- package/dist/workspace/records-cli.d.ts +11 -0
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-cli.js +57 -5
- package/dist/workspace/records.schema.json +5 -0
- package/dist/workspace/release-candidates.d.ts +2 -0
- package/dist/workspace/release-candidates.d.ts.map +1 -1
- package/dist/workspace/release-candidates.js +5 -2
- package/dist/workspace/release-train.d.ts +53 -0
- package/dist/workspace/release-train.d.ts.map +1 -0
- package/dist/workspace/release-train.js +134 -0
- package/dist/workspace/release-workflow.d.ts.map +1 -1
- package/dist/workspace/release-workflow.js +4 -3
- package/dist/workspace/repo-ref.d.ts +45 -0
- package/dist/workspace/repo-ref.d.ts.map +1 -0
- package/dist/workspace/repo-ref.js +114 -0
- package/dist/workspace/run-event.schema.json +2 -2
- package/dist/workspace/runs-cli.d.ts +9 -0
- package/dist/workspace/runs-cli.d.ts.map +1 -1
- package/dist/workspace/runs-cli.js +48 -3
- package/dist/workspace/runs.schema.json +7 -0
- package/dist/workspace/search-cli.d.ts +204 -0
- package/dist/workspace/search-cli.d.ts.map +1 -0
- package/dist/workspace/search-cli.js +466 -0
- package/dist/workspace/search-contract.d.ts +56 -0
- package/dist/workspace/search-contract.d.ts.map +1 -0
- package/dist/workspace/search-contract.js +70 -0
- package/dist/workspace/search.schema.json +822 -0
- package/dist/workspace/status-decisions.d.ts +37 -0
- package/dist/workspace/status-decisions.d.ts.map +1 -0
- package/dist/workspace/status-decisions.js +147 -0
- package/dist/workspace/status-gates.d.ts +9 -0
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status.d.ts +4 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +14 -2
- package/dist/workspace/status.schema.json +6 -0
- package/dist/workspace/work-cli.d.ts.map +1 -1
- package/dist/workspace/work-cli.js +5 -3
- package/dist/workspace/work-evidence-ops.d.ts +83 -0
- package/dist/workspace/work-evidence-ops.d.ts.map +1 -0
- package/dist/workspace/work-evidence-ops.js +169 -0
- package/dist/workspace/work-evidence.d.ts +12 -2
- package/dist/workspace/work-evidence.d.ts.map +1 -1
- package/dist/workspace/work-evidence.js +21 -3
- package/dist/workspace/work-evidence.schema.json +49 -2
- package/dist/workspace/workspace-gates.d.ts +110 -0
- package/dist/workspace/workspace-gates.d.ts.map +1 -0
- package/dist/workspace/workspace-gates.js +140 -0
- package/dist/workspace/workspace-kinds.schema.json +58 -3
- package/dist/workspace/workspace-ledger.d.ts +76 -0
- package/dist/workspace/workspace-ledger.d.ts.map +1 -0
- package/dist/workspace/workspace-ledger.js +91 -0
- package/dist/workspace/workspace-run.d.ts +112 -0
- package/dist/workspace/workspace-run.d.ts.map +1 -0
- package/dist/workspace/workspace-run.js +432 -0
- package/package.json +1 -1
- package/src/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-hold.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-pass.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-skip.json +10 -0
- package/src/__golden__/wave-loop/op-cost-member-clash.json +6 -0
- package/src/__golden__/wave-loop/op-cost-member.json +13 -0
- package/src/__golden__/wave-loop/op-denied-source.json +16 -0
- package/src/__golden__/wave-loop/op-denied.json +16 -0
- package/src/__golden__/wave-loop/op-discover-rest-short.json +6 -0
- package/src/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
- package/src/__golden__/wave-loop/op-discover-rest.json +26 -0
- package/src/__golden__/wave-loop/op-discover-wide.json +26 -0
- package/src/__golden__/wave-loop/op-held-on-again.json +16 -0
- package/src/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
- package/src/__golden__/wave-loop/op-held-on.json +16 -0
- package/src/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-held.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-pass.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-share.json +33 -0
- package/src/__golden__/wave-loop/op-outcome-held.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
- package/src/__golden__/wave-loop/op-overridden.json +16 -0
- package/src/__golden__/wave-loop/op-per-run.json +20 -0
- package/src/__golden__/wave-loop/op-point.json +13 -0
- package/src/__golden__/wave-loop/op-pr-review.json +10 -0
- package/src/__golden__/wave-loop/op-sealed.json +10 -0
- package/src/__golden__/wave-loop/op-spend-change-only.json +10 -0
- package/src/__golden__/wave-loop/op-spend.json +10 -0
- package/src/__golden__/wave-loop/op-wave-commands.json +55 -0
- package/src/__golden__/wave-loop/op-wide-refused.json +26 -0
- package/src/__golden__/wave-loop/op-wide-waiting.json +29 -0
- package/src/__golden__/wave-loop/op-wide.json +39 -0
- package/src/__snapshots__/okf.test.ts.snap +10 -0
- package/src/action-pins.test.ts +78 -0
- package/src/action-pins.ts +92 -0
- package/src/capabilities/aws.paths +148 -0
- package/src/capabilities/base-mappings.json +122 -0
- package/src/capabilities/catalog.ts +230 -0
- package/src/capabilities/language.test.ts +191 -0
- package/src/capabilities/language.ts +373 -0
- package/src/capabilities/matcher.ts +315 -0
- package/src/capabilities/view-compose.test.ts +76 -0
- package/src/capabilities/view.ts +631 -0
- package/src/cli/commands/carve-score-once.test.ts +99 -0
- package/src/cli/commands/carve.ts +37 -6
- package/src/cli/commands/check-lexicon.test.ts +2 -2
- package/src/cli/commands/import-report.ts +71 -0
- package/src/cli/commands/import.ts +33 -3
- package/src/cli/commands/lint.ts +1 -0
- package/src/cli/commands/migrate-dialect.test.ts +145 -0
- package/src/cli/commands/migrate.ts +132 -11
- package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +4 -4
- package/src/cli/handlers/approve.ts +23 -2
- package/src/cli/handlers/build.ts +7 -1
- package/src/cli/handlers/declared-graph.ts +99 -0
- package/src/cli/handlers/graph.test.ts +94 -3
- package/src/cli/handlers/graph.ts +123 -96
- package/src/cli/handlers/ledger.ts +54 -0
- package/src/cli/handlers/migrate.ts +21 -12
- package/src/cli/handlers/misc.ts +10 -1
- package/src/cli/handlers/pr-env.ts +3 -4
- package/src/cli/handlers/pr.ts +138 -36
- package/src/cli/handlers/query.ts +16 -4
- package/src/cli/handlers/release.ts +6 -3
- package/src/cli/handlers/search-build-roots.test.ts +144 -0
- package/src/cli/handlers/search-count.test.ts +191 -0
- package/src/cli/handlers/search-count.ts +165 -0
- package/src/cli/handlers/search-json.test.ts +333 -0
- package/src/cli/handlers/search-live.test.ts +387 -0
- package/src/cli/handlers/search-paths.test.ts +235 -0
- package/src/cli/handlers/search.ts +1291 -166
- package/src/cli/main.test.ts +43 -3
- package/src/cli/main.ts +88 -17
- package/src/cli/mcp/server.test.ts +3 -3
- package/src/cli/mcp/server.ts +3 -0
- package/src/cli/mcp/tools/capabilities.ts +32 -0
- package/src/cli/mcp/workspace-tools.e2e.test.ts +21 -1
- package/src/cli/mcp/workspace-tools.ts +47 -2
- package/src/cli/parse-args.ts +79 -15
- package/src/cli/registry.ts +36 -4
- package/src/components/builders.ts +8 -0
- package/src/components/capability-plugin-loader.ts +13 -1
- package/src/components/capability-plugin.ts +16 -0
- package/src/components/pr-env-ports.ts +89 -0
- package/src/components/pr-env-run-bundle.test.ts +54 -0
- package/src/components/pr-env-run.ts +5 -76
- package/src/components/pr-environment.ts +2 -1
- package/src/components/pr-hooks.test.ts +73 -5
- package/src/components/pr-hooks.ts +95 -5
- package/src/components/pr-pipeline.ts +64 -16
- package/src/components/pr-policy.test.ts +64 -1
- package/src/components/pr-policy.ts +53 -0
- package/src/components/registry.test.ts +1 -1
- package/src/components/starter-plugin.ts +6 -0
- package/src/components/verbs/index.ts +2 -0
- package/src/components/verbs/publish-artifact.test.ts +60 -0
- package/src/components/verbs/publish-artifact.ts +122 -0
- package/src/components/verbs/publish-image.test.ts +101 -0
- package/src/components/verbs/publish-image.ts +265 -0
- package/src/config-environments.ts +160 -0
- package/src/config.ts +44 -124
- package/src/gate-decision-bundle.test.ts +1 -0
- package/src/gate-decision-identity.test.ts +9 -0
- package/src/gate-decision.ts +26 -3
- package/src/graph-detail.ts +15 -3
- package/src/graph-effective.ts +226 -75
- package/src/graph-ir.test.ts +163 -0
- package/src/graph-ir.ts +174 -0
- package/src/graph-sub-template.ts +22 -0
- package/src/graph-walk.test.ts +44 -0
- package/src/graph-walk.ts +102 -0
- package/src/import/parser.ts +20 -0
- package/src/lexicon.ts +84 -6
- package/src/lifecycle/gate-ledger.ts +8 -0
- package/src/lifecycle/git.ts +2 -2
- package/src/lifecycle/ledger-read.test.ts +107 -0
- package/src/lifecycle/ledger-read.ts +195 -0
- package/src/lifecycle/observe.test.ts +27 -1
- package/src/lifecycle/observe.ts +43 -1
- package/src/lifecycle/release-workstation.ts +24 -0
- package/src/lifecycle/run-ledger.ts +5 -2
- package/src/lint/cross-root.test.ts +122 -0
- package/src/lint/discover.ts +3 -1
- package/src/lint/post-synth.ts +212 -2
- package/src/lint/rule.ts +6 -0
- package/src/lint/rules/op/index.ts +2 -0
- package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
- package/src/live-endpoint.ts +1 -1
- package/src/observation.test.ts +25 -0
- package/src/observation.ts +69 -5
- package/src/op/activities/activity-contracts.ts +5 -2
- package/src/op/activities/index.ts +2 -2
- package/src/op/activities/review-agent.test.ts +221 -4
- package/src/op/activities/review-agent.ts +265 -22
- package/src/op/activities/work-evidence.ts +9 -1
- package/src/op/builders.ts +9 -5
- package/src/op/composites/apply-op.test.ts +108 -0
- package/src/op/composites/apply-op.ts +37 -2
- package/src/op/gate-approval.test.ts +6 -1
- package/src/op/gate-approval.ts +12 -6
- package/src/op/gate-quorum-at-base.test.ts +211 -0
- package/src/op/gate-quorum.ts +156 -8
- package/src/op/gate-review.ts +14 -0
- package/src/op/gate.ts +67 -8
- package/src/op/index.ts +3 -2
- package/src/op/local-executor.ts +69 -9
- package/src/op/op-waves-depends-on.test.ts +81 -0
- package/src/op/op-waves-hook-targets.test.ts +4 -2
- package/src/op/op-waves-quorum-product.test.ts +158 -0
- package/src/op/op-waves-run.ts +288 -14
- package/src/op/op-waves.ts +143 -14
- package/src/op/runtime.ts +8 -0
- package/src/op/schedule-overdue.ts +33 -0
- package/src/op/stage-hooks.ts +13 -5
- package/src/op/workspace-run-env.ts +29 -0
- package/src/pr-forge-bundle.test.ts +2 -2
- package/src/pr-forge.test.ts +47 -0
- package/src/pr-forge.ts +68 -0
- package/src/pr-post-open.e2e.test.ts +36 -0
- package/src/pr-post.test.ts +102 -3
- package/src/pr-post.ts +89 -1
- package/src/read-filter.test.ts +54 -0
- package/src/read-filter.ts +193 -0
- package/src/run-event.ts +1 -1
- package/src/stage-hooks-bundle.test.ts +1 -0
- package/src/terraform/carve.ts +52 -15
- package/src/terraform/cuts.test.ts +173 -0
- package/src/terraform/cuts.ts +188 -0
- package/src/terraform/folds.ts +44 -0
- package/src/terraform/graph.ts +9 -0
- package/src/terraform/radius.test.ts +90 -0
- package/src/terraform/reach.test.ts +146 -0
- package/src/terraform/reach.ts +247 -0
- package/src/terraform/score.ts +27 -29
- package/src/terraform/state.ts +3 -1
- package/src/terraform/types.ts +8 -0
- package/src/wave-blocked.ts +28 -3
- package/src/wave-loop-golden.test.ts +4 -3
- package/src/workspace/behold-kinds.test.ts +1 -1
- package/src/workspace/capabilities-contract.test.ts +88 -0
- package/src/workspace/capabilities-contract.ts +132 -0
- package/src/workspace/capabilities.schema.json +229 -0
- package/src/workspace/check-contract.test.ts +7 -6
- package/src/workspace/check.schema.json +11 -2
- package/src/workspace/checks/ci-branch.test.ts +128 -0
- package/src/workspace/checks/ci-branch.ts +141 -0
- package/src/workspace/checks/links.ts +12 -1
- package/src/workspace/checks/org.ts +169 -0
- package/src/workspace/checks.ts +64 -7
- package/src/workspace/ci-branches.ts +31 -0
- package/src/workspace/ci-green-branches.test.ts +153 -0
- package/src/workspace/ci-green-cli.ts +7 -7
- package/src/workspace/ci-green-workflow.test.ts +4 -3
- package/src/workspace/ci-green-workflow.ts +13 -9
- package/src/workspace/ci-green.ts +49 -12
- package/src/workspace/ci-run.test.ts +72 -1
- package/src/workspace/ci-run.ts +68 -8
- package/src/workspace/ci-serve.test.ts +95 -0
- package/src/workspace/ci-serve.ts +106 -65
- package/src/workspace/component-environments.test.ts +25 -2
- package/src/workspace/compose-graph.ts +19 -3
- package/src/workspace/composites.schema.json +22 -0
- package/src/workspace/composites.test.ts +39 -8
- package/src/workspace/composites.ts +6 -2
- package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
- package/src/workspace/conformance/conformance.e2e.test.ts +14 -1
- package/src/workspace/conformance/index.ts +31 -2
- package/src/workspace/cross-root-lint.test.ts +90 -0
- package/src/workspace/cross-root-lint.ts +126 -0
- package/src/workspace/dbt-kind.test.ts +3 -2
- package/src/workspace/dbt-models-reader.ts +362 -0
- package/src/workspace/dbt-models.test.ts +248 -0
- package/src/workspace/dbt-project-common.ts +113 -0
- package/src/workspace/dbt-project-reader.ts +29 -112
- package/src/workspace/decision-rank.ts +40 -0
- package/src/workspace/declaration.schema.json +133 -24
- package/src/workspace/declaration.ts +84 -15
- package/src/workspace/environments.ts +40 -4
- package/src/workspace/flyway-dir.ts +113 -0
- package/src/workspace/flyway-layout.ts +337 -0
- package/src/workspace/graph-cache.ts +27 -3
- package/src/workspace/graph-cli.ts +119 -32
- package/src/workspace/graph-contract.test.ts +4 -2
- package/src/workspace/graph.schema.json +182 -0
- package/src/workspace/identity.test.ts +14 -2
- package/src/workspace/intent.ts +6 -14
- package/src/workspace/kind-link-readers.ts +68 -3
- package/src/workspace/kind-readers.e2e.test.ts +28 -0
- package/src/workspace/kind-readers.test.ts +1 -1
- package/src/workspace/kind-readers.ts +7 -1
- package/src/workspace/kinds.test.ts +12 -7
- package/src/workspace/kinds.ts +132 -7
- package/src/workspace/ledger.schema.json +158 -0
- package/src/workspace/lexicon-outputs.ts +132 -13
- package/src/workspace/lineage-check.ts +30 -7
- package/src/workspace/links.ts +24 -1
- package/src/workspace/ls-contract.test.ts +1 -1
- package/src/workspace/ls.schema.json +7 -0
- package/src/workspace/ls.ts +10 -1
- package/src/workspace/member-commands.ts +82 -3
- package/src/workspace/member-file-schema.test.ts +124 -0
- package/src/workspace/migrate-links.test.ts +99 -0
- package/src/workspace/migrate-links.ts +108 -0
- package/src/workspace/migration-dirs.test.ts +272 -0
- package/src/workspace/migration-dirs.ts +267 -0
- package/src/workspace/nested-graph.ts +32 -1
- package/src/workspace/org-scope.test.ts +238 -0
- package/src/workspace/reason-codes.test.ts +13 -1
- package/src/workspace/reason-codes.ts +23 -0
- package/src/workspace/records-cli.ts +58 -5
- package/src/workspace/records.schema.json +5 -0
- package/src/workspace/release-candidates.ts +7 -2
- package/src/workspace/release-train.ts +157 -0
- package/src/workspace/release-workflow.ts +4 -3
- package/src/workspace/repo-ref.ts +113 -0
- package/src/workspace/run-event.schema.json +2 -2
- package/src/workspace/runs-cli.ts +48 -4
- package/src/workspace/runs.schema.json +7 -0
- package/src/workspace/search-cli.e2e.test.ts +305 -0
- package/src/workspace/search-cli.ts +591 -0
- package/src/workspace/search-contract.ts +95 -0
- package/src/workspace/search.schema.json +822 -0
- package/src/workspace/status-contract.test.ts +46 -1
- package/src/workspace/status-decisions.test.ts +100 -0
- package/src/workspace/status-decisions.ts +151 -0
- package/src/workspace/status-gates.ts +9 -0
- package/src/workspace/status.schema.json +6 -0
- package/src/workspace/status.ts +17 -3
- package/src/workspace/where-filters.test.ts +39 -0
- package/src/workspace/work-cli.ts +5 -3
- package/src/workspace/work-evidence-ops.test.ts +176 -0
- package/src/workspace/work-evidence-ops.ts +189 -0
- package/src/workspace/work-evidence.schema.json +49 -2
- package/src/workspace/work-evidence.ts +22 -3
- package/src/workspace/workspace-gates.ts +200 -0
- package/src/workspace/workspace-kinds.schema.json +58 -3
- package/src/workspace/workspace-ledger.ts +130 -0
- package/src/workspace/workspace-run.test.ts +322 -0
- package/src/workspace/workspace-run.ts +461 -0
package/dist/graph-effective.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { CapabilityEngine } from "./capabilities/matcher.js";
|
|
2
|
+
import { buildView } from "./capabilities/view.js";
|
|
3
|
+
import { resolvePacks, shippedRules } from "./capabilities/catalog.js";
|
|
1
4
|
/**
|
|
2
5
|
* Fold DERIVED reachability facts onto EC2 instance nodes so a single-node query
|
|
3
6
|
* can answer questions that are otherwise a multi-hop join with a union (#1139).
|
|
@@ -19,89 +22,233 @@
|
|
|
19
22
|
* With these, "instances SSH-reachable from the internet" is one predicate:
|
|
20
23
|
* `kind:EC2::Instance attr:internetFacing=true attr:effectiveIngress=tcp:22:0.0.0.0/0`
|
|
21
24
|
* — no hand-joined CLI sweep, no over/under-counting.
|
|
25
|
+
*
|
|
26
|
+
* Both are capability rules (#4375): `internet-facing`, `in-sg` and
|
|
27
|
+
* `ingress-of` in `capabilities/aws.paths`, over the lexicon-neutral view, so
|
|
28
|
+
* one rule serves CloudFormation kinds and Terraform's AWS types (#4362)
|
|
29
|
+
* alike. What stays here is the attribute surface: which nodes get the facts,
|
|
30
|
+
* and how a rule's evidence is spelled as `proto:port:cidr` and `...Via`.
|
|
22
31
|
*/
|
|
23
|
-
export function enrichEffectiveTopology(ir) {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const via = (...names) => (v) => names.includes(v);
|
|
29
|
-
/** Out-neighbours of `id` (edges from → to), optionally filtered by viaAttr. */
|
|
30
|
-
const out = (id, pred) => edges
|
|
31
|
-
.filter((e) => e.from === id && (!pred || pred(e.viaAttr ?? e.kind ?? "")))
|
|
32
|
-
.map((e) => byId.get(e.to))
|
|
33
|
-
.filter((x) => !!x);
|
|
34
|
-
/** In-neighbours of `id` (edges to ← from), optionally filtered by viaAttr. */
|
|
35
|
-
const incoming = (id, pred) => edges
|
|
36
|
-
.filter((e) => e.to === id && (!pred || pred(e.viaAttr ?? e.kind ?? "")))
|
|
37
|
-
.map((e) => byId.get(e.from))
|
|
38
|
-
.filter((x) => !!x);
|
|
39
|
-
const normalizeIngress = (sg) => {
|
|
40
|
-
const rules = sg.attrs?.["SecurityGroupIngress"];
|
|
41
|
-
if (!Array.isArray(rules))
|
|
42
|
-
return [];
|
|
43
|
-
return rules.map((r) => {
|
|
44
|
-
const rule = r;
|
|
45
|
-
const proto = String(rule.IpProtocol ?? "-1");
|
|
46
|
-
const from = rule.FromPort;
|
|
47
|
-
const to = rule.ToPort;
|
|
48
|
-
const port = from == null ? "all" : from === to ? `${from}` : `${from}-${to}`;
|
|
49
|
-
const cidr = rule.CidrIp ??
|
|
50
|
-
rule.CidrIpv6 ??
|
|
51
|
-
(rule.SourceSecurityGroupId ? `sg:${String(rule.SourceSecurityGroupId)}` : "?");
|
|
52
|
-
return `${proto}:${port}:${cidr}`;
|
|
53
|
-
});
|
|
54
|
-
};
|
|
55
|
-
/** Security groups reachable from an instance — direct and via launch template. */
|
|
56
|
-
const effectiveSgs = (inst) => {
|
|
57
|
-
const direct = out(inst.id, via("SecurityGroupIds", "SecurityGroupId"));
|
|
58
|
-
const templates = out(inst.id, via("LaunchTemplate", "LaunchTemplateId"));
|
|
59
|
-
const viaTemplate = templates
|
|
60
|
-
.flatMap((lt) => out(lt.id, via("LaunchTemplateData", "SecurityGroupIds", "SecurityGroupId")))
|
|
61
|
-
.filter((n) => isKind(n, "SecurityGroup"));
|
|
62
|
-
const all = [...direct.filter((n) => isKind(n, "SecurityGroup")), ...viaTemplate];
|
|
63
|
-
return [...new Map(all.map((s) => [s.id, s])).values()];
|
|
64
|
-
};
|
|
65
|
-
/** The IGW an instance's subnet routes to (evidence), or undefined. */
|
|
66
|
-
const internetFacingVia = (inst) => {
|
|
67
|
-
for (const subnet of out(inst.id, via("SubnetId")).filter((n) => isKind(n, "Subnet"))) {
|
|
68
|
-
const assocs = incoming(subnet.id, via("SubnetId")).filter((a) => isKind(a, "SubnetRouteTableAssociation"));
|
|
69
|
-
const routeTables = assocs.flatMap((a) => out(a.id, via("RouteTableId")).filter((n) => isKind(n, "RouteTable")));
|
|
70
|
-
for (const rt of routeTables) {
|
|
71
|
-
const routes = incoming(rt.id, via("RouteTableId")).filter((n) => isKind(n, "Route"));
|
|
72
|
-
for (const route of routes) {
|
|
73
|
-
const dest = route.attrs?.["DestinationCidrBlock"];
|
|
74
|
-
const igw = out(route.id, via("GatewayId")).find((g) => isKind(g, "InternetGateway"));
|
|
75
|
-
if (igw && (dest == null || dest === "0.0.0.0/0")) {
|
|
76
|
-
const id = igw.id.includes("::") ? igw.id.slice(igw.id.lastIndexOf("::") + 2) : igw.id;
|
|
77
|
-
return `${rt.id.includes("::") ? rt.id.slice(rt.id.lastIndexOf("::") + 2) : rt.id} → ${id}`;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return undefined;
|
|
83
|
-
};
|
|
32
|
+
export function enrichEffectiveTopology(ir, packs = []) {
|
|
33
|
+
const view = buildView(ir, resolvePacks(packs));
|
|
34
|
+
const engine = new CapabilityEngine(view, shippedRules().rules);
|
|
35
|
+
const facing = engine.set("internet-facing");
|
|
36
|
+
const groups = engine.relation("in-sg").out;
|
|
84
37
|
const nodes = ir.nodes.map((n) => {
|
|
85
|
-
|
|
38
|
+
const tf = terraformResourceType(n) === "aws_instance";
|
|
39
|
+
if (!tf && !isKind(n, "Instance"))
|
|
86
40
|
return n;
|
|
87
|
-
const
|
|
41
|
+
const attrs = (n.attrs ?? {});
|
|
42
|
+
const reached = [...(groups.get(n.id) ?? new Map())];
|
|
43
|
+
const ingress = reached.flatMap(([sg]) => ingressStrings(view, sg));
|
|
44
|
+
const effectiveIngress = tf ? [...new Set(ingress)] : ingress;
|
|
88
45
|
// A live enrichment may already have set internetFacing (+ its evidence) for
|
|
89
46
|
// a subnet chant doesn't model declaratively (e.g. the account's default
|
|
90
47
|
// VPC). Keep that truth; otherwise derive it from the declared route topology.
|
|
91
|
-
const attrs = (n.attrs ?? {});
|
|
92
48
|
const liveFacing = attrs["internetFacing"] === true;
|
|
93
|
-
const
|
|
49
|
+
const evidence = facing.get(n.id);
|
|
50
|
+
const declaredVia = evidence && evidence.hops.length > 0 ? facingVia(view, evidence, tf) : undefined;
|
|
94
51
|
const via = attrs["internetFacingVia"] ?? declaredVia;
|
|
52
|
+
const ingressVia = tf ? reached.map(([sg, ev]) => groupPath(view, ev, sg)).join(", ") : "";
|
|
95
53
|
return {
|
|
96
54
|
...n,
|
|
97
|
-
attrs: {
|
|
55
|
+
attrs: {
|
|
56
|
+
...attrs,
|
|
57
|
+
effectiveIngress,
|
|
58
|
+
internetFacing: liveFacing || !!declaredVia,
|
|
59
|
+
...(via ? { internetFacingVia: via } : {}),
|
|
60
|
+
...(ingressVia ? { effectiveIngressVia: `security groups ${ingressVia}` } : {}),
|
|
61
|
+
},
|
|
98
62
|
};
|
|
99
63
|
});
|
|
100
64
|
// Record what this pass computed, so a caller can report the graph's derived surface
|
|
101
65
|
// without hardcoding attribute names. Only kinds actually enriched are listed.
|
|
102
66
|
const enriched = nodes.some((n) => isKind(n, "Instance"));
|
|
103
|
-
const
|
|
104
|
-
|
|
67
|
+
const enrichedTf = nodes.some((n) => terraformResourceType(n) === "aws_instance");
|
|
68
|
+
const derivedAttrs = enriched || enrichedTf
|
|
69
|
+
? {
|
|
70
|
+
...(ir.derivedAttrs ?? {}),
|
|
71
|
+
...(enriched ? { Instance: ["internetFacing", "effectiveIngress"] } : {}),
|
|
72
|
+
...(enrichedTf ? { aws_instance: ["internetFacing", "effectiveIngress"] } : {}),
|
|
73
|
+
}
|
|
105
74
|
: ir.derivedAttrs;
|
|
106
75
|
return { ...ir, nodes, ...(derivedAttrs ? { derivedAttrs } : {}) };
|
|
107
76
|
}
|
|
77
|
+
function isKind(n, suffix) {
|
|
78
|
+
const kind = n?.kind ?? "";
|
|
79
|
+
return !!n && (kind === suffix || kind.endsWith("::" + suffix));
|
|
80
|
+
}
|
|
81
|
+
function bare(id) {
|
|
82
|
+
return id.includes("::") ? id.slice(id.lastIndexOf("::") + 2) : id;
|
|
83
|
+
}
|
|
84
|
+
/** A node's name in a fold's evidence: a terraform address, or a bare logical id. */
|
|
85
|
+
function display(view, id) {
|
|
86
|
+
const v = view.nodes.get(id);
|
|
87
|
+
if (v && v.lexicon === "terraform")
|
|
88
|
+
return id.slice(id.lastIndexOf("/") + 1);
|
|
89
|
+
return bare(id);
|
|
90
|
+
}
|
|
91
|
+
/** The ids an evidence path visits, in walk order. */
|
|
92
|
+
function visited(ev, start) {
|
|
93
|
+
const out = start ? [start] : [];
|
|
94
|
+
let at = start;
|
|
95
|
+
for (const h of ev.hops) {
|
|
96
|
+
const next = at === undefined ? h.to : h.from === at ? h.to : h.from;
|
|
97
|
+
if (at === undefined)
|
|
98
|
+
out.push(h.from === next ? h.to : h.from);
|
|
99
|
+
out.push(next);
|
|
100
|
+
at = next;
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
/** `internetFacingVia`, as each fold always spelled it. */
|
|
105
|
+
function facingVia(view, ev, tf) {
|
|
106
|
+
const ids = visited(ev);
|
|
107
|
+
const of = (label) => ids.find((id) => view.nodes.get(id)?.label === label);
|
|
108
|
+
const rt = of("RouteTable");
|
|
109
|
+
const igw = of("InternetGateway");
|
|
110
|
+
if (!rt || !igw)
|
|
111
|
+
return undefined;
|
|
112
|
+
if (!tf)
|
|
113
|
+
return `${bare(rt)} → ${bare(igw)}`;
|
|
114
|
+
const subnet = of("Subnet");
|
|
115
|
+
const route = of("Route");
|
|
116
|
+
const how = route && view.nodes.get(route)?.attrs.block ? "inline route" : route ? display(view, route) : "route";
|
|
117
|
+
return `subnet route ${subnet ? display(view, subnet) : "?"} -> ${display(view, rt)} -> ${display(view, igw)} (${how})`;
|
|
118
|
+
}
|
|
119
|
+
/** One reached group, as `effectiveIngressVia` names it: the group, or the template it came through. */
|
|
120
|
+
function groupPath(view, ev, sg) {
|
|
121
|
+
const lt = visited(ev).find((id) => view.nodes.get(id)?.label === "LaunchTemplate");
|
|
122
|
+
return lt ? `${display(view, lt)} -> ${display(view, sg)}` : display(view, sg);
|
|
123
|
+
}
|
|
124
|
+
const STYLE_ORDER = ["cfn", "tf-inline", "tf-sg-rule", "tf-vpc-rule"];
|
|
125
|
+
/** A group's ingress rules as `proto:port:source` strings, inline rules first. */
|
|
126
|
+
function ingressStrings(view, sg) {
|
|
127
|
+
const rules = view.edges
|
|
128
|
+
.filter((e) => e.from === sg && e.name === "ingress")
|
|
129
|
+
.map((e) => view.nodes.get(e.to))
|
|
130
|
+
.filter((r) => r && r.label === "IngressRule");
|
|
131
|
+
const order = (r) => (r.attrs.block ? -1 : STYLE_ORDER.indexOf(String(r.attrs.style)));
|
|
132
|
+
return [...rules]
|
|
133
|
+
.sort((a, b) => order(a) - order(b))
|
|
134
|
+
.flatMap((r) => {
|
|
135
|
+
const raw = (r.body ?? {});
|
|
136
|
+
switch (r.attrs.style) {
|
|
137
|
+
case "tf-inline":
|
|
138
|
+
return terraformIngress(raw, { proto: "protocol", cidrs: ["cidr_blocks", "ipv6_cidr_blocks", "prefix_list_ids"], groups: ["security_groups"] });
|
|
139
|
+
case "tf-sg-rule":
|
|
140
|
+
return terraformIngress(raw, { proto: "protocol", cidrs: ["cidr_blocks", "ipv6_cidr_blocks", "prefix_list_ids"], groups: ["source_security_group_id"] });
|
|
141
|
+
case "tf-vpc-rule":
|
|
142
|
+
return terraformIngress(raw, { proto: "ip_protocol", cidrs: ["cidr_ipv4", "cidr_ipv6", "prefix_list_id"], groups: ["referenced_security_group_id"] });
|
|
143
|
+
default:
|
|
144
|
+
return [cloudFormationIngress(raw)];
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/** One CloudFormation ingress rule as `proto:port:source`. */
|
|
149
|
+
function cloudFormationIngress(rule) {
|
|
150
|
+
const proto = String(rule.IpProtocol ?? "-1");
|
|
151
|
+
const from = rule.FromPort;
|
|
152
|
+
const to = rule.ToPort;
|
|
153
|
+
const port = from == null ? "all" : from === to ? `${from}` : `${from}-${to}`;
|
|
154
|
+
const source = rule.SourceSecurityGroupId;
|
|
155
|
+
const group = source && typeof source === "object" && typeof source.$ref === "string"
|
|
156
|
+
? String(source.$ref).replace(/\.[A-Za-z]+$/, "")
|
|
157
|
+
: source;
|
|
158
|
+
const cidr = rule.CidrIp ??
|
|
159
|
+
rule.CidrIpv6 ??
|
|
160
|
+
(group ? `sg:${String(group)}` : "?");
|
|
161
|
+
return `${proto}:${port}:${cidr}`;
|
|
162
|
+
}
|
|
163
|
+
/** The chant entity types every terraform `resource` and `data` block carries. */
|
|
164
|
+
const TERRAFORM_RESOURCE = "Terraform::Resource";
|
|
165
|
+
const TERRAFORM_DATA = "Terraform::Data";
|
|
166
|
+
/**
|
|
167
|
+
* The Terraform type of a `resource` or `data` node: `aws_instance` for
|
|
168
|
+
* `aws_instance.web`, `data.aws_ami` for `data.aws_ami.ubuntu`. Undefined for
|
|
169
|
+
* any other node.
|
|
170
|
+
*
|
|
171
|
+
* This is the one reading of a terraform node's type. `chant search`'s `kind:`
|
|
172
|
+
* (#4366), its rows and `--explain` count, `--count-by kind` (#4360) and the
|
|
173
|
+
* effective-topology folds (#4362) all call it, so they cannot disagree.
|
|
174
|
+
*
|
|
175
|
+
* The terraform lexicon puts every resource on the IR as `Terraform::Resource`
|
|
176
|
+
* (and every data source as `Terraform::Data`) and carries the block's type
|
|
177
|
+
* label as `attrs.type` (#4366), which is read first. A node without one (an
|
|
178
|
+
* older producer, or a `chant graph --live` node built from state) falls back
|
|
179
|
+
* to the block's address (`aws_instance.web`, or `module.app.aws_instance.web`)
|
|
180
|
+
* in `attrs.address`, whose second-to-last segment is the type, and failing
|
|
181
|
+
* that to its id, whose last path segment is the address too. A data source
|
|
182
|
+
* keeps its `data.` prefix: `data.aws_ami` reads an AMI, it does not manage one.
|
|
183
|
+
*/
|
|
184
|
+
export function terraformType(n) {
|
|
185
|
+
if (!n || (n.kind !== TERRAFORM_RESOURCE && n.kind !== TERRAFORM_DATA))
|
|
186
|
+
return undefined;
|
|
187
|
+
const label = n.attrs?.["type"];
|
|
188
|
+
let type = typeof label === "string" && label.length > 0 ? label : undefined;
|
|
189
|
+
if (type === undefined) {
|
|
190
|
+
const parts = terraformAddress(n).split(".");
|
|
191
|
+
type = parts.length >= 2 ? parts[parts.length - 2] : undefined;
|
|
192
|
+
}
|
|
193
|
+
if (type === undefined)
|
|
194
|
+
return undefined;
|
|
195
|
+
return n.kind === TERRAFORM_DATA ? `data.${type}` : type;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* The provider resource type of a terraform `resource` node (`aws_instance`),
|
|
199
|
+
* or undefined for any other node, data sources included. See {@link terraformType}.
|
|
200
|
+
*/
|
|
201
|
+
export function terraformResourceType(n) {
|
|
202
|
+
return n?.kind === TERRAFORM_RESOURCE ? terraformType(n) : undefined;
|
|
203
|
+
}
|
|
204
|
+
function terraformAddress(n) {
|
|
205
|
+
const address = n.attrs?.["address"];
|
|
206
|
+
if (typeof address === "string" && address.length > 0)
|
|
207
|
+
return address;
|
|
208
|
+
return n.id.slice(n.id.lastIndexOf("/") + 1).replace(/~\d+$/, "");
|
|
209
|
+
}
|
|
210
|
+
function bodyOf(n) {
|
|
211
|
+
const body = n.attrs?.["body"];
|
|
212
|
+
return body && typeof body === "object" && !Array.isArray(body) ? body : {};
|
|
213
|
+
}
|
|
214
|
+
/** A block-or-list attribute as a list: hcl2json renders nested blocks as arrays. */
|
|
215
|
+
function list(value) {
|
|
216
|
+
if (value == null)
|
|
217
|
+
return [];
|
|
218
|
+
return Array.isArray(value) ? value : [value];
|
|
219
|
+
}
|
|
220
|
+
/** `${aws_security_group.x.id}` -> `aws_security_group.x`; anything else unchanged. */
|
|
221
|
+
function sourceRef(value) {
|
|
222
|
+
const s = String(value);
|
|
223
|
+
const m = /^\$\{([A-Za-z0-9_.-]+?)(?:\.(?:id|arn|name))?\}$/.exec(s);
|
|
224
|
+
return m ? m[1] : s;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* One terraform ingress rule, in any of its three spellings, normalized to the
|
|
228
|
+
* `proto:port:source` strings the CloudFormation fold produces. A rule with
|
|
229
|
+
* several CIDRs or sources yields one string per source, so each is queryable
|
|
230
|
+
* on its own.
|
|
231
|
+
*/
|
|
232
|
+
function terraformIngress(rule, fields) {
|
|
233
|
+
const rawProto = String(rule[fields.proto] ?? "-1").toLowerCase();
|
|
234
|
+
const proto = rawProto === "all" ? "-1" : rawProto;
|
|
235
|
+
const from = rule["from_port"];
|
|
236
|
+
const to = rule["to_port"];
|
|
237
|
+
const port = proto === "-1" || from == null
|
|
238
|
+
? "all"
|
|
239
|
+
: String(from) === String(to ?? from)
|
|
240
|
+
? `${from}`
|
|
241
|
+
: `${from}-${to}`;
|
|
242
|
+
const sources = [];
|
|
243
|
+
for (const f of fields.cidrs)
|
|
244
|
+
for (const c of list(rule[f]))
|
|
245
|
+
sources.push(String(c));
|
|
246
|
+
for (const f of fields.groups)
|
|
247
|
+
for (const g of list(rule[f]))
|
|
248
|
+
sources.push(`sg:${sourceRef(g)}`);
|
|
249
|
+
if (rule["self"] === true)
|
|
250
|
+
sources.push("sg:self");
|
|
251
|
+
if (sources.length === 0)
|
|
252
|
+
sources.push("?");
|
|
253
|
+
return sources.map((src) => `${proto}:${port}:${src}`);
|
|
254
|
+
}
|
package/dist/graph-ir.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type Declarable } from "./declarable.js";
|
|
2
|
+
import { subTemplateRefs } from "./graph-sub-template.js";
|
|
2
3
|
import type { ResourceMetadata } from "./lexicon.js";
|
|
3
4
|
import type { UnobservedEntity } from "./observation.js";
|
|
5
|
+
export { subTemplateRefs };
|
|
4
6
|
/**
|
|
5
7
|
* Graph IR — the engine-neutral, lint-gated representation of a project's
|
|
6
8
|
* resolved infrastructure graph. Painters (mermaid, graphviz, custom SVG) and
|
|
@@ -25,6 +27,20 @@ export interface SourceLoc {
|
|
|
25
27
|
export interface AttrRefEnvelope {
|
|
26
28
|
$ref: string;
|
|
27
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* A CloudFormation `Fn::Sub` in an attribute projection (#4373), in place of
|
|
32
|
+
* `{ $intrinsic: true }`. `$sub` is the template exactly as it serializes, so
|
|
33
|
+
* `${assets.Arn}/*` names the producer and attribute a reader would otherwise
|
|
34
|
+
* have to guess. `$vars` is the two-argument form's variable map, each value
|
|
35
|
+
* projected like any other attr. Every `${Name}` or `${Name.Attr}` in the
|
|
36
|
+
* template that names a node, and every reference in `$vars`, is also an edge.
|
|
37
|
+
* `${!Literal}` (CloudFormation's escape), pseudo-parameters (`${AWS::Region}`)
|
|
38
|
+
* and names `$vars` binds are not.
|
|
39
|
+
*/
|
|
40
|
+
export interface SubEnvelope {
|
|
41
|
+
$sub: string;
|
|
42
|
+
$vars?: Record<string, unknown>;
|
|
43
|
+
}
|
|
28
44
|
/** One resource in the graph. */
|
|
29
45
|
export interface IRNode {
|
|
30
46
|
/** Logical name (the export name, or composite-expanded name). */
|
|
@@ -174,6 +190,31 @@ export interface LexiconWorkspaceOutputs {
|
|
|
174
190
|
*/
|
|
175
191
|
gaps?: string[];
|
|
176
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* One link a lexicon reads from its own declarations (#4397): an output of
|
|
195
|
+
* another member that a declaration depends on, such as a table an otel
|
|
196
|
+
* `clickhouse` exporter writes.
|
|
197
|
+
*/
|
|
198
|
+
export interface LexiconWorkspaceLink {
|
|
199
|
+
/** The producer's output the declaration reads or writes: `default.otel_logs`, `default.otel_logs.Body`. */
|
|
200
|
+
output: string;
|
|
201
|
+
/**
|
|
202
|
+
* The output that picks the producer when `member` is unset; unset, the
|
|
203
|
+
* output itself. A column is anchored on its table, so a dropped column is
|
|
204
|
+
* missing from the member that still has the table.
|
|
205
|
+
*/
|
|
206
|
+
anchor?: string;
|
|
207
|
+
/** The producer, when the declaration names it. Unset, the one member exposing `anchor`. */
|
|
208
|
+
member?: string;
|
|
209
|
+
/** The entity key that states the link, for the finding's file and line. */
|
|
210
|
+
entity: string;
|
|
211
|
+
}
|
|
212
|
+
/** What a lexicon's `workspaceLinks` hook returns (#4397). */
|
|
213
|
+
export interface LexiconWorkspaceLinks {
|
|
214
|
+
links: LexiconWorkspaceLink[];
|
|
215
|
+
/** Places the hook could not read without the environment, one line each. Their links are left out. */
|
|
216
|
+
gaps?: string[];
|
|
217
|
+
}
|
|
177
218
|
/** What a lexicon's `graphEdges` hook returns (#3910). */
|
|
178
219
|
export interface LexiconGraphEdges {
|
|
179
220
|
references: LexiconGraphReference[];
|
|
@@ -420,6 +461,13 @@ export interface GraphIR {
|
|
|
420
461
|
* the passes produced, not a list maintained by hand.
|
|
421
462
|
*/
|
|
422
463
|
derivedAttrs?: Record<string, string[]>;
|
|
464
|
+
/**
|
|
465
|
+
* With `chant graph --format ir --capability-view` (#4378): the
|
|
466
|
+
* lexicon-neutral view capability rules read, built by this chant through
|
|
467
|
+
* the project's own lexicon mappings and adapters. A `ViewDocument`
|
|
468
|
+
* (`capabilities/view.ts`). Absent unless asked for.
|
|
469
|
+
*/
|
|
470
|
+
capabilityView?: unknown;
|
|
423
471
|
}
|
|
424
472
|
/**
|
|
425
473
|
* Build the graph IR from resolved entities (the output of `discover`). Pure and
|
package/dist/graph-ir.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-ir.d.ts","sourceRoot":"","sources":["../src/graph-ir.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"graph-ir.d.ts","sourceRoot":"","sources":["../src/graph-ir.ts"],"names":[],"mappings":"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"}
|
package/dist/graph-ir.js
CHANGED
|
@@ -4,6 +4,8 @@ import { isDeclarable } from "./declarable.js";
|
|
|
4
4
|
import { isLexiconOutput } from "./lexicon-output.js";
|
|
5
5
|
import { getProvenance } from "./provenance.js";
|
|
6
6
|
import { INTRINSIC_MARKER } from "./intrinsic.js";
|
|
7
|
+
import { subTemplateRefs } from "./graph-sub-template.js";
|
|
8
|
+
export { subTemplateRefs };
|
|
7
9
|
/** True when `value` has the {@link EntityReference} shape. */
|
|
8
10
|
function isEntityReference(value) {
|
|
9
11
|
return (typeof value === "object" &&
|
|
@@ -81,6 +83,81 @@ function refIntrinsicTarget(value) {
|
|
|
81
83
|
}
|
|
82
84
|
return undefined;
|
|
83
85
|
}
|
|
86
|
+
/** Read `{ "Fn::Sub": "..." }` or `{ "Fn::Sub": ["...", { ... }] }`, or undefined. */
|
|
87
|
+
function subForm(json) {
|
|
88
|
+
if (json === null || typeof json !== "object" || Array.isArray(json))
|
|
89
|
+
return undefined;
|
|
90
|
+
const keys = Object.keys(json);
|
|
91
|
+
if (keys.length !== 1 || keys[0] !== "Fn::Sub")
|
|
92
|
+
return undefined;
|
|
93
|
+
const arg = json["Fn::Sub"];
|
|
94
|
+
if (typeof arg === "string")
|
|
95
|
+
return { template: arg };
|
|
96
|
+
if (Array.isArray(arg) && typeof arg[0] === "string") {
|
|
97
|
+
const vars = arg[1];
|
|
98
|
+
return vars !== null && typeof vars === "object" && !Array.isArray(vars)
|
|
99
|
+
? { template: arg[0], vars: vars }
|
|
100
|
+
: { template: arg[0] };
|
|
101
|
+
}
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
/** The `Fn::Sub` an intrinsic serializes to (the aws `Sub` tag), or undefined. */
|
|
105
|
+
function subIntrinsicForm(value) {
|
|
106
|
+
try {
|
|
107
|
+
return subForm(value.toJSON?.());
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// An AttrRef inside whose logical name is not set yet: no template to read.
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** False when an intrinsic's `toJSON()` throws (an AttrRef inside it has no logical name yet). */
|
|
115
|
+
function serializes(value) {
|
|
116
|
+
try {
|
|
117
|
+
value.toJSON?.();
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The logical names serialized CloudFormation JSON references: `{ Ref }`,
|
|
126
|
+
* `{ "Fn::GetAtt" }` in either encoding, and a nested `Fn::Sub`. Reads a
|
|
127
|
+
* two-argument `Sub`'s variable map after `toJSON()` has turned its live
|
|
128
|
+
* references into JSON.
|
|
129
|
+
*/
|
|
130
|
+
function cfnJsonRefNames(json, out) {
|
|
131
|
+
if (json === null || typeof json !== "object")
|
|
132
|
+
return;
|
|
133
|
+
if (Array.isArray(json)) {
|
|
134
|
+
for (const item of json)
|
|
135
|
+
cfnJsonRefNames(item, out);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const obj = json;
|
|
139
|
+
if (typeof obj.Ref === "string") {
|
|
140
|
+
out.push(obj.Ref);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const getAtt = obj["Fn::GetAtt"];
|
|
144
|
+
if (getAtt !== undefined) {
|
|
145
|
+
const id = Array.isArray(getAtt) ? getAtt[0] : typeof getAtt === "string" ? getAtt.split(".")[0] : undefined;
|
|
146
|
+
if (typeof id === "string")
|
|
147
|
+
out.push(id);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const sub = subForm(obj);
|
|
151
|
+
if (sub) {
|
|
152
|
+
for (const r of subTemplateRefs(sub.template, new Set(Object.keys(sub.vars ?? {}))))
|
|
153
|
+
out.push(r.name);
|
|
154
|
+
if (sub.vars)
|
|
155
|
+
cfnJsonRefNames(Object.values(sub.vars), out);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
for (const v of Object.values(obj))
|
|
159
|
+
cfnJsonRefNames(v, out);
|
|
160
|
+
}
|
|
84
161
|
/** Resolve the producer (logical name) an AttrRef points at. */
|
|
85
162
|
function refTarget(ref, reverse) {
|
|
86
163
|
// Nested refs (under `props`) aren't assigned a logical name by resolveAttrRefs,
|
|
@@ -124,6 +201,10 @@ function project(value, seen, reverse, nodeIds) {
|
|
|
124
201
|
const to = refIntrinsicTarget(value);
|
|
125
202
|
if (to && nodeIds.has(to))
|
|
126
203
|
return { $ref: to };
|
|
204
|
+
// A Sub keeps its template, so a reader sees which node and attribute it names (#4373).
|
|
205
|
+
const sub = subIntrinsicForm(value);
|
|
206
|
+
if (sub)
|
|
207
|
+
return subEnvelope(sub, seen, reverse, nodeIds);
|
|
127
208
|
return { $intrinsic: true };
|
|
128
209
|
}
|
|
129
210
|
if (seen.has(value))
|
|
@@ -145,6 +226,13 @@ function project(value, seen, reverse, nodeIds) {
|
|
|
145
226
|
seen.delete(value);
|
|
146
227
|
return out;
|
|
147
228
|
}
|
|
229
|
+
// A Sub written as plain CloudFormation JSON reads the same as the `Sub` tag's.
|
|
230
|
+
const plainSub = subForm(value);
|
|
231
|
+
if (plainSub) {
|
|
232
|
+
const out = subEnvelope(plainSub, seen, reverse, nodeIds);
|
|
233
|
+
seen.delete(value);
|
|
234
|
+
return out;
|
|
235
|
+
}
|
|
148
236
|
const out = {};
|
|
149
237
|
for (const [k, v] of Object.entries(value)) {
|
|
150
238
|
const p = project(v, seen, reverse, nodeIds);
|
|
@@ -154,6 +242,18 @@ function project(value, seen, reverse, nodeIds) {
|
|
|
154
242
|
seen.delete(value);
|
|
155
243
|
return out;
|
|
156
244
|
}
|
|
245
|
+
/** Project a {@link SubForm} into its {@link SubEnvelope}. */
|
|
246
|
+
function subEnvelope(sub, seen, reverse, nodeIds) {
|
|
247
|
+
if (!sub.vars)
|
|
248
|
+
return { $sub: sub.template };
|
|
249
|
+
const vars = {};
|
|
250
|
+
for (const [k, v] of Object.entries(sub.vars)) {
|
|
251
|
+
const p = project(v, seen, reverse, nodeIds);
|
|
252
|
+
if (p !== undefined)
|
|
253
|
+
vars[k] = p;
|
|
254
|
+
}
|
|
255
|
+
return { $sub: sub.template, $vars: vars };
|
|
256
|
+
}
|
|
157
257
|
// `references` and `stack` are the two duck-typed channels above
|
|
158
258
|
// ({@link entityReferences}, {@link entityStack}). They are metadata about the
|
|
159
259
|
// entity's place in the graph, not declared configuration, and both are read
|
|
@@ -213,6 +313,10 @@ function collectEdges(entity, from, nodeIds, reverse) {
|
|
|
213
313
|
});
|
|
214
314
|
}
|
|
215
315
|
const seen = new Set();
|
|
316
|
+
const edgeTo = (to, viaAttr) => {
|
|
317
|
+
if (to !== from && nodeIds.has(to))
|
|
318
|
+
edges.push({ from, to, kind: "ref", viaAttr });
|
|
319
|
+
};
|
|
216
320
|
const visit = (value, viaAttr) => {
|
|
217
321
|
if (value === null || typeof value !== "object")
|
|
218
322
|
return;
|
|
@@ -229,8 +333,34 @@ function collectEdges(entity, from, nodeIds, reverse) {
|
|
|
229
333
|
const to = refIntrinsicTarget(value);
|
|
230
334
|
if (to && to !== from && nodeIds.has(to))
|
|
231
335
|
edges.push({ from, to, kind: "ref", viaAttr });
|
|
336
|
+
// A Sub's interpolations are references too (#4373): each `${Name}` or
|
|
337
|
+
// `${Name.Attr}` naming a node, and each reference in a variable map.
|
|
338
|
+
const sub = subIntrinsicForm(value);
|
|
339
|
+
if (sub) {
|
|
340
|
+
const names = subTemplateRefs(sub.template, new Set(Object.keys(sub.vars ?? {}))).map((r) => r.name);
|
|
341
|
+
if (sub.vars)
|
|
342
|
+
cfnJsonRefNames(Object.values(sub.vars), names);
|
|
343
|
+
for (const name of names)
|
|
344
|
+
edgeTo(name, viaAttr);
|
|
345
|
+
}
|
|
346
|
+
// The live values the aws `Sub` tag interpolated. Covers an AttrRef whose
|
|
347
|
+
// logical name was not set, where `toJSON()` throws and leaves no
|
|
348
|
+
// template to read above. Any other intrinsic stays opaque.
|
|
349
|
+
const interpolated = value.values;
|
|
350
|
+
if (Array.isArray(interpolated) && (sub || !serializes(value))) {
|
|
351
|
+
for (const v of interpolated)
|
|
352
|
+
visit(v, viaAttr);
|
|
353
|
+
}
|
|
232
354
|
return;
|
|
233
355
|
}
|
|
356
|
+
// A Sub written as plain CloudFormation JSON in props: the template's names
|
|
357
|
+
// here, then the variable map's live values through the walk below.
|
|
358
|
+
const plainSub = subForm(value);
|
|
359
|
+
if (plainSub) {
|
|
360
|
+
for (const r of subTemplateRefs(plainSub.template, new Set(Object.keys(plainSub.vars ?? {})))) {
|
|
361
|
+
edgeTo(r.name, viaAttr);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
234
364
|
// A whole node held in props or an enumerable field (the sql lexicon's
|
|
235
365
|
// `dependsOn`) is a reference to it: draw the edge, and do not walk its
|
|
236
366
|
// config, whose refs belong to that node's own edges (#3257). Checked
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The names a `Sub` template interpolates (#4373): `${Name}` and
|
|
3
|
+
* `${Name.Attr}`, in order. Skips CloudFormation's `${!Literal}` escape,
|
|
4
|
+
* pseudo-parameters (`${AWS::Region}`, anything with `::`), and names the
|
|
5
|
+
* two-argument form's variable map binds, which are not resources.
|
|
6
|
+
*/
|
|
7
|
+
export declare function subTemplateRefs(template: string, bound?: ReadonlySet<string>): Array<{
|
|
8
|
+
name: string;
|
|
9
|
+
attr?: string;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=graph-sub-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-sub-template.d.ts","sourceRoot":"","sources":["../src/graph-sub-template.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,WAAW,CAAC,MAAM,CAAa,GACrC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CASxC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Kept apart from ./graph-ir so ./graph-detail, which runs in the browser
|
|
2
|
+
// bundle, can read a Sub template without pulling in node:path.
|
|
3
|
+
/**
|
|
4
|
+
* The names a `Sub` template interpolates (#4373): `${Name}` and
|
|
5
|
+
* `${Name.Attr}`, in order. Skips CloudFormation's `${!Literal}` escape,
|
|
6
|
+
* pseudo-parameters (`${AWS::Region}`, anything with `::`), and names the
|
|
7
|
+
* two-argument form's variable map binds, which are not resources.
|
|
8
|
+
*/
|
|
9
|
+
export function subTemplateRefs(template, bound = new Set()) {
|
|
10
|
+
const out = [];
|
|
11
|
+
for (const match of template.matchAll(/\$\{([^}]*)\}/g)) {
|
|
12
|
+
const token = match[1].trim();
|
|
13
|
+
if (!token || token.startsWith("!") || token.includes("::") || bound.has(token))
|
|
14
|
+
continue;
|
|
15
|
+
const dot = token.indexOf(".");
|
|
16
|
+
out.push(dot > 0 ? { name: token.slice(0, dot), attr: token.slice(dot + 1) } : { name: token });
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
}
|