kustodian 1.13.0 → 1.14.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/dist/cli/commands/diff.d.ts.map +1 -1
- package/dist/cli/commands/diff.js +217 -78
- package/dist/cli/commands/diff.js.map +1 -1
- package/dist/cli/utils/diff-stats.d.ts +76 -0
- package/dist/cli/utils/diff-stats.d.ts.map +1 -0
- package/dist/cli/utils/diff-stats.js +388 -0
- package/dist/cli/utils/diff-stats.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"AAsCA;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,qCAsdvB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
1
2
|
import { mkdtemp, rm, unlink, writeFile } from 'node:fs/promises';
|
|
2
3
|
import { tmpdir } from 'node:os';
|
|
3
4
|
import * as path from 'node:path';
|
|
@@ -10,6 +11,7 @@ import { define_command } from '../command.js';
|
|
|
10
11
|
import { PLUGIN_REGISTRY_ID } from '../services.js';
|
|
11
12
|
import { OCI_REGISTRY_PROVIDER } from '../utils/cluster-secrets.js';
|
|
12
13
|
import { resolve_defaults } from '../utils/defaults.js';
|
|
14
|
+
import { has_changes as diff_has_changes, empty_diff_stats, merge_diff_stats, parse_diff_stats, render_markdown_report, render_summary_table, } from '../utils/diff-stats.js';
|
|
13
15
|
import { is_not_found_error } from '../utils/k8s-errors.js';
|
|
14
16
|
import { create_namespace_manifest, create_registry_secret_manifest, get_oci_tag, get_provider_token_from_env, } from '../utils/oci.js';
|
|
15
17
|
import { load_and_resolve_project, sanitize_filename_part } from '../utils/project.js';
|
|
@@ -42,87 +44,187 @@ export const diff_command = define_command({
|
|
|
42
44
|
type: 'string',
|
|
43
45
|
default_value: 'k0s',
|
|
44
46
|
},
|
|
47
|
+
{
|
|
48
|
+
name: 'kubeconfig',
|
|
49
|
+
short: 'k',
|
|
50
|
+
description: 'Path to kubeconfig file (skips provider/SSH)',
|
|
51
|
+
type: 'string',
|
|
52
|
+
},
|
|
45
53
|
{
|
|
46
54
|
name: 'project',
|
|
47
55
|
short: 'p',
|
|
48
56
|
description: 'Path to project root',
|
|
49
57
|
type: 'string',
|
|
50
58
|
},
|
|
59
|
+
{
|
|
60
|
+
name: 'format',
|
|
61
|
+
short: 'f',
|
|
62
|
+
description: 'Output format: terminal (default) or markdown (PR-comment ready)',
|
|
63
|
+
type: 'string',
|
|
64
|
+
default_value: 'terminal',
|
|
65
|
+
},
|
|
51
66
|
],
|
|
52
67
|
handler: async (ctx, container) => {
|
|
53
68
|
const cluster_filter = ctx.options['cluster'];
|
|
54
69
|
const provider_name = ctx.options['provider'];
|
|
70
|
+
const kubeconfig_path = ctx.options['kubeconfig'];
|
|
55
71
|
const project_path = ctx.options['project'] || process.cwd();
|
|
56
|
-
|
|
72
|
+
const format = (ctx.options['format'] || 'terminal').toLowerCase();
|
|
73
|
+
if (format !== 'terminal' && format !== 'markdown') {
|
|
74
|
+
return {
|
|
75
|
+
success: false,
|
|
76
|
+
error: {
|
|
77
|
+
code: 'INVALID_ARGUMENT',
|
|
78
|
+
message: `--format must be 'terminal' or 'markdown', got '${format}'`,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const is_markdown = format === 'markdown';
|
|
83
|
+
// In markdown mode we own stdout entirely so the captured output is a
|
|
84
|
+
// valid comment. Progress goes to stderr instead of stdout.
|
|
85
|
+
const log = (message) => (is_markdown ? process.stderr : process.stdout).write(`${message}\n`);
|
|
86
|
+
const warn = (message) => process.stderr.write(`${message}\n`);
|
|
87
|
+
log('\n━━━ Kustodian Diff ━━━');
|
|
57
88
|
const project_result = await load_and_resolve_project(project_path, cluster_filter);
|
|
58
89
|
if (!is_success(project_result)) {
|
|
59
90
|
return project_result;
|
|
60
91
|
}
|
|
61
92
|
const { project_root, project, target_clusters } = project_result.value;
|
|
62
|
-
|
|
93
|
+
const cluster_summaries = [];
|
|
94
|
+
let first_error;
|
|
95
|
+
const record_error = (err) => {
|
|
96
|
+
if (!first_error)
|
|
97
|
+
first_error = err;
|
|
98
|
+
};
|
|
63
99
|
for (const loaded_cluster of target_clusters) {
|
|
64
100
|
const cluster_name = loaded_cluster.cluster.metadata.name;
|
|
65
101
|
const defaults = resolve_defaults(loaded_cluster.cluster, project.config);
|
|
66
102
|
const flux_namespace = defaults.flux_namespace;
|
|
67
103
|
const oci_registry_secret_name = defaults.oci_registry_secret_name;
|
|
68
|
-
|
|
69
|
-
console.log(` Provider: ${provider_name}`);
|
|
70
|
-
console.log(` ✓ Loaded ${loaded_cluster.nodes.length} nodes`);
|
|
104
|
+
log(`\n━━━ Cluster: ${cluster_name} ━━━`);
|
|
71
105
|
if (!loaded_cluster.cluster.spec.oci) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
error: { code: 'INVALID_CONFIG', message: 'spec.oci configuration required' },
|
|
106
|
+
const err = {
|
|
107
|
+
code: 'INVALID_CONFIG',
|
|
108
|
+
message: 'spec.oci configuration required',
|
|
76
109
|
};
|
|
110
|
+
warn(` ✗ ${err.message}`);
|
|
111
|
+
cluster_summaries.push({
|
|
112
|
+
cluster: cluster_name,
|
|
113
|
+
stats: empty_diff_stats(),
|
|
114
|
+
error: 'spec.oci required',
|
|
115
|
+
});
|
|
116
|
+
record_error(err);
|
|
117
|
+
continue;
|
|
77
118
|
}
|
|
78
119
|
const validation_result = validate_cluster_template_requirements(loaded_cluster, project.templates);
|
|
79
120
|
if (!is_success(validation_result)) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const provider_result = resolve_provider(registry_result.value, loaded_cluster, provider_name);
|
|
89
|
-
if (!is_success(provider_result)) {
|
|
90
|
-
return provider_result;
|
|
121
|
+
warn(` ✗ ${validation_result.error.message}`);
|
|
122
|
+
cluster_summaries.push({
|
|
123
|
+
cluster: cluster_name,
|
|
124
|
+
stats: empty_diff_stats(),
|
|
125
|
+
error: validation_result.error.message,
|
|
126
|
+
});
|
|
127
|
+
record_error(validation_result.error);
|
|
128
|
+
continue;
|
|
91
129
|
}
|
|
130
|
+
// Resolve kubeconfig: either from --kubeconfig flag or via provider SSH
|
|
131
|
+
let resolved_kubeconfig;
|
|
92
132
|
let temp_kubeconfig;
|
|
93
|
-
let
|
|
94
|
-
|
|
95
|
-
|
|
133
|
+
let provider;
|
|
134
|
+
if (kubeconfig_path) {
|
|
135
|
+
if (!existsSync(kubeconfig_path)) {
|
|
136
|
+
const err = {
|
|
137
|
+
code: 'INVALID_CONFIG',
|
|
138
|
+
message: `Kubeconfig file not found: ${kubeconfig_path}`,
|
|
139
|
+
};
|
|
140
|
+
warn(` ✗ ${err.message}`);
|
|
141
|
+
cluster_summaries.push({
|
|
142
|
+
cluster: cluster_name,
|
|
143
|
+
stats: empty_diff_stats(),
|
|
144
|
+
error: 'kubeconfig not found',
|
|
145
|
+
});
|
|
146
|
+
record_error(err);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
log(` Kubeconfig: ${kubeconfig_path}`);
|
|
150
|
+
resolved_kubeconfig = kubeconfig_path;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
log(` Provider: ${provider_name}`);
|
|
154
|
+
log(` ✓ Loaded ${loaded_cluster.nodes.length} nodes`);
|
|
155
|
+
const registry_result = container.resolve(PLUGIN_REGISTRY_ID);
|
|
156
|
+
if (!is_success(registry_result)) {
|
|
157
|
+
return registry_result;
|
|
158
|
+
}
|
|
159
|
+
const provider_result = resolve_provider(registry_result.value, loaded_cluster, provider_name);
|
|
160
|
+
if (!is_success(provider_result)) {
|
|
161
|
+
warn(` ✗ ${provider_result.error.message}`);
|
|
162
|
+
cluster_summaries.push({
|
|
163
|
+
cluster: cluster_name,
|
|
164
|
+
stats: empty_diff_stats(),
|
|
165
|
+
error: provider_result.error.message,
|
|
166
|
+
});
|
|
167
|
+
record_error(provider_result.error);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
provider = provider_result.value;
|
|
96
171
|
const node_list = build_node_list(loaded_cluster);
|
|
97
172
|
const validate_result = provider.validate(node_list);
|
|
98
173
|
if (!is_success(validate_result)) {
|
|
99
|
-
|
|
100
|
-
|
|
174
|
+
warn(` ✗ ${validate_result.error.message}`);
|
|
175
|
+
cluster_summaries.push({
|
|
176
|
+
cluster: cluster_name,
|
|
177
|
+
stats: empty_diff_stats(),
|
|
178
|
+
error: validate_result.error.message,
|
|
179
|
+
});
|
|
180
|
+
record_error(validate_result.error);
|
|
181
|
+
await provider.cleanup?.();
|
|
182
|
+
continue;
|
|
101
183
|
}
|
|
102
184
|
const kubeconfig_result = await provider.get_kubeconfig(node_list);
|
|
103
185
|
if (!is_success(kubeconfig_result)) {
|
|
104
|
-
|
|
105
|
-
|
|
186
|
+
warn(` ✗ ${kubeconfig_result.error.message}`);
|
|
187
|
+
cluster_summaries.push({
|
|
188
|
+
cluster: cluster_name,
|
|
189
|
+
stats: empty_diff_stats(),
|
|
190
|
+
error: kubeconfig_result.error.message,
|
|
191
|
+
});
|
|
192
|
+
record_error(kubeconfig_result.error);
|
|
193
|
+
await provider.cleanup?.();
|
|
194
|
+
continue;
|
|
106
195
|
}
|
|
107
196
|
temp_kubeconfig = path.join(tmpdir(), `kustodian-diff-kubeconfig-${sanitize_filename_part(cluster_name)}.yaml`);
|
|
108
197
|
await writeFile(temp_kubeconfig, kubeconfig_result.value, 'utf-8');
|
|
109
|
-
// Rename kubeconfig entries to cluster-scoped names
|
|
110
198
|
const kubeconfig_manager = create_kubeconfig_manager();
|
|
111
199
|
const rename_result = await kubeconfig_manager.rename_entries(temp_kubeconfig, cluster_name);
|
|
112
200
|
if (!is_success(rename_result)) {
|
|
113
|
-
|
|
114
|
-
|
|
201
|
+
warn(` ✗ ${rename_result.error.message}`);
|
|
202
|
+
cluster_summaries.push({
|
|
203
|
+
cluster: cluster_name,
|
|
204
|
+
stats: empty_diff_stats(),
|
|
205
|
+
error: rename_result.error.message,
|
|
206
|
+
});
|
|
207
|
+
record_error(rename_result.error);
|
|
208
|
+
await provider.cleanup?.();
|
|
209
|
+
await unlink(temp_kubeconfig).catch(() => undefined);
|
|
210
|
+
continue;
|
|
115
211
|
}
|
|
116
|
-
|
|
212
|
+
resolved_kubeconfig = temp_kubeconfig;
|
|
213
|
+
}
|
|
214
|
+
let temp_flux_kustomization_dir;
|
|
215
|
+
let cluster_stats = empty_diff_stats();
|
|
216
|
+
let cluster_error;
|
|
217
|
+
const cluster_sections = [];
|
|
218
|
+
try {
|
|
219
|
+
const client_options = { kubeconfig: resolved_kubeconfig };
|
|
117
220
|
const kubectl_client = create_kubectl_client(client_options);
|
|
118
221
|
const flux_client = create_flux_client(client_options);
|
|
119
222
|
const flux_cli_result = await flux_client.check_cli();
|
|
120
223
|
if (!is_success(flux_cli_result) || !flux_cli_result.value) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
};
|
|
224
|
+
cluster_error = 'flux CLI not found';
|
|
225
|
+
warn(` ✗ ${cluster_error}`);
|
|
226
|
+
record_error({ code: 'MISSING_DEPENDENCY', message: cluster_error });
|
|
227
|
+
continue;
|
|
126
228
|
}
|
|
127
229
|
const templates_dir = path.join(project_root, 'templates');
|
|
128
230
|
const template_paths = new Map();
|
|
@@ -139,8 +241,10 @@ export const diff_command = define_command({
|
|
|
139
241
|
});
|
|
140
242
|
const gen_result = await generator.generate(loaded_cluster.cluster, project.templates.map((t) => t.template), {});
|
|
141
243
|
if (!is_success(gen_result)) {
|
|
142
|
-
|
|
143
|
-
|
|
244
|
+
cluster_error = gen_result.error.message;
|
|
245
|
+
warn(` ✗ ${cluster_error}`);
|
|
246
|
+
record_error(gen_result.error);
|
|
247
|
+
continue;
|
|
144
248
|
}
|
|
145
249
|
const gen_data = gen_result.value;
|
|
146
250
|
const tag = await get_oci_tag(loaded_cluster.cluster, project_root);
|
|
@@ -155,14 +259,10 @@ export const diff_command = define_command({
|
|
|
155
259
|
oci_has_auth = true;
|
|
156
260
|
}
|
|
157
261
|
else if (!is_not_found_error(secret_check.error.message)) {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
code: 'KUBECTL_GET_ERROR',
|
|
163
|
-
message: `Failed to check OCI secret: ${secret_check.error.message}`,
|
|
164
|
-
},
|
|
165
|
-
};
|
|
262
|
+
cluster_error = `Failed to check OCI secret: ${secret_check.error.message}`;
|
|
263
|
+
warn(` ✗ ${cluster_error}`);
|
|
264
|
+
record_error({ code: 'KUBECTL_GET_ERROR', message: cluster_error });
|
|
265
|
+
continue;
|
|
166
266
|
}
|
|
167
267
|
else {
|
|
168
268
|
const token = get_provider_token_from_env(OCI_REGISTRY_PROVIDER.env_vars);
|
|
@@ -177,20 +277,16 @@ export const diff_command = define_command({
|
|
|
177
277
|
resources.push(create_namespace_manifest(flux_namespace));
|
|
178
278
|
}
|
|
179
279
|
else {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
code: 'KUBECTL_GET_ERROR',
|
|
185
|
-
message: `Failed to check namespace '${flux_namespace}': ${namespace_check.error.message}`,
|
|
186
|
-
},
|
|
187
|
-
};
|
|
280
|
+
cluster_error = `Failed to check namespace '${flux_namespace}': ${namespace_check.error.message}`;
|
|
281
|
+
warn(` ✗ ${cluster_error}`);
|
|
282
|
+
record_error({ code: 'KUBECTL_GET_ERROR', message: cluster_error });
|
|
283
|
+
continue;
|
|
188
284
|
}
|
|
189
285
|
}
|
|
190
286
|
resources.push(create_registry_secret_manifest(loaded_cluster.cluster.spec.oci.registry, token, oci_registry_secret_name, flux_namespace));
|
|
191
287
|
}
|
|
192
288
|
else {
|
|
193
|
-
|
|
289
|
+
warn(` ⚠ ${OCI_REGISTRY_PROVIDER.skip_warning}`);
|
|
194
290
|
}
|
|
195
291
|
}
|
|
196
292
|
if (gen_data.oci_repository) {
|
|
@@ -213,26 +309,32 @@ export const diff_command = define_command({
|
|
|
213
309
|
resources.push(k.flux_kustomization);
|
|
214
310
|
}
|
|
215
311
|
if (resources.length > 0) {
|
|
216
|
-
|
|
312
|
+
log('\n → Diffing Flux control-plane resources...');
|
|
217
313
|
const object_diff_result = await kubectl_client.diff_stdin(resources.map((resource) => serialize_resource(resource)).join('---\n'));
|
|
218
314
|
if (!is_success(object_diff_result)) {
|
|
219
|
-
|
|
220
|
-
|
|
315
|
+
cluster_error = object_diff_result.error.message;
|
|
316
|
+
warn(` ✗ ${cluster_error}`);
|
|
317
|
+
record_error(object_diff_result.error);
|
|
318
|
+
continue;
|
|
221
319
|
}
|
|
222
320
|
if (object_diff_result.value.stdout) {
|
|
223
|
-
|
|
321
|
+
log(object_diff_result.value.stdout);
|
|
322
|
+
cluster_stats = merge_diff_stats(cluster_stats, parse_diff_stats(object_diff_result.value.stdout));
|
|
323
|
+
if (object_diff_result.value.has_changes) {
|
|
324
|
+
cluster_sections.push({
|
|
325
|
+
title: 'Flux control plane',
|
|
326
|
+
output: object_diff_result.value.stdout,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
224
329
|
}
|
|
225
330
|
if (object_diff_result.value.stderr) {
|
|
226
|
-
|
|
227
|
-
}
|
|
228
|
-
if (object_diff_result.value.has_changes) {
|
|
229
|
-
has_changes = true;
|
|
331
|
+
warn(object_diff_result.value.stderr);
|
|
230
332
|
}
|
|
231
|
-
|
|
232
|
-
|
|
333
|
+
if (!object_diff_result.value.has_changes) {
|
|
334
|
+
log(' ✓ No Flux object changes');
|
|
233
335
|
}
|
|
234
336
|
}
|
|
235
|
-
|
|
337
|
+
log('\n → Diffing rendered workloads...');
|
|
236
338
|
temp_flux_kustomization_dir = await mkdtemp(path.join(tmpdir(), `kustodian-diff-${sanitize_filename_part(cluster_name)}-`));
|
|
237
339
|
for (const generated of gen_data.kustomizations) {
|
|
238
340
|
const flux_kustomization_file = path.join(temp_flux_kustomization_dir, `${generated.name}.yaml`);
|
|
@@ -245,37 +347,74 @@ export const diff_command = define_command({
|
|
|
245
347
|
progress_bar: false,
|
|
246
348
|
});
|
|
247
349
|
if (!is_success(workload_diff_result)) {
|
|
248
|
-
|
|
249
|
-
|
|
350
|
+
cluster_error = workload_diff_result.error.message;
|
|
351
|
+
warn(` ✗ ${cluster_error}`);
|
|
352
|
+
record_error(workload_diff_result.error);
|
|
353
|
+
break;
|
|
250
354
|
}
|
|
251
355
|
if (workload_diff_result.value.stdout) {
|
|
252
|
-
|
|
356
|
+
log(workload_diff_result.value.stdout);
|
|
357
|
+
cluster_stats = merge_diff_stats(cluster_stats, parse_diff_stats(workload_diff_result.value.stdout));
|
|
358
|
+
if (workload_diff_result.value.has_changes) {
|
|
359
|
+
cluster_sections.push({
|
|
360
|
+
title: `Kustomization: ${generated.name}`,
|
|
361
|
+
output: workload_diff_result.value.stdout,
|
|
362
|
+
});
|
|
363
|
+
}
|
|
253
364
|
}
|
|
254
365
|
if (workload_diff_result.value.stderr) {
|
|
255
|
-
|
|
256
|
-
}
|
|
257
|
-
if (workload_diff_result.value.has_changes) {
|
|
258
|
-
has_changes = true;
|
|
366
|
+
warn(workload_diff_result.value.stderr);
|
|
259
367
|
}
|
|
260
368
|
}
|
|
261
369
|
}
|
|
262
370
|
finally {
|
|
263
|
-
|
|
371
|
+
if (provider)
|
|
372
|
+
await provider.cleanup?.();
|
|
264
373
|
if (temp_kubeconfig) {
|
|
265
374
|
await unlink(temp_kubeconfig).catch(() => undefined);
|
|
266
375
|
}
|
|
267
376
|
if (temp_flux_kustomization_dir) {
|
|
268
377
|
await rm(temp_flux_kustomization_dir, { recursive: true, force: true }).catch(() => undefined);
|
|
269
378
|
}
|
|
379
|
+
const entry = {
|
|
380
|
+
cluster: cluster_name,
|
|
381
|
+
stats: cluster_stats,
|
|
382
|
+
};
|
|
383
|
+
if (cluster_error)
|
|
384
|
+
entry.error = cluster_error;
|
|
385
|
+
if (cluster_sections.length > 0)
|
|
386
|
+
entry.sections = cluster_sections;
|
|
387
|
+
cluster_summaries.push(entry);
|
|
270
388
|
}
|
|
271
389
|
}
|
|
272
|
-
|
|
390
|
+
const any_changes = cluster_summaries.some((c) => !c.error && diff_has_changes(c.stats));
|
|
391
|
+
if (is_markdown) {
|
|
392
|
+
process.stdout.write(`${render_markdown_report(cluster_summaries, {
|
|
393
|
+
scope: cluster_filter ?? 'all clusters',
|
|
394
|
+
})}\n`);
|
|
395
|
+
}
|
|
396
|
+
else if (cluster_summaries.length > 0) {
|
|
397
|
+
log('\n━━━ Summary ━━━\n');
|
|
398
|
+
log(render_summary_table(cluster_summaries));
|
|
399
|
+
log('');
|
|
400
|
+
}
|
|
401
|
+
if (first_error) {
|
|
402
|
+
// Return the error so the runner/bin decides exit code. Do not mutate
|
|
403
|
+
// `process.exitCode` here: it is a global that leaks across tests
|
|
404
|
+
// sharing a process.
|
|
405
|
+
log('━━━ Diff Complete: errors occurred ━━━\n');
|
|
406
|
+
return {
|
|
407
|
+
success: false,
|
|
408
|
+
error: first_error,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
if (any_changes) {
|
|
412
|
+
// exit-code 1 = differences found (Unix `diff` convention)
|
|
273
413
|
process.exitCode = 1;
|
|
274
|
-
|
|
414
|
+
log('━━━ Diff Complete: changes detected ━━━\n');
|
|
275
415
|
return success(undefined);
|
|
276
416
|
}
|
|
277
|
-
|
|
278
|
-
console.log('\n━━━ Diff Complete: no changes ━━━\n');
|
|
417
|
+
log('━━━ Diff Complete: no changes ━━━\n');
|
|
279
418
|
return success(undefined);
|
|
280
419
|
},
|
|
281
420
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,WAAW,EACX,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,sCAAsC,EAAE,MAAM,wBAAwB,CAAC;AAEhF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC;IACzC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,+CAA+C;IAC5D,OAAO,EAAE;QACP;YACE,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,iDAAiD;YAC9D,IAAI,EAAE,QAAQ;SACf;QACD;YACE,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,2CAA2C;YACxD,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,KAAK;SACrB;QACD;YACE,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,sBAAsB;YACnC,IAAI,EAAE,QAAQ;SACf;KACF;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAChC,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAuB,CAAC;QACpE,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAW,CAAC;QACxD,MAAM,YAAY,GAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAEzE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAExC,MAAM,cAAc,GAAG,MAAM,wBAAwB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QACpF,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAChC,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC;QACxE,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;YAC7C,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC1D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1E,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;YAC/C,MAAM,wBAAwB,GAAG,QAAQ,CAAC,wBAAwB,CAAC;YAEnE,OAAO,CAAC,GAAG,CAAC,kBAAkB,YAAY,MAAM,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,cAAc,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;YAE/D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;oBACL,OAAO,EAAE,KAAc;oBACvB,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,iCAAiC,EAAE;iBAC9E,CAAC;YACJ,CAAC;YAED,MAAM,iBAAiB,GAAG,sCAAsC,CAC9D,cAAc,EACd,OAAO,CAAC,SAAS,CAClB,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO,iBAAiB,CAAC;YAC3B,CAAC;YAED,+EAA+E;YAC/E,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YAC9D,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACjC,OAAO,eAAe,CAAC;YACzB,CAAC;YACD,MAAM,eAAe,GAAG,gBAAgB,CACtC,eAAe,CAAC,KAAK,EACrB,cAAc,EACd,aAAa,CACd,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACjC,OAAO,eAAe,CAAC;YACzB,CAAC;YAED,IAAI,eAAmC,CAAC;YACxC,IAAI,2BAA+C,CAAC;YACpD,MAAM,QAAQ,GAAwB,eAAe,CAAC,KAAK,CAAC;YAE5D,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;gBAElD,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACrD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;oBACjC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO,eAAe,CAAC;gBACzB,CAAC;gBAED,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBACnE,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBACnC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO,iBAAiB,CAAC;gBAC3B,CAAC;gBAED,eAAe,GAAG,IAAI,CAAC,IAAI,CACzB,MAAM,EAAE,EACR,6BAA6B,sBAAsB,CAAC,YAAY,CAAC,OAAO,CACzE,CAAC;gBACF,MAAM,SAAS,CAAC,eAAe,EAAE,iBAAiB,CAAC,KAAe,EAAE,OAAO,CAAC,CAAC;gBAE7E,oDAAoD;gBACpD,MAAM,kBAAkB,GAAG,yBAAyB,EAAE,CAAC;gBACvD,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAC3D,eAAe,EACf,YAAY,CACb,CAAC;gBACF,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC/B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO,aAAa,CAAC;gBACvB,CAAC;gBAED,MAAM,cAAc,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;gBACvD,MAAM,cAAc,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;gBAC7D,MAAM,WAAW,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;gBAEvD,MAAM,eAAe,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,CAAC;gBACtD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;oBAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO;wBACL,OAAO,EAAE,KAAc;wBACvB,KAAK,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,oBAAoB,EAAE;qBACrE,CAAC;gBACJ,CAAC;gBAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;gBAC3D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;gBACjD,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBAClC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrF,CAAC;gBAED,MAAM,SAAS,GAAG,gBAAgB,CAAC;oBACjC,cAAc,EAAE,QAAQ,CAAC,cAAc;oBACvC,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;oBACjD,cAAc;oBACd,4BAA4B,EAAE,QAAQ,CAAC,4BAA4B;oBACnE,2BAA2B,EAAE,QAAQ,CAAC,2BAA2B;oBACjE,kCAAkC,EAAE,QAAQ,CAAC,kCAAkC;iBAChF,CAAC,CAAC;gBAEH,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,QAAQ,CACzC,cAAc,CAAC,OAAO,EACtB,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EACxC,EAAE,CACH,CAAC;gBACF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO,UAAU,CAAC;gBACpB,CAAC;gBAED,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;gBAClC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBAEpE,IAAI,YAAY,GAAG,KAAK,CAAC;gBACzB,MAAM,SAAS,GAAoB,EAAE,CAAC;gBAEtC,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC;oBAC5C,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,wBAAwB;oBAC9B,SAAS,EAAE,cAAc;iBAC1B,CAAC,CAAC;gBAEH,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC7B,YAAY,GAAG,IAAI,CAAC;gBACtB,CAAC;qBAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO;wBACL,OAAO,EAAE,KAAc;wBACvB,KAAK,EAAE;4BACL,IAAI,EAAE,mBAAmB;4BACzB,OAAO,EAAE,+BAA+B,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE;yBACrE;qBACF,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,GAAG,2BAA2B,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;oBAC1E,IAAI,KAAK,EAAE,CAAC;wBACV,YAAY,GAAG,IAAI,CAAC;wBACpB,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC;4BAC/C,IAAI,EAAE,WAAW;4BACjB,IAAI,EAAE,cAAc;yBACrB,CAAC,CAAC;wBACH,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;4BACjC,IAAI,kBAAkB,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gCACtD,SAAS,CAAC,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC,CAAC;4BAC5D,CAAC;iCAAM,CAAC;gCACN,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gCACrB,OAAO;oCACL,OAAO,EAAE,KAAc;oCACvB,KAAK,EAAE;wCACL,IAAI,EAAE,mBAAmB;wCACzB,OAAO,EAAE,8BAA8B,cAAc,MAAM,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE;qCAC3F;iCACF,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAED,SAAS,CAAC,IAAI,CACZ,+BAA+B,CAC7B,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EACxC,KAAK,EACL,wBAAwB,EACxB,cAAc,CACf,CACF,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,OAAO,qBAAqB,CAAC,YAAY,EAAE,CAAC,CAAC;oBAC5D,CAAC;gBACH,CAAC;gBAED,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG;wBACf,GAAG,QAAQ,CAAC,cAAc;wBAC1B,IAAI,EAAE;4BACJ,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI;4BAC/B,GAAG,EAAE,EAAE,GAAG,EAAE;yBACb;qBACF,CAAC;oBACF,IAAI,YAAY,EAAE,CAAC;wBACjB,QAAQ,CAAC,IAAI,GAAG;4BACd,GAAG,QAAQ,CAAC,IAAI;4BAChB,SAAS,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE;yBAC9C,CAAC;oBACJ,CAAC;oBACD,SAAS,CAAC,IAAI,CAAC,QAAyB,CAAC,CAAC;gBAC5C,CAAC;gBAED,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;oBACxC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAmC,CAAC,CAAC;gBACxD,CAAC;gBAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;oBAC7D,MAAM,kBAAkB,GAAG,MAAM,cAAc,CAAC,UAAU,CACxD,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CACxE,CAAC;oBACF,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;wBACpC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;wBACrB,OAAO,kBAAkB,CAAC;oBAC5B,CAAC;oBAED,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;wBACpC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC/C,CAAC;oBACD,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;wBACpC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACjD,CAAC;oBAED,IAAI,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;wBACzC,WAAW,GAAG,IAAI,CAAC;oBACrB,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;oBAC9C,CAAC;gBACH,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,2BAA2B,GAAG,MAAM,OAAO,CACzC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,sBAAsB,CAAC,YAAY,CAAC,GAAG,CAAC,CAC/E,CAAC;gBAEF,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;oBAChD,MAAM,uBAAuB,GAAG,IAAI,CAAC,IAAI,CACvC,2BAA2B,EAC3B,GAAG,SAAS,CAAC,IAAI,OAAO,CACzB,CAAC;oBACF,MAAM,SAAS,CACb,uBAAuB,EACvB,kBAAkB,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAChD,OAAO,CACR,CAAC;oBAEF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;oBAChF,MAAM,oBAAoB,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,EAAE;wBAChF,IAAI,EAAE,UAAU;wBAChB,kBAAkB,EAAE,uBAAuB;wBAC3C,SAAS,EAAE,cAAc;wBACzB,YAAY,EAAE,KAAK;qBACpB,CAAC,CAAC;oBAEH,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;wBACtC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;wBACrB,OAAO,oBAAoB,CAAC;oBAC9B,CAAC;oBAED,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;wBACtC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACjD,CAAC;oBACD,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;wBACtC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACnD,CAAC;oBAED,IAAI,oBAAoB,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;wBAC3C,WAAW,GAAG,IAAI,CAAC;oBACrB,CAAC;gBACH,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC5B,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACvD,CAAC;gBACD,IAAI,2BAA2B,EAAE,CAAC;oBAChC,MAAM,EAAE,CAAC,2BAA2B,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAC3E,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;CACF,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse flux/kubectl diff output and render per-cluster summary tables.
|
|
3
|
+
*
|
|
4
|
+
* `flux diff kustomization` and `kubectl diff` emit unified-diff style output
|
|
5
|
+
* with per-resource status markers. We walk the output line-by-line and
|
|
6
|
+
* accumulate:
|
|
7
|
+
* - resources created / modified / deleted (by status keyword)
|
|
8
|
+
* - line-level additions / removals (git-status style)
|
|
9
|
+
*/
|
|
10
|
+
export interface DiffStatsType {
|
|
11
|
+
resources_created: number;
|
|
12
|
+
resources_modified: number;
|
|
13
|
+
resources_deleted: number;
|
|
14
|
+
lines_added: number;
|
|
15
|
+
lines_removed: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ClusterDiffSectionType {
|
|
18
|
+
title: string;
|
|
19
|
+
output: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ClusterDiffStatsType {
|
|
22
|
+
cluster: string;
|
|
23
|
+
stats: DiffStatsType;
|
|
24
|
+
error?: string;
|
|
25
|
+
skipped?: string;
|
|
26
|
+
sections?: ClusterDiffSectionType[];
|
|
27
|
+
}
|
|
28
|
+
export declare function empty_diff_stats(): DiffStatsType;
|
|
29
|
+
export declare function total_resources(stats: DiffStatsType): number;
|
|
30
|
+
export declare function has_changes(stats: DiffStatsType): boolean;
|
|
31
|
+
export declare function merge_diff_stats(a: DiffStatsType, b: DiffStatsType): DiffStatsType;
|
|
32
|
+
/**
|
|
33
|
+
* Count additions/deletions and per-resource status lines from a diff blob.
|
|
34
|
+
*/
|
|
35
|
+
export declare function parse_diff_stats(output: string): DiffStatsType;
|
|
36
|
+
/**
|
|
37
|
+
* Format a git-status-style "+A -R" hint for a cluster row.
|
|
38
|
+
*/
|
|
39
|
+
export declare function format_line_counts(stats: DiffStatsType): string;
|
|
40
|
+
/**
|
|
41
|
+
* Format a resource summary like "3 modified, 1 created".
|
|
42
|
+
*/
|
|
43
|
+
export declare function format_resource_counts(stats: DiffStatsType): string;
|
|
44
|
+
/**
|
|
45
|
+
* Render a per-cluster summary table.
|
|
46
|
+
*/
|
|
47
|
+
export declare function render_summary_table(entries: ClusterDiffStatsType[], options?: {
|
|
48
|
+
color?: boolean;
|
|
49
|
+
}): string;
|
|
50
|
+
/**
|
|
51
|
+
* Sentinel used to locate a previously-posted kustodian PR diff comment so
|
|
52
|
+
* the GitHub Action can update it in place instead of stacking duplicates.
|
|
53
|
+
*/
|
|
54
|
+
export declare const PR_COMMENT_MARKER = "<!-- kustodian-pr-diff -->";
|
|
55
|
+
export interface MarkdownReportOptions {
|
|
56
|
+
title?: string;
|
|
57
|
+
/** If provided, included in the header (e.g. "production" or "all clusters"). */
|
|
58
|
+
scope?: string;
|
|
59
|
+
/**
|
|
60
|
+
* Truncate the comment to this byte length (approx). GitHub comments max
|
|
61
|
+
* out around 65k chars; default to a conservative 60k.
|
|
62
|
+
*/
|
|
63
|
+
max_length?: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Render the full PR-ready markdown document (including the detection marker).
|
|
67
|
+
*
|
|
68
|
+
* Structure:
|
|
69
|
+
* 1. Hidden marker
|
|
70
|
+
* 2. Heading + short status line
|
|
71
|
+
* 3. Summary table
|
|
72
|
+
* 4. Per-cluster <details> blocks with raw diff blobs
|
|
73
|
+
* 5. Footer signature
|
|
74
|
+
*/
|
|
75
|
+
export declare function render_markdown_report(entries: ClusterDiffStatsType[], options?: MarkdownReportOptions): string;
|
|
76
|
+
//# sourceMappingURL=diff-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-stats.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/diff-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,aAAa;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAC;CACrC;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAQhD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAE5D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,aAAa,CAQlF;AAsBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CA0B9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAK/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAMnE;AA6FD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,oBAAoB,EAAE,EAC/B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,MAAM,CAkBR;AAMD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAwD9D,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,oBAAoB,EAAE,EAC/B,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAwHR"}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse flux/kubectl diff output and render per-cluster summary tables.
|
|
3
|
+
*
|
|
4
|
+
* `flux diff kustomization` and `kubectl diff` emit unified-diff style output
|
|
5
|
+
* with per-resource status markers. We walk the output line-by-line and
|
|
6
|
+
* accumulate:
|
|
7
|
+
* - resources created / modified / deleted (by status keyword)
|
|
8
|
+
* - line-level additions / removals (git-status style)
|
|
9
|
+
*/
|
|
10
|
+
export function empty_diff_stats() {
|
|
11
|
+
return {
|
|
12
|
+
resources_created: 0,
|
|
13
|
+
resources_modified: 0,
|
|
14
|
+
resources_deleted: 0,
|
|
15
|
+
lines_added: 0,
|
|
16
|
+
lines_removed: 0,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function total_resources(stats) {
|
|
20
|
+
return stats.resources_created + stats.resources_modified + stats.resources_deleted;
|
|
21
|
+
}
|
|
22
|
+
export function has_changes(stats) {
|
|
23
|
+
return total_resources(stats) > 0 || stats.lines_added > 0 || stats.lines_removed > 0;
|
|
24
|
+
}
|
|
25
|
+
export function merge_diff_stats(a, b) {
|
|
26
|
+
return {
|
|
27
|
+
resources_created: a.resources_created + b.resources_created,
|
|
28
|
+
resources_modified: a.resources_modified + b.resources_modified,
|
|
29
|
+
resources_deleted: a.resources_deleted + b.resources_deleted,
|
|
30
|
+
lines_added: a.lines_added + b.lines_added,
|
|
31
|
+
lines_removed: a.lines_removed + b.lines_removed,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Strip ANSI escape sequences so regex matching is reliable.
|
|
36
|
+
*/
|
|
37
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escapes start with ESC
|
|
38
|
+
const ANSI_RE = /\x1b\[[0-9;]*[a-zA-Z]/g;
|
|
39
|
+
/**
|
|
40
|
+
* Detect lines that announce a per-resource status in flux/kubectl diff output.
|
|
41
|
+
*
|
|
42
|
+
* Flux 2.x emits lines such as:
|
|
43
|
+
* ► Deployment/default/app drifted
|
|
44
|
+
* ✚ ConfigMap/kube-system/new created
|
|
45
|
+
* ✗ Service/legacy/old deleted
|
|
46
|
+
*
|
|
47
|
+
* kubectl diff emits unified-diff file headers — those are recognized through
|
|
48
|
+
* the `+++`/`---` prefixes below instead.
|
|
49
|
+
*/
|
|
50
|
+
const RESOURCE_STATUS_RE = /^\s*(?:[►✚✗►»!+\-~*]|[►])?\s*[A-Za-z][A-Za-z0-9.]*\/\S+\s+(?:is\s+)?(created|modified|drifted|deleted|added|removed|configured|pruned)\b/i;
|
|
51
|
+
/**
|
|
52
|
+
* Count additions/deletions and per-resource status lines from a diff blob.
|
|
53
|
+
*/
|
|
54
|
+
export function parse_diff_stats(output) {
|
|
55
|
+
const stats = empty_diff_stats();
|
|
56
|
+
if (!output)
|
|
57
|
+
return stats;
|
|
58
|
+
const clean = output.replace(ANSI_RE, '');
|
|
59
|
+
for (const raw_line of clean.split('\n')) {
|
|
60
|
+
const line = raw_line.replace(/\r$/, '');
|
|
61
|
+
// Unified-diff file headers — skip so they do not inflate line counts.
|
|
62
|
+
if (line.startsWith('+++') || line.startsWith('---'))
|
|
63
|
+
continue;
|
|
64
|
+
if (line.startsWith('diff '))
|
|
65
|
+
continue;
|
|
66
|
+
if (line.startsWith('+'))
|
|
67
|
+
stats.lines_added += 1;
|
|
68
|
+
else if (line.startsWith('-'))
|
|
69
|
+
stats.lines_removed += 1;
|
|
70
|
+
const match = line.match(RESOURCE_STATUS_RE);
|
|
71
|
+
if (match) {
|
|
72
|
+
const status = match[1]?.toLowerCase();
|
|
73
|
+
if (status === 'created' || status === 'added')
|
|
74
|
+
stats.resources_created += 1;
|
|
75
|
+
else if (status === 'deleted' || status === 'removed' || status === 'pruned')
|
|
76
|
+
stats.resources_deleted += 1;
|
|
77
|
+
else
|
|
78
|
+
stats.resources_modified += 1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return stats;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Format a git-status-style "+A -R" hint for a cluster row.
|
|
85
|
+
*/
|
|
86
|
+
export function format_line_counts(stats) {
|
|
87
|
+
const parts = [];
|
|
88
|
+
if (stats.lines_added)
|
|
89
|
+
parts.push(`+${stats.lines_added}`);
|
|
90
|
+
if (stats.lines_removed)
|
|
91
|
+
parts.push(`-${stats.lines_removed}`);
|
|
92
|
+
return parts.length > 0 ? parts.join(' ') : '—';
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Format a resource summary like "3 modified, 1 created".
|
|
96
|
+
*/
|
|
97
|
+
export function format_resource_counts(stats) {
|
|
98
|
+
const parts = [];
|
|
99
|
+
if (stats.resources_created)
|
|
100
|
+
parts.push(`${stats.resources_created} created`);
|
|
101
|
+
if (stats.resources_modified)
|
|
102
|
+
parts.push(`${stats.resources_modified} modified`);
|
|
103
|
+
if (stats.resources_deleted)
|
|
104
|
+
parts.push(`${stats.resources_deleted} deleted`);
|
|
105
|
+
return parts.length > 0 ? parts.join(', ') : '—';
|
|
106
|
+
}
|
|
107
|
+
function pad(value, width, align) {
|
|
108
|
+
const visible = visible_length(value);
|
|
109
|
+
if (visible >= width)
|
|
110
|
+
return value;
|
|
111
|
+
const padding = ' '.repeat(width - visible);
|
|
112
|
+
return align === 'right' ? padding + value : value + padding;
|
|
113
|
+
}
|
|
114
|
+
// ANSI-aware length so colored strings still align.
|
|
115
|
+
function visible_length(value) {
|
|
116
|
+
return value.replace(ANSI_RE, '').length;
|
|
117
|
+
}
|
|
118
|
+
function render_table(columns, rows) {
|
|
119
|
+
const widths = columns.map((col, idx) => {
|
|
120
|
+
const header_width = visible_length(col.header);
|
|
121
|
+
const data_width = rows.reduce((max, row) => Math.max(max, visible_length(row[idx] ?? '')), 0);
|
|
122
|
+
return Math.max(header_width, data_width);
|
|
123
|
+
});
|
|
124
|
+
const render_row = (row) => `│ ${row
|
|
125
|
+
.map((cell, idx) => {
|
|
126
|
+
const width = widths[idx] ?? 0;
|
|
127
|
+
const align = columns[idx]?.align ?? 'left';
|
|
128
|
+
return pad(cell ?? '', width, align);
|
|
129
|
+
})
|
|
130
|
+
.join(' │ ')} │`;
|
|
131
|
+
const border = (left, mid, right) => left + widths.map((w) => '─'.repeat(w + 2)).join(mid) + right;
|
|
132
|
+
const lines = [];
|
|
133
|
+
lines.push(border('┌', '┬', '┐'));
|
|
134
|
+
lines.push(render_row(columns.map((c) => c.header)));
|
|
135
|
+
lines.push(border('├', '┼', '┤'));
|
|
136
|
+
for (const row of rows)
|
|
137
|
+
lines.push(render_row(row));
|
|
138
|
+
lines.push(border('└', '┴', '┘'));
|
|
139
|
+
return lines.join('\n');
|
|
140
|
+
}
|
|
141
|
+
const GREEN = '\x1b[32m';
|
|
142
|
+
const RED = '\x1b[31m';
|
|
143
|
+
const YELLOW = '\x1b[33m';
|
|
144
|
+
const DIM = '\x1b[2m';
|
|
145
|
+
const BOLD = '\x1b[1m';
|
|
146
|
+
const RESET = '\x1b[0m';
|
|
147
|
+
function color(value, code, use_color) {
|
|
148
|
+
return use_color ? `${code}${value}${RESET}` : value;
|
|
149
|
+
}
|
|
150
|
+
function status_cell(entry, use_color) {
|
|
151
|
+
if (entry.error)
|
|
152
|
+
return color('error', RED, use_color);
|
|
153
|
+
if (entry.skipped)
|
|
154
|
+
return color('skipped', YELLOW, use_color);
|
|
155
|
+
if (!has_changes(entry.stats))
|
|
156
|
+
return color('no changes', DIM, use_color);
|
|
157
|
+
return color('changed', YELLOW, use_color);
|
|
158
|
+
}
|
|
159
|
+
function changes_cell(entry, use_color) {
|
|
160
|
+
if (entry.error)
|
|
161
|
+
return entry.error;
|
|
162
|
+
if (entry.skipped)
|
|
163
|
+
return entry.skipped;
|
|
164
|
+
if (!has_changes(entry.stats))
|
|
165
|
+
return color('—', DIM, use_color);
|
|
166
|
+
const added = entry.stats.lines_added
|
|
167
|
+
? color(`+${entry.stats.lines_added}`, GREEN, use_color)
|
|
168
|
+
: '';
|
|
169
|
+
const removed = entry.stats.lines_removed
|
|
170
|
+
? color(`-${entry.stats.lines_removed}`, RED, use_color)
|
|
171
|
+
: '';
|
|
172
|
+
return [added, removed].filter(Boolean).join(' ') || color('—', DIM, use_color);
|
|
173
|
+
}
|
|
174
|
+
function resources_cell(entry, use_color) {
|
|
175
|
+
if (entry.error || entry.skipped)
|
|
176
|
+
return color('—', DIM, use_color);
|
|
177
|
+
if (!has_changes(entry.stats))
|
|
178
|
+
return color('—', DIM, use_color);
|
|
179
|
+
const parts = [];
|
|
180
|
+
if (entry.stats.resources_created)
|
|
181
|
+
parts.push(color(`+${entry.stats.resources_created}`, GREEN, use_color));
|
|
182
|
+
if (entry.stats.resources_modified)
|
|
183
|
+
parts.push(color(`~${entry.stats.resources_modified}`, YELLOW, use_color));
|
|
184
|
+
if (entry.stats.resources_deleted)
|
|
185
|
+
parts.push(color(`-${entry.stats.resources_deleted}`, RED, use_color));
|
|
186
|
+
return parts.length > 0 ? parts.join(' ') : color('—', DIM, use_color);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Render a per-cluster summary table.
|
|
190
|
+
*/
|
|
191
|
+
export function render_summary_table(entries, options = {}) {
|
|
192
|
+
const use_color = options.color ?? true;
|
|
193
|
+
const rows = entries.map((entry) => [
|
|
194
|
+
color(entry.cluster, BOLD, use_color),
|
|
195
|
+
status_cell(entry, use_color),
|
|
196
|
+
resources_cell(entry, use_color),
|
|
197
|
+
changes_cell(entry, use_color),
|
|
198
|
+
]);
|
|
199
|
+
return render_table([
|
|
200
|
+
{ header: 'Cluster' },
|
|
201
|
+
{ header: 'Status' },
|
|
202
|
+
{ header: 'Resources', align: 'left' },
|
|
203
|
+
{ header: 'Lines', align: 'left' },
|
|
204
|
+
], rows);
|
|
205
|
+
}
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// Markdown PR comment rendering
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
/**
|
|
210
|
+
* Sentinel used to locate a previously-posted kustodian PR diff comment so
|
|
211
|
+
* the GitHub Action can update it in place instead of stacking duplicates.
|
|
212
|
+
*/
|
|
213
|
+
export const PR_COMMENT_MARKER = '<!-- kustodian-pr-diff -->';
|
|
214
|
+
const STATUS_EMOJI = {
|
|
215
|
+
changed: '🔵',
|
|
216
|
+
no_changes: '✅',
|
|
217
|
+
error: '❌',
|
|
218
|
+
skipped: '⏭️',
|
|
219
|
+
};
|
|
220
|
+
function markdown_status_emoji(entry) {
|
|
221
|
+
if (entry.error)
|
|
222
|
+
return STATUS_EMOJI.error;
|
|
223
|
+
if (entry.skipped)
|
|
224
|
+
return STATUS_EMOJI.skipped;
|
|
225
|
+
if (!has_changes(entry.stats))
|
|
226
|
+
return STATUS_EMOJI.no_changes;
|
|
227
|
+
return STATUS_EMOJI.changed;
|
|
228
|
+
}
|
|
229
|
+
function markdown_status_label(entry) {
|
|
230
|
+
if (entry.error)
|
|
231
|
+
return 'error';
|
|
232
|
+
if (entry.skipped)
|
|
233
|
+
return 'skipped';
|
|
234
|
+
if (!has_changes(entry.stats))
|
|
235
|
+
return 'no changes';
|
|
236
|
+
return 'changed';
|
|
237
|
+
}
|
|
238
|
+
function markdown_resources_cell(entry) {
|
|
239
|
+
if (entry.error || entry.skipped || !has_changes(entry.stats))
|
|
240
|
+
return '—';
|
|
241
|
+
const parts = [];
|
|
242
|
+
if (entry.stats.resources_created)
|
|
243
|
+
parts.push(`+${entry.stats.resources_created}`);
|
|
244
|
+
if (entry.stats.resources_modified)
|
|
245
|
+
parts.push(`~${entry.stats.resources_modified}`);
|
|
246
|
+
if (entry.stats.resources_deleted)
|
|
247
|
+
parts.push(`-${entry.stats.resources_deleted}`);
|
|
248
|
+
return parts.length > 0 ? parts.join(' ') : '—';
|
|
249
|
+
}
|
|
250
|
+
function markdown_lines_cell(entry) {
|
|
251
|
+
if (entry.error)
|
|
252
|
+
return `\`${escape_markdown_code(entry.error)}\``;
|
|
253
|
+
if (entry.skipped)
|
|
254
|
+
return entry.skipped;
|
|
255
|
+
if (!has_changes(entry.stats))
|
|
256
|
+
return '—';
|
|
257
|
+
const parts = [];
|
|
258
|
+
if (entry.stats.lines_added)
|
|
259
|
+
parts.push(`+${entry.stats.lines_added}`);
|
|
260
|
+
if (entry.stats.lines_removed)
|
|
261
|
+
parts.push(`-${entry.stats.lines_removed}`);
|
|
262
|
+
return parts.length > 0 ? parts.join(' ') : '—';
|
|
263
|
+
}
|
|
264
|
+
function escape_markdown_code(value) {
|
|
265
|
+
// Backticks break inline code spans. Trim and escape them.
|
|
266
|
+
return value.replace(/`/g, "'").replace(/\r?\n/g, ' ').trim();
|
|
267
|
+
}
|
|
268
|
+
function fence_diff(output) {
|
|
269
|
+
// Strip ANSI and normalize trailing whitespace, then wrap in a ```diff fence.
|
|
270
|
+
const clean = output.replace(ANSI_RE, '').trimEnd();
|
|
271
|
+
// A code fence of 4 backticks is needed if the diff itself contains triple
|
|
272
|
+
// backticks — this is rare in k8s diffs, but be defensive.
|
|
273
|
+
const fence = clean.includes('```') ? '````' : '```';
|
|
274
|
+
return `${fence}diff\n${clean}\n${fence}`;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Render the full PR-ready markdown document (including the detection marker).
|
|
278
|
+
*
|
|
279
|
+
* Structure:
|
|
280
|
+
* 1. Hidden marker
|
|
281
|
+
* 2. Heading + short status line
|
|
282
|
+
* 3. Summary table
|
|
283
|
+
* 4. Per-cluster <details> blocks with raw diff blobs
|
|
284
|
+
* 5. Footer signature
|
|
285
|
+
*/
|
|
286
|
+
export function render_markdown_report(entries, options = {}) {
|
|
287
|
+
const title = options.title ?? 'Kustodian Cluster Diff';
|
|
288
|
+
const scope = options.scope ? ` — \`${options.scope}\`` : '';
|
|
289
|
+
const max_length = options.max_length ?? 60000;
|
|
290
|
+
const error_count = entries.filter((e) => e.error).length;
|
|
291
|
+
const changed_count = entries.filter((e) => !e.error && !e.skipped && has_changes(e.stats)).length;
|
|
292
|
+
const clean_count = entries.filter((e) => !e.error && !e.skipped && !has_changes(e.stats)).length;
|
|
293
|
+
const skipped_count = entries.filter((e) => e.skipped).length;
|
|
294
|
+
const total_lines_added = entries.reduce((sum, e) => sum + e.stats.lines_added, 0);
|
|
295
|
+
const total_lines_removed = entries.reduce((sum, e) => sum + e.stats.lines_removed, 0);
|
|
296
|
+
const parts = [];
|
|
297
|
+
parts.push(PR_COMMENT_MARKER);
|
|
298
|
+
parts.push(`### ${title}${scope}`);
|
|
299
|
+
parts.push('');
|
|
300
|
+
if (entries.length === 0) {
|
|
301
|
+
parts.push('_No clusters were diffed._');
|
|
302
|
+
return parts.join('\n');
|
|
303
|
+
}
|
|
304
|
+
const status_bits = [];
|
|
305
|
+
if (changed_count)
|
|
306
|
+
status_bits.push(`**${changed_count}** changed`);
|
|
307
|
+
if (clean_count)
|
|
308
|
+
status_bits.push(`${clean_count} unchanged`);
|
|
309
|
+
if (error_count)
|
|
310
|
+
status_bits.push(`${error_count} errored`);
|
|
311
|
+
if (skipped_count)
|
|
312
|
+
status_bits.push(`${skipped_count} skipped`);
|
|
313
|
+
const line_bits = [];
|
|
314
|
+
if (total_lines_added)
|
|
315
|
+
line_bits.push(`+${total_lines_added}`);
|
|
316
|
+
if (total_lines_removed)
|
|
317
|
+
line_bits.push(`-${total_lines_removed}`);
|
|
318
|
+
const summary_line = [status_bits.join(', '), line_bits.join(' ') || '']
|
|
319
|
+
.filter(Boolean)
|
|
320
|
+
.join(' — ');
|
|
321
|
+
parts.push(summary_line);
|
|
322
|
+
parts.push('');
|
|
323
|
+
// Markdown summary table
|
|
324
|
+
parts.push('| Cluster | Status | Resources | Lines |');
|
|
325
|
+
parts.push('|---------|--------|-----------|-------|');
|
|
326
|
+
for (const entry of entries) {
|
|
327
|
+
parts.push(`| **${entry.cluster}** | ${markdown_status_emoji(entry)} ${markdown_status_label(entry)} | ${markdown_resources_cell(entry)} | ${markdown_lines_cell(entry)} |`);
|
|
328
|
+
}
|
|
329
|
+
parts.push('');
|
|
330
|
+
// Per-cluster detail blocks
|
|
331
|
+
for (const entry of entries) {
|
|
332
|
+
if (entry.error) {
|
|
333
|
+
parts.push(`<details>\n<summary>${markdown_status_emoji(entry)} <b>${entry.cluster}</b> — error</summary>\n`);
|
|
334
|
+
parts.push('```');
|
|
335
|
+
parts.push(entry.error);
|
|
336
|
+
parts.push('```');
|
|
337
|
+
parts.push('</details>');
|
|
338
|
+
parts.push('');
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
if (entry.skipped) {
|
|
342
|
+
parts.push(`<details>\n<summary>${markdown_status_emoji(entry)} <b>${entry.cluster}</b> — ${entry.skipped}</summary>\n</details>`);
|
|
343
|
+
parts.push('');
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (!has_changes(entry.stats)) {
|
|
347
|
+
// Keep no-change clusters off the detail list to reduce noise; they
|
|
348
|
+
// already appear in the summary table.
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
const sections = entry.sections ?? [];
|
|
352
|
+
const resources_hint = markdown_resources_cell(entry);
|
|
353
|
+
const lines_hint = markdown_lines_cell(entry);
|
|
354
|
+
parts.push(`<details open>\n<summary>${markdown_status_emoji(entry)} <b>${entry.cluster}</b> — ${resources_hint} resources, ${lines_hint} lines</summary>\n`);
|
|
355
|
+
if (sections.length === 0) {
|
|
356
|
+
parts.push('_No detailed diff output captured._');
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
for (const section of sections) {
|
|
360
|
+
if (!section.output.trim())
|
|
361
|
+
continue;
|
|
362
|
+
parts.push(`**${section.title}**`);
|
|
363
|
+
parts.push('');
|
|
364
|
+
parts.push(fence_diff(section.output));
|
|
365
|
+
parts.push('');
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
parts.push('</details>');
|
|
369
|
+
parts.push('');
|
|
370
|
+
}
|
|
371
|
+
parts.push('---');
|
|
372
|
+
parts.push('<sub>Generated by <a href="https://github.com/lucasilverentand/kustodian">Kustodian</a></sub>');
|
|
373
|
+
let result = parts.join('\n');
|
|
374
|
+
if (result.length > max_length) {
|
|
375
|
+
result = result.slice(0, max_length);
|
|
376
|
+
// Balance any dangling code fences or <details> tags
|
|
377
|
+
const open_code = (result.match(/```/g) ?? []).length;
|
|
378
|
+
if (open_code % 2 !== 0)
|
|
379
|
+
result += '\n```';
|
|
380
|
+
const open_details = (result.match(/<details(?:\s[^>]*)?>/g) ?? []).length;
|
|
381
|
+
const close_details = (result.match(/<\/details>/g) ?? []).length;
|
|
382
|
+
for (let i = 0; i < open_details - close_details; i++)
|
|
383
|
+
result += '\n</details>';
|
|
384
|
+
result += '\n\n_Comment truncated — see the workflow logs for the full diff._';
|
|
385
|
+
}
|
|
386
|
+
return result;
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=diff-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-stats.js","sourceRoot":"","sources":["../../../src/cli/utils/diff-stats.ts"],"names":[],"mappings":"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"}
|