typekro 0.1.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/LICENSE +185 -0
- package/README.md +1137 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/alchemy/deployers.d.ts +39 -0
- package/dist/alchemy/deployers.d.ts.map +1 -0
- package/dist/alchemy/deployers.js +194 -0
- package/dist/alchemy/deployers.js.map +1 -0
- package/dist/alchemy/deployment.d.ts +12 -0
- package/dist/alchemy/deployment.d.ts.map +1 -0
- package/dist/alchemy/deployment.js +12 -0
- package/dist/alchemy/deployment.js.map +1 -0
- package/dist/alchemy/index.d.ts +17 -0
- package/dist/alchemy/index.d.ts.map +1 -0
- package/dist/alchemy/index.js +20 -0
- package/dist/alchemy/index.js.map +1 -0
- package/dist/alchemy/resolver.d.ts +127 -0
- package/dist/alchemy/resolver.d.ts.map +1 -0
- package/dist/alchemy/resolver.js +341 -0
- package/dist/alchemy/resolver.js.map +1 -0
- package/dist/alchemy/resource-registration.d.ts +22 -0
- package/dist/alchemy/resource-registration.d.ts.map +1 -0
- package/dist/alchemy/resource-registration.js +218 -0
- package/dist/alchemy/resource-registration.js.map +1 -0
- package/dist/alchemy/type-inference.d.ts +13 -0
- package/dist/alchemy/type-inference.d.ts.map +1 -0
- package/dist/alchemy/type-inference.js +67 -0
- package/dist/alchemy/type-inference.js.map +1 -0
- package/dist/alchemy/types.d.ts +92 -0
- package/dist/alchemy/types.d.ts.map +1 -0
- package/dist/alchemy/types.js +8 -0
- package/dist/alchemy/types.js.map +1 -0
- package/dist/alchemy/utilities.d.ts +12 -0
- package/dist/alchemy/utilities.d.ts.map +1 -0
- package/dist/alchemy/utilities.js +16 -0
- package/dist/alchemy/utilities.js.map +1 -0
- package/dist/alchemy/wrapper.d.ts +16 -0
- package/dist/alchemy/wrapper.d.ts.map +1 -0
- package/dist/alchemy/wrapper.js +23 -0
- package/dist/alchemy/wrapper.js.map +1 -0
- package/dist/core/composition/composition.d.ts +94 -0
- package/dist/core/composition/composition.d.ts.map +1 -0
- package/dist/core/composition/composition.js +230 -0
- package/dist/core/composition/composition.js.map +1 -0
- package/dist/core/composition/index.d.ts +12 -0
- package/dist/core/composition/index.d.ts.map +1 -0
- package/dist/core/composition/index.js +12 -0
- package/dist/core/composition/index.js.map +1 -0
- package/dist/core/composition/typekro-runtime/index.d.ts +3 -0
- package/dist/core/composition/typekro-runtime/index.d.ts.map +1 -0
- package/dist/core/composition/typekro-runtime/index.js +2 -0
- package/dist/core/composition/typekro-runtime/index.js.map +1 -0
- package/dist/core/composition/typekro-runtime/typekro-runtime.d.ts +39 -0
- package/dist/core/composition/typekro-runtime/typekro-runtime.d.ts.map +1 -0
- package/dist/core/composition/typekro-runtime/typekro-runtime.js +100 -0
- package/dist/core/composition/typekro-runtime/typekro-runtime.js.map +1 -0
- package/dist/core/composition/typekro-runtime/types.d.ts +16 -0
- package/dist/core/composition/typekro-runtime/types.d.ts.map +1 -0
- package/dist/core/composition/typekro-runtime/types.js +12 -0
- package/dist/core/composition/typekro-runtime/types.js.map +1 -0
- package/dist/core/composition/types.d.ts +264 -0
- package/dist/core/composition/types.d.ts.map +1 -0
- package/dist/core/composition/types.js +2 -0
- package/dist/core/composition/types.js.map +1 -0
- package/dist/core/constants/brands.d.ts +42 -0
- package/dist/core/constants/brands.d.ts.map +1 -0
- package/dist/core/constants/brands.js +51 -0
- package/dist/core/constants/brands.js.map +1 -0
- package/dist/core/dependencies/graph.d.ts +67 -0
- package/dist/core/dependencies/graph.d.ts.map +1 -0
- package/dist/core/dependencies/graph.js +220 -0
- package/dist/core/dependencies/graph.js.map +1 -0
- package/dist/core/dependencies/index.d.ts +7 -0
- package/dist/core/dependencies/index.d.ts.map +1 -0
- package/dist/core/dependencies/index.js +8 -0
- package/dist/core/dependencies/index.js.map +1 -0
- package/dist/core/dependencies/resolver.d.ts +53 -0
- package/dist/core/dependencies/resolver.d.ts.map +1 -0
- package/dist/core/dependencies/resolver.js +167 -0
- package/dist/core/dependencies/resolver.js.map +1 -0
- package/dist/core/dependencies/type-guards.d.ts +17 -0
- package/dist/core/dependencies/type-guards.d.ts.map +1 -0
- package/dist/core/dependencies/type-guards.js +35 -0
- package/dist/core/dependencies/type-guards.js.map +1 -0
- package/dist/core/deployment/deployment-strategies.d.ts +12 -0
- package/dist/core/deployment/deployment-strategies.d.ts.map +1 -0
- package/dist/core/deployment/deployment-strategies.js +11 -0
- package/dist/core/deployment/deployment-strategies.js.map +1 -0
- package/dist/core/deployment/direct-factory.d.ts +111 -0
- package/dist/core/deployment/direct-factory.d.ts.map +1 -0
- package/dist/core/deployment/direct-factory.js +627 -0
- package/dist/core/deployment/direct-factory.js.map +1 -0
- package/dist/core/deployment/engine.d.ts +128 -0
- package/dist/core/deployment/engine.d.ts.map +1 -0
- package/dist/core/deployment/engine.js +1408 -0
- package/dist/core/deployment/engine.js.map +1 -0
- package/dist/core/deployment/index.d.ts +14 -0
- package/dist/core/deployment/index.d.ts.map +1 -0
- package/dist/core/deployment/index.js +14 -0
- package/dist/core/deployment/index.js.map +1 -0
- package/dist/core/deployment/kro-factory.d.ts +143 -0
- package/dist/core/deployment/kro-factory.d.ts.map +1 -0
- package/dist/core/deployment/kro-factory.js +837 -0
- package/dist/core/deployment/kro-factory.js.map +1 -0
- package/dist/core/deployment/readiness.d.ts +54 -0
- package/dist/core/deployment/readiness.d.ts.map +1 -0
- package/dist/core/deployment/readiness.js +175 -0
- package/dist/core/deployment/readiness.js.map +1 -0
- package/dist/core/deployment/rollback-manager.d.ts +63 -0
- package/dist/core/deployment/rollback-manager.d.ts.map +1 -0
- package/dist/core/deployment/rollback-manager.js +225 -0
- package/dist/core/deployment/rollback-manager.js.map +1 -0
- package/dist/core/deployment/shared-utilities.d.ts +41 -0
- package/dist/core/deployment/shared-utilities.d.ts.map +1 -0
- package/dist/core/deployment/shared-utilities.js +100 -0
- package/dist/core/deployment/shared-utilities.js.map +1 -0
- package/dist/core/deployment/status-hydrator.d.ts +86 -0
- package/dist/core/deployment/status-hydrator.d.ts.map +1 -0
- package/dist/core/deployment/status-hydrator.js +262 -0
- package/dist/core/deployment/status-hydrator.js.map +1 -0
- package/dist/core/deployment/strategies/alchemy-strategy.d.ts +107 -0
- package/dist/core/deployment/strategies/alchemy-strategy.d.ts.map +1 -0
- package/dist/core/deployment/strategies/alchemy-strategy.js +446 -0
- package/dist/core/deployment/strategies/alchemy-strategy.js.map +1 -0
- package/dist/core/deployment/strategies/base-strategy.d.ts +50 -0
- package/dist/core/deployment/strategies/base-strategy.d.ts.map +1 -0
- package/dist/core/deployment/strategies/base-strategy.js +82 -0
- package/dist/core/deployment/strategies/base-strategy.js.map +1 -0
- package/dist/core/deployment/strategies/direct-strategy.d.ts +29 -0
- package/dist/core/deployment/strategies/direct-strategy.d.ts.map +1 -0
- package/dist/core/deployment/strategies/direct-strategy.js +80 -0
- package/dist/core/deployment/strategies/direct-strategy.js.map +1 -0
- package/dist/core/deployment/strategies/index.d.ts +12 -0
- package/dist/core/deployment/strategies/index.d.ts.map +1 -0
- package/dist/core/deployment/strategies/index.js +12 -0
- package/dist/core/deployment/strategies/index.js.map +1 -0
- package/dist/core/deployment/strategies/kro-strategy.d.ts +41 -0
- package/dist/core/deployment/strategies/kro-strategy.d.ts.map +1 -0
- package/dist/core/deployment/strategies/kro-strategy.js +270 -0
- package/dist/core/deployment/strategies/kro-strategy.js.map +1 -0
- package/dist/core/direct-deployment.d.ts +8 -0
- package/dist/core/direct-deployment.d.ts.map +1 -0
- package/dist/core/direct-deployment.js +9 -0
- package/dist/core/direct-deployment.js.map +1 -0
- package/dist/core/errors.d.ts +73 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +250 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/evaluation/cel-optimizer.d.ts +48 -0
- package/dist/core/evaluation/cel-optimizer.d.ts.map +1 -0
- package/dist/core/evaluation/cel-optimizer.js +176 -0
- package/dist/core/evaluation/cel-optimizer.js.map +1 -0
- package/dist/core/factory.d.ts +12 -0
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +13 -0
- package/dist/core/factory.js.map +1 -0
- package/dist/core/kubernetes/api.d.ts +43 -0
- package/dist/core/kubernetes/api.d.ts.map +1 -0
- package/dist/core/kubernetes/api.js +209 -0
- package/dist/core/kubernetes/api.js.map +1 -0
- package/dist/core/kubernetes/client-provider.d.ts +204 -0
- package/dist/core/kubernetes/client-provider.d.ts.map +1 -0
- package/dist/core/kubernetes/client-provider.js +421 -0
- package/dist/core/kubernetes/client-provider.js.map +1 -0
- package/dist/core/logging/config.d.ts +14 -0
- package/dist/core/logging/config.d.ts.map +1 -0
- package/dist/core/logging/config.js +57 -0
- package/dist/core/logging/config.js.map +1 -0
- package/dist/core/logging/index.d.ts +4 -0
- package/dist/core/logging/index.d.ts.map +1 -0
- package/dist/core/logging/index.js +4 -0
- package/dist/core/logging/index.js.map +1 -0
- package/dist/core/logging/logger.d.ts +26 -0
- package/dist/core/logging/logger.d.ts.map +1 -0
- package/dist/core/logging/logger.js +114 -0
- package/dist/core/logging/logger.js.map +1 -0
- package/dist/core/logging/types.d.ts +93 -0
- package/dist/core/logging/types.d.ts.map +1 -0
- package/dist/core/logging/types.js +2 -0
- package/dist/core/logging/types.js.map +1 -0
- package/dist/core/readiness/cluster-state.d.ts +229 -0
- package/dist/core/readiness/cluster-state.d.ts.map +1 -0
- package/dist/core/readiness/cluster-state.js +360 -0
- package/dist/core/readiness/cluster-state.js.map +1 -0
- package/dist/core/readiness/index.d.ts +5 -0
- package/dist/core/readiness/index.d.ts.map +1 -0
- package/dist/core/readiness/index.js +5 -0
- package/dist/core/readiness/index.js.map +1 -0
- package/dist/core/readiness/registry.d.ts +45 -0
- package/dist/core/readiness/registry.d.ts.map +1 -0
- package/dist/core/readiness/registry.js +62 -0
- package/dist/core/readiness/registry.js.map +1 -0
- package/dist/core/references/cel-evaluator.d.ts +102 -0
- package/dist/core/references/cel-evaluator.d.ts.map +1 -0
- package/dist/core/references/cel-evaluator.js +288 -0
- package/dist/core/references/cel-evaluator.js.map +1 -0
- package/dist/core/references/cel.d.ts +75 -0
- package/dist/core/references/cel.d.ts.map +1 -0
- package/dist/core/references/cel.js +213 -0
- package/dist/core/references/cel.js.map +1 -0
- package/dist/core/references/external-refs.d.ts +37 -0
- package/dist/core/references/external-refs.d.ts.map +1 -0
- package/dist/core/references/external-refs.js +53 -0
- package/dist/core/references/external-refs.js.map +1 -0
- package/dist/core/references/index.d.ts +15 -0
- package/dist/core/references/index.d.ts.map +1 -0
- package/dist/core/references/index.js +19 -0
- package/dist/core/references/index.js.map +1 -0
- package/dist/core/references/resolver.d.ts +117 -0
- package/dist/core/references/resolver.d.ts.map +1 -0
- package/dist/core/references/resolver.js +554 -0
- package/dist/core/references/resolver.js.map +1 -0
- package/dist/core/references/schema-proxy.d.ts +38 -0
- package/dist/core/references/schema-proxy.d.ts.map +1 -0
- package/dist/core/references/schema-proxy.js +163 -0
- package/dist/core/references/schema-proxy.js.map +1 -0
- package/dist/core/serialization/core.d.ts +15 -0
- package/dist/core/serialization/core.d.ts.map +1 -0
- package/dist/core/serialization/core.js +169 -0
- package/dist/core/serialization/core.js.map +1 -0
- package/dist/core/serialization/index.d.ts +9 -0
- package/dist/core/serialization/index.d.ts.map +1 -0
- package/dist/core/serialization/index.js +12 -0
- package/dist/core/serialization/index.js.map +1 -0
- package/dist/core/serialization/schema.d.ts +14 -0
- package/dist/core/serialization/schema.d.ts.map +1 -0
- package/dist/core/serialization/schema.js +33 -0
- package/dist/core/serialization/schema.js.map +1 -0
- package/dist/core/serialization/validation.d.ts +18 -0
- package/dist/core/serialization/validation.d.ts.map +1 -0
- package/dist/core/serialization/validation.js +165 -0
- package/dist/core/serialization/validation.js.map +1 -0
- package/dist/core/serialization/yaml.d.ts +10 -0
- package/dist/core/serialization/yaml.d.ts.map +1 -0
- package/dist/core/serialization/yaml.js +63 -0
- package/dist/core/serialization/yaml.js.map +1 -0
- package/dist/core/types/common.d.ts +41 -0
- package/dist/core/types/common.d.ts.map +1 -0
- package/dist/core/types/common.js +9 -0
- package/dist/core/types/common.js.map +1 -0
- package/dist/core/types/dependencies.d.ts +14 -0
- package/dist/core/types/dependencies.d.ts.map +1 -0
- package/dist/core/types/dependencies.js +5 -0
- package/dist/core/types/dependencies.js.map +1 -0
- package/dist/core/types/deployment.d.ts +265 -0
- package/dist/core/types/deployment.d.ts.map +1 -0
- package/dist/core/types/deployment.js +20 -0
- package/dist/core/types/deployment.js.map +1 -0
- package/dist/core/types/index.d.ts +19 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +15 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/types/kubernetes.d.ts +352 -0
- package/dist/core/types/kubernetes.d.ts.map +1 -0
- package/dist/core/types/kubernetes.js +5 -0
- package/dist/core/types/kubernetes.js.map +1 -0
- package/dist/core/types/references.d.ts +54 -0
- package/dist/core/types/references.d.ts.map +1 -0
- package/dist/core/types/references.js +14 -0
- package/dist/core/types/references.js.map +1 -0
- package/dist/core/types/resource-graph.d.ts +93 -0
- package/dist/core/types/resource-graph.d.ts.map +1 -0
- package/dist/core/types/resource-graph.js +8 -0
- package/dist/core/types/resource-graph.js.map +1 -0
- package/dist/core/types/serialization.d.ts +210 -0
- package/dist/core/types/serialization.d.ts.map +1 -0
- package/dist/core/types/serialization.js +5 -0
- package/dist/core/types/serialization.js.map +1 -0
- package/dist/core/types/yaml.d.ts +92 -0
- package/dist/core/types/yaml.d.ts.map +1 -0
- package/dist/core/types/yaml.js +2 -0
- package/dist/core/types/yaml.js.map +1 -0
- package/dist/core/types.d.ts +8 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +9 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validation/cel-validator.d.ts +47 -0
- package/dist/core/validation/cel-validator.d.ts.map +1 -0
- package/dist/core/validation/cel-validator.js +200 -0
- package/dist/core/validation/cel-validator.js.map +1 -0
- package/dist/core/yaml/index.d.ts +5 -0
- package/dist/core/yaml/index.d.ts.map +1 -0
- package/dist/core/yaml/index.js +5 -0
- package/dist/core/yaml/index.js.map +1 -0
- package/dist/core/yaml/path-resolver.d.ts +122 -0
- package/dist/core/yaml/path-resolver.d.ts.map +1 -0
- package/dist/core/yaml/path-resolver.js +556 -0
- package/dist/core/yaml/path-resolver.js.map +1 -0
- package/dist/core.d.ts +30 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +59 -0
- package/dist/core.js.map +1 -0
- package/dist/factories/flux/git-repository.d.ts +62 -0
- package/dist/factories/flux/git-repository.d.ts.map +1 -0
- package/dist/factories/flux/git-repository.js +34 -0
- package/dist/factories/flux/git-repository.js.map +1 -0
- package/dist/factories/flux/index.d.ts +10 -0
- package/dist/factories/flux/index.d.ts.map +1 -0
- package/dist/factories/flux/index.js +11 -0
- package/dist/factories/flux/index.js.map +1 -0
- package/dist/factories/flux/kustomize/index.d.ts +4 -0
- package/dist/factories/flux/kustomize/index.d.ts.map +1 -0
- package/dist/factories/flux/kustomize/index.js +3 -0
- package/dist/factories/flux/kustomize/index.js.map +1 -0
- package/dist/factories/flux/kustomize/kustomization.d.ts +178 -0
- package/dist/factories/flux/kustomize/kustomization.d.ts.map +1 -0
- package/dist/factories/flux/kustomize/kustomization.js +108 -0
- package/dist/factories/flux/kustomize/kustomization.js.map +1 -0
- package/dist/factories/flux/kustomize/readiness-evaluators.d.ts +9 -0
- package/dist/factories/flux/kustomize/readiness-evaluators.d.ts.map +1 -0
- package/dist/factories/flux/kustomize/readiness-evaluators.js +71 -0
- package/dist/factories/flux/kustomize/readiness-evaluators.js.map +1 -0
- package/dist/factories/flux/kustomize/types.d.ts +2 -0
- package/dist/factories/flux/kustomize/types.d.ts.map +1 -0
- package/dist/factories/flux/kustomize/types.js +2 -0
- package/dist/factories/flux/kustomize/types.js.map +1 -0
- package/dist/factories/helm/helm-release.d.ts +139 -0
- package/dist/factories/helm/helm-release.d.ts.map +1 -0
- package/dist/factories/helm/helm-release.js +180 -0
- package/dist/factories/helm/helm-release.js.map +1 -0
- package/dist/factories/helm/helm-repository.d.ts +24 -0
- package/dist/factories/helm/helm-repository.d.ts.map +1 -0
- package/dist/factories/helm/helm-repository.js +57 -0
- package/dist/factories/helm/helm-repository.js.map +1 -0
- package/dist/factories/helm/index.d.ts +8 -0
- package/dist/factories/helm/index.d.ts.map +1 -0
- package/dist/factories/helm/index.js +8 -0
- package/dist/factories/helm/index.js.map +1 -0
- package/dist/factories/helm/readiness-evaluators.d.ts +55 -0
- package/dist/factories/helm/readiness-evaluators.d.ts.map +1 -0
- package/dist/factories/helm/readiness-evaluators.js +295 -0
- package/dist/factories/helm/readiness-evaluators.js.map +1 -0
- package/dist/factories/helm/types.d.ts +21 -0
- package/dist/factories/helm/types.d.ts.map +1 -0
- package/dist/factories/helm/types.js +2 -0
- package/dist/factories/helm/types.js.map +1 -0
- package/dist/factories/index.d.ts +12 -0
- package/dist/factories/index.d.ts.map +1 -0
- package/dist/factories/index.js +31 -0
- package/dist/factories/index.js.map +1 -0
- package/dist/factories/kro/index.d.ts +11 -0
- package/dist/factories/kro/index.d.ts.map +1 -0
- package/dist/factories/kro/index.js +10 -0
- package/dist/factories/kro/index.js.map +1 -0
- package/dist/factories/kro/kro-crd.d.ts +14 -0
- package/dist/factories/kro/kro-crd.d.ts.map +1 -0
- package/dist/factories/kro/kro-crd.js +51 -0
- package/dist/factories/kro/kro-crd.js.map +1 -0
- package/dist/factories/kro/kro-custom-resource.d.ts +23 -0
- package/dist/factories/kro/kro-custom-resource.d.ts.map +1 -0
- package/dist/factories/kro/kro-custom-resource.js +153 -0
- package/dist/factories/kro/kro-custom-resource.js.map +1 -0
- package/dist/factories/kro/resource-graph-definition.d.ts +12 -0
- package/dist/factories/kro/resource-graph-definition.d.ts.map +1 -0
- package/dist/factories/kro/resource-graph-definition.js +94 -0
- package/dist/factories/kro/resource-graph-definition.js.map +1 -0
- package/dist/factories/kubernetes/admission/index.d.ts +9 -0
- package/dist/factories/kubernetes/admission/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/admission/index.js +9 -0
- package/dist/factories/kubernetes/admission/index.js.map +1 -0
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.d.ts +5 -0
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.d.ts.map +1 -0
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.js +10 -0
- package/dist/factories/kubernetes/admission/mutating-webhook-configuration.js.map +1 -0
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.d.ts +5 -0
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.d.ts.map +1 -0
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.js +10 -0
- package/dist/factories/kubernetes/admission/validating-webhook-configuration.js.map +1 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.d.ts +6 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.d.ts.map +1 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.js +35 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.js.map +1 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.d.ts +6 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.d.ts.map +1 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js +31 -0
- package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js.map +1 -0
- package/dist/factories/kubernetes/autoscaling/index.d.ts +9 -0
- package/dist/factories/kubernetes/autoscaling/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/autoscaling/index.js +9 -0
- package/dist/factories/kubernetes/autoscaling/index.js.map +1 -0
- package/dist/factories/kubernetes/certificates/certificate-signing-request.d.ts +6 -0
- package/dist/factories/kubernetes/certificates/certificate-signing-request.d.ts.map +1 -0
- package/dist/factories/kubernetes/certificates/certificate-signing-request.js +48 -0
- package/dist/factories/kubernetes/certificates/certificate-signing-request.js.map +1 -0
- package/dist/factories/kubernetes/certificates/index.d.ts +8 -0
- package/dist/factories/kubernetes/certificates/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/certificates/index.js +8 -0
- package/dist/factories/kubernetes/certificates/index.js.map +1 -0
- package/dist/factories/kubernetes/config/config-map.d.ts +5 -0
- package/dist/factories/kubernetes/config/config-map.d.ts.map +1 -0
- package/dist/factories/kubernetes/config/config-map.js +16 -0
- package/dist/factories/kubernetes/config/config-map.js.map +1 -0
- package/dist/factories/kubernetes/config/index.d.ts +9 -0
- package/dist/factories/kubernetes/config/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/config/index.js +9 -0
- package/dist/factories/kubernetes/config/index.js.map +1 -0
- package/dist/factories/kubernetes/config/secret.d.ts +5 -0
- package/dist/factories/kubernetes/config/secret.d.ts.map +1 -0
- package/dist/factories/kubernetes/config/secret.js +16 -0
- package/dist/factories/kubernetes/config/secret.js.map +1 -0
- package/dist/factories/kubernetes/coordination/index.d.ts +8 -0
- package/dist/factories/kubernetes/coordination/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/coordination/index.js +8 -0
- package/dist/factories/kubernetes/coordination/index.js.map +1 -0
- package/dist/factories/kubernetes/coordination/lease.d.ts +5 -0
- package/dist/factories/kubernetes/coordination/lease.d.ts.map +1 -0
- package/dist/factories/kubernetes/coordination/lease.js +10 -0
- package/dist/factories/kubernetes/coordination/lease.js.map +1 -0
- package/dist/factories/kubernetes/core/component-status.d.ts +4 -0
- package/dist/factories/kubernetes/core/component-status.d.ts.map +1 -0
- package/dist/factories/kubernetes/core/component-status.js +25 -0
- package/dist/factories/kubernetes/core/component-status.js.map +1 -0
- package/dist/factories/kubernetes/core/index.d.ts +11 -0
- package/dist/factories/kubernetes/core/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/core/index.js +11 -0
- package/dist/factories/kubernetes/core/index.js.map +1 -0
- package/dist/factories/kubernetes/core/namespace.d.ts +9 -0
- package/dist/factories/kubernetes/core/namespace.d.ts.map +1 -0
- package/dist/factories/kubernetes/core/namespace.js +48 -0
- package/dist/factories/kubernetes/core/namespace.js.map +1 -0
- package/dist/factories/kubernetes/core/node.d.ts +6 -0
- package/dist/factories/kubernetes/core/node.d.ts.map +1 -0
- package/dist/factories/kubernetes/core/node.js +34 -0
- package/dist/factories/kubernetes/core/node.js.map +1 -0
- package/dist/factories/kubernetes/core/pod.d.ts +6 -0
- package/dist/factories/kubernetes/core/pod.d.ts.map +1 -0
- package/dist/factories/kubernetes/core/pod.js +44 -0
- package/dist/factories/kubernetes/core/pod.js.map +1 -0
- package/dist/factories/kubernetes/extensions/custom-resource-definition.d.ts +6 -0
- package/dist/factories/kubernetes/extensions/custom-resource-definition.d.ts.map +1 -0
- package/dist/factories/kubernetes/extensions/custom-resource-definition.js +45 -0
- package/dist/factories/kubernetes/extensions/custom-resource-definition.js.map +1 -0
- package/dist/factories/kubernetes/extensions/custom-resource.d.ts +12 -0
- package/dist/factories/kubernetes/extensions/custom-resource.d.ts.map +1 -0
- package/dist/factories/kubernetes/extensions/custom-resource.js +17 -0
- package/dist/factories/kubernetes/extensions/custom-resource.js.map +1 -0
- package/dist/factories/kubernetes/extensions/index.d.ts +9 -0
- package/dist/factories/kubernetes/extensions/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/extensions/index.js +9 -0
- package/dist/factories/kubernetes/extensions/index.js.map +1 -0
- package/dist/factories/kubernetes/index.d.ts +24 -0
- package/dist/factories/kubernetes/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/index.js +75 -0
- package/dist/factories/kubernetes/index.js.map +1 -0
- package/dist/factories/kubernetes/networking/endpoint-slice.d.ts +4 -0
- package/dist/factories/kubernetes/networking/endpoint-slice.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/endpoint-slice.js +10 -0
- package/dist/factories/kubernetes/networking/endpoint-slice.js.map +1 -0
- package/dist/factories/kubernetes/networking/endpoints.d.ts +4 -0
- package/dist/factories/kubernetes/networking/endpoints.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/endpoints.js +39 -0
- package/dist/factories/kubernetes/networking/endpoints.js.map +1 -0
- package/dist/factories/kubernetes/networking/index.d.ts +13 -0
- package/dist/factories/kubernetes/networking/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/index.js +13 -0
- package/dist/factories/kubernetes/networking/index.js.map +1 -0
- package/dist/factories/kubernetes/networking/ingress-class.d.ts +5 -0
- package/dist/factories/kubernetes/networking/ingress-class.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/ingress-class.js +16 -0
- package/dist/factories/kubernetes/networking/ingress-class.js.map +1 -0
- package/dist/factories/kubernetes/networking/ingress.d.ts +5 -0
- package/dist/factories/kubernetes/networking/ingress.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/ingress.js +33 -0
- package/dist/factories/kubernetes/networking/ingress.js.map +1 -0
- package/dist/factories/kubernetes/networking/network-policy.d.ts +5 -0
- package/dist/factories/kubernetes/networking/network-policy.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/network-policy.js +17 -0
- package/dist/factories/kubernetes/networking/network-policy.js.map +1 -0
- package/dist/factories/kubernetes/networking/service.d.ts +5 -0
- package/dist/factories/kubernetes/networking/service.d.ts.map +1 -0
- package/dist/factories/kubernetes/networking/service.js +64 -0
- package/dist/factories/kubernetes/networking/service.js.map +1 -0
- package/dist/factories/kubernetes/policy/index.d.ts +10 -0
- package/dist/factories/kubernetes/policy/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/policy/index.js +10 -0
- package/dist/factories/kubernetes/policy/index.js.map +1 -0
- package/dist/factories/kubernetes/policy/limit-range.d.ts +5 -0
- package/dist/factories/kubernetes/policy/limit-range.d.ts.map +1 -0
- package/dist/factories/kubernetes/policy/limit-range.js +17 -0
- package/dist/factories/kubernetes/policy/limit-range.js.map +1 -0
- package/dist/factories/kubernetes/policy/pod-disruption-budget.d.ts +6 -0
- package/dist/factories/kubernetes/policy/pod-disruption-budget.d.ts.map +1 -0
- package/dist/factories/kubernetes/policy/pod-disruption-budget.js +55 -0
- package/dist/factories/kubernetes/policy/pod-disruption-budget.js.map +1 -0
- package/dist/factories/kubernetes/policy/resource-quota.d.ts +6 -0
- package/dist/factories/kubernetes/policy/resource-quota.d.ts.map +1 -0
- package/dist/factories/kubernetes/policy/resource-quota.js +43 -0
- package/dist/factories/kubernetes/policy/resource-quota.js.map +1 -0
- package/dist/factories/kubernetes/rbac/cluster-role-binding.d.ts +4 -0
- package/dist/factories/kubernetes/rbac/cluster-role-binding.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/cluster-role-binding.js +17 -0
- package/dist/factories/kubernetes/rbac/cluster-role-binding.js.map +1 -0
- package/dist/factories/kubernetes/rbac/cluster-role.d.ts +4 -0
- package/dist/factories/kubernetes/rbac/cluster-role.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/cluster-role.js +17 -0
- package/dist/factories/kubernetes/rbac/cluster-role.js.map +1 -0
- package/dist/factories/kubernetes/rbac/index.d.ts +12 -0
- package/dist/factories/kubernetes/rbac/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/index.js +12 -0
- package/dist/factories/kubernetes/rbac/index.js.map +1 -0
- package/dist/factories/kubernetes/rbac/role-binding.d.ts +4 -0
- package/dist/factories/kubernetes/rbac/role-binding.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/role-binding.js +17 -0
- package/dist/factories/kubernetes/rbac/role-binding.js.map +1 -0
- package/dist/factories/kubernetes/rbac/role.d.ts +4 -0
- package/dist/factories/kubernetes/rbac/role.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/role.js +17 -0
- package/dist/factories/kubernetes/rbac/role.js.map +1 -0
- package/dist/factories/kubernetes/rbac/service-account.d.ts +4 -0
- package/dist/factories/kubernetes/rbac/service-account.d.ts.map +1 -0
- package/dist/factories/kubernetes/rbac/service-account.js +17 -0
- package/dist/factories/kubernetes/rbac/service-account.js.map +1 -0
- package/dist/factories/kubernetes/scheduling/index.d.ts +9 -0
- package/dist/factories/kubernetes/scheduling/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/scheduling/index.js +9 -0
- package/dist/factories/kubernetes/scheduling/index.js.map +1 -0
- package/dist/factories/kubernetes/scheduling/priority-class.d.ts +4 -0
- package/dist/factories/kubernetes/scheduling/priority-class.d.ts.map +1 -0
- package/dist/factories/kubernetes/scheduling/priority-class.js +16 -0
- package/dist/factories/kubernetes/scheduling/priority-class.js.map +1 -0
- package/dist/factories/kubernetes/scheduling/runtime-class.d.ts +5 -0
- package/dist/factories/kubernetes/scheduling/runtime-class.d.ts.map +1 -0
- package/dist/factories/kubernetes/scheduling/runtime-class.js +10 -0
- package/dist/factories/kubernetes/scheduling/runtime-class.js.map +1 -0
- package/dist/factories/kubernetes/storage/csi-driver.d.ts +5 -0
- package/dist/factories/kubernetes/storage/csi-driver.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/csi-driver.js +16 -0
- package/dist/factories/kubernetes/storage/csi-driver.js.map +1 -0
- package/dist/factories/kubernetes/storage/csi-node.d.ts +5 -0
- package/dist/factories/kubernetes/storage/csi-node.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/csi-node.js +10 -0
- package/dist/factories/kubernetes/storage/csi-node.js.map +1 -0
- package/dist/factories/kubernetes/storage/index.d.ts +13 -0
- package/dist/factories/kubernetes/storage/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/index.js +13 -0
- package/dist/factories/kubernetes/storage/index.js.map +1 -0
- package/dist/factories/kubernetes/storage/persistent-volume-claim.d.ts +6 -0
- package/dist/factories/kubernetes/storage/persistent-volume-claim.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/persistent-volume-claim.js +30 -0
- package/dist/factories/kubernetes/storage/persistent-volume-claim.js.map +1 -0
- package/dist/factories/kubernetes/storage/persistent-volume.d.ts +6 -0
- package/dist/factories/kubernetes/storage/persistent-volume.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/persistent-volume.js +47 -0
- package/dist/factories/kubernetes/storage/persistent-volume.js.map +1 -0
- package/dist/factories/kubernetes/storage/storage-class.d.ts +4 -0
- package/dist/factories/kubernetes/storage/storage-class.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/storage-class.js +17 -0
- package/dist/factories/kubernetes/storage/storage-class.js.map +1 -0
- package/dist/factories/kubernetes/storage/volume-attachment.d.ts +6 -0
- package/dist/factories/kubernetes/storage/volume-attachment.d.ts.map +1 -0
- package/dist/factories/kubernetes/storage/volume-attachment.js +10 -0
- package/dist/factories/kubernetes/storage/volume-attachment.js.map +1 -0
- package/dist/factories/kubernetes/types.d.ts +8 -0
- package/dist/factories/kubernetes/types.d.ts.map +1 -0
- package/dist/factories/kubernetes/types.js +8 -0
- package/dist/factories/kubernetes/types.js.map +1 -0
- package/dist/factories/kubernetes/workloads/cron-job.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/cron-job.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/cron-job.js +53 -0
- package/dist/factories/kubernetes/workloads/cron-job.js.map +1 -0
- package/dist/factories/kubernetes/workloads/daemon-set.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/daemon-set.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/daemon-set.js +32 -0
- package/dist/factories/kubernetes/workloads/daemon-set.js.map +1 -0
- package/dist/factories/kubernetes/workloads/deployment.d.ts +5 -0
- package/dist/factories/kubernetes/workloads/deployment.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/deployment.js +59 -0
- package/dist/factories/kubernetes/workloads/deployment.js.map +1 -0
- package/dist/factories/kubernetes/workloads/index.d.ts +14 -0
- package/dist/factories/kubernetes/workloads/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/index.js +14 -0
- package/dist/factories/kubernetes/workloads/index.js.map +1 -0
- package/dist/factories/kubernetes/workloads/job.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/job.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/job.js +105 -0
- package/dist/factories/kubernetes/workloads/job.js.map +1 -0
- package/dist/factories/kubernetes/workloads/replica-set.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/replica-set.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/replica-set.js +33 -0
- package/dist/factories/kubernetes/workloads/replica-set.js.map +1 -0
- package/dist/factories/kubernetes/workloads/replication-controller.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/replication-controller.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/replication-controller.js +56 -0
- package/dist/factories/kubernetes/workloads/replication-controller.js.map +1 -0
- package/dist/factories/kubernetes/workloads/stateful-set.d.ts +6 -0
- package/dist/factories/kubernetes/workloads/stateful-set.d.ts.map +1 -0
- package/dist/factories/kubernetes/workloads/stateful-set.js +81 -0
- package/dist/factories/kubernetes/workloads/stateful-set.js.map +1 -0
- package/dist/factories/kubernetes/yaml/index.d.ts +6 -0
- package/dist/factories/kubernetes/yaml/index.d.ts.map +1 -0
- package/dist/factories/kubernetes/yaml/index.js +6 -0
- package/dist/factories/kubernetes/yaml/index.js.map +1 -0
- package/dist/factories/kubernetes/yaml/yaml-directory.d.ts +54 -0
- package/dist/factories/kubernetes/yaml/yaml-directory.d.ts.map +1 -0
- package/dist/factories/kubernetes/yaml/yaml-directory.js +178 -0
- package/dist/factories/kubernetes/yaml/yaml-directory.js.map +1 -0
- package/dist/factories/kubernetes/yaml/yaml-file.d.ts +54 -0
- package/dist/factories/kubernetes/yaml/yaml-file.d.ts.map +1 -0
- package/dist/factories/kubernetes/yaml/yaml-file.js +181 -0
- package/dist/factories/kubernetes/yaml/yaml-file.js.map +1 -0
- package/dist/factories/shared.d.ts +11 -0
- package/dist/factories/shared.d.ts.map +1 -0
- package/dist/factories/shared.js +364 -0
- package/dist/factories/shared.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/helpers.d.ts +69 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +405 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/type-guards.d.ts +34 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +66 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/package.json +109 -0
package/README.md
ADDED
|
@@ -0,0 +1,1137 @@
|
|
|
1
|
+
# typekro
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
<img src="docs/public/typekro-logo.svg" alt="TypeKro Logo" width="200" />
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/typekro)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
|
|
10
|
+
> **Kubernetes infrastructure with TypeScript instead of YAML**
|
|
11
|
+
|
|
12
|
+
TypeKro combines the type safety of TypeScript, the GitOps-friendly output of declarative YAML, and the runtime intelligence of **Kubernetes Resource Orchestrator (KRO)** - an open-source project that enables advanced resource orchestration with runtime dependencies and CEL expressions. Write infrastructure in pure TypeScript with full IDE support, then deploy directly to clusters or generate deterministic YAML for GitOps workflows.
|
|
13
|
+
|
|
14
|
+
> **What is KRO?** [Kubernetes Resource Orchestrator](https://kro.run/) is an open-source project by AWS Labs that enables resources to reference each other's runtime state using CEL expressions. TypeKro works in Direct Mode (no KRO required) for simple deployments, or KRO Mode for advanced orchestration.
|
|
15
|
+
|
|
16
|
+
## Table of Contents
|
|
17
|
+
|
|
18
|
+
- [Quick Start](#quick-start) - See TypeKro in action with a 30-line web app example
|
|
19
|
+
- [Deployment Flexibility](#deployment-flexibility) - Write once, deploy everywhere (YAML/Direct/Kro modes)
|
|
20
|
+
- [Core Architecture](#core-architecture) - Magic proxy system, enhanced types, and CRD intelligence
|
|
21
|
+
- [Comparison Grid](#comparison-grid) - How TypeKro compares to Pulumi, CDK8s, Helm, etc.
|
|
22
|
+
- [GitOps Workflows](#gitops-workflows) - Deterministic YAML generation and Flux HelmRelease integration
|
|
23
|
+
- [Complete Factory Reference](#complete-factory-reference) - All 50+ available resource factories
|
|
24
|
+
- [Which Pattern Should I Use?](#which-pattern-should-i-use) - Decision guide based on your team and workflow
|
|
25
|
+
- [Enhanced Type System](#enhanced-type-system) - Deep dive into schema references and type safety
|
|
26
|
+
- [Multi-Cloud Integration with Alchemy](#multi-cloud-integration-with-alchemy) - Unified cloud + Kubernetes management
|
|
27
|
+
- [Contributing](#contributing) - How to contribute to TypeKro development
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Quick Start
|
|
32
|
+
|
|
33
|
+
Here's a complete web application with database in ~30 lines of TypeScript:
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { type } from 'arktype'; // Runtime-safe TypeScript schemas with concise syntax
|
|
37
|
+
import { toResourceGraph, simpleDeployment, simpleService, Cel } from 'typekro';
|
|
38
|
+
|
|
39
|
+
// Define your app's interface
|
|
40
|
+
const WebAppSpec = type({
|
|
41
|
+
name: 'string',
|
|
42
|
+
image: 'string',
|
|
43
|
+
replicas: 'number'
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const WebAppStatus = type({
|
|
47
|
+
ready: 'boolean',
|
|
48
|
+
url: 'string'
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Create your infrastructure
|
|
52
|
+
const webapp = toResourceGraph(
|
|
53
|
+
{
|
|
54
|
+
name: 'my-webapp',
|
|
55
|
+
apiVersion: 'example.com/v1',
|
|
56
|
+
kind: 'WebApp',
|
|
57
|
+
spec: WebAppSpec,
|
|
58
|
+
status: WebAppStatus
|
|
59
|
+
},
|
|
60
|
+
(schema) => ({
|
|
61
|
+
// Database
|
|
62
|
+
database: simpleDeployment({
|
|
63
|
+
name: 'postgres',
|
|
64
|
+
image: 'postgres:15',
|
|
65
|
+
env: { POSTGRES_DB: 'app', POSTGRES_USER: 'user', POSTGRES_PASSWORD: 'secret' }
|
|
66
|
+
}),
|
|
67
|
+
|
|
68
|
+
// Service (defined first to show cross-references work in any order)
|
|
69
|
+
service: simpleService({
|
|
70
|
+
name: schema.spec.name, // Type-safe schema reference
|
|
71
|
+
selector: { app: schema.spec.name },
|
|
72
|
+
ports: [{ port: 80, targetPort: 80 }]
|
|
73
|
+
}),
|
|
74
|
+
|
|
75
|
+
// Web app that references schema fields
|
|
76
|
+
app: simpleDeployment({
|
|
77
|
+
name: schema.spec.name, // Type-safe schema reference
|
|
78
|
+
image: schema.spec.image, // Full IDE autocomplete
|
|
79
|
+
replicas: schema.spec.replicas,
|
|
80
|
+
env: { DATABASE_HOST: 'postgres' }
|
|
81
|
+
})
|
|
82
|
+
}),
|
|
83
|
+
(schema, resources) => ({
|
|
84
|
+
ready: Cel.expr(resources.app.status.readyReplicas, ' > 0'), // Runtime logic
|
|
85
|
+
url: Cel.template('http://%s', schema.spec.name) // String templating with schema reference
|
|
86
|
+
})
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
// Deploy it directly to your cluster
|
|
90
|
+
const factory = await webapp.factory('direct', { namespace: 'default' });
|
|
91
|
+
await factory.deploy({ name: 'my-app', image: 'nginx', replicas: 3 });
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Key Features Demonstrated:**
|
|
95
|
+
- **Schema References**: `schema.spec.name` becomes runtime CEL expressions
|
|
96
|
+
- **Type Safety**: Full TypeScript validation and autocomplete
|
|
97
|
+
- **CEL Expressions**: `Cel.template()` for dynamic resource configuration
|
|
98
|
+
- **Direct Deployment**: Resources are created immediately in your cluster
|
|
99
|
+
|
|
100
|
+
*Note: You can also generate GitOps-ready YAML with `factory.toYaml()` instead of deploying directly.*
|
|
101
|
+
|
|
102
|
+
**Need advanced features?** Bootstrap a complete runtime environment with Flux CD and KRO:
|
|
103
|
+
```typescript
|
|
104
|
+
import { typeKroRuntimeBootstrap } from 'typekro';
|
|
105
|
+
const bootstrap = typeKroRuntimeBootstrap({ fluxVersion: 'v2.4.0', kroVersion: '0.3.0' });
|
|
106
|
+
await bootstrap.factory('direct').deploy({ namespace: 'flux-system' });
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Deployment Flexibility
|
|
112
|
+
|
|
113
|
+
### Write Once, Deploy Everywhere
|
|
114
|
+
|
|
115
|
+
TypeKro's core strength is **deployment flexibility**. The same TypeScript code can be deployed in multiple ways without modification:
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
// Define your infrastructure once
|
|
119
|
+
const webappGraph = toResourceGraph(
|
|
120
|
+
{
|
|
121
|
+
name: 'my-webapp',
|
|
122
|
+
apiVersion: 'example.com/v1',
|
|
123
|
+
kind: 'WebApp',
|
|
124
|
+
spec: WebAppSpec,
|
|
125
|
+
status: WebAppStatus
|
|
126
|
+
},
|
|
127
|
+
(schema) => ({
|
|
128
|
+
// ... your resources
|
|
129
|
+
}),
|
|
130
|
+
(schema, resources) => ({
|
|
131
|
+
// ... status builder
|
|
132
|
+
})
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
const spec = { name: 'my-app', image: 'nginx:1.21', replicas: 3 };
|
|
136
|
+
|
|
137
|
+
// Deploy the SAME code in different ways:
|
|
138
|
+
|
|
139
|
+
// 1. Generate YAML for GitOps (no cluster interaction)
|
|
140
|
+
const kroFactory = await webappGraph.factory('kro', { namespace: 'dev' });
|
|
141
|
+
const yaml = kroFactory.toYaml();
|
|
142
|
+
writeFileSync('k8s/webapp.yaml', yaml);
|
|
143
|
+
|
|
144
|
+
// 2. Deploy directly to cluster (immediate)
|
|
145
|
+
const directFactory = await webappGraph.factory('direct', { namespace: 'dev' });
|
|
146
|
+
const directInstance = await directFactory.deploy(spec);
|
|
147
|
+
|
|
148
|
+
// 3. Integrate with Alchemy for multi-cloud coordination
|
|
149
|
+
await alchemyScope.run(async () => {
|
|
150
|
+
const factory = await webappGraph.factory('direct', {
|
|
151
|
+
namespace: 'dev',
|
|
152
|
+
alchemyScope: alchemyScope
|
|
153
|
+
});
|
|
154
|
+
await factory.deploy(spec);
|
|
155
|
+
});
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
This flexibility eliminates the need to rewrite infrastructure code when changing deployment strategies or environments.
|
|
159
|
+
|
|
160
|
+
### Core Deployment Strategies
|
|
161
|
+
|
|
162
|
+
#### 1. YAML Generation (GitOps)
|
|
163
|
+
|
|
164
|
+
Generate deterministic Kubernetes YAML that integrates with any GitOps workflow:
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
// Generate ResourceGraphDefinition YAML
|
|
168
|
+
const kroFactory = await webappGraph.factory('kro', { namespace: 'default' });
|
|
169
|
+
const yaml = kroFactory.toYaml();
|
|
170
|
+
|
|
171
|
+
// Save for GitOps deployment
|
|
172
|
+
writeFileSync('manifests/webapp.yaml', yaml);
|
|
173
|
+
|
|
174
|
+
// Or pipe directly to kubectl
|
|
175
|
+
console.log(yaml); // bun run generate.ts | kubectl apply -f -
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**When to use:**
|
|
179
|
+
- GitOps workflows (ArgoCD, Flux)
|
|
180
|
+
- Audit requirements
|
|
181
|
+
- Multi-environment promotion
|
|
182
|
+
- CI/CD integration
|
|
183
|
+
|
|
184
|
+
**Benefits:**
|
|
185
|
+
- No cluster access needed during build
|
|
186
|
+
- Git-friendly deterministic output
|
|
187
|
+
- Works with existing GitOps tools
|
|
188
|
+
- Version control for infrastructure changes
|
|
189
|
+
|
|
190
|
+
#### 2. Direct Deployment (Imperative)
|
|
191
|
+
|
|
192
|
+
Deploy directly to your cluster for rapid iteration:
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
// Create factory and deploy immediately
|
|
196
|
+
const factory = await webappGraph.factory('direct', { namespace: 'development' });
|
|
197
|
+
|
|
198
|
+
// Deploy with specific configuration
|
|
199
|
+
const instance = await factory.deploy({
|
|
200
|
+
name: 'webapp-dev',
|
|
201
|
+
image: 'nginx:latest',
|
|
202
|
+
replicas: 1
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// Get the generated ResourceGraphDefinition
|
|
206
|
+
console.log('Generated RGD:', factory.toYaml());
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**When to use:**
|
|
210
|
+
- Local development
|
|
211
|
+
- Testing and experimentation
|
|
212
|
+
- Rapid prototyping
|
|
213
|
+
- Direct cluster management
|
|
214
|
+
|
|
215
|
+
**Benefits:**
|
|
216
|
+
- Immediate feedback
|
|
217
|
+
- No Git workflow overhead
|
|
218
|
+
- Live iteration on infrastructure
|
|
219
|
+
- Integrated with development workflow
|
|
220
|
+
|
|
221
|
+
#### 3. Kro Deployment (Recommended for Production)
|
|
222
|
+
|
|
223
|
+
Leverage Kubernetes Resource Orchestrator for advanced runtime capabilities:
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
// Deploy as ResourceGraphDefinition with runtime resolution
|
|
227
|
+
const kroFactory = await webappGraph.factory('kro', { namespace: 'production' });
|
|
228
|
+
|
|
229
|
+
// Apply the ResourceGraphDefinition to cluster
|
|
230
|
+
await kroFactory.deploy({
|
|
231
|
+
name: 'webapp-prod',
|
|
232
|
+
image: 'nginx:1.21',
|
|
233
|
+
replicas: 3
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
// Kro handles:
|
|
237
|
+
// - Runtime CEL expression evaluation
|
|
238
|
+
// - Cross-resource dependency resolution
|
|
239
|
+
// - Automatic reconciliation and drift correction
|
|
240
|
+
// - Status propagation and health monitoring
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
**When to use:**
|
|
244
|
+
- Production environments
|
|
245
|
+
- Complex resource dependencies
|
|
246
|
+
- Self-healing infrastructure requirements
|
|
247
|
+
- Advanced orchestration needs
|
|
248
|
+
|
|
249
|
+
**Benefits:**
|
|
250
|
+
- Runtime dependency resolution
|
|
251
|
+
- Automatic reconciliation
|
|
252
|
+
- Built-in health monitoring
|
|
253
|
+
- Kubernetes-native operation
|
|
254
|
+
|
|
255
|
+
### Advanced Deployment Patterns
|
|
256
|
+
|
|
257
|
+
#### Environment-Specific Deployments
|
|
258
|
+
|
|
259
|
+
Deploy the same graph to different environments with environment-specific configurations:
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
// Development: Direct deployment for fast iteration
|
|
263
|
+
const devFactory = await webappGraph.factory('direct', { namespace: 'dev' });
|
|
264
|
+
await devFactory.deploy({
|
|
265
|
+
name: 'webapp-dev',
|
|
266
|
+
image: 'nginx:latest',
|
|
267
|
+
replicas: 1
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
// Staging: Kro deployment for testing runtime dependencies
|
|
271
|
+
const stagingFactory = await webappGraph.factory('kro', { namespace: 'staging' });
|
|
272
|
+
await stagingFactory.deploy({
|
|
273
|
+
name: 'webapp-staging',
|
|
274
|
+
image: 'nginx:1.21-rc',
|
|
275
|
+
replicas: 2,
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
// Production: GitOps deployment
|
|
279
|
+
const prodFactory = await webappGraph.factory('kro', { namespace: 'production' });
|
|
280
|
+
const prodYaml = prodFactory.toYaml();
|
|
281
|
+
writeFileSync('k8s/production/webapp.yaml', prodYaml);
|
|
282
|
+
// Deployed via ArgoCD/Flux
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
### Deployment Strategy Decision Matrix
|
|
287
|
+
|
|
288
|
+
| **Scenario** | **Recommended Strategy** | **Why** |
|
|
289
|
+
|--------------|-------------------------|---------|
|
|
290
|
+
| Local development | Direct Deployment | Fast feedback, no GitOps overhead |
|
|
291
|
+
| CI/CD pipeline testing | Direct Deployment | Immediate validation, isolated environments |
|
|
292
|
+
| Production deployment | Kro + GitOps | Runtime intelligence + audit trail |
|
|
293
|
+
| Multi-environment promotion | YAML Generation | Consistent artifacts across environments |
|
|
294
|
+
| Complex runtime dependencies | Kro Deployment | Advanced orchestration capabilities |
|
|
295
|
+
| Multi-cloud infrastructure | [Alchemy Integration](#multi-cloud-integration-with-alchemy) | Unified cloud + Kubernetes management |
|
|
296
|
+
| Rapid prototyping | Direct Deployment | Minimal setup, immediate results |
|
|
297
|
+
| Regulated environments | YAML Generation + GitOps | Audit trail, approval workflows |
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Core Architecture
|
|
302
|
+
|
|
303
|
+
TypeKro's architecture enables compile-time type safety with runtime intelligence through three key systems:
|
|
304
|
+
|
|
305
|
+
```mermaid
|
|
306
|
+
graph TD
|
|
307
|
+
A[TypeScript Code] --> B[Magic Proxy System]
|
|
308
|
+
B --> C[Schema References]
|
|
309
|
+
B --> D[Static Values]
|
|
310
|
+
C --> E[CEL Expressions]
|
|
311
|
+
D --> F[Direct Values]
|
|
312
|
+
E --> G[Runtime Resolution]
|
|
313
|
+
F --> G
|
|
314
|
+
G --> H{Deployment Strategy}
|
|
315
|
+
|
|
316
|
+
H --> I[YAML Generation]
|
|
317
|
+
H --> J[Direct Deployment]
|
|
318
|
+
H --> K[KRO Deployment]
|
|
319
|
+
|
|
320
|
+
I --> L[GitOps Tools<br/>ArgoCD, Flux, kubectl]
|
|
321
|
+
J --> M[Kubernetes API<br/>Immediate Deployment]
|
|
322
|
+
K --> N[KRO Controller<br/>Runtime Dependencies]
|
|
323
|
+
|
|
324
|
+
L --> O[Kubernetes Cluster]
|
|
325
|
+
M --> O
|
|
326
|
+
N --> O
|
|
327
|
+
|
|
328
|
+
subgraph "Compile Time"
|
|
329
|
+
A
|
|
330
|
+
B
|
|
331
|
+
C
|
|
332
|
+
D
|
|
333
|
+
P[IDE Support<br/>Autocomplete<br/>Type Safety]
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
subgraph "Runtime"
|
|
337
|
+
E
|
|
338
|
+
G
|
|
339
|
+
Q[CEL Evaluation<br/>Cross-Resource Refs<br/>Status Propagation]
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
A -.-> P
|
|
343
|
+
N -.-> Q
|
|
344
|
+
|
|
345
|
+
style A fill:#e1f5fe
|
|
346
|
+
style B fill:#f3e5f5
|
|
347
|
+
style O fill:#e8f5e8
|
|
348
|
+
style P fill:#fff3e0
|
|
349
|
+
style Q fill:#fff3e0
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Magic Proxy System
|
|
353
|
+
|
|
354
|
+
TypeKro's "magic" comes from its **proxy system** that creates different behaviors for execution-time vs runtime values:
|
|
355
|
+
|
|
356
|
+
#### Static Values (Known at Execution Time)
|
|
357
|
+
```typescript
|
|
358
|
+
const deployment = simpleDeployment({
|
|
359
|
+
name: 'my-app', // Static string
|
|
360
|
+
replicas: 3, // Static number
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
// Accessing static values returns the actual value
|
|
364
|
+
console.log(deployment.spec.replicas); // Returns: 3
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
#### Dynamic References (Unknown at Execution Time)
|
|
368
|
+
```typescript
|
|
369
|
+
const deployment = simpleDeployment({
|
|
370
|
+
name: schema.spec.name, // Schema reference - unknown until runtime
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
// Accessing schema or status fields creates KubernetesRef objects
|
|
374
|
+
const nameRef = schema.spec.name; // Creates: KubernetesRef<string>
|
|
375
|
+
const statusRef = deployment.status.readyReplicas; // Creates: KubernetesRef<number>
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
#### The `$` Prefix for Explicit References
|
|
379
|
+
```typescript
|
|
380
|
+
const configMap = simpleConfigMap({
|
|
381
|
+
name: 'config',
|
|
382
|
+
data: { key: 'value' } // Static value
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
const deployment = simpleDeployment({
|
|
386
|
+
name: 'app',
|
|
387
|
+
env: {
|
|
388
|
+
// Static behavior: Uses the known value "value" at execution time
|
|
389
|
+
STATIC_VALUE: configMap.data.key,
|
|
390
|
+
|
|
391
|
+
// Dynamic behavior: Creates reference resolved by Kro at runtime
|
|
392
|
+
DYNAMIC_VALUE: configMap.data.$key,
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**Key Rule**: Schema references (`schema.spec.*`) and status references (`resource.status.*`) are automatically converted to CEL expressions. For explicit runtime references to other resource properties, use the `$` prefix.
|
|
398
|
+
|
|
399
|
+
### Enhanced Types (RefOrValue Pattern)
|
|
400
|
+
|
|
401
|
+
Every factory function accepts `RefOrValue<T>`, which means any parameter can be:
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
// 1. Direct value
|
|
405
|
+
name: "my-app"
|
|
406
|
+
|
|
407
|
+
// 2. Schema reference (becomes CEL)
|
|
408
|
+
name: schema.spec.name
|
|
409
|
+
|
|
410
|
+
// 3. CEL expression
|
|
411
|
+
name: Cel.template("%s-service", schema.spec.name)
|
|
412
|
+
|
|
413
|
+
// 4. Reference to another resource
|
|
414
|
+
env: {
|
|
415
|
+
DB_HOST: database.service.spec.clusterIP // Runtime resolution
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
This pattern provides **compile-time type safety** while enabling **runtime flexibility**.
|
|
420
|
+
|
|
421
|
+
### CRD Installation Intelligence
|
|
422
|
+
|
|
423
|
+
TypeKro's direct deployer automatically handles Custom Resource Definition timing:
|
|
424
|
+
|
|
425
|
+
```typescript
|
|
426
|
+
// TypeKro automatically detects CRD dependencies
|
|
427
|
+
const kroResources = [
|
|
428
|
+
kroDefinition, // CRD must be installed first
|
|
429
|
+
kroInstance // Instance depends on CRD
|
|
430
|
+
];
|
|
431
|
+
|
|
432
|
+
const factory = await graph.factory('direct', { namespace: 'default' });
|
|
433
|
+
await factory.deploy(spec); // ✅ Automatically waits for CRD readiness
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
**Benefits:**
|
|
437
|
+
- **No "CRD not found" errors** - Automatic timing coordination
|
|
438
|
+
- **Zero manual ordering** - Intelligent dependency detection
|
|
439
|
+
- **Production reliability** - Handles CRD establishment properly
|
|
440
|
+
|
|
441
|
+
### Runtime vs Compile-time Behavior
|
|
442
|
+
|
|
443
|
+
| **Aspect** | **Compile-time** | **Runtime** |
|
|
444
|
+
|------------|------------------|-------------|
|
|
445
|
+
| **Type checking** | Full TypeScript validation | N/A |
|
|
446
|
+
| **IDE support** | Autocomplete, refactoring | N/A |
|
|
447
|
+
| **Schema references** | Appear as typed properties | Resolve to CEL expressions |
|
|
448
|
+
| **Resource references** | Type-safe property access | Runtime cluster state lookup |
|
|
449
|
+
| **Validation** | TypeScript + arktype schemas | Kubernetes validation + CEL |
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
## Comparison Grid
|
|
454
|
+
|
|
455
|
+
| Feature | TypeKro | Pulumi | CDK8s | Helm | Kustomize | Crossplane |
|
|
456
|
+
|---------|---------|---------|--------|------|-----------|------------|
|
|
457
|
+
| **Type Safety** | ✅ Full TypeScript | ✅ Multi-language | ✅ TypeScript | ❌ Templates | ❌ YAML | ❌ YAML |
|
|
458
|
+
| **GitOps Ready** | ✅ Deterministic YAML | ❌ State backend | ✅ YAML output | ✅ Charts | ✅ YAML | ✅ YAML |
|
|
459
|
+
| **Runtime Dependencies** | ✅ KRO + CEL expressions | ❌ Deploy-time only | ❌ Static | ❌ Templates | ❌ Static | ✅ Compositions |
|
|
460
|
+
| **IDE Support** | ✅ Full autocomplete | ✅ Language support | ✅ TypeScript | ❌ Limited | ❌ Limited | ❌ Limited |
|
|
461
|
+
| **Learning Curve** | 🟢 Just TypeScript | 🔴 New concepts | 🟡 TypeScript + K8s | 🔴 Templates | 🔴 YAML hell | 🔴 Complex |
|
|
462
|
+
| **Kubernetes Native** | ✅ Pure K8s resources | ❌ Abstraction layer | ✅ Pure K8s | ✅ K8s resources | ✅ K8s resources | ✅ K8s + CRDs |
|
|
463
|
+
| **Cross-Resource Refs** | ✅ Runtime resolution | ❌ Deploy-time | ❌ Manual | ❌ Manual | ❌ Manual | ✅ Built-in |
|
|
464
|
+
| **Multi-Cloud** | 🟡 Via Alchemy | ✅ Native | ❌ K8s only | ❌ K8s only | ❌ K8s only | ✅ Native |
|
|
465
|
+
| **State Management** | ✅ Stateless | ❌ State backend | ✅ Stateless | ✅ Stateless | ✅ Stateless | ✅ Controller |
|
|
466
|
+
| **CRD Timing** | ✅ Automatic | ❌ Manual | ❌ Manual | ❌ Manual | ❌ Manual | ✅ Built-in |
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## GitOps Workflows
|
|
471
|
+
|
|
472
|
+
### Deterministic YAML Generation
|
|
473
|
+
|
|
474
|
+
TypeKro generates stable, deterministic YAML output perfect for GitOps workflows:
|
|
475
|
+
|
|
476
|
+
```typescript
|
|
477
|
+
// generate-manifests.ts
|
|
478
|
+
import { writeFileSync } from 'fs';
|
|
479
|
+
|
|
480
|
+
const graph = toResourceGraph(/* ... */);
|
|
481
|
+
|
|
482
|
+
// Same input always generates identical YAML
|
|
483
|
+
const factory = await graph.factory('kro', { namespace: 'default' });
|
|
484
|
+
const yaml = factory.toYaml();
|
|
485
|
+
|
|
486
|
+
// Write to file for GitOps
|
|
487
|
+
writeFileSync('k8s/my-app.yaml', yaml);
|
|
488
|
+
console.log('Generated k8s/my-app.yaml for GitOps deployment');
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
**Multi-Environment GitOps Workflow:**
|
|
492
|
+
|
|
493
|
+
```typescript
|
|
494
|
+
// scripts/generate-all-environments.ts
|
|
495
|
+
const environments = ['development', 'staging', 'production'];
|
|
496
|
+
|
|
497
|
+
for (const env of environments) {
|
|
498
|
+
// Generate ResourceGraphDefinition YAML for this environment
|
|
499
|
+
const factory = await webappGraph.factory('kro', { namespace: env });
|
|
500
|
+
const rgdYaml = factory.toYaml();
|
|
501
|
+
writeFileSync(`k8s/${env}/webapp-rgd.yaml`, rgdYaml);
|
|
502
|
+
|
|
503
|
+
// Generate instance YAML with environment-specific spec
|
|
504
|
+
const instanceSpec = {
|
|
505
|
+
name: `webapp-${env}`,
|
|
506
|
+
image: env === 'production' ? 'nginx:1.21' : 'nginx:latest',
|
|
507
|
+
replicas: env === 'production' ? 3 : 1,
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
const instanceYaml = factory.toYaml(instanceSpec);
|
|
511
|
+
writeFileSync(`k8s/${env}/webapp-instance.yaml`, instanceYaml);
|
|
512
|
+
}
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
**Benefits for GitOps:**
|
|
516
|
+
- **Deterministic Output** - Same input always generates identical YAML
|
|
517
|
+
- **Git-Friendly** - Clean, readable YAML that diffs well
|
|
518
|
+
- **Stable Resource IDs** - Consistent resource identifiers across deployments
|
|
519
|
+
- **No External State** - Pure functions, no external dependencies
|
|
520
|
+
|
|
521
|
+
### Flux HelmRelease Integration
|
|
522
|
+
|
|
523
|
+
Deploy Helm charts with full TypeScript type safety and schema references:
|
|
524
|
+
|
|
525
|
+
```typescript
|
|
526
|
+
import { helmRelease, helmRepository } from 'typekro';
|
|
527
|
+
|
|
528
|
+
const InfraSpec = type({
|
|
529
|
+
name: 'string',
|
|
530
|
+
replicas: 'number',
|
|
531
|
+
loadBalancerIP: 'string',
|
|
532
|
+
environment: 'string'
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
const infraGraph = toResourceGraph(
|
|
536
|
+
{
|
|
537
|
+
name: 'ingress-infrastructure',
|
|
538
|
+
apiVersion: 'infrastructure.example.com/v1',
|
|
539
|
+
kind: 'IngressInfra',
|
|
540
|
+
spec: InfraSpec,
|
|
541
|
+
status: type({ ready: 'boolean' })
|
|
542
|
+
},
|
|
543
|
+
(schema) => ({
|
|
544
|
+
// Helm repository source
|
|
545
|
+
repository: helmRepository({
|
|
546
|
+
name: 'nginx-repo',
|
|
547
|
+
url: 'https://kubernetes.github.io/ingress-nginx'
|
|
548
|
+
}),
|
|
549
|
+
|
|
550
|
+
// Type-safe Helm release with schema references
|
|
551
|
+
controller: helmRelease({
|
|
552
|
+
name: Cel.template('%s-ingress', schema.spec.name),
|
|
553
|
+
chart: {
|
|
554
|
+
spec: {
|
|
555
|
+
chart: 'ingress-nginx',
|
|
556
|
+
sourceRef: {
|
|
557
|
+
kind: 'HelmRepository',
|
|
558
|
+
name: 'nginx-repo'
|
|
559
|
+
},
|
|
560
|
+
version: '4.8.0'
|
|
561
|
+
}
|
|
562
|
+
},
|
|
563
|
+
values: {
|
|
564
|
+
controller: {
|
|
565
|
+
replicaCount: schema.spec.replicas, // Schema reference
|
|
566
|
+
service: {
|
|
567
|
+
loadBalancerIP: schema.spec.loadBalancerIP // Schema reference
|
|
568
|
+
},
|
|
569
|
+
config: {
|
|
570
|
+
'custom-config': Cel.template('env-%s', schema.spec.environment) // CEL expression
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
})
|
|
575
|
+
}),
|
|
576
|
+
(schema, resources) => ({
|
|
577
|
+
ready: Cel.expr(resources.controller.status.conditions, '[?@.type=="Ready"].status == "True"')
|
|
578
|
+
})
|
|
579
|
+
);
|
|
580
|
+
|
|
581
|
+
// Deploy via Flux
|
|
582
|
+
const factory = await infraGraph.factory('kro', { namespace: 'flux-system' });
|
|
583
|
+
const yaml = factory.toYaml();
|
|
584
|
+
writeFileSync('k8s/ingress-controller.yaml', yaml);
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
**Key Benefits:**
|
|
588
|
+
- **Type-safe Helm values** - Full TypeScript validation for chart values
|
|
589
|
+
- **Schema references in values** - Connect Helm charts to your resource graph schema
|
|
590
|
+
- **Runtime value resolution** - CEL expressions evaluate at deployment time
|
|
591
|
+
- **Full integration with Flux CD HelmRelease**
|
|
592
|
+
|
|
593
|
+
### External YAML Integration
|
|
594
|
+
|
|
595
|
+
Integrate existing YAML manifests and Kustomizations into TypeKro resource graphs:
|
|
596
|
+
|
|
597
|
+
```typescript
|
|
598
|
+
import { yamlFile, yamlDirectory } from 'typekro';
|
|
599
|
+
|
|
600
|
+
const AppSpec = type({
|
|
601
|
+
name: 'string',
|
|
602
|
+
image: 'string'
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
const hybridGraph = toResourceGraph(
|
|
606
|
+
{
|
|
607
|
+
name: 'hybrid-app',
|
|
608
|
+
apiVersion: 'apps.example.com/v1',
|
|
609
|
+
kind: 'HybridApp',
|
|
610
|
+
spec: AppSpec,
|
|
611
|
+
status: type({ ready: 'boolean' })
|
|
612
|
+
},
|
|
613
|
+
(schema) => ({
|
|
614
|
+
// Include external YAML files
|
|
615
|
+
monitoring: yamlFile({
|
|
616
|
+
path: './k8s/prometheus-operator.yaml',
|
|
617
|
+
namespace: schema.metadata.namespace // Schema reference for namespace
|
|
618
|
+
}),
|
|
619
|
+
|
|
620
|
+
// Include entire directories with Kustomization
|
|
621
|
+
monitoringStack: yamlDirectory({
|
|
622
|
+
path: './k8s/monitoring/',
|
|
623
|
+
recursive: true,
|
|
624
|
+
kustomization: {
|
|
625
|
+
namePrefix: Cel.template('%s-', schema.spec.name), // Dynamic prefix
|
|
626
|
+
namespace: schema.metadata.namespace,
|
|
627
|
+
commonLabels: {
|
|
628
|
+
'app.kubernetes.io/instance': schema.spec.name // Schema reference
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
}),
|
|
632
|
+
|
|
633
|
+
// Include from Git repositories
|
|
634
|
+
kubePrometheus: yamlDirectory({
|
|
635
|
+
path: 'https://github.com/prometheus-operator/kube-prometheus.git//manifests',
|
|
636
|
+
ref: 'v0.12.0',
|
|
637
|
+
namespace: 'monitoring'
|
|
638
|
+
}),
|
|
639
|
+
|
|
640
|
+
// TypeKro resources that reference external resources
|
|
641
|
+
app: simpleDeployment({
|
|
642
|
+
name: schema.spec.name,
|
|
643
|
+
image: schema.spec.image,
|
|
644
|
+
env: {
|
|
645
|
+
PROMETHEUS_URL: 'http://prometheus-operated.monitoring.svc.cluster.local:9090'
|
|
646
|
+
}
|
|
647
|
+
})
|
|
648
|
+
}),
|
|
649
|
+
(schema, resources) => ({
|
|
650
|
+
ready: Cel.expr(resources.app.status.readyReplicas, ' > 0')
|
|
651
|
+
})
|
|
652
|
+
);
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
**Integration Capabilities:**
|
|
656
|
+
- **File and directory inclusion** - Bring existing YAML into resource graphs
|
|
657
|
+
- **Kustomization support** - Apply transformations with schema references
|
|
658
|
+
- **Git repository sources** - Include manifests directly from Git
|
|
659
|
+
- **Mixed TypeKro + YAML** - Combine hand-written YAML with TypeKro resources
|
|
660
|
+
|
|
661
|
+
---
|
|
662
|
+
|
|
663
|
+
## Complete Factory Reference
|
|
664
|
+
|
|
665
|
+
TypeKro provides 50+ factory functions for all major Kubernetes resources:
|
|
666
|
+
|
|
667
|
+
**Core Resources:** `simpleDeployment()`, `simpleService()`, `simpleConfigMap()`, `simpleSecret()`, `simplePvc()`
|
|
668
|
+
|
|
669
|
+
**Advanced:** `helmRelease()`, `yamlFile()`, `customResource()`, `networkPolicy()`, `serviceAccount()`, plus comprehensive RBAC, storage, networking, and workload resources.
|
|
670
|
+
|
|
671
|
+
All resources support full type safety, cross-resource references, IDE autocomplete, and CEL expression integration.
|
|
672
|
+
|
|
673
|
+
**[📖 View Complete Factory Reference →](docs/api/factories.md)**
|
|
674
|
+
|
|
675
|
+
---
|
|
676
|
+
|
|
677
|
+
## Which Pattern Should I Use?
|
|
678
|
+
|
|
679
|
+
### 🆕 "I'm new to Kubernetes"
|
|
680
|
+
**→ Use: Direct Deployment**
|
|
681
|
+
```typescript
|
|
682
|
+
const factory = await graph.factory('direct', { namespace: 'default' });
|
|
683
|
+
await factory.deploy(spec);
|
|
684
|
+
```
|
|
685
|
+
- Immediate feedback loop
|
|
686
|
+
- No external dependencies
|
|
687
|
+
- Built-in CRD timing intelligence
|
|
688
|
+
- Great for learning
|
|
689
|
+
|
|
690
|
+
### 🔄 "I have existing YAML and want to migrate gradually"
|
|
691
|
+
**→ Use: yamlFile() + gradual adoption**
|
|
692
|
+
```typescript
|
|
693
|
+
const hybridGraph = toResourceGraph(
|
|
694
|
+
{
|
|
695
|
+
name: 'legacy-app',
|
|
696
|
+
apiVersion: 'apps.example.com/v1',
|
|
697
|
+
kind: 'LegacyApp',
|
|
698
|
+
spec: type({ name: 'string' }),
|
|
699
|
+
status: type({ ready: 'boolean' })
|
|
700
|
+
},
|
|
701
|
+
(schema) => ({
|
|
702
|
+
existing: yamlFile({ path: './existing/app.yaml' }), // Keep existing
|
|
703
|
+
newService: simpleService({ // Add TypeKro gradually
|
|
704
|
+
name: schema.spec.name,
|
|
705
|
+
selector: { app: schema.spec.name }
|
|
706
|
+
})
|
|
707
|
+
}),
|
|
708
|
+
(schema, resources) => ({
|
|
709
|
+
ready: Cel.expr(resources.newService.status.ready, ' == true')
|
|
710
|
+
})
|
|
711
|
+
);
|
|
712
|
+
```
|
|
713
|
+
- Preserve existing workflows
|
|
714
|
+
- Migrate incrementally
|
|
715
|
+
- Zero disruption migration path
|
|
716
|
+
|
|
717
|
+
### 🚀 "I want GitOps workflows"
|
|
718
|
+
**→ Use: YAML Generation + Flux HelmRelease**
|
|
719
|
+
```typescript
|
|
720
|
+
const factory = await graph.factory('kro', { namespace: 'production' });
|
|
721
|
+
const yaml = factory.toYaml();
|
|
722
|
+
writeFileSync('k8s/app.yaml', yaml);
|
|
723
|
+
```
|
|
724
|
+
- Deterministic YAML output
|
|
725
|
+
- Git-based workflows
|
|
726
|
+
- Works with ArgoCD, Flux, kubectl
|
|
727
|
+
|
|
728
|
+
### ☁️ "I need multi-cloud infrastructure"
|
|
729
|
+
**→ Use: [Alchemy Integration](#multi-cloud-integration-with-alchemy)**
|
|
730
|
+
```typescript
|
|
731
|
+
await alchemyScope.run(async () => {
|
|
732
|
+
const factory = await graph.factory('direct', {
|
|
733
|
+
namespace: 'default',
|
|
734
|
+
alchemyScope: alchemyScope
|
|
735
|
+
});
|
|
736
|
+
await factory.deploy(spec);
|
|
737
|
+
});
|
|
738
|
+
```
|
|
739
|
+
- Unified TypeScript across cloud + K8s
|
|
740
|
+
- Individual resource registration
|
|
741
|
+
- Type-safe cloud resources
|
|
742
|
+
|
|
743
|
+
### 📦 "I want to deploy Helm charts with type safety"
|
|
744
|
+
**→ Use: helmRelease() patterns**
|
|
745
|
+
```typescript
|
|
746
|
+
helmRelease({
|
|
747
|
+
name: 'nginx',
|
|
748
|
+
chart: { /* ... */ },
|
|
749
|
+
values: {
|
|
750
|
+
replicaCount: schema.spec.replicas, // Type-safe values
|
|
751
|
+
service: {
|
|
752
|
+
loadBalancerIP: schema.spec.ip // Schema references
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
})
|
|
756
|
+
```
|
|
757
|
+
- Type-safe Helm values
|
|
758
|
+
- Schema references in chart values
|
|
759
|
+
- Flux CD integration
|
|
760
|
+
|
|
761
|
+
### 🔗 "I have complex runtime dependencies"
|
|
762
|
+
**→ Use: Kro Deployment + CEL expressions**
|
|
763
|
+
```typescript
|
|
764
|
+
simpleDeployment({
|
|
765
|
+
env: {
|
|
766
|
+
DB_HOST: database.service.spec.clusterIP, // Runtime resolution
|
|
767
|
+
API_URL: Cel.template('http://%s:8080',
|
|
768
|
+
webService.status.loadBalancer.ingress[0].ip) // Status references
|
|
769
|
+
}
|
|
770
|
+
})
|
|
771
|
+
```
|
|
772
|
+
- Runtime resource resolution
|
|
773
|
+
- Advanced orchestration
|
|
774
|
+
- Self-healing infrastructure
|
|
775
|
+
- Production-ready patterns
|
|
776
|
+
|
|
777
|
+
### 🎯 "I need to make the right choice for my team"
|
|
778
|
+
|
|
779
|
+
| **Team Size** | **K8s Experience** | **Deployment Model** | **Recommended Pattern** |
|
|
780
|
+
|---------------|-------------------|---------------------|------------------------|
|
|
781
|
+
| Small (1-3) | Beginner | Any | Direct Deployment |
|
|
782
|
+
| Small (1-3) | Expert | GitOps | YAML Generation |
|
|
783
|
+
| Medium (4-10) | Mixed | GitOps | Kro + GitOps |
|
|
784
|
+
| Large (10+) | Expert | Enterprise GitOps | Kro + GitOps + Alchemy |
|
|
785
|
+
| Any | Any | Multi-cloud | [Alchemy Integration](#multi-cloud-integration-with-alchemy) |
|
|
786
|
+
| Any | Any | Helm-heavy | HelmRelease patterns |
|
|
787
|
+
|
|
788
|
+
Choose based on your team's needs, not just technical capabilities. You can always evolve your approach as requirements change.
|
|
789
|
+
|
|
790
|
+
---
|
|
791
|
+
|
|
792
|
+
## Enhanced Type System
|
|
793
|
+
|
|
794
|
+
TypeKro provides **enhanced types** through its magic proxy system, eliminating the need for optional chaining (`?.`) when working with schema and resource references.
|
|
795
|
+
|
|
796
|
+
### Schema References - Always Present
|
|
797
|
+
|
|
798
|
+
When you access schema fields in the resource builder, TypeScript treats them as always present:
|
|
799
|
+
|
|
800
|
+
```typescript
|
|
801
|
+
const graph = toResourceGraph(
|
|
802
|
+
{
|
|
803
|
+
name: 'my-app',
|
|
804
|
+
spec: type({
|
|
805
|
+
name: 'string',
|
|
806
|
+
image: 'string',
|
|
807
|
+
replicas: 'number',
|
|
808
|
+
environment: 'string',
|
|
809
|
+
}),
|
|
810
|
+
status: type({
|
|
811
|
+
ready: 'boolean',
|
|
812
|
+
url: 'string',
|
|
813
|
+
}),
|
|
814
|
+
},
|
|
815
|
+
(schema) => ({
|
|
816
|
+
deployment: simpleDeployment({
|
|
817
|
+
// ✅ No optional chaining needed - TypeScript knows these exist
|
|
818
|
+
name: schema.spec.name, // Type: string (not string | undefined)
|
|
819
|
+
image: schema.spec.image, // Type: string (not string | undefined)
|
|
820
|
+
replicas: schema.spec.replicas, // Type: number (not number | undefined)
|
|
821
|
+
|
|
822
|
+
env: {
|
|
823
|
+
NODE_ENV: schema.spec.environment, // Type: string
|
|
824
|
+
},
|
|
825
|
+
}),
|
|
826
|
+
}),
|
|
827
|
+
(schema, resources) => ({
|
|
828
|
+
// ✅ Status fields are also enhanced - no optional chaining needed
|
|
829
|
+
ready: Cel.expr(resources.deployment.status.readyReplicas, ' > 0'),
|
|
830
|
+
url: Cel.template('https://%s.example.com', schema.spec.name),
|
|
831
|
+
})
|
|
832
|
+
);
|
|
833
|
+
```
|
|
834
|
+
|
|
835
|
+
### Resource Status References - Enhanced Types
|
|
836
|
+
|
|
837
|
+
Resource status fields are enhanced to be non-optional within the builders:
|
|
838
|
+
|
|
839
|
+
```typescript
|
|
840
|
+
// Without TypeKro (regular Kubernetes types)
|
|
841
|
+
const regularK8s = {
|
|
842
|
+
// These would require optional chaining
|
|
843
|
+
replicas: deployment.status?.readyReplicas, // number | undefined
|
|
844
|
+
conditions: deployment.status?.conditions?.[0], // Condition | undefined
|
|
845
|
+
};
|
|
846
|
+
|
|
847
|
+
// With TypeKro (enhanced types)
|
|
848
|
+
const graph = toResourceGraph(
|
|
849
|
+
// ... schema definition
|
|
850
|
+
(schema, resources) => ({
|
|
851
|
+
// ✅ No optional chaining needed - enhanced types guarantee presence
|
|
852
|
+
replicas: resources.deployment.status.readyReplicas, // Type: number
|
|
853
|
+
phase: resources.deployment.status.phase, // Type: string
|
|
854
|
+
conditions: resources.deployment.status.conditions[0], // Type: Condition
|
|
855
|
+
|
|
856
|
+
// Complex expressions work naturally
|
|
857
|
+
healthy: Cel.expr(
|
|
858
|
+
resources.deployment.status.readyReplicas, ' == ',
|
|
859
|
+
resources.deployment.spec.replicas
|
|
860
|
+
),
|
|
861
|
+
})
|
|
862
|
+
);
|
|
863
|
+
```
|
|
864
|
+
|
|
865
|
+
### How Enhanced Types Work
|
|
866
|
+
|
|
867
|
+
The magic proxy system provides type enhancement while respecting the static/dynamic value distinction:
|
|
868
|
+
|
|
869
|
+
1. **Enhanced Type Safety**: Schema and resource references appear as non-optional TypeScript types
|
|
870
|
+
2. **Dynamic Reference Creation**: Schema and status field access creates `KubernetesRef<T>` objects
|
|
871
|
+
3. **Static Value Preservation**: Known values at execution time remain as actual values
|
|
872
|
+
|
|
873
|
+
```typescript
|
|
874
|
+
// Schema references (always dynamic - unknown until runtime)
|
|
875
|
+
const nameRef = schema.spec.name; // Creates: KubernetesRef<string>
|
|
876
|
+
const imageRef = schema.spec.image; // Creates: KubernetesRef<string>
|
|
877
|
+
|
|
878
|
+
// Resource status references (always dynamic - runtime cluster state)
|
|
879
|
+
const replicasRef = resources.deployment.status.readyReplicas; // Creates: KubernetesRef<number>
|
|
880
|
+
|
|
881
|
+
// Static values (known at execution time)
|
|
882
|
+
const staticName = 'my-app'; // Remains: string
|
|
883
|
+
const staticReplicas = 3; // Remains: number
|
|
884
|
+
|
|
885
|
+
// Mixed usage in factory functions
|
|
886
|
+
const deployment = simpleDeployment({
|
|
887
|
+
name: schema.spec.name, // Dynamic: KubernetesRef<string> → CEL expression
|
|
888
|
+
replicas: 3, // Static: number → direct value
|
|
889
|
+
image: 'nginx:latest' // Static: string → direct value
|
|
890
|
+
});
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
### Benefits of Enhanced Types
|
|
894
|
+
|
|
895
|
+
- **No Optional Chaining**: Write cleaner code without `?.` operators
|
|
896
|
+
- **Better IntelliSense**: Full autocomplete for all schema and status fields
|
|
897
|
+
- **Execution-Time Safety**: Catch typos and missing fields when building resources
|
|
898
|
+
- **Runtime Flexibility**: References are resolved dynamically by Kro
|
|
899
|
+
- **Natural Syntax**: Write code that looks like direct property access
|
|
900
|
+
|
|
901
|
+
This enhanced type system makes TypeKro feel natural to use while maintaining the powerful reference resolution capabilities needed for complex Kubernetes deployments.
|
|
902
|
+
|
|
903
|
+
---
|
|
904
|
+
|
|
905
|
+
## Multi-Cloud Integration with Alchemy
|
|
906
|
+
|
|
907
|
+
TypeKro integrates seamlessly with [Alchemy](https://alchemy.run) to enable unified cloud + Kubernetes infrastructure management. Alchemy is infrastructure-as-TypeScript that lets you deploy to Cloudflare, AWS, and more with pure TypeScript.
|
|
908
|
+
|
|
909
|
+
### Why Use TypeKro + Alchemy?
|
|
910
|
+
|
|
911
|
+
- **Unified TypeScript Experience**: Write both cloud resources and Kubernetes resources in the same language
|
|
912
|
+
- **Cross-Platform References**: Cloud resources can reference Kubernetes resources and vice versa
|
|
913
|
+
- **Type-Safe Integration**: Full TypeScript validation across your entire infrastructure stack
|
|
914
|
+
- **Flexible Deployment**: Use any TypeKro deployment strategy (Direct, YAML, KRO) with Alchemy
|
|
915
|
+
|
|
916
|
+
### Individual Resource Registration Pattern
|
|
917
|
+
|
|
918
|
+
Register specific TypeKro resources with Alchemy for hybrid cloud-native applications:
|
|
919
|
+
|
|
920
|
+
```typescript
|
|
921
|
+
import alchemy from 'alchemy';
|
|
922
|
+
import { Bucket } from 'alchemy/aws';
|
|
923
|
+
|
|
924
|
+
// 1. Create Alchemy scope
|
|
925
|
+
const app = await alchemy('webapp-infrastructure');
|
|
926
|
+
|
|
927
|
+
// 2. Create cloud resources with Alchemy
|
|
928
|
+
const bucket = await Bucket('webapp-uploads');
|
|
929
|
+
|
|
930
|
+
// 3. Create Kubernetes resources that reference cloud resources
|
|
931
|
+
const webappGraph = toResourceGraph(
|
|
932
|
+
{
|
|
933
|
+
name: 'webapp-with-cloud',
|
|
934
|
+
apiVersion: 'example.com/v1',
|
|
935
|
+
kind: 'CloudWebApp',
|
|
936
|
+
spec: type({ name: 'string', image: 'string', replicas: 'number' }),
|
|
937
|
+
status: type({ ready: 'boolean' })
|
|
938
|
+
},
|
|
939
|
+
(schema) => ({
|
|
940
|
+
app: simpleDeployment({
|
|
941
|
+
name: schema.spec.name,
|
|
942
|
+
image: schema.spec.image,
|
|
943
|
+
env: {
|
|
944
|
+
BUCKET_NAME: bucket.name, // Reference to Alchemy resource
|
|
945
|
+
API_URL: Cel.template('http://%s-service', schema.spec.name)
|
|
946
|
+
}
|
|
947
|
+
})
|
|
948
|
+
}),
|
|
949
|
+
(schema, resources) => ({
|
|
950
|
+
ready: Cel.expr(resources.app.status.readyReplicas, ' > 0')
|
|
951
|
+
})
|
|
952
|
+
);
|
|
953
|
+
|
|
954
|
+
// Deploy TypeKro resources with Alchemy integration
|
|
955
|
+
await app.run(async () => {
|
|
956
|
+
const factory = await webappGraph.factory('direct', {
|
|
957
|
+
namespace: 'default',
|
|
958
|
+
alchemyScope: app
|
|
959
|
+
});
|
|
960
|
+
await factory.deploy({
|
|
961
|
+
name: 'webapp',
|
|
962
|
+
image: 'nginx:1.21',
|
|
963
|
+
replicas: 3
|
|
964
|
+
});
|
|
965
|
+
});
|
|
966
|
+
```
|
|
967
|
+
|
|
968
|
+
### Real-World Cloud-Native Application
|
|
969
|
+
|
|
970
|
+
Here's a complete example showing TypeKro + Alchemy for a production cloud-native application:
|
|
971
|
+
|
|
972
|
+
```typescript
|
|
973
|
+
import alchemy from 'alchemy';
|
|
974
|
+
import { Bucket, Function as LambdaFunction } from 'alchemy/aws';
|
|
975
|
+
import { toResourceGraph, simpleDeployment, type } from 'typekro';
|
|
976
|
+
|
|
977
|
+
// 1. Create Alchemy scope
|
|
978
|
+
const app = await alchemy('cloud-native-app');
|
|
979
|
+
|
|
980
|
+
// 2. Cloud resources with Alchemy
|
|
981
|
+
const api = await LambdaFunction('database-function', {
|
|
982
|
+
code: './functions/database.js',
|
|
983
|
+
environment: {
|
|
984
|
+
DATABASE_URL: 'postgresql://...'
|
|
985
|
+
}
|
|
986
|
+
});
|
|
987
|
+
|
|
988
|
+
const bucket = await Bucket('app-uploads');
|
|
989
|
+
|
|
990
|
+
// 3. Kubernetes resources with TypeKro that reference cloud resources
|
|
991
|
+
const AppSpec = type({
|
|
992
|
+
name: 'string',
|
|
993
|
+
image: 'string',
|
|
994
|
+
replicas: 'number'
|
|
995
|
+
});
|
|
996
|
+
|
|
997
|
+
const appGraph = toResourceGraph(
|
|
998
|
+
{
|
|
999
|
+
name: 'cloud-native-app',
|
|
1000
|
+
apiVersion: 'example.com/v1',
|
|
1001
|
+
kind: 'CloudNativeApp',
|
|
1002
|
+
spec: AppSpec,
|
|
1003
|
+
status: type({ ready: 'boolean' })
|
|
1004
|
+
},
|
|
1005
|
+
(schema) => ({
|
|
1006
|
+
app: simpleDeployment({
|
|
1007
|
+
name: schema.spec.name,
|
|
1008
|
+
image: schema.spec.image,
|
|
1009
|
+
env: {
|
|
1010
|
+
// Reference cloud resources
|
|
1011
|
+
API_URL: api.url,
|
|
1012
|
+
UPLOAD_BUCKET: bucket.name,
|
|
1013
|
+
// Reference other Kubernetes resources
|
|
1014
|
+
REDIS_HOST: Cel.template('%s-redis', schema.spec.name)
|
|
1015
|
+
}
|
|
1016
|
+
}),
|
|
1017
|
+
|
|
1018
|
+
redis: simpleDeployment({
|
|
1019
|
+
name: Cel.template('%s-redis', schema.spec.name),
|
|
1020
|
+
image: 'redis:7'
|
|
1021
|
+
})
|
|
1022
|
+
}),
|
|
1023
|
+
(schema, resources) => ({
|
|
1024
|
+
ready: Cel.expr(resources.app.status.readyReplicas, ' > 0')
|
|
1025
|
+
})
|
|
1026
|
+
);
|
|
1027
|
+
|
|
1028
|
+
// 4. Deploy as unified infrastructure
|
|
1029
|
+
await app.run(async () => {
|
|
1030
|
+
const factory = await appGraph.factory('direct', {
|
|
1031
|
+
namespace: 'production',
|
|
1032
|
+
alchemyScope: app
|
|
1033
|
+
});
|
|
1034
|
+
await factory.deploy({
|
|
1035
|
+
name: 'myapp',
|
|
1036
|
+
image: 'myapp:v1.2.3',
|
|
1037
|
+
replicas: 5
|
|
1038
|
+
});
|
|
1039
|
+
});
|
|
1040
|
+
```
|
|
1041
|
+
|
|
1042
|
+
### Integration Patterns
|
|
1043
|
+
|
|
1044
|
+
TypeKro works with all Alchemy deployment patterns:
|
|
1045
|
+
|
|
1046
|
+
#### Pattern 1: Cloud-First with Kubernetes Extensions
|
|
1047
|
+
```typescript
|
|
1048
|
+
// Start with cloud infrastructure
|
|
1049
|
+
const app = await alchemy('my-platform');
|
|
1050
|
+
const database = await RDS('main-db');
|
|
1051
|
+
const cache = await ElastiCache('redis-cluster');
|
|
1052
|
+
|
|
1053
|
+
// Add Kubernetes workloads that use cloud resources
|
|
1054
|
+
const k8sWorkloads = await webappGraph.factory('kro', { namespace: 'apps' });
|
|
1055
|
+
await app.run(async () => {
|
|
1056
|
+
const factory = await k8sWorkloads.factory('kro', {
|
|
1057
|
+
namespace: 'apps',
|
|
1058
|
+
alchemyScope: app
|
|
1059
|
+
});
|
|
1060
|
+
await factory.deploy({
|
|
1061
|
+
databaseUrl: database.endpoint,
|
|
1062
|
+
redisUrl: cache.endpoint
|
|
1063
|
+
});
|
|
1064
|
+
});
|
|
1065
|
+
```
|
|
1066
|
+
|
|
1067
|
+
#### Pattern 2: Kubernetes-First with Cloud Services
|
|
1068
|
+
```typescript
|
|
1069
|
+
// Start with Kubernetes infrastructure
|
|
1070
|
+
const webappFactory = await webappGraph.factory('direct', { namespace: 'default' });
|
|
1071
|
+
|
|
1072
|
+
// Add cloud resources that support the Kubernetes workloads
|
|
1073
|
+
const app = await alchemy('support-services');
|
|
1074
|
+
const monitoring = await CloudWatch('webapp-metrics');
|
|
1075
|
+
const storage = await S3('webapp-data');
|
|
1076
|
+
|
|
1077
|
+
await app.run(async () => {
|
|
1078
|
+
const factory = await webappGraph.factory('direct', {
|
|
1079
|
+
namespace: 'default',
|
|
1080
|
+
alchemyScope: app
|
|
1081
|
+
});
|
|
1082
|
+
await factory.deploy({ /* config */ });
|
|
1083
|
+
});
|
|
1084
|
+
```
|
|
1085
|
+
|
|
1086
|
+
### Benefits of TypeKro + Alchemy Integration
|
|
1087
|
+
|
|
1088
|
+
- **Single Language**: TypeScript for everything - no YAML, HCL, or domain-specific languages
|
|
1089
|
+
- **Type Safety Across Platforms**: Catch configuration errors at compile time, not runtime
|
|
1090
|
+
- **Cross-Platform References**: Natural references between cloud and Kubernetes resources
|
|
1091
|
+
- **Deployment Flexibility**: Use any TypeKro deployment strategy with Alchemy
|
|
1092
|
+
- **IDE Support**: Full autocomplete and refactoring across your entire infrastructure
|
|
1093
|
+
- **GitOps Compatible**: Generate deterministic YAML while maintaining cloud resource management
|
|
1094
|
+
|
|
1095
|
+
---
|
|
1096
|
+
|
|
1097
|
+
## Contributing
|
|
1098
|
+
|
|
1099
|
+
We welcome contributions to TypeKro! Whether you're fixing bugs, adding features, or improving documentation, your help makes TypeKro better for everyone.
|
|
1100
|
+
|
|
1101
|
+
### Quick Start for Contributors
|
|
1102
|
+
|
|
1103
|
+
```bash
|
|
1104
|
+
# Fork and clone the repository
|
|
1105
|
+
git clone https://github.com/your-username/typekro.git
|
|
1106
|
+
cd typekro
|
|
1107
|
+
|
|
1108
|
+
# Install dependencies (we use Bun)
|
|
1109
|
+
bun install
|
|
1110
|
+
|
|
1111
|
+
# Run tests to ensure everything works
|
|
1112
|
+
bun run test
|
|
1113
|
+
|
|
1114
|
+
# Make your changes and run quality checks
|
|
1115
|
+
bun run quality
|
|
1116
|
+
```
|
|
1117
|
+
|
|
1118
|
+
### What Can You Contribute?
|
|
1119
|
+
|
|
1120
|
+
- 🐛 **Bug Fixes** - Help us squash bugs and improve reliability
|
|
1121
|
+
- ✨ **New Features** - Add factory functions for new Kubernetes resources
|
|
1122
|
+
- 📚 **Documentation** - Improve examples, guides, and API documentation
|
|
1123
|
+
- 🧪 **Tests** - Add test coverage for edge cases and new functionality
|
|
1124
|
+
- 🔧 **Tooling** - Improve development experience and CI/CD
|
|
1125
|
+
|
|
1126
|
+
**[📖 Read the Complete Contributing Guide →](CONTRIBUTING.md)**
|
|
1127
|
+
|
|
1128
|
+
The contributing guide includes:
|
|
1129
|
+
- Detailed setup instructions
|
|
1130
|
+
- Code structure and architectural principles
|
|
1131
|
+
- Testing guidelines and examples
|
|
1132
|
+
- PR submission process
|
|
1133
|
+
- Release workflow
|
|
1134
|
+
|
|
1135
|
+
## License
|
|
1136
|
+
|
|
1137
|
+
Apache 2.0 - see [LICENSE](LICENSE) for details.
|