timonel 3.1.1 → 3.1.2

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 (83) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +323 -695
  3. package/dist/cli.js +275 -15
  4. package/dist/index.d.ts +5 -1
  5. package/dist/index.js +12 -0
  6. package/dist/lib/helm.d.ts +471 -0
  7. package/dist/lib/helm.js +483 -0
  8. package/dist/lib/helmChartWriter.d.ts +157 -0
  9. package/dist/lib/helmChartWriter.js +171 -1
  10. package/dist/lib/policy/configurationLoader.d.ts +132 -0
  11. package/dist/lib/policy/configurationLoader.js +132 -0
  12. package/dist/lib/policy/errorContextGenerator.d.ts +89 -0
  13. package/dist/lib/policy/errorContextGenerator.js +99 -2
  14. package/dist/lib/policy/errors.d.ts +35 -0
  15. package/dist/lib/policy/errors.js +36 -0
  16. package/dist/lib/policy/index.d.ts +9 -0
  17. package/dist/lib/policy/index.js +16 -0
  18. package/dist/lib/policy/parallelExecutor.d.ts +90 -0
  19. package/dist/lib/policy/parallelExecutor.js +86 -3
  20. package/dist/lib/policy/pluginLoader.d.ts +92 -0
  21. package/dist/lib/policy/pluginLoader.js +92 -1
  22. package/dist/lib/policy/pluginRegistry.d.ts +54 -0
  23. package/dist/lib/policy/pluginRegistry.js +56 -0
  24. package/dist/lib/policy/policyEngine.d.ts +137 -0
  25. package/dist/lib/policy/policyEngine.js +191 -5
  26. package/dist/lib/policy/resultAggregator.d.ts +46 -0
  27. package/dist/lib/policy/resultAggregator.js +69 -1
  28. package/dist/lib/policy/resultFormatter.d.ts +88 -0
  29. package/dist/lib/policy/resultFormatter.js +101 -0
  30. package/dist/lib/policy/types.d.ts +136 -0
  31. package/dist/lib/policy/types.js +8 -0
  32. package/dist/lib/policy/validationCache.d.ts +146 -0
  33. package/dist/lib/policy/validationCache.js +142 -6
  34. package/dist/lib/resources/baseResourceProvider.d.ts +45 -0
  35. package/dist/lib/resources/baseResourceProvider.js +48 -1
  36. package/dist/lib/resources/cloud/aws/awsResources.d.ts +192 -0
  37. package/dist/lib/resources/cloud/aws/awsResources.js +163 -1
  38. package/dist/lib/resources/cloud/aws/karpenterResources.d.ts +131 -0
  39. package/dist/lib/resources/cloud/aws/karpenterResources.js +77 -0
  40. package/dist/lib/rutter.d.ts +381 -3
  41. package/dist/lib/rutter.js +439 -28
  42. package/dist/lib/security.d.ts +123 -0
  43. package/dist/lib/security.js +162 -4
  44. package/dist/lib/templates/flexible-subchart.d.ts +52 -0
  45. package/dist/lib/templates/flexible-subchart.js +70 -0
  46. package/dist/lib/templates/umbrella-chart.d.ts +27 -0
  47. package/dist/lib/templates/umbrella-chart.js +89 -0
  48. package/dist/lib/types.d.ts +26 -0
  49. package/dist/lib/umbrella.d.ts +23 -0
  50. package/dist/lib/umbrella.js +23 -0
  51. package/dist/lib/umbrellaRutter.d.ts +75 -0
  52. package/dist/lib/umbrellaRutter.js +82 -2
  53. package/dist/lib/utils/envVarsLoader.d.ts +49 -0
  54. package/dist/lib/utils/envVarsLoader.js +53 -0
  55. package/dist/lib/utils/helmConstructSerializer.d.ts +17 -0
  56. package/dist/lib/utils/helmConstructSerializer.js +22 -0
  57. package/dist/lib/utils/helmControlStructures.d.ts +194 -0
  58. package/dist/lib/utils/helmControlStructures.js +180 -0
  59. package/dist/lib/utils/helmHelpers/envHelpers.d.ts +13 -0
  60. package/dist/lib/utils/helmHelpers/envHelpers.js +13 -0
  61. package/dist/lib/utils/helmHelpers/gitopsHelpers.d.ts +13 -0
  62. package/dist/lib/utils/helmHelpers/gitopsHelpers.js +13 -0
  63. package/dist/lib/utils/helmHelpers/index.d.ts +74 -0
  64. package/dist/lib/utils/helmHelpers/index.js +85 -1
  65. package/dist/lib/utils/helmHelpers/observabilityHelpers.d.ts +13 -0
  66. package/dist/lib/utils/helmHelpers/observabilityHelpers.js +13 -0
  67. package/dist/lib/utils/helmHelpers/types.d.ts +23 -0
  68. package/dist/lib/utils/helmHelpers/types.js +4 -0
  69. package/dist/lib/utils/helmHelpers/validationHelpers.d.ts +13 -0
  70. package/dist/lib/utils/helmHelpers/validationHelpers.js +13 -0
  71. package/dist/lib/utils/helmHelpers.d.ts +62 -0
  72. package/dist/lib/utils/helmHelpers.js +77 -0
  73. package/dist/lib/utils/helmYamlSerializer.d.ts +77 -0
  74. package/dist/lib/utils/helmYamlSerializer.js +398 -21
  75. package/dist/lib/utils/logger.d.ts +153 -0
  76. package/dist/lib/utils/logger.js +170 -2
  77. package/dist/lib/utils/valuesRef.d.ts +181 -50
  78. package/dist/lib/utils/valuesRef.js +168 -170
  79. package/dist/lib/validation/inputValidator.d.ts +45 -0
  80. package/dist/lib/validation/inputValidator.js +67 -2
  81. package/dist/types/index.d.ts +34 -0
  82. package/dist/types/index.js +3 -0
  83. package/package.json +31 -38
@@ -1,102 +1,233 @@
1
+ /**
2
+ * Type-safe Helm values reference system.
3
+ *
4
+ * ValuesRef exposes the shape of the caller-provided values interface while
5
+ * preserving a runtime proxy that renders Helm expressions.
6
+ */
1
7
  import { type HelmExpression } from './helmControlStructures.js';
2
8
  declare const HELM_VALUE_SYMBOL: unique symbol;
9
+ type HelmScalar = string | number | boolean;
10
+ type ArrayElement<T> = T extends readonly (infer U)[] ? U : never;
11
+ type StringKeyOf<T> = Extract<keyof T, string>;
12
+ type RuntimeReservedValueKey = 'toJSON' | 'toString' | 'valueOf';
13
+ type HelmValueReservedKey = Extract<keyof HelmValue<unknown>, string> | RuntimeReservedValueKey;
14
+ /**
15
+ * A Helm value reference with mapped properties that mirror the supplied
16
+ * TypeScript value shape. Keys reserved by the ValuesRef API remain accessible
17
+ * through the typed `at()` accessor.
18
+ */
19
+ export type HelmValueRef<T> = HelmValue<T> & (T extends readonly unknown[] ? object : T extends object ? {
20
+ readonly [K in Exclude<StringKeyOf<T>, HelmValueReservedKey>]-?: HelmValueRef<T[K]>;
21
+ } : object);
22
+ /**
23
+ * Reference to a Helm value or scoped Helm expression.
24
+ *
25
+ * Instances are runtime proxies. The generic type preserves the shape of the referenced value
26
+ * while helper methods compose Helm/Sprig expressions.
27
+ */
3
28
  export interface HelmValue<T = unknown> {
29
+ /** Internal runtime marker used by Timonel serializers. */
4
30
  [HELM_VALUE_SYMBOL]: true;
31
+ /** Internal Helm expression path represented by this proxy. */
5
32
  __path: string;
33
+ /** Type-only marker; it is not populated at runtime. */
6
34
  __type?: T;
7
- eq(value: HelmValue | string | number | boolean): HelmCondition;
8
- ne(value: HelmValue | string | number | boolean): HelmCondition;
9
- gt(value: HelmValue | number): HelmCondition;
10
- ge(value: HelmValue | number): HelmCondition;
11
- lt(value: HelmValue | number): HelmCondition;
12
- le(value: HelmValue | number): HelmCondition;
35
+ /**
36
+ * Access a typed property whose name collides with a ValuesRef method or root helper.
37
+ * @param key - Property key from the current TypeScript values type
38
+ * @returns A typed proxy for the nested value
39
+ */
40
+ at<K extends StringKeyOf<T>>(key: K): HelmValueRef<T[K]>;
41
+ /** Compare the value for equality. */
42
+ eq(value: HelmValueRef<unknown> | HelmScalar): HelmCondition;
43
+ /** Compare the value for inequality. */
44
+ ne(value: HelmValueRef<unknown> | HelmScalar): HelmCondition;
45
+ /** Compare whether the value is greater than another numeric value/reference. */
46
+ gt(value: HelmValueRef<unknown> | number): HelmCondition;
47
+ /** Compare whether the value is greater than or equal to another numeric value/reference. */
48
+ ge(value: HelmValueRef<unknown> | number): HelmCondition;
49
+ /** Compare whether the value is less than another numeric value/reference. */
50
+ lt(value: HelmValueRef<unknown> | number): HelmCondition;
51
+ /** Compare whether the value is less than or equal to another numeric value/reference. */
52
+ le(value: HelmValueRef<unknown> | number): HelmCondition;
53
+ /** Negate the truthiness of the referenced Helm value. */
13
54
  not(): HelmCondition;
55
+ /** Combine the referenced value with another condition using Helm `and`. */
14
56
  and(other: HelmCondition): HelmCondition;
57
+ /** Combine the referenced value with another condition using Helm `or`. */
15
58
  or(other: HelmCondition): HelmCondition;
16
- default(defaultValue: HelmValue | string | number | boolean): HelmValue<T>;
17
- quote(): HelmValue<string>;
18
- upper(): HelmValue<string>;
19
- lower(): HelmValue<string>;
20
- title(): HelmValue<string>;
21
- trim(): HelmValue<string>;
22
- trimPrefix(prefix: string): HelmValue<string>;
23
- trimSuffix(suffix: string): HelmValue<string>;
24
- replace(old: string, newStr: string): HelmValue<string>;
59
+ /** Apply Helm `default` while preserving the referenced value type. */
60
+ default(defaultValue: HelmValueRef<unknown> | HelmScalar): HelmValueRef<T>;
61
+ /** Pipe the value through `quote`. */
62
+ quote(): HelmValueRef<string>;
63
+ /** Pipe the value through `upper`. */
64
+ upper(): HelmValueRef<string>;
65
+ /** Pipe the value through `lower`. */
66
+ lower(): HelmValueRef<string>;
67
+ /** Pipe the value through `title`. */
68
+ title(): HelmValueRef<string>;
69
+ /** Pipe the value through `trim`. */
70
+ trim(): HelmValueRef<string>;
71
+ /** Remove a prefix with Sprig `trimPrefix`. */
72
+ trimPrefix(prefix: string): HelmValueRef<string>;
73
+ /** Remove a suffix with Sprig `trimSuffix`. */
74
+ trimSuffix(suffix: string): HelmValueRef<string>;
75
+ /** Replace string occurrences with Sprig `replace`. */
76
+ replace(old: string, newStr: string): HelmValueRef<string>;
77
+ /** Test whether the referenced string contains a substring. */
25
78
  contains(substr: string): HelmCondition;
79
+ /** Test whether the referenced string starts with a prefix. */
26
80
  hasPrefix(prefix: string): HelmCondition;
81
+ /** Test whether the referenced string ends with a suffix. */
27
82
  hasSuffix(suffix: string): HelmCondition;
28
- trunc(length: number): HelmValue<string>;
83
+ /** Truncate the referenced string to the requested length. */
84
+ trunc(length: number): HelmValueRef<string>;
85
+ /** Test the Helm runtime kind of the referenced value. */
29
86
  kindIs(kind: 'string' | 'slice' | 'map' | 'bool' | 'int' | 'float'): HelmCondition;
87
+ /** Test whether the referenced map contains a key. */
30
88
  hasKey(key: string): HelmCondition;
31
- toYaml(): HelmValue<string>;
32
- toJson(): HelmValue<string>;
33
- nindent(spaces: number): HelmValue<string>;
34
- indent(spaces: number): HelmValue<string>;
89
+ /** Serialize the referenced value with Helm `toYaml`. */
90
+ toYaml(): HelmValueRef<string>;
91
+ /** Serialize the referenced value with Helm `toJson`. */
92
+ toJson(): HelmValueRef<string>;
93
+ /** Apply Helm/Sprig `nindent`. */
94
+ nindent(spaces: number): HelmValueRef<string>;
95
+ /** Apply Helm/Sprig `indent`. */
96
+ indent(spaces: number): HelmValueRef<string>;
97
+ /** Convert the proxy to Timonel's lower-level HelmExpression marker. */
35
98
  toExpression(): HelmExpression;
36
- if<V>(condition: HelmCondition, thenValue: V): HelmFieldConditional<V>;
37
- ifElse<V>(condition: HelmCondition, thenValue: V, elseValue: V): HelmValue<V>;
38
- range<V>(callback: (item: HelmValue<T extends (infer U)[] ? U : unknown>, index: HelmValue<number>) => V): HelmRange<V>;
39
- with<V>(callback: (ctx: HelmValue<T>) => V): HelmWith<V>;
99
+ /**
100
+ * Conditionally include a field value during Helm rendering.
101
+ * @param condition - Helm condition or value whose truthiness controls inclusion
102
+ * @param thenValue - Value emitted when the condition succeeds
103
+ */
104
+ if<V>(condition: HelmCondition | HelmValueRef<unknown>, thenValue: V): HelmFieldConditional<V>;
105
+ /**
106
+ * Build a Helm ternary expression.
107
+ * @param condition - Condition selecting between the two values
108
+ * @param thenValue - Value returned when the condition is true
109
+ * @param elseValue - Value returned when the condition is false
110
+ */
111
+ ifElse<V extends HelmValueRef<unknown> | HelmScalar>(condition: HelmCondition, thenValue: V, elseValue: V): HelmValueRef<V extends HelmValueRef<infer U> ? U : V>;
112
+ /**
113
+ * Create a typed Helm `range` block over an array value.
114
+ * @param callback - Callback receiving typed item and index proxies
115
+ */
116
+ range<V>(callback: (item: HelmValueRef<ArrayElement<T>>, index: HelmValueRef<number>) => V): HelmRange<V, ArrayElement<T>>;
117
+ /**
118
+ * Create a Helm `with` block scoped to the referenced value.
119
+ * @param callback - Callback receiving a proxy rooted at Helm `.` within the block
120
+ */
121
+ with<V>(callback: (ctx: HelmValueRef<T>) => V): HelmWith<V, T>;
40
122
  }
123
+ /** Represents a composable Helm boolean condition. */
41
124
  export interface HelmCondition {
125
+ /** Internal runtime marker used by Timonel serializers. */
42
126
  [HELM_VALUE_SYMBOL]: true;
127
+ /** Raw Helm condition body without template delimiters. */
43
128
  __condition: string;
129
+ /** Negate this condition. */
44
130
  not(): HelmCondition;
131
+ /** Combine this condition with another using Helm `and`. */
45
132
  and(other: HelmCondition): HelmCondition;
133
+ /** Combine this condition with another using Helm `or`. */
46
134
  or(other: HelmCondition): HelmCondition;
135
+ /** Return the raw Helm condition body. */
47
136
  toString(): string;
48
137
  }
138
+ /** Represents a field-level conditional consumed by the Helm YAML serializer. */
49
139
  export interface HelmFieldConditional<T> {
140
+ /** Runtime marker for serializer detection. */
50
141
  __helmFieldConditional: true;
142
+ /** Condition controlling whether the field is emitted. */
51
143
  condition: HelmCondition;
144
+ /** Field value emitted when the condition succeeds. */
52
145
  thenValue: T;
146
+ /** Optional compatibility else value. */
53
147
  elseValue?: T;
54
148
  }
55
- export interface HelmRange<T> {
149
+ /** Represents a typed Helm `range` block. */
150
+ export interface HelmRange<T, TItem = unknown> {
151
+ /** Runtime marker for serializer detection. */
56
152
  __helmRange: true;
57
- source: HelmValue;
58
- callback: (item: HelmValue, index: HelmValue<number>) => T;
153
+ /** Array value being iterated. */
154
+ source: HelmValueRef<readonly TItem[]>;
155
+ /** Callback used by the serializer with scoped item/index proxies. */
156
+ callback: (item: HelmValueRef<TItem>, index: HelmValueRef<number>) => T;
59
157
  }
60
- export interface HelmWith<T> {
158
+ /** Represents a typed Helm `with` block. */
159
+ export interface HelmWith<T, TContext = unknown> {
160
+ /** Runtime marker for serializer detection. */
61
161
  __helmWith: true;
62
- source: HelmValue;
63
- callback: (ctx: HelmValue) => T;
162
+ /** Value that becomes the Helm `.` scope. */
163
+ source: HelmValueRef<TContext>;
164
+ /** Callback used by the serializer with a scoped context proxy. */
165
+ callback: (ctx: HelmValueRef<TContext>) => T;
64
166
  }
167
+ /** Helper context for Helm built-ins exposed on the root `ValuesRef`. */
65
168
  export interface HelmHelpers {
66
- include(templateName: string, context?: '.' | HelmValue): HelmValue<string>;
67
- printf(format: string, ...args: (HelmValue | string | number)[]): HelmValue<string>;
169
+ /** Render Helm `include` for a named template and context. */
170
+ include(templateName: string, context?: '.' | HelmValueRef<unknown>): HelmValueRef<string>;
171
+ /** Render Helm `printf` with typed value references or scalar arguments. */
172
+ printf(format: string, ...args: Array<HelmValueRef<unknown> | string | number>): HelmValueRef<string>;
173
+ /** References to Helm `.Release` built-ins. */
68
174
  release: {
69
- name: HelmValue<string>;
70
- namespace: HelmValue<string>;
71
- service: HelmValue<string>;
72
- isUpgrade: HelmValue<boolean>;
73
- isInstall: HelmValue<boolean>;
74
- revision: HelmValue<number>;
175
+ name: HelmValueRef<string>;
176
+ namespace: HelmValueRef<string>;
177
+ service: HelmValueRef<string>;
178
+ isUpgrade: HelmValueRef<boolean>;
179
+ isInstall: HelmValueRef<boolean>;
180
+ revision: HelmValueRef<number>;
75
181
  };
182
+ /** References to Helm `.Chart` built-ins. */
76
183
  chart: {
77
- name: HelmValue<string>;
78
- version: HelmValue<string>;
79
- appVersion: HelmValue<string>;
80
- type: HelmValue<string>;
184
+ name: HelmValueRef<string>;
185
+ version: HelmValueRef<string>;
186
+ appVersion: HelmValueRef<string>;
187
+ type: HelmValueRef<string>;
81
188
  };
189
+ /** References to selected Helm `.Capabilities` built-ins. */
82
190
  capabilities: {
83
191
  kubeVersion: {
84
- version: HelmValue<string>;
85
- major: HelmValue<string>;
86
- minor: HelmValue<string>;
192
+ version: HelmValueRef<string>;
193
+ major: HelmValueRef<string>;
194
+ minor: HelmValueRef<string>;
87
195
  };
88
196
  apiVersions: {
197
+ /** Test whether the target cluster advertises a Kubernetes API version. */
89
198
  has(apiVersion: string): HelmCondition;
90
199
  };
91
200
  };
201
+ /** Escape hatch for conditions that cannot be expressed through typed helpers. */
92
202
  rawCondition(condition: string): HelmCondition;
93
203
  }
94
- export declare function valuesRef<T extends Record<string, unknown>>(): HelmValue<T> & HelmHelpers;
95
- export declare function isHelmValue(value: unknown): value is HelmValue;
204
+ /**
205
+ * Creates the runtime proxy used by ValuesRef and by serializer callback scopes.
206
+ * This function is intentionally not re-exported from the package root.
207
+ */
208
+ export declare function createHelmValueProxy<T>(path: string): HelmValueRef<T>;
209
+ type HelmHelperKey = Extract<keyof HelmHelpers, string>;
210
+ /**
211
+ * Root ValuesRef shape. Root Helm helper names are reserved and can be reached
212
+ * as values through `at()`, for example `v.at('release')`.
213
+ */
214
+ export type ValuesRef<T extends object> = HelmValue<T> & HelmHelpers & (T extends readonly unknown[] ? object : {
215
+ readonly [K in Exclude<StringKeyOf<T>, HelmValueReservedKey | HelmHelperKey>]-?: HelmValueRef<T[K]>;
216
+ });
217
+ /** Creates a type-safe reference tree rooted at `.Values`. */
218
+ export declare function valuesRef<T extends object>(): ValuesRef<T>;
219
+ /** Check if a value is a Helm value proxy. */
220
+ export declare function isHelmValue(value: unknown): value is HelmValueRef<unknown>;
221
+ /** Check if a value is a Helm condition. */
96
222
  export declare function isHelmCondition(value: unknown): value is HelmCondition;
223
+ /** Check if a value is a field-level conditional. */
97
224
  export declare function isHelmFieldConditional(value: unknown): value is HelmFieldConditional<unknown>;
98
- export declare function isHelmRange(value: unknown): value is HelmRange<unknown>;
99
- export declare function isHelmWith(value: unknown): value is HelmWith<unknown>;
100
- export declare function serializeHelmValue(value: HelmValue): string;
225
+ /** Check if a value is a range block. */
226
+ export declare function isHelmRange(value: unknown): value is HelmRange<unknown, unknown>;
227
+ /** Check if a value is a with block. */
228
+ export declare function isHelmWith(value: unknown): value is HelmWith<unknown, unknown>;
229
+ /** Serialize a Helm value reference to template syntax. */
230
+ export declare function serializeHelmValue(value: HelmValueRef<unknown>): string;
231
+ /** Serialize a Helm condition body. */
101
232
  export declare function serializeHelmCondition(condition: HelmCondition): string;
102
233
  export {};