@intentius/chant-lexicon-pulumi 0.0.0-stage → 0.124.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -2
- package/dist/adopt.d.ts +68 -0
- package/dist/adopt.d.ts.map +1 -0
- package/dist/adopt.js +162 -0
- package/dist/capability-plugin.d.ts +6 -0
- package/dist/capability-plugin.d.ts.map +1 -0
- package/dist/capability-plugin.js +21 -0
- package/dist/change-set.d.ts +182 -0
- package/dist/change-set.d.ts.map +1 -0
- package/dist/change-set.js +357 -0
- package/dist/ci-setup.d.ts +53 -0
- package/dist/ci-setup.d.ts.map +1 -0
- package/dist/ci-setup.js +146 -0
- package/dist/codegen/docs-cli.d.ts +3 -0
- package/dist/codegen/docs-cli.d.ts.map +1 -0
- package/dist/codegen/docs-cli.js +3 -0
- package/dist/codegen/docs.d.ts +9 -0
- package/dist/codegen/docs.d.ts.map +1 -0
- package/dist/codegen/docs.js +52 -0
- package/dist/codegen/package.d.ts +8 -0
- package/dist/codegen/package.d.ts.map +1 -0
- package/dist/codegen/package.js +56 -0
- package/dist/composites/pulumi-adopt-op.d.ts +106 -0
- package/dist/composites/pulumi-adopt-op.d.ts.map +1 -0
- package/dist/composites/pulumi-adopt-op.js +132 -0
- package/dist/composites/pulumi-watch-op.d.ts +60 -0
- package/dist/composites/pulumi-watch-op.d.ts.map +1 -0
- package/dist/composites/pulumi-watch-op.js +58 -0
- package/dist/config.d.ts +59 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +29 -0
- package/dist/describe-resources.d.ts +24 -0
- package/dist/describe-resources.d.ts.map +1 -0
- package/dist/describe-resources.js +97 -0
- package/dist/drift-read.d.ts +35 -0
- package/dist/drift-read.d.ts.map +1 -0
- package/dist/drift-read.js +41 -0
- package/dist/drift-record.d.ts +128 -0
- package/dist/drift-record.d.ts.map +1 -0
- package/dist/drift-record.js +270 -0
- package/dist/engine-events.d.ts +222 -0
- package/dist/engine-events.d.ts.map +1 -0
- package/dist/engine-events.js +280 -0
- package/dist/engine-graph.d.ts +75 -0
- package/dist/engine-graph.d.ts.map +1 -0
- package/dist/engine-graph.js +100 -0
- package/dist/exit-codes.d.ts +53 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +67 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/init-templates.d.ts +23 -0
- package/dist/init-templates.d.ts.map +1 -0
- package/dist/init-templates.js +60 -0
- package/dist/integrity.json +29 -0
- package/dist/lint/audit-catalog.d.ts +21 -0
- package/dist/lint/audit-catalog.d.ts.map +1 -0
- package/dist/lint/audit-catalog.js +139 -0
- package/dist/lint/post-synth/index.d.ts +3 -0
- package/dist/lint/post-synth/index.d.ts.map +1 -0
- package/dist/lint/post-synth/index.js +32 -0
- package/dist/lint/post-synth/member-read-helpers.d.ts +45 -0
- package/dist/lint/post-synth/member-read-helpers.d.ts.map +1 -0
- package/dist/lint/post-synth/member-read-helpers.js +103 -0
- package/dist/lint/post-synth/pul001.d.ts +18 -0
- package/dist/lint/post-synth/pul001.d.ts.map +1 -0
- package/dist/lint/post-synth/pul001.js +20 -0
- package/dist/lint/post-synth/pul002.d.ts +18 -0
- package/dist/lint/post-synth/pul002.d.ts.map +1 -0
- package/dist/lint/post-synth/pul002.js +20 -0
- package/dist/lint/post-synth/pul003.d.ts +17 -0
- package/dist/lint/post-synth/pul003.d.ts.map +1 -0
- package/dist/lint/post-synth/pul003.js +21 -0
- package/dist/lint/post-synth/pul004.d.ts +13 -0
- package/dist/lint/post-synth/pul004.d.ts.map +1 -0
- package/dist/lint/post-synth/pul004.js +13 -0
- package/dist/lint/post-synth/pul005.d.ts +12 -0
- package/dist/lint/post-synth/pul005.d.ts.map +1 -0
- package/dist/lint/post-synth/pul005.js +13 -0
- package/dist/lint/post-synth/pul006.d.ts +12 -0
- package/dist/lint/post-synth/pul006.d.ts.map +1 -0
- package/dist/lint/post-synth/pul006.js +13 -0
- package/dist/lint/post-synth/pul007.d.ts +13 -0
- package/dist/lint/post-synth/pul007.d.ts.map +1 -0
- package/dist/lint/post-synth/pul007.js +20 -0
- package/dist/lint/post-synth/pul008.d.ts +12 -0
- package/dist/lint/post-synth/pul008.d.ts.map +1 -0
- package/dist/lint/post-synth/pul008.js +23 -0
- package/dist/lint/post-synth/pul009.d.ts +11 -0
- package/dist/lint/post-synth/pul009.d.ts.map +1 -0
- package/dist/lint/post-synth/pul009.js +19 -0
- package/dist/lint/post-synth/pul010.d.ts +13 -0
- package/dist/lint/post-synth/pul010.d.ts.map +1 -0
- package/dist/lint/post-synth/pul010.js +22 -0
- package/dist/lint/post-synth/pul011.d.ts +12 -0
- package/dist/lint/post-synth/pul011.d.ts.map +1 -0
- package/dist/lint/post-synth/pul011.js +21 -0
- package/dist/lint/post-synth/pul012.d.ts +13 -0
- package/dist/lint/post-synth/pul012.d.ts.map +1 -0
- package/dist/lint/post-synth/pul012.js +20 -0
- package/dist/lint/post-synth/pul013.d.ts +14 -0
- package/dist/lint/post-synth/pul013.d.ts.map +1 -0
- package/dist/lint/post-synth/pul013.js +20 -0
- package/dist/lint/post-synth/pul014.d.ts +12 -0
- package/dist/lint/post-synth/pul014.d.ts.map +1 -0
- package/dist/lint/post-synth/pul014.js +18 -0
- package/dist/lint/post-synth/pul015.d.ts +17 -0
- package/dist/lint/post-synth/pul015.d.ts.map +1 -0
- package/dist/lint/post-synth/pul015.js +19 -0
- package/dist/lint/rules/index.d.ts +5 -0
- package/dist/lint/rules/index.d.ts.map +1 -0
- package/dist/lint/rules/index.js +4 -0
- package/dist/lint/rules/member-dir-absolute.d.ts +22 -0
- package/dist/lint/rules/member-dir-absolute.d.ts.map +1 -0
- package/dist/lint/rules/member-dir-absolute.js +81 -0
- package/dist/lock-rows.d.ts +32 -0
- package/dist/lock-rows.d.ts.map +1 -0
- package/dist/lock-rows.js +36 -0
- package/dist/lsp/completions.d.ts +5 -0
- package/dist/lsp/completions.d.ts.map +1 -0
- package/dist/lsp/completions.js +120 -0
- package/dist/lsp/documents.d.ts +32 -0
- package/dist/lsp/documents.d.ts.map +1 -0
- package/dist/lsp/documents.js +44 -0
- package/dist/lsp/hover.d.ts +11 -0
- package/dist/lsp/hover.d.ts.map +1 -0
- package/dist/lsp/hover.js +76 -0
- package/dist/lsp/keys.d.ts +35 -0
- package/dist/lsp/keys.d.ts.map +1 -0
- package/dist/lsp/keys.js +146 -0
- package/dist/lsp/object-path.d.ts +16 -0
- package/dist/lsp/object-path.d.ts.map +1 -0
- package/dist/lsp/object-path.js +76 -0
- package/dist/lsp/yaml-cursor.d.ts +29 -0
- package/dist/lsp/yaml-cursor.d.ts.map +1 -0
- package/dist/lsp/yaml-cursor.js +70 -0
- package/dist/manifest.json +6 -0
- package/dist/member-engine.d.ts +33 -0
- package/dist/member-engine.d.ts.map +1 -0
- package/dist/member-engine.js +80 -0
- package/dist/member-outputs.d.ts +43 -0
- package/dist/member-outputs.d.ts.map +1 -0
- package/dist/member-outputs.js +82 -0
- package/dist/meta.json +1 -0
- package/dist/okf/index.md +22 -0
- package/dist/okf/rules/PUL001.md +11 -0
- package/dist/okf/rules/PUL002.md +11 -0
- package/dist/okf/rules/PUL003.md +11 -0
- package/dist/okf/rules/PUL004.md +11 -0
- package/dist/okf/rules/PUL005.md +11 -0
- package/dist/okf/rules/PUL006.md +11 -0
- package/dist/okf/rules/PUL007.md +11 -0
- package/dist/okf/rules/PUL008.md +11 -0
- package/dist/okf/rules/PUL009.md +11 -0
- package/dist/okf/rules/PUL010.md +11 -0
- package/dist/okf/rules/PUL011.md +11 -0
- package/dist/okf/rules/PUL012.md +11 -0
- package/dist/okf/rules/PUL013.md +11 -0
- package/dist/okf/rules/PUL014.md +11 -0
- package/dist/okf/rules/PUL015.md +11 -0
- package/dist/okf/rules/PUL101.md +11 -0
- package/dist/op/activities/index.d.ts +27 -0
- package/dist/op/activities/index.d.ts.map +1 -0
- package/dist/op/activities/index.js +24 -0
- package/dist/op/activities/pulumi-adopt.d.ts +104 -0
- package/dist/op/activities/pulumi-adopt.d.ts.map +1 -0
- package/dist/op/activities/pulumi-adopt.js +216 -0
- package/dist/op/activities/pulumi.d.ts +62 -0
- package/dist/op/activities/pulumi.d.ts.map +1 -0
- package/dist/op/activities/pulumi.js +81 -0
- package/dist/op/activity-contracts.d.ts +107 -0
- package/dist/op/activity-contracts.d.ts.map +1 -0
- package/dist/op/activity-contracts.js +89 -0
- package/dist/op/builders.d.ts +29 -0
- package/dist/op/builders.d.ts.map +1 -0
- package/dist/op/builders.js +39 -0
- package/dist/package-cli.d.ts +3 -0
- package/dist/package-cli.d.ts.map +1 -0
- package/dist/package-cli.js +12 -0
- package/dist/plan-shape.d.ts +47 -0
- package/dist/plan-shape.d.ts.map +1 -0
- package/dist/plan-shape.js +94 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +222 -0
- package/dist/plunge-timings.d.ts +43 -0
- package/dist/plunge-timings.d.ts.map +1 -0
- package/dist/plunge-timings.js +106 -0
- package/dist/pulumi-up.d.ts +376 -0
- package/dist/pulumi-up.d.ts.map +1 -0
- package/dist/pulumi-up.js +823 -0
- package/dist/release-copy.d.ts +47 -0
- package/dist/release-copy.d.ts.map +1 -0
- package/dist/release-copy.js +131 -0
- package/dist/review-stack.d.ts +92 -0
- package/dist/review-stack.d.ts.map +1 -0
- package/dist/review-stack.js +222 -0
- package/dist/rules/member-dir-absolute.ts +83 -0
- package/dist/rules/member-read-helpers.ts +122 -0
- package/dist/rules/pul001.ts +38 -0
- package/dist/rules/pul002.ts +38 -0
- package/dist/rules/pul003.ts +43 -0
- package/dist/rules/pul004.ts +32 -0
- package/dist/rules/pul005.ts +31 -0
- package/dist/rules/pul006.ts +31 -0
- package/dist/rules/pul007.ts +35 -0
- package/dist/rules/pul008.ts +35 -0
- package/dist/rules/pul009.ts +32 -0
- package/dist/rules/pul010.ts +42 -0
- package/dist/rules/pul011.ts +38 -0
- package/dist/rules/pul012.ts +35 -0
- package/dist/rules/pul013.ts +35 -0
- package/dist/rules/pul014.ts +32 -0
- package/dist/rules/pul015.ts +38 -0
- package/dist/run.d.ts +444 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +843 -0
- package/dist/serializer.d.ts +8 -0
- package/dist/serializer.d.ts.map +1 -0
- package/dist/serializer.js +12 -0
- package/dist/skills/chant-pulumi-plunge.md +51 -0
- package/dist/skills/chant-pulumi-stack-export.md +54 -0
- package/dist/skills/chant-pulumi.md +83 -0
- package/dist/stack-export-snapshot.d.ts +125 -0
- package/dist/stack-export-snapshot.d.ts.map +1 -0
- package/dist/stack-export-snapshot.js +233 -0
- package/dist/stack-ops.d.ts +175 -0
- package/dist/stack-ops.d.ts.map +1 -0
- package/dist/stack-ops.js +400 -0
- package/dist/stack-outputs.d.ts +18 -0
- package/dist/stack-outputs.d.ts.map +1 -0
- package/dist/stack-outputs.js +55 -0
- package/dist/stack-references.d.ts +46 -0
- package/dist/stack-references.d.ts.map +1 -0
- package/dist/stack-references.js +88 -0
- package/dist/trace-facts.d.ts +34 -0
- package/dist/trace-facts.d.ts.map +1 -0
- package/dist/trace-facts.js +81 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/values.d.ts +58 -0
- package/dist/values.d.ts.map +1 -0
- package/dist/values.js +155 -0
- package/dist/workspace-member.d.ts +98 -0
- package/dist/workspace-member.d.ts.map +1 -0
- package/dist/workspace-member.js +202 -0
- package/package.json +74 -4
- package/schemas/pulumi.schema.json +34 -0
- package/src/adopt.ts +202 -0
- package/src/capability-plugin.ts +34 -0
- package/src/change-set.test.ts +235 -0
- package/src/change-set.ts +429 -0
- package/src/ci-setup.test.ts +123 -0
- package/src/ci-setup.ts +176 -0
- package/src/codegen/docs-cli.ts +4 -0
- package/src/codegen/docs.ts +58 -0
- package/src/codegen/package.ts +63 -0
- package/src/composites/pulumi-adopt-op.test.ts +223 -0
- package/src/composites/pulumi-adopt-op.ts +191 -0
- package/src/composites/pulumi-watch-op.test.ts +42 -0
- package/src/composites/pulumi-watch-op.ts +85 -0
- package/src/config.ts +43 -0
- package/src/describe-resources.test.ts +112 -0
- package/src/describe-resources.ts +118 -0
- package/src/drift-read.test.ts +106 -0
- package/src/drift-read.ts +73 -0
- package/src/drift-record.test.ts +197 -0
- package/src/drift-record.ts +326 -0
- package/src/engine-events.test.ts +134 -0
- package/src/engine-events.ts +390 -0
- package/src/engine-graph.test.ts +141 -0
- package/src/engine-graph.ts +149 -0
- package/src/exit-codes.test.ts +21 -0
- package/src/exit-codes.ts +71 -0
- package/src/index.ts +134 -0
- package/src/init-templates.ts +85 -0
- package/src/lint/audit-catalog.test.ts +33 -0
- package/src/lint/audit-catalog.ts +174 -0
- package/src/lint/post-synth/index.ts +35 -0
- package/src/lint/post-synth/member-read-helpers.ts +122 -0
- package/src/lint/post-synth/post-synth.test.ts +199 -0
- package/src/lint/post-synth/pul001.ts +38 -0
- package/src/lint/post-synth/pul002.ts +38 -0
- package/src/lint/post-synth/pul003.ts +43 -0
- package/src/lint/post-synth/pul004.ts +32 -0
- package/src/lint/post-synth/pul005.ts +31 -0
- package/src/lint/post-synth/pul006.ts +31 -0
- package/src/lint/post-synth/pul007.ts +35 -0
- package/src/lint/post-synth/pul008.ts +35 -0
- package/src/lint/post-synth/pul009.ts +32 -0
- package/src/lint/post-synth/pul010.ts +42 -0
- package/src/lint/post-synth/pul011.ts +38 -0
- package/src/lint/post-synth/pul012.ts +35 -0
- package/src/lint/post-synth/pul013.ts +35 -0
- package/src/lint/post-synth/pul014.ts +32 -0
- package/src/lint/post-synth/pul015.ts +38 -0
- package/src/lint/rules/index.ts +7 -0
- package/src/lint/rules/member-dir-absolute.test.ts +37 -0
- package/src/lint/rules/member-dir-absolute.ts +83 -0
- package/src/lock-rows.test.ts +60 -0
- package/src/lock-rows.ts +56 -0
- package/src/lsp/completions.test.ts +69 -0
- package/src/lsp/completions.ts +119 -0
- package/src/lsp/documents.ts +48 -0
- package/src/lsp/hover.test.ts +56 -0
- package/src/lsp/hover.ts +83 -0
- package/src/lsp/keys.ts +169 -0
- package/src/lsp/object-path.ts +71 -0
- package/src/lsp/yaml-cursor.ts +85 -0
- package/src/member-engine.test.ts +112 -0
- package/src/member-engine.ts +97 -0
- package/src/member-outputs.test.ts +317 -0
- package/src/member-outputs.ts +139 -0
- package/src/op/activities/index.ts +36 -0
- package/src/op/activities/pulumi-adopt.ts +334 -0
- package/src/op/activities/pulumi.ts +136 -0
- package/src/op/activity-contracts.ts +129 -0
- package/src/op/builders.ts +67 -0
- package/src/package-cli.ts +14 -0
- package/src/plan-shape.test.ts +91 -0
- package/src/plan-shape.ts +105 -0
- package/src/plugin.test.ts +96 -0
- package/src/plugin.ts +246 -0
- package/src/plunge-timings.test.ts +241 -0
- package/src/plunge-timings.ts +115 -0
- package/src/plunge-up-failed.test.ts +54 -0
- package/src/pr-note.test.ts +87 -0
- package/src/pulumi-up.test.ts +470 -0
- package/src/pulumi-up.ts +1032 -0
- package/src/pulumi-urn-node.test.ts +94 -0
- package/src/release-copy.test.ts +74 -0
- package/src/release-copy.ts +142 -0
- package/src/review-stack.test.ts +254 -0
- package/src/review-stack.ts +266 -0
- package/src/run.test.ts +500 -0
- package/src/run.ts +1013 -0
- package/src/serializer.test.ts +9 -0
- package/src/serializer.ts +15 -0
- package/src/skills/chant-pulumi-plunge.md +51 -0
- package/src/skills/chant-pulumi-stack-export.md +54 -0
- package/src/skills/chant-pulumi.md +83 -0
- package/src/stack-export-snapshot.test.ts +190 -0
- package/src/stack-export-snapshot.ts +312 -0
- package/src/stack-ops.test.ts +286 -0
- package/src/stack-ops.ts +552 -0
- package/src/stack-outputs.ts +66 -0
- package/src/stack-references.test.ts +96 -0
- package/src/stack-references.ts +110 -0
- package/src/testdata/plunge-drift/README.md +10 -0
- package/src/testdata/plunge-drift/assets-drifted.ndjson +3 -0
- package/src/testdata/plunge-drift/component-unsupported.ndjson +3 -0
- package/src/testdata/plunge-drift/role-in-sync.ndjson +3 -0
- package/src/testdata/plunge-drift/settled-empty.ndjson +2 -0
- package/src/testdata/plunge-graph/Pulumi.yaml +4 -0
- package/src/testdata/plunge-graph/README.md +12 -0
- package/src/testdata/plunge-graph/engine-graph.json +158 -0
- package/src/testdata/plunge-graph/stack-export.json +49 -0
- package/src/testdata/plunge-member/Pulumi.yaml +4 -0
- package/src/testdata/plunge-member/README.md +3 -0
- package/src/testdata/plunge-member/stack-export.json +480 -0
- package/src/testdata/plunge-outputs/Pulumi.yaml +9 -0
- package/src/testdata/plunge-outputs/README.md +7 -0
- package/src/testdata/plunge-outputs/stack-export.json +2003 -0
- package/src/testdata/plunge-outputs/stack-output.json +19 -0
- package/src/testdata/pulumi-member/Pulumi.yaml +2 -0
- package/src/testdata/pulumi-member/README.md +50 -0
- package/src/testdata/pulumi-member/recording/Pulumi.dev.yaml +19 -0
- package/src/testdata/pulumi-member/recording/Pulumi.yaml +7 -0
- package/src/testdata/pulumi-member/recording/index.js +47 -0
- package/src/testdata/pulumi-member/recording/package-lock.json +2707 -0
- package/src/testdata/pulumi-member/recording/package.json +9 -0
- package/src/testdata/pulumi-member/stack-export.json +746 -0
- package/src/testdata/pulumi-outputs/Pulumi.yaml +7 -0
- package/src/testdata/pulumi-outputs/README.md +9 -0
- package/src/testdata/pulumi-outputs/preview-replaced.json +2894 -0
- package/src/testdata/pulumi-outputs/preview-settled.json +2894 -0
- package/src/testdata/pulumi-outputs/stack-export.json +1919 -0
- package/src/testdata/pulumi-outputs/stack-output.json +19 -0
- package/src/testdata/pulumi-preview/Pulumi.yaml +7 -0
- package/src/testdata/pulumi-preview/README.md +9 -0
- package/src/testdata/pulumi-preview/preview-create.json +992 -0
- package/src/testdata/pulumi-preview/preview.json +2894 -0
- package/src/testdata/pulumi-preview/stack-export.json +1919 -0
- package/src/testdata/pulumi-refresh/Pulumi.yaml +7 -0
- package/src/testdata/pulumi-refresh/README.md +14 -0
- package/src/testdata/pulumi-refresh/all.json +3742 -0
- package/src/testdata/pulumi-refresh/bucket-edited.json +468 -0
- package/src/testdata/pulumi-refresh/policy-deleted.json +95 -0
- package/src/testdata/pulumi-refresh/queue-edited.json +250 -0
- package/src/testdata/pulumi-refresh/role-same.json +242 -0
- package/src/testdata/pulumi-refresh/secret-edited.json +247 -0
- package/src/testdata/pulumi-refresh/stack-export.json +1907 -0
- package/src/testdata/pulumi-stream/README.md +16 -0
- package/src/testdata/pulumi-stream/preview-stream.ndjson +42 -0
- package/src/testdata/pulumi-stream/up-failed-plunge.ndjson +5 -0
- package/src/testdata/pulumi-unexported/Pulumi.yaml +2 -0
- package/src/testdata/pulumi-urn-node/Pulumi.yaml +7 -0
- package/src/testdata/pulumi-urn-node/README.md +9 -0
- package/src/testdata/pulumi-urn-node/preview.json +2894 -0
- package/src/testdata/pulumi-urn-node/stack-export.json +1919 -0
- package/src/trace-facts.test.ts +38 -0
- package/src/trace-facts.ts +83 -0
- package/src/values.ts +147 -0
- package/src/workspace-kinds.test.ts +47 -0
- package/src/workspace-member.test.ts +127 -0
- package/src/workspace-member.ts +304 -0
- package/workspace-kinds.json +29 -0
package/README.md
CHANGED
|
@@ -1,3 +1,100 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @intentius/chant-lexicon-pulumi
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Pulumi lexicon for [chant](https://intentius.io/chant/). It adds your Pulumi program to a chant workspace as it is, on stock Pulumi or on [plunge](https://github.com/INTENTIUS/plunge), a Pulumi fork that keeps chant's ownership markers on each resource. It declares no resource types. It supplies the `pulumi` workspace member kind and reads a Pulumi program four ways:
|
|
4
|
+
|
|
5
|
+
| Read | Source | Module |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| the member's graph | the `pulumi stack export` the last `pulumi-up` apply wrote to `refs/chant/snapshots`, else the one checked in as `stack-export.json` | `src/workspace-member.ts`, `src/stack-export-snapshot.ts` |
|
|
8
|
+
| its change-set part | `pulumi preview --json` | `src/change-set.ts` |
|
|
9
|
+
| its drift records | `pulumi refresh --preview-only --json --target <urn>`, one resource at a time | `src/drift-record.ts`, `src/drift-read.ts` |
|
|
10
|
+
| its stack outputs, for another member's parameters | `pulumi stack output --json --show-secrets=false` (applied) and `pulumi preview --json` (planned) | `src/stack-outputs.ts`, `src/member-outputs.ts` |
|
|
11
|
+
| engine facts, for a member on plunge | `plunge graph --json --stack <stack>` (`describeResources`), or the checked-in `engine-graph.json` (the graph read) | `src/describe-resources.ts`, `src/engine-graph.ts` |
|
|
12
|
+
|
|
13
|
+
The graph read never runs `pulumi`. The change set and drift run `preview` and `refresh --preview-only`, and the outputs read adds `stack output --json --show-secrets=false`. A member on plunge runs `plunge preview`, `plunge stack output --json --show-secrets=false` and `plunge drift --resource <urn> --stream`. For its engine facts it runs one of exactly four argv: `plunge graph --json`, `plunge graph --json --stack <stack>`, `plunge graph --json --versions` and `plunge graph --json --stack <stack> --versions` ([#4529](https://github.com/INTENTIUS/chant/issues/4529)). An outputs or secrets flag on `plunge graph` is refused. That is the whole list, as ruled on [#4476](https://github.com/INTENTIUS/chant/issues/4476) (2026-10-25), which widened the [#4450](https://github.com/INTENTIUS/chant/issues/4450) ruling's `preview` and `refresh --preview-only` to keep the outputs read and the plunge commands. Nothing else runs on a read (`runAllowedPulumi` and `runAllowedPlunge` refuse any other argv, and a preview with `--show-secrets` or `--import-file`), so no read changes a stack. With `CHANT_PULUMI_APPLIED_OUTPUTS=export`, the outputs read runs nothing either.
|
|
14
|
+
|
|
15
|
+
## Applies: the `pulumi-up` capability
|
|
16
|
+
|
|
17
|
+
A stack can be a component step, `{ kind: "pulumi-up", dir, stack }`, that plans in a pull request and applies on merge like a `terraform-apply` root ([#4541](https://github.com/INTENTIUS/chant/issues/4541), `src/pulumi-up.ts`). The ruling on INTENTIUS/plywood#1 widened #4450 and #4476 for it alone, from an apply job holding the apply identity. Its `up` goes through `runApplyPulumi` or `runApplyPlunge`, each of which takes one fixed argv (`PULUMI_APPLY_COMMANDS` in `src/run.ts`):
|
|
18
|
+
|
|
19
|
+
| Engine | Argv |
|
|
20
|
+
|---|---|
|
|
21
|
+
| plunge | `plunge preview --json --show-sames --stack <s> --save-plan <file>`, then `plunge up --plan <file> --yes --json --stack <s>` |
|
|
22
|
+
| stock Pulumi | `pulumi preview --json --show-sames --stack <s>`, then `pulumi up --yes --json --stack <s>` |
|
|
23
|
+
|
|
24
|
+
Both forms may add `--config-file <file>`, then `--target <urn>` for each target, then `--policy-pack <dir>` with an optional `--policy-pack-config <file>`, in that order. Any other flag on `up` is refused.
|
|
25
|
+
|
|
26
|
+
A step pinned to its own engine release sets `engineVersion` (and `engineRoot` when its image keeps engines elsewhere than `/opt/chant`). Every run of that step, preview, `up`, stack output and export, then uses `<engineRoot>/<engine>-<engineVersion>/<engine>`, the path `pulumiInstallLine` and `plungeInstallLine` install to ([#4592](https://github.com/INTENTIUS/chant/issues/4592), `src/ci-setup.ts`). The argv is checked against the same forms, and a step without `engineVersion` runs the binary on PATH.
|
|
27
|
+
|
|
28
|
+
The CI install lines take a version, download the release's Linux archive and its checksums file, and fail unless the archive matches its line there. For the default releases (Pulumi 3.272.0, plunge 0.1.0) the line must also hold the sha256 the lexicon records per architecture. Each release goes under its own versioned directory and is linked into `/usr/local/bin`, and a line skips the download when that directory already holds the binary, or for Pulumi when the `pulumi` on PATH is that version.
|
|
29
|
+
|
|
30
|
+
The preview streams its engine events (`PULUMI_ENABLE_STREAMING_JSON_PREVIEW=true`, `src/engine-events.ts`), so one run gives the change set and CrossGuard's findings. A mandatory violation denies the plan. On plunge the saved plan's stamp refuses a plan whose records moved (plunge exit 40, chant's moved code 4). On stock Pulumi the apply previews again, then compares the steps in `up`'s event stream with the approved shape (`src/plan-shape.ts`), and a step outside it fails the apply. A member on the resource lock grain, the default on plunge, leaves `same` and `read` steps out of its digest. The step's `config` is written into a scratch copy of `Pulumi.<stack>.yaml` and passed with `--config-file`, never `--config`, which writes the working tree's file. A release cut records the stack's directory (`releaseInputs`), unless its backend is a file path relative to that directory. Under a release, a promote or rollback previews and applies the recorded copy, after `pulumi install` (or `plunge install`) in the copy when its runtime needs one (`src/release-copy.ts`); a Node copy with no recorded lockfile is refused by name.
|
|
31
|
+
|
|
32
|
+
After `up`, the capability runs `stack export --stack <s>`, replaces every secret with `[secret]`, drops the secrets provider's state, and writes the export through chant's index store as `<env>/<stack>__pulumi-export` ([#4546](https://github.com/INTENTIUS/chant/issues/4546), `refs/chant/snapshots` by default). The graph, the preview's prior state and the drift read take that export first, so a stack chant applies needs no checked-in `stack-export.json`. A failed export leaves the apply standing and says why in the step's `exportSnapshot` output.
|
|
33
|
+
|
|
34
|
+
A program that reads another stack through `StackReference` orders its stack after that one ([#4547](https://github.com/INTENTIUS/chant/issues/4547), `src/stack-references.ts`). The capability's `declaredReads` reads each step's export for `pulumi:pulumi:StackReference` resources, matches each `name` to the other `pulumi-up` step with that `Pulumi.yaml` name and stack, and reports a read of each output the export recorded that is not secret. Core writes those reads into the step's `stackReferences` input and adds a `dependsOn`, so the waves put the referenced stack first, a failed upstream holds the reader, and a reader waits while the upstream's plan cannot say a value it reads. A reference to a stack no step applies adds no edge, and the plan's artifact names it under `stackReferences.outside`.
|
|
35
|
+
|
|
36
|
+
## Adoption: `PulumiAdoptOp`
|
|
37
|
+
|
|
38
|
+
`PulumiAdoptOp` (`src/composites/pulumi-adopt-op.ts`, [#4562](https://github.com/INTENTIUS/chant/issues/4562)) adopts stock stacks onto plunge's per-resource records, the pulumi twin of `TerraformAdoptOp`. Its phases are Check (the shared bucket check on the backend's bucket), Export (`pulumi stack export --stack <s>` into a scratch file), then per stack Preview (`plunge stack adopt --json`), a gate bound to the preview's digest, and Adopt (`plunge stack adopt --json --yes`, through `runAdoptPlunge`). `from: { backend }` or `from: { file }` adopts an export with `--file`, the route from Pulumi Cloud. Gates and the run are recorded on the workspace ledger.
|
|
39
|
+
|
|
40
|
+
## Gated stack operations
|
|
41
|
+
|
|
42
|
+
`src/stack-ops.ts` ([#4578](https://github.com/INTENTIUS/chant/issues/4578)) runs three stack operations, each only after its gated request (#4551) is approved on the workspace ledger by someone other than the requester, under the op `pulumi-stack-ops`. The first call records the request and returns the `chant approve` command; the same call after the approval spends it, runs once, and records how it ended.
|
|
43
|
+
|
|
44
|
+
| Function | Request | What runs after approval |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| `gatedStackExport` | `stack-export` of `<stack>` | `pulumi stack export --stack <s>` (or plunge's), written mode 600 to a file outside every git working tree; refused in CI |
|
|
47
|
+
| `gatedStackCancel` | `stack-cancel` of `<stack>` with its lock id | `pulumi cancel --yes --stack <s>`, once the lock is still the approved one (read from a `file://` backend's lock directory); refused on plunge, which has no stack lock |
|
|
48
|
+
| `gatedStackMove` | `stack-move` of `move:<source>:<dest>` with the URNs | `pulumi state move --source <s> --dest <d> --yes <urn>...`, or `plunge stack move --stack <s> --dest <d> <urn>... --json --yes` after plunge's plan; both stacks preview first, and the move runs only when the previews change nothing but the moved resources |
|
|
49
|
+
|
|
50
|
+
`pulumiStackLockIds({ dir, stack })` ([#4615](https://github.com/INTENTIUS/chant/issues/4615)) reads the lock ids a stack holds now, the same read `gatedStackCancel` checks with, so a product can offer the id to approve. It answers `checked: false` on a backend other than `file://`, and no ids for a plunge stack.
|
|
51
|
+
|
|
52
|
+
The writes go through `runGatedPulumi` and `runGatedPlunge` in `src/run.ts`, whose fixed forms (`PULUMI_GATED_COMMANDS`, `PLUNGE_GATED_COMMANDS`) are the only ones allowed.
|
|
53
|
+
|
|
54
|
+
## Drift: `chant workspace drift`
|
|
55
|
+
|
|
56
|
+
`chant workspace drift --member <pulumi member> [--resource <urn>] [--stream]` runs `chant lifecycle drift` in the member's reader project, which calls this lexicon's `readDrift`. A stock member is read with one `pulumi refresh --preview-only --json --target <urn>` per resource in its checked-in `stack-export.json`. A member on plunge is read with `plunge drift --resource <urn> --stream` per resource. `--resource` reads one URN. The only read is `refresh`.
|
|
57
|
+
|
|
58
|
+
A member runs on plunge when its config says `engine: "plunge"`, or when `Pulumi.yaml` names a backend URL starting with `plunge` (`plunge+file://...`, `plunge://...`). Only `Pulumi.yaml` is read, never `PULUMI_BACKEND_URL` or login state.
|
|
59
|
+
|
|
60
|
+
## Engine facts for a member on plunge
|
|
61
|
+
|
|
62
|
+
plunge keeps a record per resource, and `plunge graph --json` prints the stack's graph from those records in the engine graph document chant#4520 designed. It makes no provider call and prints no output value. chant reads it two ways ([#4529](https://github.com/INTENTIUS/chant/issues/4529)):
|
|
63
|
+
|
|
64
|
+
- `describeResources` runs `plunge graph --json --stack <stack>` once per member, with the stack the other reads use. Each node becomes a resource keyed like the member graph's node, with plunge's facts on `ResourceMetadata.facts`. Every resource has `ownership: "unknown"` and no marker, so no change set or teardown decides from it.
|
|
65
|
+
- The graph read takes a checked-in `engine-graph.json` beside `stack-export.json`. Its facts go on the nodes (`nodes[].facts`) and its `property` edges join the graph with `grain: "property"`. The export's `dependencies` and `parent` edges carry `grain: "instance"`.
|
|
66
|
+
|
|
67
|
+
plunge's markers say `source: "record"`: what its record says it wrote, not a read of the object. A stock member gets neither read, and chant runs nothing new for it. Record versions (`--versions`) cost one listing per record, so `describeResources` leaves them off.
|
|
68
|
+
|
|
69
|
+
## Outputs into another member's parameters
|
|
70
|
+
|
|
71
|
+
A chant member reads a Pulumi member's outputs with core's `member-outputs` verb (chant#4455):
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
import { memberOutputsComponent } from "@intentius/chant/components/verbs/member-outputs";
|
|
75
|
+
|
|
76
|
+
export const aws = memberOutputsComponent("aws");
|
|
77
|
+
export const records: Component = {
|
|
78
|
+
name: "records",
|
|
79
|
+
dependsOn: ["aws"],
|
|
80
|
+
deploy: [phase("Apply", [cfnDeploy({ template: "dist/dns.json", inputs: { awsEndpoint: stackOutput("aws", "awsEndpoint") } })])],
|
|
81
|
+
};
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The consumer lists `pulumi` among its lexicons, which brings `pulumiCapabilityPlugin` and its source, `pulumiOutputSource`, for members of kind `pulumi`.
|
|
85
|
+
|
|
86
|
+
- Applied values come from `pulumi stack output --json --show-secrets=false` in the member's directory. With `CHANT_PULUMI_APPLIED_OUTPUTS=export`, chant runs nothing and reads them from the checked-in `stack-export.json`.
|
|
87
|
+
- Planned values come from `pulumi preview --json --show-sames`. A real preview carries no outputs on the stack's `pulumi:pulumi:Stack` step (recorded, #4475), so a preview with nothing to apply gives the checked-in export's outputs and one with changes leaves every output unknown. An output a stack step does carry is read, and one holding Pulumi's unknown sentinel is unknown. The consumer is planned without an unknown output, gets a hole on `aws#outputs` naming it, and is held back on merge until the member applied, then planned again.
|
|
88
|
+
- The plan digest is the member part's `pulumi-preview` digest, so a preview that moves after review moves the consumer's digest.
|
|
89
|
+
- While the preview still has changes, `run` refuses and the consumer is blocked behind the member.
|
|
90
|
+
- Secret outputs are left out of both reads. chant never carries or prints their values.
|
|
91
|
+
- A member on plunge runs the same commands under `plunge`.
|
|
92
|
+
- Both commands run against the member's selected stack.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npm install --save-dev @intentius/chant @intentius/chant-lexicon-pulumi
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## License
|
|
99
|
+
|
|
100
|
+
See the main project LICENSE file.
|
package/dist/adopt.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { BucketTarget } from "@intentius/chant/bucket-check";
|
|
2
|
+
/** `AdoptView.status`. */
|
|
3
|
+
export type PlungeAdoptStatus = "would-adopt" | "adopted" | "already-adopted" | "refused";
|
|
4
|
+
export interface PlungeAdoptRefusal {
|
|
5
|
+
code: string;
|
|
6
|
+
urn?: string;
|
|
7
|
+
reason: string;
|
|
8
|
+
}
|
|
9
|
+
export interface PlungeAdoptResource {
|
|
10
|
+
urn: string;
|
|
11
|
+
type: string;
|
|
12
|
+
id: string;
|
|
13
|
+
/** `marker`, `record`, `pending` or `already-adopted`. */
|
|
14
|
+
fate: string;
|
|
15
|
+
adoptedAs?: string;
|
|
16
|
+
marked?: boolean;
|
|
17
|
+
reason?: string;
|
|
18
|
+
}
|
|
19
|
+
/** The parts of plunge's `AdoptView` chant reads. */
|
|
20
|
+
export interface PlungeAdoptView {
|
|
21
|
+
stack: string;
|
|
22
|
+
status: PlungeAdoptStatus;
|
|
23
|
+
checkpoint: {
|
|
24
|
+
source?: string;
|
|
25
|
+
digest?: string;
|
|
26
|
+
};
|
|
27
|
+
resources: PlungeAdoptResource[];
|
|
28
|
+
refusals: PlungeAdoptRefusal[];
|
|
29
|
+
}
|
|
30
|
+
/** The adopt document, or undefined when `text` is not one. */
|
|
31
|
+
export declare function parsePlungeAdoptView(text: string | undefined): PlungeAdoptView | undefined;
|
|
32
|
+
/** The gate's digest over an adopt document (see the module comment). */
|
|
33
|
+
export declare function pulumiAdoptDigest(view: PlungeAdoptView): string;
|
|
34
|
+
/** Counts by fate. */
|
|
35
|
+
export declare function adoptFates(view: PlungeAdoptView): Record<string, number>;
|
|
36
|
+
/** The stack's backend URL and where it came from, first that answers: the step's, `plywood.yml`'s, `PULUMI_BACKEND_URL`, `Pulumi.yaml`'s. */
|
|
37
|
+
export declare function pulumiStackBackend(dir: string, opts?: {
|
|
38
|
+
configured?: string;
|
|
39
|
+
env?: Record<string, string | undefined>;
|
|
40
|
+
}): {
|
|
41
|
+
url: string;
|
|
42
|
+
source: string;
|
|
43
|
+
} | undefined;
|
|
44
|
+
/** The stock backend at the same root: the URL without plunge's `plunge+` prefix. */
|
|
45
|
+
export declare function stockBackendUrl(url: string): string;
|
|
46
|
+
/** What the bucket check reads for a backend, or why it does not run. */
|
|
47
|
+
export type AdoptBucketTarget = {
|
|
48
|
+
target: BucketTarget;
|
|
49
|
+
namespaces: string[];
|
|
50
|
+
waived: string[];
|
|
51
|
+
} | {
|
|
52
|
+
skip: string;
|
|
53
|
+
} | {
|
|
54
|
+
refuse: string;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* The bucket behind a DIY backend URL, for the shared check (#4558). An
|
|
58
|
+
* `s3://` URL gives the bucket, its `region` (else `AWS_REGION`), its
|
|
59
|
+
* `endpoint` with static keys from the environment, and the path as the
|
|
60
|
+
* namespace a lifecycle rule must cover; `gs://` gives the bucket. A
|
|
61
|
+
* `file://` backend has no bucket, and the check is skipped with that
|
|
62
|
+
* reason. An `azblob://` URL does not name the subscription and resource
|
|
63
|
+
* group the check reads, so it is refused unless the step names the bucket
|
|
64
|
+
* itself. `allow_insecure` on the URL and `PLUNGE_ALLOW_INSECURE` are read as
|
|
65
|
+
* plunge reads them.
|
|
66
|
+
*/
|
|
67
|
+
export declare function adoptBucketTarget(url: string, env?: Record<string, string | undefined>): AdoptBucketTarget;
|
|
68
|
+
//# sourceMappingURL=adopt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adopt.d.ts","sourceRoot":"","sources":["../src/adopt.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAMlE,0BAA0B;AAC1B,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAE1F,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,iBAAiB,CAAC;IAC1B,UAAU,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAMD,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CA+B1F;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAK/D;AAED,sBAAsB;AACtB,wBAAgB,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxE;AAED,8IAA8I;AAC9I,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CAAO,GAC3E;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAgB7C;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,yEAAyE;AACzE,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,iBAAiB,CAkDvH"}
|
package/dist/adopt.js
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adopting a stock Pulumi stack onto plunge's per-resource records (#4562):
|
|
3
|
+
* the pieces `PulumiAdoptOp` (`./composites/pulumi-adopt-op.ts`) and its
|
|
4
|
+
* activities (`./op/activities/pulumi-adopt.ts`) share.
|
|
5
|
+
*
|
|
6
|
+
* - {@link parsePlungeAdoptView}: the document `plunge stack adopt --json`
|
|
7
|
+
* prints (plunge `pkg/backend/plunge` `AdoptView`, its site's
|
|
8
|
+
* reference/adopt-json page): `status` is `would-adopt`, `adopted`,
|
|
9
|
+
* `already-adopted` or `refused`, with each resource's fate and every
|
|
10
|
+
* refusal.
|
|
11
|
+
* - {@link pulumiAdoptDigest}: what the Op's gate binds. It covers the
|
|
12
|
+
* stack, the checkpoint's digest and source, and each resource's URN,
|
|
13
|
+
* type, ID and fate, and leaves `status` out, so the preview an approver
|
|
14
|
+
* saw and the `--yes` run that follows digest the same when nothing moved.
|
|
15
|
+
* - {@link pulumiStackBackend} and {@link adoptBucketTarget}: the stack's
|
|
16
|
+
* backend URL, and the bucket the shared check (#4558) reads from it.
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
19
|
+
import { join } from "node:path";
|
|
20
|
+
import { computePlanDigest } from "@intentius/chant/lifecycle/plan-digest";
|
|
21
|
+
import { parseYAML } from "@intentius/chant/yaml";
|
|
22
|
+
import { readPlywoodEngine } from "./member-engine.js";
|
|
23
|
+
import { isObject } from "./values.js";
|
|
24
|
+
const STATUSES = new Set(["would-adopt", "adopted", "already-adopted", "refused"]);
|
|
25
|
+
const str = (v) => (typeof v === "string" ? v : undefined);
|
|
26
|
+
/** The adopt document, or undefined when `text` is not one. */
|
|
27
|
+
export function parsePlungeAdoptView(text) {
|
|
28
|
+
if (!text)
|
|
29
|
+
return undefined;
|
|
30
|
+
let doc;
|
|
31
|
+
try {
|
|
32
|
+
doc = JSON.parse(text);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
if (!isObject(doc) || typeof doc.status !== "string" || !STATUSES.has(doc.status))
|
|
38
|
+
return undefined;
|
|
39
|
+
const checkpoint = isObject(doc.checkpoint) ? doc.checkpoint : {};
|
|
40
|
+
const resources = (Array.isArray(doc.resources) ? doc.resources : []).filter(isObject).map((r) => ({
|
|
41
|
+
urn: str(r.urn) ?? "",
|
|
42
|
+
type: str(r.type) ?? "",
|
|
43
|
+
id: str(r.id) ?? "",
|
|
44
|
+
fate: str(r.fate) ?? "",
|
|
45
|
+
...(str(r.adoptedAs) ? { adoptedAs: str(r.adoptedAs) } : {}),
|
|
46
|
+
...(typeof r.marked === "boolean" ? { marked: r.marked } : {}),
|
|
47
|
+
...(str(r.reason) ? { reason: str(r.reason) } : {}),
|
|
48
|
+
}));
|
|
49
|
+
const refusals = (Array.isArray(doc.refusals) ? doc.refusals : []).filter(isObject).map((r) => ({ code: str(r.code) ?? "", ...(str(r.urn) ? { urn: str(r.urn) } : {}), reason: str(r.reason) ?? "" }));
|
|
50
|
+
return {
|
|
51
|
+
stack: str(doc.stack) ?? "",
|
|
52
|
+
status: doc.status,
|
|
53
|
+
checkpoint: { ...(str(checkpoint.source) ? { source: str(checkpoint.source) } : {}), ...(str(checkpoint.digest) ? { digest: str(checkpoint.digest) } : {}) },
|
|
54
|
+
resources,
|
|
55
|
+
refusals,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** The gate's digest over an adopt document (see the module comment). */
|
|
59
|
+
export function pulumiAdoptDigest(view) {
|
|
60
|
+
const resources = view.resources
|
|
61
|
+
.map((r) => ({ urn: r.urn, type: r.type, id: r.id, fate: r.fate === "already-adopted" ? (r.adoptedAs ?? r.fate) : r.fate }))
|
|
62
|
+
.sort((a, b) => (a.urn < b.urn ? -1 : a.urn > b.urn ? 1 : 0));
|
|
63
|
+
return computePlanDigest("plunge-adopt", { stack: view.stack, checkpoint: view.checkpoint.digest ?? null, resources });
|
|
64
|
+
}
|
|
65
|
+
/** Counts by fate. */
|
|
66
|
+
export function adoptFates(view) {
|
|
67
|
+
const out = {};
|
|
68
|
+
for (const r of view.resources)
|
|
69
|
+
out[r.fate] = (out[r.fate] ?? 0) + 1;
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
/** The stack's backend URL and where it came from, first that answers: the step's, `plywood.yml`'s, `PULUMI_BACKEND_URL`, `Pulumi.yaml`'s. */
|
|
73
|
+
export function pulumiStackBackend(dir, opts = {}) {
|
|
74
|
+
if (opts.configured)
|
|
75
|
+
return { url: opts.configured, source: "the step's backend" };
|
|
76
|
+
const plywood = readPlywoodEngine(dir);
|
|
77
|
+
if (plywood?.backend)
|
|
78
|
+
return { url: plywood.backend, source: plywood.file };
|
|
79
|
+
const env = (opts.env ?? process.env).PULUMI_BACKEND_URL;
|
|
80
|
+
if (env)
|
|
81
|
+
return { url: env, source: "PULUMI_BACKEND_URL" };
|
|
82
|
+
const file = join(dir, "Pulumi.yaml");
|
|
83
|
+
if (existsSync(file)) {
|
|
84
|
+
try {
|
|
85
|
+
const url = parseYAML(readFileSync(file, "utf-8")).backend?.url;
|
|
86
|
+
if (typeof url === "string")
|
|
87
|
+
return { url, source: "Pulumi.yaml" };
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// No backend named.
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
/** The stock backend at the same root: the URL without plunge's `plunge+` prefix. */
|
|
96
|
+
export function stockBackendUrl(url) {
|
|
97
|
+
return url.replace(/^plunge\+/, "");
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The bucket behind a DIY backend URL, for the shared check (#4558). An
|
|
101
|
+
* `s3://` URL gives the bucket, its `region` (else `AWS_REGION`), its
|
|
102
|
+
* `endpoint` with static keys from the environment, and the path as the
|
|
103
|
+
* namespace a lifecycle rule must cover; `gs://` gives the bucket. A
|
|
104
|
+
* `file://` backend has no bucket, and the check is skipped with that
|
|
105
|
+
* reason. An `azblob://` URL does not name the subscription and resource
|
|
106
|
+
* group the check reads, so it is refused unless the step names the bucket
|
|
107
|
+
* itself. `allow_insecure` on the URL and `PLUNGE_ALLOW_INSECURE` are read as
|
|
108
|
+
* plunge reads them.
|
|
109
|
+
*/
|
|
110
|
+
export function adoptBucketTarget(url, env = process.env) {
|
|
111
|
+
const stock = stockBackendUrl(url);
|
|
112
|
+
let u;
|
|
113
|
+
try {
|
|
114
|
+
u = new URL(stock);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return { refuse: `the backend ${url} is not a URL the bucket check can read` };
|
|
118
|
+
}
|
|
119
|
+
const waived = [
|
|
120
|
+
...(u.searchParams.get("allow_insecure") ?? "").split(","),
|
|
121
|
+
...(env.PLUNGE_ALLOW_INSECURE ?? "").split(","),
|
|
122
|
+
]
|
|
123
|
+
.map((s) => s.trim())
|
|
124
|
+
.filter(Boolean);
|
|
125
|
+
const prefix = u.pathname.replace(/^\/+/, "");
|
|
126
|
+
const namespaces = prefix ? [prefix.endsWith("/") ? prefix : `${prefix}/`] : [];
|
|
127
|
+
switch (u.protocol) {
|
|
128
|
+
case "file:":
|
|
129
|
+
return { skip: `the backend ${url} is a local file path, which has no bucket to check` };
|
|
130
|
+
case "s3:": {
|
|
131
|
+
const region = u.searchParams.get("region") ?? env.AWS_REGION ?? env.AWS_DEFAULT_REGION;
|
|
132
|
+
if (!region)
|
|
133
|
+
return { refuse: `the backend ${url} names no region and AWS_REGION is not set, so the bucket check cannot read ${u.hostname}` };
|
|
134
|
+
const endpoint = u.searchParams.get("endpoint") ?? undefined;
|
|
135
|
+
if (endpoint && !(env.AWS_ACCESS_KEY_ID && env.AWS_SECRET_ACCESS_KEY)) {
|
|
136
|
+
return { refuse: `the backend ${url} names the endpoint ${endpoint}, and the bucket check reads an endpoint only with static keys (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)` };
|
|
137
|
+
}
|
|
138
|
+
const target = {
|
|
139
|
+
store: "s3",
|
|
140
|
+
bucket: u.hostname,
|
|
141
|
+
region,
|
|
142
|
+
...(endpoint
|
|
143
|
+
? {
|
|
144
|
+
endpoint: /^[a-z]+:\/\//.test(endpoint) ? endpoint : `https://${endpoint}`,
|
|
145
|
+
credentials: {
|
|
146
|
+
accessKeyId: env.AWS_ACCESS_KEY_ID,
|
|
147
|
+
secretAccessKey: env.AWS_SECRET_ACCESS_KEY,
|
|
148
|
+
...(env.AWS_SESSION_TOKEN ? { sessionToken: env.AWS_SESSION_TOKEN } : {}),
|
|
149
|
+
},
|
|
150
|
+
}
|
|
151
|
+
: {}),
|
|
152
|
+
};
|
|
153
|
+
return { target, namespaces, waived };
|
|
154
|
+
}
|
|
155
|
+
case "gs:":
|
|
156
|
+
return { target: { store: "gcs", bucket: u.hostname }, namespaces, waived };
|
|
157
|
+
case "azblob:":
|
|
158
|
+
return { refuse: `the backend ${url} does not name the storage account's subscription and resource group; set the step's bucket to the azblob target` };
|
|
159
|
+
default:
|
|
160
|
+
return { refuse: `the backend ${url} is not a bucket plunge stores records in (s3, gs, azblob or file)` };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type CapabilityPlugin } from "@intentius/chant/components/capability-plugin";
|
|
2
|
+
export declare const PULUMI_VERB_FAMILIES: {
|
|
3
|
+
readonly apply: readonly ["pulumi-up"];
|
|
4
|
+
};
|
|
5
|
+
export declare const pulumiCapabilityPlugin: CapabilityPlugin;
|
|
6
|
+
//# sourceMappingURL=capability-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-plugin.d.ts","sourceRoot":"","sources":["../src/capability-plugin.ts"],"names":[],"mappings":"AAUA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAKzG,eAAO,MAAM,oBAAoB;aAC/B,KAAK,YAAG,WAAW;CACX,CAAC;AAEX,eAAO,MAAM,sBAAsB,EAAE,gBAcpC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ownPackageVersion } from "@intentius/chant/components/capability-plugin";
|
|
2
|
+
import { pulumiStackOutputSource } from "./member-outputs.js";
|
|
3
|
+
import { pulumiUpCapability } from "./pulumi-up.js";
|
|
4
|
+
export const PULUMI_VERB_FAMILIES = {
|
|
5
|
+
apply: ["pulumi-up"],
|
|
6
|
+
};
|
|
7
|
+
export const pulumiCapabilityPlugin = {
|
|
8
|
+
name: "pulumi",
|
|
9
|
+
get version() {
|
|
10
|
+
return ownPackageVersion(import.meta.url);
|
|
11
|
+
},
|
|
12
|
+
capabilities() {
|
|
13
|
+
return [pulumiUpCapability];
|
|
14
|
+
},
|
|
15
|
+
families() {
|
|
16
|
+
return PULUMI_VERB_FAMILIES;
|
|
17
|
+
},
|
|
18
|
+
engineOutputSources() {
|
|
19
|
+
return [pulumiStackOutputSource];
|
|
20
|
+
},
|
|
21
|
+
};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The change-set adapter for a Pulumi member (#4453): `pulumi preview --json`
|
|
3
|
+
* into an `@intentius/chant/change-set` part, planner `pulumi`.
|
|
4
|
+
*
|
|
5
|
+
* ## Steps to entries
|
|
6
|
+
*
|
|
7
|
+
* The preview prints one step per resource the program registered, `same`
|
|
8
|
+
* included, and a replace as two or three steps on one URN
|
|
9
|
+
* (`create-replacement`, `replace`, `delete-replaced`). The adapter keeps one
|
|
10
|
+
* entry per URN, at the URN, so `node` comes from the one URN rule
|
|
11
|
+
* (`@intentius/chant/pulumi-urn`, #4456):
|
|
12
|
+
*
|
|
13
|
+
* | step op | action | disruption |
|
|
14
|
+
* |---|---|---|
|
|
15
|
+
* | `create` | create | |
|
|
16
|
+
* | `update` | update | in-place |
|
|
17
|
+
* | `delete` | delete | destroy |
|
|
18
|
+
* | `replace`, `create-replacement`, `delete-replaced` | replace | replace, or destroy when the delete comes first (`deleteBeforeReplace`) |
|
|
19
|
+
* | `same` | no-op | |
|
|
20
|
+
* | `read`, `read-replacement`, `refresh` | read | |
|
|
21
|
+
* | `import` | no-op, importing | |
|
|
22
|
+
* | `import-replacement` | replace, importing | replace |
|
|
23
|
+
* | `discard`, `remove-pending-replace` | forget | |
|
|
24
|
+
*
|
|
25
|
+
* An op the table does not hold is a hole on the member, never a guess.
|
|
26
|
+
*
|
|
27
|
+
* Attributes are top-level inputs, as the change set wants them. A create
|
|
28
|
+
* writes every input. An update or replace writes the keys `detailedDiff`
|
|
29
|
+
* and `diffReasons` name, and every input whose new value holds an unknown.
|
|
30
|
+
* `replaceReasons` and a `detailedDiff` kind ending in `-replace` mark
|
|
31
|
+
* `forcesReplacement`. An input that holds Pulumi's unknown sentinel is
|
|
32
|
+
* `unknown: true` with no `after`: a resource that reads an output of one
|
|
33
|
+
* being created shows its dependent input as unknown. A value that holds a
|
|
34
|
+
* secret is `sensitive: true` with neither side.
|
|
35
|
+
*
|
|
36
|
+
* ## What preview cannot list: `mayAppear`
|
|
37
|
+
*
|
|
38
|
+
* A program may register resources inside an `apply()`. At preview an
|
|
39
|
+
* `apply()` whose input is unknown does not run, so what it would register
|
|
40
|
+
* is never in the steps. Dropping it would make the set look smaller than
|
|
41
|
+
* the apply, so the adapter marks it `mayAppear` instead, on two signals:
|
|
42
|
+
*
|
|
43
|
+
* 1. A component (a step whose state is `custom: false`, not the root stack)
|
|
44
|
+
* whose subtree in the preview holds an unknown, in any input or output,
|
|
45
|
+
* or a create or replace, whose outputs are unknown until apply. Its code
|
|
46
|
+
* may be waiting on that value to register children. It gets one entry
|
|
47
|
+
* at `pulumiMayAppearAddress(<component urn>)`, action `create`, type
|
|
48
|
+
* `unknown`, no attributes, on the component's node.
|
|
49
|
+
* 2. With the last deployment's `pulumi stack export` (`prior`): a resource
|
|
50
|
+
* the export holds and the preview has no step for gets an `update`
|
|
51
|
+
* entry with disruption `unknown`, since a full preview lists every
|
|
52
|
+
* registered resource and only an `apply()` that did not run leaves one
|
|
53
|
+
* out. A `delete` step for a resource under a component signal 1 marks
|
|
54
|
+
* keeps its `delete` and gets `mayAppear`, since the `apply()` may
|
|
55
|
+
* register it again. A preview narrowed with `--target` (`targeted`)
|
|
56
|
+
* lists only its targets, and a failed one stops part way, so signal 2's
|
|
57
|
+
* first half is off for both.
|
|
58
|
+
*
|
|
59
|
+
* A resource registered inside an `apply()` directly under the stack, with
|
|
60
|
+
* no export that holds it, has no component to stand under and is not
|
|
61
|
+
* detected. When the export does hold it and its input is unknown, the
|
|
62
|
+
* preview prints a `delete` for it, which reads as a plain delete. Those are
|
|
63
|
+
* the two cases left out.
|
|
64
|
+
*
|
|
65
|
+
* ## The digest
|
|
66
|
+
*
|
|
67
|
+
* {@link pulumiPreviewDigest}: `computePlanDigest("pulumi-preview", …)` over
|
|
68
|
+
* each step's op, URN, provider, id, inputs before and after, `diffReasons`,
|
|
69
|
+
* `replaceReasons` and `detailedDiff`, sorted by URN and op. It leaves out
|
|
70
|
+
* `config`, `duration`, `diagnostics` and `changeSummary`, and the states'
|
|
71
|
+
* outputs, which at preview are the last deployment's or unknown. For a
|
|
72
|
+
* member on the resource lock grain the `pulumi-up` capability passes
|
|
73
|
+
* `changedOnly` (#4541, ruling B), which leaves `same` and `read` steps out.
|
|
74
|
+
*
|
|
75
|
+
* The fixtures under `testdata/pulumi-preview` are recorded from pulumi
|
|
76
|
+
* 3.272.0 against the plunge corpus's aws-ts program on floci (#4475). What
|
|
77
|
+
* the recording showed: `preview --json` lists no unchanged resource unless
|
|
78
|
+
* `--show-sames` is passed, which chant's argv does, since signal 2 reads a
|
|
79
|
+
* missing resource as one an `apply()` may register; a replace is one
|
|
80
|
+
* `replace` step at preview, not three; the stack's step carries no planned
|
|
81
|
+
* outputs; a secret is the blinded string `"[secret]"`; and a resource
|
|
82
|
+
* registered inside an `apply()` directly under the stack whose input is
|
|
83
|
+
* unknown (the corpus's `vpc-id` parameter, named after a VPC being
|
|
84
|
+
* replaced) is printed as a `delete`, which this adapter keeps as a plain
|
|
85
|
+
* delete since nothing tells it apart from a removed resource.
|
|
86
|
+
*
|
|
87
|
+
* ## The import graph
|
|
88
|
+
*
|
|
89
|
+
* Like the terraform lexicon's `change-set`, this imports chant's
|
|
90
|
+
* `change-set` types, `lifecycle/plan-digest`, `pulumi-urn` and `./values`,
|
|
91
|
+
* so it bundles without TypeScript, node's process modules or zod (#3421).
|
|
92
|
+
*/
|
|
93
|
+
import type { ChangeSetAction, ChangeSetDisruption, ChangeSetPart } from "@intentius/chant/change-set";
|
|
94
|
+
import { type Json } from "./values.js";
|
|
95
|
+
/** One resource state on a preview step, `apitype.ResourceV3`, as far as the adapter reads it. */
|
|
96
|
+
export interface PulumiStepState {
|
|
97
|
+
urn?: string;
|
|
98
|
+
custom?: boolean;
|
|
99
|
+
delete?: boolean;
|
|
100
|
+
id?: string;
|
|
101
|
+
type?: string;
|
|
102
|
+
parent?: string;
|
|
103
|
+
inputs?: Json;
|
|
104
|
+
outputs?: Json;
|
|
105
|
+
}
|
|
106
|
+
/** One step of `pulumi preview --json` or `pulumi refresh --preview-only --json`. */
|
|
107
|
+
export interface PulumiStep {
|
|
108
|
+
op?: string;
|
|
109
|
+
urn?: string;
|
|
110
|
+
provider?: string;
|
|
111
|
+
oldState?: PulumiStepState;
|
|
112
|
+
newState?: PulumiStepState;
|
|
113
|
+
diffReasons?: string[];
|
|
114
|
+
replaceReasons?: string[];
|
|
115
|
+
detailedDiff?: Record<string, {
|
|
116
|
+
kind?: string;
|
|
117
|
+
inputDiff?: boolean;
|
|
118
|
+
}> | null;
|
|
119
|
+
}
|
|
120
|
+
/** The steps of a preview or refresh document, or undefined when it has none. */
|
|
121
|
+
export declare function pulumiSteps(doc: unknown): PulumiStep[] | undefined;
|
|
122
|
+
/** One resource of a `pulumi stack export`, as far as the adapter reads it. */
|
|
123
|
+
export interface PulumiExportedResource {
|
|
124
|
+
urn: string;
|
|
125
|
+
type: string;
|
|
126
|
+
custom?: boolean;
|
|
127
|
+
id?: string;
|
|
128
|
+
parent?: string;
|
|
129
|
+
}
|
|
130
|
+
/** The resources of a `pulumi stack export` document (`deployment.resources`). Not one: an empty list. */
|
|
131
|
+
export declare function pulumiExportResources(doc: unknown): PulumiExportedResource[];
|
|
132
|
+
/** Step ops that change nothing: what {@link PulumiPreviewDigestOptions.changedOnly} leaves out of the digest. */
|
|
133
|
+
export declare const PULUMI_UNCHANGED_OPS: ReadonlySet<string>;
|
|
134
|
+
export interface PulumiPreviewDigestOptions {
|
|
135
|
+
/**
|
|
136
|
+
* Leave `same` and `read` steps out (#4541, ruling B): set for a member on
|
|
137
|
+
* the resource lock grain, so a pull request that lands on other resources
|
|
138
|
+
* of the stack does not move this one's digest. plunge's plan stamp still
|
|
139
|
+
* refuses a moved record among the steps that change.
|
|
140
|
+
*/
|
|
141
|
+
changedOnly?: boolean;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* The member's plan digest: `computePlanDigest("pulumi-preview", …)` over
|
|
145
|
+
* what each step proposes, sorted by URN and op, so two renderings of one
|
|
146
|
+
* preview agree. See the module comment for what it leaves out. With
|
|
147
|
+
* `changedOnly`, `same` and `read` steps are left out too, under the label
|
|
148
|
+
* `pulumi-preview-changed`, so the two digests never collide.
|
|
149
|
+
*/
|
|
150
|
+
export declare function pulumiPreviewDigest(preview: unknown, opts?: PulumiPreviewDigestOptions): string;
|
|
151
|
+
/** The action and disruption one URN's steps mean, or undefined for an op the change set has no action for. */
|
|
152
|
+
export declare function pulumiStepsAction(steps: PulumiStep[]): {
|
|
153
|
+
action: ChangeSetAction;
|
|
154
|
+
disruption?: ChangeSetDisruption;
|
|
155
|
+
importing?: true;
|
|
156
|
+
} | undefined;
|
|
157
|
+
export interface PulumiPreviewPartInput {
|
|
158
|
+
/** The workspace member's name, which names its graph nodes (`<member>/<key>`). */
|
|
159
|
+
member: string;
|
|
160
|
+
/** `pulumi preview --json`, parsed. */
|
|
161
|
+
preview: unknown;
|
|
162
|
+
/** The stack the preview ran against, recorded as `scope`. */
|
|
163
|
+
stack?: string;
|
|
164
|
+
/**
|
|
165
|
+
* The last deployment, as `pulumi stack export` prints it: the member's
|
|
166
|
+
* checked-in `stack-export.json`. With it, a resource the preview leaves
|
|
167
|
+
* out is a `mayAppear` entry rather than silence.
|
|
168
|
+
*/
|
|
169
|
+
prior?: unknown;
|
|
170
|
+
/** The preview was narrowed with `--target`, so it lists only its targets. */
|
|
171
|
+
targeted?: boolean;
|
|
172
|
+
/** The preview failed: the member is failed with this error, and keeps whatever steps it printed. */
|
|
173
|
+
error?: string;
|
|
174
|
+
/** Digest options (#4541, ruling B): `changedOnly` for a member on the resource lock grain. */
|
|
175
|
+
digest?: PulumiPreviewDigestOptions;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* A Pulumi member's part, from its `pulumi preview --json`. Throws when the
|
|
179
|
+
* document has no `steps` and no `error` says why.
|
|
180
|
+
*/
|
|
181
|
+
export declare function pulumiPreviewPart(input: PulumiPreviewPartInput): ChangeSetPart;
|
|
182
|
+
//# sourceMappingURL=change-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-set.d.ts","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2FG;AAEH,OAAO,KAAK,EACV,eAAe,EAEf,mBAAmB,EAGnB,aAAa,EACd,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAA6E,KAAK,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhH,kGAAkG;AAClG,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAED,qFAAqF;AACrF,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;CAC9E;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,EAAE,GAAG,SAAS,CAGlE;AAED,+EAA+E;AAC/E,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,0GAA0G;AAC1G,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,EAAE,CAI5E;AAID,kHAAkH;AAClH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAA6B,CAAC;AAEnF,MAAM,WAAW,0BAA0B;IACzC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,0BAA+B,GAAG,MAAM,CAgBnG;AAID,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC;IAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG,SAAS,CAElJ;AAsFD,MAAM,WAAW,sBAAsB;IACrC,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qGAAqG;IACrG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,MAAM,CAAC,EAAE,0BAA0B,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,aAAa,CAyH9E"}
|