timonel 0.2.1 → 0.4.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.
@@ -0,0 +1,34 @@
1
+ import type { Rutter } from './Rutter';
2
+ import type { HelmChartMeta } from './HelmChartWriter';
3
+ export interface SubchartSpec {
4
+ name: string;
5
+ rutter: Rutter;
6
+ version?: string;
7
+ condition?: string;
8
+ tags?: string[];
9
+ repository?: string;
10
+ }
11
+ export interface UmbrellaRutterProps {
12
+ meta: HelmChartMeta;
13
+ subcharts: SubchartSpec[];
14
+ defaultValues?: Record<string, unknown>;
15
+ envValues?: Record<string, Record<string, unknown>>;
16
+ }
17
+ /**
18
+ * UmbrellaRutter manages multiple Rutter instances as subcharts
19
+ * to create Helm umbrella charts with dependencies.
20
+ */
21
+ export declare class UmbrellaRutter {
22
+ private readonly props;
23
+ constructor(props: UmbrellaRutterProps);
24
+ private validateMetadata;
25
+ /**
26
+ * Write the umbrella chart with all subcharts to the output directory
27
+ */
28
+ write(outDir: string): void;
29
+ private writeParentChart;
30
+ private writeParentValues;
31
+ private deepMerge;
32
+ private generateNotesTemplate;
33
+ }
34
+ //# sourceMappingURL=UmbrellaRutter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UmbrellaRutter.d.ts","sourceRoot":"","sources":["../../src/lib/UmbrellaRutter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;gBAEhC,KAAK,EAAE,mBAAmB;IAMtC,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAmC3B,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,qBAAqB;CAe9B"}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.UmbrellaRutter = void 0;
7
+ const fs_1 = require("fs");
8
+ const path_1 = require("path");
9
+ const yaml_1 = __importDefault(require("yaml"));
10
+ /**
11
+ * UmbrellaRutter manages multiple Rutter instances as subcharts
12
+ * to create Helm umbrella charts with dependencies.
13
+ */
14
+ class UmbrellaRutter {
15
+ constructor(props) {
16
+ // Validate chart metadata
17
+ this.validateMetadata(props.meta);
18
+ this.props = props;
19
+ }
20
+ validateMetadata(meta) {
21
+ // Validate chart name follows Helm conventions
22
+ // eslint-disable-next-line security/detect-unsafe-regex -- Safe regex for chart name validation
23
+ if (!/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/.test(meta.name)) {
24
+ throw new Error('Chart name must contain only lowercase letters, numbers, and dashes');
25
+ }
26
+ // Validate semantic versioning
27
+ // eslint-disable-next-line security/detect-unsafe-regex -- Safe regex for semver validation
28
+ if (!/^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$/.test(meta.version)) {
29
+ throw new Error('Chart version must follow semantic versioning (e.g., 1.0.0)');
30
+ }
31
+ }
32
+ /**
33
+ * Write the umbrella chart with all subcharts to the output directory
34
+ */
35
+ write(outDir) {
36
+ // Sanitize paths to prevent directory traversal
37
+ // eslint-disable-next-line @typescript-eslint/no-var-requires -- Dynamic import needed for path operations
38
+ const path = require('path');
39
+ const sanitizedOutDir = path.normalize(path.resolve(outDir));
40
+ const cwd = process.cwd();
41
+ if (!sanitizedOutDir.startsWith(cwd)) {
42
+ throw new Error('Output directory must be within current working directory');
43
+ }
44
+ // Create output directory structure
45
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool needs dynamic paths
46
+ (0, fs_1.mkdirSync)(sanitizedOutDir, { recursive: true });
47
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool needs dynamic paths
48
+ (0, fs_1.mkdirSync)((0, path_1.join)(sanitizedOutDir, 'charts'), { recursive: true });
49
+ // Write each subchart to charts/ directory
50
+ for (const subchart of this.props.subcharts) {
51
+ const subchartDir = (0, path_1.join)(sanitizedOutDir, 'charts', subchart.name);
52
+ subchart.rutter.write(subchartDir);
53
+ }
54
+ // Generate parent Chart.yaml with dependencies
55
+ this.writeParentChart(sanitizedOutDir);
56
+ // Generate parent values.yaml
57
+ this.writeParentValues(sanitizedOutDir);
58
+ // Generate empty templates directory (umbrella charts typically don't have templates)
59
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool needs dynamic paths
60
+ (0, fs_1.mkdirSync)((0, path_1.join)(sanitizedOutDir, 'templates'), { recursive: true });
61
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool needs dynamic paths
62
+ (0, fs_1.writeFileSync)((0, path_1.join)(sanitizedOutDir, 'templates', 'NOTES.txt'), this.generateNotesTemplate());
63
+ }
64
+ writeParentChart(outDir) {
65
+ const chartYaml = {
66
+ apiVersion: 'v2',
67
+ name: this.props.meta.name,
68
+ description: this.props.meta.description || `${this.props.meta.name} umbrella chart`,
69
+ type: 'application',
70
+ version: this.props.meta.version,
71
+ appVersion: this.props.meta.appVersion,
72
+ keywords: this.props.meta.keywords || [],
73
+ home: this.props.meta.home,
74
+ sources: this.props.meta.sources,
75
+ maintainers: this.props.meta.maintainers,
76
+ dependencies: this.props.subcharts.map((subchart) => ({
77
+ name: subchart.name,
78
+ version: subchart.version || '0.1.0',
79
+ repository: subchart.repository || `file://./charts/${subchart.name}`,
80
+ condition: subchart.condition,
81
+ tags: subchart.tags,
82
+ })),
83
+ };
84
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool needs dynamic paths
85
+ (0, fs_1.writeFileSync)((0, path_1.join)(outDir, 'Chart.yaml'), yaml_1.default.stringify(chartYaml));
86
+ }
87
+ writeParentValues(outDir) {
88
+ const values = {
89
+ // Global values that can be shared across subcharts
90
+ global: {},
91
+ // Individual subchart values
92
+ ...this.props.defaultValues,
93
+ };
94
+ // Add subchart-specific value sections
95
+ for (const subchart of this.props.subcharts) {
96
+ if (!(subchart.name in values)) {
97
+ values[subchart.name] = {
98
+ enabled: true,
99
+ };
100
+ }
101
+ }
102
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool needs dynamic paths
103
+ (0, fs_1.writeFileSync)((0, path_1.join)(outDir, 'values.yaml'), yaml_1.default.stringify(values));
104
+ // Write environment-specific values files
105
+ if (this.props.envValues) {
106
+ for (const [env, envVals] of Object.entries(this.props.envValues)) {
107
+ const envValues = this.deepMerge(values, envVals);
108
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool needs dynamic paths
109
+ (0, fs_1.writeFileSync)((0, path_1.join)(outDir, `values-${env}.yaml`), yaml_1.default.stringify(envValues));
110
+ }
111
+ }
112
+ }
113
+ deepMerge(target, source) {
114
+ const result = { ...target };
115
+ for (const [key, value] of Object.entries(source)) {
116
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
117
+ // eslint-disable-next-line security/detect-object-injection -- Safe object property access in deep merge
118
+ result[key] = this.deepMerge(
119
+ // eslint-disable-next-line security/detect-object-injection -- Safe object property access in deep merge
120
+ result[key] || {}, value);
121
+ }
122
+ else {
123
+ // eslint-disable-next-line security/detect-object-injection -- Safe object property access in deep merge
124
+ result[key] = value;
125
+ }
126
+ }
127
+ return result;
128
+ }
129
+ generateNotesTemplate() {
130
+ return `1. Get the application URLs by running these commands:
131
+ {{- range $subchart := .Values }}
132
+ {{- if and (hasKey $subchart "enabled") $subchart.enabled }}
133
+ {{ $subchart | quote }} is enabled
134
+ {{- end }}
135
+ {{- end }}
136
+
137
+ 2. Check the status of subcharts:
138
+ helm list -A
139
+
140
+ 3. For more information about each subchart, check:
141
+ ${this.props.subcharts.map((s) => ` - charts/${s.name}/README.md`).join('\n')}
142
+ `;
143
+ }
144
+ }
145
+ exports.UmbrellaRutter = UmbrellaRutter;
146
+ //# sourceMappingURL=UmbrellaRutter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UmbrellaRutter.js","sourceRoot":"","sources":["../../src/lib/UmbrellaRutter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { UmbrellaRutter, UmbrellaRutterProps } from './UmbrellaRutter';
2
+ /**
3
+ * Create an umbrella chart from multiple Rutter instances
4
+ */
5
+ export declare function createUmbrella(props: UmbrellaRutterProps): UmbrellaRutter;
6
+ export type { UmbrellaRutterProps, SubchartSpec } from './UmbrellaRutter';
7
+ //# sourceMappingURL=umbrella.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"umbrella.d.ts","sourceRoot":"","sources":["../../src/lib/umbrella.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG5E;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,CAEzE;AAGD,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createUmbrella = createUmbrella;
4
+ const UmbrellaRutter_1 = require("./UmbrellaRutter");
5
+ /**
6
+ * Create an umbrella chart from multiple Rutter instances
7
+ */
8
+ function createUmbrella(props) {
9
+ return new UmbrellaRutter_1.UmbrellaRutter(props);
10
+ }
11
+ //# sourceMappingURL=umbrella.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"umbrella.js","sourceRoot":"","sources":["../../src/lib/umbrella.ts"],"names":[],"mappings":";;AAMA,wCAEC;AAPD,qDAAyE;AAEzE;;GAEG;AACH,SAAgB,cAAc,CAAC,KAA0B;IACvD,OAAO,IAAI,+BAAmB,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "timonel",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "Timonel: programmatic Helm chart generator using cdk8s (TypeScript)",
5
5
  "bin": {
6
6
  "timonel": "dist/cli.js",
@@ -77,7 +77,6 @@
77
77
  },
78
78
  "dependencies": {
79
79
  "cdk8s": "^2.70.11",
80
- "cdk8s-plus-28": "^2.5.6",
81
80
  "ts-node": "^10.9.2",
82
81
  "yaml": "^2.8.1"
83
82
  },