@mitre/hdf-diff 3.0.0 → 3.1.0-rc.1

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 (91) hide show
  1. package/LICENSE.md +55 -0
  2. package/README.md +49 -17
  3. package/dist/index.d.ts +622 -16
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +2037 -18
  6. package/dist/index.js.map +1 -1
  7. package/package.json +19 -20
  8. package/dist/diff.d.ts +0 -49
  9. package/dist/diff.d.ts.map +0 -1
  10. package/dist/diff.js +0 -791
  11. package/dist/diff.js.map +0 -1
  12. package/dist/exit-codes.d.ts +0 -42
  13. package/dist/exit-codes.d.ts.map +0 -1
  14. package/dist/exit-codes.js +0 -74
  15. package/dist/exit-codes.js.map +0 -1
  16. package/dist/matching/cci-match.d.ts +0 -14
  17. package/dist/matching/cci-match.d.ts.map +0 -1
  18. package/dist/matching/cci-match.js +0 -102
  19. package/dist/matching/cci-match.js.map +0 -1
  20. package/dist/matching/exact-id.d.ts +0 -9
  21. package/dist/matching/exact-id.d.ts.map +0 -1
  22. package/dist/matching/exact-id.js +0 -88
  23. package/dist/matching/exact-id.js.map +0 -1
  24. package/dist/matching/fuzzy-match.d.ts +0 -26
  25. package/dist/matching/fuzzy-match.d.ts.map +0 -1
  26. package/dist/matching/fuzzy-match.js +0 -145
  27. package/dist/matching/fuzzy-match.js.map +0 -1
  28. package/dist/matching/index.d.ts +0 -36
  29. package/dist/matching/index.d.ts.map +0 -1
  30. package/dist/matching/index.js +0 -71
  31. package/dist/matching/index.js.map +0 -1
  32. package/dist/matching/mapped-id.d.ts +0 -13
  33. package/dist/matching/mapped-id.d.ts.map +0 -1
  34. package/dist/matching/mapped-id.js +0 -101
  35. package/dist/matching/mapped-id.js.map +0 -1
  36. package/dist/matching/types.d.ts +0 -34
  37. package/dist/matching/types.d.ts.map +0 -1
  38. package/dist/matching/types.js +0 -2
  39. package/dist/matching/types.js.map +0 -1
  40. package/dist/normalize.d.ts +0 -20
  41. package/dist/normalize.d.ts.map +0 -1
  42. package/dist/normalize.js +0 -120
  43. package/dist/normalize.js.map +0 -1
  44. package/dist/renderers/csv.d.ts +0 -15
  45. package/dist/renderers/csv.d.ts.map +0 -1
  46. package/dist/renderers/csv.js +0 -77
  47. package/dist/renderers/csv.js.map +0 -1
  48. package/dist/renderers/filter.d.ts +0 -11
  49. package/dist/renderers/filter.d.ts.map +0 -1
  50. package/dist/renderers/filter.js +0 -29
  51. package/dist/renderers/filter.js.map +0 -1
  52. package/dist/renderers/index.d.ts +0 -17
  53. package/dist/renderers/index.d.ts.map +0 -1
  54. package/dist/renderers/index.js +0 -29
  55. package/dist/renderers/index.js.map +0 -1
  56. package/dist/renderers/json.d.ts +0 -13
  57. package/dist/renderers/json.d.ts.map +0 -1
  58. package/dist/renderers/json.js +0 -41
  59. package/dist/renderers/json.js.map +0 -1
  60. package/dist/renderers/markdown.d.ts +0 -13
  61. package/dist/renderers/markdown.d.ts.map +0 -1
  62. package/dist/renderers/markdown.js +0 -133
  63. package/dist/renderers/markdown.js.map +0 -1
  64. package/dist/renderers/terminal.d.ts +0 -14
  65. package/dist/renderers/terminal.d.ts.map +0 -1
  66. package/dist/renderers/terminal.js +0 -173
  67. package/dist/renderers/terminal.js.map +0 -1
  68. package/dist/renderers/types.d.ts +0 -12
  69. package/dist/renderers/types.d.ts.map +0 -1
  70. package/dist/renderers/types.js +0 -2
  71. package/dist/renderers/types.js.map +0 -1
  72. package/dist/sbom.d.ts +0 -42
  73. package/dist/sbom.d.ts.map +0 -1
  74. package/dist/sbom.js +0 -203
  75. package/dist/sbom.js.map +0 -1
  76. package/dist/status.d.ts +0 -27
  77. package/dist/status.d.ts.map +0 -1
  78. package/dist/status.js +0 -137
  79. package/dist/status.js.map +0 -1
  80. package/dist/summary.d.ts +0 -6
  81. package/dist/summary.d.ts.map +0 -1
  82. package/dist/summary.js +0 -47
  83. package/dist/summary.js.map +0 -1
  84. package/dist/types.d.ts +0 -208
  85. package/dist/types.d.ts.map +0 -1
  86. package/dist/types.js +0 -2
  87. package/dist/types.js.map +0 -1
  88. package/dist/validate.d.ts +0 -20
  89. package/dist/validate.d.ts.map +0 -1
  90. package/dist/validate.js +0 -108
  91. package/dist/validate.js.map +0 -1
@@ -1,41 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,13 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,133 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/renderers/markdown.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,173 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/renderers/terminal.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/renderers/types.ts"],"names":[],"mappings":""}
package/dist/sbom.d.ts DELETED
@@ -1,42 +0,0 @@
1
- /**
2
- * SBOM comparison for the HDF diff engine.
3
- *
4
- * Compares two SBOM documents (CycloneDX or SPDX JSON) and produces
5
- * package-level diffs: added, removed, updated, unchanged packages.
6
- *
7
- * Format auto-detection:
8
- * - CycloneDX: has `bomFormat: "CycloneDX"`, packages in `components[]`
9
- * - SPDX: has `spdxVersion`, packages in `packages[]`
10
- */
11
- /**
12
- * The comparison result for a single package between two SBOMs.
13
- */
14
- export interface PackageDiff {
15
- purl: string;
16
- name: string;
17
- state: 'added' | 'removed' | 'updated' | 'unchanged';
18
- oldVersion?: string;
19
- newVersion?: string;
20
- licenses?: string[];
21
- }
22
- /**
23
- * The complete result of comparing two SBOM documents.
24
- */
25
- export interface SbomDiffResult {
26
- packageDiffs: PackageDiff[];
27
- added: number;
28
- removed: number;
29
- updated: number;
30
- unchanged: number;
31
- }
32
- /**
33
- * Compare two SBOM documents (CycloneDX or SPDX JSON strings) and return
34
- * package-level diffs.
35
- *
36
- * @param oldJson - JSON string of the old SBOM document
37
- * @param newJson - JSON string of the new SBOM document
38
- * @returns Structured diff result with per-package state and aggregate counts
39
- * @throws Error if either input is not valid JSON or not a recognized SBOM format
40
- */
41
- export declare function diffSboms(oldJson: string, newJson: string): SbomDiffResult;
42
- //# sourceMappingURL=sbom.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sbom.d.ts","sourceRoot":"","sources":["../src/sbom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAYD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CA2E1E"}