timonel 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ # [2.6.0](https://github.com/KenkoGeek/timonel/compare/v2.5.1...v2.6.0) (2025-09-13)
2
+
3
+ ### Features
4
+
5
+ - **core:** add security helpers - sanitizeEnvVar, validateImageTag, generateSecretName ([#43](https://github.com/KenkoGeek/timonel/issues/43)) ([323c9ae](https://github.com/KenkoGeek/timonel/commit/323c9ae3243dead04dacc6daf4e98e8af1a8d98b))
6
+
7
+ ## [2.5.1](https://github.com/KenkoGeek/timonel/compare/v2.5.0...v2.5.1) (2025-09-12)
8
+
9
+ ### Bug Fixes
10
+
11
+ - **ci:** add comprehensive test suite with unit and integration tests ([#38](https://github.com/KenkoGeek/timonel/issues/38)) ([ffae52f](https://github.com/KenkoGeek/timonel/commit/ffae52fe357a8324959d74c5dd88594b21dafde1))
12
+
1
13
  # [2.5.0](https://github.com/KenkoGeek/timonel/compare/v2.4.0...v2.5.0) (2025-09-12)
2
14
 
3
15
  ### Features
@@ -217,4 +217,82 @@ export declare function stringRef(path: string): string;
217
217
  * @since 0.1.0
218
218
  */
219
219
  export declare function floatRef(path: string): string;
220
+ /**
221
+ * Creates a conditional reference to a value in .Values
222
+ *
223
+ * Generates a Helm template expression that conditionally renders
224
+ * the value only if the condition is truthy.
225
+ *
226
+ * @param {string} path - Path to the value using dot notation
227
+ * @param {string} condition - Path to the condition value
228
+ * @returns {string} Helm template expression with conditional logic
229
+ * @throws {Error} If the path or condition is not valid for Helm templates
230
+ *
231
+ * @example
232
+ * ```typescript
233
+ * const secretName = conditionalRef('database.secretName', 'database.enabled');
234
+ * // Returns: '{{ if .Values.database.enabled }}{{ .Values.database.secretName }}{{ end }}'
235
+ * ```
236
+ *
237
+ * @since 2.6.0
238
+ */
239
+ export declare function conditionalRef(path: string, condition: string): string;
240
+ /**
241
+ * Creates a reference to a value in .Values with a default fallback
242
+ *
243
+ * Generates a Helm template expression that uses the default filter
244
+ * to provide a fallback value when the path is not set.
245
+ *
246
+ * @param {string} path - Path to the value using dot notation
247
+ * @param {string} defaultValue - Default value to use if path is not set
248
+ * @returns {string} Helm template expression with default fallback
249
+ * @throws {Error} If the path is not valid for Helm templates
250
+ *
251
+ * @example
252
+ * ```typescript
253
+ * const image = defaultRef('image.tag', 'latest');
254
+ * // Returns: '{{ .Values.image.tag | default "latest" }}'
255
+ * ```
256
+ *
257
+ * @since 2.6.0
258
+ */
259
+ export declare function defaultRef(path: string, defaultValue: string): string;
260
+ /**
261
+ * Creates a base64-encoded reference to a value in .Values
262
+ *
263
+ * Generates a Helm template expression that encodes the value
264
+ * using base64 encoding, useful for secrets and certificates.
265
+ *
266
+ * @param {string} path - Path to the value using dot notation
267
+ * @returns {string} Helm template expression with base64 encoding
268
+ * @throws {Error} If the path is not valid for Helm templates
269
+ *
270
+ * @example
271
+ * ```typescript
272
+ * const encodedSecret = base64Ref('secrets.apiKey');
273
+ * // Returns: '{{ .Values.secrets.apiKey | b64enc }}'
274
+ * ```
275
+ *
276
+ * @since 2.6.0
277
+ */
278
+ export declare function base64Ref(path: string): string;
279
+ /**
280
+ * Creates a JSON-serialized reference to a value in .Values
281
+ *
282
+ * Generates a Helm template expression that serializes the value
283
+ * to JSON format, useful for complex configuration objects.
284
+ *
285
+ * @param {string} path - Path to the value using dot notation
286
+ * @returns {string} Helm template expression with JSON serialization
287
+ * @throws {Error} If the path is not valid for Helm templates
288
+ *
289
+ * @example
290
+ * ```typescript
291
+ * const configJson = jsonRef('app.config');
292
+ * // Returns: '{{ .Values.app.config | toJson }}'
293
+ * ```
294
+ *
295
+ * @since 2.6.0
296
+ */
297
+ export declare function jsonRef(path: string): string;
220
298
  //# sourceMappingURL=helm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helm.d.ts","sourceRoot":"","sources":["../../src/lib/helm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAQxE;AAeD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,IAAI;IACf,wCAAwC;;IAExC,oCAAoC;;IAEpC,0CAA0C;;IAE1C,kDAAkD;;CAEnD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM1C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAM,GAAG,MAAM,CAE5D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAM,GAAG,MAAM,CAE3D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7C"}
1
+ {"version":3,"file":"helm.d.ts","sourceRoot":"","sources":["../../src/lib/helm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAQxE;AAeD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,IAAI;IACf,wCAAwC;;IAExC,oCAAoC;;IAEpC,0CAA0C;;IAE1C,kDAAkD;;CAEnD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM1C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAM,GAAG,MAAM,CAE5D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAM,GAAG,MAAM,CAE3D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQtE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAOrE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5C"}
package/dist/lib/helm.js CHANGED
@@ -279,4 +279,107 @@ export function floatRef(path) {
279
279
  }
280
280
  return `{{ .Values.${path} | float64 }}`;
281
281
  }
282
+ /**
283
+ * Creates a conditional reference to a value in .Values
284
+ *
285
+ * Generates a Helm template expression that conditionally renders
286
+ * the value only if the condition is truthy.
287
+ *
288
+ * @param {string} path - Path to the value using dot notation
289
+ * @param {string} condition - Path to the condition value
290
+ * @returns {string} Helm template expression with conditional logic
291
+ * @throws {Error} If the path or condition is not valid for Helm templates
292
+ *
293
+ * @example
294
+ * ```typescript
295
+ * const secretName = conditionalRef('database.secretName', 'database.enabled');
296
+ * // Returns: '{{ if .Values.database.enabled }}{{ .Values.database.secretName }}{{ end }}'
297
+ * ```
298
+ *
299
+ * @since 2.6.0
300
+ */
301
+ export function conditionalRef(path, condition) {
302
+ if (!isValidHelmPath(path)) {
303
+ throw new Error(`Invalid Helm template path: ${path}`);
304
+ }
305
+ if (!isValidHelmPath(condition)) {
306
+ throw new Error(`Invalid Helm template condition path: ${condition}`);
307
+ }
308
+ return `{{ if .Values.${condition} }}{{ .Values.${path} }}{{ end }}`;
309
+ }
310
+ /**
311
+ * Creates a reference to a value in .Values with a default fallback
312
+ *
313
+ * Generates a Helm template expression that uses the default filter
314
+ * to provide a fallback value when the path is not set.
315
+ *
316
+ * @param {string} path - Path to the value using dot notation
317
+ * @param {string} defaultValue - Default value to use if path is not set
318
+ * @returns {string} Helm template expression with default fallback
319
+ * @throws {Error} If the path is not valid for Helm templates
320
+ *
321
+ * @example
322
+ * ```typescript
323
+ * const image = defaultRef('image.tag', 'latest');
324
+ * // Returns: '{{ .Values.image.tag | default "latest" }}'
325
+ * ```
326
+ *
327
+ * @since 2.6.0
328
+ */
329
+ export function defaultRef(path, defaultValue) {
330
+ if (!isValidHelmPath(path)) {
331
+ throw new Error(`Invalid Helm template path: ${path}`);
332
+ }
333
+ // Escape quotes and backslashes in defaultValue to prevent template injection
334
+ const escapedValue = defaultValue.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
335
+ return `{{ .Values.${path} | default "${escapedValue}" }}`;
336
+ }
337
+ /**
338
+ * Creates a base64-encoded reference to a value in .Values
339
+ *
340
+ * Generates a Helm template expression that encodes the value
341
+ * using base64 encoding, useful for secrets and certificates.
342
+ *
343
+ * @param {string} path - Path to the value using dot notation
344
+ * @returns {string} Helm template expression with base64 encoding
345
+ * @throws {Error} If the path is not valid for Helm templates
346
+ *
347
+ * @example
348
+ * ```typescript
349
+ * const encodedSecret = base64Ref('secrets.apiKey');
350
+ * // Returns: '{{ .Values.secrets.apiKey | b64enc }}'
351
+ * ```
352
+ *
353
+ * @since 2.6.0
354
+ */
355
+ export function base64Ref(path) {
356
+ if (!isValidHelmPath(path)) {
357
+ throw new Error(`Invalid Helm template path: ${path}`);
358
+ }
359
+ return `{{ .Values.${path} | b64enc }}`;
360
+ }
361
+ /**
362
+ * Creates a JSON-serialized reference to a value in .Values
363
+ *
364
+ * Generates a Helm template expression that serializes the value
365
+ * to JSON format, useful for complex configuration objects.
366
+ *
367
+ * @param {string} path - Path to the value using dot notation
368
+ * @returns {string} Helm template expression with JSON serialization
369
+ * @throws {Error} If the path is not valid for Helm templates
370
+ *
371
+ * @example
372
+ * ```typescript
373
+ * const configJson = jsonRef('app.config');
374
+ * // Returns: '{{ .Values.app.config | toJson }}'
375
+ * ```
376
+ *
377
+ * @since 2.6.0
378
+ */
379
+ export function jsonRef(path) {
380
+ if (!isValidHelmPath(path)) {
381
+ throw new Error(`Invalid Helm template path: ${path}`);
382
+ }
383
+ return `{{ .Values.${path} | toJson }}`;
384
+ }
282
385
  //# sourceMappingURL=helm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helm.js","sourceRoot":"","sources":["../../src/lib/helm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helm.js","sourceRoot":"","sources":["../../src/lib/helm.ts"],"names":[],"mappings":"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"}
@@ -69,5 +69,68 @@ export declare class SecurityUtils {
69
69
  * @since 2.2.0
70
70
  */
71
71
  static isValidSubchartName(subchartName: string): boolean;
72
+ /**
73
+ * Sanitizes environment variable names and values for Kubernetes security
74
+ * Prevents injection attacks and ensures compliance with Kubernetes naming rules
75
+ * @param name - Environment variable name to sanitize
76
+ * @param value - Environment variable value to sanitize
77
+ * @returns Object with sanitized name and value
78
+ * @throws Error if name or value contains dangerous patterns
79
+ *
80
+ * @since 2.6.0
81
+ */
82
+ static sanitizeEnvVar(name: string, value: string): {
83
+ name: string;
84
+ value: string;
85
+ };
86
+ /**
87
+ * Validates container image tags for security best practices
88
+ * Prevents use of dangerous tags and ensures proper versioning
89
+ * @param tag - Image tag to validate
90
+ * @returns True if tag is valid and secure
91
+ * @throws Error if tag violates security policies
92
+ *
93
+ * @since 2.6.0
94
+ */
95
+ static validateImageTag(tag: string): boolean;
96
+ /**
97
+ * Generates secure names for Kubernetes secrets
98
+ * Ensures names follow RFC 1123 and are safe for Kubernetes
99
+ * @param baseName - Base name for the secret
100
+ * @param suffix - Optional suffix to append
101
+ * @returns Secure secret name
102
+ * @throws Error if generated name is invalid
103
+ *
104
+ * @since 2.6.0
105
+ */
106
+ static generateSecretName(baseName: string, suffix?: string): string;
107
+ /**
108
+ * Sanitizes the base name for secret generation using safe string methods
109
+ * @param baseName - Base name to sanitize
110
+ * @returns Sanitized base name
111
+ * @throws Error if no valid characters remain
112
+ *
113
+ * @since 2.6.0
114
+ */
115
+ private static sanitizeBaseName;
116
+ /**
117
+ * Appends suffix to sanitized base name using safe string methods
118
+ * @param baseName - Sanitized base name
119
+ * @param suffix - Suffix to append
120
+ * @returns Base name with suffix
121
+ * @throws Error if suffix is invalid
122
+ *
123
+ * @since 2.6.0
124
+ */
125
+ private static appendSuffix;
126
+ /**
127
+ * Truncates name if it exceeds length limits
128
+ * @param name - Name to potentially truncate
129
+ * @param suffix - Original suffix for preservation
130
+ * @returns Truncated name if needed
131
+ *
132
+ * @since 2.6.0
133
+ */
134
+ private static truncateIfNeeded;
72
135
  }
73
136
  //# sourceMappingURL=security.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;GAKG;AACH,qBAAa,aAAa;IACxB;;;;;;;;OAQG;IACH,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM;IA2BvE;;;;;;OAMG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAgBlD;;;;;;;OAOG;IACH,MAAM,CAAC,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAmBnD;;;;;;OAMG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMvD;;;;;;OAMG;IACH,MAAM,CAAC,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAU7D;;;;;;OAMG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAWnD;;;;;;OAMG;IACH,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;CAG1D"}
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;GAKG;AACH,qBAAa,aAAa;IACxB;;;;;;;;OAQG;IACH,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM;IA2BvE;;;;;;OAMG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAgBlD;;;;;;;OAOG;IACH,MAAM,CAAC,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAmBnD;;;;;;OAMG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMvD;;;;;;OAMG;IACH,MAAM,CAAC,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAU7D;;;;;;OAMG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAWnD;;;;;;OAMG;IACH,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAIzD;;;;;;;;;OASG;IACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IA6DnF;;;;;;;;OAQG;IACH,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IA+C7C;;;;;;;;;OASG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IA0BpE;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAsB/B;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IA0B3B;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;CA4BhC"}
@@ -134,5 +134,228 @@ export class SecurityUtils {
134
134
  static isValidSubchartName(subchartName) {
135
135
  return this.isValidChartName(subchartName);
136
136
  }
137
+ /**
138
+ * Sanitizes environment variable names and values for Kubernetes security
139
+ * Prevents injection attacks and ensures compliance with Kubernetes naming rules
140
+ * @param name - Environment variable name to sanitize
141
+ * @param value - Environment variable value to sanitize
142
+ * @returns Object with sanitized name and value
143
+ * @throws Error if name or value contains dangerous patterns
144
+ *
145
+ * @since 2.6.0
146
+ */
147
+ static sanitizeEnvVar(name, value) {
148
+ if (!name || typeof name !== 'string') {
149
+ throw new Error('Environment variable name must be a non-empty string');
150
+ }
151
+ if (typeof value !== 'string') {
152
+ throw new Error('Environment variable value must be a string');
153
+ }
154
+ // Kubernetes env var name validation (RFC 1123 compatible)
155
+ let sanitizedName = name.toUpperCase().replace(/[^A-Z0-9_]/g, '_');
156
+ // Ensure name starts with letter or underscore
157
+ if (/^[0-9]/.test(sanitizedName)) {
158
+ sanitizedName = `_${sanitizedName}`;
159
+ }
160
+ const nameRegex = /^[A-Z_][A-Z0-9_]*$/;
161
+ if (!nameRegex.test(sanitizedName)) {
162
+ throw new Error(`Invalid environment variable name: ${this.sanitizeLogMessage(name)}`);
163
+ }
164
+ // Check for dangerous patterns in value using safer string methods
165
+ const hasDangerousPattern = (val) => {
166
+ if (val.includes('$(') && val.includes(')'))
167
+ return 'command substitution';
168
+ if (val.includes('`'))
169
+ return 'backtick execution';
170
+ if (val.includes('${') && val.includes('}'))
171
+ return 'variable expansion';
172
+ // Check for control characters
173
+ for (let i = 0; i < val.length; i++) {
174
+ const code = val.charCodeAt(i);
175
+ if ((code >= 0x00 && code <= 0x08) ||
176
+ code === 0x0b ||
177
+ code === 0x0c ||
178
+ (code >= 0x0e && code <= 0x1f) ||
179
+ code === 0x7f) {
180
+ return 'control characters';
181
+ }
182
+ }
183
+ return null;
184
+ };
185
+ const dangerousPattern = hasDangerousPattern(value);
186
+ if (dangerousPattern) {
187
+ throw new Error(`Environment variable value contains dangerous pattern (${dangerousPattern}): ${this.sanitizeLogMessage(value)}`);
188
+ }
189
+ // Limit value length to prevent DoS
190
+ if (value.length > 32768) {
191
+ throw new Error('Environment variable value exceeds maximum length (32KB)');
192
+ }
193
+ return {
194
+ name: sanitizedName,
195
+ value: value.trim(),
196
+ };
197
+ }
198
+ /**
199
+ * Validates container image tags for security best practices
200
+ * Prevents use of dangerous tags and ensures proper versioning
201
+ * @param tag - Image tag to validate
202
+ * @returns True if tag is valid and secure
203
+ * @throws Error if tag violates security policies
204
+ *
205
+ * @since 2.6.0
206
+ */
207
+ static validateImageTag(tag) {
208
+ if (!tag || typeof tag !== 'string') {
209
+ throw new Error('Image tag must be a non-empty string');
210
+ }
211
+ const trimmedTag = tag.trim();
212
+ // Reject dangerous or non-specific tags
213
+ const dangerousTags = ['latest', 'master', 'main', 'dev', 'development', 'test', 'staging'];
214
+ if (dangerousTags.includes(trimmedTag.toLowerCase())) {
215
+ throw new Error(`Insecure image tag detected: '${trimmedTag}'. Use specific version tags for security.`);
216
+ }
217
+ // Validate tag format (Docker tag rules)
218
+ const tagRegex = /^[a-zA-Z0-9._-]+$/;
219
+ if (!tagRegex.test(trimmedTag)) {
220
+ throw new Error(`Invalid image tag format: ${this.sanitizeLogMessage(trimmedTag)}`);
221
+ }
222
+ // Check length limits
223
+ if (trimmedTag.length > 128) {
224
+ throw new Error('Image tag exceeds maximum length (128 characters)');
225
+ }
226
+ // Prefer semantic versioning patterns
227
+ // eslint-disable-next-line security/detect-unsafe-regex -- Simple regex patterns are safe for validation
228
+ const semverPattern = /^v?\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/;
229
+ const hashPattern = /^[a-f0-9]{7,64}$/;
230
+ // eslint-disable-next-line security/detect-unsafe-regex -- Simple date pattern is safe for validation
231
+ const datePattern = /^\d{4}-\d{2}-\d{2}(-[a-zA-Z0-9.-]+)?$/;
232
+ if (!semverPattern.test(trimmedTag) &&
233
+ !hashPattern.test(trimmedTag) &&
234
+ !datePattern.test(trimmedTag)) {
235
+ // Warning for non-standard tags but don't fail
236
+ console.warn(`Warning: Image tag '${trimmedTag}' doesn't follow recommended patterns (semver, hash, or date)`);
237
+ }
238
+ return true;
239
+ }
240
+ /**
241
+ * Generates secure names for Kubernetes secrets
242
+ * Ensures names follow RFC 1123 and are safe for Kubernetes
243
+ * @param baseName - Base name for the secret
244
+ * @param suffix - Optional suffix to append
245
+ * @returns Secure secret name
246
+ * @throws Error if generated name is invalid
247
+ *
248
+ * @since 2.6.0
249
+ */
250
+ static generateSecretName(baseName, suffix) {
251
+ if (!baseName || typeof baseName !== 'string') {
252
+ throw new Error('Base name must be a non-empty string');
253
+ }
254
+ let sanitizedBase = this.sanitizeBaseName(baseName);
255
+ if (suffix) {
256
+ sanitizedBase = this.appendSuffix(sanitizedBase, suffix);
257
+ }
258
+ // Ensure name starts with letter (not number)
259
+ if (/^[0-9]/.test(sanitizedBase)) {
260
+ sanitizedBase = `s${sanitizedBase}`;
261
+ }
262
+ sanitizedBase = this.truncateIfNeeded(sanitizedBase, suffix);
263
+ // Final validation
264
+ if (!this.isValidChartName(sanitizedBase)) {
265
+ throw new Error(`Generated secret name is invalid: ${sanitizedBase}`);
266
+ }
267
+ return sanitizedBase;
268
+ }
269
+ /**
270
+ * Sanitizes the base name for secret generation using safe string methods
271
+ * @param baseName - Base name to sanitize
272
+ * @returns Sanitized base name
273
+ * @throws Error if no valid characters remain
274
+ *
275
+ * @since 2.6.0
276
+ */
277
+ static sanitizeBaseName(baseName) {
278
+ // Use character-by-character processing instead of regex
279
+ let sanitized = '';
280
+ for (const char of baseName.toLowerCase()) {
281
+ if ((char >= 'a' && char <= 'z') || (char >= '0' && char <= '9') || char === '-') {
282
+ sanitized += char;
283
+ }
284
+ else {
285
+ sanitized += '-';
286
+ }
287
+ }
288
+ // Collapse multiple hyphens using split/filter/join
289
+ const parts = sanitized.split('-').filter((part) => part.length > 0);
290
+ sanitized = parts.join('-');
291
+ if (!sanitized) {
292
+ throw new Error('Base name contains no valid characters');
293
+ }
294
+ return sanitized;
295
+ }
296
+ /**
297
+ * Appends suffix to sanitized base name using safe string methods
298
+ * @param baseName - Sanitized base name
299
+ * @param suffix - Suffix to append
300
+ * @returns Base name with suffix
301
+ * @throws Error if suffix is invalid
302
+ *
303
+ * @since 2.6.0
304
+ */
305
+ static appendSuffix(baseName, suffix) {
306
+ if (typeof suffix !== 'string') {
307
+ throw new Error('Suffix must be a string');
308
+ }
309
+ // Use character-by-character processing instead of regex
310
+ let sanitizedSuffix = '';
311
+ for (const char of suffix.toLowerCase()) {
312
+ if ((char >= 'a' && char <= 'z') || (char >= '0' && char <= '9') || char === '-') {
313
+ sanitizedSuffix += char;
314
+ }
315
+ else {
316
+ sanitizedSuffix += '-';
317
+ }
318
+ }
319
+ // Collapse multiple hyphens using split/filter/join
320
+ const parts = sanitizedSuffix.split('-').filter((part) => part.length > 0);
321
+ sanitizedSuffix = parts.join('-');
322
+ if (sanitizedSuffix) {
323
+ return `${baseName}-${sanitizedSuffix}`;
324
+ }
325
+ return baseName;
326
+ }
327
+ /**
328
+ * Truncates name if it exceeds length limits
329
+ * @param name - Name to potentially truncate
330
+ * @param suffix - Original suffix for preservation
331
+ * @returns Truncated name if needed
332
+ *
333
+ * @since 2.6.0
334
+ */
335
+ static truncateIfNeeded(name, suffix) {
336
+ const maxLength = 63;
337
+ if (name.length <= maxLength) {
338
+ return name;
339
+ }
340
+ // Truncate but preserve suffix if possible
341
+ if (suffix) {
342
+ // Use safe character processing instead of regex
343
+ let safeSuffix = '';
344
+ for (const char of suffix.toLowerCase()) {
345
+ if ((char >= 'a' && char <= 'z') || (char >= '0' && char <= '9') || char === '-') {
346
+ safeSuffix += char;
347
+ }
348
+ else {
349
+ safeSuffix += '-';
350
+ }
351
+ }
352
+ const suffixPart = `-${safeSuffix}`;
353
+ const maxBaseLength = maxLength - suffixPart.length;
354
+ if (maxBaseLength > 0) {
355
+ return name.substring(0, maxBaseLength) + suffixPart;
356
+ }
357
+ }
358
+ return name.substring(0, maxLength);
359
+ }
137
360
  }
138
361
  //# sourceMappingURL=security.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "timonel",
3
3
  "type": "module",
4
- "version": "2.5.0",
4
+ "version": "2.6.0",
5
5
  "description": "Timonel: programmatic Helm chart generator using cdk8s (TypeScript)",
6
6
  "bin": {
7
7
  "timonel": "dist/cli.js",
@@ -31,13 +31,18 @@
31
31
  "format": "prettier --write .",
32
32
  "format:check": "prettier --check .",
33
33
  "security:lint": "eslint .",
34
- "security:audit": "pnpm audit --audit-level=moderate",
34
+ "security:audit": "pnpm audit --audit-level=high",
35
35
  "security:check": "pnpm run security:lint && pnpm run security:audit",
36
36
  "deps:check": "pnpm outdated",
37
37
  "deps:update": "pnpm update --latest",
38
38
  "md:lint": "markdownlint \"**/*.md\"",
39
39
  "md:fix": "markdownlint --fix \"**/*.md\"",
40
- "test": "echo \"No tests specified\" && exit 0",
40
+ "test": "pnpm test:unit && pnpm test:integration",
41
+ "test:unit": "vitest run --config vitest.config.ts",
42
+ "test:integration": "vitest run --config vitest.integration.config.ts",
43
+ "test:watch": "vitest",
44
+ "test:coverage": "vitest run --coverage",
45
+ "test:basic-integration": "vitest run tests/integration/basic-chart-generation.int.spec.ts --config vitest.integration.config.ts",
41
46
  "ci:check": "pnpm typecheck && pnpm lint && pnpm format:check && pnpm build",
42
47
  "release": "semantic-release",
43
48
  "release:dry": "semantic-release --dry-run",
@@ -94,6 +99,7 @@
94
99
  "@types/node": "^24.3.0",
95
100
  "@typescript-eslint/eslint-plugin": "^8.42.0",
96
101
  "@typescript-eslint/parser": "^8.42.0",
102
+ "@vitest/coverage-v8": "^2.1.9",
97
103
  "conventional-changelog-cli": "^5.0.0",
98
104
  "eslint": "^9.35.0",
99
105
  "eslint-config-prettier": "^10.1.8",
@@ -108,7 +114,8 @@
108
114
  "markdownlint-cli": "^0.45.0",
109
115
  "prettier": "^3.6.2",
110
116
  "semantic-release": "^24.2.7",
111
- "typescript": "^5.9.2"
117
+ "typescript": "^5.9.2",
118
+ "vitest": "^2.1.9"
112
119
  },
113
120
  "files": [
114
121
  "dist",