@intentius/chant-lexicon-helm 0.0.18 → 0.0.24

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 (55) hide show
  1. package/dist/integrity.json +5 -5
  2. package/dist/manifest.json +1 -1
  3. package/dist/skills/chant-helm.md +447 -0
  4. package/package.json +21 -3
  5. package/src/codegen/docs.test.ts +14 -0
  6. package/src/codegen/generate.test.ts +71 -0
  7. package/src/codegen/package.test.ts +36 -0
  8. package/src/composites/composites.test.ts +116 -110
  9. package/src/composites/helm-batch-job.ts +33 -19
  10. package/src/composites/helm-crd-lifecycle.ts +37 -24
  11. package/src/composites/helm-cron-job.ts +25 -13
  12. package/src/composites/helm-daemon-set.ts +26 -14
  13. package/src/composites/helm-external-secret.ts +21 -12
  14. package/src/composites/helm-library.ts +21 -7
  15. package/src/composites/helm-microservice.ts +46 -29
  16. package/src/composites/helm-monitored-service.ts +75 -51
  17. package/src/composites/helm-namespace-env.ts +80 -52
  18. package/src/composites/helm-secure-ingress.ts +66 -50
  19. package/src/composites/helm-stateful-service.ts +29 -16
  20. package/src/composites/helm-web-app.ts +37 -22
  21. package/src/composites/helm-worker.ts +34 -20
  22. package/src/import/roundtrip.test.ts +144 -0
  23. package/src/lint/post-synth/whm101.test.ts +69 -0
  24. package/src/lint/post-synth/whm102.test.ts +57 -0
  25. package/src/lint/post-synth/whm103.test.ts +58 -0
  26. package/src/lint/post-synth/whm104.test.ts +57 -0
  27. package/src/lint/post-synth/whm105.test.ts +41 -0
  28. package/src/lint/post-synth/whm201.test.ts +59 -0
  29. package/src/lint/post-synth/whm202.test.ts +62 -0
  30. package/src/lint/post-synth/whm203.test.ts +58 -0
  31. package/src/lint/post-synth/whm204.test.ts +56 -0
  32. package/src/lint/post-synth/whm301.test.ts +49 -0
  33. package/src/lint/post-synth/whm302.test.ts +58 -0
  34. package/src/lint/post-synth/whm401.test.ts +59 -0
  35. package/src/lint/post-synth/whm402.test.ts +58 -0
  36. package/src/lint/post-synth/whm403.test.ts +50 -0
  37. package/src/lint/post-synth/whm404.test.ts +50 -0
  38. package/src/lint/post-synth/whm405.test.ts +60 -0
  39. package/src/lint/post-synth/whm406.test.ts +43 -0
  40. package/src/lint/post-synth/whm407.test.ts +60 -0
  41. package/src/lint/post-synth/whm501.test.ts +70 -0
  42. package/src/lint/post-synth/whm502.test.ts +72 -0
  43. package/src/lint/rules/chart-metadata.test.ts +45 -0
  44. package/src/lint/rules/no-hardcoded-image.test.ts +41 -0
  45. package/src/lint/rules/values-no-secrets.test.ts +48 -0
  46. package/src/plugin.test.ts +3 -3
  47. package/src/plugin.ts +190 -19
  48. package/src/resources.ts +29 -0
  49. package/src/skills/chant-helm.md +447 -0
  50. package/dist/skills/chant-helm-create-chart.md +0 -211
  51. package/src/skills/create-chart.md +0 -211
  52. /package/dist/skills/{chant-helm-chart-patterns.md → chant-helm-patterns.md} +0 -0
  53. /package/dist/skills/{chant-helm-chart-security-patterns.md → chant-helm-security.md} +0 -0
  54. /package/src/skills/{chart-patterns.md → chant-helm-patterns.md} +0 -0
  55. /package/src/skills/{chart-security-patterns.md → chant-helm-security.md} +0 -0
@@ -4,6 +4,8 @@
4
4
  * Full microservice pattern with all common production resources.
5
5
  */
6
6
 
7
+ import { Composite, mergeDefaults } from "@intentius/chant";
8
+ import { Chart, Values, Deployment, Service, ServiceAccount, ConfigMap, Ingress, HPA, PDB } from "../resources";
7
9
  import { values, include, printf, toYaml, If, With } from "../intrinsics";
8
10
 
9
11
  export interface HelmMicroserviceProps {
@@ -43,21 +45,33 @@ export interface HelmMicroserviceProps {
43
45
  podAnnotations?: Record<string, string>;
44
46
  /** Deployment strategy defaults. */
45
47
  strategy?: Record<string, unknown>;
48
+ /** Per-member defaults. */
49
+ defaults?: {
50
+ chart?: Partial<Record<string, unknown>>;
51
+ values?: Partial<Record<string, unknown>>;
52
+ deployment?: Partial<Record<string, unknown>>;
53
+ service?: Partial<Record<string, unknown>>;
54
+ serviceAccount?: Partial<Record<string, unknown>>;
55
+ configMap?: Partial<Record<string, unknown>>;
56
+ ingress?: Partial<Record<string, unknown>>;
57
+ hpa?: Partial<Record<string, unknown>>;
58
+ pdb?: Partial<Record<string, unknown>>;
59
+ };
46
60
  }
47
61
 
48
62
  export interface HelmMicroserviceResult {
49
- chart: Record<string, unknown>;
50
- values: Record<string, unknown>;
51
- deployment: Record<string, unknown>;
52
- service: Record<string, unknown>;
53
- serviceAccount: Record<string, unknown>;
54
- configMap?: Record<string, unknown>;
55
- ingress?: Record<string, unknown>;
56
- hpa?: Record<string, unknown>;
57
- pdb?: Record<string, unknown>;
63
+ chart: InstanceType<typeof Chart>;
64
+ values: InstanceType<typeof Values>;
65
+ deployment: InstanceType<typeof Deployment>;
66
+ service: InstanceType<typeof Service>;
67
+ serviceAccount: InstanceType<typeof ServiceAccount>;
68
+ configMap?: InstanceType<typeof ConfigMap>;
69
+ ingress?: InstanceType<typeof Ingress>;
70
+ hpa?: InstanceType<typeof HPA>;
71
+ pdb?: InstanceType<typeof PDB>;
58
72
  }
59
73
 
60
- export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroserviceResult {
74
+ export const HelmMicroservice = Composite<HelmMicroserviceProps>((props) => {
61
75
  const {
62
76
  name,
63
77
  imageRepository = "nginx",
@@ -70,16 +84,17 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
70
84
  pdb = true,
71
85
  configMap = true,
72
86
  appVersion = "1.0.0",
87
+ defaults: defs,
73
88
  } = props;
74
89
 
75
- const chart = {
90
+ const chart = new Chart(mergeDefaults({
76
91
  apiVersion: "v2",
77
92
  name,
78
93
  version: "0.1.0",
79
94
  appVersion,
80
95
  type: "application",
81
96
  description: `A Helm chart for ${name} microservice`,
82
- };
97
+ }, defs?.chart));
83
98
 
84
99
  const valuesObj: Record<string, unknown> = {
85
100
  replicaCount: replicas,
@@ -152,6 +167,8 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
152
167
  };
153
168
  }
154
169
 
170
+ const valuesRes = new Values(mergeDefaults(valuesObj, defs?.values));
171
+
155
172
  const containerSpec: Record<string, unknown> = {
156
173
  name,
157
174
  image: printf("%s:%s", values.image.repository, values.image.tag),
@@ -192,7 +209,7 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
192
209
 
193
210
  if (props.strategy) deploymentSpec.strategy = toYaml(values.strategy);
194
211
 
195
- const deployment = {
212
+ const deployment = new Deployment(mergeDefaults({
196
213
  apiVersion: "apps/v1",
197
214
  kind: "Deployment",
198
215
  metadata: {
@@ -200,9 +217,9 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
200
217
  labels: include(`${name}.labels`),
201
218
  },
202
219
  spec: deploymentSpec,
203
- };
220
+ }, defs?.deployment));
204
221
 
205
- const service = {
222
+ const service = new Service(mergeDefaults({
206
223
  apiVersion: "v1",
207
224
  kind: "Service",
208
225
  metadata: {
@@ -219,9 +236,9 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
219
236
  }],
220
237
  selector: include(`${name}.selectorLabels`),
221
238
  },
222
- };
239
+ }, defs?.service));
223
240
 
224
- const serviceAccount = {
241
+ const serviceAccount = new ServiceAccount(mergeDefaults({
225
242
  apiVersion: "v1",
226
243
  kind: "ServiceAccount",
227
244
  metadata: {
@@ -229,18 +246,18 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
229
246
  labels: include(`${name}.labels`),
230
247
  annotations: toYaml(values.serviceAccount.annotations),
231
248
  },
232
- };
249
+ }, defs?.serviceAccount));
233
250
 
234
- const result: HelmMicroserviceResult = {
251
+ const result: Record<string, any> = {
235
252
  chart,
236
- values: valuesObj,
253
+ values: valuesRes,
237
254
  deployment,
238
255
  service,
239
256
  serviceAccount,
240
257
  };
241
258
 
242
259
  if (configMap) {
243
- result.configMap = {
260
+ result.configMap = new ConfigMap(mergeDefaults({
244
261
  apiVersion: "v1",
245
262
  kind: "ConfigMap",
246
263
  metadata: {
@@ -248,11 +265,11 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
248
265
  labels: include(`${name}.labels`),
249
266
  },
250
267
  data: values.config,
251
- };
268
+ }, defs?.configMap));
252
269
  }
253
270
 
254
271
  if (ingress) {
255
- result.ingress = {
272
+ result.ingress = new Ingress(mergeDefaults({
256
273
  apiVersion: "networking.k8s.io/v1",
257
274
  kind: "Ingress",
258
275
  metadata: {
@@ -265,11 +282,11 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
265
282
  rules: values.ingress.hosts,
266
283
  tls: values.ingress.tls,
267
284
  },
268
- };
285
+ }, defs?.ingress));
269
286
  }
270
287
 
271
288
  if (autoscaling) {
272
- result.hpa = {
289
+ result.hpa = new HPA(mergeDefaults({
273
290
  apiVersion: "autoscaling/v2",
274
291
  kind: "HorizontalPodAutoscaler",
275
292
  metadata: {
@@ -307,11 +324,11 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
307
324
  },
308
325
  ],
309
326
  },
310
- };
327
+ }, defs?.hpa));
311
328
  }
312
329
 
313
330
  if (pdb) {
314
- result.pdb = {
331
+ result.pdb = new PDB(mergeDefaults({
315
332
  apiVersion: "policy/v1",
316
333
  kind: "PodDisruptionBudget",
317
334
  metadata: {
@@ -324,8 +341,8 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
324
341
  matchLabels: include(`${name}.selectorLabels`),
325
342
  },
326
343
  },
327
- };
344
+ }, defs?.pdb));
328
345
  }
329
346
 
330
347
  return result;
331
- }
348
+ }, "HelmMicroservice");
@@ -5,6 +5,11 @@
5
5
  * Uses fallback GVK for CRD resources (ServiceMonitor, PrometheusRule).
6
6
  */
7
7
 
8
+ import { Composite, mergeDefaults } from "@intentius/chant";
9
+ import {
10
+ Chart, Values, Deployment, Service, ServiceAccount,
11
+ ServiceMonitor as ServiceMonitorRes, PrometheusRule as PrometheusRuleRes,
12
+ } from "../resources";
8
13
  import { values, include, printf, toYaml, If, With, Capabilities } from "../intrinsics";
9
14
 
10
15
  export interface HelmMonitoredServiceProps {
@@ -42,19 +47,29 @@ export interface HelmMonitoredServiceProps {
42
47
  affinity?: Record<string, unknown>;
43
48
  /** Chart appVersion. */
44
49
  appVersion?: string;
50
+ /** Per-member defaults. */
51
+ defaults?: {
52
+ chart?: Partial<Record<string, unknown>>;
53
+ values?: Partial<Record<string, unknown>>;
54
+ deployment?: Partial<Record<string, unknown>>;
55
+ service?: Partial<Record<string, unknown>>;
56
+ serviceAccount?: Partial<Record<string, unknown>>;
57
+ serviceMonitor?: Partial<Record<string, unknown>>;
58
+ prometheusRule?: Partial<Record<string, unknown>>;
59
+ };
45
60
  }
46
61
 
47
62
  export interface HelmMonitoredServiceResult {
48
- chart: Record<string, unknown>;
49
- values: Record<string, unknown>;
50
- deployment: Record<string, unknown>;
51
- service: Record<string, unknown>;
52
- serviceAccount?: Record<string, unknown>;
53
- serviceMonitor: Record<string, unknown>;
54
- prometheusRule?: Record<string, unknown>;
63
+ chart: InstanceType<typeof Chart>;
64
+ values: InstanceType<typeof Values>;
65
+ deployment: InstanceType<typeof Deployment>;
66
+ service: InstanceType<typeof Service>;
67
+ serviceAccount?: InstanceType<typeof ServiceAccount>;
68
+ serviceMonitor: InstanceType<typeof ServiceMonitorRes>;
69
+ prometheusRule?: InstanceType<typeof PrometheusRuleRes>;
55
70
  }
56
71
 
57
- export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMonitoredServiceResult {
72
+ export const HelmMonitoredService = Composite<HelmMonitoredServiceProps>((props) => {
58
73
  const {
59
74
  name,
60
75
  imageRepository = "nginx",
@@ -68,16 +83,17 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
68
83
  serviceAccount = true,
69
84
  alertRules = false,
70
85
  appVersion = "1.0.0",
86
+ defaults: defs,
71
87
  } = props;
72
88
 
73
- const chart = {
89
+ const chart = new Chart(mergeDefaults({
74
90
  apiVersion: "v2",
75
91
  name,
76
92
  version: "0.1.0",
77
93
  appVersion,
78
94
  type: "application",
79
95
  description: `A Helm chart for ${name} with monitoring`,
80
- };
96
+ }, defs?.chart));
81
97
 
82
98
  const valuesObj: Record<string, unknown> = {
83
99
  replicaCount: replicas,
@@ -120,6 +136,8 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
120
136
  };
121
137
  }
122
138
 
139
+ const valuesRes = new Values(mergeDefaults(valuesObj, defs?.values));
140
+
123
141
  const containerSpec: Record<string, unknown> = {
124
142
  name,
125
143
  image: printf("%s:%s", values.image.repository, values.image.tag),
@@ -143,7 +161,7 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
143
161
  if (props.affinity) podSpec.affinity = With(values.affinity, toYaml(values.affinity));
144
162
  if (serviceAccount) podSpec.serviceAccountName = include(`${name}.serviceAccountName`);
145
163
 
146
- const deployment = {
164
+ const deployment = new Deployment(mergeDefaults({
147
165
  apiVersion: "apps/v1",
148
166
  kind: "Deployment",
149
167
  metadata: {
@@ -162,9 +180,9 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
162
180
  spec: podSpec,
163
181
  },
164
182
  },
165
- };
183
+ }, defs?.deployment));
166
184
 
167
- const service = {
185
+ const service = new Service(mergeDefaults({
168
186
  apiVersion: "v1",
169
187
  kind: "Service",
170
188
  metadata: {
@@ -189,38 +207,41 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
189
207
  ],
190
208
  selector: include(`${name}.selectorLabels`),
191
209
  },
192
- };
210
+ }, defs?.service));
193
211
 
194
212
  // ServiceMonitor CRD (monitoring.coreos.com/v1) — gated on Capabilities check
195
- const serviceMonitor = If(`and .Values.monitoring.enabled (.Capabilities.APIVersions.Has "monitoring.coreos.com/v1")`, {
196
- apiVersion: "monitoring.coreos.com/v1",
197
- kind: "ServiceMonitor",
198
- metadata: {
199
- name: include(`${name}.fullname`),
200
- labels: include(`${name}.labels`),
201
- },
202
- spec: {
203
- selector: {
204
- matchLabels: include(`${name}.selectorLabels`),
213
+ const serviceMonitor = new ServiceMonitorRes(mergeDefaults(
214
+ If(`and .Values.monitoring.enabled (.Capabilities.APIVersions.Has "monitoring.coreos.com/v1")`, {
215
+ apiVersion: "monitoring.coreos.com/v1",
216
+ kind: "ServiceMonitor",
217
+ metadata: {
218
+ name: include(`${name}.fullname`),
219
+ labels: include(`${name}.labels`),
205
220
  },
206
- endpoints: [{
207
- port: "metrics",
208
- path: values.monitoring.metricsPath,
209
- interval: values.monitoring.scrapeInterval,
210
- }],
211
- },
212
- });
221
+ spec: {
222
+ selector: {
223
+ matchLabels: include(`${name}.selectorLabels`),
224
+ },
225
+ endpoints: [{
226
+ port: "metrics",
227
+ path: values.monitoring.metricsPath,
228
+ interval: values.monitoring.scrapeInterval,
229
+ }],
230
+ },
231
+ }) as Record<string, unknown>,
232
+ defs?.serviceMonitor,
233
+ ));
213
234
 
214
- const result: HelmMonitoredServiceResult = {
235
+ const result: Record<string, any> = {
215
236
  chart,
216
- values: valuesObj,
237
+ values: valuesRes,
217
238
  deployment,
218
239
  service,
219
- serviceMonitor: serviceMonitor as unknown as Record<string, unknown>,
240
+ serviceMonitor,
220
241
  };
221
242
 
222
243
  if (serviceAccount) {
223
- result.serviceAccount = {
244
+ result.serviceAccount = new ServiceAccount(mergeDefaults({
224
245
  apiVersion: "v1",
225
246
  kind: "ServiceAccount",
226
247
  metadata: {
@@ -228,25 +249,28 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
228
249
  labels: include(`${name}.labels`),
229
250
  annotations: toYaml(values.serviceAccount.annotations),
230
251
  },
231
- };
252
+ }, defs?.serviceAccount));
232
253
  }
233
254
 
234
255
  if (alertRules) {
235
- result.prometheusRule = If(`and .Values.alerting.enabled (.Capabilities.APIVersions.Has "monitoring.coreos.com/v1")`, {
236
- apiVersion: "monitoring.coreos.com/v1",
237
- kind: "PrometheusRule",
238
- metadata: {
239
- name: include(`${name}.fullname`),
240
- labels: include(`${name}.labels`),
241
- },
242
- spec: {
243
- groups: [{
244
- name: printf("%s.rules", name),
245
- rules: toYaml(values.alerting.rules),
246
- }],
247
- },
248
- }) as unknown as Record<string, unknown>;
256
+ result.prometheusRule = new PrometheusRuleRes(mergeDefaults(
257
+ If(`and .Values.alerting.enabled (.Capabilities.APIVersions.Has "monitoring.coreos.com/v1")`, {
258
+ apiVersion: "monitoring.coreos.com/v1",
259
+ kind: "PrometheusRule",
260
+ metadata: {
261
+ name: include(`${name}.fullname`),
262
+ labels: include(`${name}.labels`),
263
+ },
264
+ spec: {
265
+ groups: [{
266
+ name: printf("%s.rules", name),
267
+ rules: toYaml(values.alerting.rules),
268
+ }],
269
+ },
270
+ }) as Record<string, unknown>,
271
+ defs?.prometheusRule,
272
+ ));
249
273
  }
250
274
 
251
275
  return result;
252
- }
276
+ }, "HelmMonitoredService");
@@ -5,6 +5,13 @@
5
5
  * network isolation.
6
6
  */
7
7
 
8
+ import { Composite, mergeDefaults } from "@intentius/chant";
9
+ import {
10
+ Chart, Values, Namespace,
11
+ ResourceQuota as ResourceQuotaRes,
12
+ LimitRange as LimitRangeRes,
13
+ NetworkPolicy as NetworkPolicyRes,
14
+ } from "../resources";
8
15
  import { values, include, toYaml, If } from "../intrinsics";
9
16
 
10
17
  export interface HelmNamespaceEnvProps {
@@ -18,34 +25,44 @@ export interface HelmNamespaceEnvProps {
18
25
  networkPolicy?: boolean;
19
26
  /** Chart appVersion. */
20
27
  appVersion?: string;
28
+ /** Per-member defaults. */
29
+ defaults?: {
30
+ chart?: Partial<Record<string, unknown>>;
31
+ values?: Partial<Record<string, unknown>>;
32
+ namespace?: Partial<Record<string, unknown>>;
33
+ resourceQuota?: Partial<Record<string, unknown>>;
34
+ limitRange?: Partial<Record<string, unknown>>;
35
+ networkPolicy?: Partial<Record<string, unknown>>;
36
+ };
21
37
  }
22
38
 
23
39
  export interface HelmNamespaceEnvResult {
24
- chart: Record<string, unknown>;
25
- values: Record<string, unknown>;
26
- namespace: Record<string, unknown>;
27
- resourceQuota?: Record<string, unknown>;
28
- limitRange?: Record<string, unknown>;
29
- networkPolicy?: Record<string, unknown>;
40
+ chart: InstanceType<typeof Chart>;
41
+ values: InstanceType<typeof Values>;
42
+ namespace: InstanceType<typeof Namespace>;
43
+ resourceQuota?: InstanceType<typeof ResourceQuotaRes>;
44
+ limitRange?: InstanceType<typeof LimitRangeRes>;
45
+ networkPolicy?: InstanceType<typeof NetworkPolicyRes>;
30
46
  }
31
47
 
32
- export function HelmNamespaceEnv(props: HelmNamespaceEnvProps): HelmNamespaceEnvResult {
48
+ export const HelmNamespaceEnv = Composite<HelmNamespaceEnvProps>((props) => {
33
49
  const {
34
50
  name,
35
51
  resourceQuota = true,
36
52
  limitRange = true,
37
53
  networkPolicy = true,
38
54
  appVersion = "1.0.0",
55
+ defaults: defs,
39
56
  } = props;
40
57
 
41
- const chart = {
58
+ const chart = new Chart(mergeDefaults({
42
59
  apiVersion: "v2",
43
60
  name,
44
61
  version: "0.1.0",
45
62
  appVersion,
46
63
  type: "application",
47
64
  description: `A Helm chart for ${name} namespace environment`,
48
- };
65
+ }, defs?.chart));
49
66
 
50
67
  const valuesObj: Record<string, unknown> = {
51
68
  namespace: {
@@ -87,7 +104,9 @@ export function HelmNamespaceEnv(props: HelmNamespaceEnvProps): HelmNamespaceEnv
87
104
  };
88
105
  }
89
106
 
90
- const ns = {
107
+ const valuesRes = new Values(mergeDefaults(valuesObj, defs?.values));
108
+
109
+ const ns = new Namespace(mergeDefaults({
91
110
  apiVersion: "v1",
92
111
  kind: "Namespace",
93
112
  metadata: {
@@ -95,60 +114,69 @@ export function HelmNamespaceEnv(props: HelmNamespaceEnvProps): HelmNamespaceEnv
95
114
  labels: toYaml(values.namespace.labels),
96
115
  annotations: toYaml(values.namespace.annotations),
97
116
  },
98
- };
117
+ }, defs?.namespace));
99
118
 
100
- const result: HelmNamespaceEnvResult = {
119
+ const result: Record<string, any> = {
101
120
  chart,
102
- values: valuesObj,
121
+ values: valuesRes,
103
122
  namespace: ns,
104
123
  };
105
124
 
106
125
  if (resourceQuota) {
107
- result.resourceQuota = If(values.resourceQuota.enabled, {
108
- apiVersion: "v1",
109
- kind: "ResourceQuota",
110
- metadata: {
111
- name: include(`${name}.fullname`),
112
- labels: include(`${name}.labels`),
113
- },
114
- spec: {
115
- hard: toYaml(values.resourceQuota.hard),
116
- },
117
- }) as unknown as Record<string, unknown>;
126
+ result.resourceQuota = new ResourceQuotaRes(mergeDefaults(
127
+ If(values.resourceQuota.enabled, {
128
+ apiVersion: "v1",
129
+ kind: "ResourceQuota",
130
+ metadata: {
131
+ name: include(`${name}.fullname`),
132
+ labels: include(`${name}.labels`),
133
+ },
134
+ spec: {
135
+ hard: toYaml(values.resourceQuota.hard),
136
+ },
137
+ }) as Record<string, unknown>,
138
+ defs?.resourceQuota,
139
+ ));
118
140
  }
119
141
 
120
142
  if (limitRange) {
121
- result.limitRange = If(values.limitRange.enabled, {
122
- apiVersion: "v1",
123
- kind: "LimitRange",
124
- metadata: {
125
- name: include(`${name}.fullname`),
126
- labels: include(`${name}.labels`),
127
- },
128
- spec: {
129
- limits: [{
130
- type: "Container",
131
- default: toYaml(values.limitRange.default),
132
- defaultRequest: toYaml(values.limitRange.defaultRequest),
133
- }],
134
- },
135
- }) as unknown as Record<string, unknown>;
143
+ result.limitRange = new LimitRangeRes(mergeDefaults(
144
+ If(values.limitRange.enabled, {
145
+ apiVersion: "v1",
146
+ kind: "LimitRange",
147
+ metadata: {
148
+ name: include(`${name}.fullname`),
149
+ labels: include(`${name}.labels`),
150
+ },
151
+ spec: {
152
+ limits: [{
153
+ type: "Container",
154
+ default: toYaml(values.limitRange.default),
155
+ defaultRequest: toYaml(values.limitRange.defaultRequest),
156
+ }],
157
+ },
158
+ }) as Record<string, unknown>,
159
+ defs?.limitRange,
160
+ ));
136
161
  }
137
162
 
138
163
  if (networkPolicy) {
139
- result.networkPolicy = If(values.networkPolicy.enabled, {
140
- apiVersion: "networking.k8s.io/v1",
141
- kind: "NetworkPolicy",
142
- metadata: {
143
- name: include(`${name}.fullname`),
144
- labels: include(`${name}.labels`),
145
- },
146
- spec: {
147
- podSelector: {},
148
- policyTypes: ["Ingress", "Egress"],
149
- },
150
- }) as unknown as Record<string, unknown>;
164
+ result.networkPolicy = new NetworkPolicyRes(mergeDefaults(
165
+ If(values.networkPolicy.enabled, {
166
+ apiVersion: "networking.k8s.io/v1",
167
+ kind: "NetworkPolicy",
168
+ metadata: {
169
+ name: include(`${name}.fullname`),
170
+ labels: include(`${name}.labels`),
171
+ },
172
+ spec: {
173
+ podSelector: {},
174
+ policyTypes: ["Ingress", "Egress"],
175
+ },
176
+ }) as Record<string, unknown>,
177
+ defs?.networkPolicy,
178
+ ));
151
179
  }
152
180
 
153
181
  return result;
154
- }
182
+ }, "HelmNamespaceEnv");