typekro 0.8.0 → 0.10.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/aspects.d.ts +3 -0
- package/dist/aspects.d.ts.map +1 -0
- package/dist/aspects.js +2 -0
- package/dist/aspects.js.map +1 -0
- 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 +27 -9
- package/dist/compositions/typekro-runtime/typekro-runtime.js.map +1 -1
- package/dist/core/aspects/apply.d.ts +30 -0
- package/dist/core/aspects/apply.d.ts.map +1 -0
- package/dist/core/aspects/apply.js +369 -0
- package/dist/core/aspects/apply.js.map +1 -0
- package/dist/core/aspects/dev-aspects.d.ts +14 -0
- package/dist/core/aspects/dev-aspects.d.ts.map +1 -0
- package/dist/core/aspects/dev-aspects.js +70 -0
- package/dist/core/aspects/dev-aspects.js.map +1 -0
- package/dist/core/aspects/index.d.ts +31 -0
- package/dist/core/aspects/index.d.ts.map +1 -0
- package/dist/core/aspects/index.js +30 -0
- package/dist/core/aspects/index.js.map +1 -0
- package/dist/core/aspects/metadata-aspects.d.ts +12 -0
- package/dist/core/aspects/metadata-aspects.d.ts.map +1 -0
- package/dist/core/aspects/metadata-aspects.js +24 -0
- package/dist/core/aspects/metadata-aspects.js.map +1 -0
- package/dist/core/aspects/metadata.d.ts +16 -0
- package/dist/core/aspects/metadata.d.ts.map +1 -0
- package/dist/core/aspects/metadata.js +24 -0
- package/dist/core/aspects/metadata.js.map +1 -0
- package/dist/core/aspects/primitives.d.ts +23 -0
- package/dist/core/aspects/primitives.d.ts.map +1 -0
- package/dist/core/aspects/primitives.js +258 -0
- package/dist/core/aspects/primitives.js.map +1 -0
- package/dist/core/aspects/targets.d.ts +9 -0
- package/dist/core/aspects/targets.d.ts.map +1 -0
- package/dist/core/aspects/targets.js +23 -0
- package/dist/core/aspects/targets.js.map +1 -0
- package/dist/core/aspects/types.d.ts +361 -0
- package/dist/core/aspects/types.d.ts.map +1 -0
- package/dist/core/aspects/types.js +16 -0
- package/dist/core/aspects/types.js.map +1 -0
- package/dist/core/aspects/workload-aspects.d.ts +17 -0
- package/dist/core/aspects/workload-aspects.d.ts.map +1 -0
- package/dist/core/aspects/workload-aspects.js +40 -0
- package/dist/core/aspects/workload-aspects.js.map +1 -0
- 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.map +1 -1
- package/dist/core/containers/build.js +40 -12
- package/dist/core/containers/build.js.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 +584 -62
- 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 +115 -3
- package/dist/core/deployment/kro-factory.d.ts.map +1 -1
- package/dist/core/deployment/kro-factory.js +922 -278
- 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 +29 -1
- package/dist/core/expressions/composition/composition-analyzer-helpers.d.ts.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-helpers.js +348 -17
- 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 +221 -10
- 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 +67 -2
- package/dist/core/expressions/composition/composition-analyzer-traversal.js.map +1 -1
- package/dist/core/expressions/composition/composition-analyzer-types.d.ts +52 -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 +150 -6
- 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 +49 -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 +79 -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 +22 -0
- package/dist/core/references/cel.d.ts.map +1 -1
- package/dist/core/references/cel.js +106 -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 +692 -156
- package/dist/core/serialization/cel-references.js.map +1 -1
- package/dist/core/serialization/core.d.ts +8 -8
- package/dist/core/serialization/core.d.ts.map +1 -1
- package/dist/core/serialization/core.js +672 -90
- package/dist/core/serialization/core.js.map +1 -1
- package/dist/core/serialization/kro-post-processing.d.ts +1 -1
- package/dist/core/serialization/kro-post-processing.d.ts.map +1 -1
- package/dist/core/serialization/kro-post-processing.js +69 -22
- package/dist/core/serialization/kro-post-processing.js.map +1 -1
- package/dist/core/serialization/schema.d.ts +1 -0
- package/dist/core/serialization/schema.d.ts.map +1 -1
- package/dist/core/serialization/schema.js +378 -50
- 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 +385 -55
- 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 +129 -9
- 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 +2 -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 +24 -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/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/searxng-bootstrap.d.ts +3 -2
- package/dist/factories/searxng/compositions/searxng-bootstrap.d.ts.map +1 -1
- package/dist/factories/searxng/compositions/searxng-bootstrap.js +205 -167
- package/dist/factories/searxng/compositions/searxng-bootstrap.js.map +1 -1
- package/dist/factories/searxng/resources/searxng.d.ts +1 -1
- package/dist/factories/searxng/resources/searxng.js +1 -1
- package/dist/factories/searxng/types.d.ts +5 -4
- package/dist/factories/searxng/types.d.ts.map +1 -1
- package/dist/factories/searxng/types.js +8 -7
- package/dist/factories/searxng/types.js.map +1 -1
- package/dist/factories/searxng/utils/settings-builder.d.ts +4 -3
- package/dist/factories/searxng/utils/settings-builder.d.ts.map +1 -1
- package/dist/factories/searxng/utils/settings-builder.js +4 -3
- package/dist/factories/searxng/utils/settings-builder.js.map +1 -1
- 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/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/index.d.ts +3 -3
- package/dist/factories/simple/index.d.ts.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 +4 -1
- package/dist/factories/simple/workloads/deployment.d.ts.map +1 -1
- package/dist/factories/simple/workloads/deployment.js +9 -2
- package/dist/factories/simple/workloads/deployment.js.map +1 -1
- package/dist/factories/simple/workloads/stateful-set.d.ts +4 -1
- package/dist/factories/simple/workloads/stateful-set.d.ts.map +1 -1
- package/dist/factories/simple/workloads/stateful-set.js +6 -2
- package/dist/factories/simple/workloads/stateful-set.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 +90 -6
- package/dist/factories/webapp/compositions/web-app-with-processing.d.ts.map +1 -1
- package/dist/factories/webapp/compositions/web-app-with-processing.js +180 -20
- 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 +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -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.
|
|
@@ -75,19 +77,19 @@ function readTemplateOverrides(resource) {
|
|
|
75
77
|
* - string (already CEL) → pass-through
|
|
76
78
|
* - string with __KUBERNETES_REF__ markers → convert markers to CEL
|
|
77
79
|
*/
|
|
78
|
-
function convertIncludeWhenValueToCel(value) {
|
|
80
|
+
function convertIncludeWhenValueToCel(value, context) {
|
|
79
81
|
if (typeof value === 'string') {
|
|
80
82
|
if (value.includes('__KUBERNETES_REF_')) {
|
|
81
|
-
return convertRefMarkersInString(value)
|
|
83
|
+
return `\${${convertRefMarkersInString(value, context)}}`;
|
|
82
84
|
}
|
|
83
85
|
return value;
|
|
84
86
|
}
|
|
85
87
|
if (isKubernetesRef(value)) {
|
|
86
|
-
const celPath = getInnerCelPath(value);
|
|
88
|
+
const celPath = normalizeRefMarkersToCelPaths(getInnerCelPath(value), context);
|
|
87
89
|
return `\${${celPath}}`;
|
|
88
90
|
}
|
|
89
91
|
if (isCelExpression(value)) {
|
|
90
|
-
return `\${${value.expression}}`;
|
|
92
|
+
return `\${${normalizeRefMarkersToCelPaths(value.expression, context)}}`;
|
|
91
93
|
}
|
|
92
94
|
// Fallback — coerce to string
|
|
93
95
|
if (value !== undefined && value !== null) {
|
|
@@ -103,13 +105,13 @@ function convertIncludeWhenValueToCel(value) {
|
|
|
103
105
|
* - An array of the above
|
|
104
106
|
* - undefined (no condition)
|
|
105
107
|
*/
|
|
106
|
-
function resolveIncludeWhen(raw) {
|
|
108
|
+
function resolveIncludeWhen(raw, context) {
|
|
107
109
|
if (raw === undefined || raw === null)
|
|
108
110
|
return undefined;
|
|
109
111
|
const items = Array.isArray(raw) ? raw : [raw];
|
|
110
112
|
const celStrings = [];
|
|
111
113
|
for (const item of items) {
|
|
112
|
-
const cel = convertIncludeWhenValueToCel(item);
|
|
114
|
+
const cel = convertIncludeWhenValueToCel(item, context);
|
|
113
115
|
if (cel)
|
|
114
116
|
celStrings.push(cel);
|
|
115
117
|
}
|
|
@@ -118,6 +120,109 @@ function resolveIncludeWhen(raw) {
|
|
|
118
120
|
// ---------------------------------------------------------------------------
|
|
119
121
|
// readyWhen → CEL conversion
|
|
120
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
|
+
}
|
|
121
226
|
/**
|
|
122
227
|
* Convert a readyWhen callback function to a CEL expression string by parsing its source.
|
|
123
228
|
*
|
|
@@ -170,17 +275,10 @@ function convertReadyWhenCallbackToCel(fn, resourceId) {
|
|
|
170
275
|
// JS → CEL operator conversions (must happen before inner callback processing)
|
|
171
276
|
celExpr = celExpr.replace(/===/g, '==');
|
|
172
277
|
celExpr = celExpr.replace(/!==/g, '!=');
|
|
173
|
-
// Convert JS arrow function callbacks inside
|
|
174
|
-
//
|
|
175
|
-
//
|
|
176
|
-
celExpr = celExpr
|
|
177
|
-
let cleanBody = innerBody.trim();
|
|
178
|
-
// Fix operators in inner body too
|
|
179
|
-
cleanBody = cleanBody.replace(/===/g, '==').replace(/!==/g, '!=');
|
|
180
|
-
// Convert single quotes to double quotes for string literals
|
|
181
|
-
cleanBody = cleanBody.replace(/'([^']+)'/g, '"$1"');
|
|
182
|
-
return `.${method}(${innerParam}, ${cleanBody})`;
|
|
183
|
-
});
|
|
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);
|
|
184
282
|
// Convert remaining single-quoted strings to double-quoted for CEL
|
|
185
283
|
celExpr = celExpr.replace(/'([^']+)'/g, '"$1"');
|
|
186
284
|
return celExpr;
|
|
@@ -194,7 +292,7 @@ function convertReadyWhenCallbackToCel(fn, resourceId) {
|
|
|
194
292
|
* - CelExpression object → `${expression}`
|
|
195
293
|
* - string (already CEL) → pass-through
|
|
196
294
|
*/
|
|
197
|
-
function convertReadyWhenValueToCel(value, resourceId, hasForEach) {
|
|
295
|
+
function convertReadyWhenValueToCel(value, resourceId, hasForEach, context) {
|
|
198
296
|
// Callback function — parse source to extract CEL expression
|
|
199
297
|
if (typeof value === 'function') {
|
|
200
298
|
const baseId = hasForEach ? 'each' : resourceId;
|
|
@@ -202,15 +300,16 @@ function convertReadyWhenValueToCel(value, resourceId, hasForEach) {
|
|
|
202
300
|
return `\${${celExpr}}`;
|
|
203
301
|
}
|
|
204
302
|
if (isKubernetesRef(value)) {
|
|
205
|
-
const celPath = getInnerCelPath(value);
|
|
303
|
+
const celPath = normalizeRefMarkersToCelPaths(getInnerCelPath(value), context);
|
|
206
304
|
return `\${${celPath}}`;
|
|
207
305
|
}
|
|
208
306
|
if (isCelExpression(value)) {
|
|
209
|
-
return `\${${value.expression}}`;
|
|
307
|
+
return `\${${normalizeRefMarkersToCelPaths(value.expression, context)}}`;
|
|
210
308
|
}
|
|
211
309
|
if (typeof value === 'string') {
|
|
212
310
|
if (value.includes('__KUBERNETES_REF_')) {
|
|
213
|
-
|
|
311
|
+
const converted = convertRefMarkersInString(value, context);
|
|
312
|
+
return converted.includes('${') ? converted : `\${${converted}}`;
|
|
214
313
|
}
|
|
215
314
|
return value;
|
|
216
315
|
}
|
|
@@ -222,13 +321,13 @@ function convertReadyWhenValueToCel(value, resourceId, hasForEach) {
|
|
|
222
321
|
/**
|
|
223
322
|
* Resolve the readyWhen property from an Enhanced resource to an array of CEL strings.
|
|
224
323
|
*/
|
|
225
|
-
function resolveReadyWhen(raw, resourceId, hasForEach) {
|
|
324
|
+
function resolveReadyWhen(raw, resourceId, hasForEach, context) {
|
|
226
325
|
if (raw === undefined || raw === null)
|
|
227
326
|
return undefined;
|
|
228
327
|
const items = Array.isArray(raw) ? raw : [raw];
|
|
229
328
|
const celStrings = [];
|
|
230
329
|
for (const item of items) {
|
|
231
|
-
const cel = convertReadyWhenValueToCel(item, resourceId, hasForEach);
|
|
330
|
+
const cel = convertReadyWhenValueToCel(item, resourceId, hasForEach, context);
|
|
232
331
|
if (cel)
|
|
233
332
|
celStrings.push(cel);
|
|
234
333
|
}
|
|
@@ -243,16 +342,8 @@ function resolveReadyWhen(raw, resourceId, hasForEach) {
|
|
|
243
342
|
* Input: "__KUBERNETES_REF_web_status.readyReplicas__ > 0"
|
|
244
343
|
* Output: "web.status.readyReplicas > 0"
|
|
245
344
|
*/
|
|
246
|
-
function convertRefMarkersInString(str) {
|
|
247
|
-
|
|
248
|
-
// For schema: __KUBERNETES_REF___schema___{fieldPath}__
|
|
249
|
-
const refPattern = /__KUBERNETES_REF_(__schema__|[^_]+)_([a-zA-Z0-9.$]+)__/g;
|
|
250
|
-
return str.replace(refPattern, (_match, resourceId, fieldPath) => {
|
|
251
|
-
if (resourceId === '__schema__') {
|
|
252
|
-
return `schema.${fieldPath}`;
|
|
253
|
-
}
|
|
254
|
-
return `${resourceId}.${fieldPath}`;
|
|
255
|
-
});
|
|
345
|
+
function convertRefMarkersInString(str, context) {
|
|
346
|
+
return normalizeRefMarkersToCelPaths(str, context);
|
|
256
347
|
}
|
|
257
348
|
// ---------------------------------------------------------------------------
|
|
258
349
|
// forEach $item sentinel substitution
|
|
@@ -302,6 +393,130 @@ function substituteForEachSentinels(template, basePath, varName) {
|
|
|
302
393
|
// Primitives (number, boolean, null, undefined) pass through unchanged
|
|
303
394
|
return template;
|
|
304
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
|
+
}
|
|
305
520
|
// ---------------------------------------------------------------------------
|
|
306
521
|
// Template override application
|
|
307
522
|
// ---------------------------------------------------------------------------
|
|
@@ -316,33 +531,90 @@ function substituteForEachSentinels(template, basePath, varName) {
|
|
|
316
531
|
* @param template - The processed template object (after processResourceReferences)
|
|
317
532
|
* @param overrides - Array of {propertyPath, celExpression} overrides
|
|
318
533
|
*/
|
|
319
|
-
function applyTemplateOverrides(template, overrides) {
|
|
534
|
+
function applyTemplateOverrides(template, overrides, context) {
|
|
320
535
|
for (const { propertyPath, celExpression } of overrides) {
|
|
321
536
|
const parts = propertyPath.split('.');
|
|
322
537
|
let target = template;
|
|
323
|
-
// 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.
|
|
324
541
|
for (let i = 0; i < parts.length - 1; i++) {
|
|
325
542
|
const part = parts[i];
|
|
326
543
|
if (!part)
|
|
327
544
|
continue;
|
|
328
|
-
|
|
329
|
-
|
|
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') {
|
|
330
551
|
target = next;
|
|
331
552
|
}
|
|
332
553
|
else {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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;
|
|
336
567
|
}
|
|
337
568
|
}
|
|
338
569
|
if (!target)
|
|
339
570
|
continue;
|
|
340
571
|
const lastKey = parts[parts.length - 1];
|
|
341
|
-
if (lastKey
|
|
342
|
-
|
|
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
|
+
}
|
|
343
580
|
}
|
|
344
581
|
}
|
|
345
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));
|
|
600
|
+
}
|
|
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;
|
|
617
|
+
}
|
|
346
618
|
// ---------------------------------------------------------------------------
|
|
347
619
|
// Resource entry builder
|
|
348
620
|
// ---------------------------------------------------------------------------
|
|
@@ -357,6 +629,10 @@ function applyTemplateOverrides(template, overrides) {
|
|
|
357
629
|
function buildResourceEntry(id, resource, context) {
|
|
358
630
|
const isExternalRef = readNonEnumerable(resource, '__externalRef');
|
|
359
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
|
+
}
|
|
360
636
|
// externalRef resources: emit externalRef metadata, NOT template.
|
|
361
637
|
// Use Object.getOwnPropertyDescriptor to bypass the Enhanced proxy's get trap
|
|
362
638
|
// and read the actual underlying values. Going through the proxy would cause
|
|
@@ -369,22 +645,24 @@ function buildResourceEntry(id, resource, context) {
|
|
|
369
645
|
// Process marker strings in metadata values to convert them to CEL expressions.
|
|
370
646
|
// externalRef metadata.name may contain __KUBERNETES_REF__ markers from template
|
|
371
647
|
// literals (e.g., `${spec.name}-db-${dbOwner}`).
|
|
372
|
-
const rawName =
|
|
373
|
-
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);
|
|
374
652
|
const extRef = {
|
|
375
653
|
apiVersion: String(apiVersionDesc?.value ?? ''),
|
|
376
654
|
kind: String(kindDesc?.value ?? ''),
|
|
377
655
|
metadata: {
|
|
378
|
-
name: String(
|
|
379
|
-
...(rawNamespace && {
|
|
380
|
-
namespace: String(
|
|
656
|
+
name: String(processedName ?? ''),
|
|
657
|
+
...(rawNamespace !== undefined && processedNamespace !== undefined && {
|
|
658
|
+
namespace: String(processedNamespace),
|
|
381
659
|
}),
|
|
382
660
|
},
|
|
383
661
|
};
|
|
384
662
|
const entry = { id, externalRef: extRef };
|
|
385
663
|
// externalRef can still have includeWhen (but NOT forEach — mutually exclusive)
|
|
386
664
|
const rawIncludeWhen = readIncludeWhen(resource);
|
|
387
|
-
const includeWhen = resolveIncludeWhen(rawIncludeWhen);
|
|
665
|
+
const includeWhen = resolveIncludeWhen(rawIncludeWhen, context);
|
|
388
666
|
if (includeWhen) {
|
|
389
667
|
entry.includeWhen = includeWhen;
|
|
390
668
|
}
|
|
@@ -421,24 +699,59 @@ function buildResourceEntry(id, resource, context) {
|
|
|
421
699
|
}
|
|
422
700
|
}
|
|
423
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
|
+
}
|
|
424
711
|
// Template overrides — ternary expressions in factory args that evaluated to
|
|
425
712
|
// literals at runtime but should be CEL conditionals in the output.
|
|
426
713
|
const templateOverrides = readTemplateOverrides(resource);
|
|
427
714
|
if (templateOverrides && templateOverrides.length > 0 && entry.template) {
|
|
428
|
-
applyTemplateOverrides(entry.template, templateOverrides);
|
|
715
|
+
applyTemplateOverrides(entry.template, templateOverrides, context);
|
|
429
716
|
}
|
|
430
717
|
// includeWhen — conditional resource creation (convert raw values to CEL)
|
|
431
718
|
const rawIncludeWhen = readIncludeWhen(resource);
|
|
432
|
-
const includeWhen = resolveIncludeWhen(rawIncludeWhen);
|
|
719
|
+
const includeWhen = resolveIncludeWhen(rawIncludeWhen, context);
|
|
433
720
|
if (includeWhen) {
|
|
434
721
|
entry.includeWhen = includeWhen;
|
|
435
722
|
}
|
|
436
723
|
// readyWhen — resource readiness conditions (convert callbacks/refs to CEL)
|
|
437
724
|
const rawReadyWhen = readReadyWhen(resource);
|
|
438
|
-
const readyWhen = resolveReadyWhen(rawReadyWhen, id, hasForEach);
|
|
725
|
+
const readyWhen = resolveReadyWhen(rawReadyWhen, id, hasForEach, context);
|
|
439
726
|
if (readyWhen) {
|
|
440
727
|
entry.readyWhen = readyWhen;
|
|
441
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
|
+
}
|
|
442
755
|
return entry;
|
|
443
756
|
}
|
|
444
757
|
// ---------------------------------------------------------------------------
|
|
@@ -447,7 +760,7 @@ function buildResourceEntry(id, resource, context) {
|
|
|
447
760
|
/**
|
|
448
761
|
* Serializes resources to Kro YAML (ResourceGraphDefinition).
|
|
449
762
|
*
|
|
450
|
-
* Supports Kro
|
|
763
|
+
* Supports Kro 0.9.1+ features:
|
|
451
764
|
* - externalRef: Resources marked with __externalRef emit `externalRef` instead of `template`
|
|
452
765
|
* - includeWhen: Non-enumerable includeWhen arrays are emitted per resource
|
|
453
766
|
* - readyWhen: Non-enumerable readyWhen arrays are emitted per resource
|
|
@@ -465,21 +778,36 @@ export function serializeResourceGraphToYaml(name, resources, options, customSch
|
|
|
465
778
|
? new Set(omitFieldsList)
|
|
466
779
|
: undefined;
|
|
467
780
|
// Create serialization context
|
|
781
|
+
const nestedStatusCel = schemaWithMeta?.__nestedStatusCel;
|
|
468
782
|
const context = {
|
|
469
783
|
celPrefix: 'resources', // Default Kro prefix, but now configurable
|
|
470
784
|
...(options?.namespace && { namespace: options.namespace }),
|
|
471
785
|
resourceIdStrategy: 'deterministic',
|
|
472
786
|
...(omitFields && { omitFields }),
|
|
787
|
+
...(nestedStatusCel && { nestedStatusCel }),
|
|
473
788
|
};
|
|
474
789
|
// 1. Use embedded resource IDs and build dependency graph
|
|
475
790
|
const resourceMap = new Map();
|
|
476
791
|
const dependencies = [];
|
|
792
|
+
const resourceAliases = new Map();
|
|
477
793
|
// 2. Process each resource and extract references
|
|
478
794
|
for (const [resourceName, resource] of Object.entries(resources)) {
|
|
479
795
|
// Use the embedded resource ID if available, otherwise generate deterministic one
|
|
480
796
|
const resourceId = getResourceId(resource) ||
|
|
481
797
|
generateDeterministicResourceId(resource.kind || 'Resource', resource.metadata?.name || resourceName, resource.metadata?.namespace || options?.namespace);
|
|
482
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
|
+
}
|
|
483
811
|
// Extract all ResourceReference objects from the resource
|
|
484
812
|
const refs = extractResourceReferences(resource);
|
|
485
813
|
for (const ref of refs) {
|
|
@@ -491,10 +819,12 @@ export function serializeResourceGraphToYaml(name, resources, options, customSch
|
|
|
491
819
|
});
|
|
492
820
|
}
|
|
493
821
|
}
|
|
822
|
+
const knownResourceIds = new Set(Array.from(resourceMap.values(), ({ id }) => id));
|
|
823
|
+
context.resourceIds = knownResourceIds;
|
|
824
|
+
context.resourceAliases = resourceAliases;
|
|
494
825
|
// 3. Build metadata with optional annotations
|
|
495
826
|
const metadata = {
|
|
496
827
|
name,
|
|
497
|
-
namespace: options?.namespace || 'default',
|
|
498
828
|
};
|
|
499
829
|
if (options?.allowBreakingChanges) {
|
|
500
830
|
metadata.annotations = {
|