@intentius/chant 0.124.46 → 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/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/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/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.js +2 -2
- 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.d.ts +2 -4
- package/dist/cli/handlers/search.d.ts.map +1 -1
- package/dist/cli/handlers/search.js +13 -39
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +65 -14
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +36 -2
- package/dist/cli/registry.d.ts +14 -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-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 +20 -0
- package/dist/config-environments.d.ts.map +1 -1
- package/dist/config-environments.js +12 -0
- package/dist/config.d.ts +9 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -2
- 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-ir.d.ts +25 -0
- package/dist/graph-ir.d.ts.map +1 -1
- 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 +71 -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/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/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/op/activities/activity-contracts.d.ts +5 -2
- 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 +263 -254
- 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 +14 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -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/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-cli.d.ts.map +1 -1
- package/dist/workspace/graph-cli.js +26 -8
- package/dist/workspace/graph.schema.json +34 -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/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.map +1 -1
- package/dist/workspace/member-commands.js +54 -5
- 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/reason-codes.d.ts +8 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +11 -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-contract.d.ts +1 -1
- package/dist/workspace/search-contract.d.ts.map +1 -1
- 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/action-pins.test.ts +78 -0
- package/src/action-pins.ts +92 -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/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/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 +2 -2
- 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.ts +13 -34
- package/src/cli/main.test.ts +15 -0
- package/src/cli/main.ts +65 -14
- package/src/cli/parse-args.ts +27 -2
- package/src/cli/registry.ts +14 -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-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 +28 -1
- package/src/config.ts +8 -1
- 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-ir.ts +27 -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 +74 -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/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/rules/op/index.ts +2 -0
- package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
- 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/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 +9 -2
- 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/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-cli.ts +25 -10
- package/src/workspace/graph-contract.test.ts +4 -2
- package/src/workspace/graph.schema.json +34 -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/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 +60 -2
- 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/org-scope.test.ts +238 -0
- package/src/workspace/reason-codes.test.ts +6 -1
- package/src/workspace/reason-codes.ts +11 -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/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/pr-post.d.ts
CHANGED
|
@@ -14,6 +14,12 @@
|
|
|
14
14
|
* every hidden HTML comment after its first line is defused, so a forged
|
|
15
15
|
* marker cannot claim another environment's note. A plan job that failed
|
|
16
16
|
* fails the status whatever its report says.
|
|
17
|
+
*
|
|
18
|
+
* On GitLab the post runs in a pipeline of the target branch (#4328): a
|
|
19
|
+
* merge request pipeline is built from the merge request's own files, so a
|
|
20
|
+
* job there that holds `CHANT_FORGE_TOKEN` runs whatever the change wrote.
|
|
21
|
+
* `pr-post --open` ({@link postOpenPlanReports}) asks GitLab for each open
|
|
22
|
+
* merge request's plan job and reads the report from its artifacts.
|
|
17
23
|
*/
|
|
18
24
|
import { type PrOverdue, type PrReport } from "./pr-loop.js";
|
|
19
25
|
import { type PrForge } from "./pr-forge.js";
|
|
@@ -69,4 +75,40 @@ export declare function planNoteFor(report: PrReport, forge: Pick<PrForge, "kind
|
|
|
69
75
|
* the caller's sets a failed status and posts no note.
|
|
70
76
|
*/
|
|
71
77
|
export declare function postPlanReport(input: PlanPostInput): Promise<PlanPostResult>;
|
|
78
|
+
/** What {@link postOpenPlanReports} posts for. */
|
|
79
|
+
export interface OpenPlanPostInput {
|
|
80
|
+
/** A GitLab client with {@link PrForge.mergeRequestJobs}, {@link PrForge.jobArtifact} and {@link PrForge.statusUrl}. */
|
|
81
|
+
forge: PrForge;
|
|
82
|
+
/** The branch the merge requests merge into: the pipeline's own. */
|
|
83
|
+
branch: string;
|
|
84
|
+
/** The plan job's name in the merge request pipeline: `plan`, or `<member>-plan`. */
|
|
85
|
+
job: string;
|
|
86
|
+
/** The report directory from the repository root, as the plan job kept it as its artifact. */
|
|
87
|
+
artifactDir: string;
|
|
88
|
+
env: string;
|
|
89
|
+
member?: string;
|
|
90
|
+
overdue?: () => Promise<PrOverdue[]>;
|
|
91
|
+
}
|
|
92
|
+
/** What {@link postOpenPlanReports} did for one merge request. */
|
|
93
|
+
export interface OpenPlanPost {
|
|
94
|
+
pr: number;
|
|
95
|
+
head: string;
|
|
96
|
+
/** What was posted, or why nothing was: the plan job has not settled, or its result is already posted. */
|
|
97
|
+
posted?: PlanPostResult;
|
|
98
|
+
skipped?: string;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Post the plan note and status of every open merge request into `branch`
|
|
102
|
+
* whose plan job settled (#4328), from a pipeline of `branch`. GitLab says
|
|
103
|
+
* which merge requests are open, their heads, and their newest pipeline's
|
|
104
|
+
* plan job; the report is the one file `pr-plan.json` of that job's
|
|
105
|
+
* artifacts, read as data as {@link postPlanReport} reads any. The status
|
|
106
|
+
* links to the plan job, and a status that already links to it is the
|
|
107
|
+
* job's result posted, so a job is posted for once. The overdue check runs
|
|
108
|
+
* once for every merge request.
|
|
109
|
+
*/
|
|
110
|
+
export declare function postOpenPlanReports(input: OpenPlanPostInput): Promise<{
|
|
111
|
+
posts: OpenPlanPost[];
|
|
112
|
+
warnings: string[];
|
|
113
|
+
}>;
|
|
72
114
|
//# sourceMappingURL=pr-post.d.ts.map
|
package/dist/pr-post.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-post.d.ts","sourceRoot":"","sources":["../src/pr-post.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pr-post.d.ts","sourceRoot":"","sources":["../src/pr-post.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,EAAmF,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3I,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5D,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CACtC;AAED,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,KAAK,EAAE,OAAO,CAAC;IACf,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAoB/I;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ3G;AAID;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAkDlF;AAED,kDAAkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,wHAAwH;IACxH,KAAK,EAAE,OAAO,CAAC;IACf,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,GAAG,EAAE,MAAM,CAAC;IACZ,8FAA8F;IAC9F,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CACtC;AAED,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,0GAA0G;IAC1G,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA6C1H"}
|
package/dist/pr-post.js
CHANGED
|
@@ -14,8 +14,15 @@
|
|
|
14
14
|
* every hidden HTML comment after its first line is defused, so a forged
|
|
15
15
|
* marker cannot claim another environment's note. A plan job that failed
|
|
16
16
|
* fails the status whatever its report says.
|
|
17
|
+
*
|
|
18
|
+
* On GitLab the post runs in a pipeline of the target branch (#4328): a
|
|
19
|
+
* merge request pipeline is built from the merge request's own files, so a
|
|
20
|
+
* job there that holds `CHANT_FORGE_TOKEN` runs whatever the change wrote.
|
|
21
|
+
* `pr-post --open` ({@link postOpenPlanReports}) asks GitLab for each open
|
|
22
|
+
* merge request's plan job and reads the report from its artifacts.
|
|
17
23
|
*/
|
|
18
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
24
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
25
|
+
import { tmpdir } from "node:os";
|
|
19
26
|
import { join } from "node:path";
|
|
20
27
|
import { prNoteMarker, prStatusContext, prStatusDescription, prStatusState, renderPrNote } from "./pr-loop.js";
|
|
21
28
|
import { forgePrincipalOf } from "./pr-forge.js";
|
|
@@ -132,3 +139,62 @@ export async function postPlanReport(input) {
|
|
|
132
139
|
}
|
|
133
140
|
return { state, description: cut(description), noted: note !== undefined, ...(refused ? { refused } : {}), warnings };
|
|
134
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Post the plan note and status of every open merge request into `branch`
|
|
144
|
+
* whose plan job settled (#4328), from a pipeline of `branch`. GitLab says
|
|
145
|
+
* which merge requests are open, their heads, and their newest pipeline's
|
|
146
|
+
* plan job; the report is the one file `pr-plan.json` of that job's
|
|
147
|
+
* artifacts, read as data as {@link postPlanReport} reads any. The status
|
|
148
|
+
* links to the plan job, and a status that already links to it is the
|
|
149
|
+
* job's result posted, so a job is posted for once. The overdue check runs
|
|
150
|
+
* once for every merge request.
|
|
151
|
+
*/
|
|
152
|
+
export async function postOpenPlanReports(input) {
|
|
153
|
+
const { forge } = input;
|
|
154
|
+
if (!forge.mergeRequestJobs || !forge.jobArtifact || !forge.statusUrl) {
|
|
155
|
+
throw new Error(`pr-post --open reads the plan jobs of open merge requests, which ${forge.kind} cannot say; it is for GitLab`);
|
|
156
|
+
}
|
|
157
|
+
const context = prStatusContext("plan", input.member);
|
|
158
|
+
const warnings = [];
|
|
159
|
+
let overdue;
|
|
160
|
+
const overdueOnce = input.overdue ? () => (overdue ?? (overdue = input.overdue())) : undefined;
|
|
161
|
+
const posts = [];
|
|
162
|
+
for (const job of await forge.mergeRequestJobs(input.branch, input.job)) {
|
|
163
|
+
const settled = job.status === "success" ? "success" : job.status === "failed" ? "failure" : job.status === "canceled" ? "cancelled" : undefined;
|
|
164
|
+
if (!settled) {
|
|
165
|
+
posts.push({ pr: job.pr, head: job.head, skipped: `the plan job is ${job.status}` });
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
if (job.url && (await forge.statusUrl(job.head, context)) === job.url) {
|
|
170
|
+
posts.push({ pr: job.pr, head: job.head, skipped: "this plan job's result is already posted" });
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const dir = mkdtempSync(join(tmpdir(), "chant-pr-post-"));
|
|
174
|
+
try {
|
|
175
|
+
const text = await forge.jobArtifact(job.id, `${input.artifactDir.replace(/\/+$/, "")}/${PR_PLAN_REPORT_FILE}`);
|
|
176
|
+
if (text !== undefined)
|
|
177
|
+
writeFileSync(join(dir, PR_PLAN_REPORT_FILE), text);
|
|
178
|
+
const posted = await postPlanReport({
|
|
179
|
+
// The status links to the plan job it reports on, which is how the next run knows it is posted.
|
|
180
|
+
forge: job.url ? { ...forge, runUrl: job.url } : forge,
|
|
181
|
+
dir,
|
|
182
|
+
pr: job.pr,
|
|
183
|
+
head: job.head,
|
|
184
|
+
env: input.env,
|
|
185
|
+
...(input.member ? { member: input.member } : {}),
|
|
186
|
+
result: settled,
|
|
187
|
+
...(overdueOnce ? { overdue: overdueOnce } : {}),
|
|
188
|
+
});
|
|
189
|
+
posts.push({ pr: job.pr, head: job.head, posted });
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
rmSync(dir, { recursive: true, force: true });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
warnings.push(`!${job.pr}: ${err instanceof Error ? err.message : String(err)}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return { posts, warnings };
|
|
200
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed filters for the contract reads (#4363): `--where <field><op><value>`
|
|
3
|
+
* and `--since <time>`, in place of an embedded SQL engine.
|
|
4
|
+
*
|
|
5
|
+
* Each read declares the fields it can be filtered on and their types
|
|
6
|
+
* ({@link FilterFields}). A clause naming a field the read doesn't declare, an
|
|
7
|
+
* operator its type doesn't take, or a value that isn't of its type is a
|
|
8
|
+
* {@link FilterError} before anything is read, so a typo never filters to an
|
|
9
|
+
* empty answer. Several `--where` clauses all have to hold.
|
|
10
|
+
*
|
|
11
|
+
* Operators: `=` and `!=` for every type; `<`, `<=`, `>` and `>=` for
|
|
12
|
+
* numbers, times and text (text compares by code point); `~` for text, which
|
|
13
|
+
* holds when the field contains the value. The value `null` matches a field
|
|
14
|
+
* that is null or absent, with `=` and `!=` only.
|
|
15
|
+
*
|
|
16
|
+
* A field of type `json` holds an object: a clause can name a key under it
|
|
17
|
+
* with dots (`labels.team=core`), and the value is compared as the type it
|
|
18
|
+
* holds there (a number with a number, a boolean with `true` or `false`, any
|
|
19
|
+
* other value as text). A JSON text is parsed first, so a ledger row that
|
|
20
|
+
* keeps the object as text filters the same way.
|
|
21
|
+
*
|
|
22
|
+
* A null or absent field matches only `=null` and `!=` with a value other
|
|
23
|
+
* than null; the other operators never hold for it.
|
|
24
|
+
*
|
|
25
|
+
* Pure: no I/O, so a bundle that filters rows loads nothing else.
|
|
26
|
+
*/
|
|
27
|
+
export type FilterFieldType = "text" | "number" | "boolean" | "time" | "json";
|
|
28
|
+
/** The fields a read can be filtered on, by name, with their types. */
|
|
29
|
+
export type FilterFields = Readonly<Record<string, FilterFieldType>>;
|
|
30
|
+
/** Every operator, longest first so `!=` is not read as `=`. */
|
|
31
|
+
export declare const WHERE_OPERATORS: readonly ["!=", "<=", ">=", "=", "<", ">", "~"];
|
|
32
|
+
export type WhereOperator = (typeof WHERE_OPERATORS)[number];
|
|
33
|
+
/** One parsed `--where` clause. */
|
|
34
|
+
export interface WhereClause {
|
|
35
|
+
/** The field as written, with any path under a `json` field. */
|
|
36
|
+
field: string;
|
|
37
|
+
/** The declared field the clause starts at. */
|
|
38
|
+
base: string;
|
|
39
|
+
/** The keys under a `json` field, or `[]`. */
|
|
40
|
+
path: string[];
|
|
41
|
+
type: FilterFieldType;
|
|
42
|
+
op: WhereOperator;
|
|
43
|
+
/** The value as written. */
|
|
44
|
+
raw: string;
|
|
45
|
+
/** The value read as the field's type: a number for `number` and `time` (epoch ms), a boolean, a string, or null. */
|
|
46
|
+
value: string | number | boolean | null;
|
|
47
|
+
}
|
|
48
|
+
/** A clause or a `--since` that can't be applied. The message is for a person. */
|
|
49
|
+
export declare class FilterError extends Error {
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* An instant from an ISO 8601 date or time, or from a span back from `now`:
|
|
53
|
+
* `<n>m`, `<n>h`, `<n>d` or `<n>w`. Epoch milliseconds, or null when `text`
|
|
54
|
+
* is neither.
|
|
55
|
+
*/
|
|
56
|
+
export declare function parseInstant(text: string, now?: Date): number | null;
|
|
57
|
+
/** `--since <time>` as an ISO instant, or a {@link FilterError}. */
|
|
58
|
+
export declare function parseSince(text: string, now?: Date): string;
|
|
59
|
+
/** Parse each `--where` against the fields a read declares. Throws a {@link FilterError}. */
|
|
60
|
+
export declare function parseWhere(exprs: readonly string[], fields: FilterFields, now?: Date): WhereClause[];
|
|
61
|
+
/** Whether one clause holds for `row`. */
|
|
62
|
+
export declare function clauseHolds(row: unknown, c: WhereClause): boolean;
|
|
63
|
+
/** Whether every clause holds for `row`. */
|
|
64
|
+
export declare function matchesWhere(row: unknown, clauses: readonly WhereClause[]): boolean;
|
|
65
|
+
//# sourceMappingURL=read-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-filter.d.ts","sourceRoot":"","sources":["../src/read-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9E,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;AAErE,gEAAgE;AAChE,eAAO,MAAM,eAAe,YAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAC/E,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,eAAe,CAAC;IACtB,EAAE,EAAE,aAAa,CAAC;IAClB,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,qHAAqH;IACrH,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CACzC;AAED,kFAAkF;AAClF,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAIzC;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,GAAG,IAAI,CAShF;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAIvE;AAaD,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,GAAE,IAAiB,GAAG,WAAW,EAAE,CAqChH;AA+BD,0CAA0C;AAC1C,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO,CA0BjE;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAEnF"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed filters for the contract reads (#4363): `--where <field><op><value>`
|
|
3
|
+
* and `--since <time>`, in place of an embedded SQL engine.
|
|
4
|
+
*
|
|
5
|
+
* Each read declares the fields it can be filtered on and their types
|
|
6
|
+
* ({@link FilterFields}). A clause naming a field the read doesn't declare, an
|
|
7
|
+
* operator its type doesn't take, or a value that isn't of its type is a
|
|
8
|
+
* {@link FilterError} before anything is read, so a typo never filters to an
|
|
9
|
+
* empty answer. Several `--where` clauses all have to hold.
|
|
10
|
+
*
|
|
11
|
+
* Operators: `=` and `!=` for every type; `<`, `<=`, `>` and `>=` for
|
|
12
|
+
* numbers, times and text (text compares by code point); `~` for text, which
|
|
13
|
+
* holds when the field contains the value. The value `null` matches a field
|
|
14
|
+
* that is null or absent, with `=` and `!=` only.
|
|
15
|
+
*
|
|
16
|
+
* A field of type `json` holds an object: a clause can name a key under it
|
|
17
|
+
* with dots (`labels.team=core`), and the value is compared as the type it
|
|
18
|
+
* holds there (a number with a number, a boolean with `true` or `false`, any
|
|
19
|
+
* other value as text). A JSON text is parsed first, so a ledger row that
|
|
20
|
+
* keeps the object as text filters the same way.
|
|
21
|
+
*
|
|
22
|
+
* A null or absent field matches only `=null` and `!=` with a value other
|
|
23
|
+
* than null; the other operators never hold for it.
|
|
24
|
+
*
|
|
25
|
+
* Pure: no I/O, so a bundle that filters rows loads nothing else.
|
|
26
|
+
*/
|
|
27
|
+
/** Every operator, longest first so `!=` is not read as `=`. */
|
|
28
|
+
export const WHERE_OPERATORS = ["!=", "<=", ">=", "=", "<", ">", "~"];
|
|
29
|
+
/** A clause or a `--since` that can't be applied. The message is for a person. */
|
|
30
|
+
export class FilterError extends Error {
|
|
31
|
+
}
|
|
32
|
+
const ORDERED = ["<", "<=", ">", ">="];
|
|
33
|
+
/**
|
|
34
|
+
* An instant from an ISO 8601 date or time, or from a span back from `now`:
|
|
35
|
+
* `<n>m`, `<n>h`, `<n>d` or `<n>w`. Epoch milliseconds, or null when `text`
|
|
36
|
+
* is neither.
|
|
37
|
+
*/
|
|
38
|
+
export function parseInstant(text, now = new Date()) {
|
|
39
|
+
const span = /^(\d+)([mhdw])$/.exec(text.trim());
|
|
40
|
+
if (span) {
|
|
41
|
+
const unit = { m: 60000, h: 3600000, d: 86400000, w: 604800000 }[span[2]];
|
|
42
|
+
return now.getTime() - Number(span[1]) * unit;
|
|
43
|
+
}
|
|
44
|
+
if (!/^\d{4}-\d{2}-\d{2}/.test(text.trim()))
|
|
45
|
+
return null;
|
|
46
|
+
const ms = Date.parse(text);
|
|
47
|
+
return Number.isNaN(ms) ? null : ms;
|
|
48
|
+
}
|
|
49
|
+
/** `--since <time>` as an ISO instant, or a {@link FilterError}. */
|
|
50
|
+
export function parseSince(text, now = new Date()) {
|
|
51
|
+
const ms = parseInstant(text, now);
|
|
52
|
+
if (ms === null)
|
|
53
|
+
throw new FilterError(`--since takes an ISO 8601 date or time, or a span back from now such as 24h or 7d, not ${JSON.stringify(text)}`);
|
|
54
|
+
return new Date(ms).toISOString();
|
|
55
|
+
}
|
|
56
|
+
/** The declared field a dotted name starts at: the whole name, or its longest declared `json` prefix. */
|
|
57
|
+
function resolveField(name, fields) {
|
|
58
|
+
if (Object.prototype.hasOwnProperty.call(fields, name))
|
|
59
|
+
return { base: name, path: [], type: fields[name] };
|
|
60
|
+
const parts = name.split(".");
|
|
61
|
+
for (let i = parts.length - 1; i > 0; i--) {
|
|
62
|
+
const base = parts.slice(0, i).join(".");
|
|
63
|
+
if (Object.prototype.hasOwnProperty.call(fields, base) && fields[base] === "json")
|
|
64
|
+
return { base, path: parts.slice(i), type: "json" };
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
/** Parse each `--where` against the fields a read declares. Throws a {@link FilterError}. */
|
|
69
|
+
export function parseWhere(exprs, fields, now = new Date()) {
|
|
70
|
+
const names = Object.keys(fields).join(", ");
|
|
71
|
+
return exprs.map((expr) => {
|
|
72
|
+
const m = /^([A-Za-z_][\w.-]*)\s*(!=|<=|>=|=|<|>|~)(.*)$/s.exec(expr);
|
|
73
|
+
if (!m)
|
|
74
|
+
throw new FilterError(`--where takes <field><op><value>, with op one of ${WHERE_OPERATORS.join(" ")}, not ${JSON.stringify(expr)}`);
|
|
75
|
+
const [, field, op, rawValue] = m;
|
|
76
|
+
const raw = rawValue.trim();
|
|
77
|
+
const found = resolveField(field, fields);
|
|
78
|
+
if (!found)
|
|
79
|
+
throw new FilterError(`--where ${field}: no such field; this read filters on ${names}`);
|
|
80
|
+
const { base, path, type } = found;
|
|
81
|
+
if (type === "json" && path.length === 0)
|
|
82
|
+
throw new FilterError(`--where ${field}: holds an object; name a key under it, such as ${field}.<key>`);
|
|
83
|
+
const clause = (value) => ({ field, base, path, type, op, raw, value });
|
|
84
|
+
if (raw === "null") {
|
|
85
|
+
if (op !== "=" && op !== "!=")
|
|
86
|
+
throw new FilterError(`--where ${field}${op}null: null takes = or != only`);
|
|
87
|
+
return clause(null);
|
|
88
|
+
}
|
|
89
|
+
if (op === "~" && type !== "text" && type !== "json")
|
|
90
|
+
throw new FilterError(`--where ${field}~: ~ (contains) takes a text field; ${field} is ${type}`);
|
|
91
|
+
switch (type) {
|
|
92
|
+
case "number": {
|
|
93
|
+
const n = Number(raw);
|
|
94
|
+
if (raw === "" || !Number.isFinite(n))
|
|
95
|
+
throw new FilterError(`--where ${field}: ${field} is a number, not ${JSON.stringify(raw)}`);
|
|
96
|
+
return clause(n);
|
|
97
|
+
}
|
|
98
|
+
case "boolean": {
|
|
99
|
+
if (ORDERED.includes(op))
|
|
100
|
+
throw new FilterError(`--where ${field}${op}: a boolean takes = or != only`);
|
|
101
|
+
if (raw !== "true" && raw !== "false")
|
|
102
|
+
throw new FilterError(`--where ${field}: ${field} is true or false, not ${JSON.stringify(raw)}`);
|
|
103
|
+
return clause(raw === "true");
|
|
104
|
+
}
|
|
105
|
+
case "time": {
|
|
106
|
+
const ms = parseInstant(raw, now);
|
|
107
|
+
if (ms === null)
|
|
108
|
+
throw new FilterError(`--where ${field}: ${field} is a time; give an ISO 8601 date or time, or a span back from now such as 24h or 7d, not ${JSON.stringify(raw)}`);
|
|
109
|
+
return clause(ms);
|
|
110
|
+
}
|
|
111
|
+
default:
|
|
112
|
+
return clause(raw);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/** The value at a clause's field in `row`, parsing a JSON text on the way into a `json` field. */
|
|
117
|
+
function valueAt(row, c) {
|
|
118
|
+
let v = row;
|
|
119
|
+
for (const key of c.base.split("."))
|
|
120
|
+
v = v !== null && typeof v === "object" ? v[key] : undefined;
|
|
121
|
+
for (const key of c.path) {
|
|
122
|
+
if (typeof v === "string") {
|
|
123
|
+
try {
|
|
124
|
+
v = JSON.parse(v);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
v = v !== null && typeof v === "object" && !Array.isArray(v) ? v[key] : undefined;
|
|
131
|
+
}
|
|
132
|
+
return v;
|
|
133
|
+
}
|
|
134
|
+
function compare(a, b, op) {
|
|
135
|
+
switch (op) {
|
|
136
|
+
case "=": return a === b;
|
|
137
|
+
case "!=": return a !== b;
|
|
138
|
+
case "<": return a < b;
|
|
139
|
+
case "<=": return a <= b;
|
|
140
|
+
case ">": return a > b;
|
|
141
|
+
case ">=": return a >= b;
|
|
142
|
+
case "~": return String(a).includes(String(b));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Whether one clause holds for `row`. */
|
|
146
|
+
export function clauseHolds(row, c) {
|
|
147
|
+
const v = valueAt(row, c);
|
|
148
|
+
if (c.value === null)
|
|
149
|
+
return c.op === "=" ? v === null || v === undefined : v !== null && v !== undefined;
|
|
150
|
+
if (v === null || v === undefined)
|
|
151
|
+
return c.op === "!=";
|
|
152
|
+
switch (c.type) {
|
|
153
|
+
case "number":
|
|
154
|
+
return typeof v === "number" && compare(v, c.value, c.op);
|
|
155
|
+
case "boolean":
|
|
156
|
+
return typeof v === "boolean" ? (c.op === "=") === (v === c.value) : false;
|
|
157
|
+
case "time": {
|
|
158
|
+
const ms = typeof v === "string" ? Date.parse(v) : typeof v === "number" ? v : NaN;
|
|
159
|
+
return !Number.isNaN(ms) && compare(ms, c.value, c.op);
|
|
160
|
+
}
|
|
161
|
+
case "text":
|
|
162
|
+
return typeof v === "string" && compare(v, c.value, c.op);
|
|
163
|
+
case "json": {
|
|
164
|
+
// Compared as the type the value holds there.
|
|
165
|
+
if (typeof v === "number" && c.op !== "~") {
|
|
166
|
+
const n = Number(c.raw);
|
|
167
|
+
return Number.isFinite(n) && compare(v, n, c.op);
|
|
168
|
+
}
|
|
169
|
+
if (typeof v === "boolean")
|
|
170
|
+
return (c.raw === "true" || c.raw === "false") && (c.op === "=" || c.op === "!=") ? (c.op === "=") === (String(v) === c.raw) : false;
|
|
171
|
+
const s = typeof v === "string" ? v : JSON.stringify(v);
|
|
172
|
+
return compare(s, c.raw, c.op);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** Whether every clause holds for `row`. */
|
|
177
|
+
export function matchesWhere(row, clauses) {
|
|
178
|
+
return clauses.every((c) => clauseHolds(row, c));
|
|
179
|
+
}
|
package/dist/run-event.d.ts
CHANGED
|
@@ -47,7 +47,7 @@ export type RunEventStepStatus = "ok" | "failed" | "skipped" | "cached" | "gated
|
|
|
47
47
|
/** Why a step was skipped. */
|
|
48
48
|
export type RunEventSkipReason = "receipt" | "resumed" | "refused" | "not-run";
|
|
49
49
|
/** How a gate's approval passed, when it was more than one person's approval of that gate. */
|
|
50
|
-
export type RunEventGateVia = "quorum" | "policy" | "point" | "alias" | "empty";
|
|
50
|
+
export type RunEventGateVia = "quorum" | "policy" | "point" | "alias" | "empty" | "workspace";
|
|
51
51
|
/** The run every event of a stream names: the same on every line. */
|
|
52
52
|
export interface RunEventRun {
|
|
53
53
|
/**
|
package/dist/run-event.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-event.d.ts","sourceRoot":"","sources":["../src/run-event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,kEAAkE;AAClE,eAAO,MAAM,mBAAmB,oFAAoF,CAAC;AAErH,8DAA8D;AAC9D,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,8EAA8E;AAC9E,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,2FAA2F;AAC3F,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,WAAW,GAAG,UAAU,CAAC;AAE3D,gGAAgG;AAChG,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;AAEzD,gHAAgH;AAChH,MAAM,MAAM,oBAAoB,GAAG,IAAI,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzE;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE9F,8BAA8B;AAC9B,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/E,8FAA8F;AAC9F,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"run-event.d.ts","sourceRoot":"","sources":["../src/run-event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,kEAAkE;AAClE,eAAO,MAAM,mBAAmB,oFAAoF,CAAC;AAErH,8DAA8D;AAC9D,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,8EAA8E;AAC9E,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,2FAA2F;AAC3F,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,WAAW,GAAG,UAAU,CAAC;AAE3D,gGAAgG;AAChG,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;AAEzD,gHAAgH;AAChH,MAAM,MAAM,oBAAoB,GAAG,IAAI,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzE;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE9F,8BAA8B;AAC9B,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/E,8FAA8F;AAC9F,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,CAAC;AAE9F,qEAAqE;AACrE,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,YAAY,CAAC;IACnB,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,eAAe,CAAC;IACzB;;;;OAIG;IACH,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,iDAAiD;AACjD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,OAAO,EAAE,OAAO,mBAAmB,CAAC;IACpC,QAAQ,EAAE,OAAO,0BAA0B,CAAC;IAC5C,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,mGAAmG;IACnG,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC;CAC1B;AAED,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,2GAA2G;AAC3G,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qEAAqE;AACrE,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,6BAA6B,GAAG,oBAAoB,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAEjG,8GAA8G;AAC9G,eAAO,MAAM,8BAA8B,aAAa,CAAC;AAEzD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,kBAAkB,CAAC;IACzB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,6BAA6B,CAAC;IACtC,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0HAA0H;AAC1H,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,kBAAkB,CAAC;IAC3B,kEAAkE;IAClE,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8FAA8F;AAC9F,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,8EAA8E;IAC9E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,qDAAqD;IACrD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GACpB,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,sBAAsB,GACtB,uBAAuB,GACvB,kBAAkB,GAClB,mBAAmB,GACnB,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,oBAAoB,CAAC;AAEzB,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAEhD,wFAAwF;AACxF,eAAO,MAAM,eAAe,uMAagB,CAAC;AAE7C,kCAAkC;AAClC,MAAM,MAAM,QAAQ,GAAG,YAAY,SAAS,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AAEtH,yFAAyF;AACzF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAEzD;AAED,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,WAAW,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACnB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,GAAG,QAAQ,CAiBhF;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,QAAQ,CAI/G;AAED,6FAA6F;AAC7F,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,CAAC;IACnC,qCAAqC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,WAAW,CAAC;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,0FAA0F;IAC1F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,uGAAuG;AACvG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,cAAc,CAYhF;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CA8BxE;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE;IACH,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACrC,GACA,YAAY,EAAE,CAqDhB"}
|
|
@@ -10,8 +10,9 @@
|
|
|
10
10
|
* (via live import) and generating the TF patches live in the command/bridge
|
|
11
11
|
* layers; this module just classifies the boundary.
|
|
12
12
|
*/
|
|
13
|
-
import { type ScoreOptions } from "./score.js";
|
|
14
|
-
import type
|
|
13
|
+
import { type Peelability, type ScoreOptions } from "./score.js";
|
|
14
|
+
import { type Adjacency } from "../graph-walk.js";
|
|
15
|
+
import type { TfEdge, TfGraph, TfNode } from "./types.js";
|
|
15
16
|
/** One resource in the carve set (the selected node plus its folded sub-resources). */
|
|
16
17
|
export interface CarveMember {
|
|
17
18
|
address: string;
|
|
@@ -77,7 +78,20 @@ export interface CarveReport {
|
|
|
77
78
|
* that fold into it (same name, a `foldParentOf` child type whose parent is the
|
|
78
79
|
* selection). Those are carried along and inlined, not left behind.
|
|
79
80
|
*/
|
|
80
|
-
export declare function resolveCarveSet(graph: TfGraph, target: string): CarveMember[];
|
|
81
|
+
export declare function resolveCarveSet(graph: TfGraph, target: string, index?: BoundaryIndex): CarveMember[];
|
|
82
|
+
/**
|
|
83
|
+
* What `boundaryReport` looks up per target, built once per graph: nodes by
|
|
84
|
+
* address, the edges by both ends, and each fold parent's children in graph
|
|
85
|
+
* order. Without it each report scans the node and edge lists itself, which
|
|
86
|
+
* over a whole estate is O(V·E) (#4391).
|
|
87
|
+
*/
|
|
88
|
+
export interface BoundaryIndex {
|
|
89
|
+
byAddress: Map<string, TfNode>;
|
|
90
|
+
adjacency: Adjacency<TfEdge>;
|
|
91
|
+
/** `foldKey(parent type, name)` → resource nodes that fold into that parent. */
|
|
92
|
+
foldChildren: Map<string, TfNode[]>;
|
|
93
|
+
}
|
|
94
|
+
export declare function boundaryIndex(graph: TfGraph): BoundaryIndex;
|
|
81
95
|
/**
|
|
82
96
|
* Which source the graph came from, and so which vocabulary its bridge patches
|
|
83
97
|
* are named in. Terraform is the default; `cdk` is the read-only cloud-assembly
|
|
@@ -89,6 +103,13 @@ export interface BoundaryOptions {
|
|
|
89
103
|
dialect?: CarveDialect;
|
|
90
104
|
/** Scoring hooks, so `peelability` is the same number the ranking reported. */
|
|
91
105
|
score?: ScoreOptions;
|
|
106
|
+
/**
|
|
107
|
+
* The target's score, when the caller already holds it (`carve advise`).
|
|
108
|
+
* Without it the estate is scored to find it (#4391).
|
|
109
|
+
*/
|
|
110
|
+
peelability?: Pick<Peelability, "score">;
|
|
111
|
+
/** `boundaryIndex(graph)`, shared across calls on one graph. */
|
|
112
|
+
index?: BoundaryIndex;
|
|
92
113
|
}
|
|
93
114
|
/**
|
|
94
115
|
* Classify the boundary of carving `target`: the inbound edges that need an
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"carve.d.ts","sourceRoot":"","sources":["../../src/terraform/carve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"carve.d.ts","sourceRoot":"","sources":["../../src/terraform/carve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEvD,uFAAuF;AACvF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,UAAU,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;;OAKG;IACH,GAAG,EAAE,MAAM,EAAE,CAAC;IACd;;;;;;OAMG;IACH,MAAM,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,YAAY,GAAG,oBAAoB,GAAG,gBAAgB,CAAC;IACxG,QAAQ,EAAE,aAAa,GAAG,UAAU,CAAC;IACrC,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,iFAAiF;IACjF,UAAU,EAAE,IAAI,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,WAAW,EAAE,CAYpG;AAID;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7B,gFAAgF;IAChF,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAgB3D;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,KAAK,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACzC,gEAAgE;IAChE,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAQD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,WAAW,GAAG,IAAI,CA0D7G;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAajE"}
|
package/dist/terraform/carve.js
CHANGED
|
@@ -13,29 +13,47 @@
|
|
|
13
13
|
import { inboundEdges, outboundEdges } from "./graph.js";
|
|
14
14
|
import { foldParentOf, resolveTier } from "./tier-map.js";
|
|
15
15
|
import { scoreEstate } from "./score.js";
|
|
16
|
+
import { adjacencyOf } from "../graph-walk.js";
|
|
16
17
|
/**
|
|
17
18
|
* The carve set for a selected address: the node itself plus any sub-resources
|
|
18
19
|
* that fold into it (same name, a `foldParentOf` child type whose parent is the
|
|
19
20
|
* selection). Those are carried along and inlined, not left behind.
|
|
20
21
|
*/
|
|
21
|
-
export function resolveCarveSet(graph, target) {
|
|
22
|
-
const byAddress =
|
|
22
|
+
export function resolveCarveSet(graph, target, index) {
|
|
23
|
+
const { byAddress, foldChildren } = index ?? boundaryIndex(graph);
|
|
23
24
|
const selected = byAddress.get(target);
|
|
24
25
|
if (!selected)
|
|
25
26
|
return [];
|
|
26
27
|
const members = [{ address: selected.address, type: selected.type }];
|
|
27
28
|
if (selected.kind === "resource" && selected.type) {
|
|
28
|
-
for (const node of
|
|
29
|
-
|
|
30
|
-
continue;
|
|
31
|
-
const parentType = foldParentOf(node.type);
|
|
32
|
-
if (parentType === selected.type && node.name === selected.name) {
|
|
33
|
-
members.push({ address: node.address, type: node.type, foldedInto: selected.address });
|
|
34
|
-
}
|
|
29
|
+
for (const node of foldChildren.get(foldKey(selected.type, selected.name)) ?? []) {
|
|
30
|
+
members.push({ address: node.address, type: node.type, foldedInto: selected.address });
|
|
35
31
|
}
|
|
36
32
|
}
|
|
37
33
|
return members;
|
|
38
34
|
}
|
|
35
|
+
const foldKey = (parentType, name) => `${parentType}\u001f${name}`;
|
|
36
|
+
export function boundaryIndex(graph) {
|
|
37
|
+
const foldChildren = new Map();
|
|
38
|
+
for (const node of graph.nodes) {
|
|
39
|
+
if (node.kind !== "resource" || !node.type)
|
|
40
|
+
continue;
|
|
41
|
+
const parentType = foldParentOf(node.type);
|
|
42
|
+
if (!parentType)
|
|
43
|
+
continue;
|
|
44
|
+
const key = foldKey(parentType, node.name);
|
|
45
|
+
const list = foldChildren.get(key);
|
|
46
|
+
if (list)
|
|
47
|
+
list.push(node);
|
|
48
|
+
else
|
|
49
|
+
foldChildren.set(key, [node]);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
byAddress: new Map(graph.nodes.map((n) => [n.address, n])),
|
|
53
|
+
adjacency: adjacencyOf(graph.edges),
|
|
54
|
+
foldChildren,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
39
57
|
/** The bridge patch an inbound cut needs, per source. */
|
|
40
58
|
function inboundBridge(dialect, fromOutput) {
|
|
41
59
|
if (dialect === "cdk")
|
|
@@ -50,14 +68,14 @@ function inboundBridge(dialect, fromOutput) {
|
|
|
50
68
|
*/
|
|
51
69
|
export function boundaryReport(graph, target, opts = {}) {
|
|
52
70
|
const dialect = opts.dialect ?? "terraform";
|
|
53
|
-
const carveSet = resolveCarveSet(graph, target);
|
|
71
|
+
const carveSet = resolveCarveSet(graph, target, opts.index);
|
|
54
72
|
if (carveSet.length === 0)
|
|
55
73
|
return null;
|
|
56
74
|
const inSet = new Set(carveSet.map((m) => m.address));
|
|
57
75
|
const inbound = [];
|
|
58
76
|
const outbound = [];
|
|
59
77
|
for (const member of carveSet) {
|
|
60
|
-
for (const e of inboundEdges(graph, member.address)) {
|
|
78
|
+
for (const e of (opts.index ? (opts.index.adjacency.in.get(member.address) ?? []) : inboundEdges(graph, member.address))) {
|
|
61
79
|
if (inSet.has(e.from))
|
|
62
80
|
continue; // internal edge
|
|
63
81
|
inbound.push({
|
|
@@ -71,7 +89,7 @@ export function boundaryReport(graph, target, opts = {}) {
|
|
|
71
89
|
...(e.crossStack ? { crossStack: true } : {}),
|
|
72
90
|
});
|
|
73
91
|
}
|
|
74
|
-
for (const e of outboundEdges(graph, member.address)) {
|
|
92
|
+
for (const e of (opts.index ? (opts.index.adjacency.out.get(member.address) ?? []) : outboundEdges(graph, member.address))) {
|
|
75
93
|
if (inSet.has(e.to))
|
|
76
94
|
continue; // internal edge
|
|
77
95
|
outbound.push({
|
|
@@ -86,12 +104,12 @@ export function boundaryReport(graph, target, opts = {}) {
|
|
|
86
104
|
});
|
|
87
105
|
}
|
|
88
106
|
}
|
|
89
|
-
const score = scoreEstate(graph, opts.score).find((r) => r.address === target);
|
|
107
|
+
const score = opts.peelability ?? scoreEstate(graph, { ...opts.score, radius: false }).find((r) => r.address === target);
|
|
90
108
|
const diagnostics = [];
|
|
91
109
|
const tierOf = opts.score?.tierOf ?? resolveTier;
|
|
92
110
|
if (carveSet[0].type &&
|
|
93
111
|
tierOf(carveSet[0].type) === null &&
|
|
94
|
-
graph.nodes.
|
|
112
|
+
(opts.index?.byAddress ?? new Map(graph.nodes.map((n) => [n.address, n]))).get(target)?.kind === "resource") {
|
|
95
113
|
diagnostics.push(`No known native mapping for ${carveSet[0].type} — emit will have no target type.`);
|
|
96
114
|
}
|
|
97
115
|
return {
|