typekro 0.28.1 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/advanced/index.d.ts +5 -1
- package/dist/advanced/index.d.ts.map +1 -1
- package/dist/advanced/index.js +2 -3
- package/dist/advanced/index.js.map +1 -1
- package/dist/alchemy/deployers.d.ts +6 -4
- package/dist/alchemy/deployers.d.ts.map +1 -1
- package/dist/alchemy/deployers.js +46 -9
- package/dist/alchemy/deployers.js.map +1 -1
- package/dist/alchemy/index.d.ts +2 -3
- package/dist/alchemy/index.d.ts.map +1 -1
- package/dist/alchemy/index.js +1 -1
- package/dist/alchemy/index.js.map +1 -1
- package/dist/alchemy/kro-delete.d.ts +6 -5
- package/dist/alchemy/kro-delete.d.ts.map +1 -1
- package/dist/alchemy/kro-delete.js +169 -22
- package/dist/alchemy/kro-delete.js.map +1 -1
- package/dist/alchemy/resource-registration.d.ts +24 -31
- package/dist/alchemy/resource-registration.d.ts.map +1 -1
- package/dist/alchemy/resource-registration.js +439 -75
- package/dist/alchemy/resource-registration.js.map +1 -1
- package/dist/alchemy/types.d.ts +56 -14
- package/dist/alchemy/types.d.ts.map +1 -1
- package/dist/alchemy/utilities.d.ts +2 -2
- package/dist/alchemy/utilities.d.ts.map +1 -1
- package/dist/compositions/typekro-runtime/typekro-runtime.d.ts.map +1 -1
- package/dist/compositions/typekro-runtime/typekro-runtime.js +31 -28
- package/dist/compositions/typekro-runtime/typekro-runtime.js.map +1 -1
- package/dist/compositions/typekro-runtime/types.d.ts +12 -0
- package/dist/compositions/typekro-runtime/types.d.ts.map +1 -1
- package/dist/core/composition/analysis-metadata.d.ts +15 -0
- package/dist/core/composition/analysis-metadata.d.ts.map +1 -0
- package/dist/core/composition/analysis-metadata.js +20 -0
- package/dist/core/composition/analysis-metadata.js.map +1 -0
- package/dist/core/composition/imperative.d.ts.map +1 -1
- package/dist/core/composition/imperative.js +38 -9
- package/dist/core/composition/imperative.js.map +1 -1
- package/dist/core/composition/nested-status-cel.js +3 -3
- package/dist/core/composition/nested-status-cel.js.map +1 -1
- package/dist/core/constants/brands.d.ts +1 -1
- package/dist/core/constants/brands.d.ts.map +1 -1
- package/dist/core/constants/brands.js +1 -1
- package/dist/core/constants/brands.js.map +1 -1
- package/dist/core/dependencies/resolver.d.ts +3 -1
- package/dist/core/dependencies/resolver.d.ts.map +1 -1
- package/dist/core/dependencies/resolver.js +29 -13
- package/dist/core/dependencies/resolver.js.map +1 -1
- package/dist/core/deployment/deletion-result.d.ts +22 -0
- package/dist/core/deployment/deletion-result.d.ts.map +1 -0
- package/dist/core/deployment/deletion-result.js +108 -0
- package/dist/core/deployment/deletion-result.js.map +1 -0
- package/dist/core/deployment/deployment-state-discovery.d.ts +1 -0
- package/dist/core/deployment/deployment-state-discovery.d.ts.map +1 -1
- package/dist/core/deployment/deployment-state-discovery.js +89 -9
- package/dist/core/deployment/deployment-state-discovery.js.map +1 -1
- package/dist/core/deployment/direct-factory.d.ts +46 -25
- package/dist/core/deployment/direct-factory.d.ts.map +1 -1
- package/dist/core/deployment/direct-factory.js +536 -126
- package/dist/core/deployment/direct-factory.js.map +1 -1
- package/dist/core/deployment/engine.d.ts +4 -1
- package/dist/core/deployment/engine.d.ts.map +1 -1
- package/dist/core/deployment/engine.js +105 -34
- package/dist/core/deployment/engine.js.map +1 -1
- package/dist/core/deployment/errors.d.ts +20 -1
- package/dist/core/deployment/errors.d.ts.map +1 -1
- package/dist/core/deployment/errors.js +55 -0
- package/dist/core/deployment/errors.js.map +1 -1
- package/dist/core/deployment/event-monitor.d.ts +4 -3
- package/dist/core/deployment/event-monitor.d.ts.map +1 -1
- package/dist/core/deployment/event-monitor.js +17 -5
- package/dist/core/deployment/event-monitor.js.map +1 -1
- package/dist/core/deployment/index.d.ts +1 -1
- package/dist/core/deployment/index.d.ts.map +1 -1
- package/dist/core/deployment/index.js +1 -1
- package/dist/core/deployment/index.js.map +1 -1
- package/dist/core/deployment/k8s-helpers.d.ts +1 -1
- package/dist/core/deployment/k8s-helpers.d.ts.map +1 -1
- package/dist/core/deployment/k8s-helpers.js +11 -5
- package/dist/core/deployment/k8s-helpers.js.map +1 -1
- package/dist/core/deployment/kro-factory.d.ts +54 -30
- package/dist/core/deployment/kro-factory.d.ts.map +1 -1
- package/dist/core/deployment/kro-factory.js +2002 -259
- package/dist/core/deployment/kro-factory.js.map +1 -1
- package/dist/core/deployment/kro-instance-admission.d.ts +17 -0
- package/dist/core/deployment/kro-instance-admission.d.ts.map +1 -0
- package/dist/core/deployment/kro-instance-admission.js +73 -0
- package/dist/core/deployment/kro-instance-admission.js.map +1 -0
- package/dist/core/deployment/kro-instance-safety.d.ts +0 -3
- package/dist/core/deployment/kro-instance-safety.d.ts.map +1 -1
- package/dist/core/deployment/kro-instance-safety.js +0 -11
- package/dist/core/deployment/kro-instance-safety.js.map +1 -1
- package/dist/core/deployment/kro-namespace-teardown.d.ts +63 -5
- package/dist/core/deployment/kro-namespace-teardown.d.ts.map +1 -1
- package/dist/core/deployment/kro-namespace-teardown.js +124 -12
- package/dist/core/deployment/kro-namespace-teardown.js.map +1 -1
- package/dist/core/deployment/kro-readiness.d.ts +2 -0
- package/dist/core/deployment/kro-readiness.d.ts.map +1 -1
- package/dist/core/deployment/kro-readiness.js +23 -6
- package/dist/core/deployment/kro-readiness.js.map +1 -1
- package/dist/core/deployment/poll-timeout.d.ts +1 -1
- package/dist/core/deployment/poll-timeout.d.ts.map +1 -1
- package/dist/core/deployment/poll-timeout.js +12 -1
- package/dist/core/deployment/poll-timeout.js.map +1 -1
- package/dist/core/deployment/resource-applier.d.ts +19 -3
- package/dist/core/deployment/resource-applier.d.ts.map +1 -1
- package/dist/core/deployment/resource-applier.js +263 -44
- package/dist/core/deployment/resource-applier.js.map +1 -1
- package/dist/core/deployment/rollback-manager.d.ts +6 -1
- package/dist/core/deployment/rollback-manager.d.ts.map +1 -1
- package/dist/core/deployment/rollback-manager.js +38 -12
- package/dist/core/deployment/rollback-manager.js.map +1 -1
- package/dist/core/deployment/schema-cel-evaluator.d.ts.map +1 -1
- package/dist/core/deployment/schema-cel-evaluator.js +63 -0
- package/dist/core/deployment/schema-cel-evaluator.js.map +1 -1
- package/dist/core/deployment/shared-utilities.d.ts +11 -6
- package/dist/core/deployment/shared-utilities.d.ts.map +1 -1
- package/dist/core/deployment/shared-utilities.js +169 -14
- package/dist/core/deployment/shared-utilities.js.map +1 -1
- package/dist/core/deployment/singleton-gitops.d.ts.map +1 -1
- package/dist/core/deployment/singleton-gitops.js +0 -2
- package/dist/core/deployment/singleton-gitops.js.map +1 -1
- package/dist/core/deployment/singleton-owner-drift.d.ts +11 -2
- package/dist/core/deployment/singleton-owner-drift.d.ts.map +1 -1
- package/dist/core/deployment/singleton-owner-drift.js +30 -13
- package/dist/core/deployment/singleton-owner-drift.js.map +1 -1
- package/dist/core/deployment/strategies/base-strategy.d.ts +2 -0
- package/dist/core/deployment/strategies/base-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/base-strategy.js +19 -2
- package/dist/core/deployment/strategies/base-strategy.js.map +1 -1
- package/dist/core/deployment/strategies/direct-strategy.d.ts +3 -0
- package/dist/core/deployment/strategies/direct-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/direct-strategy.js +31 -8
- package/dist/core/deployment/strategies/direct-strategy.js.map +1 -1
- package/dist/core/deployment/strategies/index.d.ts +1 -1
- package/dist/core/deployment/strategies/index.d.ts.map +1 -1
- package/dist/core/deployment/strategies/index.js +1 -1
- package/dist/core/deployment/strategies/index.js.map +1 -1
- package/dist/core/errors.d.ts +2 -2
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/expressions/analysis/cel-emitter.d.ts.map +1 -1
- package/dist/core/expressions/analysis/cel-emitter.js +17 -13
- package/dist/core/expressions/analysis/cel-emitter.js.map +1 -1
- package/dist/core/expressions/analysis/expression-metadata.d.ts +15 -0
- package/dist/core/expressions/analysis/expression-metadata.d.ts.map +1 -0
- package/dist/core/expressions/analysis/expression-metadata.js +10 -0
- package/dist/core/expressions/analysis/expression-metadata.js.map +1 -0
- package/dist/core/expressions/analysis/ready-when.d.ts +3 -0
- package/dist/core/expressions/analysis/ready-when.d.ts.map +1 -0
- package/dist/core/expressions/analysis/ready-when.js +127 -0
- package/dist/core/expressions/analysis/ready-when.js.map +1 -0
- package/dist/core/expressions/composition/composition-analyzer-helpers.d.ts +3 -2
- package/dist/core/expressions/composition/composition-analyzer-helpers.d.ts.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-helpers.js +6 -4
- package/dist/core/expressions/composition/composition-analyzer-helpers.js.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-ternary.d.ts +3 -2
- package/dist/core/expressions/composition/composition-analyzer-ternary.d.ts.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-ternary.js +12 -12
- package/dist/core/expressions/composition/composition-analyzer-ternary.js.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-traversal.d.ts.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-traversal.js +68 -4
- package/dist/core/expressions/composition/composition-analyzer-traversal.js.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-types.d.ts +2 -0
- package/dist/core/expressions/composition/composition-analyzer-types.d.ts.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer.d.ts.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer.js +2 -0
- package/dist/core/expressions/composition/composition-analyzer.js.map +1 -1
- package/dist/core/expressions/factory/status-builder-analyzer.d.ts.map +1 -1
- package/dist/core/expressions/factory/status-builder-analyzer.js +14 -1
- package/dist/core/expressions/factory/status-builder-analyzer.js.map +1 -1
- package/dist/core/kubernetes/api.d.ts.map +1 -1
- package/dist/core/kubernetes/api.js +2 -3
- package/dist/core/kubernetes/api.js.map +1 -1
- package/dist/core/kubernetes/bun-api-client.d.ts +1 -1
- package/dist/core/kubernetes/bun-api-client.d.ts.map +1 -1
- package/dist/core/kubernetes/bun-api-client.js +17 -17
- package/dist/core/kubernetes/bun-api-client.js.map +1 -1
- package/dist/core/kubernetes/bun-http-library.d.ts +16 -0
- package/dist/core/kubernetes/bun-http-library.d.ts.map +1 -1
- package/dist/core/kubernetes/bun-http-library.js +7 -1
- package/dist/core/kubernetes/bun-http-library.js.map +1 -1
- package/dist/core/kubernetes/bun-watch.d.ts +30 -0
- package/dist/core/kubernetes/bun-watch.d.ts.map +1 -0
- package/dist/core/kubernetes/bun-watch.js +144 -0
- package/dist/core/kubernetes/bun-watch.js.map +1 -0
- package/dist/core/kubernetes/client-node-runtime.d.ts +10 -0
- package/dist/core/kubernetes/client-node-runtime.d.ts.map +1 -0
- package/dist/core/kubernetes/client-node-runtime.js +15 -0
- package/dist/core/kubernetes/client-node-runtime.js.map +1 -0
- package/dist/core/kubernetes/client-provider.d.ts +21 -1
- package/dist/core/kubernetes/client-provider.d.ts.map +1 -1
- package/dist/core/kubernetes/client-provider.js +10 -10
- package/dist/core/kubernetes/client-provider.js.map +1 -1
- package/dist/core/kubernetes/index.d.ts +1 -1
- package/dist/core/kubernetes/index.d.ts.map +1 -1
- package/dist/core/kubernetes/index.js.map +1 -1
- package/dist/core/metadata/resource-metadata.d.ts +24 -1
- package/dist/core/metadata/resource-metadata.d.ts.map +1 -1
- package/dist/core/metadata/resource-metadata.js +8 -4
- package/dist/core/metadata/resource-metadata.js.map +1 -1
- package/dist/core/planning/artifact-codec.d.ts +14 -0
- package/dist/core/planning/artifact-codec.d.ts.map +1 -0
- package/dist/core/planning/artifact-codec.js +329 -0
- package/dist/core/planning/artifact-codec.js.map +1 -0
- package/dist/core/planning/artifacts.d.ts +212 -0
- package/dist/core/planning/artifacts.d.ts.map +1 -0
- package/dist/core/planning/artifacts.js +5 -0
- package/dist/core/planning/artifacts.js.map +1 -0
- package/dist/core/planning/aspects.d.ts +11 -0
- package/dist/core/planning/aspects.d.ts.map +1 -0
- package/dist/core/planning/aspects.js +77 -0
- package/dist/core/planning/aspects.js.map +1 -0
- package/dist/core/planning/canonical.d.ts +10 -0
- package/dist/core/planning/canonical.d.ts.map +1 -0
- package/dist/core/planning/canonical.js +54 -0
- package/dist/core/planning/canonical.js.map +1 -0
- package/dist/core/planning/capabilities.d.ts +16 -0
- package/dist/core/planning/capabilities.d.ts.map +1 -0
- package/dist/core/planning/capabilities.js +90 -0
- package/dist/core/planning/capabilities.js.map +1 -0
- package/dist/core/planning/capture.d.ts +29 -0
- package/dist/core/planning/capture.d.ts.map +1 -0
- package/dist/core/planning/capture.js +18 -0
- package/dist/core/planning/capture.js.map +1 -0
- package/dist/core/planning/compiler.d.ts +12 -0
- package/dist/core/planning/compiler.d.ts.map +1 -0
- package/dist/core/planning/compiler.js +631 -0
- package/dist/core/planning/compiler.js.map +1 -0
- package/dist/core/planning/direct-runtime-adapter.d.ts +39 -0
- package/dist/core/planning/direct-runtime-adapter.d.ts.map +1 -0
- package/dist/core/planning/direct-runtime-adapter.js +238 -0
- package/dist/core/planning/direct-runtime-adapter.js.map +1 -0
- package/dist/core/planning/execution-record.d.ts +21 -0
- package/dist/core/planning/execution-record.d.ts.map +1 -0
- package/dist/core/planning/execution-record.js +304 -0
- package/dist/core/planning/execution-record.js.map +1 -0
- package/dist/core/planning/index.d.ts +20 -0
- package/dist/core/planning/index.d.ts.map +1 -0
- package/dist/core/planning/index.js +18 -0
- package/dist/core/planning/index.js.map +1 -0
- package/dist/core/planning/kro-bundle.d.ts +24 -0
- package/dist/core/planning/kro-bundle.d.ts.map +1 -0
- package/dist/core/planning/kro-bundle.js +314 -0
- package/dist/core/planning/kro-bundle.js.map +1 -0
- package/dist/core/planning/kro-runtime-adapter.d.ts +28 -0
- package/dist/core/planning/kro-runtime-adapter.d.ts.map +1 -0
- package/dist/core/planning/kro-runtime-adapter.js +211 -0
- package/dist/core/planning/kro-runtime-adapter.js.map +1 -0
- package/dist/core/planning/materialization.d.ts +54 -0
- package/dist/core/planning/materialization.d.ts.map +1 -0
- package/dist/core/planning/materialization.js +489 -0
- package/dist/core/planning/materialization.js.map +1 -0
- package/dist/core/planning/plan-codec.d.ts +11 -0
- package/dist/core/planning/plan-codec.d.ts.map +1 -0
- package/dist/core/planning/plan-codec.js +555 -0
- package/dist/core/planning/plan-codec.js.map +1 -0
- package/dist/core/planning/planner.d.ts +21 -0
- package/dist/core/planning/planner.d.ts.map +1 -0
- package/dist/core/planning/planner.js +1518 -0
- package/dist/core/planning/planner.js.map +1 -0
- package/dist/core/planning/schema.d.ts +10 -0
- package/dist/core/planning/schema.d.ts.map +1 -0
- package/dist/core/planning/schema.js +159 -0
- package/dist/core/planning/schema.js.map +1 -0
- package/dist/core/planning/types.d.ts +441 -0
- package/dist/core/planning/types.d.ts.map +1 -0
- package/dist/core/planning/types.js +3 -0
- package/dist/core/planning/types.js.map +1 -0
- package/dist/core/planning/values.d.ts +76 -0
- package/dist/core/planning/values.d.ts.map +1 -0
- package/dist/core/planning/values.js +852 -0
- package/dist/core/planning/values.js.map +1 -0
- package/dist/core/proxy/create-resource.d.ts +12 -0
- package/dist/core/proxy/create-resource.d.ts.map +1 -1
- package/dist/core/proxy/create-resource.js +39 -9
- package/dist/core/proxy/create-resource.js.map +1 -1
- package/dist/core/readiness/evaluator-factories.d.ts +3 -1
- package/dist/core/readiness/evaluator-factories.d.ts.map +1 -1
- package/dist/core/readiness/evaluator-factories.js +130 -5
- package/dist/core/readiness/evaluator-factories.js.map +1 -1
- package/dist/core/readiness/index.d.ts +2 -1
- package/dist/core/readiness/index.d.ts.map +1 -1
- package/dist/core/readiness/index.js +2 -1
- package/dist/core/readiness/index.js.map +1 -1
- package/dist/core/readiness/portable-strategies.d.ts +28 -0
- package/dist/core/readiness/portable-strategies.d.ts.map +1 -0
- package/dist/core/readiness/portable-strategies.js +55 -0
- package/dist/core/readiness/portable-strategies.js.map +1 -0
- package/dist/core/readiness/strategy-configuration.d.ts +12 -0
- package/dist/core/readiness/strategy-configuration.d.ts.map +1 -0
- package/dist/core/readiness/strategy-configuration.js +51 -0
- package/dist/core/readiness/strategy-configuration.js.map +1 -0
- package/dist/core/references/cel-evaluator.d.ts +5 -0
- package/dist/core/references/cel-evaluator.d.ts.map +1 -1
- package/dist/core/references/cel-evaluator.js +33 -2
- package/dist/core/references/cel-evaluator.js.map +1 -1
- package/dist/core/references/external-refs.d.ts +2 -0
- package/dist/core/references/external-refs.d.ts.map +1 -1
- package/dist/core/references/external-refs.js +3 -1
- package/dist/core/references/external-refs.js.map +1 -1
- package/dist/core/references/resolver.d.ts +7 -1
- package/dist/core/references/resolver.d.ts.map +1 -1
- package/dist/core/references/resolver.js +91 -9
- package/dist/core/references/resolver.js.map +1 -1
- package/dist/core/references/schema-proxy.d.ts.map +1 -1
- package/dist/core/references/schema-proxy.js +35 -21
- package/dist/core/references/schema-proxy.js.map +1 -1
- package/dist/core/resources/factory-registry.d.ts +64 -2
- package/dist/core/resources/factory-registry.d.ts.map +1 -1
- package/dist/core/resources/factory-registry.js +74 -3
- package/dist/core/resources/factory-registry.js.map +1 -1
- package/dist/core/resources/index.d.ts +3 -2
- package/dist/core/resources/index.d.ts.map +1 -1
- package/dist/core/resources/index.js +2 -1
- package/dist/core/resources/index.js.map +1 -1
- package/dist/core/resources/live-comparison.d.ts +58 -0
- package/dist/core/resources/live-comparison.d.ts.map +1 -0
- package/dist/core/resources/live-comparison.js +293 -0
- package/dist/core/resources/live-comparison.js.map +1 -0
- package/dist/core/runtime/standalone-operation.d.ts +12 -0
- package/dist/core/runtime/standalone-operation.d.ts.map +1 -0
- package/dist/core/runtime/standalone-operation.js +62 -0
- package/dist/core/runtime/standalone-operation.js.map +1 -0
- package/dist/core/serialization/cel-references.d.ts.map +1 -1
- package/dist/core/serialization/cel-references.js +11 -1
- package/dist/core/serialization/cel-references.js.map +1 -1
- package/dist/core/serialization/core.d.ts.map +1 -1
- package/dist/core/serialization/core.js +277 -182
- package/dist/core/serialization/core.js.map +1 -1
- package/dist/core/serialization/schema.d.ts.map +1 -1
- package/dist/core/serialization/schema.js +3 -3
- package/dist/core/serialization/schema.js.map +1 -1
- package/dist/core/serialization/status-analysis-pipeline.d.ts +1 -1
- package/dist/core/serialization/status-analysis-pipeline.d.ts.map +1 -1
- package/dist/core/serialization/status-analysis-pipeline.js +14 -11
- package/dist/core/serialization/status-analysis-pipeline.js.map +1 -1
- package/dist/core/serialization/yaml.d.ts +5 -1
- package/dist/core/serialization/yaml.d.ts.map +1 -1
- package/dist/core/serialization/yaml.js +35 -182
- package/dist/core/serialization/yaml.js.map +1 -1
- package/dist/core/types/deployment.d.ts +135 -14
- package/dist/core/types/deployment.d.ts.map +1 -1
- package/dist/core/types/kubernetes.d.ts +3 -0
- package/dist/core/types/kubernetes.d.ts.map +1 -1
- package/dist/core/types/resource-graph.d.ts +7 -1
- package/dist/core/types/resource-graph.d.ts.map +1 -1
- package/dist/core/types/serialization.d.ts +8 -1
- package/dist/core/types/serialization.d.ts.map +1 -1
- package/dist/core/validation/cel-validator.d.ts.map +1 -1
- package/dist/core/validation/cel-validator.js +25 -16
- package/dist/core/validation/cel-validator.js.map +1 -1
- package/dist/experimental-planning.d.ts +13 -0
- package/dist/experimental-planning.d.ts.map +1 -0
- package/dist/experimental-planning.js +12 -0
- package/dist/experimental-planning.js.map +1 -0
- package/dist/factories/apisix/compositions/apisix-bootstrap.d.ts.map +1 -1
- package/dist/factories/apisix/compositions/apisix-bootstrap.js +27 -22
- package/dist/factories/apisix/compositions/apisix-bootstrap.js.map +1 -1
- package/dist/factories/apisix/compositions/apisix-helm-repository.d.ts +15 -0
- package/dist/factories/apisix/compositions/apisix-helm-repository.d.ts.map +1 -0
- package/dist/factories/apisix/compositions/apisix-helm-repository.js +28 -0
- package/dist/factories/apisix/compositions/apisix-helm-repository.js.map +1 -0
- package/dist/factories/apisix/compositions/index.d.ts +1 -0
- package/dist/factories/apisix/compositions/index.d.ts.map +1 -1
- package/dist/factories/apisix/compositions/index.js +1 -0
- package/dist/factories/apisix/compositions/index.js.map +1 -1
- package/dist/factories/apisix/types.d.ts +22 -0
- package/dist/factories/apisix/types.d.ts.map +1 -1
- package/dist/factories/apisix/types.js +16 -0
- package/dist/factories/apisix/types.js.map +1 -1
- package/dist/factories/apisix/utils/admin-credentials.d.ts +1 -0
- package/dist/factories/apisix/utils/admin-credentials.d.ts.map +1 -1
- package/dist/factories/apisix/utils/admin-credentials.js +5 -4
- package/dist/factories/apisix/utils/admin-credentials.js.map +1 -1
- package/dist/factories/caddy/compositions/caddy-ingress.d.ts.map +1 -1
- package/dist/factories/caddy/compositions/caddy-ingress.js +9 -2
- package/dist/factories/caddy/compositions/caddy-ingress.js.map +1 -1
- package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.d.ts.map +1 -1
- package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.js +11 -25
- package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.js.map +1 -1
- package/dist/factories/cert-manager/resources/certificates.d.ts.map +1 -1
- package/dist/factories/cert-manager/resources/certificates.js +2 -1
- package/dist/factories/cert-manager/resources/certificates.js.map +1 -1
- package/dist/factories/cert-manager/resources/challenges.d.ts.map +1 -1
- package/dist/factories/cert-manager/resources/challenges.js +3 -0
- package/dist/factories/cert-manager/resources/challenges.js.map +1 -1
- package/dist/factories/cilium/compositions/cilium-bootstrap.d.ts +4 -4
- package/dist/factories/cilium/resources/gateway.d.ts.map +1 -1
- package/dist/factories/cilium/resources/gateway.js +13 -12
- package/dist/factories/cilium/resources/gateway.js.map +1 -1
- package/dist/factories/cilium/resources/networking.d.ts.map +1 -1
- package/dist/factories/cilium/resources/networking.js +9 -0
- package/dist/factories/cilium/resources/networking.js.map +1 -1
- package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.d.ts +2 -1
- package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.d.ts.map +1 -1
- package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.js +2 -6
- package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.js.map +1 -1
- package/dist/factories/clickhouse/resources/installation.d.ts.map +1 -1
- package/dist/factories/clickhouse/resources/installation.js +2 -0
- package/dist/factories/clickhouse/resources/installation.js.map +1 -1
- package/dist/factories/clickhouse/resources/keeper.d.ts.map +1 -1
- package/dist/factories/clickhouse/resources/keeper.js +2 -0
- package/dist/factories/clickhouse/resources/keeper.js.map +1 -1
- package/dist/factories/clickhouse/types.d.ts +5 -2
- package/dist/factories/clickhouse/types.d.ts.map +1 -1
- package/dist/factories/clickhouse/types.js +2 -1
- package/dist/factories/clickhouse/types.js.map +1 -1
- package/dist/factories/clickstack/compositions/k8s-telemetry.d.ts +4 -2
- package/dist/factories/clickstack/compositions/k8s-telemetry.d.ts.map +1 -1
- package/dist/factories/clickstack/compositions/k8s-telemetry.js +2 -5
- package/dist/factories/clickstack/compositions/k8s-telemetry.js.map +1 -1
- package/dist/factories/clickstack/types.d.ts +2 -1
- package/dist/factories/clickstack/types.d.ts.map +1 -1
- package/dist/factories/clickstack/types.js +3 -1
- package/dist/factories/clickstack/types.js.map +1 -1
- package/dist/factories/cnpg/compositions/cnpg-bootstrap.d.ts +2 -1
- package/dist/factories/cnpg/compositions/cnpg-bootstrap.d.ts.map +1 -1
- package/dist/factories/cnpg/compositions/cnpg-bootstrap.js +3 -8
- package/dist/factories/cnpg/compositions/cnpg-bootstrap.js.map +1 -1
- package/dist/factories/cnpg/resources/backup.d.ts.map +1 -1
- package/dist/factories/cnpg/resources/backup.js +2 -0
- package/dist/factories/cnpg/resources/backup.js.map +1 -1
- package/dist/factories/cnpg/resources/cluster.d.ts.map +1 -1
- package/dist/factories/cnpg/resources/cluster.js +2 -1
- package/dist/factories/cnpg/resources/cluster.js.map +1 -1
- package/dist/factories/cnpg/resources/pooler.d.ts.map +1 -1
- package/dist/factories/cnpg/resources/pooler.js +2 -0
- package/dist/factories/cnpg/resources/pooler.js.map +1 -1
- package/dist/factories/cnpg/resources/scheduled-backup.d.ts.map +1 -1
- package/dist/factories/cnpg/resources/scheduled-backup.js +2 -1
- package/dist/factories/cnpg/resources/scheduled-backup.js.map +1 -1
- package/dist/factories/cnpg/types.d.ts +6 -3
- package/dist/factories/cnpg/types.d.ts.map +1 -1
- package/dist/factories/cnpg/types.js +2 -1
- package/dist/factories/cnpg/types.js.map +1 -1
- package/dist/factories/dagster/compositions/dagster-bootstrap.d.ts +2 -0
- package/dist/factories/dagster/compositions/dagster-bootstrap.d.ts.map +1 -1
- package/dist/factories/dagster/types.d.ts +5 -0
- package/dist/factories/dagster/types.d.ts.map +1 -1
- package/dist/factories/dagster/types.js +1 -0
- package/dist/factories/dagster/types.js.map +1 -1
- package/dist/factories/dagster/utils/helm-values-mapper.js +3 -0
- package/dist/factories/dagster/utils/helm-values-mapper.js.map +1 -1
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.d.ts.map +1 -1
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.js +7 -4
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.js.map +1 -1
- package/dist/factories/external-dns/resources/dns-endpoint.d.ts.map +1 -1
- package/dist/factories/external-dns/resources/dns-endpoint.js +20 -18
- package/dist/factories/external-dns/resources/dns-endpoint.js.map +1 -1
- package/dist/factories/flux/git-repository.d.ts.map +1 -1
- package/dist/factories/flux/git-repository.js +41 -34
- package/dist/factories/flux/git-repository.js.map +1 -1
- package/dist/factories/flux/kustomize/readiness-evaluators.d.ts +0 -6
- package/dist/factories/flux/kustomize/readiness-evaluators.d.ts.map +1 -1
- package/dist/factories/flux/kustomize/readiness-evaluators.js +12 -2
- package/dist/factories/flux/kustomize/readiness-evaluators.js.map +1 -1
- package/dist/factories/harbor/compositions/harbor-installation.d.ts +46 -38
- package/dist/factories/harbor/compositions/harbor-installation.d.ts.map +1 -1
- package/dist/factories/harbor/compositions/harbor-installation.js +4 -2
- package/dist/factories/harbor/compositions/harbor-installation.js.map +1 -1
- package/dist/factories/harbor/types.d.ts +13 -11
- package/dist/factories/harbor/types.d.ts.map +1 -1
- package/dist/factories/harbor/types.js +11 -9
- package/dist/factories/harbor/types.js.map +1 -1
- package/dist/factories/helm/helm-repository.d.ts.map +1 -1
- package/dist/factories/helm/helm-repository.js +14 -1
- package/dist/factories/helm/helm-repository.js.map +1 -1
- package/dist/factories/helm/index.d.ts +2 -0
- package/dist/factories/helm/index.d.ts.map +1 -1
- package/dist/factories/helm/index.js +1 -0
- package/dist/factories/helm/index.js.map +1 -1
- package/dist/factories/helm/readiness-evaluators.d.ts.map +1 -1
- package/dist/factories/helm/readiness-evaluators.js +46 -7
- package/dist/factories/helm/readiness-evaluators.js.map +1 -1
- package/dist/factories/helm/status.d.ts +18 -0
- package/dist/factories/helm/status.d.ts.map +1 -0
- package/dist/factories/helm/status.js +38 -0
- package/dist/factories/helm/status.js.map +1 -0
- package/dist/factories/index.d.ts +2 -2
- package/dist/factories/index.d.ts.map +1 -1
- package/dist/factories/index.js +4 -4
- package/dist/factories/index.js.map +1 -1
- package/dist/factories/inngest/compositions/inngest-bootstrap.d.ts +1 -1
- package/dist/factories/inngest/compositions/inngest-bootstrap.d.ts.map +1 -1
- package/dist/factories/inngest/compositions/inngest-bootstrap.js +2 -4
- package/dist/factories/inngest/compositions/inngest-bootstrap.js.map +1 -1
- package/dist/factories/inngest/resources/helm.d.ts.map +1 -1
- package/dist/factories/inngest/resources/helm.js +12 -3
- package/dist/factories/inngest/resources/helm.js.map +1 -1
- package/dist/factories/inngest/types.d.ts +3 -7
- package/dist/factories/inngest/types.d.ts.map +1 -1
- package/dist/factories/inngest/types.js +1 -1
- package/dist/factories/inngest/types.js.map +1 -1
- package/dist/factories/kro/kro-crd.d.ts.map +1 -1
- package/dist/factories/kro/kro-crd.js +32 -33
- package/dist/factories/kro/kro-crd.js.map +1 -1
- package/dist/factories/kro/kro-custom-resource.d.ts.map +1 -1
- package/dist/factories/kro/kro-custom-resource.js +91 -85
- package/dist/factories/kro/kro-custom-resource.js.map +1 -1
- package/dist/factories/kro/resource-graph-definition.d.ts.map +1 -1
- package/dist/factories/kro/resource-graph-definition.js +127 -117
- package/dist/factories/kro/resource-graph-definition.js.map +1 -1
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.d.ts.map +1 -1
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.js +27 -26
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.js.map +1 -1
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.d.ts.map +1 -1
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js +22 -22
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js.map +1 -1
- package/dist/factories/kubernetes/certificates/certificate-signing-request.d.ts.map +1 -1
- package/dist/factories/kubernetes/certificates/certificate-signing-request.js +41 -39
- package/dist/factories/kubernetes/certificates/certificate-signing-request.js.map +1 -1
- package/dist/factories/kubernetes/core/component-status.d.ts.map +1 -1
- package/dist/factories/kubernetes/core/component-status.js +14 -16
- package/dist/factories/kubernetes/core/component-status.js.map +1 -1
- package/dist/factories/kubernetes/core/namespace.d.ts.map +1 -1
- package/dist/factories/kubernetes/core/namespace.js +31 -38
- package/dist/factories/kubernetes/core/namespace.js.map +1 -1
- package/dist/factories/kubernetes/core/node.d.ts.map +1 -1
- package/dist/factories/kubernetes/core/node.js +17 -25
- package/dist/factories/kubernetes/core/node.js.map +1 -1
- package/dist/factories/kubernetes/core/pod.d.ts.map +1 -1
- package/dist/factories/kubernetes/core/pod.js +31 -35
- package/dist/factories/kubernetes/core/pod.js.map +1 -1
- package/dist/factories/kubernetes/extensions/custom-resource-definition.d.ts.map +1 -1
- package/dist/factories/kubernetes/extensions/custom-resource-definition.js +34 -36
- package/dist/factories/kubernetes/extensions/custom-resource-definition.js.map +1 -1
- package/dist/factories/kubernetes/extensions/custom-resource.d.ts.map +1 -1
- package/dist/factories/kubernetes/extensions/custom-resource.js +2 -4
- package/dist/factories/kubernetes/extensions/custom-resource.js.map +1 -1
- package/dist/factories/kubernetes/networking/endpoints.d.ts.map +1 -1
- package/dist/factories/kubernetes/networking/endpoints.js +29 -30
- package/dist/factories/kubernetes/networking/endpoints.js.map +1 -1
- package/dist/factories/kubernetes/networking/ingress.d.ts.map +1 -1
- package/dist/factories/kubernetes/networking/ingress.js +46 -57
- package/dist/factories/kubernetes/networking/ingress.js.map +1 -1
- package/dist/factories/kubernetes/networking/network-policy.d.ts +9 -0
- package/dist/factories/kubernetes/networking/network-policy.d.ts.map +1 -1
- package/dist/factories/kubernetes/networking/network-policy.js +51 -1
- package/dist/factories/kubernetes/networking/network-policy.js.map +1 -1
- package/dist/factories/kubernetes/networking/service.d.ts.map +1 -1
- package/dist/factories/kubernetes/networking/service.js +48 -40
- package/dist/factories/kubernetes/networking/service.js.map +1 -1
- package/dist/factories/kubernetes/policy/pod-disruption-budget.d.ts.map +1 -1
- package/dist/factories/kubernetes/policy/pod-disruption-budget.js +40 -46
- package/dist/factories/kubernetes/policy/pod-disruption-budget.js.map +1 -1
- package/dist/factories/kubernetes/policy/resource-quota.d.ts.map +1 -1
- package/dist/factories/kubernetes/policy/resource-quota.js +30 -34
- package/dist/factories/kubernetes/policy/resource-quota.js.map +1 -1
- package/dist/factories/kubernetes/storage/persistent-volume-claim.d.ts.map +1 -1
- package/dist/factories/kubernetes/storage/persistent-volume-claim.js +22 -21
- package/dist/factories/kubernetes/storage/persistent-volume-claim.js.map +1 -1
- package/dist/factories/kubernetes/storage/persistent-volume.d.ts.map +1 -1
- package/dist/factories/kubernetes/storage/persistent-volume.js +32 -38
- package/dist/factories/kubernetes/storage/persistent-volume.js.map +1 -1
- package/dist/factories/kubernetes/storage/volume-attachment.d.ts.map +1 -1
- package/dist/factories/kubernetes/storage/volume-attachment.js +12 -11
- package/dist/factories/kubernetes/storage/volume-attachment.js.map +1 -1
- package/dist/factories/kubernetes/workloads/cron-job.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/cron-job.js +39 -34
- package/dist/factories/kubernetes/workloads/cron-job.js.map +1 -1
- package/dist/factories/kubernetes/workloads/daemon-set.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/daemon-set.js +24 -23
- package/dist/factories/kubernetes/workloads/daemon-set.js.map +1 -1
- package/dist/factories/kubernetes/workloads/deployment.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/deployment.js +45 -35
- package/dist/factories/kubernetes/workloads/deployment.js.map +1 -1
- package/dist/factories/kubernetes/workloads/job.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/job.js +87 -77
- package/dist/factories/kubernetes/workloads/job.js.map +1 -1
- package/dist/factories/kubernetes/workloads/replica-set.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/replica-set.js +24 -24
- package/dist/factories/kubernetes/workloads/replica-set.js.map +1 -1
- package/dist/factories/kubernetes/workloads/replication-controller.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/replication-controller.js +37 -26
- package/dist/factories/kubernetes/workloads/replication-controller.js.map +1 -1
- package/dist/factories/kubernetes/workloads/stateful-set.d.ts.map +1 -1
- package/dist/factories/kubernetes/workloads/stateful-set.js +69 -55
- package/dist/factories/kubernetes/workloads/stateful-set.js.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-artifact-applier.d.ts +15 -0
- package/dist/factories/kubernetes/yaml/yaml-artifact-applier.d.ts.map +1 -0
- package/dist/factories/kubernetes/yaml/yaml-artifact-applier.js +69 -0
- package/dist/factories/kubernetes/yaml/yaml-artifact-applier.js.map +1 -0
- package/dist/factories/kubernetes/yaml/yaml-directory.d.ts +2 -1
- package/dist/factories/kubernetes/yaml/yaml-directory.d.ts.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-directory.js +3 -34
- package/dist/factories/kubernetes/yaml/yaml-directory.js.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-file.d.ts +13 -91
- package/dist/factories/kubernetes/yaml/yaml-file.d.ts.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-file.js +21 -311
- package/dist/factories/kubernetes/yaml/yaml-file.js.map +1 -1
- package/dist/factories/nats/compositions/nats-bootstrap.d.ts +2 -2
- package/dist/factories/nats/compositions/nats-bootstrap.d.ts.map +1 -1
- package/dist/factories/nats/compositions/nats-bootstrap.js +2 -3
- package/dist/factories/nats/compositions/nats-bootstrap.js.map +1 -1
- package/dist/factories/nats/resources/jetstream.d.ts.map +1 -1
- package/dist/factories/nats/resources/jetstream.js +2 -0
- package/dist/factories/nats/resources/jetstream.js.map +1 -1
- package/dist/factories/nats/types.d.ts +3 -3
- package/dist/factories/nats/types.js +1 -1
- package/dist/factories/nats/types.js.map +1 -1
- package/dist/factories/ory/compositions/ory-platform-stack.d.ts.map +1 -1
- package/dist/factories/ory/compositions/ory-platform-stack.js +35 -9
- package/dist/factories/ory/compositions/ory-platform-stack.js.map +1 -1
- package/dist/factories/ory/resources/oathkeeper-rule.d.ts.map +1 -1
- package/dist/factories/ory/resources/oathkeeper-rule.js +11 -8
- package/dist/factories/ory/resources/oathkeeper-rule.js.map +1 -1
- package/dist/factories/ory/resources/oauth2-client.d.ts.map +1 -1
- package/dist/factories/ory/resources/oauth2-client.js +12 -9
- package/dist/factories/ory/resources/oauth2-client.js.map +1 -1
- package/dist/factories/ory/types.d.ts +3 -0
- package/dist/factories/ory/types.d.ts.map +1 -1
- package/dist/factories/ory/types.js +1 -0
- package/dist/factories/ory/types.js.map +1 -1
- package/dist/factories/rook/compositions/rook-ceph-operator-installation.d.ts +2 -2
- package/dist/factories/rook/compositions/rook-ceph-operator-installation.d.ts.map +1 -1
- package/dist/factories/rook/compositions/rook-ceph-operator-installation.js +2 -3
- package/dist/factories/rook/compositions/rook-ceph-operator-installation.js.map +1 -1
- package/dist/factories/rook/resources/ceph-object-store-user.d.ts.map +1 -1
- package/dist/factories/rook/resources/ceph-object-store-user.js +2 -0
- package/dist/factories/rook/resources/ceph-object-store-user.js.map +1 -1
- package/dist/factories/rook/resources/ceph-object-store.d.ts.map +1 -1
- package/dist/factories/rook/resources/ceph-object-store.js +2 -0
- package/dist/factories/rook/resources/ceph-object-store.js.map +1 -1
- package/dist/factories/rook/resources/object-bucket-claim.d.ts.map +1 -1
- package/dist/factories/rook/resources/object-bucket-claim.js +2 -0
- package/dist/factories/rook/resources/object-bucket-claim.js.map +1 -1
- package/dist/factories/rook/types.d.ts +1 -1
- package/dist/factories/rook/types.js +1 -1
- package/dist/factories/rook/types.js.map +1 -1
- package/dist/factories/searxng/compositions/searxng-bootstrap.d.ts.map +1 -1
- package/dist/factories/searxng/compositions/searxng-bootstrap.js +2 -2
- package/dist/factories/searxng/compositions/searxng-bootstrap.js.map +1 -1
- package/dist/factories/searxng/resources/searxng.d.ts.map +1 -1
- package/dist/factories/searxng/resources/searxng.js +2 -0
- package/dist/factories/searxng/resources/searxng.js.map +1 -1
- package/dist/factories/valkey/compositions/valkey-bootstrap.d.ts +2 -2
- package/dist/factories/valkey/compositions/valkey-bootstrap.d.ts.map +1 -1
- package/dist/factories/valkey/compositions/valkey-bootstrap.js +4 -9
- package/dist/factories/valkey/compositions/valkey-bootstrap.js.map +1 -1
- package/dist/factories/valkey/resources/valkey.d.ts.map +1 -1
- package/dist/factories/valkey/resources/valkey.js +2 -1
- package/dist/factories/valkey/resources/valkey.js.map +1 -1
- package/dist/factories/valkey/types.d.ts +3 -7
- package/dist/factories/valkey/types.d.ts.map +1 -1
- package/dist/factories/valkey/types.js +1 -1
- package/dist/factories/valkey/types.js.map +1 -1
- package/dist/factories/webapp/compositions/web-app-with-processing.d.ts +3 -2
- package/dist/factories/webapp/compositions/web-app-with-processing.d.ts.map +1 -1
- package/dist/factories/webapp/compositions/web-app-with-processing.js +7 -6
- package/dist/factories/webapp/compositions/web-app-with-processing.js.map +1 -1
- package/dist/factories/webapp/types.d.ts +1 -0
- package/dist/factories/webapp/types.d.ts.map +1 -1
- package/dist/factories/webapp/types.js +2 -0
- package/dist/factories/webapp/types.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/shared/brands.d.ts +7 -0
- package/dist/shared/brands.d.ts.map +1 -1
- package/dist/shared/brands.js +7 -0
- package/dist/shared/brands.js.map +1 -1
- package/dist/utils/index.d.ts +3 -3
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -3
- package/dist/utils/index.js.map +1 -1
- package/package.json +20 -5
- package/dist/factories/kubernetes/yaml/conflict-handler.d.ts +0 -23
- package/dist/factories/kubernetes/yaml/conflict-handler.d.ts.map +0 -1
- package/dist/factories/kubernetes/yaml/conflict-handler.js +0 -83
- package/dist/factories/kubernetes/yaml/conflict-handler.js.map +0 -1
|
@@ -13,22 +13,26 @@
|
|
|
13
13
|
* The Kubernetes machinery (`deployers`, `kro-delete`, client/deployer construction) is
|
|
14
14
|
* alchemy-version-agnostic and reused verbatim; only the registration glue changed.
|
|
15
15
|
*/
|
|
16
|
-
import { Effect } from 'effect';
|
|
17
16
|
import * as Output from 'alchemy/Output';
|
|
18
17
|
import * as ProviderMod from 'alchemy/Provider';
|
|
19
18
|
import * as ResourceMod from 'alchemy/Resource';
|
|
19
|
+
import { Effect } from 'effect';
|
|
20
|
+
import * as Redacted from 'effect/Redacted';
|
|
20
21
|
import { DEFAULT_DEPLOYMENT_TIMEOUT } from '../core/config/defaults.js';
|
|
21
|
-
import { ensureError } from '../core/errors.js';
|
|
22
|
-
import { createKubernetesClientProvider } from '../core/kubernetes/client-provider.js';
|
|
23
|
-
import { getComponentLogger } from '../core/logging/index.js';
|
|
24
22
|
import { CEL_EXPRESSION_BRAND } from '../core/constants/brands.js';
|
|
25
|
-
import { createBunCompatibleCustomObjectsApi, createBunCompatibleKubernetesObjectApi, } from '../core/kubernetes/index.js';
|
|
26
|
-
import { getResourceScope } from '../core/metadata/index.js';
|
|
27
23
|
import { decideNamespaceOwnershipCreateFirst, deleteNamespaceIfEmpty, HOISTED_NAMESPACES_ANNOTATION, listNamespacesOwnedByRgd, NAMESPACE_OWNER_ANNOTATION, readHoistedNamespacesRecord, } from '../core/deployment/kro-namespace-teardown.js';
|
|
28
24
|
import { SINGLETON_SPEC_FINGERPRINT_ANNOTATION } from '../core/deployment/resource-tagging.js';
|
|
29
|
-
import {
|
|
25
|
+
import { materializeSerializableKubeConfigOptions } from '../core/deployment/shared-utilities.js';
|
|
26
|
+
import { singletonDriftVerdict, } from '../core/deployment/singleton-owner-drift.js';
|
|
27
|
+
import { ensureError } from '../core/errors.js';
|
|
28
|
+
import { createKubernetesClientProvider } from '../core/kubernetes/client-provider.js';
|
|
29
|
+
import { createBunCompatibleCustomObjectsApi, createBunCompatibleKubernetesObjectApi, } from '../core/kubernetes/index.js';
|
|
30
|
+
import { getComponentLogger } from '../core/logging/index.js';
|
|
31
|
+
import { copyResourceMetadata, getReadinessEvaluator, getResourceScope, setMetadataField, setReadinessEvaluator, setResourceId, } from '../core/metadata/index.js';
|
|
32
|
+
import { collectArtifactOutputUses, decodeDirectArtifactExecutionRecord, decodeKroArtifactBundle, materializeDirectArtifactManifest, materializeKroArtifactBundleOperation, planValueSensitiveBindingNames, } from '../core/planning/index.js';
|
|
33
|
+
import { resolvePortableReadinessStrategy } from '../core/readiness/portable-strategies.js';
|
|
30
34
|
import { DirectTypeKroDeployer, KroTypeKroDeployer, ResourceGraphDefinitionDeletionDeferredError, } from './deployers.js';
|
|
31
|
-
import { deleteKroDefinition, deleteKroInstanceFinalizerSafe, hasKroInstances } from './kro-delete.js';
|
|
35
|
+
import { deleteKroDefinition, deleteKroInstanceFinalizerSafe, hasKroInstances, } from './kro-delete.js';
|
|
32
36
|
/** The single alchemy v2 resource type for any TypeKro KRO resource (RGD or CR instance). */
|
|
33
37
|
export const KRO_RESOURCE_TYPE = 'TypeKro.KroResource';
|
|
34
38
|
/**
|
|
@@ -44,18 +48,33 @@ export const KroResource = ResourceMod.Resource(KRO_RESOURCE_TYPE);
|
|
|
44
48
|
* convergent create/update (apply the manifest, wait for readiness); `delete` performs the
|
|
45
49
|
* finalizer-safe, shared-RGD-aware teardown.
|
|
46
50
|
*/
|
|
47
|
-
export const kroProvider = ProviderMod.effect(KroResource,
|
|
51
|
+
export const kroProvider = ProviderMod.effect(KroResource,
|
|
52
|
+
// Typed so the service literal is checked directly against `ProviderService` (methods bivariant) —
|
|
53
|
+
// avoids the exactOptionalPropertyTypes friction of an inferred literal while keeping the effect-hosted
|
|
54
|
+
// registration the conformance boundary requires.
|
|
55
|
+
Effect.succeed({
|
|
48
56
|
// `namespace` is identity-stable: a namespace change is a replacement, not an in-place update.
|
|
49
57
|
stables: ['namespace'],
|
|
58
|
+
// Account-wide enumeration (powers `alchemy nuke`). A generic KRO resource isn't discoverable
|
|
59
|
+
// cluster-wide from props alone — TypeKro manages teardown through its own `delete` lifecycle —
|
|
60
|
+
// so this reports nothing to nuke rather than guessing (required by alchemy beta.58's ProviderService).
|
|
61
|
+
list: () => Effect.succeed([]),
|
|
50
62
|
reconcile: Effect.fn(function* ({ news }) {
|
|
51
|
-
return yield* Effect.
|
|
63
|
+
return yield* Effect.tryPromise({
|
|
64
|
+
try: (abortSignal) => deployKroResource(news, abortSignal),
|
|
65
|
+
catch: ensureError,
|
|
66
|
+
});
|
|
52
67
|
}),
|
|
53
|
-
delete: Effect.fn(function* ({ output,
|
|
54
|
-
// Prefer the live spec
|
|
55
|
-
//
|
|
56
|
-
|
|
68
|
+
delete: Effect.fn(function* ({ output, olds }) {
|
|
69
|
+
// Prefer the live spec (`olds` — the last-applied props; alchemy beta.58 renamed the delete
|
|
70
|
+
// input's spec field from `news` to `olds`); fall back to reconstructing minimal props from
|
|
71
|
+
// persisted output (a delete after the spec is gone — e.g. resource removed from the stack).
|
|
72
|
+
const props = olds ?? propsFromOutput(output);
|
|
57
73
|
if (props) {
|
|
58
|
-
yield* Effect.
|
|
74
|
+
yield* Effect.tryPromise({
|
|
75
|
+
try: (abortSignal) => deleteKroResource(props, abortSignal),
|
|
76
|
+
catch: ensureError,
|
|
77
|
+
});
|
|
59
78
|
}
|
|
60
79
|
else {
|
|
61
80
|
// Neither a live spec nor a usable output (e.g. a create that failed before persisting a
|
|
@@ -85,12 +104,15 @@ export const kroProvider = ProviderMod.effect(KroResource, Effect.succeed({
|
|
|
85
104
|
* Declarations must be topologically ordered (as `toAlchemyResources` returns them) so each
|
|
86
105
|
* dependency's output exists before its dependents reference it.
|
|
87
106
|
*/
|
|
88
|
-
export function materializeAlchemyResources(kroResource, declarations) {
|
|
107
|
+
export function materializeAlchemyResources(kroResource, declarations, options = {}) {
|
|
89
108
|
return Effect.gen(function* () {
|
|
90
109
|
// Keyed by declaration id → the instantiated alchemy resource HANDLE (what `Output.of` consumes
|
|
91
110
|
// and what carries the dependency edge); its resolved attributes are a `TypeKroResource`.
|
|
92
111
|
const handles = {};
|
|
93
112
|
for (const decl of declarations) {
|
|
113
|
+
if (Object.hasOwn(handles, decl.id)) {
|
|
114
|
+
throw new Error(`materializeAlchemyResources: duplicate declaration id '${decl.id}' in one materialization call.`);
|
|
115
|
+
}
|
|
94
116
|
const deps = decl.dependsOn.map((id) => {
|
|
95
117
|
const handle = handles[id];
|
|
96
118
|
if (!handle) {
|
|
@@ -102,11 +124,18 @@ export function materializeAlchemyResources(kroResource, declarations) {
|
|
|
102
124
|
}
|
|
103
125
|
return handle;
|
|
104
126
|
});
|
|
127
|
+
const artifactRequirements = decl.artifactRequirements ?? decl.props.artifactRequirements ?? [];
|
|
128
|
+
const artifactOutputUses = decl.artifactOutputUses ?? decl.props.artifactOutputUses ?? [];
|
|
129
|
+
const artifactOutputs = artifactOutputUses.length > 0
|
|
130
|
+
? alchemyArtifactOutputs(artifactRequirements, artifactOutputUses, options)
|
|
131
|
+
: undefined;
|
|
105
132
|
// `Output.all([...Output.of(dep)])` both (a) creates the alchemy dependency edges so these
|
|
106
133
|
// deploy first and (b) resolves to the concrete dependency outputs handed to `reconcile`.
|
|
107
|
-
const props =
|
|
108
|
-
|
|
109
|
-
:
|
|
134
|
+
const props = {
|
|
135
|
+
...decl.props,
|
|
136
|
+
...(deps.length > 0 ? { dependencies: Output.all(...deps.map((d) => Output.of(d))) } : {}),
|
|
137
|
+
...(artifactOutputs ? { artifactOutputs } : {}),
|
|
138
|
+
};
|
|
110
139
|
// Cast: `props` carries an `Output` for `dependencies` that the `KroResource` constructor
|
|
111
140
|
// accepts as an `Input<…>` and alchemy resolves before reconcile — the field's static type
|
|
112
141
|
// is the resolved (post-evaluation) shape.
|
|
@@ -115,43 +144,102 @@ export function materializeAlchemyResources(kroResource, declarations) {
|
|
|
115
144
|
return handles;
|
|
116
145
|
});
|
|
117
146
|
}
|
|
147
|
+
function alchemyArtifactOutputs(requirements, uses, options) {
|
|
148
|
+
const requirementsById = new Map(requirements.map((requirement) => [requirement.id, requirement]));
|
|
149
|
+
const uniqueUses = new Map();
|
|
150
|
+
for (const use of uses) {
|
|
151
|
+
const key = `${use.requirementId}\u0000${use.output}`;
|
|
152
|
+
const prior = uniqueUses.get(key);
|
|
153
|
+
uniqueUses.set(key, { ...use, sensitive: use.sensitive || prior?.sensitive === true });
|
|
154
|
+
}
|
|
155
|
+
const expressions = [];
|
|
156
|
+
const layout = [];
|
|
157
|
+
const handles = new Set();
|
|
158
|
+
for (const use of uniqueUses.values()) {
|
|
159
|
+
const requirement = requirementsById.get(use.requirementId);
|
|
160
|
+
if (!requirement || !requirement.outputs.includes(use.output)) {
|
|
161
|
+
throw new Error(`materializeAlchemyResources: declaration uses undeclared artifact output ${use.requirementId}.${use.output}.`);
|
|
162
|
+
}
|
|
163
|
+
const binding = options.artifacts?.[use.requirementId];
|
|
164
|
+
if (!binding) {
|
|
165
|
+
throw new Error(`materializeAlchemyResources: artifact requirement '${use.requirementId}' was not supplied.`);
|
|
166
|
+
}
|
|
167
|
+
if (!Object.hasOwn(binding.outputs, use.output)) {
|
|
168
|
+
throw new Error(`materializeAlchemyResources: artifact binding '${use.requirementId}' has no '${use.output}' output.`);
|
|
169
|
+
}
|
|
170
|
+
if (!handles.has(use.requirementId)) {
|
|
171
|
+
expressions.push(Output.of(binding.resource));
|
|
172
|
+
layout.push({ requirementId: use.requirementId, output: '', sensitive: false });
|
|
173
|
+
handles.add(use.requirementId);
|
|
174
|
+
}
|
|
175
|
+
expressions.push(Output.asOutput(binding.outputs[use.output]));
|
|
176
|
+
layout.push(use);
|
|
177
|
+
}
|
|
178
|
+
return Output.map(Output.all(...expressions), (resolved) => {
|
|
179
|
+
const outputs = {};
|
|
180
|
+
resolved.forEach((value, index) => {
|
|
181
|
+
const item = layout[index];
|
|
182
|
+
if (!item || item.output.length === 0)
|
|
183
|
+
return;
|
|
184
|
+
const requirementOutputs = outputs[item.requirementId] ?? {};
|
|
185
|
+
requirementOutputs[item.output] = item.sensitive ? Redacted.make(value) : value;
|
|
186
|
+
outputs[item.requirementId] = requirementOutputs;
|
|
187
|
+
});
|
|
188
|
+
return outputs;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
118
191
|
/**
|
|
119
192
|
* Reconcile: deploy a single KRO resource (RGD or CR instance) and return its persisted state.
|
|
120
193
|
* Convergent — alchemy calls this for both create and update; the deployer is idempotent apply.
|
|
121
194
|
*/
|
|
122
|
-
async function deployKroResource(props) {
|
|
195
|
+
async function deployKroResource(props, abortSignal) {
|
|
196
|
+
abortSignal?.throwIfAborted();
|
|
123
197
|
const logger = getComponentLogger('alchemy-deployment').child({ alchemyType: KRO_RESOURCE_TYPE });
|
|
124
198
|
// Fail-closed PRE-HOIST guard on the ALCHEMY path (finding #7): before applying a
|
|
125
199
|
// typekro-hoisted workload Namespace, refuse to proceed if it is still a KRO ApplySet
|
|
126
200
|
// member from a pre-hoist RGD — rolling the new hoisted RGD over the old one would let
|
|
127
201
|
// KRO's prune delete it. Cluster-checked here since `toAlchemyResources` is cluster-free.
|
|
128
202
|
await _assertNoPreHoistNamespaceConflictAlchemy(props, logger);
|
|
203
|
+
abortSignal?.throwIfAborted();
|
|
129
204
|
// Singleton-owner spec-drift protection (the declarative analog of `assertNoDeployedSingletonSpecDrift`
|
|
130
205
|
// in the imperative deploy path): refuse to clobber a shared singleton that already exists with a
|
|
131
206
|
// different spec. Cluster-checked here since `toAlchemyResources` is intentionally cluster-free.
|
|
132
207
|
await _assertNoSingletonDrift(props, logger);
|
|
208
|
+
abortSignal?.throwIfAborted();
|
|
133
209
|
// finding #2 (adopted-namespace): the hoisted workload Namespace is stamped
|
|
134
210
|
// owned-by-this-RGD at BUILD time (cluster-free). READ the live namespace here and
|
|
135
211
|
// KEEP that stamp ONLY when typekro actually creates it (404) or already owns it;
|
|
136
212
|
// otherwise strip it so teardown never deletes a namespace typekro merely adopted.
|
|
137
213
|
const effectiveProps = await _preserveHoistedNamespaceAdoption(props, logger);
|
|
214
|
+
abortSignal?.throwIfAborted();
|
|
138
215
|
const { deployer, dispose } = await _resolveDeployer(effectiveProps, 'deployment');
|
|
139
216
|
try {
|
|
140
217
|
// Direct mode: hand the deployer the live state of this resource's dependencies so the engine
|
|
141
218
|
// resolves its cross-resource references + CEL expressions against them (the deps deployed
|
|
142
219
|
// first via alchemy ordering). KRO docs are self-contained, so the seed is irrelevant there.
|
|
143
220
|
const seedResources = _seedFromDependencies(effectiveProps);
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
221
|
+
// New direct declarations carry a canonical per-resource execution record. Decode that record
|
|
222
|
+
// to restore structured references and runtime metadata without interpreting flattened YAML or
|
|
223
|
+
// JSON strings. The scanner branch remains only for legacy Alchemy state created before these
|
|
224
|
+
// records existed.
|
|
225
|
+
let resourceForDeploy = _resourceFromKroArtifactBundle(effectiveProps) ??
|
|
226
|
+
_resourceFromDirectArtifactRecord(effectiveProps) ??
|
|
227
|
+
unwrapAlchemyRedactedResource(effectiveProps.resource);
|
|
228
|
+
if (resourceForDeploy === effectiveProps.resource &&
|
|
229
|
+
seedResources &&
|
|
230
|
+
effectiveProps.deploymentStrategy === 'direct') {
|
|
151
231
|
resourceForDeploy = _rehydrateCelStrings(effectiveProps.resource, new Set(seedResources.map((s) => s.id)));
|
|
152
232
|
}
|
|
153
233
|
else if (effectiveProps.deploymentStrategy === 'kro' &&
|
|
154
|
-
|
|
234
|
+
resourceForDeploy.kind === 'ResourceGraphDefinition' &&
|
|
235
|
+
!getReadinessEvaluator(resourceForDeploy)) {
|
|
236
|
+
const { resourceGraphDefinition } = await import('../factories/kro/resource-graph-definition.js');
|
|
237
|
+
const wrapped = resourceGraphDefinition(resourceForDeploy);
|
|
238
|
+
copyResourceMetadata(resourceForDeploy, wrapped);
|
|
239
|
+
resourceForDeploy = wrapped;
|
|
240
|
+
}
|
|
241
|
+
else if (effectiveProps.deploymentStrategy === 'kro' &&
|
|
242
|
+
resourceForDeploy.kind !== 'ResourceGraphDefinition') {
|
|
155
243
|
// KRO CR instance (the custom resource an RGD defines — not the RGD itself). After alchemy
|
|
156
244
|
// serializes props to state, the resource is a plain manifest with no readiness evaluator, so a
|
|
157
245
|
// `waitForReady` deploy throws "No readiness evaluator found for <Kind>". Re-wrap it with
|
|
@@ -159,18 +247,20 @@ async function deployKroResource(props) {
|
|
|
159
247
|
// InstanceSynced) — the same KRO-instance readiness the imperative deploy path waits on. The RGD
|
|
160
248
|
// is excluded (it carries its own evaluator via the resourceGraphDefinition factory).
|
|
161
249
|
const { kroCustomResource } = await import('../factories/kro/kro-custom-resource.js');
|
|
162
|
-
const r =
|
|
163
|
-
|
|
250
|
+
const r = resourceForDeploy;
|
|
251
|
+
const wrapped = kroCustomResource({
|
|
164
252
|
apiVersion: r.apiVersion ?? '',
|
|
165
253
|
kind: r.kind ?? '',
|
|
166
254
|
metadata: { ...(r.metadata ?? { name: '' }) },
|
|
167
255
|
spec: (r.spec ?? {}),
|
|
168
256
|
});
|
|
257
|
+
copyResourceMetadata(resourceForDeploy, wrapped);
|
|
258
|
+
resourceForDeploy = wrapped;
|
|
169
259
|
}
|
|
170
260
|
const deployProps = resourceForDeploy === effectiveProps.resource
|
|
171
261
|
? effectiveProps
|
|
172
262
|
: { ...effectiveProps, resource: resourceForDeploy };
|
|
173
|
-
const { resourceProperties } = await _deployAndCreateResult(deployProps, deployer, seedResources);
|
|
263
|
+
const { resourceProperties } = await _deployAndCreateResult(deployProps, deployer, seedResources, abortSignal);
|
|
174
264
|
_logDeploymentSuccess(logger, KRO_RESOURCE_TYPE, effectiveProps, resourceProperties);
|
|
175
265
|
return resourceProperties;
|
|
176
266
|
}
|
|
@@ -182,31 +272,7 @@ async function deployKroResource(props) {
|
|
|
182
272
|
await dispose();
|
|
183
273
|
}
|
|
184
274
|
}
|
|
185
|
-
|
|
186
|
-
* Pure drift verdict (no I/O) for a singleton instance being deployed, given:
|
|
187
|
-
* - `expectedFingerprint`: the spec-fingerprint annotation on the resource being deployed,
|
|
188
|
-
* - `deployingSpec`: that resource's spec,
|
|
189
|
-
* - `live`: the existing same-named owner on the cluster (or undefined if none).
|
|
190
|
-
*
|
|
191
|
-
* Mirrors the imperative `assertNoDeployedSingletonSpecDrift`, INCLUDING its fallback: an existing
|
|
192
|
-
* owner with NO fingerprint annotation (a legacy/unfingerprinted owner) is still verified by
|
|
193
|
-
* comparing serialized specs — so a different-spec legacy owner is NOT silently accepted.
|
|
194
|
-
*/
|
|
195
|
-
export function singletonDriftVerdict(expectedFingerprint, deployingSpec, live) {
|
|
196
|
-
if (!live)
|
|
197
|
-
return { drift: false };
|
|
198
|
-
const actual = live.metadata?.annotations?.[SINGLETON_SPEC_FINGERPRINT_ANNOTATION];
|
|
199
|
-
if (actual === expectedFingerprint)
|
|
200
|
-
return { drift: false };
|
|
201
|
-
if (actual) {
|
|
202
|
-
return { drift: true, reason: `existing fingerprint ${actual} does not match ${expectedFingerprint}` };
|
|
203
|
-
}
|
|
204
|
-
// Unfingerprinted (legacy) owner — fall back to comparing serialized specs.
|
|
205
|
-
if (stableSerialize(live.spec) !== stableSerialize(deployingSpec)) {
|
|
206
|
-
return { drift: true, reason: 'an existing unfingerprinted singleton owner has a different spec' };
|
|
207
|
-
}
|
|
208
|
-
return { drift: false };
|
|
209
|
-
}
|
|
275
|
+
export { singletonDriftVerdict } from '../core/deployment/singleton-owner-drift.js';
|
|
210
276
|
/**
|
|
211
277
|
* Refuse to deploy a singleton owner whose identity already exists on the cluster with a DIFFERENT
|
|
212
278
|
* spec — the declarative-path equivalent of the imperative `assertNoDeployedSingletonSpecDrift`. Only
|
|
@@ -470,7 +536,7 @@ function _seedFromDependencies(props) {
|
|
|
470
536
|
const seed = deps
|
|
471
537
|
.filter((d) => !!d?.deployedResource && !!d.resourceId)
|
|
472
538
|
.map((d) => {
|
|
473
|
-
const manifest = d.deployedResource;
|
|
539
|
+
const manifest = unwrapAlchemyRedactedResource(d.deployedResource);
|
|
474
540
|
return {
|
|
475
541
|
id: d.resourceId,
|
|
476
542
|
kind: manifest.kind ?? 'Unknown',
|
|
@@ -484,6 +550,192 @@ function _seedFromDependencies(props) {
|
|
|
484
550
|
});
|
|
485
551
|
return seed.length > 0 ? seed : undefined;
|
|
486
552
|
}
|
|
553
|
+
function unwrapAlchemyRedactedValue(value, seen = new WeakMap()) {
|
|
554
|
+
if (Redacted.isRedacted(value))
|
|
555
|
+
return Redacted.value(value);
|
|
556
|
+
if (!value || typeof value !== 'object')
|
|
557
|
+
return value;
|
|
558
|
+
const prior = seen.get(value);
|
|
559
|
+
if (prior !== undefined)
|
|
560
|
+
return prior;
|
|
561
|
+
if (Array.isArray(value)) {
|
|
562
|
+
const clone = [];
|
|
563
|
+
seen.set(value, clone);
|
|
564
|
+
value.forEach((entry) => clone.push(unwrapAlchemyRedactedValue(entry, seen)));
|
|
565
|
+
return clone;
|
|
566
|
+
}
|
|
567
|
+
const clone = {};
|
|
568
|
+
seen.set(value, clone);
|
|
569
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
570
|
+
clone[key] = unwrapAlchemyRedactedValue(entry, seen);
|
|
571
|
+
}
|
|
572
|
+
return clone;
|
|
573
|
+
}
|
|
574
|
+
function unwrapAlchemyRedactedResource(resource) {
|
|
575
|
+
const unwrapped = unwrapAlchemyRedactedValue(resource);
|
|
576
|
+
if (unwrapped !== resource)
|
|
577
|
+
copyResourceMetadata(resource, unwrapped);
|
|
578
|
+
return unwrapped;
|
|
579
|
+
}
|
|
580
|
+
function artifactOutputsForOperation(source, props, preserveSensitiveInputs, operationLabel) {
|
|
581
|
+
const expectedUses = collectArtifactOutputUses(source);
|
|
582
|
+
if (expectedUses.length === 0)
|
|
583
|
+
return undefined;
|
|
584
|
+
const declaredUses = props.artifactOutputUses ?? [];
|
|
585
|
+
if (canonicalStringArray(expectedUses.map((use) => JSON.stringify(use))) !==
|
|
586
|
+
canonicalStringArray(declaredUses.map((use) => JSON.stringify(use)))) {
|
|
587
|
+
throw new Error(`${operationLabel} artifact-output use metadata does not match its canonical artifact.`);
|
|
588
|
+
}
|
|
589
|
+
const requirements = new Map((props.artifactRequirements ?? []).map((requirement) => [requirement.id, requirement]));
|
|
590
|
+
const supplied = props.artifactOutputs ?? {};
|
|
591
|
+
const resolved = {};
|
|
592
|
+
for (const use of expectedUses) {
|
|
593
|
+
const requirement = requirements.get(use.requirementId);
|
|
594
|
+
if (!requirement || !requirement.outputs.includes(use.output)) {
|
|
595
|
+
throw new Error(`${operationLabel} is missing declaration metadata for artifact output ${use.requirementId}.${use.output}.`);
|
|
596
|
+
}
|
|
597
|
+
const outputs = supplied[use.requirementId];
|
|
598
|
+
if (!outputs || !Object.hasOwn(outputs, use.output)) {
|
|
599
|
+
throw new Error(`${operationLabel} is missing resolved artifact output ${use.requirementId}.${use.output}.`);
|
|
600
|
+
}
|
|
601
|
+
const value = outputs[use.output];
|
|
602
|
+
if (use.sensitive && !Redacted.isRedacted(value)) {
|
|
603
|
+
throw new Error(`${operationLabel} sensitive artifact output ${use.requirementId}.${use.output} must be supplied as an Alchemy Redacted input.`);
|
|
604
|
+
}
|
|
605
|
+
const concreteValue = Redacted.isRedacted(value) ? Redacted.value(value) : value;
|
|
606
|
+
if (props.deploymentStrategy === 'kro' && typeof concreteValue !== 'string') {
|
|
607
|
+
throw new Error(`${operationLabel} artifact output ${use.requirementId}.${use.output} must be a string in KRO mode.`);
|
|
608
|
+
}
|
|
609
|
+
const requirementOutputs = resolved[use.requirementId] ?? {};
|
|
610
|
+
requirementOutputs[use.output] =
|
|
611
|
+
Redacted.isRedacted(value) && !preserveSensitiveInputs ? Redacted.value(value) : value;
|
|
612
|
+
resolved[use.requirementId] = requirementOutputs;
|
|
613
|
+
}
|
|
614
|
+
return resolved;
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* Decode one operation from the canonical KRO outer bundle persisted by
|
|
618
|
+
* Alchemy. The operation record, rather than the JSON-flattened resource, is
|
|
619
|
+
* authoritative for desired state and runtime metadata in new declarations.
|
|
620
|
+
*/
|
|
621
|
+
function _resourceFromKroArtifactBundle(props, preserveSensitiveInputs = false) {
|
|
622
|
+
const encodedBundle = props.kroArtifactBundle;
|
|
623
|
+
const operationId = props.kroArtifactOperationId;
|
|
624
|
+
if (encodedBundle === undefined && operationId === undefined)
|
|
625
|
+
return undefined;
|
|
626
|
+
if (encodedBundle === undefined || operationId === undefined) {
|
|
627
|
+
throw new Error('KRO artifact state is incomplete: both kroArtifactBundle and kroArtifactOperationId are required.');
|
|
628
|
+
}
|
|
629
|
+
const bundle = decodeKroArtifactBundle(encodedBundle);
|
|
630
|
+
const operation = bundle.operations.find((candidate) => candidate.id === operationId);
|
|
631
|
+
if (!operation) {
|
|
632
|
+
throw new Error(`KRO artifact bundle ${bundle.bundleDigest} has no operation ${operationId}.`);
|
|
633
|
+
}
|
|
634
|
+
if (props.resourceId !== undefined && props.resourceId !== operation.artifact.id) {
|
|
635
|
+
throw new Error(`KRO artifact operation ${operationId} belongs to ${operation.artifact.id}, not ${props.resourceId}.`);
|
|
636
|
+
}
|
|
637
|
+
const dependencyOutputs = props.dependencies ?? [];
|
|
638
|
+
const missingOperationIds = dependencyOutputs.filter((dependency) => typeof dependency.kroArtifactOperationId !== 'string');
|
|
639
|
+
if (missingOperationIds.length > 0) {
|
|
640
|
+
throw new Error(`KRO artifact dependency mismatch for ${operationId}: ${missingOperationIds.length} dependency output(s) have no operation identity.`);
|
|
641
|
+
}
|
|
642
|
+
const suppliedDependencies = dependencyOutputs.map((dependency) => dependency.kroArtifactOperationId);
|
|
643
|
+
if (canonicalStringArray(suppliedDependencies) !== canonicalStringArray(operation.dependencies)) {
|
|
644
|
+
throw new Error(`KRO artifact dependency mismatch for ${operationId}: expected [${operation.dependencies.join(', ')}], received [${suppliedDependencies.join(', ')}].`);
|
|
645
|
+
}
|
|
646
|
+
const requiredBindings = planValueSensitiveBindingNames(operation.manifest);
|
|
647
|
+
const suppliedBindings = props.sensitiveBindings ?? {};
|
|
648
|
+
const missingBindings = requiredBindings.filter((binding) => !Object.hasOwn(suppliedBindings, binding));
|
|
649
|
+
if (missingBindings.length > 0) {
|
|
650
|
+
throw new Error(`KRO artifact operation ${operationId} is missing sensitive binding(s): ${missingBindings.join(', ')}.`);
|
|
651
|
+
}
|
|
652
|
+
const sensitive = Object.fromEntries(requiredBindings.map((binding) => {
|
|
653
|
+
const value = suppliedBindings[binding];
|
|
654
|
+
if (!Redacted.isRedacted(value)) {
|
|
655
|
+
throw new Error(`KRO artifact sensitive binding ${binding} must be supplied as an Alchemy Redacted input.`);
|
|
656
|
+
}
|
|
657
|
+
return [binding, preserveSensitiveInputs ? value : Redacted.value(value)];
|
|
658
|
+
}));
|
|
659
|
+
const artifactOutputs = artifactOutputsForOperation(operation.manifest, props, preserveSensitiveInputs, `KRO artifact operation ${operationId}`);
|
|
660
|
+
const resource = materializeKroArtifactBundleOperation(operation, {
|
|
661
|
+
...(Object.keys(sensitive).length > 0 ? { sensitive } : {}),
|
|
662
|
+
...(artifactOutputs ? { artifactOutputs } : {}),
|
|
663
|
+
});
|
|
664
|
+
Object.defineProperty(resource, 'id', {
|
|
665
|
+
value: operation.artifact.id,
|
|
666
|
+
configurable: true,
|
|
667
|
+
enumerable: false,
|
|
668
|
+
});
|
|
669
|
+
setResourceId(resource, operation.artifact.id);
|
|
670
|
+
if (operation.artifact.identity?.scope) {
|
|
671
|
+
setMetadataField(resource, 'scope', operation.artifact.identity.scope);
|
|
672
|
+
}
|
|
673
|
+
setMetadataField(resource, 'applyPolicy', operation.artifact.apply);
|
|
674
|
+
const strategy = operation.artifact.readiness.strategy;
|
|
675
|
+
if (strategy?.kind === 'runtime-binding') {
|
|
676
|
+
const evaluator = getReadinessEvaluator(props.resource);
|
|
677
|
+
if (!evaluator) {
|
|
678
|
+
throw new Error(`KRO readiness binding ${strategy.binding} is unavailable for operation ${operationId}.`);
|
|
679
|
+
}
|
|
680
|
+
setReadinessEvaluator(resource, evaluator);
|
|
681
|
+
}
|
|
682
|
+
else if (strategy?.kind === 'registered') {
|
|
683
|
+
const evaluator = resolvePortableReadinessStrategy(strategy);
|
|
684
|
+
if (!evaluator) {
|
|
685
|
+
throw new Error(`Registered readiness strategy ${strategy.id}@${strategy.revision} is unavailable for KRO operation ${operationId}.`);
|
|
686
|
+
}
|
|
687
|
+
setReadinessEvaluator(resource, evaluator);
|
|
688
|
+
}
|
|
689
|
+
return resource;
|
|
690
|
+
}
|
|
691
|
+
/** Internal test hook for canonical KRO-bundle state rehydration. */
|
|
692
|
+
export const resourceFromKroArtifactBundleForTest = _resourceFromKroArtifactBundle;
|
|
693
|
+
/**
|
|
694
|
+
* Decode the canonical direct execution record and reconstruct the exact
|
|
695
|
+
* runtime manifest contract. This is the authoritative Alchemy path for new
|
|
696
|
+
* declarations; the string rehydration below remains legacy-state support.
|
|
697
|
+
*/
|
|
698
|
+
function _resourceFromDirectArtifactRecord(props, preserveSensitiveInputs = false) {
|
|
699
|
+
if (props.deploymentStrategy !== 'direct' || !props.artifactExecutionRecord)
|
|
700
|
+
return undefined;
|
|
701
|
+
const record = decodeDirectArtifactExecutionRecord(props.artifactExecutionRecord);
|
|
702
|
+
const logicalId = record.artifact.sourceNodeId ?? record.artifact.id;
|
|
703
|
+
if (props.resourceId !== undefined && props.resourceId !== logicalId) {
|
|
704
|
+
throw new Error(`Direct artifact record ${record.artifact.id} belongs to ${logicalId}, not ${props.resourceId}.`);
|
|
705
|
+
}
|
|
706
|
+
const suppliedDependencies = (props.dependencies ?? [])
|
|
707
|
+
.map((dependency) => dependency.resourceId)
|
|
708
|
+
.filter((resourceId) => typeof resourceId === 'string')
|
|
709
|
+
.sort();
|
|
710
|
+
if (canonicalStringArray(suppliedDependencies) !== canonicalStringArray(record.dependencies)) {
|
|
711
|
+
throw new Error(`Direct artifact dependency mismatch for ${logicalId}: expected [${record.dependencies.join(', ')}], received [${suppliedDependencies.join(', ')}].`);
|
|
712
|
+
}
|
|
713
|
+
const evaluator = getReadinessEvaluator(props.resource);
|
|
714
|
+
const strategy = record.artifact.readiness.strategy;
|
|
715
|
+
const readinessEvaluators = strategy?.kind === 'runtime-binding' && evaluator
|
|
716
|
+
? { [strategy.binding]: evaluator }
|
|
717
|
+
: undefined;
|
|
718
|
+
const sensitive = Object.fromEntries(Object.entries(props.sensitiveBindings ?? {}).map(([binding, value]) => {
|
|
719
|
+
if (!Redacted.isRedacted(value)) {
|
|
720
|
+
throw new Error(`Direct artifact sensitive binding ${binding} must be supplied as an Alchemy Redacted input.`);
|
|
721
|
+
}
|
|
722
|
+
return [binding, preserveSensitiveInputs ? value : Redacted.value(value)];
|
|
723
|
+
}));
|
|
724
|
+
const artifactOutputs = artifactOutputsForOperation(record.artifact, props, preserveSensitiveInputs, `Direct artifact ${logicalId}`);
|
|
725
|
+
return materializeDirectArtifactManifest(record.artifact, {
|
|
726
|
+
instanceName: props.resourceId ?? logicalId,
|
|
727
|
+
runtimeResources: { [logicalId]: props.resource },
|
|
728
|
+
...(Object.keys(sensitive).length > 0 ? { sensitive } : {}),
|
|
729
|
+
...(artifactOutputs ? { artifactOutputs } : {}),
|
|
730
|
+
...(readinessEvaluators ? { readinessEvaluators } : {}),
|
|
731
|
+
resolveReadinessStrategy: resolvePortableReadinessStrategy,
|
|
732
|
+
}, props.resourceId ?? logicalId);
|
|
733
|
+
}
|
|
734
|
+
/** Internal test hook for canonical direct-artifact state rehydration. */
|
|
735
|
+
export const resourceFromDirectArtifactRecordForTest = _resourceFromDirectArtifactRecord;
|
|
736
|
+
function canonicalStringArray(values) {
|
|
737
|
+
return JSON.stringify([...new Set(values)].sort());
|
|
738
|
+
}
|
|
487
739
|
/**
|
|
488
740
|
* Deep-clone `value`, converting strings that contain a `${dependencyId.…}` placeholder into a
|
|
489
741
|
* template {@link CelExpression} object so the engine resolver evaluates them (alchemy's state
|
|
@@ -537,6 +789,15 @@ function propsFromOutput(output) {
|
|
|
537
789
|
return {
|
|
538
790
|
resource: output.resource,
|
|
539
791
|
...(output.resourceId !== undefined && { resourceId: output.resourceId }),
|
|
792
|
+
...(output.artifactExecutionRecord !== undefined && {
|
|
793
|
+
artifactExecutionRecord: output.artifactExecutionRecord,
|
|
794
|
+
}),
|
|
795
|
+
...(output.kroArtifactBundle !== undefined && {
|
|
796
|
+
kroArtifactBundle: output.kroArtifactBundle,
|
|
797
|
+
}),
|
|
798
|
+
...(output.kroArtifactOperationId !== undefined && {
|
|
799
|
+
kroArtifactOperationId: output.kroArtifactOperationId,
|
|
800
|
+
}),
|
|
540
801
|
namespace: output.namespace,
|
|
541
802
|
deploymentStrategy: output.deploymentStrategy ?? 'kro',
|
|
542
803
|
...(output.kubeConfigOptions !== undefined && { kubeConfigOptions: output.kubeConfigOptions }),
|
|
@@ -558,8 +819,12 @@ function _createClientProvider(props, phase) {
|
|
|
558
819
|
hasCluster: !!props.kubeConfigOptions?.cluster,
|
|
559
820
|
hasUser: !!props.kubeConfigOptions?.user,
|
|
560
821
|
});
|
|
561
|
-
//
|
|
562
|
-
|
|
822
|
+
// Resolve named host bindings only inside the provider operation. Durable state contains
|
|
823
|
+
// binding identities, never the credential bytes they produce.
|
|
824
|
+
const kubeConfigOptions = props.kubeConfigOptions
|
|
825
|
+
? materializeSerializableKubeConfigOptions(props.kubeConfigOptions)
|
|
826
|
+
: undefined;
|
|
827
|
+
const clientProvider = createKubernetesClientProvider(kubeConfigOptions);
|
|
563
828
|
// Get the configured KubeConfig from the provider
|
|
564
829
|
const kubeConfig = clientProvider.getKubeConfig();
|
|
565
830
|
alchemyLogger.debug(`KubernetesClientProvider created successfully (${phase} phase)`, {
|
|
@@ -580,11 +845,32 @@ async function _createDeployer(kc, props) {
|
|
|
580
845
|
return new DirectTypeKroDeployer(engine);
|
|
581
846
|
}
|
|
582
847
|
const kroDeletion = props.kroDeletion ?? inferKroDeletionOptions(props);
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
848
|
+
const validateInstanceSpec = shouldValidateKroInstanceAdmission(props);
|
|
849
|
+
return new KroTypeKroDeployer(engine, {
|
|
850
|
+
...(validateInstanceSpec ? { validateInstanceSpec: true } : {}),
|
|
851
|
+
...(kroDeletion
|
|
852
|
+
? {
|
|
853
|
+
deleteInstance: (name, abortSignal) => deleteKroInstanceFinalizerSafe(kc, name, kroDeletion, abortSignal),
|
|
854
|
+
shouldSkipRgdDelete: (_rgdName, abortSignal) => hasKroInstances(kc, kroDeletion, abortSignal),
|
|
855
|
+
deleteResourceGraphDefinition: (_rgdName, abortSignal) => deleteKroDefinition(kc, kroDeletion, undefined, abortSignal),
|
|
856
|
+
}
|
|
857
|
+
: {}),
|
|
858
|
+
});
|
|
859
|
+
}
|
|
860
|
+
function shouldValidateKroInstanceAdmission(props) {
|
|
861
|
+
if (props.deploymentStrategy !== 'kro')
|
|
862
|
+
return false;
|
|
863
|
+
if (props.kroArtifactBundle !== undefined || props.kroArtifactOperationId !== undefined) {
|
|
864
|
+
if (props.kroArtifactBundle === undefined || props.kroArtifactOperationId === undefined) {
|
|
865
|
+
return false;
|
|
866
|
+
}
|
|
867
|
+
const bundle = decodeKroArtifactBundle(props.kroArtifactBundle);
|
|
868
|
+
const operation = bundle.operations.find((candidate) => candidate.id === props.kroArtifactOperationId);
|
|
869
|
+
return operation?.role === 'instance' || operation?.role === 'singleton-owner-instance';
|
|
870
|
+
}
|
|
871
|
+
// Legacy Alchemy declarations predate operation roles. Their KRO resources are
|
|
872
|
+
// either the RGD itself or its root custom resource instance.
|
|
873
|
+
return props.resource.kind !== 'ResourceGraphDefinition';
|
|
588
874
|
}
|
|
589
875
|
function fullApiVersion(apiVersion, group) {
|
|
590
876
|
if (typeof apiVersion !== 'string' || apiVersion.length === 0)
|
|
@@ -614,7 +900,9 @@ function inferKroDeletionOptions(props) {
|
|
|
614
900
|
apiVersion,
|
|
615
901
|
kind: schema.kind,
|
|
616
902
|
...(typeof schema.group === 'string' && { group: schema.group }),
|
|
617
|
-
namespace: typeof resource.metadata.namespace === 'string'
|
|
903
|
+
namespace: typeof resource.metadata.namespace === 'string'
|
|
904
|
+
? resource.metadata.namespace
|
|
905
|
+
: props.namespace,
|
|
618
906
|
rgdName: resource.metadata.name,
|
|
619
907
|
timeout: props.options?.timeout ?? DEFAULT_DEPLOYMENT_TIMEOUT,
|
|
620
908
|
};
|
|
@@ -630,7 +918,9 @@ function inferKroDeletionOptions(props) {
|
|
|
630
918
|
apiVersion: resource.apiVersion,
|
|
631
919
|
kind: resource.kind,
|
|
632
920
|
...(group && { group }),
|
|
633
|
-
namespace: typeof resource.metadata?.namespace === 'string'
|
|
921
|
+
namespace: typeof resource.metadata?.namespace === 'string'
|
|
922
|
+
? resource.metadata.namespace
|
|
923
|
+
: props.namespace,
|
|
634
924
|
rgdName,
|
|
635
925
|
timeout: props.options?.timeout ?? DEFAULT_DEPLOYMENT_TIMEOUT,
|
|
636
926
|
};
|
|
@@ -657,7 +947,8 @@ async function _resolveDeployer(props, phase) {
|
|
|
657
947
|
* stacks' instances reference), we log and let alchemy drop the state entry — the orphaned
|
|
658
948
|
* RGD is cluster-scoped and dies with the cluster; it must not wedge the destroy.
|
|
659
949
|
*/
|
|
660
|
-
async function deleteKroResource(props) {
|
|
950
|
+
async function deleteKroResource(props, abortSignal) {
|
|
951
|
+
abortSignal?.throwIfAborted();
|
|
661
952
|
const logger = getComponentLogger('alchemy-deployment').child({ alchemyType: KRO_RESOURCE_TYPE });
|
|
662
953
|
// Retained (shared) resources — e.g. the KRO instance control-plane Namespace —
|
|
663
954
|
// must survive a single stack's teardown/prune: another stack targeting the same
|
|
@@ -689,6 +980,7 @@ async function deleteKroResource(props) {
|
|
|
689
980
|
return;
|
|
690
981
|
}
|
|
691
982
|
const kubeConfig = _createClientProvider(props, 'delete');
|
|
983
|
+
abortSignal?.throwIfAborted();
|
|
692
984
|
await deleteNamespaceIfEmpty(kubeConfig, namespaceName, {
|
|
693
985
|
logger,
|
|
694
986
|
// Ownership record (finding #4) + gated delete (finding #1): only delete a
|
|
@@ -697,14 +989,16 @@ async function deleteKroResource(props) {
|
|
|
697
989
|
...(props.options?.timeout !== undefined && { timeoutMs: props.options.timeout }),
|
|
698
990
|
context: { alchemyType: KRO_RESOURCE_TYPE },
|
|
699
991
|
});
|
|
992
|
+
abortSignal?.throwIfAborted();
|
|
700
993
|
return;
|
|
701
994
|
}
|
|
702
995
|
const { deployer, dispose } = await _resolveDeployer(props, 'delete');
|
|
703
996
|
try {
|
|
704
997
|
await deployer.delete(props.resource, {
|
|
705
|
-
mode:
|
|
998
|
+
mode: props.deploymentStrategy,
|
|
706
999
|
namespace: props.namespace,
|
|
707
1000
|
...props.options,
|
|
1001
|
+
...(abortSignal ? { abortSignal } : {}),
|
|
708
1002
|
});
|
|
709
1003
|
}
|
|
710
1004
|
catch (error) {
|
|
@@ -727,8 +1021,8 @@ export const deleteKroResourceForTest = deleteKroResource;
|
|
|
727
1021
|
/**
|
|
728
1022
|
* Deploy resource and create deployment result
|
|
729
1023
|
*/
|
|
730
|
-
async function _deployAndCreateResult(props, deployer, seedResources) {
|
|
731
|
-
const deploymentOptions = buildAlchemyDeploymentOptions(props);
|
|
1024
|
+
async function _deployAndCreateResult(props, deployer, seedResources, abortSignal) {
|
|
1025
|
+
const deploymentOptions = buildAlchemyDeploymentOptions(props, abortSignal);
|
|
732
1026
|
// Deploy using the created deployer. The deployer/engine resolves references + CEL expressions,
|
|
733
1027
|
// seeded (direct mode) with dependencies' live state so cross-resource refs resolve.
|
|
734
1028
|
const deployedResource = await deployer.deploy(props.resource, deploymentOptions, seedResources);
|
|
@@ -739,12 +1033,25 @@ async function _deployAndCreateResult(props, deployer, seedResources) {
|
|
|
739
1033
|
// structuredClone to throw "Cannot serialize unique symbol" errors.
|
|
740
1034
|
// 2. JSON round-trip strips symbols, functions, and undefined values — which is
|
|
741
1035
|
// exactly the behavior we want for creating clean Alchemy state entries.
|
|
742
|
-
const
|
|
743
|
-
|
|
1036
|
+
const stateResource = _resourceFromKroArtifactBundle(props, true) ??
|
|
1037
|
+
_resourceFromDirectArtifactRecord(props, true) ??
|
|
1038
|
+
redactSecretResourceForAlchemyState(props.resource);
|
|
1039
|
+
const stateDeployedResource = mergeLiveResourceState(stateResource, deployedResource);
|
|
1040
|
+
const cleanResource = cloneResourceForAlchemyState(stateResource);
|
|
1041
|
+
const cleanDeployedResource = cloneResourceForAlchemyState(stateDeployedResource, getResourceScope(cleanResource));
|
|
744
1042
|
// Create the resource properties for Alchemy
|
|
745
1043
|
const resourceProperties = {
|
|
746
1044
|
resource: cleanResource,
|
|
747
1045
|
...(props.resourceId !== undefined && { resourceId: props.resourceId }),
|
|
1046
|
+
...(props.artifactExecutionRecord !== undefined && {
|
|
1047
|
+
artifactExecutionRecord: props.artifactExecutionRecord,
|
|
1048
|
+
}),
|
|
1049
|
+
...(props.kroArtifactBundle !== undefined && {
|
|
1050
|
+
kroArtifactBundle: props.kroArtifactBundle,
|
|
1051
|
+
}),
|
|
1052
|
+
...(props.kroArtifactOperationId !== undefined && {
|
|
1053
|
+
kroArtifactOperationId: props.kroArtifactOperationId,
|
|
1054
|
+
}),
|
|
748
1055
|
namespace: props.namespace,
|
|
749
1056
|
deploymentStrategy: props.deploymentStrategy,
|
|
750
1057
|
...(props.kubeConfigOptions !== undefined && { kubeConfigOptions: props.kubeConfigOptions }),
|
|
@@ -759,7 +1066,7 @@ async function _deployAndCreateResult(props, deployer, seedResources) {
|
|
|
759
1066
|
return { resourceProperties };
|
|
760
1067
|
}
|
|
761
1068
|
function cloneResourceForAlchemyState(resource, fallbackScope) {
|
|
762
|
-
const cleanResource =
|
|
1069
|
+
const cleanResource = cloneAlchemyStateValue(resource);
|
|
763
1070
|
const scope = getResourceScope(resource) ??
|
|
764
1071
|
fallbackScope ??
|
|
765
1072
|
cleanResource.scope;
|
|
@@ -771,16 +1078,73 @@ function cloneResourceForAlchemyState(resource, fallbackScope) {
|
|
|
771
1078
|
}
|
|
772
1079
|
return cleanResource;
|
|
773
1080
|
}
|
|
1081
|
+
function cloneAlchemyStateValue(value, seen = new WeakMap()) {
|
|
1082
|
+
if (Redacted.isRedacted(value))
|
|
1083
|
+
return value;
|
|
1084
|
+
if (value === null || typeof value !== 'object') {
|
|
1085
|
+
return typeof value === 'function' || typeof value === 'symbol' || value === undefined
|
|
1086
|
+
? undefined
|
|
1087
|
+
: value;
|
|
1088
|
+
}
|
|
1089
|
+
if (value instanceof Date)
|
|
1090
|
+
return value.toJSON();
|
|
1091
|
+
const prior = seen.get(value);
|
|
1092
|
+
if (prior !== undefined)
|
|
1093
|
+
return prior;
|
|
1094
|
+
if (Array.isArray(value)) {
|
|
1095
|
+
const clone = [];
|
|
1096
|
+
seen.set(value, clone);
|
|
1097
|
+
value.forEach((entry) => clone.push(cloneAlchemyStateValue(entry, seen)));
|
|
1098
|
+
return clone;
|
|
1099
|
+
}
|
|
1100
|
+
const clone = {};
|
|
1101
|
+
seen.set(value, clone);
|
|
1102
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
1103
|
+
const cloned = cloneAlchemyStateValue(entry, seen);
|
|
1104
|
+
if (cloned !== undefined)
|
|
1105
|
+
clone[key] = cloned;
|
|
1106
|
+
}
|
|
1107
|
+
return clone;
|
|
1108
|
+
}
|
|
1109
|
+
function redactSecretResourceForAlchemyState(resource) {
|
|
1110
|
+
if (resource.kind !== 'Secret')
|
|
1111
|
+
return resource;
|
|
1112
|
+
const redactMap = (value) => {
|
|
1113
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
1114
|
+
return value;
|
|
1115
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
|
|
1116
|
+
key,
|
|
1117
|
+
Redacted.isRedacted(entry) ? entry : Redacted.make(entry),
|
|
1118
|
+
]));
|
|
1119
|
+
};
|
|
1120
|
+
return {
|
|
1121
|
+
...resource,
|
|
1122
|
+
...(Reflect.has(resource, 'data') ? { data: redactMap(Reflect.get(resource, 'data')) } : {}),
|
|
1123
|
+
...(Reflect.has(resource, 'stringData')
|
|
1124
|
+
? { stringData: redactMap(Reflect.get(resource, 'stringData')) }
|
|
1125
|
+
: {}),
|
|
1126
|
+
};
|
|
1127
|
+
}
|
|
1128
|
+
function mergeLiveResourceState(desired, live) {
|
|
1129
|
+
const liveMetadata = live.metadata;
|
|
1130
|
+
const runtimeMetadata = Object.fromEntries(['uid', 'resourceVersion', 'generation', 'creationTimestamp'].flatMap((key) => liveMetadata?.[key] === undefined ? [] : [[key, liveMetadata[key]]]));
|
|
1131
|
+
return {
|
|
1132
|
+
...desired,
|
|
1133
|
+
metadata: { ...(desired.metadata ?? { name: '' }), ...runtimeMetadata },
|
|
1134
|
+
...(Reflect.has(live, 'status') ? { status: Reflect.get(live, 'status') } : {}),
|
|
1135
|
+
};
|
|
1136
|
+
}
|
|
774
1137
|
/** Internal test hook for Alchemy state serialization semantics. */
|
|
775
1138
|
export const cloneResourceForAlchemyStateForTest = cloneResourceForAlchemyState;
|
|
776
|
-
export function buildAlchemyDeploymentOptions(props) {
|
|
1139
|
+
export function buildAlchemyDeploymentOptions(props, abortSignal) {
|
|
777
1140
|
const { waitForReady, timeout, ...deploymentMetadataOptions } = props.options ?? {};
|
|
778
1141
|
return {
|
|
779
|
-
mode:
|
|
1142
|
+
mode: props.deploymentStrategy,
|
|
780
1143
|
namespace: props.namespace,
|
|
781
1144
|
...deploymentMetadataOptions,
|
|
782
1145
|
waitForReady: waitForReady ?? true,
|
|
783
1146
|
timeout: timeout ?? DEFAULT_DEPLOYMENT_TIMEOUT,
|
|
1147
|
+
...(abortSignal ? { abortSignal } : {}),
|
|
784
1148
|
};
|
|
785
1149
|
}
|
|
786
1150
|
/**
|