@mitre/hdf-diff 2.0.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/LICENSE.md +55 -0
- package/README.md +87 -0
- package/dist/diff.d.ts +49 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +791 -0
- package/dist/diff.js.map +1 -0
- package/dist/exit-codes.d.ts +42 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +74 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/matching/cci-match.d.ts +14 -0
- package/dist/matching/cci-match.d.ts.map +1 -0
- package/dist/matching/cci-match.js +102 -0
- package/dist/matching/cci-match.js.map +1 -0
- package/dist/matching/exact-id.d.ts +9 -0
- package/dist/matching/exact-id.d.ts.map +1 -0
- package/dist/matching/exact-id.js +88 -0
- package/dist/matching/exact-id.js.map +1 -0
- package/dist/matching/fuzzy-match.d.ts +26 -0
- package/dist/matching/fuzzy-match.d.ts.map +1 -0
- package/dist/matching/fuzzy-match.js +145 -0
- package/dist/matching/fuzzy-match.js.map +1 -0
- package/dist/matching/index.d.ts +36 -0
- package/dist/matching/index.d.ts.map +1 -0
- package/dist/matching/index.js +71 -0
- package/dist/matching/index.js.map +1 -0
- package/dist/matching/mapped-id.d.ts +13 -0
- package/dist/matching/mapped-id.d.ts.map +1 -0
- package/dist/matching/mapped-id.js +101 -0
- package/dist/matching/mapped-id.js.map +1 -0
- package/dist/matching/types.d.ts +34 -0
- package/dist/matching/types.d.ts.map +1 -0
- package/dist/matching/types.js +2 -0
- package/dist/matching/types.js.map +1 -0
- package/dist/normalize.d.ts +20 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +120 -0
- package/dist/normalize.js.map +1 -0
- package/dist/renderers/csv.d.ts +15 -0
- package/dist/renderers/csv.d.ts.map +1 -0
- package/dist/renderers/csv.js +77 -0
- package/dist/renderers/csv.js.map +1 -0
- package/dist/renderers/filter.d.ts +11 -0
- package/dist/renderers/filter.d.ts.map +1 -0
- package/dist/renderers/filter.js +29 -0
- package/dist/renderers/filter.js.map +1 -0
- package/dist/renderers/index.d.ts +17 -0
- package/dist/renderers/index.d.ts.map +1 -0
- package/dist/renderers/index.js +29 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/json.d.ts +13 -0
- package/dist/renderers/json.d.ts.map +1 -0
- package/dist/renderers/json.js +41 -0
- package/dist/renderers/json.js.map +1 -0
- package/dist/renderers/markdown.d.ts +13 -0
- package/dist/renderers/markdown.d.ts.map +1 -0
- package/dist/renderers/markdown.js +133 -0
- package/dist/renderers/markdown.js.map +1 -0
- package/dist/renderers/terminal.d.ts +14 -0
- package/dist/renderers/terminal.d.ts.map +1 -0
- package/dist/renderers/terminal.js +173 -0
- package/dist/renderers/terminal.js.map +1 -0
- package/dist/renderers/types.d.ts +12 -0
- package/dist/renderers/types.d.ts.map +1 -0
- package/dist/renderers/types.js +2 -0
- package/dist/renderers/types.js.map +1 -0
- package/dist/sbom.d.ts +42 -0
- package/dist/sbom.d.ts.map +1 -0
- package/dist/sbom.js +203 -0
- package/dist/sbom.js.map +1 -0
- package/dist/status.d.ts +27 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +137 -0
- package/dist/status.js.map +1 -0
- package/dist/summary.d.ts +6 -0
- package/dist/summary.d.ts.map +1 -0
- package/dist/summary.js +47 -0
- package/dist/summary.js.map +1 -0
- package/dist/types.d.ts +208 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +20 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +108 -0
- package/dist/validate.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { filterRequirements } from './filter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Escape a value for CSV output.
|
|
4
|
+
*
|
|
5
|
+
* Per RFC 4180:
|
|
6
|
+
* - Fields containing commas, double quotes, or newlines are enclosed in double quotes.
|
|
7
|
+
* - Double quotes within a field are escaped by doubling them.
|
|
8
|
+
*/
|
|
9
|
+
function escapeCsvField(value) {
|
|
10
|
+
if (value.includes(',') || value.includes('"') || value.includes('\n') || value.includes('\r')) {
|
|
11
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Format field changes as a human-readable string.
|
|
17
|
+
*/
|
|
18
|
+
function formatFieldChanges(req) {
|
|
19
|
+
if (req.fieldChanges.length === 0)
|
|
20
|
+
return '';
|
|
21
|
+
return req.fieldChanges
|
|
22
|
+
.map((fc) => {
|
|
23
|
+
if (fc.op === 'add')
|
|
24
|
+
return `+${fc.path}: ${JSON.stringify(fc.newValue)}`;
|
|
25
|
+
if (fc.op === 'remove')
|
|
26
|
+
return `-${fc.path}: ${JSON.stringify(fc.oldValue)}`;
|
|
27
|
+
return `${fc.path}: ${JSON.stringify(fc.oldValue)} -> ${JSON.stringify(fc.newValue)}`;
|
|
28
|
+
})
|
|
29
|
+
.join('; ');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Render an HdfComparison as a CSV string.
|
|
33
|
+
*
|
|
34
|
+
* One row per requirement. Columns:
|
|
35
|
+
* - ID, Title, State, Old Status, New Status, Impact (Old), Impact (New), Change Reasons
|
|
36
|
+
*
|
|
37
|
+
* When `detail: 'full'`, an additional Field Changes column is included.
|
|
38
|
+
*
|
|
39
|
+
* Header row is always included. Standard CSV escaping (RFC 4180).
|
|
40
|
+
* Default detail level: `'control'`.
|
|
41
|
+
*/
|
|
42
|
+
export function renderCsv(comparison, options) {
|
|
43
|
+
const detail = options?.detail ?? 'control';
|
|
44
|
+
const filtered = filterRequirements(comparison.requirementDiffs, options);
|
|
45
|
+
const headers = [
|
|
46
|
+
'ID',
|
|
47
|
+
'Title',
|
|
48
|
+
'State',
|
|
49
|
+
'Old Status',
|
|
50
|
+
'New Status',
|
|
51
|
+
'Impact (Old)',
|
|
52
|
+
'Impact (New)',
|
|
53
|
+
'Change Reasons',
|
|
54
|
+
];
|
|
55
|
+
if (detail === 'full') {
|
|
56
|
+
headers.push('Field Changes');
|
|
57
|
+
}
|
|
58
|
+
const lines = [headers.join(',')];
|
|
59
|
+
for (const req of filtered) {
|
|
60
|
+
const row = [
|
|
61
|
+
escapeCsvField(req.id),
|
|
62
|
+
escapeCsvField(req.title ?? ''),
|
|
63
|
+
escapeCsvField(req.state),
|
|
64
|
+
escapeCsvField(req.oldEffectiveStatus ?? ''),
|
|
65
|
+
escapeCsvField(req.newEffectiveStatus ?? ''),
|
|
66
|
+
escapeCsvField(req.oldImpact !== undefined ? String(req.oldImpact) : ''),
|
|
67
|
+
escapeCsvField(req.newImpact !== undefined ? String(req.newImpact) : ''),
|
|
68
|
+
escapeCsvField(req.changeReasons.join(', ')),
|
|
69
|
+
];
|
|
70
|
+
if (detail === 'full') {
|
|
71
|
+
row.push(escapeCsvField(formatFieldChanges(req)));
|
|
72
|
+
}
|
|
73
|
+
lines.push(row.join(','));
|
|
74
|
+
}
|
|
75
|
+
return lines.join('\n');
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=csv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/renderers/csv.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/F,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,GAAoB;IAC9C,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,OAAO,GAAG,CAAC,YAAY;SACpB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACV,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK;YAAE,OAAO,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1E,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ;YAAE,OAAO,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7E,OAAO,GAAG,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxF,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CACvB,UAAyB,EACzB,OAAuB;IAEvB,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,SAAS,CAAC;IAC5C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,UAAU,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAE1E,MAAM,OAAO,GAAG;QACd,IAAI;QACJ,OAAO;QACP,OAAO;QACP,YAAY;QACZ,YAAY;QACZ,cAAc;QACd,cAAc;QACd,gBAAgB;KACjB,CAAC;IAEF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE5C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG;YACV,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,cAAc,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/B,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,cAAc,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;YAC5C,cAAc,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;YAC5C,cAAc,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,cAAc,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7C,CAAC;QAEF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RequirementDiff } from '../types.js';
|
|
2
|
+
import type { RenderOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Filter requirement diffs based on render options.
|
|
5
|
+
*
|
|
6
|
+
* Supports filtering by:
|
|
7
|
+
* - `filterStates`: Only include requirements matching the given states
|
|
8
|
+
* - `filterSeverity`: Only include requirements matching the given severity tag
|
|
9
|
+
*/
|
|
10
|
+
export declare function filterRequirements(diffs: RequirementDiff[], options?: RenderOptions): RequirementDiff[];
|
|
11
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/renderers/filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EAAE,EACxB,OAAO,CAAC,EAAE,aAAa,GACtB,eAAe,EAAE,CAyBnB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter requirement diffs based on render options.
|
|
3
|
+
*
|
|
4
|
+
* Supports filtering by:
|
|
5
|
+
* - `filterStates`: Only include requirements matching the given states
|
|
6
|
+
* - `filterSeverity`: Only include requirements matching the given severity tag
|
|
7
|
+
*/
|
|
8
|
+
export function filterRequirements(diffs, options) {
|
|
9
|
+
let filtered = diffs;
|
|
10
|
+
if (options?.filterStates && options.filterStates.length > 0) {
|
|
11
|
+
const states = new Set(options.filterStates);
|
|
12
|
+
filtered = filtered.filter((r) => states.has(r.state));
|
|
13
|
+
}
|
|
14
|
+
if (options?.filterSeverity) {
|
|
15
|
+
const severity = options.filterSeverity.toLowerCase();
|
|
16
|
+
filtered = filtered.filter((r) => {
|
|
17
|
+
const before = r.before;
|
|
18
|
+
const after = r.after;
|
|
19
|
+
const tags = after?.['tags'] ??
|
|
20
|
+
before?.['tags'];
|
|
21
|
+
if (!tags)
|
|
22
|
+
return false;
|
|
23
|
+
return (typeof tags['severity'] === 'string' &&
|
|
24
|
+
tags['severity'].toLowerCase() === severity);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return filtered;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/renderers/filter.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAwB,EACxB,OAAuB;IAEvB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,IAAI,OAAO,EAAE,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC7C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,OAAO,EAAE,cAAc,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;QACtD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAwC,CAAC;YAC1D,MAAM,KAAK,GAAG,CAAC,CAAC,KAAuC,CAAC;YACxD,MAAM,IAAI,GACP,KAAK,EAAE,CAAC,MAAM,CAAyC;gBACvD,MAAM,EAAE,CAAC,MAAM,CAAyC,CAAC;YAC5D,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACxB,OAAO,CACL,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ;gBACpC,IAAI,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ,CAC5C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { renderJson } from './json.js';
|
|
2
|
+
export { renderMarkdown } from './markdown.js';
|
|
3
|
+
export { renderTerminal } from './terminal.js';
|
|
4
|
+
export { renderCsv } from './csv.js';
|
|
5
|
+
export type { DetailLevel, RenderOptions } from './types.js';
|
|
6
|
+
import type { HdfComparison } from '../types.js';
|
|
7
|
+
import type { RenderOptions } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Convenience function to render a comparison in any supported format.
|
|
10
|
+
*
|
|
11
|
+
* @param comparison - The HdfComparison document to render
|
|
12
|
+
* @param format - Output format: 'json', 'markdown', 'terminal', or 'csv'
|
|
13
|
+
* @param options - Rendering options (detail level, filters, color)
|
|
14
|
+
* @returns The rendered string
|
|
15
|
+
*/
|
|
16
|
+
export declare function render(comparison: HdfComparison, format: 'json' | 'markdown' | 'terminal' | 'csv', options?: RenderOptions): string;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMhD;;;;;;;GAOG;AACH,wBAAgB,MAAM,CACpB,UAAU,EAAE,aAAa,EACzB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,EAChD,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAWR"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export { renderJson } from './json.js';
|
|
2
|
+
export { renderMarkdown } from './markdown.js';
|
|
3
|
+
export { renderTerminal } from './terminal.js';
|
|
4
|
+
export { renderCsv } from './csv.js';
|
|
5
|
+
import { renderJson } from './json.js';
|
|
6
|
+
import { renderMarkdown } from './markdown.js';
|
|
7
|
+
import { renderTerminal } from './terminal.js';
|
|
8
|
+
import { renderCsv } from './csv.js';
|
|
9
|
+
/**
|
|
10
|
+
* Convenience function to render a comparison in any supported format.
|
|
11
|
+
*
|
|
12
|
+
* @param comparison - The HdfComparison document to render
|
|
13
|
+
* @param format - Output format: 'json', 'markdown', 'terminal', or 'csv'
|
|
14
|
+
* @param options - Rendering options (detail level, filters, color)
|
|
15
|
+
* @returns The rendered string
|
|
16
|
+
*/
|
|
17
|
+
export function render(comparison, format, options) {
|
|
18
|
+
switch (format) {
|
|
19
|
+
case 'json':
|
|
20
|
+
return renderJson(comparison, options);
|
|
21
|
+
case 'markdown':
|
|
22
|
+
return renderMarkdown(comparison, options);
|
|
23
|
+
case 'terminal':
|
|
24
|
+
return renderTerminal(comparison, options);
|
|
25
|
+
case 'csv':
|
|
26
|
+
return renderCsv(comparison, options);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAKrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CACpB,UAAyB,EACzB,MAAgD,EAChD,OAAuB;IAEvB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACzC,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC7C,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC7C,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HdfComparison } from '../types.js';
|
|
2
|
+
import type { RenderOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Render an HdfComparison as a JSON string.
|
|
5
|
+
*
|
|
6
|
+
* - `detail: 'summary'` -- only `{ formatVersion, comparisonMode, summary }`
|
|
7
|
+
* - `detail: 'control'` -- full document but `before`/`after` stripped from requirementDiffs
|
|
8
|
+
* - `detail: 'full'` -- `JSON.stringify(comparison, null, 2)` (the complete document)
|
|
9
|
+
*
|
|
10
|
+
* Default detail level: `'control'`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function renderJson(comparison: HdfComparison, options?: RenderOptions): string;
|
|
13
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/renderers/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAehD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,UAAU,EAAE,aAAa,EACzB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CA0CR"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { filterRequirements } from './filter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Strip `before` and `after` from a RequirementDiff, keeping only
|
|
4
|
+
* the summary fields (id, state, title, statuses, changeReasons, fieldChanges).
|
|
5
|
+
*/
|
|
6
|
+
function stripSnapshots(req) {
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8
|
+
const { before, after, ...rest } = req;
|
|
9
|
+
return rest;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Render an HdfComparison as a JSON string.
|
|
13
|
+
*
|
|
14
|
+
* - `detail: 'summary'` -- only `{ formatVersion, comparisonMode, summary }`
|
|
15
|
+
* - `detail: 'control'` -- full document but `before`/`after` stripped from requirementDiffs
|
|
16
|
+
* - `detail: 'full'` -- `JSON.stringify(comparison, null, 2)` (the complete document)
|
|
17
|
+
*
|
|
18
|
+
* Default detail level: `'control'`.
|
|
19
|
+
*/
|
|
20
|
+
export function renderJson(comparison, options) {
|
|
21
|
+
const detail = options?.detail ?? 'control';
|
|
22
|
+
if (detail === 'summary') {
|
|
23
|
+
return JSON.stringify({
|
|
24
|
+
formatVersion: comparison.formatVersion,
|
|
25
|
+
comparisonMode: comparison.comparisonMode,
|
|
26
|
+
summary: comparison.summary,
|
|
27
|
+
}, null, 2);
|
|
28
|
+
}
|
|
29
|
+
if (detail === 'full') {
|
|
30
|
+
const filtered = filterRequirements(comparison.requirementDiffs, options);
|
|
31
|
+
if (filtered.length !== comparison.requirementDiffs.length) {
|
|
32
|
+
return JSON.stringify({ ...comparison, requirementDiffs: filtered }, null, 2);
|
|
33
|
+
}
|
|
34
|
+
return JSON.stringify(comparison, null, 2);
|
|
35
|
+
}
|
|
36
|
+
// detail === 'control' (default)
|
|
37
|
+
const filtered = filterRequirements(comparison.requirementDiffs, options);
|
|
38
|
+
const strippedDiffs = filtered.map(stripSnapshots);
|
|
39
|
+
return JSON.stringify({ ...comparison, requirementDiffs: strippedDiffs }, null, 2);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/renderers/json.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;GAGG;AACH,SAAS,cAAc,CACrB,GAAoB;IAEpB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CACxB,UAAyB,EACzB,OAAuB;IAEvB,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,SAAS,CAAC;IAE5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,cAAc,EAAE,UAAU,CAAC,cAAc;YACzC,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,kBAAkB,CACjC,UAAU,CAAC,gBAAgB,EAC3B,OAAO,CACR,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC,SAAS,CACnB,EAAE,GAAG,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAC7C,IAAI,EACJ,CAAC,CACF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,iCAAiC;IACjC,MAAM,QAAQ,GAAG,kBAAkB,CACjC,UAAU,CAAC,gBAAgB,EAC3B,OAAO,CACR,CAAC;IACF,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEnD,OAAO,IAAI,CAAC,SAAS,CACnB,EAAE,GAAG,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,EAClD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HdfComparison } from '../types.js';
|
|
2
|
+
import type { RenderOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Render an HdfComparison as a Markdown string.
|
|
5
|
+
*
|
|
6
|
+
* - `detail: 'summary'` -- summary table only
|
|
7
|
+
* - `detail: 'control'` -- summary + per-requirement tables by state
|
|
8
|
+
* - `detail: 'full'` -- summary + per-requirement tables with changeReasons and fieldChanges
|
|
9
|
+
*
|
|
10
|
+
* Default detail level: `'control'`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function renderMarkdown(comparison: HdfComparison, options?: RenderOptions): string;
|
|
13
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/renderers/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAoHhD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,aAAa,EACzB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAqCR"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { filterRequirements } from './filter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Render the summary table in markdown format.
|
|
4
|
+
*/
|
|
5
|
+
function renderSummaryTable(comparison) {
|
|
6
|
+
const { summary } = comparison;
|
|
7
|
+
const lines = [
|
|
8
|
+
'## HDF Comparison Summary',
|
|
9
|
+
'',
|
|
10
|
+
'| Metric | Count |',
|
|
11
|
+
'|--------|-------|',
|
|
12
|
+
`| Fixed | ${summary.fixed} |`,
|
|
13
|
+
`| Regressed | ${summary.regressed} |`,
|
|
14
|
+
`| New | ${summary.new} |`,
|
|
15
|
+
`| Absent | ${summary.absent} |`,
|
|
16
|
+
`| Unchanged | ${summary.unchanged} |`,
|
|
17
|
+
`| Updated | ${summary.updated} |`,
|
|
18
|
+
`| **Total** | **${summary.total}** |`,
|
|
19
|
+
];
|
|
20
|
+
return lines.join('\n');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Group requirement diffs by state.
|
|
24
|
+
*/
|
|
25
|
+
function groupByState(diffs) {
|
|
26
|
+
const groups = new Map();
|
|
27
|
+
for (const diff of diffs) {
|
|
28
|
+
const existing = groups.get(diff.state);
|
|
29
|
+
if (existing) {
|
|
30
|
+
existing.push(diff);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
groups.set(diff.state, [diff]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return groups;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Escape a value for use in a markdown table cell.
|
|
40
|
+
* Replaces pipe characters with their HTML entity.
|
|
41
|
+
*/
|
|
42
|
+
function escapeCell(value) {
|
|
43
|
+
return value.replace(/\|/g, '|');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Format field changes for a markdown cell.
|
|
47
|
+
*/
|
|
48
|
+
function formatFieldChanges(req) {
|
|
49
|
+
if (req.fieldChanges.length === 0)
|
|
50
|
+
return '';
|
|
51
|
+
return req.fieldChanges
|
|
52
|
+
.map((fc) => {
|
|
53
|
+
if (fc.op === 'add')
|
|
54
|
+
return `+${fc.path}: ${JSON.stringify(fc.newValue)}`;
|
|
55
|
+
if (fc.op === 'remove')
|
|
56
|
+
return `-${fc.path}: ${JSON.stringify(fc.oldValue)}`;
|
|
57
|
+
return `${fc.path}: ${JSON.stringify(fc.oldValue)} -> ${JSON.stringify(fc.newValue)}`;
|
|
58
|
+
})
|
|
59
|
+
.join('; ');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Render a section for a single state group.
|
|
63
|
+
*/
|
|
64
|
+
function renderStateSection(state, diffs, detail) {
|
|
65
|
+
const label = state.charAt(0).toUpperCase() + state.slice(1);
|
|
66
|
+
const lines = [`### ${label} (${diffs.length})`];
|
|
67
|
+
if (diffs.length === 0) {
|
|
68
|
+
lines.push('', '(none)');
|
|
69
|
+
return lines.join('\n');
|
|
70
|
+
}
|
|
71
|
+
lines.push('');
|
|
72
|
+
if (detail === 'full') {
|
|
73
|
+
lines.push('| ID | Title | Old Status | New Status | Change Reasons | Field Changes |', '|----|-------|------------|------------|----------------|---------------|');
|
|
74
|
+
for (const req of diffs) {
|
|
75
|
+
const id = escapeCell(req.id);
|
|
76
|
+
const title = escapeCell(req.title ?? '');
|
|
77
|
+
const oldStatus = escapeCell(req.oldEffectiveStatus ?? '');
|
|
78
|
+
const newStatus = escapeCell(req.newEffectiveStatus ?? '');
|
|
79
|
+
const reasons = escapeCell(req.changeReasons.join(', '));
|
|
80
|
+
const fieldChanges = escapeCell(formatFieldChanges(req));
|
|
81
|
+
lines.push(`| ${id} | ${title} | ${oldStatus} | ${newStatus} | ${reasons} | ${fieldChanges} |`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
lines.push('| ID | Title | Old Status | New Status |', '|----|-------|------------|------------|');
|
|
86
|
+
for (const req of diffs) {
|
|
87
|
+
const id = escapeCell(req.id);
|
|
88
|
+
const title = escapeCell(req.title ?? '');
|
|
89
|
+
const oldStatus = escapeCell(req.oldEffectiveStatus ?? '');
|
|
90
|
+
const newStatus = escapeCell(req.newEffectiveStatus ?? '');
|
|
91
|
+
lines.push(`| ${id} | ${title} | ${oldStatus} | ${newStatus} |`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return lines.join('\n');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Render an HdfComparison as a Markdown string.
|
|
98
|
+
*
|
|
99
|
+
* - `detail: 'summary'` -- summary table only
|
|
100
|
+
* - `detail: 'control'` -- summary + per-requirement tables by state
|
|
101
|
+
* - `detail: 'full'` -- summary + per-requirement tables with changeReasons and fieldChanges
|
|
102
|
+
*
|
|
103
|
+
* Default detail level: `'control'`.
|
|
104
|
+
*/
|
|
105
|
+
export function renderMarkdown(comparison, options) {
|
|
106
|
+
const detail = options?.detail ?? 'control';
|
|
107
|
+
const parts = [renderSummaryTable(comparison)];
|
|
108
|
+
if (detail === 'summary') {
|
|
109
|
+
return parts.join('\n');
|
|
110
|
+
}
|
|
111
|
+
// Determine which states to display
|
|
112
|
+
const stateOrder = [
|
|
113
|
+
'fixed',
|
|
114
|
+
'regressed',
|
|
115
|
+
'new',
|
|
116
|
+
'absent',
|
|
117
|
+
'updated',
|
|
118
|
+
'unchanged',
|
|
119
|
+
];
|
|
120
|
+
const filtered = filterRequirements(comparison.requirementDiffs, options);
|
|
121
|
+
const grouped = groupByState(filtered);
|
|
122
|
+
// If filtering by states, only show those specific states
|
|
123
|
+
const statesToShow = options?.filterStates && options.filterStates.length > 0
|
|
124
|
+
? stateOrder.filter((s) => options.filterStates.includes(s))
|
|
125
|
+
: stateOrder;
|
|
126
|
+
for (const state of statesToShow) {
|
|
127
|
+
parts.push('');
|
|
128
|
+
const diffs = grouped.get(state) ?? [];
|
|
129
|
+
parts.push(renderStateSection(state, diffs, detail));
|
|
130
|
+
}
|
|
131
|
+
return parts.join('\n');
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/renderers/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { HdfComparison } from '../types.js';
|
|
2
|
+
import type { RenderOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Render an HdfComparison for terminal display with optional ANSI colors.
|
|
5
|
+
*
|
|
6
|
+
* - `detail: 'summary'` -- just the summary line
|
|
7
|
+
* - `detail: 'control'` -- requirement list + summary (excludes unchanged)
|
|
8
|
+
* - `detail: 'full'` -- all requirements including unchanged, with changeReasons and fieldChanges
|
|
9
|
+
*
|
|
10
|
+
* When `color: false`, no ANSI escape codes are emitted.
|
|
11
|
+
* Default detail level: `'control'`. Default color: `true`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function renderTerminal(comparison: HdfComparison, options?: RenderOptions): string;
|
|
14
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/renderers/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAwKhD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,aAAa,EACzB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CA8BR"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { filterRequirements } from './filter.js';
|
|
2
|
+
// ANSI color codes
|
|
3
|
+
const RESET = '\x1b[0m';
|
|
4
|
+
const GREEN = '\x1b[32m';
|
|
5
|
+
const RED = '\x1b[31m';
|
|
6
|
+
const YELLOW = '\x1b[33m';
|
|
7
|
+
const BOLD = '\x1b[1m';
|
|
8
|
+
const DIM = '\x1b[2m';
|
|
9
|
+
/**
|
|
10
|
+
* Get the symbol and color for a requirement state.
|
|
11
|
+
*/
|
|
12
|
+
function getSymbolAndColor(state, useColor) {
|
|
13
|
+
const identity = (s) => s;
|
|
14
|
+
switch (state) {
|
|
15
|
+
case 'fixed':
|
|
16
|
+
case 'new':
|
|
17
|
+
return {
|
|
18
|
+
symbol: '+',
|
|
19
|
+
colorFn: useColor ? (s) => `${GREEN}${s}${RESET}` : identity,
|
|
20
|
+
};
|
|
21
|
+
case 'regressed':
|
|
22
|
+
case 'absent':
|
|
23
|
+
return {
|
|
24
|
+
symbol: '-',
|
|
25
|
+
colorFn: useColor ? (s) => `${RED}${s}${RESET}` : identity,
|
|
26
|
+
};
|
|
27
|
+
case 'updated':
|
|
28
|
+
return {
|
|
29
|
+
symbol: '~',
|
|
30
|
+
colorFn: useColor ? (s) => `${YELLOW}${s}${RESET}` : identity,
|
|
31
|
+
};
|
|
32
|
+
case 'unchanged':
|
|
33
|
+
default:
|
|
34
|
+
return {
|
|
35
|
+
symbol: ' ',
|
|
36
|
+
colorFn: useColor ? (s) => `${DIM}${s}${RESET}` : identity,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Format the status transition for a requirement.
|
|
42
|
+
*/
|
|
43
|
+
function formatStatusTransition(req) {
|
|
44
|
+
if (req.state === 'new') {
|
|
45
|
+
return '(new)';
|
|
46
|
+
}
|
|
47
|
+
if (req.state === 'absent') {
|
|
48
|
+
return '(absent)';
|
|
49
|
+
}
|
|
50
|
+
const parts = [];
|
|
51
|
+
// Show status change if both exist
|
|
52
|
+
if (req.oldEffectiveStatus && req.newEffectiveStatus) {
|
|
53
|
+
parts.push(`${req.oldEffectiveStatus} → ${req.newEffectiveStatus}`);
|
|
54
|
+
}
|
|
55
|
+
// Add state label for non-obvious transitions
|
|
56
|
+
if (req.state !== 'unchanged') {
|
|
57
|
+
parts.push(`(${req.state})`);
|
|
58
|
+
}
|
|
59
|
+
return parts.join(' ');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Format field changes for full detail.
|
|
63
|
+
*/
|
|
64
|
+
function formatFieldChangesForTerminal(req) {
|
|
65
|
+
if (req.fieldChanges.length === 0)
|
|
66
|
+
return '';
|
|
67
|
+
const parts = req.fieldChanges.map((fc) => {
|
|
68
|
+
if (fc.op === 'add')
|
|
69
|
+
return `+${fc.path}: ${JSON.stringify(fc.newValue)}`;
|
|
70
|
+
if (fc.op === 'remove')
|
|
71
|
+
return `-${fc.path}: ${JSON.stringify(fc.oldValue)}`;
|
|
72
|
+
return `${fc.path}: ${JSON.stringify(fc.oldValue)} → ${JSON.stringify(fc.newValue)}`;
|
|
73
|
+
});
|
|
74
|
+
return parts.join('; ');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Render a single requirement line.
|
|
78
|
+
*/
|
|
79
|
+
function renderRequirementLine(req, detail, useColor) {
|
|
80
|
+
const { symbol, colorFn } = getSymbolAndColor(req.state, useColor);
|
|
81
|
+
const title = req.title ?? '';
|
|
82
|
+
const transition = formatStatusTransition(req);
|
|
83
|
+
let line = ` ${symbol} ${req.id} ${title} ${transition}`;
|
|
84
|
+
if (detail === 'full') {
|
|
85
|
+
// Add change reasons
|
|
86
|
+
if (req.changeReasons.length > 0) {
|
|
87
|
+
line += ` [${req.changeReasons.join(', ')}]`;
|
|
88
|
+
}
|
|
89
|
+
// Add field changes
|
|
90
|
+
const fieldChanges = formatFieldChangesForTerminal(req);
|
|
91
|
+
if (fieldChanges) {
|
|
92
|
+
line += ` ${fieldChanges}`;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return colorFn(line);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Build the summary line.
|
|
99
|
+
*/
|
|
100
|
+
function buildSummaryLine(comparison, useColor) {
|
|
101
|
+
const { summary } = comparison;
|
|
102
|
+
const parts = [
|
|
103
|
+
`${summary.fixed} fixed`,
|
|
104
|
+
`${summary.regressed} regressed`,
|
|
105
|
+
`${summary.new} new`,
|
|
106
|
+
`${summary.absent} absent`,
|
|
107
|
+
`${summary.unchanged} unchanged`,
|
|
108
|
+
`${summary.updated} updated`,
|
|
109
|
+
`(${summary.total} total)`,
|
|
110
|
+
];
|
|
111
|
+
const line = `Summary: ${parts.join(', ')}`;
|
|
112
|
+
if (useColor) {
|
|
113
|
+
return `${BOLD}${line}${RESET}`;
|
|
114
|
+
}
|
|
115
|
+
return line;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Build the header line.
|
|
119
|
+
*/
|
|
120
|
+
function buildHeaderLine(comparison, useColor) {
|
|
121
|
+
const mode = comparison.comparisonMode;
|
|
122
|
+
const oldSource = comparison.sources.find((s) => s.role === 'old' || s.role === 'golden' || s.role === 'reference');
|
|
123
|
+
const newSource = comparison.sources.find((s) => s.role === 'new' || s.role === 'system');
|
|
124
|
+
let header = `HDF Comparison: ${mode}`;
|
|
125
|
+
const oldTimestamp = oldSource?.assessmentTimestamp;
|
|
126
|
+
const newTimestamp = newSource?.assessmentTimestamp;
|
|
127
|
+
if (oldTimestamp && newTimestamp) {
|
|
128
|
+
// Format as date-only if possible, otherwise use full timestamp
|
|
129
|
+
// split() always returns at least one element, so [0] is safe
|
|
130
|
+
const oldDate = oldTimestamp.split('T')[0];
|
|
131
|
+
const newDate = newTimestamp.split('T')[0];
|
|
132
|
+
header += ` (${oldDate} → ${newDate})`;
|
|
133
|
+
}
|
|
134
|
+
if (useColor) {
|
|
135
|
+
return `${BOLD}${header}${RESET}`;
|
|
136
|
+
}
|
|
137
|
+
return header;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Render an HdfComparison for terminal display with optional ANSI colors.
|
|
141
|
+
*
|
|
142
|
+
* - `detail: 'summary'` -- just the summary line
|
|
143
|
+
* - `detail: 'control'` -- requirement list + summary (excludes unchanged)
|
|
144
|
+
* - `detail: 'full'` -- all requirements including unchanged, with changeReasons and fieldChanges
|
|
145
|
+
*
|
|
146
|
+
* When `color: false`, no ANSI escape codes are emitted.
|
|
147
|
+
* Default detail level: `'control'`. Default color: `true`.
|
|
148
|
+
*/
|
|
149
|
+
export function renderTerminal(comparison, options) {
|
|
150
|
+
const detail = options?.detail ?? 'control';
|
|
151
|
+
const useColor = options?.color ?? true;
|
|
152
|
+
const lines = [];
|
|
153
|
+
// Header
|
|
154
|
+
lines.push(buildHeaderLine(comparison, useColor));
|
|
155
|
+
lines.push('');
|
|
156
|
+
if (detail === 'summary') {
|
|
157
|
+
lines.push(buildSummaryLine(comparison, useColor));
|
|
158
|
+
return lines.join('\n');
|
|
159
|
+
}
|
|
160
|
+
// Requirement lines
|
|
161
|
+
const filtered = filterRequirements(comparison.requirementDiffs, options);
|
|
162
|
+
for (const req of filtered) {
|
|
163
|
+
// In 'control' mode, skip unchanged requirements
|
|
164
|
+
if (detail === 'control' && req.state === 'unchanged') {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
lines.push(renderRequirementLine(req, detail, useColor));
|
|
168
|
+
}
|
|
169
|
+
lines.push('');
|
|
170
|
+
lines.push(buildSummaryLine(comparison, useColor));
|
|
171
|
+
return lines.join('\n');
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/renderers/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type DetailLevel = 'summary' | 'control' | 'full';
|
|
2
|
+
export interface RenderOptions {
|
|
3
|
+
/** What detail to show. Default: 'control' */
|
|
4
|
+
detail?: DetailLevel;
|
|
5
|
+
/** Only show requirements matching these states */
|
|
6
|
+
filterStates?: string[];
|
|
7
|
+
/** Only show requirements matching this severity */
|
|
8
|
+
filterSeverity?: string;
|
|
9
|
+
/** Use color codes (for terminal). Default: true */
|
|
10
|
+
color?: boolean;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/renderers/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/renderers/types.ts"],"names":[],"mappings":""}
|