typekro 0.4.0 → 0.5.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 (1246) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/advanced/index.d.ts +52 -0
  3. package/dist/advanced/index.d.ts.map +1 -0
  4. package/dist/advanced/index.js +60 -0
  5. package/dist/advanced/index.js.map +1 -0
  6. package/dist/alchemy/deployers.d.ts.map +1 -1
  7. package/dist/alchemy/deployers.js +12 -28
  8. package/dist/alchemy/deployers.js.map +1 -1
  9. package/dist/alchemy/index.d.ts +8 -8
  10. package/dist/alchemy/index.d.ts.map +1 -1
  11. package/dist/alchemy/index.js +12 -11
  12. package/dist/alchemy/index.js.map +1 -1
  13. package/dist/alchemy/resolver.d.ts.map +1 -1
  14. package/dist/alchemy/resolver.js +6 -5
  15. package/dist/alchemy/resolver.js.map +1 -1
  16. package/dist/alchemy/resource-registration.d.ts.map +1 -1
  17. package/dist/alchemy/resource-registration.js +20 -8
  18. package/dist/alchemy/resource-registration.js.map +1 -1
  19. package/dist/alchemy/type-inference.d.ts.map +1 -1
  20. package/dist/alchemy/type-inference.js +6 -5
  21. package/dist/alchemy/type-inference.js.map +1 -1
  22. package/dist/alchemy/types.d.ts +1 -1
  23. package/dist/alchemy/types.d.ts.map +1 -1
  24. package/dist/alchemy/utilities.d.ts.map +1 -1
  25. package/dist/alchemy/utilities.js +1 -1
  26. package/dist/alchemy/utilities.js.map +1 -1
  27. package/dist/alchemy/wrapper.d.ts +4 -2
  28. package/dist/alchemy/wrapper.d.ts.map +1 -1
  29. package/dist/alchemy/wrapper.js +2 -1
  30. package/dist/alchemy/wrapper.js.map +1 -1
  31. package/dist/compositions/typekro-runtime/index.d.ts +3 -0
  32. package/dist/compositions/typekro-runtime/index.d.ts.map +1 -0
  33. package/dist/compositions/typekro-runtime/index.js.map +1 -0
  34. package/dist/{core/composition → compositions}/typekro-runtime/typekro-runtime.d.ts +7 -2
  35. package/dist/compositions/typekro-runtime/typekro-runtime.d.ts.map +1 -0
  36. package/dist/compositions/typekro-runtime/typekro-runtime.js +404 -0
  37. package/dist/compositions/typekro-runtime/typekro-runtime.js.map +1 -0
  38. package/dist/compositions/typekro-runtime/types.d.ts +45 -0
  39. package/dist/compositions/typekro-runtime/types.d.ts.map +1 -0
  40. package/dist/compositions/typekro-runtime/types.js.map +1 -0
  41. package/dist/core/composition/context.d.ts +91 -0
  42. package/dist/core/composition/context.d.ts.map +1 -0
  43. package/dist/core/composition/context.js +125 -0
  44. package/dist/core/composition/context.js.map +1 -0
  45. package/dist/core/composition/imperative.d.ts +36 -10
  46. package/dist/core/composition/imperative.d.ts.map +1 -1
  47. package/dist/core/composition/imperative.js +127 -115
  48. package/dist/core/composition/imperative.js.map +1 -1
  49. package/dist/core/composition/index.d.ts +2 -4
  50. package/dist/core/composition/index.d.ts.map +1 -1
  51. package/dist/core/composition/index.js +1 -4
  52. package/dist/core/composition/index.js.map +1 -1
  53. package/dist/core/composition-debugger.d.ts +78 -0
  54. package/dist/core/composition-debugger.d.ts.map +1 -0
  55. package/dist/core/composition-debugger.js +142 -0
  56. package/dist/core/composition-debugger.js.map +1 -0
  57. package/dist/core/config/defaults.d.ts +109 -0
  58. package/dist/core/config/defaults.d.ts.map +1 -0
  59. package/dist/core/config/defaults.js +150 -0
  60. package/dist/core/config/defaults.js.map +1 -0
  61. package/dist/core/config/env.d.ts +12 -0
  62. package/dist/core/config/env.d.ts.map +1 -0
  63. package/dist/core/config/env.js +16 -0
  64. package/dist/core/config/env.js.map +1 -0
  65. package/dist/core/config/index.d.ts +3 -0
  66. package/dist/core/config/index.d.ts.map +1 -0
  67. package/dist/core/config/index.js +3 -0
  68. package/dist/core/config/index.js.map +1 -0
  69. package/dist/core/constants/brands.d.ts +4 -57
  70. package/dist/core/constants/brands.d.ts.map +1 -1
  71. package/dist/core/constants/brands.js +4 -60
  72. package/dist/core/constants/brands.js.map +1 -1
  73. package/dist/core/dependencies/graph.d.ts.map +1 -1
  74. package/dist/core/dependencies/graph.js +4 -4
  75. package/dist/core/dependencies/graph.js.map +1 -1
  76. package/dist/core/dependencies/resolver.d.ts.map +1 -1
  77. package/dist/core/dependencies/resolver.js +3 -3
  78. package/dist/core/dependencies/resolver.js.map +1 -1
  79. package/dist/core/deployment/client-provider-manager.d.ts +40 -0
  80. package/dist/core/deployment/client-provider-manager.d.ts.map +1 -0
  81. package/dist/core/deployment/client-provider-manager.js +63 -0
  82. package/dist/core/deployment/client-provider-manager.js.map +1 -0
  83. package/dist/core/deployment/closure-planner.d.ts +20 -0
  84. package/dist/core/deployment/closure-planner.d.ts.map +1 -0
  85. package/dist/core/deployment/closure-planner.js +96 -0
  86. package/dist/core/deployment/closure-planner.js.map +1 -0
  87. package/dist/core/deployment/crd-manager.d.ts +52 -0
  88. package/dist/core/deployment/crd-manager.d.ts.map +1 -0
  89. package/dist/core/deployment/crd-manager.js +227 -0
  90. package/dist/core/deployment/crd-manager.js.map +1 -0
  91. package/dist/core/deployment/debug-logger.d.ts +3 -14
  92. package/dist/core/deployment/debug-logger.d.ts.map +1 -1
  93. package/dist/core/deployment/debug-logger.js +41 -12
  94. package/dist/core/deployment/debug-logger.js.map +1 -1
  95. package/dist/core/deployment/direct-factory.d.ts +23 -8
  96. package/dist/core/deployment/direct-factory.d.ts.map +1 -1
  97. package/dist/core/deployment/direct-factory.js +256 -164
  98. package/dist/core/deployment/direct-factory.js.map +1 -1
  99. package/dist/core/deployment/engine.d.ts +85 -65
  100. package/dist/core/deployment/engine.d.ts.map +1 -1
  101. package/dist/core/deployment/engine.js +505 -1703
  102. package/dist/core/deployment/engine.js.map +1 -1
  103. package/dist/core/deployment/errors.d.ts +30 -0
  104. package/dist/core/deployment/errors.d.ts.map +1 -0
  105. package/dist/core/deployment/errors.js +84 -0
  106. package/dist/core/deployment/errors.js.map +1 -0
  107. package/dist/core/deployment/event-filter.d.ts.map +1 -1
  108. package/dist/core/deployment/event-filter.js +16 -12
  109. package/dist/core/deployment/event-filter.js.map +1 -1
  110. package/dist/core/deployment/event-monitor.d.ts +3 -3
  111. package/dist/core/deployment/event-monitor.d.ts.map +1 -1
  112. package/dist/core/deployment/event-monitor.js +127 -49
  113. package/dist/core/deployment/event-monitor.js.map +1 -1
  114. package/dist/core/deployment/index.d.ts +5 -2
  115. package/dist/core/deployment/index.d.ts.map +1 -1
  116. package/dist/core/deployment/index.js +5 -3
  117. package/dist/core/deployment/index.js.map +1 -1
  118. package/dist/core/deployment/k8s-helpers.d.ts +44 -0
  119. package/dist/core/deployment/k8s-helpers.d.ts.map +1 -0
  120. package/dist/core/deployment/k8s-helpers.js +109 -0
  121. package/dist/core/deployment/k8s-helpers.js.map +1 -0
  122. package/dist/core/deployment/kro-factory.d.ts +28 -22
  123. package/dist/core/deployment/kro-factory.d.ts.map +1 -1
  124. package/dist/core/deployment/kro-factory.js +247 -366
  125. package/dist/core/deployment/kro-factory.js.map +1 -1
  126. package/dist/core/deployment/kro-readiness.d.ts +54 -0
  127. package/dist/core/deployment/kro-readiness.d.ts.map +1 -0
  128. package/dist/core/deployment/kro-readiness.js +140 -0
  129. package/dist/core/deployment/kro-readiness.js.map +1 -0
  130. package/dist/core/deployment/readiness-waiter.d.ts +60 -0
  131. package/dist/core/deployment/readiness-waiter.d.ts.map +1 -0
  132. package/dist/core/deployment/readiness-waiter.js +245 -0
  133. package/dist/core/deployment/readiness-waiter.js.map +1 -0
  134. package/dist/core/deployment/readiness.d.ts +3 -9
  135. package/dist/core/deployment/readiness.d.ts.map +1 -1
  136. package/dist/core/deployment/readiness.js +12 -28
  137. package/dist/core/deployment/readiness.js.map +1 -1
  138. package/dist/core/deployment/resource-applier.d.ts +58 -0
  139. package/dist/core/deployment/resource-applier.d.ts.map +1 -0
  140. package/dist/core/deployment/resource-applier.js +385 -0
  141. package/dist/core/deployment/resource-applier.js.map +1 -0
  142. package/dist/core/deployment/rollback-manager.d.ts +19 -2
  143. package/dist/core/deployment/rollback-manager.d.ts.map +1 -1
  144. package/dist/core/deployment/rollback-manager.js +127 -11
  145. package/dist/core/deployment/rollback-manager.js.map +1 -1
  146. package/dist/core/deployment/shared-utilities.d.ts +38 -9
  147. package/dist/core/deployment/shared-utilities.d.ts.map +1 -1
  148. package/dist/core/deployment/shared-utilities.js +92 -22
  149. package/dist/core/deployment/shared-utilities.js.map +1 -1
  150. package/dist/core/deployment/status-hydrator.d.ts.map +1 -1
  151. package/dist/core/deployment/status-hydrator.js +13 -10
  152. package/dist/core/deployment/status-hydrator.js.map +1 -1
  153. package/dist/core/deployment/strategies/alchemy-strategy.d.ts.map +1 -1
  154. package/dist/core/deployment/strategies/alchemy-strategy.js +16 -9
  155. package/dist/core/deployment/strategies/alchemy-strategy.js.map +1 -1
  156. package/dist/core/deployment/strategies/base-strategy.d.ts +14 -0
  157. package/dist/core/deployment/strategies/base-strategy.d.ts.map +1 -1
  158. package/dist/core/deployment/strategies/base-strategy.js +325 -244
  159. package/dist/core/deployment/strategies/base-strategy.js.map +1 -1
  160. package/dist/core/deployment/strategies/direct-strategy.d.ts +4 -4
  161. package/dist/core/deployment/strategies/direct-strategy.d.ts.map +1 -1
  162. package/dist/core/deployment/strategies/direct-strategy.js +12 -3
  163. package/dist/core/deployment/strategies/direct-strategy.js.map +1 -1
  164. package/dist/core/deployment/strategies/kro-strategy.d.ts +13 -8
  165. package/dist/core/deployment/strategies/kro-strategy.d.ts.map +1 -1
  166. package/dist/core/deployment/strategies/kro-strategy.js +51 -148
  167. package/dist/core/deployment/strategies/kro-strategy.js.map +1 -1
  168. package/dist/core/errors.d.ts +134 -83
  169. package/dist/core/errors.d.ts.map +1 -1
  170. package/dist/core/errors.js +177 -300
  171. package/dist/core/errors.js.map +1 -1
  172. package/dist/core/expressions/analysis/analyzer.d.ts +155 -0
  173. package/dist/core/expressions/analysis/analyzer.d.ts.map +1 -0
  174. package/dist/core/expressions/analysis/analyzer.js +540 -0
  175. package/dist/core/expressions/analysis/analyzer.js.map +1 -0
  176. package/dist/core/expressions/analysis/array-method-converters.d.ts +19 -0
  177. package/dist/core/expressions/analysis/array-method-converters.d.ts.map +1 -0
  178. package/dist/core/expressions/analysis/array-method-converters.js +175 -0
  179. package/dist/core/expressions/analysis/array-method-converters.js.map +1 -0
  180. package/dist/core/expressions/analysis/ast-helpers.d.ts +49 -0
  181. package/dist/core/expressions/analysis/ast-helpers.d.ts.map +1 -0
  182. package/dist/core/expressions/analysis/ast-helpers.js +106 -0
  183. package/dist/core/expressions/analysis/ast-helpers.js.map +1 -0
  184. package/dist/core/expressions/analysis/ast-node-converters.d.ts +15 -0
  185. package/dist/core/expressions/analysis/ast-node-converters.d.ts.map +1 -0
  186. package/dist/core/expressions/analysis/ast-node-converters.js +123 -0
  187. package/dist/core/expressions/analysis/ast-node-converters.js.map +1 -0
  188. package/dist/core/expressions/analysis/ast-type-guards.d.ts +14 -0
  189. package/dist/core/expressions/analysis/ast-type-guards.d.ts.map +1 -0
  190. package/dist/core/expressions/analysis/ast-type-guards.js +15 -0
  191. package/dist/core/expressions/analysis/ast-type-guards.js.map +1 -0
  192. package/dist/core/expressions/{cache.d.ts → analysis/cache.d.ts} +1 -1
  193. package/dist/core/expressions/analysis/cache.d.ts.map +1 -0
  194. package/dist/core/expressions/{cache.js → analysis/cache.js} +13 -13
  195. package/dist/core/expressions/analysis/cache.js.map +1 -0
  196. package/dist/core/expressions/analysis/call-expression-converters.d.ts +18 -0
  197. package/dist/core/expressions/analysis/call-expression-converters.d.ts.map +1 -0
  198. package/dist/core/expressions/analysis/call-expression-converters.js +220 -0
  199. package/dist/core/expressions/analysis/call-expression-converters.js.map +1 -0
  200. package/dist/core/expressions/analysis/cel-emitter.d.ts +85 -0
  201. package/dist/core/expressions/analysis/cel-emitter.d.ts.map +1 -0
  202. package/dist/core/expressions/analysis/cel-emitter.js +455 -0
  203. package/dist/core/expressions/analysis/cel-emitter.js.map +1 -0
  204. package/dist/core/expressions/analysis/expression-classifier.d.ts +77 -0
  205. package/dist/core/expressions/analysis/expression-classifier.d.ts.map +1 -0
  206. package/dist/core/expressions/analysis/expression-classifier.js +487 -0
  207. package/dist/core/expressions/analysis/expression-classifier.js.map +1 -0
  208. package/dist/core/expressions/analysis/fn-toString-self-test.d.ts +146 -0
  209. package/dist/core/expressions/analysis/fn-toString-self-test.d.ts.map +1 -0
  210. package/dist/core/expressions/analysis/fn-toString-self-test.js +243 -0
  211. package/dist/core/expressions/analysis/fn-toString-self-test.js.map +1 -0
  212. package/dist/core/expressions/analysis/operator-utils.d.ts +35 -0
  213. package/dist/core/expressions/analysis/operator-utils.d.ts.map +1 -0
  214. package/dist/core/expressions/analysis/operator-utils.js +167 -0
  215. package/dist/core/expressions/analysis/operator-utils.js.map +1 -0
  216. package/dist/core/expressions/analysis/parse-core.d.ts +63 -0
  217. package/dist/core/expressions/analysis/parse-core.d.ts.map +1 -0
  218. package/dist/core/expressions/analysis/parse-core.js +115 -0
  219. package/dist/core/expressions/analysis/parse-core.js.map +1 -0
  220. package/dist/core/expressions/{parser.d.ts → analysis/parser.d.ts} +2 -38
  221. package/dist/core/expressions/analysis/parser.d.ts.map +1 -0
  222. package/dist/core/expressions/{parser.js → analysis/parser.js} +20 -80
  223. package/dist/core/expressions/analysis/parser.js.map +1 -0
  224. package/dist/core/expressions/analysis/scope-resolver.d.ts +57 -0
  225. package/dist/core/expressions/analysis/scope-resolver.d.ts.map +1 -0
  226. package/dist/core/expressions/analysis/scope-resolver.js +440 -0
  227. package/dist/core/expressions/analysis/scope-resolver.js.map +1 -0
  228. package/dist/core/expressions/analysis/shared-types.d.ts +132 -0
  229. package/dist/core/expressions/analysis/shared-types.d.ts.map +1 -0
  230. package/dist/core/expressions/analysis/shared-types.js +13 -0
  231. package/dist/core/expressions/analysis/shared-types.js.map +1 -0
  232. package/dist/core/expressions/analysis/source-map.d.ts.map +1 -0
  233. package/dist/core/expressions/{source-map.js → analysis/source-map.js} +16 -17
  234. package/dist/core/expressions/analysis/source-map.js.map +1 -0
  235. package/dist/core/expressions/analysis/string-method-converters.d.ts +27 -0
  236. package/dist/core/expressions/analysis/string-method-converters.d.ts.map +1 -0
  237. package/dist/core/expressions/analysis/string-method-converters.js +208 -0
  238. package/dist/core/expressions/analysis/string-method-converters.js.map +1 -0
  239. package/dist/core/expressions/{types.d.ts → analysis/types.d.ts} +5 -5
  240. package/dist/core/expressions/analysis/types.d.ts.map +1 -0
  241. package/dist/core/expressions/analysis/types.js.map +1 -0
  242. package/dist/core/expressions/composition/composition-analyzer-helpers.d.ts +92 -0
  243. package/dist/core/expressions/composition/composition-analyzer-helpers.d.ts.map +1 -0
  244. package/dist/core/expressions/composition/composition-analyzer-helpers.js +301 -0
  245. package/dist/core/expressions/composition/composition-analyzer-helpers.js.map +1 -0
  246. package/dist/core/expressions/composition/composition-analyzer-ternary.d.ts +77 -0
  247. package/dist/core/expressions/composition/composition-analyzer-ternary.d.ts.map +1 -0
  248. package/dist/core/expressions/composition/composition-analyzer-ternary.js +364 -0
  249. package/dist/core/expressions/composition/composition-analyzer-ternary.js.map +1 -0
  250. package/dist/core/expressions/composition/composition-analyzer-traversal.d.ts +37 -0
  251. package/dist/core/expressions/composition/composition-analyzer-traversal.d.ts.map +1 -0
  252. package/dist/core/expressions/composition/composition-analyzer-traversal.js +375 -0
  253. package/dist/core/expressions/composition/composition-analyzer-traversal.js.map +1 -0
  254. package/dist/core/expressions/composition/composition-analyzer-types.d.ts +140 -0
  255. package/dist/core/expressions/composition/composition-analyzer-types.d.ts.map +1 -0
  256. package/dist/core/expressions/composition/composition-analyzer-types.js +8 -0
  257. package/dist/core/expressions/composition/composition-analyzer-types.js.map +1 -0
  258. package/dist/core/expressions/composition/composition-analyzer.d.ts +39 -0
  259. package/dist/core/expressions/composition/composition-analyzer.d.ts.map +1 -0
  260. package/dist/core/expressions/composition/composition-analyzer.js +144 -0
  261. package/dist/core/expressions/composition/composition-analyzer.js.map +1 -0
  262. package/dist/core/expressions/composition/context-tracker.d.ts +39 -0
  263. package/dist/core/expressions/composition/context-tracker.d.ts.map +1 -0
  264. package/dist/core/expressions/composition/context-tracker.js +64 -0
  265. package/dist/core/expressions/composition/context-tracker.js.map +1 -0
  266. package/dist/core/expressions/composition/expression-analyzer.d.ts +101 -0
  267. package/dist/core/expressions/composition/expression-analyzer.d.ts.map +1 -0
  268. package/dist/core/expressions/composition/expression-analyzer.js +425 -0
  269. package/dist/core/expressions/composition/expression-analyzer.js.map +1 -0
  270. package/dist/core/expressions/{imperative-analyzer.d.ts → composition/imperative-analyzer.d.ts} +3 -3
  271. package/dist/core/expressions/composition/imperative-analyzer.d.ts.map +1 -0
  272. package/dist/core/expressions/{imperative-analyzer.js → composition/imperative-analyzer.js} +15 -7
  273. package/dist/core/expressions/composition/imperative-analyzer.js.map +1 -0
  274. package/dist/core/expressions/composition/index.d.ts +17 -0
  275. package/dist/core/expressions/composition/index.d.ts.map +1 -0
  276. package/dist/core/expressions/composition/index.js +18 -0
  277. package/dist/core/expressions/composition/index.js.map +1 -0
  278. package/dist/core/expressions/composition/integration-hooks.d.ts +71 -0
  279. package/dist/core/expressions/composition/integration-hooks.d.ts.map +1 -0
  280. package/dist/core/expressions/composition/integration-hooks.js +248 -0
  281. package/dist/core/expressions/composition/integration-hooks.js.map +1 -0
  282. package/dist/core/expressions/composition/scope-manager.d.ts +93 -0
  283. package/dist/core/expressions/composition/scope-manager.d.ts.map +1 -0
  284. package/dist/core/expressions/composition/scope-manager.js +215 -0
  285. package/dist/core/expressions/composition/scope-manager.js.map +1 -0
  286. package/dist/core/expressions/composition/types.d.ts +41 -0
  287. package/dist/core/expressions/composition/types.d.ts.map +1 -0
  288. package/dist/core/expressions/composition/types.js +7 -0
  289. package/dist/core/expressions/composition/types.js.map +1 -0
  290. package/dist/core/expressions/{conditional-expression-processor.d.ts → conditional/conditional-expression-processor.d.ts} +3 -3
  291. package/dist/core/expressions/conditional/conditional-expression-processor.d.ts.map +1 -0
  292. package/dist/core/expressions/{conditional-expression-processor.js → conditional/conditional-expression-processor.js} +59 -50
  293. package/dist/core/expressions/conditional/conditional-expression-processor.js.map +1 -0
  294. package/dist/core/expressions/{conditional-integration.d.ts → conditional/conditional-integration.d.ts} +13 -35
  295. package/dist/core/expressions/conditional/conditional-integration.d.ts.map +1 -0
  296. package/dist/core/expressions/{conditional-integration.js → conditional/conditional-integration.js} +92 -86
  297. package/dist/core/expressions/conditional/conditional-integration.js.map +1 -0
  298. package/dist/core/expressions/{context-aware-generator.d.ts → context/context-aware-generator.d.ts} +4 -28
  299. package/dist/core/expressions/context/context-aware-generator.d.ts.map +1 -0
  300. package/dist/core/expressions/{context-aware-generator.js → context/context-aware-generator.js} +27 -121
  301. package/dist/core/expressions/context/context-aware-generator.js.map +1 -0
  302. package/dist/core/expressions/{context-detector.d.ts → context/context-detector.d.ts} +7 -13
  303. package/dist/core/expressions/context/context-detector.d.ts.map +1 -0
  304. package/dist/core/expressions/{context-detector.js → context/context-detector.js} +45 -63
  305. package/dist/core/expressions/context/context-detector.js.map +1 -0
  306. package/dist/core/expressions/{context-validator.d.ts → context/context-validator.d.ts} +5 -36
  307. package/dist/core/expressions/context/context-validator.d.ts.map +1 -0
  308. package/dist/core/expressions/{context-validator.js → context/context-validator.js} +55 -124
  309. package/dist/core/expressions/context/context-validator.js.map +1 -0
  310. package/dist/core/expressions/{cel-conversion-engine.d.ts → factory/cel-conversion-engine.d.ts} +3 -3
  311. package/dist/core/expressions/factory/cel-conversion-engine.d.ts.map +1 -0
  312. package/dist/core/expressions/{cel-conversion-engine.js → factory/cel-conversion-engine.js} +10 -9
  313. package/dist/core/expressions/factory/cel-conversion-engine.js.map +1 -0
  314. package/dist/core/expressions/factory/dependency-tracker.d.ts +222 -0
  315. package/dist/core/expressions/factory/dependency-tracker.d.ts.map +1 -0
  316. package/dist/core/expressions/factory/dependency-tracker.js +512 -0
  317. package/dist/core/expressions/factory/dependency-tracker.js.map +1 -0
  318. package/dist/core/expressions/{factory-integration.d.ts → factory/factory-integration.d.ts} +3 -18
  319. package/dist/core/expressions/factory/factory-integration.d.ts.map +1 -0
  320. package/dist/core/expressions/{factory-integration.js → factory/factory-integration.js} +28 -29
  321. package/dist/core/expressions/factory/factory-integration.js.map +1 -0
  322. package/dist/core/expressions/{factory-pattern-handler.d.ts → factory/factory-pattern-handler.d.ts} +8 -8
  323. package/dist/core/expressions/factory/factory-pattern-handler.d.ts.map +1 -0
  324. package/dist/core/expressions/{factory-pattern-handler.js → factory/factory-pattern-handler.js} +101 -73
  325. package/dist/core/expressions/factory/factory-pattern-handler.js.map +1 -0
  326. package/dist/core/expressions/{migration-helpers.d.ts → factory/migration-helpers.d.ts} +4 -4
  327. package/dist/core/expressions/factory/migration-helpers.d.ts.map +1 -0
  328. package/dist/core/expressions/{migration-helpers.js → factory/migration-helpers.js} +28 -26
  329. package/dist/core/expressions/factory/migration-helpers.js.map +1 -0
  330. package/dist/core/expressions/factory/resource-analyzer.d.ts +139 -0
  331. package/dist/core/expressions/factory/resource-analyzer.d.ts.map +1 -0
  332. package/dist/core/expressions/factory/resource-analyzer.js +286 -0
  333. package/dist/core/expressions/factory/resource-analyzer.js.map +1 -0
  334. package/dist/core/expressions/factory/resource-type-validator.d.ts +149 -0
  335. package/dist/core/expressions/factory/resource-type-validator.d.ts.map +1 -0
  336. package/dist/core/expressions/factory/resource-type-validator.js +318 -0
  337. package/dist/core/expressions/factory/resource-type-validator.js.map +1 -0
  338. package/dist/core/expressions/factory/status-ast-utils.d.ts +36 -0
  339. package/dist/core/expressions/factory/status-ast-utils.d.ts.map +1 -0
  340. package/dist/core/expressions/factory/status-ast-utils.js +320 -0
  341. package/dist/core/expressions/factory/status-ast-utils.js.map +1 -0
  342. package/dist/core/expressions/factory/status-builder-analyzer.d.ts +91 -0
  343. package/dist/core/expressions/factory/status-builder-analyzer.d.ts.map +1 -0
  344. package/dist/core/expressions/factory/status-builder-analyzer.js +374 -0
  345. package/dist/core/expressions/factory/status-builder-analyzer.js.map +1 -0
  346. package/dist/core/expressions/factory/status-builder-types.d.ts +166 -0
  347. package/dist/core/expressions/factory/status-builder-types.d.ts.map +1 -0
  348. package/dist/core/expressions/factory/status-builder-types.js +8 -0
  349. package/dist/core/expressions/factory/status-builder-types.js.map +1 -0
  350. package/dist/core/expressions/factory/status-cel-generation.d.ts +67 -0
  351. package/dist/core/expressions/factory/status-cel-generation.d.ts.map +1 -0
  352. package/dist/core/expressions/factory/status-cel-generation.js +330 -0
  353. package/dist/core/expressions/factory/status-cel-generation.js.map +1 -0
  354. package/dist/core/expressions/factory/status-field-analysis.d.ts +57 -0
  355. package/dist/core/expressions/factory/status-field-analysis.d.ts.map +1 -0
  356. package/dist/core/expressions/factory/status-field-analysis.js +475 -0
  357. package/dist/core/expressions/factory/status-field-analysis.js.map +1 -0
  358. package/dist/core/expressions/index.d.ts +39 -51
  359. package/dist/core/expressions/index.d.ts.map +1 -1
  360. package/dist/core/expressions/index.js +46 -47
  361. package/dist/core/expressions/index.js.map +1 -1
  362. package/dist/core/expressions/{magic-assignable-analyzer.d.ts → magic-proxy/magic-assignable-analyzer.d.ts} +5 -5
  363. package/dist/core/expressions/magic-proxy/magic-assignable-analyzer.d.ts.map +1 -0
  364. package/dist/core/expressions/{magic-assignable-analyzer.js → magic-proxy/magic-assignable-analyzer.js} +29 -24
  365. package/dist/core/expressions/magic-proxy/magic-assignable-analyzer.js.map +1 -0
  366. package/dist/core/expressions/{magic-proxy-analyzer.d.ts → magic-proxy/magic-proxy-analyzer.d.ts} +15 -68
  367. package/dist/core/expressions/magic-proxy/magic-proxy-analyzer.d.ts.map +1 -0
  368. package/dist/core/expressions/{magic-proxy-analyzer.js → magic-proxy/magic-proxy-analyzer.js} +45 -196
  369. package/dist/core/expressions/magic-proxy/magic-proxy-analyzer.js.map +1 -0
  370. package/dist/core/expressions/magic-proxy/magic-proxy-ast.d.ts +44 -0
  371. package/dist/core/expressions/magic-proxy/magic-proxy-ast.d.ts.map +1 -0
  372. package/dist/core/expressions/magic-proxy/magic-proxy-ast.js +175 -0
  373. package/dist/core/expressions/magic-proxy/magic-proxy-ast.js.map +1 -0
  374. package/dist/core/expressions/{magic-proxy-detector.d.ts → magic-proxy/magic-proxy-detector.d.ts} +7 -7
  375. package/dist/core/expressions/magic-proxy/magic-proxy-detector.d.ts.map +1 -0
  376. package/dist/core/expressions/{magic-proxy-detector.js → magic-proxy/magic-proxy-detector.js} +36 -28
  377. package/dist/core/expressions/magic-proxy/magic-proxy-detector.js.map +1 -0
  378. package/dist/core/expressions/magic-proxy/magic-proxy-types.d.ts +36 -0
  379. package/dist/core/expressions/magic-proxy/magic-proxy-types.d.ts.map +1 -0
  380. package/dist/core/expressions/magic-proxy/magic-proxy-types.js +8 -0
  381. package/dist/core/expressions/magic-proxy/magic-proxy-types.js.map +1 -0
  382. package/dist/core/expressions/magic-proxy/optionality-analysis.d.ts +54 -0
  383. package/dist/core/expressions/magic-proxy/optionality-analysis.d.ts.map +1 -0
  384. package/dist/core/expressions/magic-proxy/optionality-analysis.js +239 -0
  385. package/dist/core/expressions/magic-proxy/optionality-analysis.js.map +1 -0
  386. package/dist/core/expressions/magic-proxy/optionality-cel-generation.d.ts +51 -0
  387. package/dist/core/expressions/magic-proxy/optionality-cel-generation.d.ts.map +1 -0
  388. package/dist/core/expressions/magic-proxy/optionality-cel-generation.js +201 -0
  389. package/dist/core/expressions/magic-proxy/optionality-cel-generation.js.map +1 -0
  390. package/dist/core/expressions/magic-proxy/optionality-handler.d.ts +119 -0
  391. package/dist/core/expressions/magic-proxy/optionality-handler.d.ts.map +1 -0
  392. package/dist/core/expressions/magic-proxy/optionality-handler.js +321 -0
  393. package/dist/core/expressions/magic-proxy/optionality-handler.js.map +1 -0
  394. package/dist/core/expressions/magic-proxy/optionality-hydration.d.ts +84 -0
  395. package/dist/core/expressions/magic-proxy/optionality-hydration.d.ts.map +1 -0
  396. package/dist/core/expressions/magic-proxy/optionality-hydration.js +378 -0
  397. package/dist/core/expressions/magic-proxy/optionality-hydration.js.map +1 -0
  398. package/dist/core/expressions/magic-proxy/optionality-optional-chaining.d.ts +61 -0
  399. package/dist/core/expressions/magic-proxy/optionality-optional-chaining.d.ts.map +1 -0
  400. package/dist/core/expressions/magic-proxy/optionality-optional-chaining.js +218 -0
  401. package/dist/core/expressions/magic-proxy/optionality-optional-chaining.js.map +1 -0
  402. package/dist/core/expressions/magic-proxy/optionality-types.d.ts +206 -0
  403. package/dist/core/expressions/magic-proxy/optionality-types.d.ts.map +1 -0
  404. package/dist/core/expressions/magic-proxy/optionality-types.js +9 -0
  405. package/dist/core/expressions/magic-proxy/optionality-types.js.map +1 -0
  406. package/dist/core/expressions/validation/compile-time-checker.d.ts +74 -0
  407. package/dist/core/expressions/validation/compile-time-checker.d.ts.map +1 -0
  408. package/dist/core/expressions/{compile-time-validation.js → validation/compile-time-checker.js} +44 -91
  409. package/dist/core/expressions/validation/compile-time-checker.js.map +1 -0
  410. package/dist/core/expressions/validation/compile-time-errors.d.ts +70 -0
  411. package/dist/core/expressions/validation/compile-time-errors.d.ts.map +1 -0
  412. package/dist/core/expressions/validation/compile-time-errors.js +63 -0
  413. package/dist/core/expressions/validation/compile-time-errors.js.map +1 -0
  414. package/dist/core/expressions/validation/compile-time-types.d.ts +147 -0
  415. package/dist/core/expressions/validation/compile-time-types.d.ts.map +1 -0
  416. package/dist/core/expressions/validation/compile-time-types.js +8 -0
  417. package/dist/core/expressions/validation/compile-time-types.js.map +1 -0
  418. package/dist/core/expressions/validation/compile-time-validation.d.ts +13 -0
  419. package/dist/core/expressions/validation/compile-time-validation.d.ts.map +1 -0
  420. package/dist/core/expressions/validation/compile-time-validation.js +14 -0
  421. package/dist/core/expressions/validation/compile-time-validation.js.map +1 -0
  422. package/dist/core/expressions/validation/kubernetes-field-types.d.ts +35 -0
  423. package/dist/core/expressions/validation/kubernetes-field-types.d.ts.map +1 -0
  424. package/dist/core/expressions/validation/kubernetes-field-types.js +230 -0
  425. package/dist/core/expressions/validation/kubernetes-field-types.js.map +1 -0
  426. package/dist/core/expressions/validation/resource-field-utils.d.ts +69 -0
  427. package/dist/core/expressions/validation/resource-field-utils.d.ts.map +1 -0
  428. package/dist/core/expressions/validation/resource-field-utils.js +280 -0
  429. package/dist/core/expressions/validation/resource-field-utils.js.map +1 -0
  430. package/dist/core/expressions/{resource-validation.d.ts → validation/resource-validation-types.d.ts} +6 -63
  431. package/dist/core/expressions/validation/resource-validation-types.d.ts.map +1 -0
  432. package/dist/core/expressions/validation/resource-validation-types.js +69 -0
  433. package/dist/core/expressions/validation/resource-validation-types.js.map +1 -0
  434. package/dist/core/expressions/validation/resource-validation.d.ts +49 -0
  435. package/dist/core/expressions/validation/resource-validation.d.ts.map +1 -0
  436. package/dist/core/expressions/validation/resource-validation.js +288 -0
  437. package/dist/core/expressions/validation/resource-validation.js.map +1 -0
  438. package/dist/core/expressions/{type-inference.d.ts → validation/type-inference-types.d.ts} +34 -88
  439. package/dist/core/expressions/validation/type-inference-types.d.ts.map +1 -0
  440. package/dist/core/expressions/validation/type-inference-types.js +52 -0
  441. package/dist/core/expressions/validation/type-inference-types.js.map +1 -0
  442. package/dist/core/expressions/validation/type-inference.d.ts +86 -0
  443. package/dist/core/expressions/validation/type-inference.d.ts.map +1 -0
  444. package/dist/core/expressions/{type-inference.js → validation/type-inference.js} +66 -299
  445. package/dist/core/expressions/validation/type-inference.js.map +1 -0
  446. package/dist/core/expressions/{type-safety.d.ts → validation/type-safety.d.ts} +6 -5
  447. package/dist/core/expressions/validation/type-safety.d.ts.map +1 -0
  448. package/dist/core/expressions/{type-safety.js → validation/type-safety.js} +34 -19
  449. package/dist/core/expressions/validation/type-safety.js.map +1 -0
  450. package/dist/core/kubernetes/api.d.ts.map +1 -1
  451. package/dist/core/kubernetes/api.js +21 -12
  452. package/dist/core/kubernetes/api.js.map +1 -1
  453. package/dist/core/kubernetes/bun-api-client.d.ts +36 -14
  454. package/dist/core/kubernetes/bun-api-client.d.ts.map +1 -1
  455. package/dist/core/kubernetes/bun-api-client.js +47 -24
  456. package/dist/core/kubernetes/bun-api-client.js.map +1 -1
  457. package/dist/core/kubernetes/bun-http-library.d.ts +69 -3
  458. package/dist/core/kubernetes/bun-http-library.d.ts.map +1 -1
  459. package/dist/core/kubernetes/bun-http-library.js +118 -11
  460. package/dist/core/kubernetes/bun-http-library.js.map +1 -1
  461. package/dist/core/kubernetes/client-provider.d.ts +121 -35
  462. package/dist/core/kubernetes/client-provider.d.ts.map +1 -1
  463. package/dist/core/kubernetes/client-provider.js +181 -65
  464. package/dist/core/kubernetes/client-provider.js.map +1 -1
  465. package/dist/core/kubernetes/errors.d.ts +5 -5
  466. package/dist/core/kubernetes/errors.js +5 -5
  467. package/dist/core/kubernetes/index.d.ts +8 -7
  468. package/dist/core/kubernetes/index.d.ts.map +1 -1
  469. package/dist/core/kubernetes/index.js +8 -8
  470. package/dist/core/kubernetes/index.js.map +1 -1
  471. package/dist/core/kubernetes/type-guards.d.ts +1 -1
  472. package/dist/core/kubernetes/type-guards.js +1 -1
  473. package/dist/core/logging/config.d.ts.map +1 -1
  474. package/dist/core/logging/config.js +20 -4
  475. package/dist/core/logging/config.js.map +1 -1
  476. package/dist/core/logging/logger.d.ts +3 -3
  477. package/dist/core/logging/logger.d.ts.map +1 -1
  478. package/dist/core/logging/logger.js +18 -18
  479. package/dist/core/logging/logger.js.map +1 -1
  480. package/dist/core/logging/types.d.ts +13 -8
  481. package/dist/core/logging/types.d.ts.map +1 -1
  482. package/dist/core/metadata/index.d.ts +9 -0
  483. package/dist/core/metadata/index.d.ts.map +1 -0
  484. package/dist/core/metadata/index.js +9 -0
  485. package/dist/core/metadata/index.js.map +1 -0
  486. package/dist/core/metadata/resource-metadata.d.ts +116 -0
  487. package/dist/core/metadata/resource-metadata.d.ts.map +1 -0
  488. package/dist/core/metadata/resource-metadata.js +217 -0
  489. package/dist/core/metadata/resource-metadata.js.map +1 -0
  490. package/dist/core/proxy/create-resource.d.ts +50 -0
  491. package/dist/core/proxy/create-resource.d.ts.map +1 -0
  492. package/dist/core/proxy/create-resource.js +393 -0
  493. package/dist/core/proxy/create-resource.js.map +1 -0
  494. package/dist/core/proxy/index.d.ts +8 -0
  495. package/dist/core/proxy/index.d.ts.map +1 -0
  496. package/dist/core/proxy/index.js +7 -0
  497. package/dist/core/proxy/index.js.map +1 -0
  498. package/dist/core/proxy/known-status-fields.d.ts +27 -0
  499. package/dist/core/proxy/known-status-fields.d.ts.map +1 -0
  500. package/dist/core/proxy/known-status-fields.js +185 -0
  501. package/dist/core/proxy/known-status-fields.js.map +1 -0
  502. package/dist/core/readiness/evaluator-factories.d.ts +100 -0
  503. package/dist/core/readiness/evaluator-factories.d.ts.map +1 -0
  504. package/dist/core/readiness/evaluator-factories.js +168 -0
  505. package/dist/core/readiness/evaluator-factories.js.map +1 -0
  506. package/dist/core/readiness/evaluator.d.ts +21 -0
  507. package/dist/core/readiness/evaluator.d.ts.map +1 -0
  508. package/dist/core/readiness/evaluator.js +38 -0
  509. package/dist/core/readiness/evaluator.js.map +1 -0
  510. package/dist/core/readiness/index.d.ts +3 -0
  511. package/dist/core/readiness/index.d.ts.map +1 -1
  512. package/dist/core/readiness/index.js +2 -0
  513. package/dist/core/readiness/index.js.map +1 -1
  514. package/dist/core/readiness/registry.d.ts +3 -3
  515. package/dist/core/readiness/registry.d.ts.map +1 -1
  516. package/dist/core/readiness/registry.js +2 -0
  517. package/dist/core/readiness/registry.js.map +1 -1
  518. package/dist/core/references/cel-evaluator.d.ts +11 -0
  519. package/dist/core/references/cel-evaluator.d.ts.map +1 -1
  520. package/dist/core/references/cel-evaluator.js +65 -27
  521. package/dist/core/references/cel-evaluator.js.map +1 -1
  522. package/dist/core/references/cel.d.ts +66 -23
  523. package/dist/core/references/cel.d.ts.map +1 -1
  524. package/dist/core/references/cel.js +184 -117
  525. package/dist/core/references/cel.js.map +1 -1
  526. package/dist/core/references/external-refs.d.ts +39 -21
  527. package/dist/core/references/external-refs.d.ts.map +1 -1
  528. package/dist/core/references/external-refs.js +70 -30
  529. package/dist/core/references/external-refs.js.map +1 -1
  530. package/dist/core/references/index.d.ts +5 -4
  531. package/dist/core/references/index.d.ts.map +1 -1
  532. package/dist/core/references/index.js +6 -6
  533. package/dist/core/references/index.js.map +1 -1
  534. package/dist/core/references/resolver.d.ts +3 -7
  535. package/dist/core/references/resolver.d.ts.map +1 -1
  536. package/dist/core/references/resolver.js +53 -92
  537. package/dist/core/references/resolver.js.map +1 -1
  538. package/dist/core/references/schema-proxy.d.ts.map +1 -1
  539. package/dist/core/references/schema-proxy.js +92 -10
  540. package/dist/core/references/schema-proxy.js.map +1 -1
  541. package/dist/core/resources/factory-registry.d.ts +99 -0
  542. package/dist/core/resources/factory-registry.d.ts.map +1 -0
  543. package/dist/core/resources/factory-registry.js +166 -0
  544. package/dist/core/resources/factory-registry.js.map +1 -0
  545. package/dist/core/resources/id.d.ts +44 -0
  546. package/dist/core/resources/id.d.ts.map +1 -0
  547. package/dist/core/resources/id.js +78 -0
  548. package/dist/core/resources/id.js.map +1 -0
  549. package/dist/core/resources/index.d.ts +7 -0
  550. package/dist/core/resources/index.d.ts.map +1 -0
  551. package/dist/core/resources/index.js +6 -0
  552. package/dist/core/resources/index.js.map +1 -0
  553. package/dist/core/{utils → runtime-patches}/crd-patcher.d.ts +1 -1
  554. package/dist/core/runtime-patches/crd-patcher.d.ts.map +1 -0
  555. package/dist/core/runtime-patches/crd-patcher.js +124 -0
  556. package/dist/core/runtime-patches/crd-patcher.js.map +1 -0
  557. package/dist/core/{utils → runtime-patches}/crd-schema-fix.d.ts +39 -2
  558. package/dist/core/runtime-patches/crd-schema-fix.d.ts.map +1 -0
  559. package/dist/core/{utils → runtime-patches}/crd-schema-fix.js +130 -26
  560. package/dist/core/runtime-patches/crd-schema-fix.js.map +1 -0
  561. package/dist/core/runtime-patches/index.d.ts +8 -0
  562. package/dist/core/runtime-patches/index.d.ts.map +1 -0
  563. package/dist/core/runtime-patches/index.js +8 -0
  564. package/dist/core/runtime-patches/index.js.map +1 -0
  565. package/dist/core/{evaluation → serialization}/cel-optimizer.d.ts +2 -2
  566. package/dist/core/serialization/cel-optimizer.d.ts.map +1 -0
  567. package/dist/core/{evaluation → serialization}/cel-optimizer.js +11 -23
  568. package/dist/core/serialization/cel-optimizer.js.map +1 -0
  569. package/dist/core/serialization/cel-references.d.ts +36 -0
  570. package/dist/core/serialization/cel-references.d.ts.map +1 -0
  571. package/dist/core/serialization/cel-references.js +183 -0
  572. package/dist/core/serialization/cel-references.js.map +1 -0
  573. package/dist/core/serialization/core.d.ts +169 -4
  574. package/dist/core/serialization/core.d.ts.map +1 -1
  575. package/dist/core/serialization/core.js +387 -710
  576. package/dist/core/serialization/core.js.map +1 -1
  577. package/dist/core/serialization/index.d.ts +3 -1
  578. package/dist/core/serialization/index.d.ts.map +1 -1
  579. package/dist/core/serialization/index.js +5 -1
  580. package/dist/core/serialization/index.js.map +1 -1
  581. package/dist/core/serialization/schema.d.ts +34 -3
  582. package/dist/core/serialization/schema.d.ts.map +1 -1
  583. package/dist/core/serialization/schema.js +141 -11
  584. package/dist/core/serialization/schema.js.map +1 -1
  585. package/dist/core/serialization/status-analysis-helpers.d.ts +68 -0
  586. package/dist/core/serialization/status-analysis-helpers.d.ts.map +1 -0
  587. package/dist/core/serialization/status-analysis-helpers.js +284 -0
  588. package/dist/core/serialization/status-analysis-helpers.js.map +1 -0
  589. package/dist/core/serialization/status-analysis-pipeline.d.ts +63 -0
  590. package/dist/core/serialization/status-analysis-pipeline.d.ts.map +1 -0
  591. package/dist/core/serialization/status-analysis-pipeline.js +419 -0
  592. package/dist/core/serialization/status-analysis-pipeline.js.map +1 -0
  593. package/dist/core/serialization/validation.d.ts.map +1 -1
  594. package/dist/core/serialization/validation.js +5 -3
  595. package/dist/core/serialization/validation.js.map +1 -1
  596. package/dist/core/serialization/yaml.d.ts +14 -3
  597. package/dist/core/serialization/yaml.d.ts.map +1 -1
  598. package/dist/core/serialization/yaml.js +453 -13
  599. package/dist/core/serialization/yaml.js.map +1 -1
  600. package/dist/core/types/common.d.ts +43 -8
  601. package/dist/core/types/common.d.ts.map +1 -1
  602. package/dist/core/types/deployment.d.ts +235 -94
  603. package/dist/core/types/deployment.d.ts.map +1 -1
  604. package/dist/core/types/deployment.js +1 -40
  605. package/dist/core/types/deployment.js.map +1 -1
  606. package/dist/core/types/index.d.ts +6 -10
  607. package/dist/core/types/index.d.ts.map +1 -1
  608. package/dist/core/types/index.js +32 -4
  609. package/dist/core/types/index.js.map +1 -1
  610. package/dist/core/types/kubernetes.d.ts +226 -16
  611. package/dist/core/types/kubernetes.d.ts.map +1 -1
  612. package/dist/core/types/kubernetes.js +11 -1
  613. package/dist/core/types/kubernetes.js.map +1 -1
  614. package/dist/core/types/references.d.ts +27 -1
  615. package/dist/core/types/references.d.ts.map +1 -1
  616. package/dist/core/types/references.js +3 -2
  617. package/dist/core/types/references.js.map +1 -1
  618. package/dist/core/types/resource-graph.d.ts +9 -33
  619. package/dist/core/types/resource-graph.d.ts.map +1 -1
  620. package/dist/core/types/resource-graph.js +2 -2
  621. package/dist/core/types/schema.d.ts +51 -0
  622. package/dist/core/types/schema.d.ts.map +1 -0
  623. package/dist/core/types/schema.js +9 -0
  624. package/dist/core/types/schema.js.map +1 -0
  625. package/dist/core/types/serialization.d.ts +104 -45
  626. package/dist/core/types/serialization.d.ts.map +1 -1
  627. package/dist/core/types/yaml.d.ts +0 -24
  628. package/dist/core/types/yaml.d.ts.map +1 -1
  629. package/dist/core/validation/cel-validator.d.ts +5 -5
  630. package/dist/core/validation/cel-validator.d.ts.map +1 -1
  631. package/dist/core/validation/cel-validator.js +35 -11
  632. package/dist/core/validation/cel-validator.js.map +1 -1
  633. package/dist/core/yaml/path-resolver.d.ts +21 -6
  634. package/dist/core/yaml/path-resolver.d.ts.map +1 -1
  635. package/dist/core/yaml/path-resolver.js +404 -38
  636. package/dist/core/yaml/path-resolver.js.map +1 -1
  637. package/dist/factories/apisix/compositions/apisix-bootstrap.d.ts +19 -15
  638. package/dist/factories/apisix/compositions/apisix-bootstrap.d.ts.map +1 -1
  639. package/dist/factories/apisix/compositions/apisix-bootstrap.js +99 -112
  640. package/dist/factories/apisix/compositions/apisix-bootstrap.js.map +1 -1
  641. package/dist/factories/apisix/resources/helm.d.ts +8 -8
  642. package/dist/factories/apisix/resources/helm.d.ts.map +1 -1
  643. package/dist/factories/apisix/resources/helm.js +20 -47
  644. package/dist/factories/apisix/resources/helm.js.map +1 -1
  645. package/dist/factories/apisix/types.d.ts +35 -2
  646. package/dist/factories/apisix/types.d.ts.map +1 -1
  647. package/dist/factories/apisix/types.js.map +1 -1
  648. package/dist/factories/apisix/utils/admin-credentials.d.ts +43 -0
  649. package/dist/factories/apisix/utils/admin-credentials.d.ts.map +1 -0
  650. package/dist/factories/apisix/utils/admin-credentials.js +82 -0
  651. package/dist/factories/apisix/utils/admin-credentials.js.map +1 -0
  652. package/dist/factories/apisix/utils/helm-values-mapper.d.ts.map +1 -1
  653. package/dist/factories/apisix/utils/helm-values-mapper.js +33 -35
  654. package/dist/factories/apisix/utils/helm-values-mapper.js.map +1 -1
  655. package/dist/factories/apisix/utils/index.d.ts +1 -0
  656. package/dist/factories/apisix/utils/index.d.ts.map +1 -1
  657. package/dist/factories/apisix/utils/index.js +1 -0
  658. package/dist/factories/apisix/utils/index.js.map +1 -1
  659. package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.d.ts +2 -2
  660. package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.d.ts.map +1 -1
  661. package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.js +49 -63
  662. package/dist/factories/cert-manager/compositions/cert-manager-bootstrap.js.map +1 -1
  663. package/dist/factories/cert-manager/resources/certificates.d.ts.map +1 -1
  664. package/dist/factories/cert-manager/resources/certificates.js +12 -47
  665. package/dist/factories/cert-manager/resources/certificates.js.map +1 -1
  666. package/dist/factories/cert-manager/resources/helm.d.ts +2 -22
  667. package/dist/factories/cert-manager/resources/helm.d.ts.map +1 -1
  668. package/dist/factories/cert-manager/resources/helm.js +30 -167
  669. package/dist/factories/cert-manager/resources/helm.js.map +1 -1
  670. package/dist/factories/cert-manager/resources/issuers.d.ts.map +1 -1
  671. package/dist/factories/cert-manager/resources/issuers.js +9 -104
  672. package/dist/factories/cert-manager/resources/issuers.js.map +1 -1
  673. package/dist/factories/cert-manager/types.d.ts +5 -78
  674. package/dist/factories/cert-manager/types.d.ts.map +1 -1
  675. package/dist/factories/cert-manager/types.js +2 -22
  676. package/dist/factories/cert-manager/types.js.map +1 -1
  677. package/dist/factories/cert-manager/utils/helm-values-mapper.d.ts +8 -4
  678. package/dist/factories/cert-manager/utils/helm-values-mapper.d.ts.map +1 -1
  679. package/dist/factories/cert-manager/utils/helm-values-mapper.js +55 -56
  680. package/dist/factories/cert-manager/utils/helm-values-mapper.js.map +1 -1
  681. package/dist/factories/cert-manager/utils/index.d.ts +1 -1
  682. package/dist/factories/cert-manager/utils/index.d.ts.map +1 -1
  683. package/dist/factories/cert-manager/utils/index.js +1 -1
  684. package/dist/factories/cert-manager/utils/index.js.map +1 -1
  685. package/dist/factories/cilium/compositions/cilium-bootstrap.d.ts +3 -3
  686. package/dist/factories/cilium/compositions/cilium-bootstrap.d.ts.map +1 -1
  687. package/dist/factories/cilium/compositions/cilium-bootstrap.js +62 -34
  688. package/dist/factories/cilium/compositions/cilium-bootstrap.js.map +1 -1
  689. package/dist/factories/cilium/errors.d.ts +41 -0
  690. package/dist/factories/cilium/errors.d.ts.map +1 -0
  691. package/dist/factories/cilium/errors.js +75 -0
  692. package/dist/factories/cilium/errors.js.map +1 -0
  693. package/dist/factories/cilium/index.d.ts +1 -0
  694. package/dist/factories/cilium/index.d.ts.map +1 -1
  695. package/dist/factories/cilium/index.js +4 -0
  696. package/dist/factories/cilium/index.js.map +1 -1
  697. package/dist/factories/cilium/resources/gateway.d.ts.map +1 -1
  698. package/dist/factories/cilium/resources/gateway.js +3 -5
  699. package/dist/factories/cilium/resources/gateway.js.map +1 -1
  700. package/dist/factories/cilium/resources/helm.d.ts +2 -2
  701. package/dist/factories/cilium/resources/helm.d.ts.map +1 -1
  702. package/dist/factories/cilium/resources/helm.js +8 -16
  703. package/dist/factories/cilium/resources/helm.js.map +1 -1
  704. package/dist/factories/cilium/resources/index.d.ts +1 -5
  705. package/dist/factories/cilium/resources/index.d.ts.map +1 -1
  706. package/dist/factories/cilium/resources/index.js +4 -20
  707. package/dist/factories/cilium/resources/index.js.map +1 -1
  708. package/dist/factories/cilium/resources/networking.d.ts +9 -13
  709. package/dist/factories/cilium/resources/networking.d.ts.map +1 -1
  710. package/dist/factories/cilium/resources/networking.js +152 -251
  711. package/dist/factories/cilium/resources/networking.js.map +1 -1
  712. package/dist/factories/cilium/types.d.ts +3 -47
  713. package/dist/factories/cilium/types.d.ts.map +1 -1
  714. package/dist/factories/cilium/types.js +2 -71
  715. package/dist/factories/cilium/types.js.map +1 -1
  716. package/dist/factories/external-dns/compositions/external-dns-bootstrap.d.ts +1 -1
  717. package/dist/factories/external-dns/compositions/external-dns-bootstrap.d.ts.map +1 -1
  718. package/dist/factories/external-dns/compositions/external-dns-bootstrap.js +5 -11
  719. package/dist/factories/external-dns/compositions/external-dns-bootstrap.js.map +1 -1
  720. package/dist/factories/external-dns/resources/helm.d.ts +2 -2
  721. package/dist/factories/external-dns/resources/helm.d.ts.map +1 -1
  722. package/dist/factories/external-dns/resources/helm.js +66 -61
  723. package/dist/factories/external-dns/resources/helm.js.map +1 -1
  724. package/dist/factories/external-dns/types.d.ts +2 -2
  725. package/dist/factories/external-dns/types.d.ts.map +1 -1
  726. package/dist/factories/external-dns/types.js.map +1 -1
  727. package/dist/factories/flux/git-repository.d.ts +12 -2
  728. package/dist/factories/flux/git-repository.d.ts.map +1 -1
  729. package/dist/factories/flux/git-repository.js +33 -0
  730. package/dist/factories/flux/git-repository.js.map +1 -1
  731. package/dist/factories/flux/kustomize/kustomization.d.ts +2 -0
  732. package/dist/factories/flux/kustomize/kustomization.d.ts.map +1 -1
  733. package/dist/factories/flux/kustomize/kustomization.js.map +1 -1
  734. package/dist/factories/flux/kustomize/readiness-evaluators.d.ts +1 -1
  735. package/dist/factories/flux/kustomize/readiness-evaluators.d.ts.map +1 -1
  736. package/dist/factories/flux/kustomize/readiness-evaluators.js +3 -1
  737. package/dist/factories/flux/kustomize/readiness-evaluators.js.map +1 -1
  738. package/dist/factories/helm/helm-release.d.ts +13 -0
  739. package/dist/factories/helm/helm-release.d.ts.map +1 -1
  740. package/dist/factories/helm/helm-release.js +35 -16
  741. package/dist/factories/helm/helm-release.js.map +1 -1
  742. package/dist/factories/helm/helm-repository.d.ts +26 -1
  743. package/dist/factories/helm/helm-repository.d.ts.map +1 -1
  744. package/dist/factories/helm/helm-repository.js +30 -17
  745. package/dist/factories/helm/helm-repository.js.map +1 -1
  746. package/dist/factories/helm/index.d.ts +10 -4
  747. package/dist/factories/helm/index.d.ts.map +1 -1
  748. package/dist/factories/helm/index.js +10 -4
  749. package/dist/factories/helm/index.js.map +1 -1
  750. package/dist/factories/helm/readiness-evaluators.d.ts +21 -8
  751. package/dist/factories/helm/readiness-evaluators.d.ts.map +1 -1
  752. package/dist/factories/helm/readiness-evaluators.js +98 -82
  753. package/dist/factories/helm/readiness-evaluators.js.map +1 -1
  754. package/dist/factories/helm/types.d.ts +13 -0
  755. package/dist/factories/helm/types.d.ts.map +1 -1
  756. package/dist/factories/index.d.ts +7 -8
  757. package/dist/factories/index.d.ts.map +1 -1
  758. package/dist/factories/index.js +24 -20
  759. package/dist/factories/index.js.map +1 -1
  760. package/dist/factories/kro/kro-crd.d.ts.map +1 -1
  761. package/dist/factories/kro/kro-crd.js +3 -2
  762. package/dist/factories/kro/kro-crd.js.map +1 -1
  763. package/dist/factories/kro/kro-custom-resource.d.ts.map +1 -1
  764. package/dist/factories/kro/kro-custom-resource.js +3 -2
  765. package/dist/factories/kro/kro-custom-resource.js.map +1 -1
  766. package/dist/factories/kro/resource-graph-definition.d.ts +29 -1
  767. package/dist/factories/kro/resource-graph-definition.d.ts.map +1 -1
  768. package/dist/factories/kro/resource-graph-definition.js +26 -8
  769. package/dist/factories/kro/resource-graph-definition.js.map +1 -1
  770. package/dist/factories/kubernetes/admission/mutating-webhook-configuration.d.ts +3 -2
  771. package/dist/factories/kubernetes/admission/mutating-webhook-configuration.d.ts.map +1 -1
  772. package/dist/factories/kubernetes/admission/mutating-webhook-configuration.js +3 -2
  773. package/dist/factories/kubernetes/admission/mutating-webhook-configuration.js.map +1 -1
  774. package/dist/factories/kubernetes/admission/validating-webhook-configuration.d.ts +3 -2
  775. package/dist/factories/kubernetes/admission/validating-webhook-configuration.d.ts.map +1 -1
  776. package/dist/factories/kubernetes/admission/validating-webhook-configuration.js +3 -2
  777. package/dist/factories/kubernetes/admission/validating-webhook-configuration.js.map +1 -1
  778. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.d.ts +3 -1
  779. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.d.ts.map +1 -1
  780. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler-v1.js.map +1 -1
  781. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.d.ts +3 -1
  782. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.d.ts.map +1 -1
  783. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js +2 -1
  784. package/dist/factories/kubernetes/autoscaling/horizontal-pod-autoscaler.js.map +1 -1
  785. package/dist/factories/kubernetes/certificates/certificate-signing-request.d.ts +3 -1
  786. package/dist/factories/kubernetes/certificates/certificate-signing-request.d.ts.map +1 -1
  787. package/dist/factories/kubernetes/certificates/certificate-signing-request.js.map +1 -1
  788. package/dist/factories/kubernetes/config/config-map.d.ts +14 -1
  789. package/dist/factories/kubernetes/config/config-map.d.ts.map +1 -1
  790. package/dist/factories/kubernetes/config/config-map.js +21 -7
  791. package/dist/factories/kubernetes/config/config-map.js.map +1 -1
  792. package/dist/factories/kubernetes/config/secret.d.ts +17 -0
  793. package/dist/factories/kubernetes/config/secret.d.ts.map +1 -1
  794. package/dist/factories/kubernetes/config/secret.js +27 -7
  795. package/dist/factories/kubernetes/config/secret.js.map +1 -1
  796. package/dist/factories/kubernetes/coordination/lease.d.ts +3 -1
  797. package/dist/factories/kubernetes/coordination/lease.d.ts.map +1 -1
  798. package/dist/factories/kubernetes/coordination/lease.js +2 -1
  799. package/dist/factories/kubernetes/coordination/lease.js.map +1 -1
  800. package/dist/factories/kubernetes/core/component-status.d.ts +3 -1
  801. package/dist/factories/kubernetes/core/component-status.d.ts.map +1 -1
  802. package/dist/factories/kubernetes/core/component-status.js.map +1 -1
  803. package/dist/factories/kubernetes/core/namespace.d.ts +10 -0
  804. package/dist/factories/kubernetes/core/namespace.d.ts.map +1 -1
  805. package/dist/factories/kubernetes/core/namespace.js +13 -2
  806. package/dist/factories/kubernetes/core/namespace.js.map +1 -1
  807. package/dist/factories/kubernetes/core/node.d.ts +3 -1
  808. package/dist/factories/kubernetes/core/node.d.ts.map +1 -1
  809. package/dist/factories/kubernetes/core/node.js.map +1 -1
  810. package/dist/factories/kubernetes/core/pod.d.ts +3 -1
  811. package/dist/factories/kubernetes/core/pod.d.ts.map +1 -1
  812. package/dist/factories/kubernetes/core/pod.js +2 -1
  813. package/dist/factories/kubernetes/core/pod.js.map +1 -1
  814. package/dist/factories/kubernetes/extensions/custom-resource-definition.d.ts +3 -1
  815. package/dist/factories/kubernetes/extensions/custom-resource-definition.d.ts.map +1 -1
  816. package/dist/factories/kubernetes/extensions/custom-resource-definition.js.map +1 -1
  817. package/dist/factories/kubernetes/extensions/custom-resource.d.ts +1 -0
  818. package/dist/factories/kubernetes/extensions/custom-resource.d.ts.map +1 -1
  819. package/dist/factories/kubernetes/extensions/custom-resource.js +5 -1
  820. package/dist/factories/kubernetes/extensions/custom-resource.js.map +1 -1
  821. package/dist/factories/kubernetes/index.d.ts +0 -2
  822. package/dist/factories/kubernetes/index.d.ts.map +1 -1
  823. package/dist/factories/kubernetes/index.js +3 -8
  824. package/dist/factories/kubernetes/index.js.map +1 -1
  825. package/dist/factories/kubernetes/networking/endpoint-slice.d.ts +3 -1
  826. package/dist/factories/kubernetes/networking/endpoint-slice.d.ts.map +1 -1
  827. package/dist/factories/kubernetes/networking/endpoint-slice.js.map +1 -1
  828. package/dist/factories/kubernetes/networking/endpoints.d.ts +3 -1
  829. package/dist/factories/kubernetes/networking/endpoints.d.ts.map +1 -1
  830. package/dist/factories/kubernetes/networking/endpoints.js +3 -2
  831. package/dist/factories/kubernetes/networking/endpoints.js.map +1 -1
  832. package/dist/factories/kubernetes/networking/ingress-class.d.ts +3 -1
  833. package/dist/factories/kubernetes/networking/ingress-class.d.ts.map +1 -1
  834. package/dist/factories/kubernetes/networking/ingress-class.js +2 -7
  835. package/dist/factories/kubernetes/networking/ingress-class.js.map +1 -1
  836. package/dist/factories/kubernetes/networking/ingress.d.ts +15 -2
  837. package/dist/factories/kubernetes/networking/ingress.d.ts.map +1 -1
  838. package/dist/factories/kubernetes/networking/ingress.js +64 -11
  839. package/dist/factories/kubernetes/networking/ingress.js.map +1 -1
  840. package/dist/factories/kubernetes/networking/network-policy.d.ts +3 -1
  841. package/dist/factories/kubernetes/networking/network-policy.d.ts.map +1 -1
  842. package/dist/factories/kubernetes/networking/network-policy.js +2 -8
  843. package/dist/factories/kubernetes/networking/network-policy.js.map +1 -1
  844. package/dist/factories/kubernetes/networking/service.d.ts +14 -1
  845. package/dist/factories/kubernetes/networking/service.d.ts.map +1 -1
  846. package/dist/factories/kubernetes/networking/service.js +22 -2
  847. package/dist/factories/kubernetes/networking/service.js.map +1 -1
  848. package/dist/factories/kubernetes/policy/limit-range.d.ts +3 -1
  849. package/dist/factories/kubernetes/policy/limit-range.d.ts.map +1 -1
  850. package/dist/factories/kubernetes/policy/limit-range.js +2 -8
  851. package/dist/factories/kubernetes/policy/limit-range.js.map +1 -1
  852. package/dist/factories/kubernetes/policy/pod-disruption-budget.d.ts +3 -1
  853. package/dist/factories/kubernetes/policy/pod-disruption-budget.d.ts.map +1 -1
  854. package/dist/factories/kubernetes/policy/pod-disruption-budget.js +3 -2
  855. package/dist/factories/kubernetes/policy/pod-disruption-budget.js.map +1 -1
  856. package/dist/factories/kubernetes/policy/resource-quota.d.ts +3 -1
  857. package/dist/factories/kubernetes/policy/resource-quota.d.ts.map +1 -1
  858. package/dist/factories/kubernetes/policy/resource-quota.js +3 -2
  859. package/dist/factories/kubernetes/policy/resource-quota.js.map +1 -1
  860. package/dist/factories/kubernetes/rbac/cluster-role-binding.d.ts +20 -1
  861. package/dist/factories/kubernetes/rbac/cluster-role-binding.d.ts.map +1 -1
  862. package/dist/factories/kubernetes/rbac/cluster-role-binding.js +19 -8
  863. package/dist/factories/kubernetes/rbac/cluster-role-binding.js.map +1 -1
  864. package/dist/factories/kubernetes/rbac/cluster-role.d.ts +3 -1
  865. package/dist/factories/kubernetes/rbac/cluster-role.d.ts.map +1 -1
  866. package/dist/factories/kubernetes/rbac/cluster-role.js +2 -8
  867. package/dist/factories/kubernetes/rbac/cluster-role.js.map +1 -1
  868. package/dist/factories/kubernetes/rbac/role-binding.d.ts +3 -1
  869. package/dist/factories/kubernetes/rbac/role-binding.d.ts.map +1 -1
  870. package/dist/factories/kubernetes/rbac/role-binding.js +2 -8
  871. package/dist/factories/kubernetes/rbac/role-binding.js.map +1 -1
  872. package/dist/factories/kubernetes/rbac/role.d.ts +3 -1
  873. package/dist/factories/kubernetes/rbac/role.d.ts.map +1 -1
  874. package/dist/factories/kubernetes/rbac/role.js +2 -8
  875. package/dist/factories/kubernetes/rbac/role.js.map +1 -1
  876. package/dist/factories/kubernetes/rbac/service-account.d.ts +3 -1
  877. package/dist/factories/kubernetes/rbac/service-account.d.ts.map +1 -1
  878. package/dist/factories/kubernetes/rbac/service-account.js +2 -8
  879. package/dist/factories/kubernetes/rbac/service-account.js.map +1 -1
  880. package/dist/factories/kubernetes/scheduling/priority-class.d.ts +3 -1
  881. package/dist/factories/kubernetes/scheduling/priority-class.d.ts.map +1 -1
  882. package/dist/factories/kubernetes/scheduling/priority-class.js +2 -7
  883. package/dist/factories/kubernetes/scheduling/priority-class.js.map +1 -1
  884. package/dist/factories/kubernetes/scheduling/runtime-class.d.ts +3 -2
  885. package/dist/factories/kubernetes/scheduling/runtime-class.d.ts.map +1 -1
  886. package/dist/factories/kubernetes/scheduling/runtime-class.js +2 -1
  887. package/dist/factories/kubernetes/scheduling/runtime-class.js.map +1 -1
  888. package/dist/factories/kubernetes/storage/csi-driver.d.ts +3 -1
  889. package/dist/factories/kubernetes/storage/csi-driver.d.ts.map +1 -1
  890. package/dist/factories/kubernetes/storage/csi-driver.js +2 -7
  891. package/dist/factories/kubernetes/storage/csi-driver.js.map +1 -1
  892. package/dist/factories/kubernetes/storage/csi-node.d.ts +3 -1
  893. package/dist/factories/kubernetes/storage/csi-node.d.ts.map +1 -1
  894. package/dist/factories/kubernetes/storage/csi-node.js +2 -1
  895. package/dist/factories/kubernetes/storage/csi-node.js.map +1 -1
  896. package/dist/factories/kubernetes/storage/persistent-volume-claim.d.ts +14 -1
  897. package/dist/factories/kubernetes/storage/persistent-volume-claim.d.ts.map +1 -1
  898. package/dist/factories/kubernetes/storage/persistent-volume-claim.js +13 -1
  899. package/dist/factories/kubernetes/storage/persistent-volume-claim.js.map +1 -1
  900. package/dist/factories/kubernetes/storage/persistent-volume.d.ts +3 -1
  901. package/dist/factories/kubernetes/storage/persistent-volume.d.ts.map +1 -1
  902. package/dist/factories/kubernetes/storage/persistent-volume.js +3 -2
  903. package/dist/factories/kubernetes/storage/persistent-volume.js.map +1 -1
  904. package/dist/factories/kubernetes/storage/storage-class.d.ts +3 -1
  905. package/dist/factories/kubernetes/storage/storage-class.d.ts.map +1 -1
  906. package/dist/factories/kubernetes/storage/storage-class.js +2 -8
  907. package/dist/factories/kubernetes/storage/storage-class.js.map +1 -1
  908. package/dist/factories/kubernetes/storage/volume-attachment.d.ts +3 -1
  909. package/dist/factories/kubernetes/storage/volume-attachment.d.ts.map +1 -1
  910. package/dist/factories/kubernetes/storage/volume-attachment.js +10 -0
  911. package/dist/factories/kubernetes/storage/volume-attachment.js.map +1 -1
  912. package/dist/factories/kubernetes/workloads/cron-job.d.ts +14 -1
  913. package/dist/factories/kubernetes/workloads/cron-job.d.ts.map +1 -1
  914. package/dist/factories/kubernetes/workloads/cron-job.js +14 -2
  915. package/dist/factories/kubernetes/workloads/cron-job.js.map +1 -1
  916. package/dist/factories/kubernetes/workloads/daemon-set.d.ts +14 -1
  917. package/dist/factories/kubernetes/workloads/daemon-set.d.ts.map +1 -1
  918. package/dist/factories/kubernetes/workloads/daemon-set.js +13 -1
  919. package/dist/factories/kubernetes/workloads/daemon-set.js.map +1 -1
  920. package/dist/factories/kubernetes/workloads/deployment.d.ts +14 -1
  921. package/dist/factories/kubernetes/workloads/deployment.d.ts.map +1 -1
  922. package/dist/factories/kubernetes/workloads/deployment.js +27 -2
  923. package/dist/factories/kubernetes/workloads/deployment.js.map +1 -1
  924. package/dist/factories/kubernetes/workloads/job.d.ts +14 -1
  925. package/dist/factories/kubernetes/workloads/job.d.ts.map +1 -1
  926. package/dist/factories/kubernetes/workloads/job.js +19 -2
  927. package/dist/factories/kubernetes/workloads/job.js.map +1 -1
  928. package/dist/factories/kubernetes/workloads/replica-set.d.ts +3 -1
  929. package/dist/factories/kubernetes/workloads/replica-set.d.ts.map +1 -1
  930. package/dist/factories/kubernetes/workloads/replica-set.js +2 -1
  931. package/dist/factories/kubernetes/workloads/replica-set.js.map +1 -1
  932. package/dist/factories/kubernetes/workloads/replication-controller.d.ts +3 -1
  933. package/dist/factories/kubernetes/workloads/replication-controller.d.ts.map +1 -1
  934. package/dist/factories/kubernetes/workloads/replication-controller.js +3 -2
  935. package/dist/factories/kubernetes/workloads/replication-controller.js.map +1 -1
  936. package/dist/factories/kubernetes/workloads/stateful-set.d.ts +14 -1
  937. package/dist/factories/kubernetes/workloads/stateful-set.d.ts.map +1 -1
  938. package/dist/factories/kubernetes/workloads/stateful-set.js +22 -2
  939. package/dist/factories/kubernetes/workloads/stateful-set.js.map +1 -1
  940. package/dist/factories/kubernetes/yaml/conflict-handler.d.ts +23 -0
  941. package/dist/factories/kubernetes/yaml/conflict-handler.d.ts.map +1 -0
  942. package/dist/factories/kubernetes/yaml/conflict-handler.js +83 -0
  943. package/dist/factories/kubernetes/yaml/conflict-handler.js.map +1 -0
  944. package/dist/factories/kubernetes/yaml/yaml-directory.d.ts +6 -11
  945. package/dist/factories/kubernetes/yaml/yaml-directory.d.ts.map +1 -1
  946. package/dist/factories/kubernetes/yaml/yaml-directory.js +10 -75
  947. package/dist/factories/kubernetes/yaml/yaml-directory.js.map +1 -1
  948. package/dist/factories/kubernetes/yaml/yaml-file.d.ts +42 -13
  949. package/dist/factories/kubernetes/yaml/yaml-file.d.ts.map +1 -1
  950. package/dist/factories/kubernetes/yaml/yaml-file.js +206 -99
  951. package/dist/factories/kubernetes/yaml/yaml-file.js.map +1 -1
  952. package/dist/factories/pebble/compositions/pebble-bootstrap.d.ts +1 -1
  953. package/dist/factories/pebble/compositions/pebble-bootstrap.d.ts.map +1 -1
  954. package/dist/factories/pebble/compositions/pebble-bootstrap.js +15 -17
  955. package/dist/factories/pebble/compositions/pebble-bootstrap.js.map +1 -1
  956. package/dist/factories/pebble/resources/helm.d.ts +2 -2
  957. package/dist/factories/pebble/resources/helm.d.ts.map +1 -1
  958. package/dist/factories/pebble/resources/helm.js +9 -28
  959. package/dist/factories/pebble/resources/helm.js.map +1 -1
  960. package/dist/factories/shared.d.ts +12 -71
  961. package/dist/factories/shared.d.ts.map +1 -1
  962. package/dist/factories/shared.js +10 -531
  963. package/dist/factories/shared.js.map +1 -1
  964. package/dist/factories/simple/autoscaling/horizontal-pod-autoscaler.d.ts +11 -0
  965. package/dist/factories/simple/autoscaling/horizontal-pod-autoscaler.d.ts.map +1 -1
  966. package/dist/factories/simple/autoscaling/horizontal-pod-autoscaler.js +12 -0
  967. package/dist/factories/simple/autoscaling/horizontal-pod-autoscaler.js.map +1 -1
  968. package/dist/factories/simple/compositions/web-service.d.ts +35 -0
  969. package/dist/factories/simple/compositions/web-service.d.ts.map +1 -0
  970. package/dist/{core/composition/composition.js → factories/simple/compositions/web-service.js} +15 -2
  971. package/dist/factories/simple/compositions/web-service.js.map +1 -0
  972. package/dist/factories/simple/config/config-map.d.ts +11 -0
  973. package/dist/factories/simple/config/config-map.d.ts.map +1 -1
  974. package/dist/factories/simple/config/config-map.js +11 -0
  975. package/dist/factories/simple/config/config-map.js.map +1 -1
  976. package/dist/factories/simple/config/secret.d.ts +11 -0
  977. package/dist/factories/simple/config/secret.d.ts.map +1 -1
  978. package/dist/factories/simple/config/secret.js +17 -3
  979. package/dist/factories/simple/config/secret.js.map +1 -1
  980. package/dist/factories/simple/helm/index.d.ts +10 -0
  981. package/dist/factories/simple/helm/index.d.ts.map +1 -1
  982. package/dist/factories/simple/helm/index.js +10 -0
  983. package/dist/factories/simple/helm/index.js.map +1 -1
  984. package/dist/factories/simple/index.d.ts +1 -1
  985. package/dist/factories/simple/networking/ingress.d.ts +14 -2
  986. package/dist/factories/simple/networking/ingress.d.ts.map +1 -1
  987. package/dist/factories/simple/networking/ingress.js +12 -0
  988. package/dist/factories/simple/networking/ingress.js.map +1 -1
  989. package/dist/factories/simple/networking/network-policy.d.ts +11 -1
  990. package/dist/factories/simple/networking/network-policy.d.ts.map +1 -1
  991. package/dist/factories/simple/networking/network-policy.js +10 -0
  992. package/dist/factories/simple/networking/network-policy.js.map +1 -1
  993. package/dist/factories/simple/networking/service.d.ts +10 -0
  994. package/dist/factories/simple/networking/service.d.ts.map +1 -1
  995. package/dist/factories/simple/networking/service.js +10 -0
  996. package/dist/factories/simple/networking/service.js.map +1 -1
  997. package/dist/factories/simple/storage/persistent-volume-claim.d.ts +10 -0
  998. package/dist/factories/simple/storage/persistent-volume-claim.d.ts.map +1 -1
  999. package/dist/factories/simple/storage/persistent-volume-claim.js +10 -0
  1000. package/dist/factories/simple/storage/persistent-volume-claim.js.map +1 -1
  1001. package/dist/factories/simple/storage/persistent-volume.d.ts +11 -0
  1002. package/dist/factories/simple/storage/persistent-volume.d.ts.map +1 -1
  1003. package/dist/factories/simple/storage/persistent-volume.js +12 -0
  1004. package/dist/factories/simple/storage/persistent-volume.js.map +1 -1
  1005. package/dist/factories/simple/types.d.ts +16 -0
  1006. package/dist/factories/simple/types.d.ts.map +1 -1
  1007. package/dist/factories/simple/workloads/cron-job.d.ts +10 -0
  1008. package/dist/factories/simple/workloads/cron-job.d.ts.map +1 -1
  1009. package/dist/factories/simple/workloads/cron-job.js +11 -0
  1010. package/dist/factories/simple/workloads/cron-job.js.map +1 -1
  1011. package/dist/factories/simple/workloads/daemon-set.d.ts +9 -0
  1012. package/dist/factories/simple/workloads/daemon-set.d.ts.map +1 -1
  1013. package/dist/factories/simple/workloads/daemon-set.js +9 -0
  1014. package/dist/factories/simple/workloads/daemon-set.js.map +1 -1
  1015. package/dist/factories/simple/workloads/deployment.d.ts +11 -1
  1016. package/dist/factories/simple/workloads/deployment.d.ts.map +1 -1
  1017. package/dist/factories/simple/workloads/deployment.js +19 -9
  1018. package/dist/factories/simple/workloads/deployment.js.map +1 -1
  1019. package/dist/factories/simple/workloads/job.d.ts +10 -0
  1020. package/dist/factories/simple/workloads/job.d.ts.map +1 -1
  1021. package/dist/factories/simple/workloads/job.js +11 -0
  1022. package/dist/factories/simple/workloads/job.js.map +1 -1
  1023. package/dist/factories/simple/workloads/stateful-set.d.ts +11 -0
  1024. package/dist/factories/simple/workloads/stateful-set.d.ts.map +1 -1
  1025. package/dist/factories/simple/workloads/stateful-set.js +12 -0
  1026. package/dist/factories/simple/workloads/stateful-set.js.map +1 -1
  1027. package/dist/factories/simple/yaml/index.d.ts +8 -0
  1028. package/dist/factories/simple/yaml/index.d.ts.map +1 -1
  1029. package/dist/factories/simple/yaml/index.js +8 -0
  1030. package/dist/factories/simple/yaml/index.js.map +1 -1
  1031. package/dist/index.d.ts +105 -6
  1032. package/dist/index.d.ts.map +1 -1
  1033. package/dist/index.js +115 -42
  1034. package/dist/index.js.map +1 -1
  1035. package/dist/shared/brands.d.ts +32 -0
  1036. package/dist/shared/brands.d.ts.map +1 -0
  1037. package/dist/shared/brands.js +32 -0
  1038. package/dist/shared/brands.js.map +1 -0
  1039. package/dist/utils/helpers.d.ts +31 -57
  1040. package/dist/utils/helpers.d.ts.map +1 -1
  1041. package/dist/utils/helpers.js +46 -494
  1042. package/dist/utils/helpers.js.map +1 -1
  1043. package/dist/utils/index.d.ts +5 -4
  1044. package/dist/utils/index.d.ts.map +1 -1
  1045. package/dist/utils/index.js +8 -6
  1046. package/dist/utils/index.js.map +1 -1
  1047. package/dist/utils/string.d.ts +31 -0
  1048. package/dist/utils/string.d.ts.map +1 -0
  1049. package/dist/utils/string.js +82 -0
  1050. package/dist/utils/string.js.map +1 -0
  1051. package/dist/utils/type-guards.d.ts +20 -11
  1052. package/dist/utils/type-guards.d.ts.map +1 -1
  1053. package/dist/utils/type-guards.js +78 -26
  1054. package/dist/utils/type-guards.js.map +1 -1
  1055. package/package.json +19 -13
  1056. package/dist/core/composition/composition.d.ts +0 -10
  1057. package/dist/core/composition/composition.d.ts.map +0 -1
  1058. package/dist/core/composition/composition.js.map +0 -1
  1059. package/dist/core/composition/typekro-runtime/index.d.ts +0 -3
  1060. package/dist/core/composition/typekro-runtime/index.d.ts.map +0 -1
  1061. package/dist/core/composition/typekro-runtime/index.js.map +0 -1
  1062. package/dist/core/composition/typekro-runtime/typekro-runtime.d.ts.map +0 -1
  1063. package/dist/core/composition/typekro-runtime/typekro-runtime.js +0 -165
  1064. package/dist/core/composition/typekro-runtime/typekro-runtime.js.map +0 -1
  1065. package/dist/core/composition/typekro-runtime/types.d.ts +0 -19
  1066. package/dist/core/composition/typekro-runtime/types.d.ts.map +0 -1
  1067. package/dist/core/composition/typekro-runtime/types.js.map +0 -1
  1068. package/dist/core/composition/types.d.ts +0 -27
  1069. package/dist/core/composition/types.d.ts.map +0 -1
  1070. package/dist/core/composition/types.js +0 -8
  1071. package/dist/core/composition/types.js.map +0 -1
  1072. package/dist/core/dependencies/type-guards.d.ts +0 -17
  1073. package/dist/core/dependencies/type-guards.d.ts.map +0 -1
  1074. package/dist/core/dependencies/type-guards.js +0 -40
  1075. package/dist/core/dependencies/type-guards.js.map +0 -1
  1076. package/dist/core/deployment/deployment-strategies.d.ts +0 -12
  1077. package/dist/core/deployment/deployment-strategies.d.ts.map +0 -1
  1078. package/dist/core/deployment/deployment-strategies.js +0 -11
  1079. package/dist/core/deployment/deployment-strategies.js.map +0 -1
  1080. package/dist/core/deployment/event-streamer.d.ts +0 -112
  1081. package/dist/core/deployment/event-streamer.d.ts.map +0 -1
  1082. package/dist/core/deployment/event-streamer.js +0 -348
  1083. package/dist/core/deployment/event-streamer.js.map +0 -1
  1084. package/dist/core/direct-deployment.d.ts +0 -8
  1085. package/dist/core/direct-deployment.d.ts.map +0 -1
  1086. package/dist/core/direct-deployment.js +0 -9
  1087. package/dist/core/direct-deployment.js.map +0 -1
  1088. package/dist/core/evaluation/cel-optimizer.d.ts.map +0 -1
  1089. package/dist/core/evaluation/cel-optimizer.js.map +0 -1
  1090. package/dist/core/expressions/analyzer.d.ts +0 -584
  1091. package/dist/core/expressions/analyzer.d.ts.map +0 -1
  1092. package/dist/core/expressions/analyzer.js +0 -2921
  1093. package/dist/core/expressions/analyzer.js.map +0 -1
  1094. package/dist/core/expressions/cache.d.ts.map +0 -1
  1095. package/dist/core/expressions/cache.js.map +0 -1
  1096. package/dist/core/expressions/cel-conversion-engine.d.ts.map +0 -1
  1097. package/dist/core/expressions/cel-conversion-engine.js.map +0 -1
  1098. package/dist/core/expressions/compile-time-validation.d.ts +0 -270
  1099. package/dist/core/expressions/compile-time-validation.d.ts.map +0 -1
  1100. package/dist/core/expressions/compile-time-validation.js.map +0 -1
  1101. package/dist/core/expressions/composition-integration.d.ts +0 -315
  1102. package/dist/core/expressions/composition-integration.d.ts.map +0 -1
  1103. package/dist/core/expressions/composition-integration.js +0 -944
  1104. package/dist/core/expressions/composition-integration.js.map +0 -1
  1105. package/dist/core/expressions/conditional-expression-processor.d.ts.map +0 -1
  1106. package/dist/core/expressions/conditional-expression-processor.js.map +0 -1
  1107. package/dist/core/expressions/conditional-integration.d.ts.map +0 -1
  1108. package/dist/core/expressions/conditional-integration.js.map +0 -1
  1109. package/dist/core/expressions/conditional-validation.d.ts +0 -181
  1110. package/dist/core/expressions/conditional-validation.d.ts.map +0 -1
  1111. package/dist/core/expressions/conditional-validation.js +0 -460
  1112. package/dist/core/expressions/conditional-validation.js.map +0 -1
  1113. package/dist/core/expressions/context-aware-generator.d.ts.map +0 -1
  1114. package/dist/core/expressions/context-aware-generator.js.map +0 -1
  1115. package/dist/core/expressions/context-detector.d.ts.map +0 -1
  1116. package/dist/core/expressions/context-detector.js.map +0 -1
  1117. package/dist/core/expressions/context-switcher.d.ts +0 -185
  1118. package/dist/core/expressions/context-switcher.d.ts.map +0 -1
  1119. package/dist/core/expressions/context-switcher.js +0 -515
  1120. package/dist/core/expressions/context-switcher.js.map +0 -1
  1121. package/dist/core/expressions/context-validator.d.ts.map +0 -1
  1122. package/dist/core/expressions/context-validator.js.map +0 -1
  1123. package/dist/core/expressions/custom-context-manager.d.ts +0 -194
  1124. package/dist/core/expressions/custom-context-manager.d.ts.map +0 -1
  1125. package/dist/core/expressions/custom-context-manager.js +0 -390
  1126. package/dist/core/expressions/custom-context-manager.js.map +0 -1
  1127. package/dist/core/expressions/expression-proxy.d.ts +0 -80
  1128. package/dist/core/expressions/expression-proxy.d.ts.map +0 -1
  1129. package/dist/core/expressions/expression-proxy.js +0 -227
  1130. package/dist/core/expressions/expression-proxy.js.map +0 -1
  1131. package/dist/core/expressions/factory-integration.d.ts.map +0 -1
  1132. package/dist/core/expressions/factory-integration.js.map +0 -1
  1133. package/dist/core/expressions/factory-pattern-handler.d.ts.map +0 -1
  1134. package/dist/core/expressions/factory-pattern-handler.js.map +0 -1
  1135. package/dist/core/expressions/field-hydration-processor.d.ts +0 -191
  1136. package/dist/core/expressions/field-hydration-processor.d.ts.map +0 -1
  1137. package/dist/core/expressions/field-hydration-processor.js +0 -561
  1138. package/dist/core/expressions/field-hydration-processor.js.map +0 -1
  1139. package/dist/core/expressions/imperative-analyzer.d.ts.map +0 -1
  1140. package/dist/core/expressions/imperative-analyzer.js.map +0 -1
  1141. package/dist/core/expressions/lazy-analysis.d.ts +0 -1128
  1142. package/dist/core/expressions/lazy-analysis.d.ts.map +0 -1
  1143. package/dist/core/expressions/lazy-analysis.js +0 -2443
  1144. package/dist/core/expressions/lazy-analysis.js.map +0 -1
  1145. package/dist/core/expressions/magic-assignable-analyzer.d.ts.map +0 -1
  1146. package/dist/core/expressions/magic-assignable-analyzer.js.map +0 -1
  1147. package/dist/core/expressions/magic-proxy-analyzer.d.ts.map +0 -1
  1148. package/dist/core/expressions/magic-proxy-analyzer.js.map +0 -1
  1149. package/dist/core/expressions/magic-proxy-detector.d.ts.map +0 -1
  1150. package/dist/core/expressions/magic-proxy-detector.js.map +0 -1
  1151. package/dist/core/expressions/migration-helpers.d.ts.map +0 -1
  1152. package/dist/core/expressions/migration-helpers.js.map +0 -1
  1153. package/dist/core/expressions/optionality-handler.d.ts +0 -503
  1154. package/dist/core/expressions/optionality-handler.d.ts.map +0 -1
  1155. package/dist/core/expressions/optionality-handler.js +0 -1306
  1156. package/dist/core/expressions/optionality-handler.js.map +0 -1
  1157. package/dist/core/expressions/parser.d.ts.map +0 -1
  1158. package/dist/core/expressions/parser.js.map +0 -1
  1159. package/dist/core/expressions/readiness-integration.d.ts +0 -119
  1160. package/dist/core/expressions/readiness-integration.d.ts.map +0 -1
  1161. package/dist/core/expressions/readiness-integration.js +0 -386
  1162. package/dist/core/expressions/readiness-integration.js.map +0 -1
  1163. package/dist/core/expressions/resource-analyzer.d.ts +0 -486
  1164. package/dist/core/expressions/resource-analyzer.d.ts.map +0 -1
  1165. package/dist/core/expressions/resource-analyzer.js +0 -1086
  1166. package/dist/core/expressions/resource-analyzer.js.map +0 -1
  1167. package/dist/core/expressions/resource-validation.d.ts.map +0 -1
  1168. package/dist/core/expressions/resource-validation.js +0 -552
  1169. package/dist/core/expressions/resource-validation.js.map +0 -1
  1170. package/dist/core/expressions/runtime-error-mapper.d.ts +0 -138
  1171. package/dist/core/expressions/runtime-error-mapper.d.ts.map +0 -1
  1172. package/dist/core/expressions/runtime-error-mapper.js +0 -412
  1173. package/dist/core/expressions/runtime-error-mapper.js.map +0 -1
  1174. package/dist/core/expressions/source-map.d.ts.map +0 -1
  1175. package/dist/core/expressions/source-map.js.map +0 -1
  1176. package/dist/core/expressions/status-builder-analyzer.d.ts +0 -353
  1177. package/dist/core/expressions/status-builder-analyzer.d.ts.map +0 -1
  1178. package/dist/core/expressions/status-builder-analyzer.js +0 -1311
  1179. package/dist/core/expressions/status-builder-analyzer.js.map +0 -1
  1180. package/dist/core/expressions/type-inference.d.ts.map +0 -1
  1181. package/dist/core/expressions/type-inference.js.map +0 -1
  1182. package/dist/core/expressions/type-safety.d.ts.map +0 -1
  1183. package/dist/core/expressions/type-safety.js.map +0 -1
  1184. package/dist/core/expressions/types.d.ts.map +0 -1
  1185. package/dist/core/expressions/types.js.map +0 -1
  1186. package/dist/core/factory.d.ts +0 -12
  1187. package/dist/core/factory.d.ts.map +0 -1
  1188. package/dist/core/factory.js +0 -13
  1189. package/dist/core/factory.js.map +0 -1
  1190. package/dist/core/readiness/cluster-state.d.ts +0 -229
  1191. package/dist/core/readiness/cluster-state.d.ts.map +0 -1
  1192. package/dist/core/readiness/cluster-state.js +0 -368
  1193. package/dist/core/readiness/cluster-state.js.map +0 -1
  1194. package/dist/core/scope/resolver.d.ts +0 -16
  1195. package/dist/core/scope/resolver.d.ts.map +0 -1
  1196. package/dist/core/scope/resolver.js +0 -45
  1197. package/dist/core/scope/resolver.js.map +0 -1
  1198. package/dist/core/types/factory-scope.d.ts +0 -42
  1199. package/dist/core/types/factory-scope.d.ts.map +0 -1
  1200. package/dist/core/types/factory-scope.js +0 -14
  1201. package/dist/core/types/factory-scope.js.map +0 -1
  1202. package/dist/core/utils/crd-patcher.d.ts.map +0 -1
  1203. package/dist/core/utils/crd-patcher.js +0 -198
  1204. package/dist/core/utils/crd-patcher.js.map +0 -1
  1205. package/dist/core/utils/crd-schema-fix.d.ts.map +0 -1
  1206. package/dist/core/utils/crd-schema-fix.js.map +0 -1
  1207. package/dist/core/utils/index.d.ts +0 -12
  1208. package/dist/core/utils/index.d.ts.map +0 -1
  1209. package/dist/core/utils/index.js +0 -12
  1210. package/dist/core/utils/index.js.map +0 -1
  1211. package/dist/core/utils/minimal-connection-reset-suppression.d.ts +0 -16
  1212. package/dist/core/utils/minimal-connection-reset-suppression.d.ts.map +0 -1
  1213. package/dist/core/utils/minimal-connection-reset-suppression.js +0 -72
  1214. package/dist/core/utils/minimal-connection-reset-suppression.js.map +0 -1
  1215. package/dist/core/utils/output-filter.d.ts +0 -16
  1216. package/dist/core/utils/output-filter.d.ts.map +0 -1
  1217. package/dist/core/utils/output-filter.js +0 -90
  1218. package/dist/core/utils/output-filter.js.map +0 -1
  1219. package/dist/core/utils/scoped-error-suppression.d.ts +0 -25
  1220. package/dist/core/utils/scoped-error-suppression.d.ts.map +0 -1
  1221. package/dist/core/utils/scoped-error-suppression.js +0 -226
  1222. package/dist/core/utils/scoped-error-suppression.js.map +0 -1
  1223. package/dist/core.d.ts +0 -30
  1224. package/dist/core.d.ts.map +0 -1
  1225. package/dist/core.js +0 -59
  1226. package/dist/core.js.map +0 -1
  1227. package/dist/factories/cilium/resources/bgp.d.ts +0 -10
  1228. package/dist/factories/cilium/resources/bgp.d.ts.map +0 -1
  1229. package/dist/factories/cilium/resources/bgp.js +0 -14
  1230. package/dist/factories/cilium/resources/bgp.js.map +0 -1
  1231. package/dist/factories/cilium/resources/load-balancer.d.ts +0 -9
  1232. package/dist/factories/cilium/resources/load-balancer.d.ts.map +0 -1
  1233. package/dist/factories/cilium/resources/load-balancer.js +0 -12
  1234. package/dist/factories/cilium/resources/load-balancer.js.map +0 -1
  1235. package/dist/factories/cilium/resources/observability.d.ts +0 -9
  1236. package/dist/factories/cilium/resources/observability.d.ts.map +0 -1
  1237. package/dist/factories/cilium/resources/observability.js +0 -11
  1238. package/dist/factories/cilium/resources/observability.js.map +0 -1
  1239. package/dist/factories/cilium/resources/security.d.ts +0 -10
  1240. package/dist/factories/cilium/resources/security.d.ts.map +0 -1
  1241. package/dist/factories/cilium/resources/security.js +0 -14
  1242. package/dist/factories/cilium/resources/security.js.map +0 -1
  1243. /package/dist/{core/composition → compositions}/typekro-runtime/index.js +0 -0
  1244. /package/dist/{core/composition → compositions}/typekro-runtime/types.js +0 -0
  1245. /package/dist/core/expressions/{source-map.d.ts → analysis/source-map.d.ts} +0 -0
  1246. /package/dist/core/expressions/{types.js → analysis/types.js} +0 -0
@@ -4,17 +4,23 @@
4
4
  * Orchestrates the deployment of Kubernetes resources directly to a cluster
5
5
  * without requiring the Kro controller, using in-process dependency resolution.
6
6
  */
7
- import { ensureReadinessEvaluator } from '../../utils/helpers.js';
7
+ import { DEFAULT_CRD_READY_TIMEOUT, DEFAULT_DEPLOYMENT_TIMEOUT, DEFAULT_READINESS_TIMEOUT, } from '../config/defaults.js';
8
8
  import { DependencyResolver } from '../dependencies/index.js';
9
- import { CircularDependencyError } from '../errors.js';
9
+ import { CircularDependencyError, ensureError, ResourceGraphFactoryError } from '../errors.js';
10
10
  import { createBunCompatibleKubernetesObjectApi } from '../kubernetes/index.js';
11
11
  import { getComponentLogger } from '../logging/index.js';
12
+ import { getResourceId as getResourceMetadataId } from '../metadata/index.js';
13
+ import { ensureReadinessEvaluator } from '../readiness/index.js';
12
14
  import { DeploymentMode, ReferenceResolver } from '../references/index.js';
13
- import { ResourceDeploymentError, ResourceConflictError, UnsupportedMediaTypeError } from '../types/deployment.js';
15
+ import { getResourceId } from '../resources/id.js';
16
+ import { analyzeClosureDependencies, integrateClosuresIntoPlan } from './closure-planner.js';
17
+ import { CRDManager } from './crd-manager.js';
14
18
  import { createDebugLoggerFromDeploymentOptions } from './debug-logger.js';
15
- import { ResourceReadinessChecker } from './readiness.js';
16
- import { StatusHydrator } from './status-hydrator.js';
17
19
  import { createEventMonitor } from './event-monitor.js';
20
+ import { ResourceReadinessChecker } from './readiness.js';
21
+ import { ReadinessWaiter } from './readiness-waiter.js';
22
+ import { ResourceApplier } from './resource-applier.js';
23
+ import { ResourceRollbackManager } from './rollback-manager.js';
18
24
  export class DirectDeploymentEngine {
19
25
  kubeClient;
20
26
  deploymentMode;
@@ -22,14 +28,17 @@ export class DirectDeploymentEngine {
22
28
  referenceResolver;
23
29
  k8sApi;
24
30
  readinessChecker;
25
- statusHydrator;
31
+ resourceApplier;
32
+ rollbackManager;
33
+ readinessWaiter;
26
34
  debugLogger;
27
35
  eventMonitor;
28
36
  deploymentState = new Map();
37
+ crdManager;
29
38
  readyResources = new Set(); // Track resources that are already ready
30
39
  activeAbortControllers = new Set(); // Track active abort controllers for cleanup
31
40
  logger = getComponentLogger('deployment-engine');
32
- constructor(kubeClient, k8sApi, referenceResolver, deploymentMode = DeploymentMode.DIRECT) {
41
+ constructor(kubeClient, k8sApi, referenceResolver, deploymentMode = DeploymentMode.DIRECT, httpTimeouts) {
33
42
  this.kubeClient = kubeClient;
34
43
  this.deploymentMode = deploymentMode;
35
44
  this.dependencyResolver = new DependencyResolver();
@@ -37,10 +46,17 @@ export class DirectDeploymentEngine {
37
46
  referenceResolver || new ReferenceResolver(kubeClient, this.deploymentMode, k8sApi);
38
47
  // Use createBunCompatibleKubernetesObjectApi which handles both Bun and Node.js
39
48
  // This works around Bun's fetch TLS issues (https://github.com/oven-sh/bun/issues/10642)
40
- this.k8sApi = k8sApi || createBunCompatibleKubernetesObjectApi(kubeClient);
49
+ // Pass HTTP timeout configuration if provided
50
+ this.k8sApi = k8sApi || createBunCompatibleKubernetesObjectApi(kubeClient, httpTimeouts);
41
51
  this.readinessChecker = new ResourceReadinessChecker(this.k8sApi);
42
- this.statusHydrator = new StatusHydrator(this.k8sApi);
43
- // this.eventFilter = createEventFilter();
52
+ this.resourceApplier = new ResourceApplier(this.k8sApi, this.referenceResolver, this.logger);
53
+ this.rollbackManager = new ResourceRollbackManager(this.k8sApi);
54
+ this.readinessWaiter = new ReadinessWaiter(this.k8sApi, this.readyResources, this.readinessChecker, this.logger, undefined, {
55
+ abortableDelay: this.abortableDelay.bind(this),
56
+ withAbortSignal: this.withAbortSignal.bind(this),
57
+ emitEvent: this.emitEvent.bind(this),
58
+ });
59
+ this.crdManager = new CRDManager(this.k8sApi, kubeClient, this.abortableDelay.bind(this), this.withAbortSignal.bind(this));
44
60
  // Set up callback to track ready resources
45
61
  this.readinessChecker.setOnResourceReady((resource) => {
46
62
  const resourceKey = `${resource.kind}/${resource.name}/${resource.namespace}`;
@@ -146,112 +162,11 @@ export class DirectDeploymentEngine {
146
162
  getKubernetesApi() {
147
163
  return this.k8sApi;
148
164
  }
149
- /**
150
- * Enhance a resource for evaluation by applying kind-specific logic
151
- * This allows generic evaluators to work correctly without needing special cases
152
- */
153
- enhanceResourceForEvaluation(resource, kind) {
154
- // For HelmRepository resources, handle OCI special case
155
- if (kind === 'HelmRepository') {
156
- const spec = resource.spec;
157
- const isOciRepository = spec?.type === 'oci';
158
- const hasBeenProcessed = resource.metadata?.generation && resource.metadata?.resourceVersion;
159
- // If it's an OCI repo without Ready condition, synthesize one
160
- // OCI repositories don't get status conditions from Flux, but they are functional
161
- // once they've been processed (have generation and resourceVersion)
162
- if (isOciRepository &&
163
- hasBeenProcessed &&
164
- !resource.status?.conditions?.some((c) => c.type === 'Ready')) {
165
- return {
166
- ...resource,
167
- status: {
168
- ...resource.status,
169
- conditions: [
170
- ...(resource.status?.conditions || []),
171
- {
172
- type: 'Ready',
173
- status: 'True',
174
- message: 'OCI repository is functional',
175
- reason: 'OciRepositoryProcessed',
176
- },
177
- ],
178
- },
179
- };
180
- }
181
- }
182
- return resource;
183
- }
184
165
  /**
185
166
  * Check if a deployed resource is ready using the factory-provided readiness evaluator
186
167
  */
187
168
  async isDeployedResourceReady(deployedResource) {
188
- try {
189
- // Check if the deployed resource has a factory-provided readiness evaluator
190
- const readinessEvaluator = deployedResource.manifest
191
- .readinessEvaluator;
192
- if (readinessEvaluator) {
193
- // Use the factory-provided readiness evaluator
194
- // Create a resource reference for the API call
195
- const resourceRef = {
196
- apiVersion: deployedResource.manifest.apiVersion || '',
197
- kind: deployedResource.kind,
198
- metadata: {
199
- name: deployedResource.name,
200
- namespace: deployedResource.namespace,
201
- },
202
- };
203
- // Get the live resource from the cluster
204
- // In the new API, methods return objects directly (no .body wrapper)
205
- const liveResource = await this.k8sApi.read(resourceRef);
206
- // Apply kind-specific enhancements before calling custom evaluator
207
- const enhancedResource = this.enhanceResourceForEvaluation(liveResource, deployedResource.kind);
208
- // Use the factory-provided readiness evaluator
209
- const result = readinessEvaluator(enhancedResource);
210
- let readinessResult;
211
- if (typeof result === 'boolean') {
212
- readinessResult = { ready: result };
213
- }
214
- else if (result && typeof result === 'object' && 'ready' in result) {
215
- readinessResult = result;
216
- }
217
- else {
218
- this.logger.warn('Readiness evaluator returned unexpected result', {
219
- resourceId: deployedResource.id,
220
- result,
221
- });
222
- readinessResult = { ready: false, reason: 'Invalid evaluator result' };
223
- }
224
- // Debug logging for readiness evaluation
225
- if (this.debugLogger) {
226
- this.debugLogger.logReadinessEvaluation(deployedResource, readinessEvaluator, readinessResult);
227
- }
228
- return readinessResult.ready;
229
- }
230
- else {
231
- // Fallback to generic readiness checker
232
- const resourceRef = {
233
- apiVersion: deployedResource.manifest.apiVersion || '',
234
- kind: deployedResource.kind,
235
- metadata: {
236
- name: deployedResource.name,
237
- namespace: deployedResource.namespace,
238
- },
239
- };
240
- // In the new API, methods return objects directly (no .body wrapper)
241
- const liveResource = await this.k8sApi.read(resourceRef);
242
- return this.readinessChecker.isResourceReady(liveResource);
243
- }
244
- }
245
- catch (error) {
246
- this.logger.debug('Failed to check resource readiness', {
247
- error: error,
248
- resourceId: deployedResource.id,
249
- kind: deployedResource.kind,
250
- name: deployedResource.name,
251
- namespace: deployedResource.namespace,
252
- });
253
- return false;
254
- }
169
+ return this.readinessWaiter.isDeployedResourceReady(deployedResource);
255
170
  }
256
171
  /**
257
172
  * Get all deployment states for health checking
@@ -263,318 +178,54 @@ export class DirectDeploymentEngine {
263
178
  * Deploy a resource graph to the Kubernetes cluster
264
179
  */
265
180
  async deploy(graph, options) {
181
+ // Delegate to deployWithClosures with no closures and a dummy spec.
182
+ // The closure integration code is a no-op when the closures map is empty.
183
+ return this.deployWithClosures(graph, {}, options, undefined);
184
+ }
185
+ /**
186
+ * Deploy a resource graph with deployment closures integrated into level-based execution
187
+ */
188
+ async deployWithClosures(graph, closures, options, spec, alchemyScope) {
266
189
  const deploymentId = this.generateDeploymentId();
267
190
  const startTime = Date.now();
268
191
  const deployedResources = [];
269
- // Create an AbortController for this deployment to enable proper cancellation
270
- const deploymentAbortController = this.createTrackedAbortController();
271
- const abortSignal = deploymentAbortController.signal;
272
- // Set up timeout-based abort if timeout is specified
273
- const timeout = options.timeout || 300000; // 5 minutes default
274
- const timeoutId = setTimeout(() => {
275
- this.logger.debug('Deployment timeout reached, aborting operations', {
276
- deploymentId,
277
- timeout,
278
- });
279
- deploymentAbortController.abort();
280
- }, timeout);
281
192
  const errors = [];
282
193
  const deploymentLogger = this.logger.child({
283
194
  deploymentId,
284
195
  resourceCount: graph.resources.length,
196
+ closureCount: Object.keys(closures).length,
197
+ });
198
+ const { abortController: deploymentAbortController, timeoutId } = this.setupDeploymentTimeout(deploymentId, options, deploymentLogger);
199
+ const abortSignal = deploymentAbortController.signal;
200
+ deploymentLogger.info(Object.keys(closures).length === 0
201
+ ? 'Starting deployment'
202
+ : 'Starting deployment with closures', {
203
+ options,
204
+ closures: Object.keys(closures),
285
205
  });
286
- deploymentLogger.info('Starting deployment', { options });
287
206
  try {
288
207
  this.emitEvent(options, {
289
208
  type: 'started',
290
- message: `Starting deployment of ${graph.resources.length} resources`,
209
+ message: `Starting deployment of ${graph.resources.length} resources and ${Object.keys(closures).length} closures`,
291
210
  timestamp: new Date(),
292
211
  });
293
- // 1. Validate no cycles in dependency graph
294
- deploymentLogger.debug('Validating dependency graph', {
295
- dependencyGraph: graph.dependencyGraph,
296
- });
297
- this.dependencyResolver.validateNoCycles(graph.dependencyGraph);
298
- // 2. Analyze deployment order and identify parallel stages
299
- deploymentLogger.debug('Analyzing deployment order for parallel execution');
300
- const deploymentPlan = this.dependencyResolver.analyzeDeploymentOrder(graph.dependencyGraph);
301
- deploymentLogger.debug('Deployment plan determined', {
302
- levels: deploymentPlan.levels.length,
303
- totalResources: deploymentPlan.totalResources,
304
- maxParallelism: deploymentPlan.maxParallelism,
305
- });
306
- // 3. Initialize and start event monitoring if enabled
307
- if (options.eventMonitoring?.enabled) {
308
- try {
309
- this.eventMonitor = createEventMonitor(this.kubeClient, {
310
- namespace: options.namespace || 'default',
311
- eventTypes: options.eventMonitoring.eventTypes || ['Warning', 'Error'],
312
- includeChildResources: options.eventMonitoring.includeChildResources ?? true,
313
- startTime: new Date(startTime),
314
- ...(options.progressCallback && { progressCallback: options.progressCallback }),
315
- });
316
- // Start monitoring immediately to capture all deployment events
317
- await this.eventMonitor.startMonitoring([]);
318
- deploymentLogger.debug('Event monitoring started for deployment');
319
- }
320
- catch (error) {
321
- deploymentLogger.warn('Failed to initialize event monitoring, continuing without it', error);
322
- }
323
- }
324
- // 3.1. Initialize debug logging if enabled
325
- if (options.debugLogging?.enabled) {
326
- this.debugLogger = createDebugLoggerFromDeploymentOptions(options);
327
- this.readinessChecker.setDebugLogger(this.debugLogger);
328
- deploymentLogger.debug('Debug logging initialized');
329
- }
330
- // 4. Create resolution context with resourceKeyMapping for cross-resource references
331
- // The resourceKeyMapping maps original resource IDs (like 'webappDeployment') to their manifests
332
- // This allows the reference resolver to find resources by their original IDs during deployment
333
- const resourceKeyMapping = new Map();
334
- for (const resource of graph.resources) {
335
- const manifest = resource.manifest;
336
- const originalResourceId = manifest.__resourceId;
337
- if (originalResourceId) {
338
- // Convert the Enhanced proxy to a plain object for reliable field extraction
339
- // The proxy's toJSON method returns a clean object without proxy behavior
340
- const plainManifest = typeof manifest.toJSON === 'function'
341
- ? manifest.toJSON()
342
- : JSON.parse(JSON.stringify(manifest));
343
- resourceKeyMapping.set(originalResourceId, plainManifest);
344
- deploymentLogger.debug('Added resource to resourceKeyMapping', {
345
- originalResourceId,
346
- kind: manifest.kind,
347
- name: manifest.metadata?.name,
348
- });
349
- }
350
- }
351
- const context = {
352
- deployedResources,
353
- kubeClient: this.kubeClient,
354
- resourceKeyMapping,
355
- ...(options.namespace && { namespace: options.namespace }),
356
- timeout: options.timeout || 30000,
357
- };
358
- // 5. Deploy resources in parallel stages
359
- for (let levelIndex = 0; levelIndex < deploymentPlan.levels.length; levelIndex++) {
360
- const currentLevel = deploymentPlan.levels[levelIndex];
212
+ // Validate, plan, initialize monitoring, and build resolution context
213
+ const { enhancedPlan, context, resourceKeyMapping } = await this.validateAndPlanDeployment(graph, closures, spec, options, startTime, deployedResources, deploymentLogger);
214
+ // Deploy resources and closures level by level with proper dependency handling
215
+ for (let levelIndex = 0; levelIndex < enhancedPlan.levels.length; levelIndex++) {
216
+ const currentLevel = enhancedPlan.levels[levelIndex];
361
217
  if (!currentLevel) {
362
218
  continue;
363
219
  }
364
- const levelLogger = deploymentLogger.child({
365
- level: levelIndex + 1,
366
- resourceCount: currentLevel.length,
367
- });
368
- levelLogger.debug(`Deploying level ${levelIndex + 1} with ${currentLevel.length} resources in parallel`);
369
- // Track performance metrics for this level
370
- const levelStartTime = Date.now();
371
- // Deploy all resources in this level in parallel
372
- const levelPromises = currentLevel.map(async (resourceId) => {
373
- const resourceLogger = deploymentLogger.child({ resourceId });
374
- resourceLogger.debug('Starting resource deployment');
375
- const resource = graph.resources.find((r) => r.id === resourceId);
376
- if (!resource) {
377
- resourceLogger.error('Resource not found in graph');
378
- const error = new Error(`Resource with id '${resourceId}' not found in graph`);
379
- return {
380
- success: false,
381
- resourceId,
382
- error: {
383
- resourceId,
384
- phase: 'validation',
385
- error,
386
- timestamp: new Date(),
387
- },
388
- };
389
- }
390
- resourceLogger.debug('Found resource in graph', {
391
- resourceId: resource.id,
392
- kind: resource.manifest?.kind,
393
- name: resource.manifest?.metadata?.name,
394
- });
395
- try {
396
- resourceLogger.debug('Calling deploySingleResource');
397
- // Wait for CRD establishment if this is a custom resource
398
- await this.waitForCRDIfCustomResource(resource.manifest, options, resourceLogger, abortSignal);
399
- // FIX: Unconditionally ensure the readiness evaluator is attached just before deployment.
400
- const resourceWithEvaluator = ensureReadinessEvaluator(resource.manifest);
401
- // Add resource to event monitoring before deployment to capture creation events
402
- if (this.eventMonitor) {
403
- const preDeployedResource = {
404
- id: resourceId,
405
- kind: resourceWithEvaluator.kind,
406
- name: resourceWithEvaluator.metadata?.name || 'unknown',
407
- namespace: resourceWithEvaluator.metadata?.namespace || options.namespace || 'default',
408
- manifest: resourceWithEvaluator,
409
- status: 'deployed',
410
- deployedAt: new Date(),
411
- };
412
- try {
413
- await this.eventMonitor.addResources([preDeployedResource]);
414
- resourceLogger.debug('Added resource to event monitoring before deployment');
415
- }
416
- catch (error) {
417
- resourceLogger.warn('Failed to add resource to event monitoring, continuing deployment', error);
418
- }
419
- }
420
- const deployedResource = await this.deploySingleResource(resourceWithEvaluator, context, options, abortSignal);
421
- resourceLogger.debug('Resource deployed successfully');
422
- return {
423
- success: true,
424
- resourceId,
425
- deployedResource,
426
- };
427
- }
428
- catch (error) {
429
- resourceLogger.error('Resource deployment failed', error);
430
- const failedResource = {
431
- id: resourceId,
432
- kind: resource.manifest.kind,
433
- name: resource.manifest.metadata?.name || 'unknown',
434
- namespace: resource.manifest.metadata?.namespace || 'default',
435
- manifest: resource.manifest,
436
- status: 'failed',
437
- deployedAt: new Date(),
438
- error: error,
439
- };
440
- return {
441
- success: false,
442
- resourceId,
443
- deployedResource: failedResource,
444
- error: {
445
- resourceId,
446
- phase: 'deployment',
447
- error: error,
448
- timestamp: new Date(),
449
- },
450
- };
451
- }
452
- });
453
- // Wait for all resources in this level to complete
454
- const levelResults = await Promise.allSettled(levelPromises);
455
- // Process results and handle errors
456
- let levelHasFailures = false;
457
- for (const result of levelResults) {
458
- if (result.status === 'fulfilled') {
459
- const deploymentResult = result.value;
460
- if (deploymentResult.success && deploymentResult.deployedResource) {
461
- deployedResources.push(deploymentResult.deployedResource);
462
- // Update resourceKeyMapping with the live resource from the cluster (including status)
463
- // This is critical for CEL expression evaluation which needs access to resource status
464
- const deployedRes = deploymentResult.deployedResource;
465
- const manifestWithId = deployedRes.manifest;
466
- const originalResourceId = manifestWithId.__resourceId;
467
- if (originalResourceId && resourceKeyMapping.has(originalResourceId)) {
468
- try {
469
- // Query the live resource from the cluster to get its current status
470
- const liveResource = await this.k8sApi.read({
471
- apiVersion: deployedRes.manifest.apiVersion || '',
472
- kind: deployedRes.kind,
473
- metadata: {
474
- name: deployedRes.name,
475
- namespace: deployedRes.namespace,
476
- },
477
- });
478
- resourceKeyMapping.set(originalResourceId, liveResource);
479
- deploymentLogger.debug('Updated resourceKeyMapping with live resource status', {
480
- originalResourceId,
481
- kind: deployedRes.kind,
482
- name: deployedRes.name,
483
- hasStatus: !!liveResource.status,
484
- });
485
- }
486
- catch (error) {
487
- deploymentLogger.warn('Failed to update resourceKeyMapping with live resource', {
488
- originalResourceId,
489
- error: error instanceof Error ? error.message : String(error),
490
- });
491
- }
492
- }
493
- }
494
- else {
495
- levelHasFailures = true;
496
- if (deploymentResult.error) {
497
- errors.push(deploymentResult.error);
498
- }
499
- if (deploymentResult.deployedResource) {
500
- deployedResources.push(deploymentResult.deployedResource);
501
- }
502
- }
503
- }
504
- else {
505
- // Promise was rejected
506
- levelHasFailures = true;
507
- levelLogger.error('Unexpected promise rejection in parallel deployment', result.reason);
508
- }
509
- }
510
- // Resources are now added to event monitoring before deployment (see individual resource deployment above)
511
- // Handle rollback if there are failures and rollback is enabled
512
- if (levelHasFailures && options.rollbackOnFailure) {
513
- levelLogger.warn('Level deployment failed, initiating rollback');
514
- await this.rollbackDeployedResources(deployedResources, options);
515
- const duration = Date.now() - startTime;
516
- this.emitEvent(options, {
517
- type: 'rollback',
518
- message: `Deployment failed and rolled back in ${duration}ms`,
519
- timestamp: new Date(),
520
- });
521
- return {
522
- deploymentId,
523
- resources: deployedResources,
524
- dependencyGraph: graph.dependencyGraph,
525
- duration,
526
- status: 'failed',
527
- errors,
528
- };
220
+ const earlyReturn = await this.deployLevel(levelIndex, currentLevel, graph, deployedResources, errors, context, resourceKeyMapping, options, alchemyScope, abortSignal, startTime, deploymentId, deploymentLogger);
221
+ // If deployLevel returned a result, it means rollback occurred — return immediately
222
+ if (earlyReturn) {
223
+ await this.cleanupDeployment(deploymentAbortController, timeoutId, deploymentLogger);
224
+ return earlyReturn;
529
225
  }
530
- // Calculate level performance metrics
531
- const levelDuration = Date.now() - levelStartTime;
532
- const successfulCount = levelResults.filter((r) => r.status === 'fulfilled' && r.value.success).length;
533
- const failedCount = levelResults.filter((r) => r.status === 'rejected' || (r.status === 'fulfilled' && !r.value.success)).length;
534
- levelLogger.info(`Level ${levelIndex + 1} deployment completed`, {
535
- successful: successfulCount,
536
- failed: failedCount,
537
- duration: levelDuration,
538
- parallelism: currentLevel.length,
539
- averageTimePerResource: Math.round(levelDuration / currentLevel.length),
540
- });
541
226
  }
542
- const duration = Date.now() - startTime;
543
- const successfulResources = deployedResources.filter((r) => r.status !== 'failed');
544
- const status = errors.length === 0 ? 'success' : successfulResources.length > 0 ? 'partial' : 'failed';
545
- // Log comprehensive performance metrics
546
- deploymentLogger.info('Parallel deployment performance metrics', {
547
- totalDuration: duration,
548
- totalResources: deploymentPlan.totalResources,
549
- parallelLevels: deploymentPlan.levels.length,
550
- maxParallelism: deploymentPlan.maxParallelism,
551
- averageTimePerResource: Math.round(duration / deploymentPlan.totalResources),
552
- successfulResources: successfulResources.length,
553
- failedResources: errors.length,
554
- parallelismEfficiency: Math.round((deploymentPlan.totalResources /
555
- deploymentPlan.levels.length /
556
- deploymentPlan.maxParallelism) *
557
- 100),
558
- status,
559
- });
560
- this.emitEvent(options, {
561
- type: status === 'success' ? 'completed' : 'failed',
562
- message: `Deployment ${status} in ${duration}ms (${deploymentPlan.levels.length} parallel levels, max ${deploymentPlan.maxParallelism} concurrent)`,
563
- timestamp: new Date(),
564
- });
565
- // Stop event monitoring
566
- if (this.eventMonitor) {
567
- try {
568
- await this.eventMonitor.stopMonitoring();
569
- deploymentLogger.debug('Event monitoring stopped');
570
- }
571
- catch (error) {
572
- deploymentLogger.warn('Failed to stop event monitoring cleanly', error);
573
- }
574
- }
575
- // Clean up abort controller and timeout
576
- clearTimeout(timeoutId);
577
- this.removeTrackedAbortController(deploymentAbortController);
227
+ const result = this.buildDeploymentResult(deploymentId, graph, enhancedPlan, deployedResources, errors, startTime, options, deploymentLogger);
228
+ await this.cleanupDeployment(deploymentAbortController, timeoutId, deploymentLogger);
578
229
  // Store deployment state for rollback
579
230
  this.deploymentState.set(deploymentId, {
580
231
  deploymentId,
@@ -582,45 +233,31 @@ export class DirectDeploymentEngine {
582
233
  dependencyGraph: graph.dependencyGraph,
583
234
  startTime: new Date(startTime),
584
235
  endTime: new Date(),
585
- status: status === 'success' ? 'completed' : status === 'partial' ? 'completed' : 'failed',
236
+ status: result.status === 'success'
237
+ ? 'completed'
238
+ : result.status === 'partial'
239
+ ? 'completed'
240
+ : 'failed',
586
241
  options,
587
242
  });
588
- return {
589
- deploymentId,
590
- resources: deployedResources,
591
- dependencyGraph: graph.dependencyGraph,
592
- duration,
593
- status,
594
- errors,
595
- };
243
+ return result;
596
244
  }
597
245
  catch (error) {
598
246
  // Re-throw circular dependency errors immediately - these are configuration errors
599
247
  if (error instanceof CircularDependencyError) {
600
248
  // Clean up abort controller and timeout before re-throwing
601
- clearTimeout(timeoutId);
602
- this.removeTrackedAbortController(deploymentAbortController);
249
+ await this.cleanupDeployment(deploymentAbortController, timeoutId, deploymentLogger);
603
250
  throw error;
604
251
  }
605
252
  // Clean up abort controller and timeout
606
- clearTimeout(timeoutId);
607
- this.removeTrackedAbortController(deploymentAbortController);
253
+ await this.cleanupDeployment(deploymentAbortController, timeoutId, deploymentLogger);
608
254
  const duration = Date.now() - startTime;
609
255
  this.emitEvent(options, {
610
256
  type: 'failed',
611
- message: `Deployment failed: ${error}`,
257
+ message: `Deployment with closures failed: ${ensureError(error).message}`,
612
258
  timestamp: new Date(),
613
- error: error,
259
+ error: ensureError(error),
614
260
  });
615
- // Stop event monitoring on error
616
- if (this.eventMonitor) {
617
- try {
618
- await this.eventMonitor.stopMonitoring();
619
- }
620
- catch (_cleanupError) {
621
- // Ignore cleanup errors in error path
622
- }
623
- }
624
261
  // Store deployment state even for failed deployments (for rollback)
625
262
  this.deploymentState.set(deploymentId, {
626
263
  deploymentId,
@@ -641,7 +278,7 @@ export class DirectDeploymentEngine {
641
278
  {
642
279
  resourceId: 'deployment',
643
280
  phase: 'deployment',
644
- error: error,
281
+ error: ensureError(error),
645
282
  timestamp: new Date(),
646
283
  },
647
284
  ],
@@ -649,509 +286,474 @@ export class DirectDeploymentEngine {
649
286
  }
650
287
  }
651
288
  /**
652
- * Analyze closure dependencies to determine execution levels
289
+ * Create an AbortController and set up a timeout that aborts the deployment
290
+ * when the configured timeout is reached. Also stops event monitoring on timeout.
291
+ * @param deploymentId - The unique deployment ID for logging
292
+ * @param options - Deployment options containing the timeout configuration
293
+ * @param deploymentLogger - Logger scoped to this deployment
294
+ * @returns The AbortController and timeout ID for cleanup
653
295
  */
654
- analyzeClosureDependencies(closures, spec, dependencyGraph) {
655
- const closureDependencies = [];
656
- for (const [name, closure] of Object.entries(closures)) {
657
- // For now, analyze dependencies by examining the closure's configuration
658
- // This is a simplified implementation - in practice, we would need to analyze
659
- // the closure's arguments to detect resource references
660
- const dependencies = this.extractClosureDependencies(closure, spec);
661
- // Determine execution level based on dependencies
662
- // For now, assign all closures to level -1 to ensure they run before all resources
663
- // This is especially important for closures that install CRDs (like fluxSystem)
664
- let level = -1;
665
- if (dependencies.length > 0) {
666
- // Find the maximum level of any dependency + 1
667
- for (const depId of dependencies) {
668
- const depLevel = this.getResourceLevel(depId, dependencyGraph);
669
- level = Math.max(level, depLevel + 1);
670
- }
671
- }
672
- closureDependencies.push({
673
- name,
674
- closure,
675
- dependencies,
676
- level,
296
+ setupDeploymentTimeout(deploymentId, options, deploymentLogger) {
297
+ const abortController = this.createTrackedAbortController();
298
+ const timeout = options.timeout || DEFAULT_DEPLOYMENT_TIMEOUT;
299
+ const timeoutId = setTimeout(() => {
300
+ deploymentLogger.debug('Deployment timeout reached, aborting operations', {
301
+ deploymentId,
302
+ timeout,
677
303
  });
678
- }
679
- return closureDependencies;
680
- }
681
- /**
682
- * Extract dependencies from a closure by analyzing its configuration
683
- * This is a simplified implementation - in practice, we would need more sophisticated analysis
684
- */
685
- extractClosureDependencies(_closure, _spec) {
686
- // For now, return empty dependencies since closures typically don't depend on Enhanced<> resources
687
- // In the future, this could analyze closure arguments for resource references
688
- return [];
304
+ // Stop event monitoring immediately when timeout is reached
305
+ // This prevents watch connections from continuing to run and throwing errors
306
+ if (this.eventMonitor) {
307
+ this.eventMonitor.stopMonitoring().catch((error) => {
308
+ deploymentLogger.debug('Error stopping event monitoring on timeout', {
309
+ error: ensureError(error).message,
310
+ });
311
+ });
312
+ }
313
+ abortController.abort();
314
+ }, timeout);
315
+ return { abortController, timeoutId };
689
316
  }
690
317
  /**
691
- * Get the execution level of a resource in the dependency graph
692
- */
693
- getResourceLevel(resourceId, dependencyGraph) {
694
- // Find the level where this resource appears in the deployment plan
695
- const deploymentPlan = this.dependencyResolver.analyzeDeploymentOrder(dependencyGraph);
696
- for (let levelIndex = 0; levelIndex < deploymentPlan.levels.length; levelIndex++) {
697
- const level = deploymentPlan.levels[levelIndex];
698
- if (level?.includes(resourceId)) {
699
- return levelIndex;
318
+ * Validate the dependency graph for cycles, analyze deployment order,
319
+ * integrate closures into the plan, initialize event/debug monitoring,
320
+ * and build the resource key mapping and resolution context.
321
+ * @param graph - The deployment resource graph
322
+ * @param closures - Map of deployment closures keyed by name
323
+ * @param spec - The resource graph spec for closure dependency analysis
324
+ * @param options - Deployment options
325
+ * @param startTime - Deployment start timestamp for event monitoring
326
+ * @param deployedResources - Mutable array of deployed resources (used in resolution context)
327
+ * @param deploymentLogger - Logger scoped to this deployment
328
+ * @returns Enhanced plan, resolution context, and resource key mapping
329
+ */
330
+ async validateAndPlanDeployment(graph, closures, spec, options, startTime, deployedResources, deploymentLogger) {
331
+ // 1. Validate no cycles in dependency graph
332
+ deploymentLogger.debug('Validating dependency graph', {
333
+ dependencyGraph: graph.dependencyGraph,
334
+ });
335
+ this.dependencyResolver.validateNoCycles(graph.dependencyGraph);
336
+ // 2. Analyze deployment order and identify parallel stages
337
+ deploymentLogger.debug('Analyzing deployment order for parallel execution');
338
+ const deploymentPlan = this.dependencyResolver.analyzeDeploymentOrder(graph.dependencyGraph);
339
+ deploymentLogger.debug('Deployment plan determined', {
340
+ levels: deploymentPlan.levels.length,
341
+ totalResources: deploymentPlan.totalResources,
342
+ maxParallelism: deploymentPlan.maxParallelism,
343
+ });
344
+ // 3. Initialize and start event monitoring if enabled
345
+ await this.initializeEventMonitoring(options, startTime, deploymentLogger);
346
+ // 3.1. Initialize debug logging if enabled
347
+ if (options.debugLogging?.enabled) {
348
+ this.debugLogger = createDebugLoggerFromDeploymentOptions(options);
349
+ this.readinessChecker.setDebugLogger(this.debugLogger);
350
+ deploymentLogger.debug('Debug logging initialized');
351
+ }
352
+ // 4. Analyze closure dependencies and integrate into deployment plan
353
+ const closureDependencies = analyzeClosureDependencies(closures, spec, graph.dependencyGraph, this.dependencyResolver);
354
+ const enhancedPlan = integrateClosuresIntoPlan(deploymentPlan, closureDependencies);
355
+ deploymentLogger.debug('Enhanced deployment plan with closures', {
356
+ levels: enhancedPlan.levels.length,
357
+ totalResources: enhancedPlan.totalResources,
358
+ totalClosures: enhancedPlan.totalClosures,
359
+ maxParallelism: enhancedPlan.maxParallelism,
360
+ });
361
+ // 5. Create resolution context with resourceKeyMapping for cross-resource references
362
+ // The resourceKeyMapping maps original resource IDs (like 'webappDeployment') to their manifests
363
+ const resourceKeyMapping = new Map();
364
+ for (const resource of graph.resources) {
365
+ const manifest = resource.manifest;
366
+ const originalResourceId = getResourceMetadataId(manifest);
367
+ if (originalResourceId) {
368
+ // Convert the Enhanced proxy to a plain object for reliable field extraction
369
+ // The proxy's toJSON method returns a clean object without proxy behavior
370
+ const plainManifest = typeof manifest.toJSON === 'function'
371
+ ? manifest.toJSON()
372
+ : JSON.parse(JSON.stringify(manifest));
373
+ resourceKeyMapping.set(originalResourceId, plainManifest);
374
+ deploymentLogger.debug('Added resource to resourceKeyMapping', {
375
+ originalResourceId,
376
+ kind: manifest.kind,
377
+ name: manifest.metadata?.name,
378
+ });
700
379
  }
701
380
  }
702
- return 0; // Default to level 0 if not found
381
+ const context = {
382
+ deployedResources,
383
+ kubeClient: this.kubeClient,
384
+ resourceKeyMapping,
385
+ ...(options.namespace && { namespace: options.namespace }),
386
+ timeout: options.timeout || DEFAULT_READINESS_TIMEOUT,
387
+ };
388
+ return { enhancedPlan, context, resourceKeyMapping };
703
389
  }
704
390
  /**
705
- * Integrate closures into the deployment plan based on their dependencies
391
+ * Initialize and start Kubernetes event monitoring if enabled in deployment options.
392
+ * Logs a warning and continues if initialization fails.
393
+ * @param options - Deployment options containing event monitoring configuration
394
+ * @param startTime - Deployment start timestamp to filter events
395
+ * @param deploymentLogger - Logger scoped to this deployment
706
396
  */
707
- integrateClosuresIntoPlan(deploymentPlan, closureDependencies) {
708
- // Create enhanced levels with both resources and closures
709
- const enhancedLevels = [];
710
- // Check if we have any closures at level -1 (pre-resource level)
711
- const preResourceClosures = closureDependencies.filter((c) => c.level === -1);
712
- // If we have pre-resource closures, add them as level 0 and shift everything else
713
- if (preResourceClosures.length > 0) {
714
- enhancedLevels.push({
715
- resources: [],
716
- closures: preResourceClosures,
717
- });
718
- }
719
- // Initialize levels with existing resources (shifted if we added a pre-resource level)
720
- for (let i = 0; i < deploymentPlan.levels.length; i++) {
721
- enhancedLevels.push({
722
- resources: deploymentPlan.levels[i] || [],
723
- closures: [],
724
- });
725
- }
726
- // Add closures to their appropriate levels (excluding level -1 which we already handled)
727
- for (const closureInfo of closureDependencies) {
728
- if (closureInfo.level === -1) {
729
- continue; // Already handled above
730
- }
731
- // Adjust level index if we added a pre-resource level
732
- const adjustedLevel = preResourceClosures.length > 0 ? closureInfo.level + 1 : closureInfo.level;
733
- // Ensure we have enough levels
734
- while (enhancedLevels.length <= adjustedLevel) {
735
- enhancedLevels.push({ resources: [], closures: [] });
397
+ async initializeEventMonitoring(options, startTime, deploymentLogger) {
398
+ if (options.eventMonitoring?.enabled) {
399
+ try {
400
+ this.eventMonitor = createEventMonitor(this.kubeClient, {
401
+ namespace: options.namespace || 'default',
402
+ eventTypes: options.eventMonitoring.eventTypes || ['Warning', 'Error'],
403
+ includeChildResources: options.eventMonitoring.includeChildResources ?? true,
404
+ startTime: new Date(startTime),
405
+ ...(options.progressCallback && { progressCallback: options.progressCallback }),
406
+ });
407
+ // Start monitoring immediately to capture all deployment events
408
+ await this.eventMonitor.startMonitoring([]);
409
+ deploymentLogger.debug('Event monitoring started for deployment');
736
410
  }
737
- const targetLevel = enhancedLevels[adjustedLevel];
738
- if (targetLevel) {
739
- targetLevel.closures.push(closureInfo);
411
+ catch (error) {
412
+ deploymentLogger.warn('Failed to initialize event monitoring, continuing without it', {
413
+ error: ensureError(error).message,
414
+ });
740
415
  }
741
416
  }
742
- return {
743
- levels: enhancedLevels,
744
- totalResources: deploymentPlan.totalResources,
745
- totalClosures: closureDependencies.length,
746
- maxParallelism: Math.max(deploymentPlan.maxParallelism, Math.max(...enhancedLevels.map((level) => level.closures.length))),
747
- };
748
417
  }
749
418
  /**
750
- * Deploy a resource graph with deployment closures integrated into level-based execution
751
- */
752
- async deployWithClosures(graph, closures, options, spec, alchemyScope) {
753
- const deploymentId = this.generateDeploymentId();
754
- const startTime = Date.now();
755
- const deployedResources = [];
756
- const errors = [];
757
- const deploymentLogger = this.logger.child({
758
- deploymentId,
759
- resourceCount: graph.resources.length,
760
- closureCount: Object.keys(closures).length,
761
- });
762
- // Create an AbortController for this deployment to enable proper cancellation
763
- const deploymentAbortController = this.createTrackedAbortController();
764
- const abortSignal = deploymentAbortController.signal;
765
- // Set up timeout-based abort if timeout is specified
766
- const timeout = options.timeout || 300000; // 5 minutes default
767
- const timeoutId = setTimeout(() => {
768
- deploymentLogger.debug('Deployment timeout reached, aborting operations', {
769
- deploymentId,
770
- timeout,
771
- });
772
- deploymentAbortController.abort();
773
- }, timeout);
774
- deploymentLogger.info('Starting deployment with closures', {
775
- options,
776
- closures: Object.keys(closures),
419
+ * Deploy a single level of resources and closures in parallel. Processes results,
420
+ * handles rollback on failure if configured, and logs level performance metrics.
421
+ * Returns a DeploymentResult if rollback occurred (early exit), or undefined to continue.
422
+ * @param levelIndex - Zero-based index of the current level
423
+ * @param currentLevel - The level definition containing resource IDs and closures
424
+ * @param graph - The full deployment resource graph
425
+ * @param deployedResources - Mutable array accumulating deployed resources across levels
426
+ * @param errors - Mutable array accumulating deployment errors across levels
427
+ * @param context - Resolution context for cross-resource references
428
+ * @param resourceKeyMapping - Map from resource IDs to their manifests (updated with live data)
429
+ * @param options - Deployment options
430
+ * @param alchemyScope - Optional alchemy scope for closure deployment context
431
+ * @param abortSignal - Signal to abort deployment operations
432
+ * @param startTime - Deployment start timestamp (used for rollback duration calculation)
433
+ * @param deploymentId - Unique deployment ID for result building
434
+ * @param deploymentLogger - Logger scoped to this deployment
435
+ * @returns DeploymentResult if rollback occurred, undefined otherwise
436
+ */
437
+ async deployLevel(levelIndex, currentLevel, graph, deployedResources, errors, context, resourceKeyMapping, options, alchemyScope, abortSignal, startTime, deploymentId, deploymentLogger) {
438
+ const levelLogger = deploymentLogger.child({
439
+ level: levelIndex + 1,
440
+ resourceCount: currentLevel.resources.length,
441
+ closureCount: currentLevel.closures.length,
777
442
  });
778
- try {
779
- this.emitEvent(options, {
780
- type: 'started',
781
- message: `Starting deployment of ${graph.resources.length} resources and ${Object.keys(closures).length} closures`,
782
- timestamp: new Date(),
783
- });
784
- // 1. Validate no cycles in dependency graph
785
- deploymentLogger.debug('Validating dependency graph', {
786
- dependencyGraph: graph.dependencyGraph,
787
- });
788
- this.dependencyResolver.validateNoCycles(graph.dependencyGraph);
789
- // 2. Analyze deployment order and identify parallel stages
790
- deploymentLogger.debug('Analyzing deployment order for parallel execution');
791
- const deploymentPlan = this.dependencyResolver.analyzeDeploymentOrder(graph.dependencyGraph);
792
- deploymentLogger.debug('Deployment plan determined', {
793
- levels: deploymentPlan.levels.length,
794
- totalResources: deploymentPlan.totalResources,
795
- maxParallelism: deploymentPlan.maxParallelism,
796
- });
797
- // 3. Analyze closure dependencies and integrate into deployment plan
798
- const closureDependencies = this.analyzeClosureDependencies(closures, spec, graph.dependencyGraph);
799
- const enhancedPlan = this.integrateClosuresIntoPlan(deploymentPlan, closureDependencies);
800
- deploymentLogger.debug('Enhanced deployment plan with closures', {
801
- levels: enhancedPlan.levels.length,
802
- totalResources: enhancedPlan.totalResources,
803
- totalClosures: enhancedPlan.totalClosures,
804
- maxParallelism: enhancedPlan.maxParallelism,
443
+ levelLogger.debug(`Deploying level ${levelIndex + 1} with ${currentLevel.resources.length} resources and ${currentLevel.closures.length} closures in parallel`);
444
+ const levelStartTime = Date.now();
445
+ // Create deployment context for closures at this level
446
+ const deployedResourcesMap = new Map();
447
+ // Populate with resources from previous levels
448
+ for (const resource of deployedResources) {
449
+ deployedResourcesMap.set(resource.id, resource);
450
+ }
451
+ const deploymentContext = {
452
+ kubernetesApi: this.k8sApi,
453
+ kubeConfig: this.kubeClient,
454
+ ...(alchemyScope && { alchemyScope }),
455
+ ...(options.namespace && { namespace: options.namespace }),
456
+ deployedResources: deployedResourcesMap,
457
+ resolveReference: async (ref) => {
458
+ // Enhanced reference resolution - will be improved in future tasks
459
+ return ref;
460
+ },
461
+ };
462
+ // Prepare promises for both resources and closures
463
+ const levelPromises = [];
464
+ // Add resource deployment promises
465
+ const resourcePromises = currentLevel.resources.map(async (resourceId) => {
466
+ const resourceLogger = deploymentLogger.child({ resourceId });
467
+ resourceLogger.debug('Starting resource deployment');
468
+ const resource = graph.resources.find((r) => r.id === resourceId);
469
+ if (!resource) {
470
+ resourceLogger.error('Resource not found in graph');
471
+ const error = new Error(`Resource with id '${resourceId}' not found in graph`);
472
+ return {
473
+ success: false,
474
+ resourceId,
475
+ error: {
476
+ resourceId,
477
+ phase: 'validation',
478
+ error,
479
+ timestamp: new Date(),
480
+ },
481
+ };
482
+ }
483
+ resourceLogger.debug('Found resource in graph', {
484
+ resourceId: resource.id,
485
+ kind: resource.manifest?.kind,
486
+ name: resource.manifest?.metadata?.name,
805
487
  });
806
- // 4. Create resolution context with resourceKeyMapping for cross-resource references
807
- // The resourceKeyMapping maps original resource IDs (like 'webappDeployment') to their manifests
808
- const resourceKeyMapping = new Map();
809
- for (const resource of graph.resources) {
810
- const manifest = resource.manifest;
811
- const originalResourceId = manifest.__resourceId;
812
- if (originalResourceId) {
813
- // Convert the Enhanced proxy to a plain object for reliable field extraction
814
- // The proxy's toJSON method returns a clean object without proxy behavior
815
- const plainManifest = typeof manifest.toJSON === 'function'
816
- ? manifest.toJSON()
817
- : JSON.parse(JSON.stringify(manifest));
818
- resourceKeyMapping.set(originalResourceId, plainManifest);
819
- deploymentLogger.debug('Added resource to resourceKeyMapping', {
820
- originalResourceId,
821
- kind: manifest.kind,
822
- name: manifest.metadata?.name,
488
+ try {
489
+ resourceLogger.debug('Calling deploySingleResource');
490
+ // Wait for CRD establishment if this is a custom resource
491
+ await this.crdManager.waitForCRDIfCustomResource(resource.manifest, options, resourceLogger, abortSignal);
492
+ const resourceWithEvaluator = ensureReadinessEvaluator(resource.manifest);
493
+ // Add resource to event monitoring before deployment to capture creation events
494
+ // NOTE: This is fire-and-forget to avoid blocking the deployment path.
495
+ if (this.eventMonitor) {
496
+ const preDeployedResource = {
497
+ id: resourceId,
498
+ kind: resourceWithEvaluator.kind,
499
+ name: resourceWithEvaluator.metadata?.name || 'unknown',
500
+ namespace: resourceWithEvaluator.metadata?.namespace || options.namespace || 'default',
501
+ manifest: resourceWithEvaluator,
502
+ status: 'deployed',
503
+ deployedAt: new Date(),
504
+ };
505
+ this.eventMonitor.addResources([preDeployedResource]).then(() => {
506
+ resourceLogger.debug('Added resource to event monitoring before deployment');
507
+ }, (error) => {
508
+ resourceLogger.warn('Failed to add resource to event monitoring, continuing deployment', { error: ensureError(error).message });
823
509
  });
824
510
  }
511
+ const deployedResource = await this.deploySingleResource(resourceWithEvaluator, context, options, abortSignal);
512
+ resourceLogger.debug('Resource deployed successfully');
513
+ return {
514
+ success: true,
515
+ resourceId,
516
+ deployedResource,
517
+ };
825
518
  }
826
- const context = {
827
- deployedResources,
828
- kubeClient: this.kubeClient,
829
- resourceKeyMapping,
830
- ...(options.namespace && { namespace: options.namespace }),
831
- timeout: options.timeout || 30000,
832
- };
833
- // 5. Deploy resources and closures level by level with proper dependency handling
834
- for (let levelIndex = 0; levelIndex < enhancedPlan.levels.length; levelIndex++) {
835
- const currentLevel = enhancedPlan.levels[levelIndex];
836
- if (!currentLevel) {
837
- continue;
838
- }
839
- const levelLogger = deploymentLogger.child({
840
- level: levelIndex + 1,
841
- resourceCount: currentLevel.resources.length,
842
- closureCount: currentLevel.closures.length,
843
- });
844
- levelLogger.debug(`Deploying level ${levelIndex + 1} with ${currentLevel.resources.length} resources and ${currentLevel.closures.length} closures in parallel`);
845
- const levelStartTime = Date.now();
846
- // Create deployment context for closures at this level
847
- const deployedResourcesMap = new Map();
848
- // Populate with resources from previous levels
849
- for (const resource of deployedResources) {
850
- deployedResourcesMap.set(resource.id, resource);
851
- }
852
- const deploymentContext = {
853
- kubernetesApi: this.k8sApi,
854
- ...(alchemyScope && { alchemyScope }),
855
- ...(options.namespace && { namespace: options.namespace }),
856
- deployedResources: deployedResourcesMap,
857
- resolveReference: async (ref) => {
858
- // Enhanced reference resolution - will be improved in future tasks
859
- return ref;
519
+ catch (error) {
520
+ resourceLogger.error('Resource deployment failed', ensureError(error));
521
+ const failedResource = {
522
+ id: resourceId,
523
+ kind: resource.manifest.kind,
524
+ name: resource.manifest.metadata?.name || 'unknown',
525
+ namespace: resource.manifest.metadata?.namespace || 'default',
526
+ manifest: resource.manifest,
527
+ status: 'failed',
528
+ deployedAt: new Date(),
529
+ error: ensureError(error),
530
+ };
531
+ return {
532
+ success: false,
533
+ resourceId,
534
+ deployedResource: failedResource,
535
+ error: {
536
+ resourceId,
537
+ phase: 'deployment',
538
+ error: ensureError(error),
539
+ timestamp: new Date(),
860
540
  },
861
541
  };
862
- // Prepare promises for both resources and closures
863
- const levelPromises = [];
864
- // Add resource deployment promises
865
- const resourcePromises = currentLevel.resources.map(async (resourceId) => {
866
- const resourceLogger = deploymentLogger.child({ resourceId });
867
- resourceLogger.debug('Starting resource deployment');
868
- const resource = graph.resources.find((r) => r.id === resourceId);
869
- if (!resource) {
870
- resourceLogger.error('Resource not found in graph');
871
- const error = new Error(`Resource with id '${resourceId}' not found in graph`);
872
- return {
873
- success: false,
874
- resourceId,
875
- error: {
876
- resourceId,
877
- phase: 'validation',
878
- error,
879
- timestamp: new Date(),
880
- },
881
- };
882
- }
883
- resourceLogger.debug('Found resource in graph', {
884
- resourceId: resource.id,
885
- kind: resource.manifest?.kind,
886
- name: resource.manifest?.metadata?.name,
887
- });
888
- try {
889
- resourceLogger.debug('Calling deploySingleResource');
890
- // Wait for CRD establishment if this is a custom resource
891
- await this.waitForCRDIfCustomResource(resource.manifest, options, resourceLogger, abortSignal);
892
- const resourceWithEvaluator = ensureReadinessEvaluator(resource.manifest);
893
- const deployedResource = await this.deploySingleResource(resourceWithEvaluator, context, options, abortSignal);
894
- resourceLogger.debug('Resource deployed successfully');
895
- return {
896
- success: true,
897
- resourceId,
898
- deployedResource,
899
- };
900
- }
901
- catch (error) {
902
- resourceLogger.error('Resource deployment failed', error);
903
- const failedResource = {
904
- id: resourceId,
905
- kind: resource.manifest.kind,
906
- name: resource.manifest.metadata?.name || 'unknown',
907
- namespace: resource.manifest.metadata?.namespace || 'default',
908
- manifest: resource.manifest,
909
- status: 'failed',
910
- deployedAt: new Date(),
911
- error: error,
912
- };
913
- return {
914
- success: false,
915
- resourceId,
916
- deployedResource: failedResource,
917
- error: {
918
- resourceId,
919
- phase: 'deployment',
920
- error: error,
921
- timestamp: new Date(),
922
- },
923
- };
924
- }
542
+ }
543
+ });
544
+ // Add closure execution promises
545
+ const closurePromises = currentLevel.closures.map(async (closureInfo) => {
546
+ const closureLogger = levelLogger.child({ closureName: closureInfo.name });
547
+ closureLogger.debug('Executing closure at level', { level: levelIndex + 1 });
548
+ try {
549
+ const result = await closureInfo.closure(deploymentContext);
550
+ closureLogger.debug('Closure executed successfully', {
551
+ resultCount: result?.length || 0,
925
552
  });
926
- // Add closure execution promises
927
- const closurePromises = currentLevel.closures.map(async (closureInfo) => {
928
- const closureLogger = levelLogger.child({ closureName: closureInfo.name });
929
- closureLogger.debug('Executing closure at level', { level: levelIndex + 1 });
930
- try {
931
- const result = await closureInfo.closure(deploymentContext);
932
- closureLogger.debug('Closure executed successfully', {
933
- resultCount: result?.length || 0,
934
- });
935
- return {
936
- success: true,
937
- type: 'closure',
938
- name: closureInfo.name,
939
- result,
940
- };
941
- }
942
- catch (error) {
943
- closureLogger.error('Closure execution failed', error);
944
- return {
945
- success: false,
946
- type: 'closure',
947
- name: closureInfo.name,
948
- error: {
949
- resourceId: `closure-${closureInfo.name}`,
950
- phase: 'deployment',
951
- error: error,
952
- timestamp: new Date(),
953
- },
954
- };
553
+ return {
554
+ success: true,
555
+ type: 'closure',
556
+ name: closureInfo.name,
557
+ result,
558
+ };
559
+ }
560
+ catch (error) {
561
+ closureLogger.error('Closure execution failed', ensureError(error));
562
+ return {
563
+ success: false,
564
+ type: 'closure',
565
+ name: closureInfo.name,
566
+ error: {
567
+ resourceId: `closure-${closureInfo.name}`,
568
+ phase: 'deployment',
569
+ error: ensureError(error),
570
+ timestamp: new Date(),
571
+ },
572
+ };
573
+ }
574
+ });
575
+ // Combine all promises for this level
576
+ levelPromises.push(...resourcePromises, ...closurePromises);
577
+ // Wait for all resources and closures in this level to complete
578
+ const levelResults = await Promise.allSettled(levelPromises);
579
+ // Process results and handle errors
580
+ let levelHasFailures = false;
581
+ let successfulResources = 0;
582
+ let successfulClosures = 0;
583
+ let failedResources = 0;
584
+ let failedClosures = 0;
585
+ for (const result of levelResults) {
586
+ if (result.status === 'fulfilled') {
587
+ const deploymentResult = result.value;
588
+ if (deploymentResult.type === 'closure') {
589
+ // Handle closure result
590
+ if (deploymentResult.success) {
591
+ successfulClosures++;
955
592
  }
956
- });
957
- // Combine all promises for this level
958
- levelPromises.push(...resourcePromises, ...closurePromises);
959
- // Wait for all resources and closures in this level to complete
960
- const levelResults = await Promise.allSettled(levelPromises);
961
- // Process results and handle errors
962
- let levelHasFailures = false;
963
- let successfulResources = 0;
964
- let successfulClosures = 0;
965
- let failedResources = 0;
966
- let failedClosures = 0;
967
- for (const result of levelResults) {
968
- if (result.status === 'fulfilled') {
969
- const deploymentResult = result.value;
970
- if (deploymentResult.type === 'closure') {
971
- // Handle closure result
972
- if (deploymentResult.success) {
973
- successfulClosures++;
974
- }
975
- else {
976
- levelHasFailures = true;
977
- failedClosures++;
978
- if (deploymentResult.error) {
979
- errors.push(deploymentResult.error);
980
- }
981
- }
982
- }
983
- else {
984
- // Handle resource result
985
- if (deploymentResult.success && deploymentResult.deployedResource) {
986
- deployedResources.push(deploymentResult.deployedResource);
987
- successfulResources++;
988
- // Update resourceKeyMapping with the live resource from the cluster (including status)
989
- // This is critical for CEL expression evaluation which needs access to resource status
990
- const deployedRes = deploymentResult.deployedResource;
991
- const manifestWithId = deployedRes.manifest;
992
- const originalResourceId = manifestWithId.__resourceId;
993
- if (originalResourceId && resourceKeyMapping.has(originalResourceId)) {
994
- try {
995
- // Query the live resource from the cluster to get its current status
996
- const liveResource = await this.k8sApi.read({
997
- apiVersion: deployedRes.manifest.apiVersion || '',
998
- kind: deployedRes.kind,
999
- metadata: {
1000
- name: deployedRes.name,
1001
- namespace: deployedRes.namespace,
1002
- },
1003
- });
1004
- resourceKeyMapping.set(originalResourceId, liveResource);
1005
- deploymentLogger.debug('Updated resourceKeyMapping with live resource status', {
1006
- originalResourceId,
1007
- kind: deployedRes.kind,
1008
- name: deployedRes.name,
1009
- hasStatus: !!liveResource.status,
1010
- });
1011
- }
1012
- catch (error) {
1013
- deploymentLogger.warn('Failed to update resourceKeyMapping with live resource', {
1014
- originalResourceId,
1015
- error: error instanceof Error ? error.message : String(error),
1016
- });
1017
- }
1018
- }
1019
- }
1020
- else {
1021
- levelHasFailures = true;
1022
- failedResources++;
1023
- if (deploymentResult.error) {
1024
- errors.push(deploymentResult.error);
1025
- }
1026
- if (deploymentResult.deployedResource) {
1027
- deployedResources.push(deploymentResult.deployedResource);
1028
- }
1029
- }
593
+ else {
594
+ levelHasFailures = true;
595
+ failedClosures++;
596
+ if (deploymentResult.error) {
597
+ errors.push(deploymentResult.error);
1030
598
  }
1031
599
  }
600
+ }
601
+ else {
602
+ // Handle resource result
603
+ if (deploymentResult.success && deploymentResult.deployedResource) {
604
+ deployedResources.push(deploymentResult.deployedResource);
605
+ successfulResources++;
606
+ await this.updateResourceKeyMappingWithLiveResource(deploymentResult.deployedResource, resourceKeyMapping, deploymentLogger);
607
+ }
1032
608
  else {
1033
609
  levelHasFailures = true;
1034
- levelLogger.error('Unexpected promise rejection in parallel deployment', result.reason);
610
+ failedResources++;
611
+ if (deploymentResult.error) {
612
+ errors.push(deploymentResult.error);
613
+ }
614
+ if (deploymentResult.deployedResource) {
615
+ deployedResources.push(deploymentResult.deployedResource);
616
+ }
1035
617
  }
1036
618
  }
1037
- // Handle rollback if there are failures and rollback is enabled
1038
- if (levelHasFailures && options.rollbackOnFailure) {
1039
- levelLogger.warn('Level deployment failed, initiating rollback');
1040
- await this.rollbackDeployedResources(deployedResources, options);
1041
- const duration = Date.now() - startTime;
1042
- this.emitEvent(options, {
1043
- type: 'rollback',
1044
- message: `Deployment failed and rolled back in ${duration}ms`,
1045
- timestamp: new Date(),
1046
- });
1047
- return {
1048
- deploymentId,
1049
- resources: deployedResources,
1050
- dependencyGraph: graph.dependencyGraph,
1051
- duration,
1052
- status: 'failed',
1053
- errors,
1054
- };
1055
- }
1056
- // Calculate level performance metrics
1057
- const levelDuration = Date.now() - levelStartTime;
1058
- const totalOperations = currentLevel.resources.length + currentLevel.closures.length;
1059
- levelLogger.info(`Level ${levelIndex + 1} deployment completed`, {
1060
- resources: { successful: successfulResources, failed: failedResources },
1061
- closures: { successful: successfulClosures, failed: failedClosures },
1062
- duration: levelDuration,
1063
- parallelism: totalOperations,
1064
- averageTimePerOperation: totalOperations > 0 ? Math.round(levelDuration / totalOperations) : 0,
1065
- });
1066
619
  }
620
+ else {
621
+ levelHasFailures = true;
622
+ levelLogger.error('Unexpected promise rejection in parallel deployment', result.reason);
623
+ }
624
+ }
625
+ // Handle rollback if there are failures and rollback is enabled
626
+ if (levelHasFailures && options.rollbackOnFailure) {
627
+ levelLogger.warn('Level deployment failed, initiating rollback');
628
+ await this.rollbackDeployedResources(deployedResources, options);
1067
629
  const duration = Date.now() - startTime;
1068
- const successfulResources = deployedResources.filter((r) => r.status !== 'failed');
1069
- const status = errors.length === 0 ? 'success' : successfulResources.length > 0 ? 'partial' : 'failed';
1070
- // Log comprehensive performance metrics
1071
- deploymentLogger.info('Parallel deployment with closures performance metrics', {
1072
- totalDuration: duration,
1073
- totalResources: enhancedPlan.totalResources,
1074
- totalClosures: enhancedPlan.totalClosures,
1075
- parallelLevels: enhancedPlan.levels.length,
1076
- maxParallelism: enhancedPlan.maxParallelism,
1077
- averageTimePerResource: enhancedPlan.totalResources > 0 ? Math.round(duration / enhancedPlan.totalResources) : 0,
1078
- successfulResources: successfulResources.length,
1079
- failedResources: errors.length,
1080
- status,
1081
- });
1082
630
  this.emitEvent(options, {
1083
- type: status === 'success' ? 'completed' : 'failed',
1084
- message: `Deployment with closures ${status} in ${duration}ms (${enhancedPlan.totalClosures} closures + ${enhancedPlan.totalResources} resources across ${enhancedPlan.levels.length} levels)`,
631
+ type: 'rollback',
632
+ message: `Deployment failed and rolled back in ${duration}ms`,
1085
633
  timestamp: new Date(),
1086
634
  });
1087
- // Clean up abort controller and timeout
1088
- clearTimeout(timeoutId);
1089
- this.removeTrackedAbortController(deploymentAbortController);
1090
- // Store deployment state for rollback
1091
- this.deploymentState.set(deploymentId, {
1092
- deploymentId,
1093
- resources: deployedResources,
1094
- dependencyGraph: graph.dependencyGraph,
1095
- startTime: new Date(startTime),
1096
- endTime: new Date(),
1097
- status: status === 'success' ? 'completed' : status === 'partial' ? 'completed' : 'failed',
1098
- options,
1099
- });
1100
635
  return {
1101
636
  deploymentId,
1102
637
  resources: deployedResources,
1103
638
  dependencyGraph: graph.dependencyGraph,
1104
639
  duration,
1105
- status,
640
+ status: 'failed',
1106
641
  errors,
1107
642
  };
1108
643
  }
1109
- catch (error) {
1110
- // Re-throw circular dependency errors immediately - these are configuration errors
1111
- if (error instanceof CircularDependencyError) {
1112
- // Clean up abort controller and timeout before re-throwing
1113
- clearTimeout(timeoutId);
1114
- this.removeTrackedAbortController(deploymentAbortController);
1115
- throw error;
644
+ // Calculate level performance metrics
645
+ const levelDuration = Date.now() - levelStartTime;
646
+ const totalOperations = currentLevel.resources.length + currentLevel.closures.length;
647
+ levelLogger.info(`Level ${levelIndex + 1} deployment completed`, {
648
+ resources: { successful: successfulResources, failed: failedResources },
649
+ closures: { successful: successfulClosures, failed: failedClosures },
650
+ duration: levelDuration,
651
+ parallelism: totalOperations,
652
+ averageTimePerOperation: totalOperations > 0 ? Math.round(levelDuration / totalOperations) : 0,
653
+ });
654
+ return undefined;
655
+ }
656
+ /**
657
+ * Build the final DeploymentResult after all levels have been deployed.
658
+ * Logs comprehensive performance metrics and emits completion/failure events.
659
+ * @param deploymentId - Unique deployment ID
660
+ * @param graph - The deployment resource graph
661
+ * @param enhancedPlan - The enhanced deployment plan with closure information
662
+ * @param deployedResources - All deployed resources across all levels
663
+ * @param errors - All deployment errors across all levels
664
+ * @param startTime - Deployment start timestamp
665
+ * @param options - Deployment options for event emission
666
+ * @param deploymentLogger - Logger scoped to this deployment
667
+ * @returns The final deployment result
668
+ */
669
+ buildDeploymentResult(deploymentId, graph, enhancedPlan, deployedResources, errors, startTime, options, deploymentLogger) {
670
+ const duration = Date.now() - startTime;
671
+ const successfulResources = deployedResources.filter((r) => r.status !== 'failed');
672
+ const status = errors.length === 0 ? 'success' : successfulResources.length > 0 ? 'partial' : 'failed';
673
+ // Log comprehensive performance metrics
674
+ deploymentLogger.info('Parallel deployment with closures performance metrics', {
675
+ totalDuration: duration,
676
+ totalResources: enhancedPlan.totalResources,
677
+ totalClosures: enhancedPlan.totalClosures,
678
+ parallelLevels: enhancedPlan.levels.length,
679
+ maxParallelism: enhancedPlan.maxParallelism,
680
+ averageTimePerResource: enhancedPlan.totalResources > 0 ? Math.round(duration / enhancedPlan.totalResources) : 0,
681
+ successfulResources: successfulResources.length,
682
+ failedResources: errors.length,
683
+ status,
684
+ });
685
+ this.emitEvent(options, {
686
+ type: status === 'success' ? 'completed' : 'failed',
687
+ message: `Deployment with closures ${status} in ${duration}ms (${enhancedPlan.totalClosures} closures + ${enhancedPlan.totalResources} resources across ${enhancedPlan.levels.length} levels)`,
688
+ timestamp: new Date(),
689
+ });
690
+ return {
691
+ deploymentId,
692
+ resources: deployedResources,
693
+ dependencyGraph: graph.dependencyGraph,
694
+ duration,
695
+ status,
696
+ errors,
697
+ };
698
+ }
699
+ /**
700
+ * Stop event monitoring, clear the deployment timeout, and remove the
701
+ * abort controller from tracking. Safe to call multiple times.
702
+ * @param abortController - The deployment's AbortController to untrack
703
+ * @param timeoutId - The timeout ID to clear
704
+ * @param deploymentLogger - Logger scoped to this deployment
705
+ */
706
+ async cleanupDeployment(abortController, timeoutId, deploymentLogger) {
707
+ // Stop event monitoring
708
+ if (this.eventMonitor) {
709
+ try {
710
+ await this.eventMonitor.stopMonitoring();
711
+ deploymentLogger.debug('Event monitoring stopped');
1116
712
  }
1117
- // Clean up abort controller and timeout
1118
- clearTimeout(timeoutId);
1119
- this.removeTrackedAbortController(deploymentAbortController);
1120
- const duration = Date.now() - startTime;
1121
- this.emitEvent(options, {
1122
- type: 'failed',
1123
- message: `Deployment with closures failed: ${error}`,
1124
- timestamp: new Date(),
1125
- error: error,
713
+ catch (error) {
714
+ deploymentLogger.warn('Failed to stop event monitoring cleanly', {
715
+ error: ensureError(error).message,
716
+ });
717
+ }
718
+ }
719
+ // Clean up abort controller and timeout
720
+ clearTimeout(timeoutId);
721
+ this.removeTrackedAbortController(abortController);
722
+ }
723
+ /**
724
+ * Update the resourceKeyMapping with a live resource fetched from the cluster.
725
+ * This is critical for CEL expression evaluation which needs access to resource status.
726
+ */
727
+ async updateResourceKeyMappingWithLiveResource(deployedRes, resourceKeyMapping, logger) {
728
+ const originalResourceId = getResourceMetadataId(deployedRes.manifest);
729
+ if (!originalResourceId || !resourceKeyMapping.has(originalResourceId)) {
730
+ return;
731
+ }
732
+ try {
733
+ const liveResource = await this.k8sApi.read({
734
+ apiVersion: deployedRes.manifest.apiVersion || '',
735
+ kind: deployedRes.kind,
736
+ metadata: {
737
+ name: deployedRes.name,
738
+ namespace: deployedRes.namespace,
739
+ },
1126
740
  });
1127
- // Store deployment state even for failed deployments (for rollback)
1128
- this.deploymentState.set(deploymentId, {
1129
- deploymentId,
1130
- resources: deployedResources,
1131
- dependencyGraph: graph.dependencyGraph,
1132
- startTime: new Date(startTime),
1133
- endTime: new Date(),
1134
- status: 'failed',
1135
- options,
741
+ resourceKeyMapping.set(originalResourceId, liveResource);
742
+ logger.debug('Updated resourceKeyMapping with live resource status', {
743
+ originalResourceId,
744
+ kind: deployedRes.kind,
745
+ name: deployedRes.name,
746
+ hasStatus: !!liveResource.status,
1136
747
  });
1137
- return {
1138
- deploymentId,
1139
- resources: deployedResources,
1140
- dependencyGraph: graph.dependencyGraph,
1141
- duration,
1142
- status: 'failed',
1143
- errors: [
1144
- {
1145
- resourceId: 'deployment',
1146
- phase: 'deployment',
1147
- error: error,
1148
- timestamp: new Date(),
1149
- },
1150
- ],
1151
- };
1152
748
  }
1153
- } /**
1154
-
749
+ catch (error) {
750
+ logger.warn('Failed to update resourceKeyMapping with live resource', {
751
+ originalResourceId,
752
+ error: ensureError(error).message,
753
+ });
754
+ }
755
+ }
756
+ /**
1155
757
  * Deploy a single resource
1156
758
  */
1157
759
  async deploySingleResource(resource, context, options, abortSignal) {
@@ -1159,9 +761,9 @@ export class DirectDeploymentEngine {
1159
761
  if (abortSignal?.aborted) {
1160
762
  throw new DOMException('Operation aborted', 'AbortError');
1161
763
  }
1162
- // __resourceId is an internal field that may be set during resource processing
1163
- const resourceWithInternalId = resource;
1164
- const resourceId = resource.id || resourceWithInternalId.__resourceId || resource.metadata?.name || 'unknown';
764
+ // Resource ID from WeakMap metadata or deterministic ID generation
765
+ const internalId = getResourceMetadataId(resource);
766
+ const resourceId = internalId || getResourceId(resource);
1165
767
  const resourceLogger = this.logger.child({
1166
768
  resourceId,
1167
769
  kind: resource.kind,
@@ -1175,362 +777,11 @@ export class DirectDeploymentEngine {
1175
777
  timestamp: new Date(),
1176
778
  });
1177
779
  // 1. Resolve all references in the resource
1178
- let resolvedResource;
1179
- try {
1180
- resourceLogger.debug('Resolving resource references', {
1181
- originalMetadata: resource.metadata,
1182
- });
1183
- const resolveTimeout = options.timeout || 30000;
1184
- resolvedResource = (await Promise.race([
1185
- this.referenceResolver.resolveReferences(resource, context),
1186
- new Promise((_, reject) => setTimeout(() => reject(new Error('Reference resolution timeout')), resolveTimeout)),
1187
- ]));
1188
- // Check for readinessEvaluator which may be on Enhanced resources
1189
- const enhancedResource = resolvedResource;
1190
- resourceLogger.debug('References resolved successfully', {
1191
- resolvedMetadata: resolvedResource.metadata,
1192
- hasReadinessEvaluator: !!enhancedResource.readinessEvaluator,
1193
- });
1194
- }
1195
- catch (error) {
1196
- // In Alchemy deployments, resourceKeyMapping is often empty because resources are deployed
1197
- // one at a time. This is expected behavior, so we log at debug level instead of warn.
1198
- const hasResourceKeyMapping = context.resourceKeyMapping && context.resourceKeyMapping.size > 0;
1199
- if (hasResourceKeyMapping) {
1200
- resourceLogger.warn('Reference resolution failed, using original resource', error);
1201
- }
1202
- else {
1203
- resourceLogger.debug('Reference resolution skipped (no resourceKeyMapping), using original resource', {
1204
- error: error.message,
1205
- });
1206
- }
1207
- resolvedResource = resource;
1208
- }
780
+ const resolvedRef = await this.resourceApplier.resolveResourceReferences(resource, context, options, resourceLogger);
1209
781
  // 2. Apply namespace if specified, but only if resource doesn't already have one
1210
- if (options.namespace &&
1211
- resolvedResource.metadata &&
1212
- typeof resolvedResource.metadata.namespace !== 'string') {
1213
- resourceLogger.debug('Applying namespace from deployment options', {
1214
- targetNamespace: options.namespace,
1215
- currentNamespace: resolvedResource.metadata.namespace,
1216
- currentNamespaceType: typeof resolvedResource.metadata.namespace,
1217
- });
1218
- // Create a completely new metadata object to avoid proxy issues
1219
- const newMetadata = {
1220
- ...resolvedResource.metadata,
1221
- namespace: options.namespace,
1222
- };
1223
- // Preserve the readiness evaluator when creating the new resource
1224
- const newResolvedResource = {
1225
- ...resolvedResource,
1226
- metadata: newMetadata,
1227
- };
1228
- // Copy the non-enumerable readiness evaluator if it exists
1229
- const resourceWithEvaluator = resolvedResource;
1230
- const readinessEvaluator = resourceWithEvaluator.readinessEvaluator;
1231
- if (readinessEvaluator) {
1232
- Object.defineProperty(newResolvedResource, 'readinessEvaluator', {
1233
- value: readinessEvaluator,
1234
- enumerable: false,
1235
- configurable: true,
1236
- writable: false,
1237
- });
1238
- }
1239
- // Copy the non-enumerable __resourceId if it exists (used for cross-resource references)
1240
- const originalResourceId = resourceWithEvaluator.__resourceId;
1241
- if (originalResourceId) {
1242
- Object.defineProperty(newResolvedResource, '__resourceId', {
1243
- value: originalResourceId,
1244
- enumerable: false,
1245
- configurable: true,
1246
- writable: false,
1247
- });
1248
- }
1249
- resolvedResource = newResolvedResource;
1250
- }
782
+ const resolvedResource = this.resourceApplier.applyNamespaceToResource(resolvedRef, options.namespace, resourceLogger);
1251
783
  // 3. Apply the resource to the cluster (or simulate for dry run)
1252
- let appliedResource;
1253
- if (options.dryRun) {
1254
- // In dry run mode, don't actually create the resource
1255
- resourceLogger.debug('Dry run mode: simulating resource creation');
1256
- appliedResource = {
1257
- ...resolvedResource,
1258
- metadata: {
1259
- ...resolvedResource.metadata,
1260
- uid: 'dry-run-uid',
1261
- },
1262
- };
1263
- }
1264
- else {
1265
- // Apply resource with retry logic
1266
- const retryPolicy = options.retryPolicy || {
1267
- maxRetries: 3,
1268
- backoffMultiplier: 2,
1269
- initialDelay: 1000,
1270
- maxDelay: 30000,
1271
- };
1272
- let lastError;
1273
- for (let attempt = 0; attempt <= retryPolicy.maxRetries; attempt++) {
1274
- try {
1275
- resourceLogger.debug('Applying resource to cluster', { attempt });
1276
- // Check if resource already exists
1277
- let existing;
1278
- try {
1279
- // In the new API, methods return objects directly (no .body wrapper)
1280
- existing = await this.k8sApi.read({
1281
- apiVersion: resolvedResource.apiVersion,
1282
- kind: resolvedResource.kind,
1283
- metadata: {
1284
- name: resolvedResource.metadata?.name || '',
1285
- namespace: resolvedResource.metadata?.namespace || 'default',
1286
- },
1287
- });
1288
- }
1289
- catch (error) {
1290
- // If it's a 404, the resource doesn't exist, which is expected for creation
1291
- const apiError = error;
1292
- // Check for 404 in various error formats:
1293
- // - apiError.statusCode (direct property)
1294
- // - apiError.response?.statusCode (nested response)
1295
- // - apiError.body?.code (body code)
1296
- // - error message containing "HTTP-Code: 404"
1297
- const is404 = apiError.statusCode === 404 ||
1298
- apiError.response?.statusCode === 404 ||
1299
- apiError.body?.code === 404 ||
1300
- (typeof apiError.message === 'string' && apiError.message.includes('HTTP-Code: 404'));
1301
- if (!is404) {
1302
- // Also check for "Unrecognized API version and kind" errors - these indicate
1303
- // the CRD is not installed yet, which should trigger CRD waiting logic
1304
- const isUnrecognizedApiError = typeof apiError.message === 'string' &&
1305
- apiError.message.includes('Unrecognized API version and kind');
1306
- if (isUnrecognizedApiError) {
1307
- resourceLogger.debug('CRD not yet registered, will retry after CRD establishment', error);
1308
- }
1309
- else {
1310
- resourceLogger.error('Error checking resource existence', error);
1311
- }
1312
- throw error;
1313
- }
1314
- // 404 means resource doesn't exist - this is expected, we'll create it below
1315
- }
1316
- if (existing) {
1317
- // Resource exists, use patch for safer updates
1318
- // Log the full resource being patched, including non-standard fields like 'data' for Secrets
1319
- const patchPayload = {
1320
- apiVersion: resolvedResource.apiVersion,
1321
- kind: resolvedResource.kind,
1322
- metadata: resolvedResource.metadata,
1323
- };
1324
- // Include spec if present (most resources)
1325
- if (resolvedResource.spec !== undefined) {
1326
- patchPayload.spec = resolvedResource.spec;
1327
- }
1328
- // Include data if present (Secrets)
1329
- if (resolvedResource.data !== undefined) {
1330
- patchPayload.data = resolvedResource.data;
1331
- }
1332
- // Include stringData if present (Secrets)
1333
- if (resolvedResource.stringData !== undefined) {
1334
- patchPayload.stringData = resolvedResource.stringData;
1335
- }
1336
- // Include rules if present (RBAC resources)
1337
- if (resolvedResource.rules !== undefined) {
1338
- // Ensure arrays are preserved (not converted to objects with numeric keys)
1339
- const rules = resolvedResource.rules;
1340
- patchPayload.rules = Array.isArray(rules) ? [...rules] : rules;
1341
- }
1342
- // Include subjects if present (ClusterRoleBinding, RoleBinding)
1343
- if (resolvedResource.subjects !== undefined) {
1344
- // Ensure arrays are preserved (not converted to objects with numeric keys)
1345
- const subjects = resolvedResource.subjects;
1346
- patchPayload.subjects = Array.isArray(subjects) ? [...subjects] : subjects;
1347
- }
1348
- // Include roleRef if present (ClusterRoleBinding, RoleBinding)
1349
- if (resolvedResource.roleRef !== undefined) {
1350
- patchPayload.roleRef = resolvedResource.roleRef;
1351
- }
1352
- // Explicitly call toJSON to ensure arrays are preserved via our custom toJSON implementation
1353
- // Then use JSON.parse(JSON.stringify()) to ensure we have a plain object without proxies
1354
- const jsonPayload = typeof resolvedResource.toJSON === 'function'
1355
- ? resolvedResource.toJSON()
1356
- : patchPayload;
1357
- // Deep clone to remove any proxy wrappers that might cause serialization issues
1358
- const cleanPayload = JSON.parse(JSON.stringify(jsonPayload));
1359
- // Strip internal TypeKro fields that should not be sent to Kubernetes
1360
- // The 'id' field is used internally for resource mapping but is not a valid K8s field
1361
- delete cleanPayload.id;
1362
- resourceLogger.debug('Resource exists, patching', { patchPayload: cleanPayload });
1363
- // In the new API, methods return objects directly (no .body wrapper)
1364
- appliedResource = await this.patchResourceWithCorrectContentType(cleanPayload);
1365
- }
1366
- else {
1367
- // Resource does not exist, create it
1368
- resourceLogger.debug('Resource does not exist, creating');
1369
- // DEBUG: Log the resource being created for Secrets
1370
- if (resolvedResource.kind === 'Secret') {
1371
- resourceLogger.debug('Creating Secret resource', {
1372
- name: resolvedResource.metadata?.name,
1373
- hasData: 'data' in resolvedResource,
1374
- hasSpec: 'spec' in resolvedResource,
1375
- dataKeys: resolvedResource.data ? Object.keys(resolvedResource.data) : [],
1376
- specValue: resolvedResource.spec,
1377
- });
1378
- }
1379
- // Explicitly call toJSON to ensure arrays are preserved via our custom toJSON implementation
1380
- // Then use JSON.parse(JSON.stringify()) to ensure we have a plain object without proxies
1381
- const jsonResource = typeof resolvedResource.toJSON === 'function'
1382
- ? resolvedResource.toJSON()
1383
- : resolvedResource;
1384
- // Deep clone to remove any proxy wrappers that might cause serialization issues
1385
- const cleanResource = JSON.parse(JSON.stringify(jsonResource));
1386
- // Strip internal TypeKro fields that should not be sent to Kubernetes
1387
- // The 'id' field is used internally for resource mapping but is not a valid K8s field
1388
- delete cleanResource.id;
1389
- // In the new API, methods return objects directly (no .body wrapper)
1390
- appliedResource = await this.k8sApi.create(cleanResource);
1391
- }
1392
- resourceLogger.debug('Resource applied successfully', {
1393
- appliedName: appliedResource.metadata?.name,
1394
- appliedNamespace: appliedResource.metadata?.namespace,
1395
- operation: existing ? 'patched' : 'created',
1396
- attempt,
1397
- });
1398
- // Success - break out of retry loop
1399
- break;
1400
- }
1401
- catch (error) {
1402
- lastError = error;
1403
- // Check for 409 Conflict errors - resource already exists
1404
- const apiError = error;
1405
- const is409 = apiError.statusCode === 409 ||
1406
- apiError.response?.statusCode === 409 ||
1407
- apiError.body?.code === 409 ||
1408
- (typeof apiError.message === 'string' && apiError.message.includes('HTTP-Code: 409'));
1409
- if (is409) {
1410
- const conflictStrategy = options.conflictStrategy || 'warn';
1411
- const resourceName = resolvedResource.metadata?.name || 'unknown';
1412
- const resourceKind = resolvedResource.kind || 'Unknown';
1413
- const resourceNamespace = resolvedResource.metadata?.namespace;
1414
- let conflictHandled = false;
1415
- resourceLogger.debug('Resource already exists (409)', {
1416
- name: resourceName,
1417
- kind: resourceKind,
1418
- conflictStrategy,
1419
- });
1420
- // Handle based on conflict strategy
1421
- switch (conflictStrategy) {
1422
- case 'fail':
1423
- // Throw error immediately - don't retry
1424
- throw new ResourceConflictError(resourceName, resourceKind, resourceNamespace);
1425
- case 'warn':
1426
- // Log warning and treat as success - fetch existing resource
1427
- resourceLogger.warn('Resource already exists, treating as success', {
1428
- name: resourceName,
1429
- kind: resourceKind,
1430
- namespace: resourceNamespace,
1431
- });
1432
- try {
1433
- // Fetch the existing resource to return it
1434
- appliedResource = await this.k8sApi.read({
1435
- apiVersion: resolvedResource.apiVersion,
1436
- kind: resolvedResource.kind,
1437
- metadata: {
1438
- name: resourceName,
1439
- namespace: resourceNamespace || 'default',
1440
- },
1441
- });
1442
- conflictHandled = true;
1443
- }
1444
- catch (readError) {
1445
- resourceLogger.warn('Failed to read existing resource after 409, falling back to patch', readError);
1446
- // Fall back to patch strategy
1447
- try {
1448
- const jsonResource = typeof resolvedResource.toJSON === 'function'
1449
- ? resolvedResource.toJSON()
1450
- : resolvedResource;
1451
- const cleanResource = JSON.parse(JSON.stringify(jsonResource));
1452
- delete cleanResource.id;
1453
- appliedResource = await this.patchResourceWithCorrectContentType(cleanResource);
1454
- resourceLogger.debug('Resource patched successfully after 409 conflict (warn fallback)');
1455
- conflictHandled = true;
1456
- }
1457
- catch (patchError) {
1458
- resourceLogger.warn('Failed to patch resource after 409 conflict', patchError);
1459
- }
1460
- }
1461
- break;
1462
- case 'patch':
1463
- // Attempt to patch the existing resource
1464
- try {
1465
- const jsonResource = typeof resolvedResource.toJSON === 'function'
1466
- ? resolvedResource.toJSON()
1467
- : resolvedResource;
1468
- const cleanResource = JSON.parse(JSON.stringify(jsonResource));
1469
- delete cleanResource.id;
1470
- appliedResource = await this.patchResourceWithCorrectContentType(cleanResource);
1471
- resourceLogger.debug('Resource patched successfully after 409 conflict');
1472
- conflictHandled = true;
1473
- }
1474
- catch (patchError) {
1475
- resourceLogger.warn('Failed to patch resource after 409 conflict', patchError);
1476
- }
1477
- break;
1478
- case 'replace':
1479
- // Delete and recreate the resource
1480
- try {
1481
- resourceLogger.debug('Deleting existing resource for replace strategy');
1482
- await this.k8sApi.delete({
1483
- apiVersion: resolvedResource.apiVersion,
1484
- kind: resolvedResource.kind,
1485
- metadata: {
1486
- name: resourceName,
1487
- namespace: resourceNamespace || 'default',
1488
- },
1489
- });
1490
- // Wait a moment for deletion to propagate
1491
- await new Promise((resolve) => setTimeout(resolve, 500));
1492
- // Create the new resource
1493
- const jsonResource = typeof resolvedResource.toJSON === 'function'
1494
- ? resolvedResource.toJSON()
1495
- : resolvedResource;
1496
- const cleanResource = JSON.parse(JSON.stringify(jsonResource));
1497
- delete cleanResource.id;
1498
- appliedResource = await this.k8sApi.create(cleanResource);
1499
- resourceLogger.debug('Resource replaced successfully after 409 conflict');
1500
- conflictHandled = true;
1501
- }
1502
- catch (replaceError) {
1503
- resourceLogger.warn('Failed to replace resource after 409 conflict', replaceError);
1504
- }
1505
- break;
1506
- }
1507
- // If we successfully handled the conflict, break out of retry loop
1508
- if (conflictHandled) {
1509
- break;
1510
- }
1511
- }
1512
- resourceLogger.error('Failed to apply resource to cluster', lastError, { attempt });
1513
- // Check for HTTP 415 Unsupported Media Type errors
1514
- if (this.isUnsupportedMediaTypeError(error)) {
1515
- const acceptedTypes = this.extractAcceptedMediaTypes(error);
1516
- throw new UnsupportedMediaTypeError(resolvedResource.metadata?.name || 'unknown', resolvedResource.kind || 'Unknown', acceptedTypes, lastError);
1517
- }
1518
- // If this was the last attempt, throw the error
1519
- if (attempt >= retryPolicy.maxRetries) {
1520
- throw new ResourceDeploymentError(resolvedResource.metadata?.name || 'unknown', resolvedResource.kind || 'Unknown', lastError);
1521
- }
1522
- // Calculate delay for next attempt
1523
- const delay = Math.min(retryPolicy.initialDelay * retryPolicy.backoffMultiplier ** attempt, retryPolicy.maxDelay);
1524
- resourceLogger.debug('Retrying resource deployment', {
1525
- attempt: attempt + 1,
1526
- maxRetries: retryPolicy.maxRetries,
1527
- delay,
1528
- });
1529
- // Wait before retrying
1530
- await new Promise((resolve) => setTimeout(resolve, delay));
1531
- }
1532
- }
1533
- }
784
+ await this.resourceApplier.applyResourceToCluster(resolvedResource, options, resourceLogger);
1534
785
  // 4. Create deployed resource record
1535
786
  const deployedResource = {
1536
787
  id: resourceId,
@@ -1557,175 +808,19 @@ export class DirectDeploymentEngine {
1557
808
  * @param abortSignal - Optional AbortSignal to cancel the wait
1558
809
  */
1559
810
  async waitForResourceReady(deployedResource, options, abortSignal) {
1560
- const resourceKey = `${deployedResource.kind}/${deployedResource.name}/${deployedResource.namespace}`;
1561
- // Check if already marked as ready
1562
- if (deployedResource.status === 'ready' || this.readyResources.has(resourceKey)) {
1563
- this.logger.debug('Resource already marked as ready', { resourceKey });
1564
- return;
1565
- }
1566
- // Check if already aborted
1567
- if (abortSignal?.aborted) {
1568
- throw new DOMException('Operation aborted', 'AbortError');
1569
- }
1570
- const enhancedManifest = deployedResource.manifest;
1571
- const readinessEvaluator = enhancedManifest.readinessEvaluator;
1572
- // Debug logging removed
1573
- if (!readinessEvaluator) {
1574
- const errorMessage = `Resource ${deployedResource.kind}/${deployedResource.name} does not have a factory-provided readiness evaluator`;
1575
- this.logger.error('Missing factory-provided readiness evaluator');
1576
- throw new Error(errorMessage);
1577
- }
1578
- const startTime = Date.now();
1579
- const timeout = options.timeout || 300000; // 5 minutes default
1580
- let lastStatus = null;
1581
- while (Date.now() - startTime < timeout) {
1582
- // Check if aborted before each iteration
1583
- if (abortSignal?.aborted) {
1584
- throw new DOMException('Operation aborted', 'AbortError');
1585
- }
1586
- try {
1587
- // Use custom readiness evaluator
1588
- // In the new API, methods return objects directly (no .body wrapper)
1589
- // Wrap with abort signal handling to stop waiting if aborted
1590
- const liveResource = await this.withAbortSignal(this.k8sApi.read({
1591
- apiVersion: deployedResource.manifest.apiVersion || '',
1592
- kind: deployedResource.kind,
1593
- metadata: {
1594
- name: deployedResource.name,
1595
- namespace: deployedResource.namespace,
1596
- },
1597
- }), abortSignal);
1598
- // Apply kind-specific enhancements before calling custom evaluator
1599
- const enhancedResource = this.enhanceResourceForEvaluation(liveResource, deployedResource.kind);
1600
- const result = readinessEvaluator(enhancedResource);
1601
- if (typeof result === 'boolean') {
1602
- if (result) {
1603
- this.readyResources.add(resourceKey);
1604
- this.emitEvent(options, {
1605
- type: 'resource-ready',
1606
- resourceId: deployedResource.id,
1607
- message: `${deployedResource.kind}/${deployedResource.name} ready (custom evaluator)`,
1608
- timestamp: new Date(),
1609
- });
1610
- return;
1611
- }
1612
- }
1613
- else if (result && typeof result === 'object' && 'ready' in result) {
1614
- lastStatus = result;
1615
- if (result.ready) {
1616
- this.readyResources.add(resourceKey);
1617
- this.emitEvent(options, {
1618
- type: 'resource-ready',
1619
- resourceId: deployedResource.id,
1620
- message: result.message ||
1621
- `${deployedResource.kind}/${deployedResource.name} ready (custom evaluator)`,
1622
- timestamp: new Date(),
1623
- });
1624
- return;
1625
- }
1626
- }
1627
- // Emit status update if we have status information
1628
- if (lastStatus && typeof lastStatus === 'object' && 'message' in lastStatus) {
1629
- this.emitEvent(options, {
1630
- type: 'resource-status',
1631
- resourceId: deployedResource.id,
1632
- message: `${deployedResource.kind}/${deployedResource.name}: ${lastStatus.message}`,
1633
- timestamp: new Date(),
1634
- });
1635
- }
1636
- // Wait before next check - use abortable delay
1637
- try {
1638
- await this.abortableDelay(2000, abortSignal);
1639
- }
1640
- catch (error) {
1641
- if (error instanceof DOMException && (error.name === 'AbortError' || error.name === 'TimeoutError')) {
1642
- throw error; // Re-throw abort/timeout errors
1643
- }
1644
- // Ignore other errors from delay
1645
- }
1646
- }
1647
- catch (error) {
1648
- // Re-throw abort/timeout errors immediately
1649
- if (error instanceof DOMException && (error.name === 'AbortError' || error.name === 'TimeoutError')) {
1650
- throw error;
1651
- }
1652
- // Emit error status event
1653
- this.emitEvent(options, {
1654
- type: 'resource-status',
1655
- resourceId: deployedResource.id,
1656
- message: `Unable to read resource status: ${error instanceof Error ? error.message : String(error)}`,
1657
- timestamp: new Date(),
1658
- });
1659
- // If we can't read the resource, it's not ready yet - use abortable delay
1660
- try {
1661
- await this.abortableDelay(2000, abortSignal);
1662
- }
1663
- catch (delayError) {
1664
- if (delayError instanceof DOMException && (delayError.name === 'AbortError' || delayError.name === 'TimeoutError')) {
1665
- throw delayError; // Re-throw abort/timeout errors
1666
- }
1667
- // Ignore other errors from delay
1668
- }
1669
- }
1670
- }
1671
- // Timeout reached
1672
- const timeoutMessage = lastStatus
1673
- ? `Timeout waiting for ${deployedResource.kind}/${deployedResource.name}: ${lastStatus.message}`
1674
- : `Timeout waiting for ${deployedResource.kind}/${deployedResource.name} to be ready`;
1675
- throw new Error(timeoutMessage);
811
+ return this.readinessWaiter.waitForResourceReady(deployedResource, options, abortSignal);
1676
812
  }
1677
813
  /**
1678
814
  * Rollback deployed resources
1679
815
  */
1680
816
  async rollbackDeployedResources(deployedResources, options) {
1681
- this.emitEvent(options, {
1682
- type: 'rollback',
1683
- message: 'Starting rollback of deployed resources',
1684
- timestamp: new Date(),
1685
- });
1686
- const rolledBackResources = [];
1687
- const errors = [];
1688
- // Rollback in reverse order
1689
- const reversedResources = [...deployedResources].reverse();
1690
- for (const resource of reversedResources) {
1691
- // Only try to rollback resources that were actually deployed (not failed)
1692
- if (resource.status === 'failed') {
1693
- continue; // Skip resources that failed to deploy
1694
- }
1695
- try {
1696
- await this.k8sApi.delete({
1697
- apiVersion: resource.manifest.apiVersion || '',
1698
- kind: resource.kind,
1699
- metadata: {
1700
- name: resource.name,
1701
- namespace: resource.namespace,
1702
- },
1703
- });
1704
- rolledBackResources.push(`${resource.kind}/${resource.name}`);
1705
- }
1706
- catch (error) {
1707
- // Log and collect errors for individual resource deletion failures
1708
- this.logger.warn('Failed to delete resource during rollback', {
1709
- error: error,
1710
- resourceId: resource.id,
1711
- kind: resource.kind,
1712
- name: resource.name,
1713
- });
1714
- errors.push({
1715
- resourceId: resource.id,
1716
- phase: 'rollback',
1717
- error: error,
1718
- timestamp: new Date(),
1719
- });
1720
- }
1721
- }
1722
- return { rolledBackResources, errors };
817
+ return this.rollbackManager.rollbackDeployedResources(deployedResources, options);
1723
818
  }
1724
819
  /**
1725
820
  * Generate a unique deployment ID
1726
821
  */
1727
822
  generateDeploymentId() {
1728
- return `deployment-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
823
+ return `deployment-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
1729
824
  }
1730
825
  /**
1731
826
  * Emit deployment events
@@ -1743,7 +838,7 @@ export class DirectDeploymentEngine {
1743
838
  deployedResources: [],
1744
839
  kubeClient: this.kubeClient,
1745
840
  ...(options.namespace && { namespace: options.namespace }),
1746
- timeout: options.timeout || 30000,
841
+ timeout: options.timeout || DEFAULT_READINESS_TIMEOUT,
1747
842
  };
1748
843
  // Legacy method - no abort signal support
1749
844
  return this.deploySingleResource(resource, context, options, undefined);
@@ -1752,58 +847,7 @@ export class DirectDeploymentEngine {
1752
847
  * Delete a resource from the cluster
1753
848
  */
1754
849
  async deleteResource(resource) {
1755
- const deleteLogger = this.logger.child({
1756
- resourceId: resource.id,
1757
- kind: resource.kind,
1758
- name: resource.name,
1759
- });
1760
- try {
1761
- await this.k8sApi.delete({
1762
- apiVersion: resource.manifest.apiVersion || '',
1763
- kind: resource.kind,
1764
- metadata: {
1765
- name: resource.name,
1766
- namespace: resource.namespace,
1767
- },
1768
- });
1769
- // Wait for resource to be deleted
1770
- const timeout = 30000; // 30 seconds
1771
- const startTime = Date.now();
1772
- while (Date.now() - startTime < timeout) {
1773
- try {
1774
- await this.k8sApi.read({
1775
- apiVersion: resource.manifest.apiVersion || '',
1776
- kind: resource.kind,
1777
- metadata: {
1778
- name: resource.name,
1779
- namespace: resource.namespace,
1780
- },
1781
- });
1782
- // Resource still exists, wait and try again
1783
- await new Promise((resolve) => setTimeout(resolve, 1000));
1784
- }
1785
- catch (error) {
1786
- // Resource not found, deletion successful
1787
- if (this.isNotFoundError(error)) {
1788
- deleteLogger.debug('Resource successfully deleted');
1789
- return;
1790
- }
1791
- throw error;
1792
- }
1793
- }
1794
- throw new Error(`Timeout waiting for resource ${resource.kind}/${resource.name} to be deleted`);
1795
- }
1796
- catch (error) {
1797
- deleteLogger.error('Failed to delete resource', error);
1798
- throw error;
1799
- }
1800
- }
1801
- /**
1802
- * Wait for resource readiness (legacy method for compatibility)
1803
- */
1804
- async waitForResourceReadiness(resource, options) {
1805
- // Legacy method - no abort signal support
1806
- return this.waitForResourceReady(resource, options, undefined);
850
+ return this.rollbackManager.deleteDeployedResource(resource);
1807
851
  }
1808
852
  /**
1809
853
  * Rollback a deployment by ID
@@ -1812,7 +856,7 @@ export class DirectDeploymentEngine {
1812
856
  const startTime = Date.now();
1813
857
  const deploymentRecord = this.deploymentState.get(deploymentId);
1814
858
  if (!deploymentRecord) {
1815
- throw new Error(`Deployment ${deploymentId} not found. Cannot rollback.`);
859
+ throw new ResourceGraphFactoryError(`Deployment ${deploymentId} not found. Cannot rollback.`, deploymentId, 'cleanup');
1816
860
  }
1817
861
  try {
1818
862
  const { rolledBackResources, errors } = await this.rollbackDeployedResources(deploymentRecord.resources, deploymentRecord.options);
@@ -1836,7 +880,7 @@ export class DirectDeploymentEngine {
1836
880
  {
1837
881
  resourceId: deploymentId,
1838
882
  phase: 'rollback',
1839
- error: error,
883
+ error: ensureError(error),
1840
884
  timestamp: new Date(),
1841
885
  },
1842
886
  ],
@@ -1872,253 +916,11 @@ export class DirectDeploymentEngine {
1872
916
  }
1873
917
  return result;
1874
918
  }
1875
- /**
1876
- * Patch a resource with the correct Content-Type header for merge patch operations
1877
- * This fixes HTTP 415 "Unsupported Media Type" errors that occur when using the generic patch method
1878
- * In the new API, methods return objects directly (no .body wrapper)
1879
- */
1880
- async patchResourceWithCorrectContentType(resource) {
1881
- // DEBUG: Log the resource being sent to K8s API for Secrets
1882
- if (resource.kind === 'Secret') {
1883
- const secretResource = resource;
1884
- this.logger.debug('Patching Secret resource', {
1885
- name: resource.metadata?.name,
1886
- hasData: 'data' in resource,
1887
- hasSpec: 'spec' in resource,
1888
- dataKeys: secretResource.data ? Object.keys(secretResource.data) : [],
1889
- specValue: secretResource.spec,
1890
- });
1891
- }
1892
- // The k8sApi.patch method requires the full content-type string for the patchStrategy parameter
1893
- // Use 'application/merge-patch+json' for merge patch operations
1894
- // See: https://kubernetes.io/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/
1895
- return await this.k8sApi.patch(resource, undefined, // pretty
1896
- undefined, // dryRun
1897
- undefined, // fieldManager
1898
- undefined, // force
1899
- 'application/merge-patch+json' // patchStrategy - must be the full content-type string
1900
- );
1901
- }
1902
- /**
1903
- * Check if an error is a "not found" error
1904
- */
1905
- isNotFoundError(error) {
1906
- if (error && typeof error === 'object') {
1907
- const k8sError = error;
1908
- return k8sError.statusCode === 404 || k8sError.body?.code === 404;
1909
- }
1910
- return false;
1911
- }
1912
- /**
1913
- * Wait for CRD establishment if the resource is a custom resource
1914
- */
1915
- async waitForCRDIfCustomResource(resource, options, logger, abortSignal) {
1916
- // Check if already aborted
1917
- if (abortSignal?.aborted) {
1918
- throw new DOMException('Operation aborted', 'AbortError');
1919
- }
1920
- // Skip if this is not a custom resource
1921
- if (!this.isCustomResource(resource)) {
1922
- return;
1923
- }
1924
- const crdName = await this.getCRDNameForResource(resource);
1925
- if (!crdName) {
1926
- logger.warn('Could not determine CRD name for custom resource', {
1927
- kind: resource.kind,
1928
- apiVersion: resource.apiVersion,
1929
- });
1930
- return;
1931
- }
1932
- logger.debug('Custom resource detected, waiting for CRD establishment', {
1933
- resourceKind: resource.kind,
1934
- crdName,
1935
- });
1936
- await this.waitForCRDEstablishment({ metadata: { name: crdName } }, options, logger, abortSignal);
1937
- logger.debug('CRD established, proceeding with custom resource deployment', {
1938
- resourceKind: resource.kind,
1939
- crdName,
1940
- });
1941
- }
1942
- /**
1943
- * Check if a resource is a custom resource (not a built-in Kubernetes resource)
1944
- */
1945
- isCustomResource(resource) {
1946
- if (!resource.apiVersion || !resource.kind) {
1947
- return false;
1948
- }
1949
- // Built-in Kubernetes API groups that are NOT custom resources
1950
- const builtInApiGroups = [
1951
- 'v1', // Core API group
1952
- 'apps/v1',
1953
- 'extensions/v1beta1',
1954
- 'networking.k8s.io/v1',
1955
- 'policy/v1',
1956
- 'rbac.authorization.k8s.io/v1',
1957
- 'storage.k8s.io/v1',
1958
- 'apiextensions.k8s.io/v1', // CRDs themselves
1959
- 'admissionregistration.k8s.io/v1',
1960
- 'apiregistration.k8s.io/v1',
1961
- 'authentication.k8s.io/v1',
1962
- 'authorization.k8s.io/v1',
1963
- 'autoscaling/v1',
1964
- 'autoscaling/v2',
1965
- 'batch/v1',
1966
- 'certificates.k8s.io/v1',
1967
- 'coordination.k8s.io/v1',
1968
- 'discovery.k8s.io/v1',
1969
- 'events.k8s.io/v1',
1970
- 'flowcontrol.apiserver.k8s.io/v1beta3',
1971
- 'node.k8s.io/v1',
1972
- 'scheduling.k8s.io/v1',
1973
- ];
1974
- return !builtInApiGroups.includes(resource.apiVersion);
1975
- }
1976
- /**
1977
- * Get the CRD name for a custom resource
1978
- */
1979
- async getCRDNameForResource(resource) {
1980
- if (!resource.apiVersion || !resource.kind) {
1981
- return null;
1982
- }
1983
- // Only return CRD name for custom resources
1984
- if (!this.isCustomResource(resource)) {
1985
- return null;
1986
- }
1987
- // Extract group from apiVersion (e.g., "example.com/v1" -> "example.com")
1988
- const apiVersionParts = resource.apiVersion.split('/');
1989
- const group = apiVersionParts.length > 1 ? apiVersionParts[0] : '';
1990
- if (!group) {
1991
- return null; // Core API resources don't have CRDs
1992
- }
1993
- try {
1994
- // Try to find the CRD by querying the API
1995
- const crds = await this.k8sApi.list('apiextensions.k8s.io/v1', 'CustomResourceDefinition');
1996
- // Look for a CRD that matches our group and kind
1997
- // In the new API, methods return objects directly (no .body wrapper)
1998
- const crdList = crds;
1999
- const matchingCrd = crdList?.items?.find((crd) => {
2000
- const crdSpec = crd.spec;
2001
- return crdSpec?.group === group && crdSpec?.names?.kind === resource.kind;
2002
- });
2003
- if (matchingCrd) {
2004
- return matchingCrd.metadata?.name ?? null;
2005
- }
2006
- }
2007
- catch (error) {
2008
- // If we can't query CRDs, fall back to heuristic
2009
- console.warn('Failed to query CRDs, using heuristic for CRD name generation:', error);
2010
- }
2011
- // Fallback: Convert Kind to plural lowercase (simple heuristic)
2012
- const kind = resource.kind.toLowerCase();
2013
- const plural = kind.endsWith('s') ? kind : `${kind}s`;
2014
- return `${plural}.${group}`;
2015
- }
2016
919
  /**
2017
920
  * Public method to wait for CRD readiness by name
2018
921
  */
2019
- async waitForCRDReady(crdName, timeout = 300000, abortSignal) {
2020
- const logger = this.logger.child({ crdName, timeout });
2021
- const options = {
2022
- mode: this.deploymentMode,
2023
- timeout,
2024
- };
2025
- await this.waitForCRDEstablishment({ metadata: { name: crdName } }, options, logger, abortSignal);
2026
- }
2027
- /**
2028
- * Wait for a CRD to be established in the cluster
2029
- */
2030
- async waitForCRDEstablishment(crd, options, logger, abortSignal) {
2031
- const crdName = crd.metadata?.name;
2032
- const timeout = options.timeout || 300000; // 5 minutes default
2033
- const startTime = Date.now();
2034
- const pollInterval = 2000; // 2 seconds
2035
- logger.debug('Waiting for CRD to exist and be established', { crdName, timeout });
2036
- while (Date.now() - startTime < timeout) {
2037
- // Check if aborted before each iteration
2038
- if (abortSignal?.aborted) {
2039
- throw new DOMException('Operation aborted', 'AbortError');
2040
- }
2041
- try {
2042
- // Check if CRD is established by reading its status
2043
- // Wrap with abort signal handling
2044
- const crdStatus = await this.withAbortSignal(this.k8sApi.read({
2045
- apiVersion: 'apiextensions.k8s.io/v1',
2046
- kind: 'CustomResourceDefinition',
2047
- metadata: { name: crdName }, // CRDs are cluster-scoped, no namespace needed
2048
- }), abortSignal);
2049
- // In the new API, methods return objects directly (no .body wrapper)
2050
- const crdItem = crdStatus;
2051
- const conditions = crdItem?.status?.conditions || [];
2052
- const establishedCondition = conditions.find((c) => c.type === 'Established');
2053
- if (establishedCondition?.status === 'True') {
2054
- logger.debug('CRD exists and is established', { crdName });
2055
- return;
2056
- }
2057
- logger.debug('CRD exists but not yet established, waiting...', {
2058
- crdName,
2059
- establishedStatus: establishedCondition?.status || 'unknown',
2060
- });
2061
- }
2062
- catch (error) {
2063
- // Re-throw abort/timeout errors immediately
2064
- if (error instanceof DOMException && (error.name === 'AbortError' || error.name === 'TimeoutError')) {
2065
- throw error;
2066
- }
2067
- // CRD might not exist yet (e.g., being installed by a closure)
2068
- // This is expected in scenarios where closures install CRDs
2069
- logger.debug('CRD not found yet, waiting for it to be created...', {
2070
- crdName,
2071
- error: error.message,
2072
- });
2073
- }
2074
- // Wait before next poll - use abortable delay
2075
- try {
2076
- await this.abortableDelay(pollInterval, abortSignal);
2077
- }
2078
- catch (error) {
2079
- if (error instanceof DOMException && (error.name === 'AbortError' || error.name === 'TimeoutError')) {
2080
- throw error; // Re-throw abort/timeout errors
2081
- }
2082
- // Ignore other errors from delay
2083
- }
2084
- }
2085
- // Timeout reached
2086
- throw new Error(`Timeout waiting for CRD ${crdName} to be established after ${timeout}ms`);
2087
- }
2088
- /**
2089
- * Check if an error is an HTTP 415 Unsupported Media Type error
2090
- */
2091
- isUnsupportedMediaTypeError(error) {
2092
- if (!error || typeof error !== 'object') {
2093
- return false;
2094
- }
2095
- const apiError = error;
2096
- return (apiError.statusCode === 415 ||
2097
- apiError.response?.statusCode === 415 ||
2098
- apiError.body?.code === 415);
2099
- }
2100
- /**
2101
- * Extract accepted media types from HTTP 415 error message
2102
- */
2103
- extractAcceptedMediaTypes(error) {
2104
- const defaultTypes = [
2105
- 'application/json-patch+json',
2106
- 'application/merge-patch+json',
2107
- 'application/apply-patch+yaml',
2108
- ];
2109
- try {
2110
- // Try to extract from error message
2111
- const apiError = error;
2112
- const message = apiError.message || apiError.body?.message || '';
2113
- const match = message.match(/accepted media types include: ([^"]+)/);
2114
- if (match && match[1]) {
2115
- return match[1].split(', ').map((type) => type.trim());
2116
- }
2117
- }
2118
- catch (_e) {
2119
- // Fallback to default types
2120
- }
2121
- return defaultTypes;
922
+ async waitForCRDReady(crdName, timeout = DEFAULT_CRD_READY_TIMEOUT, abortSignal) {
923
+ await this.crdManager.waitForCRDReady(crdName, this.deploymentMode, timeout, abortSignal);
2122
924
  }
2123
925
  }
2124
926
  //# sourceMappingURL=engine.js.map