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.
Files changed (620) hide show
  1. package/LICENSE +185 -0
  2. package/README.md +1137 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/alchemy/deployers.d.ts +39 -0
  5. package/dist/alchemy/deployers.d.ts.map +1 -0
  6. package/dist/alchemy/deployers.js +194 -0
  7. package/dist/alchemy/deployers.js.map +1 -0
  8. package/dist/alchemy/deployment.d.ts +12 -0
  9. package/dist/alchemy/deployment.d.ts.map +1 -0
  10. package/dist/alchemy/deployment.js +12 -0
  11. package/dist/alchemy/deployment.js.map +1 -0
  12. package/dist/alchemy/index.d.ts +17 -0
  13. package/dist/alchemy/index.d.ts.map +1 -0
  14. package/dist/alchemy/index.js +20 -0
  15. package/dist/alchemy/index.js.map +1 -0
  16. package/dist/alchemy/resolver.d.ts +127 -0
  17. package/dist/alchemy/resolver.d.ts.map +1 -0
  18. package/dist/alchemy/resolver.js +341 -0
  19. package/dist/alchemy/resolver.js.map +1 -0
  20. package/dist/alchemy/resource-registration.d.ts +22 -0
  21. package/dist/alchemy/resource-registration.d.ts.map +1 -0
  22. package/dist/alchemy/resource-registration.js +218 -0
  23. package/dist/alchemy/resource-registration.js.map +1 -0
  24. package/dist/alchemy/type-inference.d.ts +13 -0
  25. package/dist/alchemy/type-inference.d.ts.map +1 -0
  26. package/dist/alchemy/type-inference.js +67 -0
  27. package/dist/alchemy/type-inference.js.map +1 -0
  28. package/dist/alchemy/types.d.ts +92 -0
  29. package/dist/alchemy/types.d.ts.map +1 -0
  30. package/dist/alchemy/types.js +8 -0
  31. package/dist/alchemy/types.js.map +1 -0
  32. package/dist/alchemy/utilities.d.ts +12 -0
  33. package/dist/alchemy/utilities.d.ts.map +1 -0
  34. package/dist/alchemy/utilities.js +16 -0
  35. package/dist/alchemy/utilities.js.map +1 -0
  36. package/dist/alchemy/wrapper.d.ts +16 -0
  37. package/dist/alchemy/wrapper.d.ts.map +1 -0
  38. package/dist/alchemy/wrapper.js +23 -0
  39. package/dist/alchemy/wrapper.js.map +1 -0
  40. package/dist/core/composition/composition.d.ts +94 -0
  41. package/dist/core/composition/composition.d.ts.map +1 -0
  42. package/dist/core/composition/composition.js +230 -0
  43. package/dist/core/composition/composition.js.map +1 -0
  44. package/dist/core/composition/index.d.ts +12 -0
  45. package/dist/core/composition/index.d.ts.map +1 -0
  46. package/dist/core/composition/index.js +12 -0
  47. package/dist/core/composition/index.js.map +1 -0
  48. package/dist/core/composition/typekro-runtime/index.d.ts +3 -0
  49. package/dist/core/composition/typekro-runtime/index.d.ts.map +1 -0
  50. package/dist/core/composition/typekro-runtime/index.js +2 -0
  51. package/dist/core/composition/typekro-runtime/index.js.map +1 -0
  52. package/dist/core/composition/typekro-runtime/typekro-runtime.d.ts +39 -0
  53. package/dist/core/composition/typekro-runtime/typekro-runtime.d.ts.map +1 -0
  54. package/dist/core/composition/typekro-runtime/typekro-runtime.js +100 -0
  55. package/dist/core/composition/typekro-runtime/typekro-runtime.js.map +1 -0
  56. package/dist/core/composition/typekro-runtime/types.d.ts +16 -0
  57. package/dist/core/composition/typekro-runtime/types.d.ts.map +1 -0
  58. package/dist/core/composition/typekro-runtime/types.js +12 -0
  59. package/dist/core/composition/typekro-runtime/types.js.map +1 -0
  60. package/dist/core/composition/types.d.ts +264 -0
  61. package/dist/core/composition/types.d.ts.map +1 -0
  62. package/dist/core/composition/types.js +2 -0
  63. package/dist/core/composition/types.js.map +1 -0
  64. package/dist/core/constants/brands.d.ts +42 -0
  65. package/dist/core/constants/brands.d.ts.map +1 -0
  66. package/dist/core/constants/brands.js +51 -0
  67. package/dist/core/constants/brands.js.map +1 -0
  68. package/dist/core/dependencies/graph.d.ts +67 -0
  69. package/dist/core/dependencies/graph.d.ts.map +1 -0
  70. package/dist/core/dependencies/graph.js +220 -0
  71. package/dist/core/dependencies/graph.js.map +1 -0
  72. package/dist/core/dependencies/index.d.ts +7 -0
  73. package/dist/core/dependencies/index.d.ts.map +1 -0
  74. package/dist/core/dependencies/index.js +8 -0
  75. package/dist/core/dependencies/index.js.map +1 -0
  76. package/dist/core/dependencies/resolver.d.ts +53 -0
  77. package/dist/core/dependencies/resolver.d.ts.map +1 -0
  78. package/dist/core/dependencies/resolver.js +167 -0
  79. package/dist/core/dependencies/resolver.js.map +1 -0
  80. package/dist/core/dependencies/type-guards.d.ts +17 -0
  81. package/dist/core/dependencies/type-guards.d.ts.map +1 -0
  82. package/dist/core/dependencies/type-guards.js +35 -0
  83. package/dist/core/dependencies/type-guards.js.map +1 -0
  84. package/dist/core/deployment/deployment-strategies.d.ts +12 -0
  85. package/dist/core/deployment/deployment-strategies.d.ts.map +1 -0
  86. package/dist/core/deployment/deployment-strategies.js +11 -0
  87. package/dist/core/deployment/deployment-strategies.js.map +1 -0
  88. package/dist/core/deployment/direct-factory.d.ts +111 -0
  89. package/dist/core/deployment/direct-factory.d.ts.map +1 -0
  90. package/dist/core/deployment/direct-factory.js +627 -0
  91. package/dist/core/deployment/direct-factory.js.map +1 -0
  92. package/dist/core/deployment/engine.d.ts +128 -0
  93. package/dist/core/deployment/engine.d.ts.map +1 -0
  94. package/dist/core/deployment/engine.js +1408 -0
  95. package/dist/core/deployment/engine.js.map +1 -0
  96. package/dist/core/deployment/index.d.ts +14 -0
  97. package/dist/core/deployment/index.d.ts.map +1 -0
  98. package/dist/core/deployment/index.js +14 -0
  99. package/dist/core/deployment/index.js.map +1 -0
  100. package/dist/core/deployment/kro-factory.d.ts +143 -0
  101. package/dist/core/deployment/kro-factory.d.ts.map +1 -0
  102. package/dist/core/deployment/kro-factory.js +837 -0
  103. package/dist/core/deployment/kro-factory.js.map +1 -0
  104. package/dist/core/deployment/readiness.d.ts +54 -0
  105. package/dist/core/deployment/readiness.d.ts.map +1 -0
  106. package/dist/core/deployment/readiness.js +175 -0
  107. package/dist/core/deployment/readiness.js.map +1 -0
  108. package/dist/core/deployment/rollback-manager.d.ts +63 -0
  109. package/dist/core/deployment/rollback-manager.d.ts.map +1 -0
  110. package/dist/core/deployment/rollback-manager.js +225 -0
  111. package/dist/core/deployment/rollback-manager.js.map +1 -0
  112. package/dist/core/deployment/shared-utilities.d.ts +41 -0
  113. package/dist/core/deployment/shared-utilities.d.ts.map +1 -0
  114. package/dist/core/deployment/shared-utilities.js +100 -0
  115. package/dist/core/deployment/shared-utilities.js.map +1 -0
  116. package/dist/core/deployment/status-hydrator.d.ts +86 -0
  117. package/dist/core/deployment/status-hydrator.d.ts.map +1 -0
  118. package/dist/core/deployment/status-hydrator.js +262 -0
  119. package/dist/core/deployment/status-hydrator.js.map +1 -0
  120. package/dist/core/deployment/strategies/alchemy-strategy.d.ts +107 -0
  121. package/dist/core/deployment/strategies/alchemy-strategy.d.ts.map +1 -0
  122. package/dist/core/deployment/strategies/alchemy-strategy.js +446 -0
  123. package/dist/core/deployment/strategies/alchemy-strategy.js.map +1 -0
  124. package/dist/core/deployment/strategies/base-strategy.d.ts +50 -0
  125. package/dist/core/deployment/strategies/base-strategy.d.ts.map +1 -0
  126. package/dist/core/deployment/strategies/base-strategy.js +82 -0
  127. package/dist/core/deployment/strategies/base-strategy.js.map +1 -0
  128. package/dist/core/deployment/strategies/direct-strategy.d.ts +29 -0
  129. package/dist/core/deployment/strategies/direct-strategy.d.ts.map +1 -0
  130. package/dist/core/deployment/strategies/direct-strategy.js +80 -0
  131. package/dist/core/deployment/strategies/direct-strategy.js.map +1 -0
  132. package/dist/core/deployment/strategies/index.d.ts +12 -0
  133. package/dist/core/deployment/strategies/index.d.ts.map +1 -0
  134. package/dist/core/deployment/strategies/index.js +12 -0
  135. package/dist/core/deployment/strategies/index.js.map +1 -0
  136. package/dist/core/deployment/strategies/kro-strategy.d.ts +41 -0
  137. package/dist/core/deployment/strategies/kro-strategy.d.ts.map +1 -0
  138. package/dist/core/deployment/strategies/kro-strategy.js +270 -0
  139. package/dist/core/deployment/strategies/kro-strategy.js.map +1 -0
  140. package/dist/core/direct-deployment.d.ts +8 -0
  141. package/dist/core/direct-deployment.d.ts.map +1 -0
  142. package/dist/core/direct-deployment.js +9 -0
  143. package/dist/core/direct-deployment.js.map +1 -0
  144. package/dist/core/errors.d.ts +73 -0
  145. package/dist/core/errors.d.ts.map +1 -0
  146. package/dist/core/errors.js +250 -0
  147. package/dist/core/errors.js.map +1 -0
  148. package/dist/core/evaluation/cel-optimizer.d.ts +48 -0
  149. package/dist/core/evaluation/cel-optimizer.d.ts.map +1 -0
  150. package/dist/core/evaluation/cel-optimizer.js +176 -0
  151. package/dist/core/evaluation/cel-optimizer.js.map +1 -0
  152. package/dist/core/factory.d.ts +12 -0
  153. package/dist/core/factory.d.ts.map +1 -0
  154. package/dist/core/factory.js +13 -0
  155. package/dist/core/factory.js.map +1 -0
  156. package/dist/core/kubernetes/api.d.ts +43 -0
  157. package/dist/core/kubernetes/api.d.ts.map +1 -0
  158. package/dist/core/kubernetes/api.js +209 -0
  159. package/dist/core/kubernetes/api.js.map +1 -0
  160. package/dist/core/kubernetes/client-provider.d.ts +204 -0
  161. package/dist/core/kubernetes/client-provider.d.ts.map +1 -0
  162. package/dist/core/kubernetes/client-provider.js +421 -0
  163. package/dist/core/kubernetes/client-provider.js.map +1 -0
  164. package/dist/core/logging/config.d.ts +14 -0
  165. package/dist/core/logging/config.d.ts.map +1 -0
  166. package/dist/core/logging/config.js +57 -0
  167. package/dist/core/logging/config.js.map +1 -0
  168. package/dist/core/logging/index.d.ts +4 -0
  169. package/dist/core/logging/index.d.ts.map +1 -0
  170. package/dist/core/logging/index.js +4 -0
  171. package/dist/core/logging/index.js.map +1 -0
  172. package/dist/core/logging/logger.d.ts +26 -0
  173. package/dist/core/logging/logger.d.ts.map +1 -0
  174. package/dist/core/logging/logger.js +114 -0
  175. package/dist/core/logging/logger.js.map +1 -0
  176. package/dist/core/logging/types.d.ts +93 -0
  177. package/dist/core/logging/types.d.ts.map +1 -0
  178. package/dist/core/logging/types.js +2 -0
  179. package/dist/core/logging/types.js.map +1 -0
  180. package/dist/core/readiness/cluster-state.d.ts +229 -0
  181. package/dist/core/readiness/cluster-state.d.ts.map +1 -0
  182. package/dist/core/readiness/cluster-state.js +360 -0
  183. package/dist/core/readiness/cluster-state.js.map +1 -0
  184. package/dist/core/readiness/index.d.ts +5 -0
  185. package/dist/core/readiness/index.d.ts.map +1 -0
  186. package/dist/core/readiness/index.js +5 -0
  187. package/dist/core/readiness/index.js.map +1 -0
  188. package/dist/core/readiness/registry.d.ts +45 -0
  189. package/dist/core/readiness/registry.d.ts.map +1 -0
  190. package/dist/core/readiness/registry.js +62 -0
  191. package/dist/core/readiness/registry.js.map +1 -0
  192. package/dist/core/references/cel-evaluator.d.ts +102 -0
  193. package/dist/core/references/cel-evaluator.d.ts.map +1 -0
  194. package/dist/core/references/cel-evaluator.js +288 -0
  195. package/dist/core/references/cel-evaluator.js.map +1 -0
  196. package/dist/core/references/cel.d.ts +75 -0
  197. package/dist/core/references/cel.d.ts.map +1 -0
  198. package/dist/core/references/cel.js +213 -0
  199. package/dist/core/references/cel.js.map +1 -0
  200. package/dist/core/references/external-refs.d.ts +37 -0
  201. package/dist/core/references/external-refs.d.ts.map +1 -0
  202. package/dist/core/references/external-refs.js +53 -0
  203. package/dist/core/references/external-refs.js.map +1 -0
  204. package/dist/core/references/index.d.ts +15 -0
  205. package/dist/core/references/index.d.ts.map +1 -0
  206. package/dist/core/references/index.js +19 -0
  207. package/dist/core/references/index.js.map +1 -0
  208. package/dist/core/references/resolver.d.ts +117 -0
  209. package/dist/core/references/resolver.d.ts.map +1 -0
  210. package/dist/core/references/resolver.js +554 -0
  211. package/dist/core/references/resolver.js.map +1 -0
  212. package/dist/core/references/schema-proxy.d.ts +38 -0
  213. package/dist/core/references/schema-proxy.d.ts.map +1 -0
  214. package/dist/core/references/schema-proxy.js +163 -0
  215. package/dist/core/references/schema-proxy.js.map +1 -0
  216. package/dist/core/serialization/core.d.ts +15 -0
  217. package/dist/core/serialization/core.d.ts.map +1 -0
  218. package/dist/core/serialization/core.js +169 -0
  219. package/dist/core/serialization/core.js.map +1 -0
  220. package/dist/core/serialization/index.d.ts +9 -0
  221. package/dist/core/serialization/index.d.ts.map +1 -0
  222. package/dist/core/serialization/index.js +12 -0
  223. package/dist/core/serialization/index.js.map +1 -0
  224. package/dist/core/serialization/schema.d.ts +14 -0
  225. package/dist/core/serialization/schema.d.ts.map +1 -0
  226. package/dist/core/serialization/schema.js +33 -0
  227. package/dist/core/serialization/schema.js.map +1 -0
  228. package/dist/core/serialization/validation.d.ts +18 -0
  229. package/dist/core/serialization/validation.d.ts.map +1 -0
  230. package/dist/core/serialization/validation.js +165 -0
  231. package/dist/core/serialization/validation.js.map +1 -0
  232. package/dist/core/serialization/yaml.d.ts +10 -0
  233. package/dist/core/serialization/yaml.d.ts.map +1 -0
  234. package/dist/core/serialization/yaml.js +63 -0
  235. package/dist/core/serialization/yaml.js.map +1 -0
  236. package/dist/core/types/common.d.ts +41 -0
  237. package/dist/core/types/common.d.ts.map +1 -0
  238. package/dist/core/types/common.js +9 -0
  239. package/dist/core/types/common.js.map +1 -0
  240. package/dist/core/types/dependencies.d.ts +14 -0
  241. package/dist/core/types/dependencies.d.ts.map +1 -0
  242. package/dist/core/types/dependencies.js +5 -0
  243. package/dist/core/types/dependencies.js.map +1 -0
  244. package/dist/core/types/deployment.d.ts +265 -0
  245. package/dist/core/types/deployment.d.ts.map +1 -0
  246. package/dist/core/types/deployment.js +20 -0
  247. package/dist/core/types/deployment.js.map +1 -0
  248. package/dist/core/types/index.d.ts +19 -0
  249. package/dist/core/types/index.d.ts.map +1 -0
  250. package/dist/core/types/index.js +15 -0
  251. package/dist/core/types/index.js.map +1 -0
  252. package/dist/core/types/kubernetes.d.ts +352 -0
  253. package/dist/core/types/kubernetes.d.ts.map +1 -0
  254. package/dist/core/types/kubernetes.js +5 -0
  255. package/dist/core/types/kubernetes.js.map +1 -0
  256. package/dist/core/types/references.d.ts +54 -0
  257. package/dist/core/types/references.d.ts.map +1 -0
  258. package/dist/core/types/references.js +14 -0
  259. package/dist/core/types/references.js.map +1 -0
  260. package/dist/core/types/resource-graph.d.ts +93 -0
  261. package/dist/core/types/resource-graph.d.ts.map +1 -0
  262. package/dist/core/types/resource-graph.js +8 -0
  263. package/dist/core/types/resource-graph.js.map +1 -0
  264. package/dist/core/types/serialization.d.ts +210 -0
  265. package/dist/core/types/serialization.d.ts.map +1 -0
  266. package/dist/core/types/serialization.js +5 -0
  267. package/dist/core/types/serialization.js.map +1 -0
  268. package/dist/core/types/yaml.d.ts +92 -0
  269. package/dist/core/types/yaml.d.ts.map +1 -0
  270. package/dist/core/types/yaml.js +2 -0
  271. package/dist/core/types/yaml.js.map +1 -0
  272. package/dist/core/types.d.ts +8 -0
  273. package/dist/core/types.d.ts.map +1 -0
  274. package/dist/core/types.js +9 -0
  275. package/dist/core/types.js.map +1 -0
  276. package/dist/core/validation/cel-validator.d.ts +47 -0
  277. package/dist/core/validation/cel-validator.d.ts.map +1 -0
  278. package/dist/core/validation/cel-validator.js +200 -0
  279. package/dist/core/validation/cel-validator.js.map +1 -0
  280. package/dist/core/yaml/index.d.ts +5 -0
  281. package/dist/core/yaml/index.d.ts.map +1 -0
  282. package/dist/core/yaml/index.js +5 -0
  283. package/dist/core/yaml/index.js.map +1 -0
  284. package/dist/core/yaml/path-resolver.d.ts +122 -0
  285. package/dist/core/yaml/path-resolver.d.ts.map +1 -0
  286. package/dist/core/yaml/path-resolver.js +556 -0
  287. package/dist/core/yaml/path-resolver.js.map +1 -0
  288. package/dist/core.d.ts +30 -0
  289. package/dist/core.d.ts.map +1 -0
  290. package/dist/core.js +59 -0
  291. package/dist/core.js.map +1 -0
  292. package/dist/factories/flux/git-repository.d.ts +62 -0
  293. package/dist/factories/flux/git-repository.d.ts.map +1 -0
  294. package/dist/factories/flux/git-repository.js +34 -0
  295. package/dist/factories/flux/git-repository.js.map +1 -0
  296. package/dist/factories/flux/index.d.ts +10 -0
  297. package/dist/factories/flux/index.d.ts.map +1 -0
  298. package/dist/factories/flux/index.js +11 -0
  299. package/dist/factories/flux/index.js.map +1 -0
  300. package/dist/factories/flux/kustomize/index.d.ts +4 -0
  301. package/dist/factories/flux/kustomize/index.d.ts.map +1 -0
  302. package/dist/factories/flux/kustomize/index.js +3 -0
  303. package/dist/factories/flux/kustomize/index.js.map +1 -0
  304. package/dist/factories/flux/kustomize/kustomization.d.ts +178 -0
  305. package/dist/factories/flux/kustomize/kustomization.d.ts.map +1 -0
  306. package/dist/factories/flux/kustomize/kustomization.js +108 -0
  307. package/dist/factories/flux/kustomize/kustomization.js.map +1 -0
  308. package/dist/factories/flux/kustomize/readiness-evaluators.d.ts +9 -0
  309. package/dist/factories/flux/kustomize/readiness-evaluators.d.ts.map +1 -0
  310. package/dist/factories/flux/kustomize/readiness-evaluators.js +71 -0
  311. package/dist/factories/flux/kustomize/readiness-evaluators.js.map +1 -0
  312. package/dist/factories/flux/kustomize/types.d.ts +2 -0
  313. package/dist/factories/flux/kustomize/types.d.ts.map +1 -0
  314. package/dist/factories/flux/kustomize/types.js +2 -0
  315. package/dist/factories/flux/kustomize/types.js.map +1 -0
  316. package/dist/factories/helm/helm-release.d.ts +139 -0
  317. package/dist/factories/helm/helm-release.d.ts.map +1 -0
  318. package/dist/factories/helm/helm-release.js +180 -0
  319. package/dist/factories/helm/helm-release.js.map +1 -0
  320. package/dist/factories/helm/helm-repository.d.ts +24 -0
  321. package/dist/factories/helm/helm-repository.d.ts.map +1 -0
  322. package/dist/factories/helm/helm-repository.js +57 -0
  323. package/dist/factories/helm/helm-repository.js.map +1 -0
  324. package/dist/factories/helm/index.d.ts +8 -0
  325. package/dist/factories/helm/index.d.ts.map +1 -0
  326. package/dist/factories/helm/index.js +8 -0
  327. package/dist/factories/helm/index.js.map +1 -0
  328. package/dist/factories/helm/readiness-evaluators.d.ts +55 -0
  329. package/dist/factories/helm/readiness-evaluators.d.ts.map +1 -0
  330. package/dist/factories/helm/readiness-evaluators.js +295 -0
  331. package/dist/factories/helm/readiness-evaluators.js.map +1 -0
  332. package/dist/factories/helm/types.d.ts +21 -0
  333. package/dist/factories/helm/types.d.ts.map +1 -0
  334. package/dist/factories/helm/types.js +2 -0
  335. package/dist/factories/helm/types.js.map +1 -0
  336. package/dist/factories/index.d.ts +12 -0
  337. package/dist/factories/index.d.ts.map +1 -0
  338. package/dist/factories/index.js +31 -0
  339. package/dist/factories/index.js.map +1 -0
  340. package/dist/factories/kro/index.d.ts +11 -0
  341. package/dist/factories/kro/index.d.ts.map +1 -0
  342. package/dist/factories/kro/index.js +10 -0
  343. package/dist/factories/kro/index.js.map +1 -0
  344. package/dist/factories/kro/kro-crd.d.ts +14 -0
  345. package/dist/factories/kro/kro-crd.d.ts.map +1 -0
  346. package/dist/factories/kro/kro-crd.js +51 -0
  347. package/dist/factories/kro/kro-crd.js.map +1 -0
  348. package/dist/factories/kro/kro-custom-resource.d.ts +23 -0
  349. package/dist/factories/kro/kro-custom-resource.d.ts.map +1 -0
  350. package/dist/factories/kro/kro-custom-resource.js +153 -0
  351. package/dist/factories/kro/kro-custom-resource.js.map +1 -0
  352. package/dist/factories/kro/resource-graph-definition.d.ts +12 -0
  353. package/dist/factories/kro/resource-graph-definition.d.ts.map +1 -0
  354. package/dist/factories/kro/resource-graph-definition.js +94 -0
  355. package/dist/factories/kro/resource-graph-definition.js.map +1 -0
  356. package/dist/factories/kubernetes/admission/index.d.ts +9 -0
  357. package/dist/factories/kubernetes/admission/index.d.ts.map +1 -0
  358. package/dist/factories/kubernetes/admission/index.js +9 -0
  359. package/dist/factories/kubernetes/admission/index.js.map +1 -0
  360. package/dist/factories/kubernetes/admission/mutating-webhook-configuration.d.ts +5 -0
  361. package/dist/factories/kubernetes/admission/mutating-webhook-configuration.d.ts.map +1 -0
  362. package/dist/factories/kubernetes/admission/mutating-webhook-configuration.js +10 -0
  363. package/dist/factories/kubernetes/admission/mutating-webhook-configuration.js.map +1 -0
  364. package/dist/factories/kubernetes/admission/validating-webhook-configuration.d.ts +5 -0
  365. package/dist/factories/kubernetes/admission/validating-webhook-configuration.d.ts.map +1 -0
  366. package/dist/factories/kubernetes/admission/validating-webhook-configuration.js +10 -0
  367. package/dist/factories/kubernetes/admission/validating-webhook-configuration.js.map +1 -0
  368. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.d.ts +6 -0
  369. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.d.ts.map +1 -0
  370. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.js +35 -0
  371. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.js.map +1 -0
  372. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.d.ts +6 -0
  373. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.d.ts.map +1 -0
  374. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js +31 -0
  375. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js.map +1 -0
  376. package/dist/factories/kubernetes/autoscaling/index.d.ts +9 -0
  377. package/dist/factories/kubernetes/autoscaling/index.d.ts.map +1 -0
  378. package/dist/factories/kubernetes/autoscaling/index.js +9 -0
  379. package/dist/factories/kubernetes/autoscaling/index.js.map +1 -0
  380. package/dist/factories/kubernetes/certificates/certificate-signing-request.d.ts +6 -0
  381. package/dist/factories/kubernetes/certificates/certificate-signing-request.d.ts.map +1 -0
  382. package/dist/factories/kubernetes/certificates/certificate-signing-request.js +48 -0
  383. package/dist/factories/kubernetes/certificates/certificate-signing-request.js.map +1 -0
  384. package/dist/factories/kubernetes/certificates/index.d.ts +8 -0
  385. package/dist/factories/kubernetes/certificates/index.d.ts.map +1 -0
  386. package/dist/factories/kubernetes/certificates/index.js +8 -0
  387. package/dist/factories/kubernetes/certificates/index.js.map +1 -0
  388. package/dist/factories/kubernetes/config/config-map.d.ts +5 -0
  389. package/dist/factories/kubernetes/config/config-map.d.ts.map +1 -0
  390. package/dist/factories/kubernetes/config/config-map.js +16 -0
  391. package/dist/factories/kubernetes/config/config-map.js.map +1 -0
  392. package/dist/factories/kubernetes/config/index.d.ts +9 -0
  393. package/dist/factories/kubernetes/config/index.d.ts.map +1 -0
  394. package/dist/factories/kubernetes/config/index.js +9 -0
  395. package/dist/factories/kubernetes/config/index.js.map +1 -0
  396. package/dist/factories/kubernetes/config/secret.d.ts +5 -0
  397. package/dist/factories/kubernetes/config/secret.d.ts.map +1 -0
  398. package/dist/factories/kubernetes/config/secret.js +16 -0
  399. package/dist/factories/kubernetes/config/secret.js.map +1 -0
  400. package/dist/factories/kubernetes/coordination/index.d.ts +8 -0
  401. package/dist/factories/kubernetes/coordination/index.d.ts.map +1 -0
  402. package/dist/factories/kubernetes/coordination/index.js +8 -0
  403. package/dist/factories/kubernetes/coordination/index.js.map +1 -0
  404. package/dist/factories/kubernetes/coordination/lease.d.ts +5 -0
  405. package/dist/factories/kubernetes/coordination/lease.d.ts.map +1 -0
  406. package/dist/factories/kubernetes/coordination/lease.js +10 -0
  407. package/dist/factories/kubernetes/coordination/lease.js.map +1 -0
  408. package/dist/factories/kubernetes/core/component-status.d.ts +4 -0
  409. package/dist/factories/kubernetes/core/component-status.d.ts.map +1 -0
  410. package/dist/factories/kubernetes/core/component-status.js +25 -0
  411. package/dist/factories/kubernetes/core/component-status.js.map +1 -0
  412. package/dist/factories/kubernetes/core/index.d.ts +11 -0
  413. package/dist/factories/kubernetes/core/index.d.ts.map +1 -0
  414. package/dist/factories/kubernetes/core/index.js +11 -0
  415. package/dist/factories/kubernetes/core/index.js.map +1 -0
  416. package/dist/factories/kubernetes/core/namespace.d.ts +9 -0
  417. package/dist/factories/kubernetes/core/namespace.d.ts.map +1 -0
  418. package/dist/factories/kubernetes/core/namespace.js +48 -0
  419. package/dist/factories/kubernetes/core/namespace.js.map +1 -0
  420. package/dist/factories/kubernetes/core/node.d.ts +6 -0
  421. package/dist/factories/kubernetes/core/node.d.ts.map +1 -0
  422. package/dist/factories/kubernetes/core/node.js +34 -0
  423. package/dist/factories/kubernetes/core/node.js.map +1 -0
  424. package/dist/factories/kubernetes/core/pod.d.ts +6 -0
  425. package/dist/factories/kubernetes/core/pod.d.ts.map +1 -0
  426. package/dist/factories/kubernetes/core/pod.js +44 -0
  427. package/dist/factories/kubernetes/core/pod.js.map +1 -0
  428. package/dist/factories/kubernetes/extensions/custom-resource-definition.d.ts +6 -0
  429. package/dist/factories/kubernetes/extensions/custom-resource-definition.d.ts.map +1 -0
  430. package/dist/factories/kubernetes/extensions/custom-resource-definition.js +45 -0
  431. package/dist/factories/kubernetes/extensions/custom-resource-definition.js.map +1 -0
  432. package/dist/factories/kubernetes/extensions/custom-resource.d.ts +12 -0
  433. package/dist/factories/kubernetes/extensions/custom-resource.d.ts.map +1 -0
  434. package/dist/factories/kubernetes/extensions/custom-resource.js +17 -0
  435. package/dist/factories/kubernetes/extensions/custom-resource.js.map +1 -0
  436. package/dist/factories/kubernetes/extensions/index.d.ts +9 -0
  437. package/dist/factories/kubernetes/extensions/index.d.ts.map +1 -0
  438. package/dist/factories/kubernetes/extensions/index.js +9 -0
  439. package/dist/factories/kubernetes/extensions/index.js.map +1 -0
  440. package/dist/factories/kubernetes/index.d.ts +24 -0
  441. package/dist/factories/kubernetes/index.d.ts.map +1 -0
  442. package/dist/factories/kubernetes/index.js +75 -0
  443. package/dist/factories/kubernetes/index.js.map +1 -0
  444. package/dist/factories/kubernetes/networking/endpoint-slice.d.ts +4 -0
  445. package/dist/factories/kubernetes/networking/endpoint-slice.d.ts.map +1 -0
  446. package/dist/factories/kubernetes/networking/endpoint-slice.js +10 -0
  447. package/dist/factories/kubernetes/networking/endpoint-slice.js.map +1 -0
  448. package/dist/factories/kubernetes/networking/endpoints.d.ts +4 -0
  449. package/dist/factories/kubernetes/networking/endpoints.d.ts.map +1 -0
  450. package/dist/factories/kubernetes/networking/endpoints.js +39 -0
  451. package/dist/factories/kubernetes/networking/endpoints.js.map +1 -0
  452. package/dist/factories/kubernetes/networking/index.d.ts +13 -0
  453. package/dist/factories/kubernetes/networking/index.d.ts.map +1 -0
  454. package/dist/factories/kubernetes/networking/index.js +13 -0
  455. package/dist/factories/kubernetes/networking/index.js.map +1 -0
  456. package/dist/factories/kubernetes/networking/ingress-class.d.ts +5 -0
  457. package/dist/factories/kubernetes/networking/ingress-class.d.ts.map +1 -0
  458. package/dist/factories/kubernetes/networking/ingress-class.js +16 -0
  459. package/dist/factories/kubernetes/networking/ingress-class.js.map +1 -0
  460. package/dist/factories/kubernetes/networking/ingress.d.ts +5 -0
  461. package/dist/factories/kubernetes/networking/ingress.d.ts.map +1 -0
  462. package/dist/factories/kubernetes/networking/ingress.js +33 -0
  463. package/dist/factories/kubernetes/networking/ingress.js.map +1 -0
  464. package/dist/factories/kubernetes/networking/network-policy.d.ts +5 -0
  465. package/dist/factories/kubernetes/networking/network-policy.d.ts.map +1 -0
  466. package/dist/factories/kubernetes/networking/network-policy.js +17 -0
  467. package/dist/factories/kubernetes/networking/network-policy.js.map +1 -0
  468. package/dist/factories/kubernetes/networking/service.d.ts +5 -0
  469. package/dist/factories/kubernetes/networking/service.d.ts.map +1 -0
  470. package/dist/factories/kubernetes/networking/service.js +64 -0
  471. package/dist/factories/kubernetes/networking/service.js.map +1 -0
  472. package/dist/factories/kubernetes/policy/index.d.ts +10 -0
  473. package/dist/factories/kubernetes/policy/index.d.ts.map +1 -0
  474. package/dist/factories/kubernetes/policy/index.js +10 -0
  475. package/dist/factories/kubernetes/policy/index.js.map +1 -0
  476. package/dist/factories/kubernetes/policy/limit-range.d.ts +5 -0
  477. package/dist/factories/kubernetes/policy/limit-range.d.ts.map +1 -0
  478. package/dist/factories/kubernetes/policy/limit-range.js +17 -0
  479. package/dist/factories/kubernetes/policy/limit-range.js.map +1 -0
  480. package/dist/factories/kubernetes/policy/pod-disruption-budget.d.ts +6 -0
  481. package/dist/factories/kubernetes/policy/pod-disruption-budget.d.ts.map +1 -0
  482. package/dist/factories/kubernetes/policy/pod-disruption-budget.js +55 -0
  483. package/dist/factories/kubernetes/policy/pod-disruption-budget.js.map +1 -0
  484. package/dist/factories/kubernetes/policy/resource-quota.d.ts +6 -0
  485. package/dist/factories/kubernetes/policy/resource-quota.d.ts.map +1 -0
  486. package/dist/factories/kubernetes/policy/resource-quota.js +43 -0
  487. package/dist/factories/kubernetes/policy/resource-quota.js.map +1 -0
  488. package/dist/factories/kubernetes/rbac/cluster-role-binding.d.ts +4 -0
  489. package/dist/factories/kubernetes/rbac/cluster-role-binding.d.ts.map +1 -0
  490. package/dist/factories/kubernetes/rbac/cluster-role-binding.js +17 -0
  491. package/dist/factories/kubernetes/rbac/cluster-role-binding.js.map +1 -0
  492. package/dist/factories/kubernetes/rbac/cluster-role.d.ts +4 -0
  493. package/dist/factories/kubernetes/rbac/cluster-role.d.ts.map +1 -0
  494. package/dist/factories/kubernetes/rbac/cluster-role.js +17 -0
  495. package/dist/factories/kubernetes/rbac/cluster-role.js.map +1 -0
  496. package/dist/factories/kubernetes/rbac/index.d.ts +12 -0
  497. package/dist/factories/kubernetes/rbac/index.d.ts.map +1 -0
  498. package/dist/factories/kubernetes/rbac/index.js +12 -0
  499. package/dist/factories/kubernetes/rbac/index.js.map +1 -0
  500. package/dist/factories/kubernetes/rbac/role-binding.d.ts +4 -0
  501. package/dist/factories/kubernetes/rbac/role-binding.d.ts.map +1 -0
  502. package/dist/factories/kubernetes/rbac/role-binding.js +17 -0
  503. package/dist/factories/kubernetes/rbac/role-binding.js.map +1 -0
  504. package/dist/factories/kubernetes/rbac/role.d.ts +4 -0
  505. package/dist/factories/kubernetes/rbac/role.d.ts.map +1 -0
  506. package/dist/factories/kubernetes/rbac/role.js +17 -0
  507. package/dist/factories/kubernetes/rbac/role.js.map +1 -0
  508. package/dist/factories/kubernetes/rbac/service-account.d.ts +4 -0
  509. package/dist/factories/kubernetes/rbac/service-account.d.ts.map +1 -0
  510. package/dist/factories/kubernetes/rbac/service-account.js +17 -0
  511. package/dist/factories/kubernetes/rbac/service-account.js.map +1 -0
  512. package/dist/factories/kubernetes/scheduling/index.d.ts +9 -0
  513. package/dist/factories/kubernetes/scheduling/index.d.ts.map +1 -0
  514. package/dist/factories/kubernetes/scheduling/index.js +9 -0
  515. package/dist/factories/kubernetes/scheduling/index.js.map +1 -0
  516. package/dist/factories/kubernetes/scheduling/priority-class.d.ts +4 -0
  517. package/dist/factories/kubernetes/scheduling/priority-class.d.ts.map +1 -0
  518. package/dist/factories/kubernetes/scheduling/priority-class.js +16 -0
  519. package/dist/factories/kubernetes/scheduling/priority-class.js.map +1 -0
  520. package/dist/factories/kubernetes/scheduling/runtime-class.d.ts +5 -0
  521. package/dist/factories/kubernetes/scheduling/runtime-class.d.ts.map +1 -0
  522. package/dist/factories/kubernetes/scheduling/runtime-class.js +10 -0
  523. package/dist/factories/kubernetes/scheduling/runtime-class.js.map +1 -0
  524. package/dist/factories/kubernetes/storage/csi-driver.d.ts +5 -0
  525. package/dist/factories/kubernetes/storage/csi-driver.d.ts.map +1 -0
  526. package/dist/factories/kubernetes/storage/csi-driver.js +16 -0
  527. package/dist/factories/kubernetes/storage/csi-driver.js.map +1 -0
  528. package/dist/factories/kubernetes/storage/csi-node.d.ts +5 -0
  529. package/dist/factories/kubernetes/storage/csi-node.d.ts.map +1 -0
  530. package/dist/factories/kubernetes/storage/csi-node.js +10 -0
  531. package/dist/factories/kubernetes/storage/csi-node.js.map +1 -0
  532. package/dist/factories/kubernetes/storage/index.d.ts +13 -0
  533. package/dist/factories/kubernetes/storage/index.d.ts.map +1 -0
  534. package/dist/factories/kubernetes/storage/index.js +13 -0
  535. package/dist/factories/kubernetes/storage/index.js.map +1 -0
  536. package/dist/factories/kubernetes/storage/persistent-volume-claim.d.ts +6 -0
  537. package/dist/factories/kubernetes/storage/persistent-volume-claim.d.ts.map +1 -0
  538. package/dist/factories/kubernetes/storage/persistent-volume-claim.js +30 -0
  539. package/dist/factories/kubernetes/storage/persistent-volume-claim.js.map +1 -0
  540. package/dist/factories/kubernetes/storage/persistent-volume.d.ts +6 -0
  541. package/dist/factories/kubernetes/storage/persistent-volume.d.ts.map +1 -0
  542. package/dist/factories/kubernetes/storage/persistent-volume.js +47 -0
  543. package/dist/factories/kubernetes/storage/persistent-volume.js.map +1 -0
  544. package/dist/factories/kubernetes/storage/storage-class.d.ts +4 -0
  545. package/dist/factories/kubernetes/storage/storage-class.d.ts.map +1 -0
  546. package/dist/factories/kubernetes/storage/storage-class.js +17 -0
  547. package/dist/factories/kubernetes/storage/storage-class.js.map +1 -0
  548. package/dist/factories/kubernetes/storage/volume-attachment.d.ts +6 -0
  549. package/dist/factories/kubernetes/storage/volume-attachment.d.ts.map +1 -0
  550. package/dist/factories/kubernetes/storage/volume-attachment.js +10 -0
  551. package/dist/factories/kubernetes/storage/volume-attachment.js.map +1 -0
  552. package/dist/factories/kubernetes/types.d.ts +8 -0
  553. package/dist/factories/kubernetes/types.d.ts.map +1 -0
  554. package/dist/factories/kubernetes/types.js +8 -0
  555. package/dist/factories/kubernetes/types.js.map +1 -0
  556. package/dist/factories/kubernetes/workloads/cron-job.d.ts +6 -0
  557. package/dist/factories/kubernetes/workloads/cron-job.d.ts.map +1 -0
  558. package/dist/factories/kubernetes/workloads/cron-job.js +53 -0
  559. package/dist/factories/kubernetes/workloads/cron-job.js.map +1 -0
  560. package/dist/factories/kubernetes/workloads/daemon-set.d.ts +6 -0
  561. package/dist/factories/kubernetes/workloads/daemon-set.d.ts.map +1 -0
  562. package/dist/factories/kubernetes/workloads/daemon-set.js +32 -0
  563. package/dist/factories/kubernetes/workloads/daemon-set.js.map +1 -0
  564. package/dist/factories/kubernetes/workloads/deployment.d.ts +5 -0
  565. package/dist/factories/kubernetes/workloads/deployment.d.ts.map +1 -0
  566. package/dist/factories/kubernetes/workloads/deployment.js +59 -0
  567. package/dist/factories/kubernetes/workloads/deployment.js.map +1 -0
  568. package/dist/factories/kubernetes/workloads/index.d.ts +14 -0
  569. package/dist/factories/kubernetes/workloads/index.d.ts.map +1 -0
  570. package/dist/factories/kubernetes/workloads/index.js +14 -0
  571. package/dist/factories/kubernetes/workloads/index.js.map +1 -0
  572. package/dist/factories/kubernetes/workloads/job.d.ts +6 -0
  573. package/dist/factories/kubernetes/workloads/job.d.ts.map +1 -0
  574. package/dist/factories/kubernetes/workloads/job.js +105 -0
  575. package/dist/factories/kubernetes/workloads/job.js.map +1 -0
  576. package/dist/factories/kubernetes/workloads/replica-set.d.ts +6 -0
  577. package/dist/factories/kubernetes/workloads/replica-set.d.ts.map +1 -0
  578. package/dist/factories/kubernetes/workloads/replica-set.js +33 -0
  579. package/dist/factories/kubernetes/workloads/replica-set.js.map +1 -0
  580. package/dist/factories/kubernetes/workloads/replication-controller.d.ts +6 -0
  581. package/dist/factories/kubernetes/workloads/replication-controller.d.ts.map +1 -0
  582. package/dist/factories/kubernetes/workloads/replication-controller.js +56 -0
  583. package/dist/factories/kubernetes/workloads/replication-controller.js.map +1 -0
  584. package/dist/factories/kubernetes/workloads/stateful-set.d.ts +6 -0
  585. package/dist/factories/kubernetes/workloads/stateful-set.d.ts.map +1 -0
  586. package/dist/factories/kubernetes/workloads/stateful-set.js +81 -0
  587. package/dist/factories/kubernetes/workloads/stateful-set.js.map +1 -0
  588. package/dist/factories/kubernetes/yaml/index.d.ts +6 -0
  589. package/dist/factories/kubernetes/yaml/index.d.ts.map +1 -0
  590. package/dist/factories/kubernetes/yaml/index.js +6 -0
  591. package/dist/factories/kubernetes/yaml/index.js.map +1 -0
  592. package/dist/factories/kubernetes/yaml/yaml-directory.d.ts +54 -0
  593. package/dist/factories/kubernetes/yaml/yaml-directory.d.ts.map +1 -0
  594. package/dist/factories/kubernetes/yaml/yaml-directory.js +178 -0
  595. package/dist/factories/kubernetes/yaml/yaml-directory.js.map +1 -0
  596. package/dist/factories/kubernetes/yaml/yaml-file.d.ts +54 -0
  597. package/dist/factories/kubernetes/yaml/yaml-file.d.ts.map +1 -0
  598. package/dist/factories/kubernetes/yaml/yaml-file.js +181 -0
  599. package/dist/factories/kubernetes/yaml/yaml-file.js.map +1 -0
  600. package/dist/factories/shared.d.ts +11 -0
  601. package/dist/factories/shared.d.ts.map +1 -0
  602. package/dist/factories/shared.js +364 -0
  603. package/dist/factories/shared.js.map +1 -0
  604. package/dist/index.d.ts +9 -0
  605. package/dist/index.d.ts.map +1 -0
  606. package/dist/index.js +49 -0
  607. package/dist/index.js.map +1 -0
  608. package/dist/utils/helpers.d.ts +69 -0
  609. package/dist/utils/helpers.d.ts.map +1 -0
  610. package/dist/utils/helpers.js +405 -0
  611. package/dist/utils/helpers.js.map +1 -0
  612. package/dist/utils/index.d.ts +9 -0
  613. package/dist/utils/index.d.ts.map +1 -0
  614. package/dist/utils/index.js +11 -0
  615. package/dist/utils/index.js.map +1 -0
  616. package/dist/utils/type-guards.d.ts +34 -0
  617. package/dist/utils/type-guards.d.ts.map +1 -0
  618. package/dist/utils/type-guards.js +66 -0
  619. package/dist/utils/type-guards.js.map +1 -0
  620. package/package.json +109 -0
@@ -0,0 +1,837 @@
1
+ /**
2
+ * KroResourceFactory implementation for Kro deployment mode
3
+ *
4
+ * This factory handles deployment via Kro ResourceGraphDefinitions,
5
+ * using the Kro controller for dependency resolution and resource management.
6
+ */
7
+ import * as k8s from '@kubernetes/client-node';
8
+ import { getComponentLogger } from '../logging/index.js';
9
+ import { createKubernetesClientProvider, createKubernetesClientProviderWithKubeConfig } from '../kubernetes/client-provider.js';
10
+ import { createSchemaProxy } from '../references/index.js';
11
+ import { generateKroSchemaFromArktype } from '../serialization/schema.js';
12
+ import { serializeResourceGraphToYaml } from '../serialization/yaml.js';
13
+ import { DirectDeploymentEngine } from './engine.js';
14
+ import { DeploymentMode } from '../references/index.js';
15
+ import { resourceGraphDefinition } from '../../factories/kro/resource-graph-definition.js';
16
+ import { kroCustomResourceDefinition } from '../../factories/kro/kro-crd.js';
17
+ import { kroCustomResource } from '../../factories/kro/kro-custom-resource.js';
18
+ import { ensureResourceTypeRegistered, KroTypeKroDeployer, createAlchemyResourceId } from '../../alchemy/deployment.js';
19
+ import { isKubernetesRef } from '../dependencies/type-guards.js';
20
+ /**
21
+ * KroResourceFactory implementation
22
+ *
23
+ * Handles deployment via Kro ResourceGraphDefinitions. The RGD is deployed once,
24
+ * and then instances are created as custom resources that the Kro controller processes.
25
+ */
26
+ export class KroResourceFactoryImpl {
27
+ mode = 'kro';
28
+ name;
29
+ namespace;
30
+ isAlchemyManaged;
31
+ rgdName;
32
+ schema;
33
+ resources;
34
+ closures;
35
+ schemaDefinition;
36
+ statusMappings;
37
+ alchemyScope;
38
+ factoryOptions;
39
+ logger = getComponentLogger('kro-factory');
40
+ clientProvider;
41
+ constructor(name, resources, schemaDefinition, statusMappings, options = {}) {
42
+ this.name = name;
43
+ this.namespace = options.namespace || 'default';
44
+ this.alchemyScope = options.alchemyScope;
45
+ this.isAlchemyManaged = !!options.alchemyScope;
46
+ this.rgdName = this.convertToKubernetesName(name); // Convert to valid Kubernetes resource name
47
+ this.resources = resources;
48
+ this.closures = options.closures || {};
49
+ this.schemaDefinition = schemaDefinition;
50
+ this.statusMappings = statusMappings;
51
+ this.factoryOptions = options;
52
+ this.schema = createSchemaProxy();
53
+ // Validate closures for Kro mode - detect KubernetesRef inputs and raise clear errors
54
+ this.validateClosuresForKroMode();
55
+ // Don't initialize client provider in constructor - do it lazily when needed
56
+ // This allows tests to create factories without requiring a kubeconfig
57
+ }
58
+ /**
59
+ * Validate closures for Kro mode compatibility
60
+ * Kro mode only supports static values - no dynamic references (KubernetesRef)
61
+ */
62
+ validateClosuresForKroMode() {
63
+ if (Object.keys(this.closures).length === 0) {
64
+ return; // No closures to validate
65
+ }
66
+ // For Kro mode, we need to validate that closures don't contain dynamic references
67
+ // This is a static analysis - we can't execute the closures to check their arguments
68
+ // Instead, we'll validate when closures are executed during deployment
69
+ this.logger.debug('Kro factory initialized with closures', {
70
+ closureCount: Object.keys(this.closures).length,
71
+ closureNames: Object.keys(this.closures)
72
+ });
73
+ }
74
+ /**
75
+ * Validate closure arguments for Kro mode compatibility
76
+ * This is called during deployment when we have access to the actual arguments
77
+ */
78
+ validateClosureArgumentsForKroMode(closureName, config) {
79
+ const errors = [];
80
+ // Recursively check for KubernetesRef objects in the closure configuration
81
+ const checkForKubernetesRefs = (obj, path = '') => {
82
+ if (isKubernetesRef(obj)) {
83
+ errors.push(`Found KubernetesRef at ${path || 'root'}`);
84
+ return;
85
+ }
86
+ if (obj && typeof obj === 'object' && !Array.isArray(obj)) {
87
+ for (const [key, value] of Object.entries(obj)) {
88
+ const newPath = path ? `${path}.${key}` : key;
89
+ checkForKubernetesRefs(value, newPath);
90
+ }
91
+ }
92
+ else if (Array.isArray(obj)) {
93
+ obj.forEach((item, index) => {
94
+ const newPath = path ? `${path}[${index}]` : `[${index}]`;
95
+ checkForKubernetesRefs(item, newPath);
96
+ });
97
+ }
98
+ };
99
+ checkForKubernetesRefs(config);
100
+ if (errors.length > 0) {
101
+ const errorMessage = [
102
+ `Kro mode does not support dynamic references in YAML closures.`,
103
+ `Found KubernetesRef in closure '${closureName}':`,
104
+ ...errors.map(error => ` - ${error}`),
105
+ ``,
106
+ `Kro mode limitations:`,
107
+ ` - YAML closures must use static values only`,
108
+ ` - Dynamic references (schema.spec.*, resource.status.*) are not supported`,
109
+ ` - Use static strings, numbers, and objects instead`,
110
+ ``,
111
+ `Solutions:`,
112
+ ` 1. Use static values: namespace: 'my-namespace' instead of namespace: schema.spec.namespace`,
113
+ ` 2. Switch to Direct mode: await graph.factory('direct', options)`,
114
+ ` 3. Move dynamic logic to Enhanced<> resources instead of closures`,
115
+ ``,
116
+ `Example of Kro-compatible closure:`,
117
+ ` yamlFile({`,
118
+ ` name: 'static-config',`,
119
+ ` path: 'git:github.com/org/repo/config.yaml@main',`,
120
+ ` namespace: 'kro-system' // Static string - OK`,
121
+ ` })`,
122
+ ].join('\n');
123
+ throw new Error(errorMessage);
124
+ }
125
+ }
126
+ /**
127
+ * Convert camelCase resource graph name to valid Kubernetes resource name (kebab-case)
128
+ */
129
+ convertToKubernetesName(name) {
130
+ // Validate input name
131
+ if (!name || typeof name !== 'string') {
132
+ throw new Error(`Invalid resource graph name: ${JSON.stringify(name)}. Resource graph name must be a non-empty string.`);
133
+ }
134
+ const trimmedName = name.trim();
135
+ if (trimmedName.length === 0) {
136
+ throw new Error(`Invalid resource graph name: Resource graph name cannot be empty or whitespace-only.`);
137
+ }
138
+ // Convert to kebab-case and validate result
139
+ const kubernetesName = trimmedName
140
+ .replace(/([a-z])([A-Z])/g, '$1-$2') // Insert dash before capital letters
141
+ .toLowerCase(); // Convert to lowercase
142
+ // Validate Kubernetes naming conventions
143
+ if (!/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/.test(kubernetesName)) {
144
+ throw new Error(`Invalid resource graph name: "${name}" converts to "${kubernetesName}" which is not a valid Kubernetes resource name. Names must consist of lowercase alphanumeric characters or '-', and must start and end with an alphanumeric character.`);
145
+ }
146
+ if (kubernetesName.length > 253) {
147
+ throw new Error(`Invalid resource graph name: "${name}" converts to "${kubernetesName}" which exceeds the 253 character limit for Kubernetes resource names.`);
148
+ }
149
+ return kubernetesName;
150
+ }
151
+ /**
152
+ * Get or create the Kubernetes client provider (lazy initialization)
153
+ */
154
+ getClientProvider() {
155
+ if (!this.clientProvider) {
156
+ this.clientProvider = this.createClientProvider(this.factoryOptions);
157
+ }
158
+ return this.clientProvider;
159
+ }
160
+ /**
161
+ * Create and configure the Kubernetes client provider
162
+ */
163
+ createClientProvider(options) {
164
+ // If a pre-configured kubeConfig is provided, use it directly
165
+ if (options.kubeConfig) {
166
+ this.logger.debug('Using pre-configured KubeConfig from factory options');
167
+ return createKubernetesClientProviderWithKubeConfig(options.kubeConfig);
168
+ }
169
+ // Create client provider with configuration from factory options
170
+ const clientConfig = {
171
+ ...(options.skipTLSVerify !== undefined && { skipTLSVerify: options.skipTLSVerify }),
172
+ // Add other configuration options as needed
173
+ };
174
+ this.logger.debug('Creating new KubernetesClientProvider with configuration', {
175
+ skipTLSVerify: clientConfig.skipTLSVerify,
176
+ });
177
+ return createKubernetesClientProvider(clientConfig);
178
+ }
179
+ /**
180
+ * Get the Kubernetes config from the centralized provider
181
+ */
182
+ getKubeConfig() {
183
+ const clientProvider = this.getClientProvider();
184
+ return clientProvider.getKubeConfig();
185
+ }
186
+ /**
187
+ * Deploy a new instance by creating a custom resource
188
+ */
189
+ async deploy(spec) {
190
+ // Validate spec against ArkType schema
191
+ const validationResult = this.schemaDefinition.spec(spec);
192
+ if (validationResult instanceof Error) {
193
+ throw new Error(`Invalid spec: ${validationResult.message}`);
194
+ }
195
+ // Execute closures before RGD creation (Kro mode requirement)
196
+ await this.executeClosuresBeforeRGD(spec);
197
+ if (this.isAlchemyManaged) {
198
+ return this.deployWithAlchemy(spec);
199
+ }
200
+ else {
201
+ return this.deployDirect(spec);
202
+ }
203
+ }
204
+ /**
205
+ * Execute closures before RGD creation (Kro mode requirement)
206
+ * Closures must execute before ResourceGraphDefinition is created
207
+ */
208
+ async executeClosuresBeforeRGD(spec) {
209
+ if (Object.keys(this.closures).length === 0) {
210
+ return []; // No closures to execute
211
+ }
212
+ this.logger.info('Executing closures before RGD creation', {
213
+ closureCount: Object.keys(this.closures).length
214
+ });
215
+ // First, validate all closures before creating any API clients
216
+ // The closures returned by the resource builder are deployment closures that expect a DeploymentContext
217
+ // We need to execute them with a mock context to trigger validation
218
+ const mockDeploymentContext = {
219
+ kubernetesApi: null, // Not needed for validation
220
+ namespace: this.namespace,
221
+ deployedResources: new Map(),
222
+ resolveReference: async (ref) => {
223
+ throw new Error(`Kro mode does not support dynamic reference resolution. Found reference: ${ref.resourceId}.${ref.fieldPath}`);
224
+ }
225
+ };
226
+ for (const [closureName, closure] of Object.entries(this.closures)) {
227
+ try {
228
+ // Execute the deployment closure with mock context to trigger validation
229
+ await closure(mockDeploymentContext);
230
+ }
231
+ catch (error) {
232
+ // If validation fails, throw the validation error immediately
233
+ if (error instanceof Error && error.message.includes('Kro mode does not support dynamic reference resolution')) {
234
+ throw error;
235
+ }
236
+ // For other errors, wrap them with context
237
+ throw new Error(`Failed to validate closure '${closureName}': ${error}`);
238
+ }
239
+ }
240
+ const allResults = [];
241
+ // Only create deployment context after validation passes
242
+ const deploymentContext = {
243
+ kubernetesApi: this.getKubeConfig().makeApiClient(k8s.KubernetesObjectApi),
244
+ ...(this.alchemyScope && { alchemyScope: this.alchemyScope }),
245
+ namespace: this.namespace,
246
+ deployedResources: new Map(), // Empty for pre-RGD execution
247
+ resolveReference: async (ref) => {
248
+ throw new Error(`Kro mode does not support dynamic reference resolution. Found reference: ${ref.resourceId}.${ref.fieldPath}`);
249
+ }
250
+ };
251
+ // Execute closures sequentially to maintain order
252
+ for (const [closureName, closure] of Object.entries(this.closures)) {
253
+ try {
254
+ this.logger.debug('Executing closure', { name: closureName });
255
+ // Note: We can't validate closure arguments here because we don't have access to them
256
+ // The validation happens inside the closure when it processes its config
257
+ // This is a limitation of the closure pattern, but the error messages will be clear
258
+ const results = await closure(deploymentContext);
259
+ allResults.push(...results);
260
+ this.logger.info('Closure executed successfully', {
261
+ name: closureName,
262
+ resourceCount: results.length
263
+ });
264
+ }
265
+ catch (error) {
266
+ // Check if this is a KubernetesRef validation error and enhance it
267
+ if (error instanceof Error && error.message.includes('KubernetesRef')) {
268
+ this.logger.error('Closure validation failed - dynamic references not supported in Kro mode', {
269
+ name: closureName,
270
+ message: error.message
271
+ });
272
+ throw error; // Re-throw with original detailed message
273
+ }
274
+ this.logger.error('Closure execution failed', { name: closureName, message: error instanceof Error ? error.message : String(error) });
275
+ throw new Error(`Failed to execute closure '${closureName}': ${error instanceof Error ? error.message : String(error)}`);
276
+ }
277
+ }
278
+ this.logger.info('All closures executed successfully', {
279
+ totalResources: allResults.length
280
+ });
281
+ return allResults;
282
+ }
283
+ /**
284
+ * Deploy directly to Kubernetes using DirectDeploymentEngine
285
+ */
286
+ async deployDirect(spec) {
287
+ // Ensure RGD is deployed first
288
+ await this.ensureRGDDeployed();
289
+ // Create DirectDeploymentEngine with KRO mode for CEL string conversion
290
+ const deploymentEngine = new DirectDeploymentEngine(this.getKubeConfig(), undefined, undefined, DeploymentMode.KRO);
291
+ // Create custom resource instance
292
+ const instanceName = this.generateInstanceName(spec);
293
+ const customResourceData = this.createCustomResourceInstance(instanceName, spec);
294
+ // Wrap with kroCustomResource factory to get Enhanced object with readiness evaluation
295
+ const enhancedCustomResource = kroCustomResource({
296
+ apiVersion: customResourceData.apiVersion,
297
+ kind: customResourceData.kind,
298
+ metadata: {
299
+ name: customResourceData.metadata.name,
300
+ namespace: customResourceData.metadata.namespace,
301
+ },
302
+ spec: customResourceData.spec,
303
+ });
304
+ // Deploy using DirectDeploymentEngine with built-in waitForReady logic
305
+ const deployableResource = {
306
+ ...enhancedCustomResource,
307
+ id: instanceName,
308
+ metadata: {
309
+ ...enhancedCustomResource.metadata,
310
+ name: instanceName,
311
+ namespace: this.namespace,
312
+ },
313
+ spec: customResourceData.spec, // Use spec directly from customResourceData to ensure it's preserved
314
+ };
315
+ // Preserve the readiness evaluator (non-enumerable property)
316
+ const readinessEvaluator = enhancedCustomResource.readinessEvaluator;
317
+ if (readinessEvaluator) {
318
+ Object.defineProperty(deployableResource, 'readinessEvaluator', {
319
+ value: readinessEvaluator,
320
+ enumerable: false,
321
+ configurable: false,
322
+ writable: false
323
+ });
324
+ }
325
+ // Deploy without waiting for readiness - we'll handle that ourselves
326
+ const _deployedResource = await deploymentEngine.deployResource(deployableResource, {
327
+ mode: 'kro',
328
+ namespace: this.namespace,
329
+ waitForReady: false, // We'll handle Kro-specific readiness ourselves
330
+ timeout: this.factoryOptions.timeout || 300000,
331
+ });
332
+ // Handle Kro-specific readiness checking if requested
333
+ if (this.factoryOptions.waitForReady ?? true) {
334
+ await this.waitForKroInstanceReady(instanceName, this.factoryOptions.timeout || 600000); // 10 minutes
335
+ }
336
+ // Create Enhanced proxy for the deployed instance
337
+ return await this.createEnhancedProxy(spec, instanceName);
338
+ }
339
+ /**
340
+ * Deploy using type-safe alchemy resource wrapping
341
+ *
342
+ * In alchemy mode, the RGD gets one typed alchemy Resource and each instance gets another
343
+ */
344
+ async deployWithAlchemy(spec) {
345
+ if (!this.alchemyScope) {
346
+ throw new Error('Alchemy scope is required for alchemy deployment');
347
+ }
348
+ // Use static registration functions
349
+ // Create deployer instance using DirectDeploymentEngine with KRO mode
350
+ const kroEngine = new DirectDeploymentEngine(this.getKubeConfig(), undefined, undefined, DeploymentMode.KRO);
351
+ const deployer = new KroTypeKroDeployer(kroEngine);
352
+ // 1. Ensure RGD is deployed via alchemy (once per factory)
353
+ const kroSchema = generateKroSchemaFromArktype(this.name, this.schemaDefinition, this.resources, this.statusMappings);
354
+ const rgdManifest = {
355
+ apiVersion: 'kro.run/v1alpha1',
356
+ kind: 'ResourceGraphDefinition',
357
+ metadata: {
358
+ name: this.rgdName,
359
+ namespace: this.namespace,
360
+ },
361
+ spec: {
362
+ schema: kroSchema,
363
+ resources: Object.values(this.resources).map(resource => ({
364
+ id: resource.id || resource.metadata?.name || 'unknown',
365
+ template: resource,
366
+ })),
367
+ },
368
+ };
369
+ // Register RGD type dynamically
370
+ const rgdEnhanced = resourceGraphDefinition(rgdManifest);
371
+ const RGDProvider = ensureResourceTypeRegistered(rgdEnhanced);
372
+ const rgdId = createAlchemyResourceId(rgdEnhanced, this.namespace);
373
+ await RGDProvider(rgdId, {
374
+ resource: rgdEnhanced,
375
+ namespace: this.namespace,
376
+ deployer: deployer,
377
+ options: {
378
+ waitForReady: true,
379
+ timeout: 60000, // RGD should be ready quickly
380
+ },
381
+ });
382
+ // 2. Create instance via alchemy (once per deploy call)
383
+ const instanceName = this.generateInstanceName(spec);
384
+ const crdInstanceManifest = this.createCustomResourceInstance(instanceName, spec);
385
+ // Register CRD instance type dynamically
386
+ const CRDInstanceProvider = ensureResourceTypeRegistered(crdInstanceManifest);
387
+ const instanceId = createAlchemyResourceId(crdInstanceManifest, this.namespace);
388
+ await CRDInstanceProvider(instanceId, {
389
+ resource: crdInstanceManifest,
390
+ namespace: this.namespace,
391
+ deployer: deployer,
392
+ options: {
393
+ waitForReady: this.factoryOptions.waitForReady ?? true,
394
+ timeout: this.factoryOptions.timeout ?? 300000,
395
+ },
396
+ });
397
+ // Create Enhanced proxy for the deployed instance
398
+ return await this.createEnhancedProxy(spec, instanceName);
399
+ }
400
+ /**
401
+ * Get all deployed instances
402
+ */
403
+ async getInstances() {
404
+ const kubeConfig = this.getKubeConfig();
405
+ const customApi = kubeConfig.makeApiClient(k8s.CustomObjectsApi);
406
+ try {
407
+ // The schema definition should contain just the version part (e.g., 'v1alpha1')
408
+ // If it somehow contains the full API version, extract just the version part
409
+ const version = this.schemaDefinition.apiVersion.includes('/')
410
+ ? this.schemaDefinition.apiVersion.split('/')[1] || this.schemaDefinition.apiVersion
411
+ : this.schemaDefinition.apiVersion;
412
+ const listResponse = await customApi.listNamespacedCustomObject('kro.run', version, this.namespace, `${this.schemaDefinition.kind.toLowerCase()}s` // Pluralize the kind
413
+ );
414
+ const instances = listResponse.body.items || [];
415
+ return await Promise.all(instances.map(async (instance) => {
416
+ return await this.createEnhancedProxy(instance.spec, instance.metadata.name);
417
+ }));
418
+ }
419
+ catch (error) {
420
+ const k8sError = error;
421
+ // If the CRD doesn't exist yet or there are no instances, return empty array
422
+ if (k8sError.message?.includes('not found') ||
423
+ k8sError.message?.includes('404') ||
424
+ k8sError.body?.includes('not found') ||
425
+ k8sError.body?.includes('404') ||
426
+ k8sError.statusCode === 404 ||
427
+ String(error).includes('404') ||
428
+ String(error).includes('not found')) {
429
+ return [];
430
+ }
431
+ throw new Error(`Failed to list instances: ${k8sError.message || String(error)}`);
432
+ }
433
+ }
434
+ /**
435
+ * Delete a specific instance by name
436
+ */
437
+ async deleteInstance(name) {
438
+ const k8sApi = this.getKubeConfig().makeApiClient(k8s.KubernetesObjectApi);
439
+ const apiVersion = this.schemaDefinition.apiVersion.includes('/')
440
+ ? this.schemaDefinition.apiVersion
441
+ : `kro.run/${this.schemaDefinition.apiVersion}`;
442
+ try {
443
+ await k8sApi.delete({
444
+ apiVersion,
445
+ kind: this.schemaDefinition.kind,
446
+ metadata: {
447
+ name,
448
+ namespace: this.namespace,
449
+ },
450
+ });
451
+ }
452
+ catch (error) {
453
+ const k8sError = error;
454
+ if (k8sError.statusCode !== 404) {
455
+ throw new Error(`Failed to delete instance ${name}: ${k8sError.message || String(error)}`);
456
+ }
457
+ // Instance already deleted, ignore 404
458
+ }
459
+ }
460
+ /**
461
+ * Get factory status
462
+ */
463
+ async getStatus() {
464
+ const instances = await this.getInstances();
465
+ const rgdStatus = await this.getRGDStatus();
466
+ return {
467
+ name: this.name,
468
+ mode: this.mode,
469
+ isAlchemyManaged: this.isAlchemyManaged,
470
+ namespace: this.namespace,
471
+ instanceCount: instances.length,
472
+ health: rgdStatus.phase === 'ready' ? 'healthy' : 'degraded',
473
+ };
474
+ }
475
+ /**
476
+ * Get ResourceGraphDefinition status
477
+ */
478
+ async getRGDStatus() {
479
+ const k8sApi = this.getKubeConfig().makeApiClient(k8s.KubernetesObjectApi);
480
+ try {
481
+ const response = await k8sApi.read({
482
+ apiVersion: 'kro.run/v1alpha1',
483
+ kind: 'ResourceGraphDefinition',
484
+ metadata: {
485
+ name: this.rgdName,
486
+ namespace: this.namespace,
487
+ },
488
+ });
489
+ const rgd = response.body;
490
+ // Map Kro's state to our phase enum
491
+ let phase = 'pending';
492
+ if (rgd.status?.state === 'Active') {
493
+ phase = 'ready';
494
+ }
495
+ else if (rgd.status?.state === 'Inactive') {
496
+ // Check if it's failed or just pending
497
+ const hasFailedCondition = rgd.status?.conditions?.some(c => c.status === 'False');
498
+ phase = hasFailedCondition ? 'failed' : 'pending';
499
+ }
500
+ return {
501
+ name: this.rgdName,
502
+ phase,
503
+ conditions: rgd.status?.conditions || [],
504
+ observedGeneration: rgd.status?.observedGeneration || 0,
505
+ };
506
+ }
507
+ catch (error) {
508
+ const k8sError = error;
509
+ if (k8sError.statusCode === 404) {
510
+ return {
511
+ name: this.rgdName,
512
+ phase: 'pending',
513
+ conditions: [],
514
+ };
515
+ }
516
+ throw new Error(`Failed to get RGD status: ${k8sError.message || String(error)}`);
517
+ }
518
+ }
519
+ /**
520
+ * Implementation of overloaded toYaml method
521
+ */
522
+ toYaml(spec) {
523
+ if (spec) {
524
+ // Generate CRD instance YAML
525
+ const instanceName = this.generateInstanceName(spec);
526
+ const customResource = this.createCustomResourceInstance(instanceName, spec);
527
+ return `apiVersion: ${customResource.apiVersion}
528
+ kind: ${customResource.kind}
529
+ metadata:
530
+ name: ${customResource.metadata.name}
531
+ namespace: ${customResource.metadata.namespace}
532
+ spec:
533
+ ${Object.entries(spec).map(([key, value]) => ` ${key}: ${typeof value === 'string' ? `"${value}"` : value}`).join('\n')}`;
534
+ }
535
+ else {
536
+ // Generate RGD YAML
537
+ const kroSchema = generateKroSchemaFromArktype(this.name, this.schemaDefinition, this.resources, this.statusMappings);
538
+ return serializeResourceGraphToYaml(this.rgdName, this.resources, { namespace: this.namespace }, kroSchema);
539
+ }
540
+ }
541
+ /**
542
+ * Ensure the ResourceGraphDefinition is deployed using DirectDeploymentEngine
543
+ */
544
+ async ensureRGDDeployed() {
545
+ // Create DirectDeploymentEngine instance with KRO mode for CEL string generation
546
+ const deploymentEngine = new DirectDeploymentEngine(this.getKubeConfig(), undefined, undefined, DeploymentMode.KRO);
547
+ // Create the RGD using the same serialization logic as toYaml()
548
+ const kroSchema = generateKroSchemaFromArktype(this.name, this.schemaDefinition, this.resources, this.statusMappings);
549
+ const rgdYaml = serializeResourceGraphToYaml(this.rgdName, this.resources, { namespace: this.namespace }, kroSchema);
550
+ // Parse the YAML to get the RGD object
551
+ const rgdManifests = k8s.loadAllYaml(rgdYaml);
552
+ const rgdManifest = rgdManifests[0];
553
+ // Ensure the RGD has the required properties for deployment
554
+ const rgdWithMetadata = {
555
+ ...rgdManifest,
556
+ metadata: {
557
+ ...rgdManifest.metadata,
558
+ name: this.rgdName,
559
+ namespace: this.namespace,
560
+ }
561
+ };
562
+ // Create Enhanced RGD with readiness evaluator
563
+ const enhancedRGD = resourceGraphDefinition(rgdWithMetadata);
564
+ try {
565
+ // Deploy RGD using DirectDeploymentEngine with readiness checking
566
+ await deploymentEngine.deployResource(enhancedRGD, {
567
+ mode: 'direct',
568
+ namespace: this.namespace,
569
+ waitForReady: true,
570
+ timeout: this.factoryOptions.timeout || 60000,
571
+ });
572
+ // Wait for the CRD to be created by Kro using DirectDeploymentEngine
573
+ await this.waitForCRDReadyWithEngine(deploymentEngine);
574
+ }
575
+ catch (error) {
576
+ throw new Error(`Failed to deploy RGD using DirectDeploymentEngine: ${error instanceof Error ? error.message : String(error)}`);
577
+ }
578
+ }
579
+ /**
580
+ * Wait for the CRD to be created by Kro using DirectDeploymentEngine
581
+ */
582
+ async waitForCRDReadyWithEngine(deploymentEngine) {
583
+ const crdName = `${this.schemaDefinition.kind.toLowerCase()}s.kro.run`;
584
+ // Create Enhanced CRD for readiness checking
585
+ const crdManifest = {
586
+ apiVersion: 'apiextensions.k8s.io/v1',
587
+ kind: 'CustomResourceDefinition',
588
+ metadata: {
589
+ name: crdName,
590
+ // CRDs are cluster-scoped, so no namespace
591
+ },
592
+ };
593
+ const enhancedCRD = kroCustomResourceDefinition(crdManifest);
594
+ // Use DirectDeploymentEngine to wait for CRD readiness
595
+ const deployedCRD = {
596
+ id: crdName,
597
+ kind: 'CustomResourceDefinition',
598
+ name: crdName,
599
+ namespace: '', // CRDs are cluster-scoped
600
+ manifest: enhancedCRD,
601
+ status: 'deployed',
602
+ deployedAt: new Date(),
603
+ };
604
+ // This will use the custom readiness evaluator from kroCustomResourceDefinition()
605
+ await deploymentEngine.waitForResourceReadiness(deployedCRD, {
606
+ mode: 'direct',
607
+ namespace: '', // CRDs are cluster-scoped
608
+ timeout: this.factoryOptions.timeout || 60000,
609
+ });
610
+ }
611
+ /**
612
+ * Separate static and dynamic status fields
613
+ */
614
+ async separateStatusFields() {
615
+ if (!this.statusMappings) {
616
+ return { staticFields: {}, dynamicFields: {} };
617
+ }
618
+ // Use dynamic import to avoid circular dependencies
619
+ const { separateStatusFields } = await import('../validation/cel-validator.js');
620
+ return separateStatusFields(this.statusMappings);
621
+ }
622
+ /**
623
+ * Generate instance name from spec
624
+ */
625
+ generateInstanceName(spec) {
626
+ // Try to extract name from spec - check common name fields
627
+ if (typeof spec === 'object' && spec !== null) {
628
+ const specObj = spec;
629
+ // Check for common name fields in order of preference
630
+ for (const nameField of ['name', 'appName', 'serviceName', 'resourceName']) {
631
+ if (nameField in specObj && specObj[nameField]) {
632
+ return String(specObj[nameField]);
633
+ }
634
+ }
635
+ }
636
+ // Generate a unique name
637
+ return `${this.name}-${Date.now()}`;
638
+ }
639
+ /**
640
+ * Create custom resource instance
641
+ */
642
+ createCustomResourceInstance(instanceName, spec) {
643
+ // The schema definition contains just the version part (e.g., 'v1alpha1')
644
+ // We need to construct the full API version for the instance (e.g., 'kro.run/v1alpha1')
645
+ const apiVersion = this.schemaDefinition.apiVersion.includes('/')
646
+ ? this.schemaDefinition.apiVersion // Already has group prefix
647
+ : `kro.run/${this.schemaDefinition.apiVersion}`; // Add kro.run group
648
+ return {
649
+ apiVersion,
650
+ kind: this.schemaDefinition.kind,
651
+ metadata: {
652
+ name: instanceName,
653
+ namespace: this.namespace,
654
+ },
655
+ spec,
656
+ };
657
+ }
658
+ /**
659
+ * Create an Enhanced proxy for the instance with mixed static/dynamic hydration
660
+ */
661
+ async createEnhancedProxyWithMixedHydration(spec, instanceName) {
662
+ const hydrationLogger = this.logger.child({ instanceName });
663
+ // Separate static and dynamic status fields
664
+ const { staticFields, dynamicFields } = await this.separateStatusFields();
665
+ // Start with static fields as the base status
666
+ const status = { ...staticFields };
667
+ // Create the initial Enhanced proxy
668
+ // The Enhanced proxy should represent the actual instance, which uses the full API version
669
+ const instanceApiVersion = this.schemaDefinition.apiVersion.includes('/')
670
+ ? this.schemaDefinition.apiVersion
671
+ : `kro.run/${this.schemaDefinition.apiVersion}`;
672
+ const enhancedProxy = {
673
+ apiVersion: instanceApiVersion,
674
+ kind: this.schemaDefinition.kind,
675
+ spec,
676
+ status,
677
+ metadata: {
678
+ name: instanceName,
679
+ namespace: this.namespace,
680
+ labels: {
681
+ 'typekro.io/factory': this.name,
682
+ 'typekro.io/mode': this.mode,
683
+ 'typekro.io/rgd': this.rgdName,
684
+ },
685
+ annotations: {
686
+ 'typekro.io/deployed-at': new Date().toISOString(),
687
+ 'typekro.io/api-version': instanceApiVersion,
688
+ 'typekro.io/kind': this.schemaDefinition.kind,
689
+ },
690
+ },
691
+ };
692
+ // Hydrate dynamic status fields if enabled and there are dynamic fields
693
+ if (this.factoryOptions.hydrateStatus !== false && Object.keys(dynamicFields).length > 0) {
694
+ try {
695
+ const hydratedDynamicFields = await this.hydrateDynamicStatusFields(instanceName, dynamicFields);
696
+ // Merge dynamic fields with static fields
697
+ // Dynamic fields from Kro take precedence over static fields with same names
698
+ const mergedStatus = {
699
+ ...staticFields, // Static fields first
700
+ ...hydratedDynamicFields, // Dynamic fields from Kro override
701
+ };
702
+ // Update the status using object assignment to avoid type issues
703
+ Object.assign(enhancedProxy.status, mergedStatus);
704
+ }
705
+ catch (error) {
706
+ hydrationLogger.warn('Dynamic status hydration failed', error);
707
+ // Continue with static fields only if dynamic hydration fails
708
+ }
709
+ }
710
+ return enhancedProxy;
711
+ }
712
+ /**
713
+ * Create an Enhanced proxy for the instance (backward compatibility method)
714
+ */
715
+ async createEnhancedProxy(spec, instanceName) {
716
+ return this.createEnhancedProxyWithMixedHydration(spec, instanceName);
717
+ }
718
+ /**
719
+ * Wait for Kro instance to be ready with Kro-specific logic
720
+ */
721
+ async waitForKroInstanceReady(instanceName, timeout) {
722
+ const startTime = Date.now();
723
+ const readinessLogger = this.logger.child({ instanceName, rgdName: this.name });
724
+ while (Date.now() - startTime < timeout) {
725
+ try {
726
+ const apiVersion = this.schemaDefinition.apiVersion.includes('/')
727
+ ? this.schemaDefinition.apiVersion
728
+ : `kro.run/${this.schemaDefinition.apiVersion}`;
729
+ const k8sApi = this.getKubeConfig().makeApiClient(k8s.KubernetesObjectApi);
730
+ const response = await k8sApi.read({
731
+ apiVersion,
732
+ kind: this.schemaDefinition.kind,
733
+ metadata: {
734
+ name: instanceName,
735
+ namespace: this.namespace,
736
+ },
737
+ });
738
+ const instance = response.body;
739
+ // Kro-specific readiness logic
740
+ const status = instance.status;
741
+ if (!status) {
742
+ readinessLogger.debug('No status found yet, continuing to wait', { instanceName });
743
+ await new Promise(resolve => setTimeout(resolve, 2000));
744
+ continue;
745
+ }
746
+ const state = status.state;
747
+ const conditions = status.conditions || [];
748
+ const syncedCondition = conditions.find(c => c.type === 'InstanceSynced');
749
+ // Check if status has fields beyond the basic Kro fields (conditions, state)
750
+ const statusKeys = Object.keys(status);
751
+ const basicKroFields = ['conditions', 'state'];
752
+ const hasCustomStatusFields = statusKeys.some(key => !basicKroFields.includes(key));
753
+ const isActive = state === 'ACTIVE';
754
+ const isSynced = syncedCondition?.status === 'True';
755
+ readinessLogger.debug('Kro instance status check', {
756
+ instanceName,
757
+ state,
758
+ isActive,
759
+ isSynced,
760
+ hasCustomStatusFields,
761
+ statusKeys
762
+ });
763
+ // Resource is ready when it's active, synced, and has custom status fields populated
764
+ if (isActive && isSynced && hasCustomStatusFields) {
765
+ readinessLogger.info('Kro instance is ready', { instanceName });
766
+ return;
767
+ }
768
+ // Check for failure states
769
+ if (state === 'FAILED') {
770
+ const failedCondition = conditions.find(c => c.status === 'False');
771
+ const errorMessage = failedCondition?.message || 'Unknown error';
772
+ throw new Error(`Kro instance deployment failed: ${errorMessage}`);
773
+ }
774
+ readinessLogger.debug('Kro instance not ready yet, continuing to wait', {
775
+ instanceName,
776
+ state,
777
+ isSynced,
778
+ hasCustomStatusFields
779
+ });
780
+ }
781
+ catch (error) {
782
+ const k8sError = error;
783
+ if (k8sError.statusCode !== 404) {
784
+ throw error;
785
+ }
786
+ // Instance not found yet, continue waiting
787
+ readinessLogger.debug('Instance not found yet, continuing to wait', { instanceName });
788
+ }
789
+ // Wait before checking again - use shorter intervals for faster response
790
+ await new Promise(resolve => setTimeout(resolve, 1000));
791
+ }
792
+ const elapsed = Date.now() - startTime;
793
+ throw new Error(`Timeout waiting for Kro instance ${instanceName} to be ready after ${elapsed}ms (timeout: ${timeout}ms). This usually means the Kro controller is not running or the RGD deployment failed. Check Kro controller logs: kubectl logs -n kro-system deployment/kro`);
794
+ }
795
+ /**
796
+ * Hydrate dynamic status fields by evaluating CEL expressions against live Kro resource data
797
+ */
798
+ async hydrateDynamicStatusFields(instanceName, dynamicFields) {
799
+ const dynamicLogger = this.logger.child({ instanceName });
800
+ // Get the live custom resource to extract dynamic status fields
801
+ const apiVersion = this.schemaDefinition.apiVersion.includes('/')
802
+ ? this.schemaDefinition.apiVersion
803
+ : `kro.run/${this.schemaDefinition.apiVersion}`;
804
+ const k8sApi = this.getKubeConfig().makeApiClient(k8s.KubernetesObjectApi);
805
+ const response = await k8sApi.read({
806
+ apiVersion,
807
+ kind: this.schemaDefinition.kind,
808
+ metadata: {
809
+ name: instanceName,
810
+ namespace: this.namespace,
811
+ },
812
+ });
813
+ const liveInstance = response.body;
814
+ if (!liveInstance.status) {
815
+ dynamicLogger.warn('No status found in live instance, returning empty dynamic fields');
816
+ return {};
817
+ }
818
+ // For now, return the live instance status directly
819
+ // In a full implementation, this would evaluate CEL expressions in dynamicFields
820
+ // against the live Kro resource data and return the evaluated results
821
+ // Extract only the fields that were marked as dynamic
822
+ const hydratedFields = {};
823
+ for (const [fieldName, _fieldValue] of Object.entries(dynamicFields)) {
824
+ if (liveInstance.status[fieldName] !== undefined) {
825
+ hydratedFields[fieldName] = liveInstance.status[fieldName];
826
+ }
827
+ }
828
+ return hydratedFields;
829
+ }
830
+ }
831
+ /**
832
+ * Create a KroResourceFactory instance
833
+ */
834
+ export function createKroResourceFactory(name, resources, schemaDefinition, statusMappings, options = {}) {
835
+ return new KroResourceFactoryImpl(name, resources, schemaDefinition, statusMappings, options);
836
+ }
837
+ //# sourceMappingURL=kro-factory.js.map