timonel 2.10.2 → 2.11.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 (35) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +5 -9
  3. package/dist/cli.js +8 -20
  4. package/dist/index.d.ts +1 -2
  5. package/dist/index.js +1 -2
  6. package/dist/lib/helmChartWriter.js +17 -2
  7. package/dist/lib/rutter.d.ts +1 -0
  8. package/dist/lib/rutter.js +64 -11
  9. package/dist/lib/templates/flexible-subchart.d.ts +1 -0
  10. package/dist/lib/templates/flexible-subchart.js +101 -0
  11. package/dist/lib/templates/umbrella-chart.d.ts +13 -2
  12. package/dist/lib/templates/umbrella-chart.js +128 -42
  13. package/dist/lib/utils/helmHelpers/envHelpers.d.ts +2 -0
  14. package/dist/lib/utils/helmHelpers/envHelpers.js +97 -0
  15. package/dist/lib/utils/helmHelpers/gitopsHelpers.d.ts +2 -0
  16. package/dist/lib/utils/helmHelpers/gitopsHelpers.js +132 -0
  17. package/dist/lib/utils/helmHelpers/index.d.ts +23 -0
  18. package/dist/lib/utils/helmHelpers/index.js +132 -0
  19. package/dist/lib/utils/helmHelpers/observabilityHelpers.d.ts +2 -0
  20. package/dist/lib/utils/helmHelpers/observabilityHelpers.js +221 -0
  21. package/dist/lib/utils/helmHelpers/types.d.ts +16 -0
  22. package/dist/lib/utils/helmHelpers/types.js +1 -0
  23. package/dist/lib/utils/helmHelpers/validationHelpers.d.ts +2 -0
  24. package/dist/lib/utils/helmHelpers/validationHelpers.js +201 -0
  25. package/dist/lib/utils/helmHelpers.d.ts +11 -1
  26. package/dist/lib/utils/helmHelpers.js +20 -7
  27. package/dist/lib/utils/helmYamlSerializer.d.ts +53 -1
  28. package/dist/lib/utils/helmYamlSerializer.js +325 -29
  29. package/dist/lib/utils/logger.d.ts +49 -0
  30. package/dist/lib/utils/logger.js +418 -0
  31. package/package.json +21 -11
  32. package/dist/lib/templates/basic-chart.d.ts +0 -19
  33. package/dist/lib/templates/basic-chart.js +0 -210
  34. package/dist/lib/templates/subchart.d.ts +0 -27
  35. package/dist/lib/templates/subchart.js +0 -219
@@ -1,210 +0,0 @@
1
- import { Chart, ApiObject } from 'cdk8s';
2
- import { Rutter } from '../rutter.js';
3
- import { generateHelpersTemplate } from '../utils/helmHelpers.js';
4
- export class BasicChart extends Chart {
5
- constructor(scope, id, props = {}) {
6
- super(scope, id, props);
7
- this.props = props;
8
- this.initializeRutter();
9
- this.generateKubernetesManifests();
10
- }
11
- initializeRutter() {
12
- const { appName = 'my-app', image = 'nginx:latest', port = 80, replicas = 1, createNamespace = false, } = this.props;
13
- const meta = {
14
- name: appName,
15
- version: '1.0.0',
16
- description: `Helm chart for ${appName}`,
17
- };
18
- this.rutter = new Rutter({
19
- meta,
20
- scope: this,
21
- defaultValues: {
22
- appName,
23
- image,
24
- port,
25
- replicas,
26
- createNamespace,
27
- },
28
- helpersTpl: generateHelpersTemplate('aws', undefined, {
29
- includeKubernetes: true,
30
- includeSprig: true,
31
- }),
32
- });
33
- if (createNamespace) {
34
- this.rutter.addConditionalManifest({
35
- apiVersion: 'v1',
36
- kind: 'Namespace',
37
- metadata: {
38
- name: `{{ .Values.appName }}`,
39
- },
40
- }, 'createNamespace', 'namespace');
41
- }
42
- this.rutter.addManifest({
43
- apiVersion: 'apps/v1',
44
- kind: 'Deployment',
45
- metadata: {
46
- name: `{{ .Values.appName }}`,
47
- labels: {
48
- app: `{{ .Values.appName }}`,
49
- 'helm.sh/chart': `{{ .Chart.Name }}-{{ .Chart.Version }}`,
50
- 'app.kubernetes.io/name': `{{ .Chart.Name }}`,
51
- 'app.kubernetes.io/instance': `{{ .Release.Name }}`,
52
- 'app.kubernetes.io/version': `{{ .Chart.AppVersion }}`,
53
- 'app.kubernetes.io/managed-by': `{{ .Release.Service }}`,
54
- },
55
- },
56
- spec: {
57
- replicas: `{{ .Values.replicas }}`,
58
- selector: {
59
- matchLabels: {
60
- app: `{{ .Values.appName }}`,
61
- 'app.kubernetes.io/name': `{{ .Chart.Name }}`,
62
- 'app.kubernetes.io/instance': `{{ .Release.Name }}`,
63
- },
64
- },
65
- template: {
66
- metadata: {
67
- labels: {
68
- app: `{{ .Values.appName }}`,
69
- 'app.kubernetes.io/name': `{{ .Chart.Name }}`,
70
- 'app.kubernetes.io/instance': `{{ .Release.Name }}`,
71
- },
72
- },
73
- spec: {
74
- containers: [
75
- {
76
- name: 'app',
77
- image: `{{ .Values.image }}`,
78
- ports: [
79
- {
80
- containerPort: `{{ .Values.port }}`,
81
- },
82
- ],
83
- },
84
- ],
85
- },
86
- },
87
- },
88
- }, 'deployment');
89
- this.rutter.addManifest({
90
- apiVersion: 'v1',
91
- kind: 'Service',
92
- metadata: {
93
- name: `{{ .Values.appName }}`,
94
- labels: {
95
- app: `{{ .Values.appName }}`,
96
- 'helm.sh/chart': `{{ .Chart.Name }}-{{ .Chart.Version }}`,
97
- 'app.kubernetes.io/name': `{{ .Chart.Name }}`,
98
- 'app.kubernetes.io/instance': `{{ .Release.Name }}`,
99
- 'app.kubernetes.io/version': `{{ .Chart.AppVersion }}`,
100
- 'app.kubernetes.io/managed-by': `{{ .Release.Service }}`,
101
- },
102
- },
103
- spec: {
104
- ports: [
105
- {
106
- port: `{{ .Values.port }}`,
107
- targetPort: `{{ .Values.port }}`,
108
- },
109
- ],
110
- selector: {
111
- app: `{{ .Values.appName }}`,
112
- 'app.kubernetes.io/name': `{{ .Chart.Name }}`,
113
- 'app.kubernetes.io/instance': `{{ .Release.Name }}`,
114
- },
115
- },
116
- }, 'service');
117
- }
118
- writeHelmChart(outDir) {
119
- this.rutter.write(outDir);
120
- }
121
- generateKubernetesManifests() {
122
- const { appName = 'my-app', image = 'nginx:latest', port = 80, replicas = 1, createNamespace = false, } = this.props;
123
- if (createNamespace) {
124
- new ApiObject(this, 'namespace', {
125
- apiVersion: 'v1',
126
- kind: 'Namespace',
127
- metadata: {
128
- name: appName,
129
- },
130
- });
131
- }
132
- new ApiObject(this, 'deployment', {
133
- apiVersion: 'apps/v1',
134
- kind: 'Deployment',
135
- metadata: {
136
- name: appName,
137
- labels: {
138
- app: appName,
139
- },
140
- },
141
- spec: {
142
- replicas,
143
- selector: {
144
- matchLabels: {
145
- app: appName,
146
- },
147
- },
148
- template: {
149
- metadata: {
150
- labels: {
151
- app: appName,
152
- },
153
- },
154
- spec: {
155
- containers: [
156
- {
157
- name: 'app',
158
- image,
159
- ports: [
160
- {
161
- containerPort: port,
162
- },
163
- ],
164
- },
165
- ],
166
- },
167
- },
168
- },
169
- });
170
- new ApiObject(this, 'service', {
171
- apiVersion: 'v1',
172
- kind: 'Service',
173
- metadata: {
174
- name: appName,
175
- labels: {
176
- app: appName,
177
- },
178
- },
179
- spec: {
180
- ports: [
181
- {
182
- port,
183
- targetPort: port,
184
- },
185
- ],
186
- selector: {
187
- app: appName,
188
- },
189
- },
190
- });
191
- }
192
- }
193
- export function generateBasicChart(appName = 'my-app') {
194
- return `import { App } from 'cdk8s';
195
- import { BasicChart } from 'timonel';
196
-
197
- const app = new App();
198
-
199
- const chart = new BasicChart(app, '${appName}', {
200
- appName: '${appName}',
201
- image: 'nginx:latest',
202
- port: 80,
203
- replicas: 1,
204
- createNamespace: true // Set to true to create namespace, false to skip
205
- });
206
-
207
- // Generate complete Helm chart structure (Chart.yaml, values.yaml, templates/, _helpers.tpl)
208
- chart.writeHelmChart('dist');
209
- `;
210
- }
@@ -1,27 +0,0 @@
1
- import { Chart } from 'cdk8s';
2
- import type { ChartProps } from 'cdk8s';
3
- import type { Construct } from 'constructs';
4
- import { Rutter } from '../rutter.js';
5
- export interface SubchartProps extends ChartProps {
6
- appName?: string;
7
- image?: string;
8
- port?: number;
9
- replicas?: number;
10
- serviceType?: string;
11
- enableIngress?: boolean;
12
- ingressHost?: string;
13
- env?: Record<string, string>;
14
- persistentVolume?: {
15
- enabled: boolean;
16
- size: string;
17
- storageClass?: string;
18
- };
19
- }
20
- export declare class Subchart extends Chart {
21
- private rutter;
22
- constructor(scope: Construct, id: string, props?: SubchartProps);
23
- get rutterInstance(): Rutter;
24
- writeHelmChart(outDir: string): void;
25
- }
26
- export declare function generateSubchart(props?: SubchartProps, outDir?: string): void;
27
- export declare function generateSubchartTemplate(name: string): string;
@@ -1,219 +0,0 @@
1
- import { App, Chart } from 'cdk8s';
2
- import { Rutter } from '../rutter.js';
3
- import { generateHelpersTemplate } from '../utils/helmHelpers.js';
4
- export class Subchart extends Chart {
5
- constructor(scope, id, props = {}) {
6
- super(scope, id, props);
7
- const { appName = 'subchart-app', image = 'nginx:latest', port = 80, replicas = 1, serviceType = 'ClusterIP', enableIngress = false, ingressHost = 'example.com', env = {}, persistentVolume = { enabled: false, size: '1Gi' }, } = props;
8
- const meta = {
9
- name: appName,
10
- version: '1.0.0',
11
- description: `Helm chart for ${appName}`,
12
- };
13
- this.rutter = new Rutter({
14
- meta,
15
- scope: this,
16
- defaultValues: {
17
- appName,
18
- image,
19
- port,
20
- replicas,
21
- serviceType,
22
- enableIngress,
23
- ingressHost,
24
- env,
25
- persistentVolume,
26
- ingress: {
27
- annotations: {},
28
- className: '',
29
- hosts: [
30
- {
31
- host: ingressHost,
32
- paths: [
33
- {
34
- path: '/',
35
- pathType: 'Prefix',
36
- },
37
- ],
38
- },
39
- ],
40
- tls: [],
41
- },
42
- },
43
- helpersTpl: generateHelpersTemplate('aws', undefined, {
44
- includeKubernetes: true,
45
- includeSprig: true,
46
- }),
47
- });
48
- this.rutter.addManifest({
49
- apiVersion: 'v1',
50
- kind: 'ConfigMap',
51
- metadata: {
52
- name: `{{ .Values.appName }}-config`,
53
- labels: {
54
- app: `{{ .Values.appName }}`,
55
- component: 'config',
56
- },
57
- },
58
- data: {
59
- 'app.name': `{{ .Values.appName }}`,
60
- 'app.port': `{{ .Values.port }}`,
61
- 'app.environment': 'production',
62
- },
63
- }, 'configmap');
64
- this.rutter.addManifest({
65
- apiVersion: 'v1',
66
- kind: 'Secret',
67
- metadata: {
68
- name: `{{ .Values.appName }}-secret`,
69
- labels: {
70
- app: `{{ .Values.appName }}`,
71
- component: 'secret',
72
- },
73
- },
74
- stringData: {
75
- 'database.password': 'changeme',
76
- 'api.key': 'your-api-key-here',
77
- },
78
- }, 'secret');
79
- this.rutter.addManifest({
80
- apiVersion: 'apps/v1',
81
- kind: 'Deployment',
82
- metadata: {
83
- name: `{{ .Values.appName }}`,
84
- labels: {
85
- app: `{{ .Values.appName }}`,
86
- },
87
- },
88
- spec: {
89
- replicas: `{{ .Values.replicas }}`,
90
- selector: {
91
- matchLabels: {
92
- app: `{{ .Values.appName }}`,
93
- },
94
- },
95
- template: {
96
- metadata: {
97
- labels: {
98
- app: `{{ .Values.appName }}`,
99
- },
100
- },
101
- spec: {
102
- containers: [
103
- {
104
- name: 'app',
105
- image: `{{ .Values.image }}`,
106
- ports: [
107
- {
108
- containerPort: `{{ .Values.port }}`,
109
- },
110
- ],
111
- },
112
- ],
113
- },
114
- },
115
- },
116
- }, 'deployment');
117
- this.rutter.addManifest({
118
- apiVersion: 'v1',
119
- kind: 'Service',
120
- metadata: {
121
- name: `{{ .Values.appName }}`,
122
- labels: {
123
- app: `{{ .Values.appName }}`,
124
- },
125
- },
126
- spec: {
127
- type: `{{ .Values.serviceType }}`,
128
- ports: [
129
- {
130
- port: `{{ .Values.port }}`,
131
- targetPort: `{{ .Values.port }}`,
132
- },
133
- ],
134
- selector: {
135
- app: `{{ .Values.appName }}`,
136
- },
137
- },
138
- }, 'service');
139
- this.rutter.addConditionalManifest({
140
- apiVersion: 'networking.k8s.io/v1',
141
- kind: 'Ingress',
142
- metadata: {
143
- name: `{{ .Release.Name }}-{{ .Values.appName }}`,
144
- labels: {
145
- app: `{{ .Values.appName }}`,
146
- 'helm.sh/chart': `{{ .Chart.Name }}-{{ .Chart.Version }}`,
147
- 'app.kubernetes.io/name': `{{ .Chart.Name }}`,
148
- 'app.kubernetes.io/instance': `{{ .Release.Name }}`,
149
- 'app.kubernetes.io/version': `{{ .Chart.AppVersion }}`,
150
- 'app.kubernetes.io/managed-by': `{{ .Release.Service }}`,
151
- },
152
- annotations: `{{ toYaml .Values.ingress.annotations | nindent 4 }}`,
153
- },
154
- spec: {
155
- ingressClassName: `{{ .Values.ingress.className }}`,
156
- tls: `{{ toYaml .Values.ingress.tls | nindent 4 }}`,
157
- rules: [
158
- {
159
- host: `{{ .Values.ingressHost }}`,
160
- http: {
161
- paths: [
162
- {
163
- path: '/',
164
- pathType: 'Prefix',
165
- backend: {
166
- service: {
167
- name: `{{ .Release.Name }}-{{ .Values.appName }}`,
168
- port: {
169
- number: `{{ .Values.port }}`,
170
- },
171
- },
172
- },
173
- },
174
- ],
175
- },
176
- },
177
- ],
178
- },
179
- }, 'enableIngress', 'ingress');
180
- }
181
- get rutterInstance() {
182
- return this.rutter;
183
- }
184
- writeHelmChart(outDir) {
185
- this.rutter.write(outDir);
186
- }
187
- }
188
- export function generateSubchart(props = {}, outDir = 'dist') {
189
- const app = new App();
190
- const subchart = new Subchart(app, 'subchart', props);
191
- subchart.writeHelmChart(outDir);
192
- }
193
- export function generateSubchartTemplate(name) {
194
- return `import { App } from 'cdk8s';
195
- import { Subchart } from 'timonel';
196
-
197
- export default function createChart() {
198
- const app = new App({
199
- outdir: 'dist'
200
- });
201
-
202
- return new Subchart(app, '${name}', {
203
- appName: '${name}',
204
- image: 'nginx:latest',
205
- port: 80,
206
- replicas: 1,
207
- serviceType: 'ClusterIP',
208
- enableIngress: false,
209
- ingressHost: 'example.com'
210
- });
211
- }
212
-
213
- // Auto-execute when run directly
214
- if (import.meta.url === new URL(import.meta.url).href) {
215
- const chart = createChart();
216
- chart.node.root.synth();
217
- }
218
- `;
219
- }