typekro 0.2.2 → 0.3.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 (197) hide show
  1. package/README.md +4 -3
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/core/composition/imperative.d.ts.map +1 -1
  4. package/dist/core/composition/imperative.js +15 -2
  5. package/dist/core/composition/imperative.js.map +1 -1
  6. package/dist/core/composition/typekro-runtime/typekro-runtime.d.ts.map +1 -1
  7. package/dist/core/composition/typekro-runtime/typekro-runtime.js +24 -25
  8. package/dist/core/composition/typekro-runtime/typekro-runtime.js.map +1 -1
  9. package/dist/core/dependencies/type-guards.d.ts.map +1 -1
  10. package/dist/core/dependencies/type-guards.js +7 -2
  11. package/dist/core/dependencies/type-guards.js.map +1 -1
  12. package/dist/core/deployment/engine.d.ts +0 -1
  13. package/dist/core/deployment/engine.d.ts.map +1 -1
  14. package/dist/core/deployment/engine.js +0 -1
  15. package/dist/core/deployment/engine.js.map +1 -1
  16. package/dist/core/errors.d.ts +85 -0
  17. package/dist/core/errors.d.ts.map +1 -1
  18. package/dist/core/errors.js +135 -0
  19. package/dist/core/errors.js.map +1 -1
  20. package/dist/core/expressions/analyzer.d.ts +584 -0
  21. package/dist/core/expressions/analyzer.d.ts.map +1 -0
  22. package/dist/core/expressions/analyzer.js +2956 -0
  23. package/dist/core/expressions/analyzer.js.map +1 -0
  24. package/dist/core/expressions/cache.d.ts +136 -0
  25. package/dist/core/expressions/cache.d.ts.map +1 -0
  26. package/dist/core/expressions/cache.js +347 -0
  27. package/dist/core/expressions/cache.js.map +1 -0
  28. package/dist/core/expressions/cel-conversion-engine.d.ts +126 -0
  29. package/dist/core/expressions/cel-conversion-engine.d.ts.map +1 -0
  30. package/dist/core/expressions/cel-conversion-engine.js +293 -0
  31. package/dist/core/expressions/cel-conversion-engine.js.map +1 -0
  32. package/dist/core/expressions/compile-time-validation.d.ts +270 -0
  33. package/dist/core/expressions/compile-time-validation.d.ts.map +1 -0
  34. package/dist/core/expressions/compile-time-validation.js +506 -0
  35. package/dist/core/expressions/compile-time-validation.js.map +1 -0
  36. package/dist/core/expressions/composition-integration.d.ts +315 -0
  37. package/dist/core/expressions/composition-integration.d.ts.map +1 -0
  38. package/dist/core/expressions/composition-integration.js +936 -0
  39. package/dist/core/expressions/composition-integration.js.map +1 -0
  40. package/dist/core/expressions/conditional-expression-processor.d.ts +154 -0
  41. package/dist/core/expressions/conditional-expression-processor.d.ts.map +1 -0
  42. package/dist/core/expressions/conditional-expression-processor.js +479 -0
  43. package/dist/core/expressions/conditional-expression-processor.js.map +1 -0
  44. package/dist/core/expressions/conditional-integration.d.ts +133 -0
  45. package/dist/core/expressions/conditional-integration.d.ts.map +1 -0
  46. package/dist/core/expressions/conditional-integration.js +293 -0
  47. package/dist/core/expressions/conditional-integration.js.map +1 -0
  48. package/dist/core/expressions/conditional-validation.d.ts +181 -0
  49. package/dist/core/expressions/conditional-validation.d.ts.map +1 -0
  50. package/dist/core/expressions/conditional-validation.js +460 -0
  51. package/dist/core/expressions/conditional-validation.js.map +1 -0
  52. package/dist/core/expressions/context-aware-generator.d.ts +127 -0
  53. package/dist/core/expressions/context-aware-generator.d.ts.map +1 -0
  54. package/dist/core/expressions/context-aware-generator.js +500 -0
  55. package/dist/core/expressions/context-aware-generator.js.map +1 -0
  56. package/dist/core/expressions/context-detector.d.ts +148 -0
  57. package/dist/core/expressions/context-detector.d.ts.map +1 -0
  58. package/dist/core/expressions/context-detector.js +546 -0
  59. package/dist/core/expressions/context-detector.js.map +1 -0
  60. package/dist/core/expressions/context-switcher.d.ts +185 -0
  61. package/dist/core/expressions/context-switcher.d.ts.map +1 -0
  62. package/dist/core/expressions/context-switcher.js +515 -0
  63. package/dist/core/expressions/context-switcher.js.map +1 -0
  64. package/dist/core/expressions/context-validator.d.ts +176 -0
  65. package/dist/core/expressions/context-validator.d.ts.map +1 -0
  66. package/dist/core/expressions/context-validator.js +452 -0
  67. package/dist/core/expressions/context-validator.js.map +1 -0
  68. package/dist/core/expressions/custom-context-manager.d.ts +194 -0
  69. package/dist/core/expressions/custom-context-manager.d.ts.map +1 -0
  70. package/dist/core/expressions/custom-context-manager.js +390 -0
  71. package/dist/core/expressions/custom-context-manager.js.map +1 -0
  72. package/dist/core/expressions/expression-proxy.d.ts +80 -0
  73. package/dist/core/expressions/expression-proxy.d.ts.map +1 -0
  74. package/dist/core/expressions/expression-proxy.js +227 -0
  75. package/dist/core/expressions/expression-proxy.js.map +1 -0
  76. package/dist/core/expressions/factory-integration.d.ts +132 -0
  77. package/dist/core/expressions/factory-integration.d.ts.map +1 -0
  78. package/dist/core/expressions/factory-integration.js +327 -0
  79. package/dist/core/expressions/factory-integration.js.map +1 -0
  80. package/dist/core/expressions/factory-pattern-handler.d.ts +88 -0
  81. package/dist/core/expressions/factory-pattern-handler.d.ts.map +1 -0
  82. package/dist/core/expressions/factory-pattern-handler.js +336 -0
  83. package/dist/core/expressions/factory-pattern-handler.js.map +1 -0
  84. package/dist/core/expressions/field-hydration-processor.d.ts +188 -0
  85. package/dist/core/expressions/field-hydration-processor.d.ts.map +1 -0
  86. package/dist/core/expressions/field-hydration-processor.js +562 -0
  87. package/dist/core/expressions/field-hydration-processor.js.map +1 -0
  88. package/dist/core/expressions/imperative-analyzer.d.ts +21 -0
  89. package/dist/core/expressions/imperative-analyzer.d.ts.map +1 -0
  90. package/dist/core/expressions/imperative-analyzer.js +343 -0
  91. package/dist/core/expressions/imperative-analyzer.js.map +1 -0
  92. package/dist/core/expressions/index.d.ts +54 -0
  93. package/dist/core/expressions/index.d.ts.map +1 -0
  94. package/dist/core/expressions/index.js +50 -0
  95. package/dist/core/expressions/index.js.map +1 -0
  96. package/dist/core/expressions/lazy-analysis.d.ts +1128 -0
  97. package/dist/core/expressions/lazy-analysis.d.ts.map +1 -0
  98. package/dist/core/expressions/lazy-analysis.js +2443 -0
  99. package/dist/core/expressions/lazy-analysis.js.map +1 -0
  100. package/dist/core/expressions/magic-assignable-analyzer.d.ts +123 -0
  101. package/dist/core/expressions/magic-assignable-analyzer.d.ts.map +1 -0
  102. package/dist/core/expressions/magic-assignable-analyzer.js +352 -0
  103. package/dist/core/expressions/magic-assignable-analyzer.js.map +1 -0
  104. package/dist/core/expressions/magic-proxy-analyzer.d.ts +206 -0
  105. package/dist/core/expressions/magic-proxy-analyzer.d.ts.map +1 -0
  106. package/dist/core/expressions/magic-proxy-analyzer.js +639 -0
  107. package/dist/core/expressions/magic-proxy-analyzer.js.map +1 -0
  108. package/dist/core/expressions/magic-proxy-detector.d.ts +154 -0
  109. package/dist/core/expressions/magic-proxy-detector.d.ts.map +1 -0
  110. package/dist/core/expressions/magic-proxy-detector.js +242 -0
  111. package/dist/core/expressions/magic-proxy-detector.js.map +1 -0
  112. package/dist/core/expressions/migration-helpers.d.ts +133 -0
  113. package/dist/core/expressions/migration-helpers.d.ts.map +1 -0
  114. package/dist/core/expressions/migration-helpers.js +443 -0
  115. package/dist/core/expressions/migration-helpers.js.map +1 -0
  116. package/dist/core/expressions/optionality-handler.d.ts +503 -0
  117. package/dist/core/expressions/optionality-handler.d.ts.map +1 -0
  118. package/dist/core/expressions/optionality-handler.js +1306 -0
  119. package/dist/core/expressions/optionality-handler.js.map +1 -0
  120. package/dist/core/expressions/readiness-integration.d.ts +119 -0
  121. package/dist/core/expressions/readiness-integration.d.ts.map +1 -0
  122. package/dist/core/expressions/readiness-integration.js +386 -0
  123. package/dist/core/expressions/readiness-integration.js.map +1 -0
  124. package/dist/core/expressions/resource-analyzer.d.ts +486 -0
  125. package/dist/core/expressions/resource-analyzer.d.ts.map +1 -0
  126. package/dist/core/expressions/resource-analyzer.js +1086 -0
  127. package/dist/core/expressions/resource-analyzer.js.map +1 -0
  128. package/dist/core/expressions/resource-validation.d.ts +187 -0
  129. package/dist/core/expressions/resource-validation.d.ts.map +1 -0
  130. package/dist/core/expressions/resource-validation.js +552 -0
  131. package/dist/core/expressions/resource-validation.js.map +1 -0
  132. package/dist/core/expressions/runtime-error-mapper.d.ts +138 -0
  133. package/dist/core/expressions/runtime-error-mapper.d.ts.map +1 -0
  134. package/dist/core/expressions/runtime-error-mapper.js +412 -0
  135. package/dist/core/expressions/runtime-error-mapper.js.map +1 -0
  136. package/dist/core/expressions/source-map.d.ts +168 -0
  137. package/dist/core/expressions/source-map.d.ts.map +1 -0
  138. package/dist/core/expressions/source-map.js +350 -0
  139. package/dist/core/expressions/source-map.js.map +1 -0
  140. package/dist/core/expressions/status-builder-analyzer.d.ts +353 -0
  141. package/dist/core/expressions/status-builder-analyzer.d.ts.map +1 -0
  142. package/dist/core/expressions/status-builder-analyzer.js +1301 -0
  143. package/dist/core/expressions/status-builder-analyzer.js.map +1 -0
  144. package/dist/core/expressions/type-inference.d.ts +184 -0
  145. package/dist/core/expressions/type-inference.d.ts.map +1 -0
  146. package/dist/core/expressions/type-inference.js +838 -0
  147. package/dist/core/expressions/type-inference.js.map +1 -0
  148. package/dist/core/expressions/type-safety.d.ts +203 -0
  149. package/dist/core/expressions/type-safety.d.ts.map +1 -0
  150. package/dist/core/expressions/type-safety.js +442 -0
  151. package/dist/core/expressions/type-safety.js.map +1 -0
  152. package/dist/core/expressions/types.d.ts +282 -0
  153. package/dist/core/expressions/types.d.ts.map +1 -0
  154. package/dist/core/expressions/types.js +8 -0
  155. package/dist/core/expressions/types.js.map +1 -0
  156. package/dist/core/kubernetes/client-provider.js +2 -2
  157. package/dist/core/kubernetes/client-provider.js.map +1 -1
  158. package/dist/core/serialization/core.d.ts.map +1 -1
  159. package/dist/core/serialization/core.js +573 -9
  160. package/dist/core/serialization/core.js.map +1 -1
  161. package/dist/core/types/deployment.d.ts +4 -0
  162. package/dist/core/types/deployment.d.ts.map +1 -1
  163. package/dist/core/types/deployment.js.map +1 -1
  164. package/dist/core/types/index.d.ts +1 -0
  165. package/dist/core/types/index.d.ts.map +1 -1
  166. package/dist/core/types/index.js.map +1 -1
  167. package/dist/core.d.ts +1 -1
  168. package/dist/core.d.ts.map +1 -1
  169. package/dist/core.js +1 -1
  170. package/dist/core.js.map +1 -1
  171. package/dist/factories/helm/helm-release.d.ts.map +1 -1
  172. package/dist/factories/helm/helm-release.js +0 -5
  173. package/dist/factories/helm/helm-release.js.map +1 -1
  174. package/dist/factories/helm/types.d.ts +1 -1
  175. package/dist/factories/helm/types.d.ts.map +1 -1
  176. package/dist/factories/shared.d.ts.map +1 -1
  177. package/dist/factories/shared.js +21 -1
  178. package/dist/factories/shared.js.map +1 -1
  179. package/dist/factories/simple/index.d.ts +2 -2
  180. package/dist/factories/simple/index.d.ts.map +1 -1
  181. package/dist/factories/simple/workloads/deployment.d.ts +3 -3
  182. package/dist/factories/simple/workloads/deployment.d.ts.map +1 -1
  183. package/dist/factories/simple/workloads/deployment.js +37 -11
  184. package/dist/factories/simple/workloads/deployment.js.map +1 -1
  185. package/dist/index.d.ts +1 -1
  186. package/dist/index.d.ts.map +1 -1
  187. package/dist/index.js +1 -1
  188. package/dist/index.js.map +1 -1
  189. package/dist/utils/index.d.ts +1 -1
  190. package/dist/utils/index.d.ts.map +1 -1
  191. package/dist/utils/index.js +1 -1
  192. package/dist/utils/index.js.map +1 -1
  193. package/dist/utils/type-guards.d.ts +6 -0
  194. package/dist/utils/type-guards.d.ts.map +1 -1
  195. package/dist/utils/type-guards.js +25 -2
  196. package/dist/utils/type-guards.js.map +1 -1
  197. package/package.json +6 -1
@@ -0,0 +1,460 @@
1
+ /**
2
+ * Conditional Expression Validation
3
+ *
4
+ * This module provides comprehensive validation for conditional expressions
5
+ * containing KubernetesRef objects, ensuring they are well-formed and
6
+ * appropriate for their intended contexts.
7
+ */
8
+ import { getComponentLogger } from '../logging/index.js';
9
+ import { isKubernetesRef } from '../../utils/type-guards.js';
10
+ import { MagicProxyDetector } from './magic-proxy-detector.js';
11
+ import { ExpressionContextDetector } from './context-detector.js';
12
+ const logger = getComponentLogger('conditional-validation');
13
+ /**
14
+ * Conditional Expression Validator
15
+ *
16
+ * Provides comprehensive validation for conditional expressions containing
17
+ * KubernetesRef objects, ensuring they are well-formed and contextually appropriate.
18
+ */
19
+ export class ConditionalExpressionValidator {
20
+ rules = new Map();
21
+ magicProxyDetector;
22
+ contextDetector;
23
+ constructor() {
24
+ this.magicProxyDetector = new MagicProxyDetector();
25
+ this.contextDetector = new ExpressionContextDetector();
26
+ // Register built-in validation rules
27
+ this.registerBuiltInRules();
28
+ }
29
+ /**
30
+ * Validate a conditional expression
31
+ *
32
+ * @param expression - Expression to validate
33
+ * @param context - Factory context
34
+ * @param config - Validation configuration
35
+ * @returns Comprehensive validation result
36
+ */
37
+ validateExpression(expression, context, config = {}) {
38
+ const startTime = performance.now();
39
+ logger.debug('Starting conditional expression validation', {
40
+ factoryType: context.factoryType,
41
+ expressionType: typeof expression,
42
+ strictMode: config.strictMode
43
+ });
44
+ // Detect KubernetesRef objects
45
+ const detectionResult = this.magicProxyDetector.detectKubernetesRefs(expression, {
46
+ maxDepth: 10,
47
+ includeDetailedPaths: true,
48
+ analyzeReferenceSources: true
49
+ });
50
+ // Detect expression context
51
+ const contextResult = this.contextDetector.detectContext(expression, {
52
+ factoryType: context.factoryType,
53
+ ...(context.availableResources && { availableResources: context.availableResources }),
54
+ ...(context.schemaProxy && { schemaProxy: context.schemaProxy })
55
+ });
56
+ // Initialize result
57
+ const result = {
58
+ isValid: true,
59
+ ruleResults: new Map(),
60
+ messages: { errors: [], warnings: [], info: [] },
61
+ contextResult,
62
+ detectionResult,
63
+ metrics: {
64
+ validationTimeMs: 0,
65
+ rulesEvaluated: 0,
66
+ referencesValidated: detectionResult.references.length
67
+ },
68
+ summary: {
69
+ totalRules: 0,
70
+ passedRules: 0,
71
+ failedRules: 0,
72
+ errorCount: 0,
73
+ warningCount: 0,
74
+ infoCount: 0
75
+ }
76
+ };
77
+ // Get applicable rules
78
+ const applicableRules = this.getApplicableRules(contextResult.context, config);
79
+ result.summary.totalRules = applicableRules.length;
80
+ // Validate with each applicable rule
81
+ for (const rule of applicableRules) {
82
+ try {
83
+ const ruleResult = rule.validate(expression, context, detectionResult);
84
+ result.ruleResults.set(rule.id, ruleResult);
85
+ result.metrics.rulesEvaluated++;
86
+ if (ruleResult.valid) {
87
+ result.summary.passedRules++;
88
+ }
89
+ else {
90
+ result.summary.failedRules++;
91
+ // Add message to appropriate severity category
92
+ const message = `${rule.name}: ${ruleResult.message || 'Validation failed'}`;
93
+ switch (rule.severity) {
94
+ case 'error':
95
+ result.messages.errors.push(message);
96
+ result.summary.errorCount++;
97
+ result.isValid = false;
98
+ break;
99
+ case 'warning':
100
+ result.messages.warnings.push(message);
101
+ result.summary.warningCount++;
102
+ if (config.strictMode) {
103
+ result.isValid = false;
104
+ }
105
+ break;
106
+ case 'info':
107
+ result.messages.info.push(message);
108
+ result.summary.infoCount++;
109
+ break;
110
+ }
111
+ }
112
+ }
113
+ catch (error) {
114
+ logger.warn('Validation rule failed with error', {
115
+ ruleId: rule.id,
116
+ error: error instanceof Error ? error.message : String(error)
117
+ });
118
+ result.ruleResults.set(rule.id, {
119
+ valid: false,
120
+ message: `Rule execution failed: ${error}`,
121
+ details: { error: String(error) }
122
+ });
123
+ result.summary.failedRules++;
124
+ result.messages.errors.push(`${rule.name}: Rule execution failed`);
125
+ result.summary.errorCount++;
126
+ result.isValid = false;
127
+ }
128
+ }
129
+ result.metrics.validationTimeMs = performance.now() - startTime;
130
+ logger.debug('Conditional expression validation completed', {
131
+ isValid: result.isValid,
132
+ totalRules: result.summary.totalRules,
133
+ errorCount: result.summary.errorCount,
134
+ warningCount: result.summary.warningCount,
135
+ validationTimeMs: result.metrics.validationTimeMs
136
+ });
137
+ return result;
138
+ }
139
+ /**
140
+ * Register a custom validation rule
141
+ *
142
+ * @param rule - Validation rule to register
143
+ */
144
+ registerRule(rule) {
145
+ this.rules.set(rule.id, rule);
146
+ logger.debug('Validation rule registered', {
147
+ ruleId: rule.id,
148
+ ruleName: rule.name,
149
+ severity: rule.severity
150
+ });
151
+ }
152
+ /**
153
+ * Unregister a validation rule
154
+ *
155
+ * @param ruleId - ID of the rule to unregister
156
+ * @returns Whether the rule was successfully unregistered
157
+ */
158
+ unregisterRule(ruleId) {
159
+ const existed = this.rules.has(ruleId);
160
+ this.rules.delete(ruleId);
161
+ if (existed) {
162
+ logger.debug('Validation rule unregistered', { ruleId });
163
+ }
164
+ return existed;
165
+ }
166
+ /**
167
+ * Get all registered validation rules
168
+ *
169
+ * @returns Array of validation rules
170
+ */
171
+ getRules() {
172
+ return Array.from(this.rules.values());
173
+ }
174
+ /**
175
+ * Get applicable rules for a specific context
176
+ */
177
+ getApplicableRules(context, config) {
178
+ const rules = Array.from(this.rules.values());
179
+ return rules.filter(rule => {
180
+ // Check if rule is enabled
181
+ if (!rule.enabled)
182
+ return false;
183
+ // Check if rule is disabled in config
184
+ if (config.disabledRules?.includes(rule.id))
185
+ return false;
186
+ // Check if rule applies to this context
187
+ if (rule.applicableContexts.length > 0 &&
188
+ !rule.applicableContexts.includes(context) &&
189
+ !rule.applicableContexts.includes('*')) {
190
+ return false;
191
+ }
192
+ return true;
193
+ });
194
+ }
195
+ /**
196
+ * Register built-in validation rules
197
+ */
198
+ registerBuiltInRules() {
199
+ // Rule: KubernetesRef objects should be well-formed
200
+ this.registerRule({
201
+ id: 'well-formed-kubernetes-ref',
202
+ name: 'Well-formed KubernetesRef',
203
+ description: 'KubernetesRef objects should have valid resourceId and fieldPath',
204
+ severity: 'error',
205
+ applicableContexts: ['*'],
206
+ enabled: true,
207
+ validate: (_expression, _context, detection) => {
208
+ for (const refInfo of detection.references) {
209
+ const ref = refInfo.ref;
210
+ if (!ref.resourceId || typeof ref.resourceId !== 'string') {
211
+ return {
212
+ valid: false,
213
+ message: 'KubernetesRef must have a valid resourceId',
214
+ details: { ref, path: refInfo.path }
215
+ };
216
+ }
217
+ if (!ref.fieldPath || typeof ref.fieldPath !== 'string') {
218
+ return {
219
+ valid: false,
220
+ message: 'KubernetesRef must have a valid fieldPath',
221
+ details: { ref, path: refInfo.path }
222
+ };
223
+ }
224
+ // Validate field path format
225
+ if (!/^[a-zA-Z][a-zA-Z0-9]*(\.[a-zA-Z][a-zA-Z0-9]*|\[\d+\])*$/.test(ref.fieldPath)) {
226
+ return {
227
+ valid: false,
228
+ message: 'KubernetesRef fieldPath has invalid format',
229
+ suggestions: ['Use dot notation for nested fields', 'Use bracket notation for array access'],
230
+ details: { fieldPath: ref.fieldPath, path: refInfo.path }
231
+ };
232
+ }
233
+ }
234
+ return { valid: true };
235
+ }
236
+ });
237
+ // Rule: Conditional expressions should evaluate to boolean
238
+ this.registerRule({
239
+ id: 'conditional-boolean-result',
240
+ name: 'Conditional Boolean Result',
241
+ description: 'Conditional expressions should evaluate to boolean values',
242
+ severity: 'warning',
243
+ applicableContexts: ['*'], // Apply to all contexts
244
+ enabled: true,
245
+ validate: (expression, _context, _detection) => {
246
+ // Check for boolean literals
247
+ if (typeof expression === 'boolean') {
248
+ return { valid: true };
249
+ }
250
+ // Check for boolean-like string expressions
251
+ if (typeof expression === 'string') {
252
+ const hasBooleanOperators = /[><=!]=?|&&|\|\||true|false|ready|available|enabled|disabled/i.test(expression);
253
+ if (hasBooleanOperators) {
254
+ return { valid: true };
255
+ }
256
+ }
257
+ // Check for KubernetesRef that might resolve to boolean
258
+ if (isKubernetesRef(expression)) {
259
+ // Allow KubernetesRef objects - they might resolve to boolean values
260
+ return { valid: true };
261
+ }
262
+ return {
263
+ valid: false,
264
+ message: 'Conditional expressions should evaluate to boolean values',
265
+ suggestions: [
266
+ 'Add comparison operators (>, <, ==, !=)',
267
+ 'Add logical operators (&&, ||)',
268
+ 'Use boolean literals (true, false)'
269
+ ]
270
+ };
271
+ }
272
+ });
273
+ // Rule: Resource references should exist in context
274
+ this.registerRule({
275
+ id: 'resource-reference-exists',
276
+ name: 'Resource Reference Exists',
277
+ description: 'Referenced resources should exist in the current context',
278
+ severity: 'warning',
279
+ applicableContexts: ['*'],
280
+ enabled: true,
281
+ validate: (_expression, context, detection) => {
282
+ const availableResources = context.availableResources || {};
283
+ for (const refInfo of detection.references) {
284
+ const ref = refInfo.ref;
285
+ // Skip schema references
286
+ if (ref.resourceId === '__schema__')
287
+ continue;
288
+ // Check if resource exists in context
289
+ if (!(ref.resourceId in availableResources)) {
290
+ return {
291
+ valid: false,
292
+ message: `Referenced resource '${ref.resourceId}' not found in current context`,
293
+ suggestions: [
294
+ 'Check resource name spelling',
295
+ 'Ensure resource is created before referencing',
296
+ 'Verify resource is in the same composition context'
297
+ ],
298
+ details: { resourceId: ref.resourceId, path: refInfo.path }
299
+ };
300
+ }
301
+ }
302
+ return { valid: true };
303
+ }
304
+ });
305
+ // Rule: Field paths should be reasonable
306
+ this.registerRule({
307
+ id: 'reasonable-field-paths',
308
+ name: 'Reasonable Field Paths',
309
+ description: 'Field paths should follow common Kubernetes patterns',
310
+ severity: 'info',
311
+ applicableContexts: ['*'],
312
+ enabled: true,
313
+ validate: (_expression, _context, detection) => {
314
+ for (const refInfo of detection.references) {
315
+ const ref = refInfo.ref;
316
+ const fieldPath = ref.fieldPath;
317
+ // Check for overly deep nesting
318
+ const depth = fieldPath.split('.').length;
319
+ if (depth > 6) {
320
+ return {
321
+ valid: false,
322
+ message: `Field path '${fieldPath}' is very deeply nested (${depth} levels)`,
323
+ suggestions: ['Consider using intermediate references', 'Verify the field path is correct'],
324
+ details: { fieldPath, depth, path: refInfo.path }
325
+ };
326
+ }
327
+ // Check for common typos in Kubernetes field names
328
+ const commonFields = ['metadata', 'spec', 'status', 'data', 'stringData'];
329
+ const pathParts = fieldPath.split('.');
330
+ for (const part of pathParts) {
331
+ if (part.includes('[') && part.includes(']'))
332
+ continue; // Skip array access
333
+ // Check for common typos
334
+ const similarFields = commonFields.filter(field => this.levenshteinDistance(part.toLowerCase(), field.toLowerCase()) === 1);
335
+ if (similarFields.length > 0) {
336
+ return {
337
+ valid: false,
338
+ message: `Field '${part}' might be a typo, did you mean '${similarFields[0]}'?`,
339
+ suggestions: [`Use '${similarFields[0]}' instead of '${part}'`],
340
+ details: { fieldPath, suspiciousPart: part, suggestions: similarFields }
341
+ };
342
+ }
343
+ }
344
+ }
345
+ return { valid: true };
346
+ }
347
+ });
348
+ // Rule: readyWhen expressions should reference status fields
349
+ this.registerRule({
350
+ id: 'ready-when-status-reference',
351
+ name: 'ReadyWhen Status Reference',
352
+ description: 'readyWhen expressions should typically reference status fields',
353
+ severity: 'info',
354
+ applicableContexts: ['*'], // Apply to all contexts, but only validate when there are references
355
+ enabled: true,
356
+ validate: (_expression, _context, detection) => {
357
+ if (detection.references.length === 0) {
358
+ return { valid: true }; // No references to validate
359
+ }
360
+ const hasStatusReferences = detection.references.some(refInfo => refInfo.ref.fieldPath.includes('status'));
361
+ if (!hasStatusReferences) {
362
+ return {
363
+ valid: false,
364
+ message: 'readyWhen expressions typically reference resource status fields',
365
+ suggestions: [
366
+ 'Reference .status fields for resource readiness',
367
+ 'Use status.conditions for detailed readiness checks',
368
+ 'Consider status.readyReplicas, status.phase, etc.'
369
+ ]
370
+ };
371
+ }
372
+ return { valid: true };
373
+ }
374
+ });
375
+ // Rule: Circular reference detection
376
+ this.registerRule({
377
+ id: 'no-circular-references',
378
+ name: 'No Circular References',
379
+ description: 'Expressions should not create circular dependencies',
380
+ severity: 'error',
381
+ applicableContexts: ['*'],
382
+ enabled: true,
383
+ validate: (_expression, context, detection) => {
384
+ const currentResourceId = context.resourceId;
385
+ // Check if any reference points back to the current resource
386
+ for (const refInfo of detection.references) {
387
+ const ref = refInfo.ref;
388
+ if (ref.resourceId === currentResourceId) {
389
+ return {
390
+ valid: false,
391
+ message: `Circular reference detected: resource '${currentResourceId}' references itself`,
392
+ suggestions: [
393
+ 'Remove self-references',
394
+ 'Use different resource for the reference',
395
+ 'Consider using schema references instead'
396
+ ],
397
+ details: { resourceId: currentResourceId, fieldPath: ref.fieldPath }
398
+ };
399
+ }
400
+ }
401
+ return { valid: true };
402
+ }
403
+ });
404
+ logger.info('Built-in validation rules registered', {
405
+ ruleCount: this.rules.size
406
+ });
407
+ }
408
+ /**
409
+ * Calculate Levenshtein distance between two strings
410
+ */
411
+ levenshteinDistance(str1, str2) {
412
+ const matrix = Array(str2.length + 1).fill(null).map(() => Array(str1.length + 1).fill(0));
413
+ for (let i = 0; i <= str1.length; i++)
414
+ matrix[0][i] = i;
415
+ for (let j = 0; j <= str2.length; j++)
416
+ matrix[j][0] = j;
417
+ for (let j = 1; j <= str2.length; j++) {
418
+ for (let i = 1; i <= str1.length; i++) {
419
+ const indicator = str1[i - 1] === str2[j - 1] ? 0 : 1;
420
+ matrix[j][i] = Math.min(matrix[j]?.[i - 1] + 1, // deletion
421
+ matrix[j - 1]?.[i] + 1, // insertion
422
+ matrix[j - 1]?.[i - 1] + indicator // substitution
423
+ );
424
+ }
425
+ }
426
+ return matrix[str2.length]?.[str1.length];
427
+ }
428
+ }
429
+ /**
430
+ * Global conditional expression validator instance
431
+ */
432
+ export const conditionalExpressionValidator = new ConditionalExpressionValidator();
433
+ /**
434
+ * Utility function to validate a conditional expression
435
+ *
436
+ * @param expression - Expression to validate
437
+ * @param context - Factory context
438
+ * @param config - Validation configuration
439
+ * @returns Validation result
440
+ */
441
+ export function validateConditionalExpression(expression, context, config) {
442
+ return conditionalExpressionValidator.validateExpression(expression, context, config);
443
+ }
444
+ /**
445
+ * Utility function to register a custom validation rule
446
+ *
447
+ * @param rule - Validation rule to register
448
+ */
449
+ export function registerValidationRule(rule) {
450
+ conditionalExpressionValidator.registerRule(rule);
451
+ }
452
+ /**
453
+ * Utility function to get all validation rules
454
+ *
455
+ * @returns Array of validation rules
456
+ */
457
+ export function getValidationRules() {
458
+ return conditionalExpressionValidator.getRules();
459
+ }
460
+ //# sourceMappingURL=conditional-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditional-validation.js","sourceRoot":"","sources":["../../../src/core/expressions/conditional-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Context-Aware CEL Generation Strategies
3
+ *
4
+ * This module provides context-specific CEL generation strategies for converting
5
+ * KubernetesRef objects to appropriate CEL expressions based on the usage context.
6
+ */
7
+ import type { CelExpression, KubernetesRef } from '../types/common.js';
8
+ import type { Enhanced } from '../types/kubernetes.js';
9
+ import type { SchemaProxy } from '../types/serialization.js';
10
+ import type { ExpressionContext, CelGenerationStrategy, ContextDetectionResult } from './context-detector.js';
11
+ /**
12
+ * Context-aware CEL generation configuration
13
+ */
14
+ export interface CelGenerationConfig {
15
+ /** Factory type being used */
16
+ factoryType: 'direct' | 'kro';
17
+ /** Available resources for reference validation */
18
+ availableResources?: Record<string, Enhanced<any, any>>;
19
+ /** Schema proxy for schema field references */
20
+ schemaProxy?: SchemaProxy<any, any>;
21
+ /** Whether to use strict type checking */
22
+ strictTypeChecking?: boolean;
23
+ /** Whether to optimize for performance */
24
+ optimizeForPerformance?: boolean;
25
+ /** Whether to include debug information */
26
+ includeDebugInfo?: boolean;
27
+ }
28
+ /**
29
+ * CEL generation result
30
+ */
31
+ export interface CelGenerationResult {
32
+ /** Generated CEL expression */
33
+ celExpression: CelExpression;
34
+ /** Strategy used for generation */
35
+ strategy: CelGenerationStrategy;
36
+ /** Context that was detected/used */
37
+ context: ExpressionContext;
38
+ /** Dependencies that were resolved */
39
+ dependencies: KubernetesRef<any>[];
40
+ /** Any warnings generated during conversion */
41
+ warnings: string[];
42
+ /** Debug information (if enabled) */
43
+ debugInfo?: CelGenerationDebugInfo;
44
+ }
45
+ /**
46
+ * Debug information for CEL generation
47
+ */
48
+ export interface CelGenerationDebugInfo {
49
+ /** Original KubernetesRef objects */
50
+ originalRefs: KubernetesRef<any>[];
51
+ /** Transformation steps applied */
52
+ transformationSteps: string[];
53
+ /** Context detection details */
54
+ contextDetection: ContextDetectionResult;
55
+ /** Performance metrics */
56
+ performanceMetrics?: {
57
+ generationTimeMs: number;
58
+ cacheHits: number;
59
+ cacheMisses: number;
60
+ };
61
+ }
62
+ /**
63
+ * Context-aware CEL generator
64
+ */
65
+ export declare class ContextAwareCelGenerator {
66
+ /**
67
+ * Generate CEL expression from KubernetesRef objects based on context
68
+ */
69
+ generateCelExpression(kubernetesRefs: KubernetesRef<any>[], context: ExpressionContext, strategy: CelGenerationStrategy, config: CelGenerationConfig): CelGenerationResult;
70
+ /**
71
+ * Generate status expression CEL for status builders
72
+ */
73
+ private generateStatusExpression;
74
+ /**
75
+ * Generate resource reference CEL for resource builders
76
+ */
77
+ private generateResourceReference;
78
+ /**
79
+ * Generate conditional check CEL for conditional expressions
80
+ */
81
+ private generateConditionalCheck;
82
+ /**
83
+ * Generate readiness check CEL for readiness expressions
84
+ */
85
+ private generateReadinessCheck;
86
+ /**
87
+ * Generate template interpolation CEL for template literals
88
+ */
89
+ private generateTemplateInterpolation;
90
+ /**
91
+ * Generate direct evaluation CEL (pass-through for direct factory)
92
+ */
93
+ private generateDirectEvaluation;
94
+ /**
95
+ * Generate Kro-specific status reference
96
+ */
97
+ private generateKroStatusReference;
98
+ /**
99
+ * Generate direct factory status reference
100
+ */
101
+ private generateDirectStatusReference;
102
+ }
103
+ /**
104
+ * Context-specific CEL generation utilities
105
+ */
106
+ export declare class CelGenerationUtils {
107
+ /**
108
+ * Determine the best CEL generation strategy for a given context
109
+ */
110
+ static determineBestStrategy(context: ExpressionContext, _kubernetesRefs: KubernetesRef<any>[], factoryType: 'direct' | 'kro'): CelGenerationStrategy;
111
+ /**
112
+ * Validate that KubernetesRef objects are appropriate for the given context
113
+ */
114
+ static validateRefsForContext(kubernetesRefs: KubernetesRef<any>[], context: ExpressionContext, availableResources?: Record<string, Enhanced<any, any>>): {
115
+ valid: boolean;
116
+ errors: string[];
117
+ };
118
+ /**
119
+ * Optimize CEL expression for performance
120
+ */
121
+ static optimizeCelExpression(celExpression: CelExpression, context: ExpressionContext): CelExpression;
122
+ }
123
+ /**
124
+ * Default context-aware CEL generator instance
125
+ */
126
+ export declare const contextAwareCelGenerator: ContextAwareCelGenerator;
127
+ //# sourceMappingURL=context-aware-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-aware-generator.d.ts","sourceRoot":"","sources":["../../../src/core/expressions/context-aware-generator.ts"],"names":[],"mappings":"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"}