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