typekro 0.7.0 → 0.9.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/alchemy/deployers.d.ts +16 -1
- package/dist/alchemy/deployers.d.ts.map +1 -1
- package/dist/alchemy/deployers.js +131 -18
- package/dist/alchemy/deployers.js.map +1 -1
- package/dist/alchemy/deployment.d.ts +1 -1
- package/dist/alchemy/deployment.d.ts.map +1 -1
- package/dist/alchemy/deployment.js +1 -1
- package/dist/alchemy/deployment.js.map +1 -1
- package/dist/alchemy/kro-delete.d.ts +66 -0
- package/dist/alchemy/kro-delete.d.ts.map +1 -0
- package/dist/alchemy/kro-delete.js +183 -0
- package/dist/alchemy/kro-delete.js.map +1 -0
- package/dist/alchemy/resource-registration.d.ts +16 -0
- package/dist/alchemy/resource-registration.d.ts.map +1 -1
- package/dist/alchemy/resource-registration.js +138 -24
- package/dist/alchemy/resource-registration.js.map +1 -1
- package/dist/alchemy/types.d.ts +8 -4
- package/dist/alchemy/types.d.ts.map +1 -1
- package/dist/compositions/typekro-runtime/typekro-runtime.d.ts +1 -1
- package/dist/compositions/typekro-runtime/typekro-runtime.d.ts.map +1 -1
- package/dist/compositions/typekro-runtime/typekro-runtime.js +39 -7
- package/dist/compositions/typekro-runtime/typekro-runtime.js.map +1 -1
- package/dist/core/composition/context.d.ts +58 -2
- package/dist/core/composition/context.d.ts.map +1 -1
- package/dist/core/composition/context.js +4 -0
- package/dist/core/composition/context.js.map +1 -1
- package/dist/core/composition/imperative.d.ts +9 -0
- package/dist/core/composition/imperative.d.ts.map +1 -1
- package/dist/core/composition/imperative.js +538 -54
- package/dist/core/composition/imperative.js.map +1 -1
- package/dist/core/composition/nested-status-cel.d.ts +34 -1
- package/dist/core/composition/nested-status-cel.d.ts.map +1 -1
- package/dist/core/composition/nested-status-cel.js +379 -41
- package/dist/core/composition/nested-status-cel.js.map +1 -1
- package/dist/core/composition-debugger.d.ts +1 -1
- package/dist/core/composition-debugger.d.ts.map +1 -1
- package/dist/core/composition-debugger.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/containers/build.d.ts +4 -4
- package/dist/core/containers/build.d.ts.map +1 -1
- package/dist/core/containers/build.js +44 -16
- package/dist/core/containers/build.js.map +1 -1
- package/dist/core/containers/registries/types.d.ts +1 -1
- package/dist/core/containers/registries/types.d.ts.map +1 -1
- package/dist/core/dependencies/resolver.d.ts +19 -0
- package/dist/core/dependencies/resolver.d.ts.map +1 -1
- package/dist/core/dependencies/resolver.js +261 -1
- package/dist/core/dependencies/resolver.js.map +1 -1
- package/dist/core/deployment/client-provider-manager.d.ts +9 -3
- package/dist/core/deployment/client-provider-manager.d.ts.map +1 -1
- package/dist/core/deployment/client-provider-manager.js +12 -0
- package/dist/core/deployment/client-provider-manager.js.map +1 -1
- package/dist/core/deployment/crd-manager.d.ts +24 -0
- package/dist/core/deployment/crd-manager.d.ts.map +1 -1
- package/dist/core/deployment/crd-manager.js +79 -1
- package/dist/core/deployment/crd-manager.js.map +1 -1
- package/dist/core/deployment/deployment-state-discovery.d.ts +116 -0
- package/dist/core/deployment/deployment-state-discovery.d.ts.map +1 -0
- package/dist/core/deployment/deployment-state-discovery.js +400 -0
- package/dist/core/deployment/deployment-state-discovery.js.map +1 -0
- package/dist/core/deployment/direct-factory.d.ts +65 -6
- package/dist/core/deployment/direct-factory.d.ts.map +1 -1
- package/dist/core/deployment/direct-factory.js +551 -56
- package/dist/core/deployment/direct-factory.js.map +1 -1
- package/dist/core/deployment/engine.d.ts +64 -3
- package/dist/core/deployment/engine.d.ts.map +1 -1
- package/dist/core/deployment/engine.js +194 -27
- package/dist/core/deployment/engine.js.map +1 -1
- package/dist/core/deployment/event-filter.js +1 -1
- package/dist/core/deployment/event-filter.js.map +1 -1
- package/dist/core/deployment/event-monitor.d.ts +11 -0
- package/dist/core/deployment/event-monitor.d.ts.map +1 -1
- package/dist/core/deployment/event-monitor.js +14 -0
- package/dist/core/deployment/event-monitor.js.map +1 -1
- package/dist/core/deployment/handle-tracing.d.ts +14 -0
- package/dist/core/deployment/handle-tracing.d.ts.map +1 -0
- package/dist/core/deployment/handle-tracing.js +38 -0
- package/dist/core/deployment/handle-tracing.js.map +1 -0
- package/dist/core/deployment/kro-factory.d.ts +136 -3
- package/dist/core/deployment/kro-factory.d.ts.map +1 -1
- package/dist/core/deployment/kro-factory.js +945 -268
- package/dist/core/deployment/kro-factory.js.map +1 -1
- package/dist/core/deployment/kro-readiness.d.ts.map +1 -1
- package/dist/core/deployment/kro-readiness.js +21 -12
- package/dist/core/deployment/kro-readiness.js.map +1 -1
- package/dist/core/deployment/nested-composition-status.d.ts +1 -1
- package/dist/core/deployment/nested-composition-status.d.ts.map +1 -1
- package/dist/core/deployment/nested-composition-status.js +96 -53
- package/dist/core/deployment/nested-composition-status.js.map +1 -1
- package/dist/core/deployment/resource-applier.d.ts +15 -2
- package/dist/core/deployment/resource-applier.d.ts.map +1 -1
- package/dist/core/deployment/resource-applier.js +75 -25
- package/dist/core/deployment/resource-applier.js.map +1 -1
- package/dist/core/deployment/resource-tagging.d.ts +220 -0
- package/dist/core/deployment/resource-tagging.d.ts.map +1 -0
- package/dist/core/deployment/resource-tagging.js +292 -0
- package/dist/core/deployment/resource-tagging.js.map +1 -0
- package/dist/core/deployment/rollback-manager.d.ts +25 -4
- package/dist/core/deployment/rollback-manager.d.ts.map +1 -1
- package/dist/core/deployment/rollback-manager.js +70 -57
- package/dist/core/deployment/rollback-manager.js.map +1 -1
- package/dist/core/deployment/shared-utilities.d.ts +6 -0
- package/dist/core/deployment/shared-utilities.d.ts.map +1 -1
- package/dist/core/deployment/shared-utilities.js +32 -2
- package/dist/core/deployment/shared-utilities.js.map +1 -1
- package/dist/core/deployment/singleton-owner-drift.d.ts +16 -0
- package/dist/core/deployment/singleton-owner-drift.d.ts.map +1 -0
- package/dist/core/deployment/singleton-owner-drift.js +54 -0
- package/dist/core/deployment/singleton-owner-drift.js.map +1 -0
- package/dist/core/deployment/strategies/alchemy-strategy.d.ts +3 -1
- package/dist/core/deployment/strategies/alchemy-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/alchemy-strategy.js +121 -18
- package/dist/core/deployment/strategies/alchemy-strategy.js.map +1 -1
- package/dist/core/deployment/strategies/base-strategy.d.ts +9 -3
- package/dist/core/deployment/strategies/base-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/base-strategy.js +32 -4
- package/dist/core/deployment/strategies/base-strategy.js.map +1 -1
- package/dist/core/deployment/strategies/direct-strategy.d.ts +12 -4
- package/dist/core/deployment/strategies/direct-strategy.d.ts.map +1 -1
- package/dist/core/deployment/strategies/direct-strategy.js +112 -8
- package/dist/core/deployment/strategies/direct-strategy.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/cache.d.ts +2 -2
- package/dist/core/expressions/analysis/cache.d.ts.map +1 -1
- package/dist/core/expressions/analysis/cache.js +4 -0
- package/dist/core/expressions/analysis/cache.js.map +1 -1
- package/dist/core/expressions/analysis/fn-toString-self-test.d.ts.map +1 -1
- package/dist/core/expressions/analysis/fn-toString-self-test.js +0 -1
- package/dist/core/expressions/analysis/fn-toString-self-test.js.map +1 -1
- package/dist/core/expressions/analysis/shared-types.d.ts +2 -2
- package/dist/core/expressions/analysis/shared-types.d.ts.map +1 -1
- package/dist/core/expressions/analysis/source-map.d.ts.map +1 -1
- package/dist/core/expressions/analysis/source-map.js +1 -0
- package/dist/core/expressions/analysis/source-map.js.map +1 -1
- package/dist/core/expressions/analysis/types.d.ts +7 -7
- package/dist/core/expressions/analysis/types.d.ts.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-helpers.d.ts +37 -3
- package/dist/core/expressions/composition/composition-analyzer-helpers.d.ts.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-helpers.js +370 -7
- package/dist/core/expressions/composition/composition-analyzer-helpers.js.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-ternary.d.ts +2 -2
- package/dist/core/expressions/composition/composition-analyzer-ternary.d.ts.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-ternary.js +264 -29
- 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 +78 -6
- package/dist/core/expressions/composition/composition-analyzer-traversal.js.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-types.d.ts +60 -0
- package/dist/core/expressions/composition/composition-analyzer-types.d.ts.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer.d.ts +1 -1
- package/dist/core/expressions/composition/composition-analyzer.d.ts.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer.js +158 -8
- package/dist/core/expressions/composition/composition-analyzer.js.map +1 -1
- package/dist/core/expressions/composition/expression-analyzer.d.ts.map +1 -1
- package/dist/core/expressions/composition/expression-analyzer.js +21 -4
- package/dist/core/expressions/composition/expression-analyzer.js.map +1 -1
- package/dist/core/expressions/composition/imperative-analyzer.d.ts +1 -1
- package/dist/core/expressions/composition/imperative-analyzer.d.ts.map +1 -1
- package/dist/core/expressions/composition/imperative-analyzer.js +31 -7
- package/dist/core/expressions/composition/imperative-analyzer.js.map +1 -1
- package/dist/core/expressions/composition/scope-manager.d.ts +2 -2
- package/dist/core/expressions/composition/scope-manager.d.ts.map +1 -1
- package/dist/core/expressions/composition/scope-manager.js.map +1 -1
- package/dist/core/expressions/conditional/conditional-expression-processor.d.ts +3 -3
- package/dist/core/expressions/conditional/conditional-expression-processor.d.ts.map +1 -1
- package/dist/core/expressions/conditional/conditional-expression-processor.js.map +1 -1
- package/dist/core/expressions/conditional/conditional-integration.d.ts.map +1 -1
- package/dist/core/expressions/conditional/conditional-integration.js.map +1 -1
- package/dist/core/expressions/context/context-aware-generator.d.ts +5 -5
- package/dist/core/expressions/context/context-aware-generator.d.ts.map +1 -1
- package/dist/core/expressions/context/context-aware-generator.js.map +1 -1
- package/dist/core/expressions/context/context-detector.d.ts +3 -3
- package/dist/core/expressions/context/context-detector.d.ts.map +1 -1
- package/dist/core/expressions/context/context-detector.js.map +1 -1
- package/dist/core/expressions/context/context-validator.d.ts +6 -6
- package/dist/core/expressions/context/context-validator.d.ts.map +1 -1
- package/dist/core/expressions/context/context-validator.js +2 -2
- package/dist/core/expressions/context/context-validator.js.map +1 -1
- package/dist/core/expressions/factory/cel-conversion-engine.d.ts +4 -4
- package/dist/core/expressions/factory/cel-conversion-engine.d.ts.map +1 -1
- package/dist/core/expressions/factory/cel-conversion-engine.js.map +1 -1
- package/dist/core/expressions/factory/dependency-tracker.d.ts +2 -2
- package/dist/core/expressions/factory/dependency-tracker.d.ts.map +1 -1
- package/dist/core/expressions/factory/dependency-tracker.js +21 -5
- package/dist/core/expressions/factory/dependency-tracker.js.map +1 -1
- package/dist/core/expressions/factory/factory-integration.d.ts +2 -4
- package/dist/core/expressions/factory/factory-integration.d.ts.map +1 -1
- package/dist/core/expressions/factory/factory-integration.js +0 -6
- package/dist/core/expressions/factory/factory-integration.js.map +1 -1
- package/dist/core/expressions/factory/factory-pattern-handler.d.ts +3 -3
- package/dist/core/expressions/factory/factory-pattern-handler.d.ts.map +1 -1
- package/dist/core/expressions/factory/factory-pattern-handler.js +1 -0
- package/dist/core/expressions/factory/factory-pattern-handler.js.map +1 -1
- package/dist/core/expressions/factory/migration-helpers.js.map +1 -1
- package/dist/core/expressions/factory/resource-analyzer.d.ts +4 -4
- package/dist/core/expressions/factory/resource-analyzer.d.ts.map +1 -1
- package/dist/core/expressions/factory/resource-analyzer.js.map +1 -1
- package/dist/core/expressions/factory/resource-type-validator.d.ts +5 -5
- package/dist/core/expressions/factory/resource-type-validator.d.ts.map +1 -1
- package/dist/core/expressions/factory/resource-type-validator.js.map +1 -1
- package/dist/core/expressions/factory/status-builder-analyzer.d.ts +6 -7
- package/dist/core/expressions/factory/status-builder-analyzer.d.ts.map +1 -1
- package/dist/core/expressions/factory/status-builder-analyzer.js +0 -3
- package/dist/core/expressions/factory/status-builder-analyzer.js.map +1 -1
- package/dist/core/expressions/factory/status-builder-types.d.ts +1 -1
- package/dist/core/expressions/factory/status-builder-types.d.ts.map +1 -1
- package/dist/core/expressions/factory/status-cel-generation.d.ts +1 -1
- package/dist/core/expressions/factory/status-cel-generation.d.ts.map +1 -1
- package/dist/core/expressions/factory/status-cel-generation.js +1 -1
- package/dist/core/expressions/factory/status-cel-generation.js.map +1 -1
- package/dist/core/expressions/factory/status-field-analysis.d.ts +3 -3
- package/dist/core/expressions/factory/status-field-analysis.d.ts.map +1 -1
- package/dist/core/expressions/factory/status-field-analysis.js.map +1 -1
- package/dist/core/expressions/magic-proxy/magic-assignable-analyzer.d.ts +5 -5
- package/dist/core/expressions/magic-proxy/magic-assignable-analyzer.d.ts.map +1 -1
- package/dist/core/expressions/magic-proxy/magic-assignable-analyzer.js +1 -1
- package/dist/core/expressions/magic-proxy/magic-assignable-analyzer.js.map +1 -1
- package/dist/core/expressions/magic-proxy/magic-proxy-analyzer.d.ts +10 -10
- package/dist/core/expressions/magic-proxy/magic-proxy-analyzer.d.ts.map +1 -1
- package/dist/core/expressions/magic-proxy/magic-proxy-analyzer.js +5 -1
- package/dist/core/expressions/magic-proxy/magic-proxy-analyzer.js.map +1 -1
- package/dist/core/expressions/magic-proxy/magic-proxy-ast.d.ts +2 -2
- package/dist/core/expressions/magic-proxy/magic-proxy-ast.d.ts.map +1 -1
- package/dist/core/expressions/magic-proxy/magic-proxy-ast.js.map +1 -1
- package/dist/core/expressions/magic-proxy/magic-proxy-detector.d.ts +5 -5
- package/dist/core/expressions/magic-proxy/magic-proxy-detector.d.ts.map +1 -1
- package/dist/core/expressions/magic-proxy/magic-proxy-detector.js.map +1 -1
- package/dist/core/expressions/magic-proxy/magic-proxy-types.d.ts +2 -2
- package/dist/core/expressions/magic-proxy/magic-proxy-types.d.ts.map +1 -1
- package/dist/core/expressions/magic-proxy/optionality-handler.d.ts +1 -2
- package/dist/core/expressions/magic-proxy/optionality-handler.d.ts.map +1 -1
- package/dist/core/expressions/magic-proxy/optionality-handler.js +2 -15
- package/dist/core/expressions/magic-proxy/optionality-handler.js.map +1 -1
- package/dist/core/expressions/validation/compile-time-checker.d.ts +1 -1
- package/dist/core/expressions/validation/compile-time-checker.d.ts.map +1 -1
- package/dist/core/expressions/validation/compile-time-checker.js.map +1 -1
- package/dist/core/expressions/validation/compile-time-types.d.ts +2 -2
- package/dist/core/expressions/validation/compile-time-types.d.ts.map +1 -1
- package/dist/core/expressions/validation/kubernetes-field-types.d.ts +4 -4
- package/dist/core/expressions/validation/kubernetes-field-types.d.ts.map +1 -1
- package/dist/core/expressions/validation/kubernetes-field-types.js.map +1 -1
- package/dist/core/expressions/validation/resource-field-utils.d.ts +10 -10
- package/dist/core/expressions/validation/resource-field-utils.d.ts.map +1 -1
- package/dist/core/expressions/validation/resource-field-utils.js.map +1 -1
- package/dist/core/expressions/validation/resource-validation.d.ts +3 -3
- package/dist/core/expressions/validation/resource-validation.d.ts.map +1 -1
- package/dist/core/expressions/validation/resource-validation.js.map +1 -1
- package/dist/core/expressions/validation/type-inference-types.d.ts +2 -2
- package/dist/core/expressions/validation/type-inference-types.d.ts.map +1 -1
- package/dist/core/expressions/validation/type-safety.d.ts +2 -2
- package/dist/core/expressions/validation/type-safety.d.ts.map +1 -1
- package/dist/core/expressions/validation/type-safety.js +1 -0
- package/dist/core/expressions/validation/type-safety.js.map +1 -1
- package/dist/core/kubernetes/bun-api-client.js.map +1 -1
- package/dist/core/kubernetes/bun-http-library.d.ts.map +1 -1
- package/dist/core/kubernetes/bun-http-library.js +29 -3
- package/dist/core/kubernetes/bun-http-library.js.map +1 -1
- package/dist/core/kubernetes/client-provider.d.ts +12 -0
- package/dist/core/kubernetes/client-provider.d.ts.map +1 -1
- package/dist/core/kubernetes/client-provider.js +35 -0
- package/dist/core/kubernetes/client-provider.js.map +1 -1
- package/dist/core/metadata/resource-metadata.d.ts +46 -1
- package/dist/core/metadata/resource-metadata.d.ts.map +1 -1
- package/dist/core/metadata/resource-metadata.js.map +1 -1
- package/dist/core/proxy/create-resource.d.ts +15 -0
- package/dist/core/proxy/create-resource.d.ts.map +1 -1
- package/dist/core/proxy/create-resource.js +56 -2
- package/dist/core/proxy/create-resource.js.map +1 -1
- package/dist/core/readiness/registry.js +2 -2
- package/dist/core/readiness/registry.js.map +1 -1
- package/dist/core/references/cel-evaluator.d.ts +1 -4
- package/dist/core/references/cel-evaluator.d.ts.map +1 -1
- package/dist/core/references/cel-evaluator.js +3 -7
- package/dist/core/references/cel-evaluator.js.map +1 -1
- package/dist/core/references/cel.d.ts +70 -0
- package/dist/core/references/cel.d.ts.map +1 -1
- package/dist/core/references/cel.js +188 -8
- package/dist/core/references/cel.js.map +1 -1
- package/dist/core/references/external-refs.d.ts.map +1 -1
- package/dist/core/references/external-refs.js +3 -0
- package/dist/core/references/external-refs.js.map +1 -1
- package/dist/core/references/resolver.d.ts.map +1 -1
- package/dist/core/references/resolver.js +28 -17
- package/dist/core/references/resolver.js.map +1 -1
- package/dist/core/references/schema-proxy.d.ts +18 -10
- package/dist/core/references/schema-proxy.d.ts.map +1 -1
- package/dist/core/references/schema-proxy.js +174 -23
- package/dist/core/references/schema-proxy.js.map +1 -1
- package/dist/core/runtime-patches/crd-schema-fix.d.ts.map +1 -1
- package/dist/core/runtime-patches/crd-schema-fix.js +4 -1
- package/dist/core/runtime-patches/crd-schema-fix.js.map +1 -1
- package/dist/core/serialization/cel-optimizer.d.ts.map +1 -1
- package/dist/core/serialization/cel-optimizer.js +2 -0
- package/dist/core/serialization/cel-optimizer.js.map +1 -1
- package/dist/core/serialization/cel-references.d.ts +75 -1
- package/dist/core/serialization/cel-references.d.ts.map +1 -1
- package/dist/core/serialization/cel-references.js +723 -145
- package/dist/core/serialization/cel-references.js.map +1 -1
- package/dist/core/serialization/core.d.ts +13 -8
- package/dist/core/serialization/core.d.ts.map +1 -1
- package/dist/core/serialization/core.js +973 -12
- package/dist/core/serialization/core.js.map +1 -1
- package/dist/core/serialization/kro-post-processing.d.ts +46 -0
- package/dist/core/serialization/kro-post-processing.d.ts.map +1 -0
- package/dist/core/serialization/kro-post-processing.js +150 -0
- package/dist/core/serialization/kro-post-processing.js.map +1 -0
- package/dist/core/serialization/schema.d.ts +62 -3
- package/dist/core/serialization/schema.d.ts.map +1 -1
- package/dist/core/serialization/schema.js +819 -6
- 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.map +1 -1
- package/dist/core/serialization/yaml.d.ts +3 -2
- package/dist/core/serialization/yaml.d.ts.map +1 -1
- package/dist/core/serialization/yaml.js +404 -56
- package/dist/core/serialization/yaml.js.map +1 -1
- package/dist/core/singleton/singleton.d.ts +16 -0
- package/dist/core/singleton/singleton.d.ts.map +1 -0
- package/dist/core/singleton/singleton.js +135 -0
- package/dist/core/singleton/singleton.js.map +1 -0
- package/dist/core/types/common.d.ts +2 -2
- package/dist/core/types/common.d.ts.map +1 -1
- package/dist/core/types/composable.d.ts +1 -1
- package/dist/core/types/composable.d.ts.map +1 -1
- package/dist/core/types/deployment.d.ts +126 -6
- package/dist/core/types/deployment.d.ts.map +1 -1
- package/dist/core/types/deployment.js +1 -1
- package/dist/core/types/deployment.js.map +1 -1
- package/dist/core/types/kubernetes.d.ts +25 -17
- package/dist/core/types/kubernetes.d.ts.map +1 -1
- package/dist/core/types/references.d.ts +1 -1
- package/dist/core/types/references.d.ts.map +1 -1
- package/dist/core/types/references.js.map +1 -1
- package/dist/core/types/resource-graph.d.ts +1 -1
- package/dist/core/types/resource-graph.d.ts.map +1 -1
- package/dist/core/types/schema.d.ts +1 -1
- package/dist/core/types/schema.d.ts.map +1 -1
- package/dist/core/types/serialization.d.ts +62 -6
- package/dist/core/types/serialization.d.ts.map +1 -1
- package/dist/core/validation/cel-validator.d.ts +15 -2
- package/dist/core/validation/cel-validator.d.ts.map +1 -1
- package/dist/core/validation/cel-validator.js +144 -63
- package/dist/core/validation/cel-validator.js.map +1 -1
- package/dist/factories/apisix/compositions/apisix-bootstrap.d.ts +2 -41
- package/dist/factories/apisix/compositions/apisix-bootstrap.d.ts.map +1 -1
- package/dist/factories/apisix/compositions/apisix-bootstrap.js +262 -217
- package/dist/factories/apisix/compositions/apisix-bootstrap.js.map +1 -1
- package/dist/factories/apisix/index.d.ts +2 -2
- package/dist/factories/apisix/index.js +2 -2
- package/dist/factories/apisix/resources/helm.d.ts +2 -2
- package/dist/factories/apisix/resources/helm.d.ts.map +1 -1
- package/dist/factories/apisix/resources/helm.js.map +1 -1
- package/dist/factories/apisix/types.d.ts +21 -11
- package/dist/factories/apisix/types.d.ts.map +1 -1
- package/dist/factories/apisix/types.js +106 -4
- package/dist/factories/apisix/types.js.map +1 -1
- package/dist/factories/apisix/utils/admin-credentials.d.ts +5 -3
- package/dist/factories/apisix/utils/admin-credentials.d.ts.map +1 -1
- package/dist/factories/apisix/utils/admin-credentials.js +14 -10
- package/dist/factories/apisix/utils/admin-credentials.js.map +1 -1
- package/dist/factories/apisix/utils/helm-values-mapper.d.ts.map +1 -1
- package/dist/factories/apisix/utils/helm-values-mapper.js +4 -2
- package/dist/factories/apisix/utils/helm-values-mapper.js.map +1 -1
- package/dist/factories/cert-manager/resources/challenges.js.map +1 -1
- package/dist/factories/cert-manager/types.d.ts +3 -3
- package/dist/factories/cert-manager/types.d.ts.map +1 -1
- package/dist/factories/cilium/compositions/cilium-bootstrap.d.ts +4 -4
- package/dist/factories/cilium/types.d.ts +3 -3
- package/dist/factories/cilium/types.d.ts.map +1 -1
- package/dist/factories/cnpg/compositions/cnpg-bootstrap.d.ts +1 -0
- package/dist/factories/cnpg/compositions/cnpg-bootstrap.d.ts.map +1 -1
- package/dist/factories/cnpg/compositions/cnpg-bootstrap.js +48 -0
- package/dist/factories/cnpg/compositions/cnpg-bootstrap.js.map +1 -1
- package/dist/factories/cnpg/resources/cluster.js +1 -1
- package/dist/factories/cnpg/resources/cluster.js.map +1 -1
- package/dist/factories/cnpg/resources/helm.d.ts.map +1 -1
- package/dist/factories/cnpg/resources/helm.js +1 -0
- package/dist/factories/cnpg/resources/helm.js.map +1 -1
- package/dist/factories/cnpg/resources/pooler.js +1 -1
- package/dist/factories/cnpg/resources/pooler.js.map +1 -1
- package/dist/factories/cnpg/types.d.ts +9 -8
- package/dist/factories/cnpg/types.d.ts.map +1 -1
- package/dist/factories/cnpg/types.js +11 -0
- package/dist/factories/cnpg/types.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 +153 -41
- package/dist/factories/external-dns/compositions/external-dns-bootstrap.js.map +1 -1
- package/dist/factories/external-dns/resources/dns-endpoint.js +1 -1
- package/dist/factories/external-dns/resources/dns-endpoint.js.map +1 -1
- package/dist/factories/external-dns/resources/helm.d.ts +1 -1
- package/dist/factories/external-dns/resources/helm.d.ts.map +1 -1
- package/dist/factories/external-dns/resources/helm.js +17 -10
- package/dist/factories/external-dns/resources/helm.js.map +1 -1
- package/dist/factories/external-dns/types.d.ts +5 -2
- package/dist/factories/external-dns/types.d.ts.map +1 -1
- package/dist/factories/external-dns/types.js.map +1 -1
- package/dist/factories/flux/git-repository.d.ts.map +1 -1
- package/dist/factories/flux/git-repository.js +1 -1
- package/dist/factories/flux/git-repository.js.map +1 -1
- package/dist/factories/flux/kustomize/kustomization.d.ts +2 -2
- package/dist/factories/flux/kustomize/kustomization.d.ts.map +1 -1
- package/dist/factories/flux/kustomize/readiness-evaluators.d.ts +1 -1
- package/dist/factories/flux/kustomize/readiness-evaluators.d.ts.map +1 -1
- package/dist/factories/flux/kustomize/readiness-evaluators.js +1 -1
- package/dist/factories/flux/kustomize/readiness-evaluators.js.map +1 -1
- package/dist/factories/helm/helm-release.d.ts +3 -2
- package/dist/factories/helm/helm-release.d.ts.map +1 -1
- package/dist/factories/helm/helm-release.js +1 -0
- package/dist/factories/helm/helm-release.js.map +1 -1
- package/dist/factories/helm/helm-repository.d.ts +1 -1
- package/dist/factories/helm/helm-repository.d.ts.map +1 -1
- package/dist/factories/helm/helm-repository.js +6 -4
- package/dist/factories/helm/helm-repository.js.map +1 -1
- package/dist/factories/helm/readiness-evaluators.d.ts +6 -6
- package/dist/factories/helm/readiness-evaluators.d.ts.map +1 -1
- package/dist/factories/helm/readiness-evaluators.js +15 -9
- package/dist/factories/helm/readiness-evaluators.js.map +1 -1
- package/dist/factories/helm/types.d.ts +5 -1
- package/dist/factories/helm/types.d.ts.map +1 -1
- package/dist/factories/inngest/compositions/inngest-bootstrap.d.ts +1 -0
- package/dist/factories/inngest/compositions/inngest-bootstrap.d.ts.map +1 -1
- package/dist/factories/inngest/compositions/inngest-bootstrap.js +4 -3
- package/dist/factories/inngest/compositions/inngest-bootstrap.js.map +1 -1
- package/dist/factories/inngest/resources/helm.js +1 -1
- package/dist/factories/inngest/resources/helm.js.map +1 -1
- package/dist/factories/inngest/types.d.ts +5 -4
- package/dist/factories/inngest/types.d.ts.map +1 -1
- package/dist/factories/inngest/types.js +2 -0
- package/dist/factories/inngest/types.js.map +1 -1
- package/dist/factories/kro/kro-custom-resource.js +1 -1
- package/dist/factories/kro/kro-custom-resource.js.map +1 -1
- package/dist/factories/kubernetes/config/config-map.d.ts +2 -2
- package/dist/factories/kubernetes/config/config-map.d.ts.map +1 -1
- package/dist/factories/kubernetes/config/secret.d.ts +2 -2
- package/dist/factories/kubernetes/config/secret.d.ts.map +1 -1
- package/dist/factories/kubernetes/config/secret.js +11 -1
- package/dist/factories/kubernetes/config/secret.js.map +1 -1
- package/dist/factories/kubernetes/networking/service.js +1 -1
- package/dist/factories/kubernetes/networking/service.js.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-directory.d.ts.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-directory.js +9 -0
- package/dist/factories/kubernetes/yaml/yaml-directory.js.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-file.d.ts.map +1 -1
- package/dist/factories/kubernetes/yaml/yaml-file.js +9 -0
- package/dist/factories/kubernetes/yaml/yaml-file.js.map +1 -1
- package/dist/factories/pebble/resources/helm.js.map +1 -1
- package/dist/factories/pebble/types.d.ts +2 -2
- package/dist/factories/searxng/compositions/index.d.ts +2 -0
- package/dist/factories/searxng/compositions/index.d.ts.map +1 -0
- package/dist/factories/searxng/compositions/index.js +2 -0
- package/dist/factories/searxng/compositions/index.js.map +1 -0
- package/dist/factories/searxng/compositions/searxng-bootstrap.d.ts +66 -0
- package/dist/factories/searxng/compositions/searxng-bootstrap.d.ts.map +1 -0
- package/dist/factories/searxng/compositions/searxng-bootstrap.js +275 -0
- package/dist/factories/searxng/compositions/searxng-bootstrap.js.map +1 -0
- package/dist/factories/searxng/index.d.ts +29 -0
- package/dist/factories/searxng/index.d.ts.map +1 -0
- package/dist/factories/searxng/index.js +27 -0
- package/dist/factories/searxng/index.js.map +1 -0
- package/dist/factories/searxng/resources/index.d.ts +2 -0
- package/dist/factories/searxng/resources/index.d.ts.map +1 -0
- package/dist/factories/searxng/resources/index.js +2 -0
- package/dist/factories/searxng/resources/index.js.map +1 -0
- package/dist/factories/searxng/resources/searxng.d.ts +65 -0
- package/dist/factories/searxng/resources/searxng.d.ts.map +1 -0
- package/dist/factories/searxng/resources/searxng.js +188 -0
- package/dist/factories/searxng/resources/searxng.js.map +1 -0
- package/dist/factories/searxng/types.d.ts +127 -0
- package/dist/factories/searxng/types.d.ts.map +1 -0
- package/dist/factories/searxng/types.js +177 -0
- package/dist/factories/searxng/types.js.map +1 -0
- package/dist/factories/searxng/utils/settings-builder.d.ts +47 -0
- package/dist/factories/searxng/utils/settings-builder.d.ts.map +1 -0
- package/dist/factories/searxng/utils/settings-builder.js +53 -0
- package/dist/factories/searxng/utils/settings-builder.js.map +1 -0
- package/dist/factories/simple/config/config-map.d.ts +2 -2
- package/dist/factories/simple/config/config-map.d.ts.map +1 -1
- package/dist/factories/simple/config/secret.d.ts +2 -2
- package/dist/factories/simple/config/secret.d.ts.map +1 -1
- package/dist/factories/simple/config/secret.js +28 -0
- package/dist/factories/simple/config/secret.js.map +1 -1
- package/dist/factories/simple/helm/index.d.ts +1 -1
- package/dist/factories/simple/helm/index.d.ts.map +1 -1
- package/dist/factories/simple/helm/index.js.map +1 -1
- package/dist/factories/simple/storage/persistent-volume.js.map +1 -1
- package/dist/factories/simple/types.d.ts +11 -1
- package/dist/factories/simple/types.d.ts.map +1 -1
- package/dist/factories/simple/workloads/deployment.d.ts.map +1 -1
- package/dist/factories/simple/workloads/deployment.js +3 -0
- package/dist/factories/simple/workloads/deployment.js.map +1 -1
- package/dist/factories/valkey/compositions/valkey-bootstrap.d.ts +1 -0
- package/dist/factories/valkey/compositions/valkey-bootstrap.d.ts.map +1 -1
- package/dist/factories/valkey/compositions/valkey-bootstrap.js +116 -0
- package/dist/factories/valkey/compositions/valkey-bootstrap.js.map +1 -1
- package/dist/factories/valkey/resources/valkey.js +1 -1
- package/dist/factories/valkey/resources/valkey.js.map +1 -1
- package/dist/factories/valkey/types.d.ts +6 -5
- package/dist/factories/valkey/types.d.ts.map +1 -1
- package/dist/factories/valkey/types.js +10 -0
- package/dist/factories/valkey/types.js.map +1 -1
- package/dist/factories/webapp/compositions/web-app-with-processing.d.ts +95 -12
- package/dist/factories/webapp/compositions/web-app-with-processing.d.ts.map +1 -1
- package/dist/factories/webapp/compositions/web-app-with-processing.js +185 -26
- package/dist/factories/webapp/compositions/web-app-with-processing.js.map +1 -1
- package/dist/factories/webapp/index.d.ts +3 -4
- package/dist/factories/webapp/index.d.ts.map +1 -1
- package/dist/factories/webapp/index.js +3 -4
- package/dist/factories/webapp/index.js.map +1 -1
- package/dist/factories/webapp/types.d.ts +60 -2
- package/dist/factories/webapp/types.d.ts.map +1 -1
- package/dist/factories/webapp/types.js +80 -3
- package/dist/factories/webapp/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/shared/brands.d.ts +18 -8
- package/dist/shared/brands.d.ts.map +1 -1
- package/dist/shared/brands.js +19 -9
- package/dist/shared/brands.js.map +1 -1
- package/dist/utils/cel-escape.d.ts +12 -0
- package/dist/utils/cel-escape.d.ts.map +1 -0
- package/dist/utils/cel-escape.js +19 -0
- package/dist/utils/cel-escape.js.map +1 -0
- package/package.json +7 -2
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* YAML generation functionality for Kro ResourceGraphDefinitions
|
|
3
3
|
*
|
|
4
|
-
* Supports Kro
|
|
4
|
+
* Supports Kro 0.9.1+ ResourceGraphDefinition serialization, including
|
|
5
|
+
* forEach, includeWhen, readyWhen, externalRef, mixed-template CEL, omit(),
|
|
5
6
|
* schema group, and allowBreakingChanges annotation.
|
|
6
7
|
*/
|
|
7
8
|
import * as yaml from 'js-yaml';
|
|
9
|
+
import { getMetadataField } from '../metadata/resource-metadata.js';
|
|
8
10
|
import { escapeRegExp } from '../../utils/helpers.js';
|
|
9
11
|
import { extractResourceReferences, isCelExpression, isKubernetesRef, } from '../../utils/type-guards.js';
|
|
10
12
|
import { getForEach, getIncludeWhen, getReadyWhen, getResourceId, getTemplateOverrides, } from '../metadata/index.js';
|
|
11
13
|
import { generateDeterministicResourceId } from '../resources/id.js';
|
|
12
|
-
import { getInnerCelPath, processResourceReferences } from './cel-references.js';
|
|
14
|
+
import { finalizeCelForKro, getInnerCelPath, normalizeRefMarkersToCelPaths, processResourceReferences } from './cel-references.js';
|
|
13
15
|
import { generateKroSchema } from './schema.js';
|
|
14
16
|
/**
|
|
15
17
|
* Read a non-enumerable property from an Enhanced resource.
|
|
@@ -63,24 +65,31 @@ function readTemplateOverrides(resource) {
|
|
|
63
65
|
* Convert a single includeWhen value to a CEL expression string.
|
|
64
66
|
*
|
|
65
67
|
* Accepted input types:
|
|
66
|
-
* - KubernetesRef proxy → `${schema.spec.field}`
|
|
67
|
-
*
|
|
68
|
+
* - KubernetesRef proxy → `${schema.spec.field}` — the field's value is
|
|
69
|
+
* used as the boolean condition. This is the semantics of the explicit
|
|
70
|
+
* `.withIncludeWhen(spec.boolField)` API: the caller is being deliberate
|
|
71
|
+
* about the field they want as the test. Callers who need a presence
|
|
72
|
+
* check on an optional field should use `Cel.has(ref)` explicitly, or
|
|
73
|
+
* write `if (spec.optional)` in the composition body (which the AST
|
|
74
|
+
* analyzer rewrites to `has(...)` automatically based on the schema).
|
|
75
|
+
* - CelExpression object → `${expression}` — use Cel.has / Cel.not /
|
|
76
|
+
* Cel.expr to build explicit conditions.
|
|
68
77
|
* - string (already CEL) → pass-through
|
|
69
78
|
* - string with __KUBERNETES_REF__ markers → convert markers to CEL
|
|
70
79
|
*/
|
|
71
|
-
function convertIncludeWhenValueToCel(value) {
|
|
80
|
+
function convertIncludeWhenValueToCel(value, context) {
|
|
72
81
|
if (typeof value === 'string') {
|
|
73
82
|
if (value.includes('__KUBERNETES_REF_')) {
|
|
74
|
-
return convertRefMarkersInString(value)
|
|
83
|
+
return `\${${convertRefMarkersInString(value, context)}}`;
|
|
75
84
|
}
|
|
76
85
|
return value;
|
|
77
86
|
}
|
|
78
87
|
if (isKubernetesRef(value)) {
|
|
79
|
-
const celPath = getInnerCelPath(value);
|
|
88
|
+
const celPath = normalizeRefMarkersToCelPaths(getInnerCelPath(value), context);
|
|
80
89
|
return `\${${celPath}}`;
|
|
81
90
|
}
|
|
82
91
|
if (isCelExpression(value)) {
|
|
83
|
-
return `\${${value.expression}}`;
|
|
92
|
+
return `\${${normalizeRefMarkersToCelPaths(value.expression, context)}}`;
|
|
84
93
|
}
|
|
85
94
|
// Fallback — coerce to string
|
|
86
95
|
if (value !== undefined && value !== null) {
|
|
@@ -96,13 +105,13 @@ function convertIncludeWhenValueToCel(value) {
|
|
|
96
105
|
* - An array of the above
|
|
97
106
|
* - undefined (no condition)
|
|
98
107
|
*/
|
|
99
|
-
function resolveIncludeWhen(raw) {
|
|
108
|
+
function resolveIncludeWhen(raw, context) {
|
|
100
109
|
if (raw === undefined || raw === null)
|
|
101
110
|
return undefined;
|
|
102
111
|
const items = Array.isArray(raw) ? raw : [raw];
|
|
103
112
|
const celStrings = [];
|
|
104
113
|
for (const item of items) {
|
|
105
|
-
const cel = convertIncludeWhenValueToCel(item);
|
|
114
|
+
const cel = convertIncludeWhenValueToCel(item, context);
|
|
106
115
|
if (cel)
|
|
107
116
|
celStrings.push(cel);
|
|
108
117
|
}
|
|
@@ -111,6 +120,109 @@ function resolveIncludeWhen(raw) {
|
|
|
111
120
|
// ---------------------------------------------------------------------------
|
|
112
121
|
// readyWhen → CEL conversion
|
|
113
122
|
// ---------------------------------------------------------------------------
|
|
123
|
+
const READY_WHEN_CALLBACK_METHODS = new Set(['exists', 'all', 'filter', 'map', 'some', 'every']);
|
|
124
|
+
function findMatchingParen(source, openIndex) {
|
|
125
|
+
let depth = 0;
|
|
126
|
+
let quote;
|
|
127
|
+
let escaped = false;
|
|
128
|
+
for (let i = openIndex; i < source.length; i++) {
|
|
129
|
+
const char = source[i];
|
|
130
|
+
if (quote) {
|
|
131
|
+
if (escaped) {
|
|
132
|
+
escaped = false;
|
|
133
|
+
}
|
|
134
|
+
else if (char === '\\') {
|
|
135
|
+
escaped = true;
|
|
136
|
+
}
|
|
137
|
+
else if (char === quote) {
|
|
138
|
+
quote = undefined;
|
|
139
|
+
}
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (char === '"' || char === "'" || char === '`') {
|
|
143
|
+
quote = char;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (char === '(') {
|
|
147
|
+
depth++;
|
|
148
|
+
}
|
|
149
|
+
else if (char === ')') {
|
|
150
|
+
depth--;
|
|
151
|
+
if (depth === 0)
|
|
152
|
+
return i;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return -1;
|
|
156
|
+
}
|
|
157
|
+
function normalizeArrowBody(body) {
|
|
158
|
+
const trimmed = body.trim();
|
|
159
|
+
if (!trimmed.startsWith('{'))
|
|
160
|
+
return trimmed;
|
|
161
|
+
return trimmed
|
|
162
|
+
.replace(/^\{\s*(?:return\s+)?/, '')
|
|
163
|
+
.replace(/;?\s*\}\s*$/, '')
|
|
164
|
+
.trim();
|
|
165
|
+
}
|
|
166
|
+
function convertReadyWhenCallbackMethods(expression) {
|
|
167
|
+
let result = '';
|
|
168
|
+
let index = 0;
|
|
169
|
+
while (index < expression.length) {
|
|
170
|
+
const dotIndex = expression.indexOf('.', index);
|
|
171
|
+
if (dotIndex === -1) {
|
|
172
|
+
result += expression.slice(index);
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
result += expression.slice(index, dotIndex);
|
|
176
|
+
let cursor = dotIndex + 1;
|
|
177
|
+
while (/\s/.test(expression[cursor] ?? ''))
|
|
178
|
+
cursor++;
|
|
179
|
+
const methodMatch = /^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(expression.slice(cursor));
|
|
180
|
+
if (!methodMatch || !READY_WHEN_CALLBACK_METHODS.has(methodMatch[0])) {
|
|
181
|
+
result += expression[dotIndex];
|
|
182
|
+
index = dotIndex + 1;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
const method = methodMatch[0];
|
|
186
|
+
cursor += method.length;
|
|
187
|
+
while (/\s/.test(expression[cursor] ?? ''))
|
|
188
|
+
cursor++;
|
|
189
|
+
if (expression[cursor] !== '(') {
|
|
190
|
+
result += expression[dotIndex];
|
|
191
|
+
index = dotIndex + 1;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const closeIndex = findMatchingParen(expression, cursor);
|
|
195
|
+
if (closeIndex === -1) {
|
|
196
|
+
result += expression[dotIndex];
|
|
197
|
+
index = dotIndex + 1;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const callbackSource = expression.slice(cursor + 1, closeIndex).trim();
|
|
201
|
+
const arrowIndex = callbackSource.indexOf('=>');
|
|
202
|
+
if (arrowIndex === -1) {
|
|
203
|
+
result += expression.slice(dotIndex, closeIndex + 1);
|
|
204
|
+
index = closeIndex + 1;
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
let param = callbackSource.slice(0, arrowIndex).trim();
|
|
208
|
+
param = param.replace(/^\(\s*/, '').replace(/\s*\)$/, '').trim();
|
|
209
|
+
const colonIndex = param.indexOf(':');
|
|
210
|
+
if (colonIndex !== -1)
|
|
211
|
+
param = param.slice(0, colonIndex).trim();
|
|
212
|
+
if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(param)) {
|
|
213
|
+
result += expression.slice(dotIndex, closeIndex + 1);
|
|
214
|
+
index = closeIndex + 1;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
let body = normalizeArrowBody(callbackSource.slice(arrowIndex + 2));
|
|
218
|
+
body = body.replace(/===/g, '==').replace(/!==/g, '!=');
|
|
219
|
+
body = convertReadyWhenCallbackMethods(body);
|
|
220
|
+
const celMethod = method === 'some' ? 'exists' : method === 'every' ? 'all' : method;
|
|
221
|
+
result += `.${celMethod}(${param}, ${body})`;
|
|
222
|
+
index = closeIndex + 1;
|
|
223
|
+
}
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
114
226
|
/**
|
|
115
227
|
* Convert a readyWhen callback function to a CEL expression string by parsing its source.
|
|
116
228
|
*
|
|
@@ -163,17 +275,10 @@ function convertReadyWhenCallbackToCel(fn, resourceId) {
|
|
|
163
275
|
// JS → CEL operator conversions (must happen before inner callback processing)
|
|
164
276
|
celExpr = celExpr.replace(/===/g, '==');
|
|
165
277
|
celExpr = celExpr.replace(/!==/g, '!=');
|
|
166
|
-
// Convert JS arrow function callbacks inside
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
celExpr = celExpr
|
|
170
|
-
let cleanBody = innerBody.trim();
|
|
171
|
-
// Fix operators in inner body too
|
|
172
|
-
cleanBody = cleanBody.replace(/===/g, '==').replace(/!==/g, '!=');
|
|
173
|
-
// Convert single quotes to double quotes for string literals
|
|
174
|
-
cleanBody = cleanBody.replace(/'([^']+)'/g, '"$1"');
|
|
175
|
-
return `.${method}(${innerParam}, ${cleanBody})`;
|
|
176
|
-
});
|
|
278
|
+
// Convert JS arrow function callbacks inside CEL macros and natural JS array
|
|
279
|
+
// helpers. Use a balanced scanner instead of a regex so nested parentheses in
|
|
280
|
+
// predicate bodies don't truncate the callback body.
|
|
281
|
+
celExpr = convertReadyWhenCallbackMethods(celExpr);
|
|
177
282
|
// Convert remaining single-quoted strings to double-quoted for CEL
|
|
178
283
|
celExpr = celExpr.replace(/'([^']+)'/g, '"$1"');
|
|
179
284
|
return celExpr;
|
|
@@ -187,7 +292,7 @@ function convertReadyWhenCallbackToCel(fn, resourceId) {
|
|
|
187
292
|
* - CelExpression object → `${expression}`
|
|
188
293
|
* - string (already CEL) → pass-through
|
|
189
294
|
*/
|
|
190
|
-
function convertReadyWhenValueToCel(value, resourceId, hasForEach) {
|
|
295
|
+
function convertReadyWhenValueToCel(value, resourceId, hasForEach, context) {
|
|
191
296
|
// Callback function — parse source to extract CEL expression
|
|
192
297
|
if (typeof value === 'function') {
|
|
193
298
|
const baseId = hasForEach ? 'each' : resourceId;
|
|
@@ -195,15 +300,16 @@ function convertReadyWhenValueToCel(value, resourceId, hasForEach) {
|
|
|
195
300
|
return `\${${celExpr}}`;
|
|
196
301
|
}
|
|
197
302
|
if (isKubernetesRef(value)) {
|
|
198
|
-
const celPath = getInnerCelPath(value);
|
|
303
|
+
const celPath = normalizeRefMarkersToCelPaths(getInnerCelPath(value), context);
|
|
199
304
|
return `\${${celPath}}`;
|
|
200
305
|
}
|
|
201
306
|
if (isCelExpression(value)) {
|
|
202
|
-
return `\${${value.expression}}`;
|
|
307
|
+
return `\${${normalizeRefMarkersToCelPaths(value.expression, context)}}`;
|
|
203
308
|
}
|
|
204
309
|
if (typeof value === 'string') {
|
|
205
310
|
if (value.includes('__KUBERNETES_REF_')) {
|
|
206
|
-
|
|
311
|
+
const converted = convertRefMarkersInString(value, context);
|
|
312
|
+
return converted.includes('${') ? converted : `\${${converted}}`;
|
|
207
313
|
}
|
|
208
314
|
return value;
|
|
209
315
|
}
|
|
@@ -215,13 +321,13 @@ function convertReadyWhenValueToCel(value, resourceId, hasForEach) {
|
|
|
215
321
|
/**
|
|
216
322
|
* Resolve the readyWhen property from an Enhanced resource to an array of CEL strings.
|
|
217
323
|
*/
|
|
218
|
-
function resolveReadyWhen(raw, resourceId, hasForEach) {
|
|
324
|
+
function resolveReadyWhen(raw, resourceId, hasForEach, context) {
|
|
219
325
|
if (raw === undefined || raw === null)
|
|
220
326
|
return undefined;
|
|
221
327
|
const items = Array.isArray(raw) ? raw : [raw];
|
|
222
328
|
const celStrings = [];
|
|
223
329
|
for (const item of items) {
|
|
224
|
-
const cel = convertReadyWhenValueToCel(item, resourceId, hasForEach);
|
|
330
|
+
const cel = convertReadyWhenValueToCel(item, resourceId, hasForEach, context);
|
|
225
331
|
if (cel)
|
|
226
332
|
celStrings.push(cel);
|
|
227
333
|
}
|
|
@@ -236,16 +342,8 @@ function resolveReadyWhen(raw, resourceId, hasForEach) {
|
|
|
236
342
|
* Input: "__KUBERNETES_REF_web_status.readyReplicas__ > 0"
|
|
237
343
|
* Output: "web.status.readyReplicas > 0"
|
|
238
344
|
*/
|
|
239
|
-
function convertRefMarkersInString(str) {
|
|
240
|
-
|
|
241
|
-
// For schema: __KUBERNETES_REF___schema___{fieldPath}__
|
|
242
|
-
const refPattern = /__KUBERNETES_REF_(__schema__|[^_]+)_([a-zA-Z0-9.$]+)__/g;
|
|
243
|
-
return str.replace(refPattern, (_match, resourceId, fieldPath) => {
|
|
244
|
-
if (resourceId === '__schema__') {
|
|
245
|
-
return `schema.${fieldPath}`;
|
|
246
|
-
}
|
|
247
|
-
return `${resourceId}.${fieldPath}`;
|
|
248
|
-
});
|
|
345
|
+
function convertRefMarkersInString(str, context) {
|
|
346
|
+
return normalizeRefMarkersToCelPaths(str, context);
|
|
249
347
|
}
|
|
250
348
|
// ---------------------------------------------------------------------------
|
|
251
349
|
// forEach $item sentinel substitution
|
|
@@ -295,6 +393,130 @@ function substituteForEachSentinels(template, basePath, varName) {
|
|
|
295
393
|
// Primitives (number, boolean, null, undefined) pass through unchanged
|
|
296
394
|
return template;
|
|
297
395
|
}
|
|
396
|
+
/**
|
|
397
|
+
* Strip orphaned `$item` sentinel references from a template.
|
|
398
|
+
*
|
|
399
|
+
* After forEach substitution, any remaining `$item` paths are from non-forEach
|
|
400
|
+
* contexts — typically when `...spec.array` is spread into a literal array.
|
|
401
|
+
* These are not valid CEL identifiers and must be collapsed to the parent
|
|
402
|
+
* array reference.
|
|
403
|
+
*
|
|
404
|
+
* Handles both wrapped CEL (`${path.$item.field}`) and raw paths.
|
|
405
|
+
* Strips `.$item` and any trailing field access, keeping just the parent path.
|
|
406
|
+
*/
|
|
407
|
+
function stripOrphanedItemSentinels(template) {
|
|
408
|
+
if (typeof template === 'string') {
|
|
409
|
+
const normalized = normalizeOptionalArrayConditional(template);
|
|
410
|
+
if (normalized !== undefined)
|
|
411
|
+
return normalized;
|
|
412
|
+
if (!template.includes('$item'))
|
|
413
|
+
return template;
|
|
414
|
+
// Match any path segment ending with .$item optionally followed by .field
|
|
415
|
+
const stripped = template.replace(/(\w[\w.]*)\.\$item(?:\.[a-zA-Z0-9_.]+)?/g, '$1');
|
|
416
|
+
return (normalizeOptionalArrayConditional(stripped) ?? stripped);
|
|
417
|
+
}
|
|
418
|
+
if (Array.isArray(template)) {
|
|
419
|
+
const collapsed = collapseOrphanedArraySpreads(template);
|
|
420
|
+
if (collapsed !== undefined)
|
|
421
|
+
return collapsed;
|
|
422
|
+
return template.map((item) => stripOrphanedItemSentinels(item));
|
|
423
|
+
}
|
|
424
|
+
if (template !== null && typeof template === 'object') {
|
|
425
|
+
const result = {};
|
|
426
|
+
for (const [key, value] of Object.entries(template)) {
|
|
427
|
+
result[key] = stripOrphanedItemSentinels(value);
|
|
428
|
+
}
|
|
429
|
+
return result;
|
|
430
|
+
}
|
|
431
|
+
return template;
|
|
432
|
+
}
|
|
433
|
+
function normalizeOptionalArrayConditional(value) {
|
|
434
|
+
const match = value.match(/^\$\{has\(([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\) \? (\[.*), \1\] : (\[.*\])\}$/);
|
|
435
|
+
if (!match?.[1] || !match[2] || !match[3])
|
|
436
|
+
return undefined;
|
|
437
|
+
const [, basePath, truthyPrefix, fallbackList] = match;
|
|
438
|
+
if (`${truthyPrefix}]` !== fallbackList)
|
|
439
|
+
return undefined;
|
|
440
|
+
return `\${${fallbackList} + (has(${basePath}) ? ${basePath} : [])}`;
|
|
441
|
+
}
|
|
442
|
+
function findOrphanedItemBase(value) {
|
|
443
|
+
const serialized = JSON.stringify(value);
|
|
444
|
+
return serialized?.match(/([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\.\$item/)?.[1];
|
|
445
|
+
}
|
|
446
|
+
function isDirectOrphanedItemElement(value, basePath) {
|
|
447
|
+
if (typeof value === 'string') {
|
|
448
|
+
return value.includes('${') && value.includes(`${basePath}.$item`);
|
|
449
|
+
}
|
|
450
|
+
if (Array.isArray(value))
|
|
451
|
+
return value.every((item) => isDirectOrphanedItemElement(item, basePath));
|
|
452
|
+
if (value && typeof value === 'object') {
|
|
453
|
+
const entries = Object.values(value);
|
|
454
|
+
return entries.length > 0 && entries.every((entry) => isDirectOrphanedItemElement(entry, basePath));
|
|
455
|
+
}
|
|
456
|
+
return false;
|
|
457
|
+
}
|
|
458
|
+
function collapseOrphanedArraySpreads(items) {
|
|
459
|
+
const parts = [];
|
|
460
|
+
let literals = [];
|
|
461
|
+
let sawSpread = false;
|
|
462
|
+
const flushLiterals = () => {
|
|
463
|
+
if (literals.length === 0)
|
|
464
|
+
return;
|
|
465
|
+
parts.push(celValueForTemplate(literals));
|
|
466
|
+
literals = [];
|
|
467
|
+
};
|
|
468
|
+
for (const item of items) {
|
|
469
|
+
const basePath = findOrphanedItemBase(item);
|
|
470
|
+
if (!basePath || !isDirectOrphanedItemElement(item, basePath)) {
|
|
471
|
+
literals.push(stripOrphanedItemSentinels(item));
|
|
472
|
+
continue;
|
|
473
|
+
}
|
|
474
|
+
sawSpread = true;
|
|
475
|
+
flushLiterals();
|
|
476
|
+
const serialized = JSON.stringify(item) ?? '';
|
|
477
|
+
parts.push(serialized.includes(`has(${basePath})`) ? `(has(${basePath}) ? ${basePath} : [])` : basePath);
|
|
478
|
+
}
|
|
479
|
+
if (!sawSpread)
|
|
480
|
+
return undefined;
|
|
481
|
+
flushLiterals();
|
|
482
|
+
return parts.length > 0 ? `\${${parts.join(' + ')}}` : undefined;
|
|
483
|
+
}
|
|
484
|
+
function celValueForTemplate(value) {
|
|
485
|
+
if (typeof value === 'string')
|
|
486
|
+
return celStringForTemplate(value);
|
|
487
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
488
|
+
return String(value);
|
|
489
|
+
if (value === null)
|
|
490
|
+
return 'null';
|
|
491
|
+
if (Array.isArray(value))
|
|
492
|
+
return `[${value.map(celValueForTemplate).join(', ')}]`;
|
|
493
|
+
if (value && typeof value === 'object') {
|
|
494
|
+
const entries = Object.entries(value).map(([key, entryValue]) => `${JSON.stringify(key)}: ${celValueForTemplate(entryValue)}`);
|
|
495
|
+
return `{${entries.join(', ')}}`;
|
|
496
|
+
}
|
|
497
|
+
return 'null';
|
|
498
|
+
}
|
|
499
|
+
function celStringForTemplate(value) {
|
|
500
|
+
const fullCel = value.match(/^\$\{(.+)\}$/);
|
|
501
|
+
if (fullCel?.[1])
|
|
502
|
+
return fullCel[1];
|
|
503
|
+
if (!value.includes('${'))
|
|
504
|
+
return JSON.stringify(value);
|
|
505
|
+
const parts = [];
|
|
506
|
+
let cursor = 0;
|
|
507
|
+
const pattern = /\$\{([^}]+)\}/g;
|
|
508
|
+
for (const match of value.matchAll(pattern)) {
|
|
509
|
+
const index = match.index ?? 0;
|
|
510
|
+
if (index > cursor)
|
|
511
|
+
parts.push(JSON.stringify(value.slice(cursor, index)));
|
|
512
|
+
if (match[1])
|
|
513
|
+
parts.push(`string(${match[1]})`);
|
|
514
|
+
cursor = index + match[0].length;
|
|
515
|
+
}
|
|
516
|
+
if (cursor < value.length)
|
|
517
|
+
parts.push(JSON.stringify(value.slice(cursor)));
|
|
518
|
+
return parts.length > 0 ? parts.join(' + ') : '""';
|
|
519
|
+
}
|
|
298
520
|
// ---------------------------------------------------------------------------
|
|
299
521
|
// Template override application
|
|
300
522
|
// ---------------------------------------------------------------------------
|
|
@@ -309,32 +531,89 @@ function substituteForEachSentinels(template, basePath, varName) {
|
|
|
309
531
|
* @param template - The processed template object (after processResourceReferences)
|
|
310
532
|
* @param overrides - Array of {propertyPath, celExpression} overrides
|
|
311
533
|
*/
|
|
312
|
-
function applyTemplateOverrides(template, overrides) {
|
|
534
|
+
function applyTemplateOverrides(template, overrides, context) {
|
|
313
535
|
for (const { propertyPath, celExpression } of overrides) {
|
|
314
536
|
const parts = propertyPath.split('.');
|
|
315
537
|
let target = template;
|
|
316
|
-
// Walk to the parent of the target property
|
|
538
|
+
// Walk to the parent of the target property. Object-branch ternaries can
|
|
539
|
+
// produce paths that only exist in the non-selected branch, so materialize
|
|
540
|
+
// missing containers instead of silently dropping those overrides.
|
|
317
541
|
for (let i = 0; i < parts.length - 1; i++) {
|
|
318
542
|
const part = parts[i];
|
|
319
543
|
if (!part)
|
|
320
544
|
continue;
|
|
321
|
-
|
|
322
|
-
|
|
545
|
+
if (!target)
|
|
546
|
+
break;
|
|
547
|
+
const next = Array.isArray(target) && /^\d+$/.test(part)
|
|
548
|
+
? target[Number(part)]
|
|
549
|
+
: target[part];
|
|
550
|
+
if (next && typeof next === 'object') {
|
|
323
551
|
target = next;
|
|
324
552
|
}
|
|
325
553
|
else {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
554
|
+
if (!celExpression.includes('omit()')) {
|
|
555
|
+
target = undefined;
|
|
556
|
+
break;
|
|
557
|
+
}
|
|
558
|
+
const nextPart = parts[i + 1];
|
|
559
|
+
const container = nextPart && /^\d+$/.test(nextPart) ? [] : {};
|
|
560
|
+
if (Array.isArray(target) && /^\d+$/.test(part)) {
|
|
561
|
+
target[Number(part)] = container;
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
target[part] = container;
|
|
565
|
+
}
|
|
566
|
+
target = container;
|
|
329
567
|
}
|
|
330
568
|
}
|
|
331
569
|
if (!target)
|
|
332
570
|
continue;
|
|
333
571
|
const lastKey = parts[parts.length - 1];
|
|
334
|
-
if (lastKey
|
|
335
|
-
|
|
572
|
+
if (lastKey) {
|
|
573
|
+
const finalized = finalizeCelForKro(celExpression, context.nestedStatusCel, context);
|
|
574
|
+
if (Array.isArray(target) && /^\d+$/.test(lastKey)) {
|
|
575
|
+
target[Number(lastKey)] = finalized;
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
target[lastKey] = finalized;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
function toIdSuffix(resourceId) {
|
|
584
|
+
return resourceId.charAt(0).toUpperCase() + resourceId.slice(1);
|
|
585
|
+
}
|
|
586
|
+
function commonPrefixLength(left, right) {
|
|
587
|
+
const max = Math.min(left.length, right.length);
|
|
588
|
+
let index = 0;
|
|
589
|
+
while (index < max && left[index] === right[index]) {
|
|
590
|
+
index += 1;
|
|
591
|
+
}
|
|
592
|
+
return index;
|
|
593
|
+
}
|
|
594
|
+
function deriveResourceIdAliases(resourceId) {
|
|
595
|
+
const aliases = [];
|
|
596
|
+
for (const match of resourceId.matchAll(/\d+/g)) {
|
|
597
|
+
const suffix = resourceId.slice((match.index ?? 0) + match[0].length);
|
|
598
|
+
if (suffix && /^[A-Z]/.test(suffix)) {
|
|
599
|
+
aliases.push(suffix.charAt(0).toLowerCase() + suffix.slice(1));
|
|
336
600
|
}
|
|
337
601
|
}
|
|
602
|
+
return aliases;
|
|
603
|
+
}
|
|
604
|
+
function resolveDependsOnResourceId(dependencyId, currentResourceId, knownResourceIds) {
|
|
605
|
+
if (!knownResourceIds || knownResourceIds.has(dependencyId)) {
|
|
606
|
+
return dependencyId;
|
|
607
|
+
}
|
|
608
|
+
const suffix = toIdSuffix(dependencyId);
|
|
609
|
+
const candidates = Array.from(knownResourceIds).filter((resourceId) => resourceId.endsWith(suffix));
|
|
610
|
+
if (candidates.length === 0) {
|
|
611
|
+
return dependencyId;
|
|
612
|
+
}
|
|
613
|
+
if (candidates.length === 1) {
|
|
614
|
+
return candidates[0] ?? dependencyId;
|
|
615
|
+
}
|
|
616
|
+
return candidates.sort((left, right) => commonPrefixLength(right, currentResourceId) - commonPrefixLength(left, currentResourceId))[0] ?? dependencyId;
|
|
338
617
|
}
|
|
339
618
|
// ---------------------------------------------------------------------------
|
|
340
619
|
// Resource entry builder
|
|
@@ -350,6 +629,10 @@ function applyTemplateOverrides(template, overrides) {
|
|
|
350
629
|
function buildResourceEntry(id, resource, context) {
|
|
351
630
|
const isExternalRef = readNonEnumerable(resource, '__externalRef');
|
|
352
631
|
if (isExternalRef) {
|
|
632
|
+
const forEach = readForEachDimensions(resource);
|
|
633
|
+
if (forEach && forEach.length > 0) {
|
|
634
|
+
throw new Error(`Resource '${id}' cannot use both externalRef and forEach`);
|
|
635
|
+
}
|
|
353
636
|
// externalRef resources: emit externalRef metadata, NOT template.
|
|
354
637
|
// Use Object.getOwnPropertyDescriptor to bypass the Enhanced proxy's get trap
|
|
355
638
|
// and read the actual underlying values. Going through the proxy would cause
|
|
@@ -362,20 +645,24 @@ function buildResourceEntry(id, resource, context) {
|
|
|
362
645
|
// Process marker strings in metadata values to convert them to CEL expressions.
|
|
363
646
|
// externalRef metadata.name may contain __KUBERNETES_REF__ markers from template
|
|
364
647
|
// literals (e.g., `${spec.name}-db-${dbOwner}`).
|
|
365
|
-
const rawName =
|
|
366
|
-
const rawNamespace =
|
|
648
|
+
const rawName = rawMeta && 'name' in rawMeta ? rawMeta.name : '';
|
|
649
|
+
const rawNamespace = rawMeta && 'namespace' in rawMeta ? rawMeta.namespace : undefined;
|
|
650
|
+
const processedName = processResourceReferences(rawName, context);
|
|
651
|
+
const processedNamespace = processResourceReferences(rawNamespace, context);
|
|
367
652
|
const extRef = {
|
|
368
653
|
apiVersion: String(apiVersionDesc?.value ?? ''),
|
|
369
654
|
kind: String(kindDesc?.value ?? ''),
|
|
370
655
|
metadata: {
|
|
371
|
-
name: String(
|
|
372
|
-
...(rawNamespace &&
|
|
656
|
+
name: String(processedName ?? ''),
|
|
657
|
+
...(rawNamespace !== undefined && processedNamespace !== undefined && {
|
|
658
|
+
namespace: String(processedNamespace),
|
|
659
|
+
}),
|
|
373
660
|
},
|
|
374
661
|
};
|
|
375
662
|
const entry = { id, externalRef: extRef };
|
|
376
663
|
// externalRef can still have includeWhen (but NOT forEach — mutually exclusive)
|
|
377
664
|
const rawIncludeWhen = readIncludeWhen(resource);
|
|
378
|
-
const includeWhen = resolveIncludeWhen(rawIncludeWhen);
|
|
665
|
+
const includeWhen = resolveIncludeWhen(rawIncludeWhen, context);
|
|
379
666
|
if (includeWhen) {
|
|
380
667
|
entry.includeWhen = includeWhen;
|
|
381
668
|
}
|
|
@@ -412,24 +699,59 @@ function buildResourceEntry(id, resource, context) {
|
|
|
412
699
|
}
|
|
413
700
|
}
|
|
414
701
|
}
|
|
702
|
+
// Orphaned $item sentinels — strip remaining $item references from non-forEach
|
|
703
|
+
// resources. When a schema array proxy is spread (`...spec.envFrom`) into a
|
|
704
|
+
// literal array, the proxy iterator yields $item-marked refs that never get
|
|
705
|
+
// matched by a forEach dimension. Collapse `path.$item.field` → `path` so
|
|
706
|
+
// the CEL expression references the whole array (valid CEL), rather than
|
|
707
|
+
// leaving `$item` which is not a valid CEL identifier.
|
|
708
|
+
if (entry.template && !hasForEach) {
|
|
709
|
+
entry.template = stripOrphanedItemSentinels(entry.template);
|
|
710
|
+
}
|
|
415
711
|
// Template overrides — ternary expressions in factory args that evaluated to
|
|
416
712
|
// literals at runtime but should be CEL conditionals in the output.
|
|
417
713
|
const templateOverrides = readTemplateOverrides(resource);
|
|
418
714
|
if (templateOverrides && templateOverrides.length > 0 && entry.template) {
|
|
419
|
-
applyTemplateOverrides(entry.template, templateOverrides);
|
|
715
|
+
applyTemplateOverrides(entry.template, templateOverrides, context);
|
|
420
716
|
}
|
|
421
717
|
// includeWhen — conditional resource creation (convert raw values to CEL)
|
|
422
718
|
const rawIncludeWhen = readIncludeWhen(resource);
|
|
423
|
-
const includeWhen = resolveIncludeWhen(rawIncludeWhen);
|
|
719
|
+
const includeWhen = resolveIncludeWhen(rawIncludeWhen, context);
|
|
424
720
|
if (includeWhen) {
|
|
425
721
|
entry.includeWhen = includeWhen;
|
|
426
722
|
}
|
|
427
723
|
// readyWhen — resource readiness conditions (convert callbacks/refs to CEL)
|
|
428
724
|
const rawReadyWhen = readReadyWhen(resource);
|
|
429
|
-
const readyWhen = resolveReadyWhen(rawReadyWhen, id, hasForEach);
|
|
725
|
+
const readyWhen = resolveReadyWhen(rawReadyWhen, id, hasForEach, context);
|
|
430
726
|
if (readyWhen) {
|
|
431
727
|
entry.readyWhen = readyWhen;
|
|
432
728
|
}
|
|
729
|
+
// dependsOn — explicit dependency ordering via template annotation injection.
|
|
730
|
+
//
|
|
731
|
+
// KRO builds its dependency graph ONLY from template expression references.
|
|
732
|
+
// readyWhen only supports self-references (e.g., self.status.readyReplicas)
|
|
733
|
+
// — it CANNOT reference other resources. To establish a dependency edge
|
|
734
|
+
// between resources, we inject an annotation into the dependent resource's
|
|
735
|
+
// template that references the dependency's metadata.name. KRO scans ALL
|
|
736
|
+
// template fields for expressions and creates DAG edges from them.
|
|
737
|
+
//
|
|
738
|
+
// Once KRO sees the edge, it automatically waits for the dependency to be
|
|
739
|
+
// ready (all its own readyWhen conditions satisfied) before creating the
|
|
740
|
+
// dependent resource. No cross-resource readyWhen is needed.
|
|
741
|
+
const dependsOnDeps = getMetadataField(resource, 'dependsOn');
|
|
742
|
+
if (dependsOnDeps && dependsOnDeps.length > 0) {
|
|
743
|
+
const template = entry.template;
|
|
744
|
+
if (template) {
|
|
745
|
+
const metadata = (template.metadata ?? {});
|
|
746
|
+
const annotations = (metadata.annotations ?? {});
|
|
747
|
+
for (const dep of dependsOnDeps) {
|
|
748
|
+
const resolvedDependencyId = resolveDependsOnResourceId(dep.resourceId, id, context.resourceIds);
|
|
749
|
+
annotations[`typekro.dev/depends-on-${resolvedDependencyId}`] = `\${${resolvedDependencyId}.metadata.name}`;
|
|
750
|
+
}
|
|
751
|
+
metadata.annotations = annotations;
|
|
752
|
+
template.metadata = metadata;
|
|
753
|
+
}
|
|
754
|
+
}
|
|
433
755
|
return entry;
|
|
434
756
|
}
|
|
435
757
|
// ---------------------------------------------------------------------------
|
|
@@ -438,7 +760,7 @@ function buildResourceEntry(id, resource, context) {
|
|
|
438
760
|
/**
|
|
439
761
|
* Serializes resources to Kro YAML (ResourceGraphDefinition).
|
|
440
762
|
*
|
|
441
|
-
* Supports Kro
|
|
763
|
+
* Supports Kro 0.9.1+ features:
|
|
442
764
|
* - externalRef: Resources marked with __externalRef emit `externalRef` instead of `template`
|
|
443
765
|
* - includeWhen: Non-enumerable includeWhen arrays are emitted per resource
|
|
444
766
|
* - readyWhen: Non-enumerable readyWhen arrays are emitted per resource
|
|
@@ -447,21 +769,45 @@ function buildResourceEntry(id, resource, context) {
|
|
|
447
769
|
* - allowBreakingChanges: Emits annotation on RGD metadata
|
|
448
770
|
*/
|
|
449
771
|
export function serializeResourceGraphToYaml(name, resources, options, customSchema) {
|
|
772
|
+
// Extract optional-field omit list from schema metadata (if present).
|
|
773
|
+
// These fields get `has() ? ... : omit()` wrapping applied inline during
|
|
774
|
+
// ref-to-CEL conversion — no post-hoc YAML-string rewriting needed.
|
|
775
|
+
const schemaWithMeta = customSchema;
|
|
776
|
+
const omitFieldsList = schemaWithMeta?.__omitFields;
|
|
777
|
+
const omitFields = omitFieldsList && omitFieldsList.length > 0
|
|
778
|
+
? new Set(omitFieldsList)
|
|
779
|
+
: undefined;
|
|
450
780
|
// Create serialization context
|
|
781
|
+
const nestedStatusCel = schemaWithMeta?.__nestedStatusCel;
|
|
451
782
|
const context = {
|
|
452
783
|
celPrefix: 'resources', // Default Kro prefix, but now configurable
|
|
453
784
|
...(options?.namespace && { namespace: options.namespace }),
|
|
454
785
|
resourceIdStrategy: 'deterministic',
|
|
786
|
+
...(omitFields && { omitFields }),
|
|
787
|
+
...(nestedStatusCel && { nestedStatusCel }),
|
|
455
788
|
};
|
|
456
789
|
// 1. Use embedded resource IDs and build dependency graph
|
|
457
790
|
const resourceMap = new Map();
|
|
458
791
|
const dependencies = [];
|
|
792
|
+
const resourceAliases = new Map();
|
|
459
793
|
// 2. Process each resource and extract references
|
|
460
794
|
for (const [resourceName, resource] of Object.entries(resources)) {
|
|
461
795
|
// Use the embedded resource ID if available, otherwise generate deterministic one
|
|
462
796
|
const resourceId = getResourceId(resource) ||
|
|
463
797
|
generateDeterministicResourceId(resource.kind || 'Resource', resource.metadata?.name || resourceName, resource.metadata?.namespace || options?.namespace);
|
|
464
798
|
resourceMap.set(resourceName, { id: resourceId, resource });
|
|
799
|
+
resourceAliases.set(resourceName, resourceId);
|
|
800
|
+
for (const alias of deriveResourceIdAliases(resourceId)) {
|
|
801
|
+
if (!resourceAliases.has(alias)) {
|
|
802
|
+
resourceAliases.set(alias, resourceId);
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
const aliases = getMetadataField(resource, 'resourceAliases');
|
|
806
|
+
if (aliases) {
|
|
807
|
+
for (const alias of aliases) {
|
|
808
|
+
resourceAliases.set(alias, resourceId);
|
|
809
|
+
}
|
|
810
|
+
}
|
|
465
811
|
// Extract all ResourceReference objects from the resource
|
|
466
812
|
const refs = extractResourceReferences(resource);
|
|
467
813
|
for (const ref of refs) {
|
|
@@ -473,10 +819,12 @@ export function serializeResourceGraphToYaml(name, resources, options, customSch
|
|
|
473
819
|
});
|
|
474
820
|
}
|
|
475
821
|
}
|
|
822
|
+
const knownResourceIds = new Set(Array.from(resourceMap.values(), ({ id }) => id));
|
|
823
|
+
context.resourceIds = knownResourceIds;
|
|
824
|
+
context.resourceAliases = resourceAliases;
|
|
476
825
|
// 3. Build metadata with optional annotations
|
|
477
826
|
const metadata = {
|
|
478
827
|
name,
|
|
479
|
-
namespace: options?.namespace || 'default',
|
|
480
828
|
};
|
|
481
829
|
if (options?.allowBreakingChanges) {
|
|
482
830
|
metadata.annotations = {
|