@mitre/hdf-diff 3.0.1 → 3.1.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 +49 -17
- package/dist/index.d.ts +622 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2037 -18
- package/dist/index.js.map +1 -1
- package/package.json +19 -19
- package/dist/diff.d.ts +0 -49
- package/dist/diff.d.ts.map +0 -1
- package/dist/diff.js +0 -791
- package/dist/diff.js.map +0 -1
- package/dist/exit-codes.d.ts +0 -42
- package/dist/exit-codes.d.ts.map +0 -1
- package/dist/exit-codes.js +0 -74
- package/dist/exit-codes.js.map +0 -1
- package/dist/matching/cci-match.d.ts +0 -14
- package/dist/matching/cci-match.d.ts.map +0 -1
- package/dist/matching/cci-match.js +0 -102
- package/dist/matching/cci-match.js.map +0 -1
- package/dist/matching/exact-id.d.ts +0 -9
- package/dist/matching/exact-id.d.ts.map +0 -1
- package/dist/matching/exact-id.js +0 -88
- package/dist/matching/exact-id.js.map +0 -1
- package/dist/matching/fuzzy-match.d.ts +0 -26
- package/dist/matching/fuzzy-match.d.ts.map +0 -1
- package/dist/matching/fuzzy-match.js +0 -145
- package/dist/matching/fuzzy-match.js.map +0 -1
- package/dist/matching/index.d.ts +0 -36
- package/dist/matching/index.d.ts.map +0 -1
- package/dist/matching/index.js +0 -71
- package/dist/matching/index.js.map +0 -1
- package/dist/matching/mapped-id.d.ts +0 -13
- package/dist/matching/mapped-id.d.ts.map +0 -1
- package/dist/matching/mapped-id.js +0 -101
- package/dist/matching/mapped-id.js.map +0 -1
- package/dist/matching/types.d.ts +0 -34
- package/dist/matching/types.d.ts.map +0 -1
- package/dist/matching/types.js +0 -2
- package/dist/matching/types.js.map +0 -1
- package/dist/normalize.d.ts +0 -20
- package/dist/normalize.d.ts.map +0 -1
- package/dist/normalize.js +0 -120
- package/dist/normalize.js.map +0 -1
- package/dist/renderers/csv.d.ts +0 -15
- package/dist/renderers/csv.d.ts.map +0 -1
- package/dist/renderers/csv.js +0 -77
- package/dist/renderers/csv.js.map +0 -1
- package/dist/renderers/filter.d.ts +0 -11
- package/dist/renderers/filter.d.ts.map +0 -1
- package/dist/renderers/filter.js +0 -29
- package/dist/renderers/filter.js.map +0 -1
- package/dist/renderers/index.d.ts +0 -17
- package/dist/renderers/index.d.ts.map +0 -1
- package/dist/renderers/index.js +0 -29
- package/dist/renderers/index.js.map +0 -1
- package/dist/renderers/json.d.ts +0 -13
- package/dist/renderers/json.d.ts.map +0 -1
- package/dist/renderers/json.js +0 -41
- package/dist/renderers/json.js.map +0 -1
- package/dist/renderers/markdown.d.ts +0 -13
- package/dist/renderers/markdown.d.ts.map +0 -1
- package/dist/renderers/markdown.js +0 -133
- package/dist/renderers/markdown.js.map +0 -1
- package/dist/renderers/terminal.d.ts +0 -14
- package/dist/renderers/terminal.d.ts.map +0 -1
- package/dist/renderers/terminal.js +0 -173
- package/dist/renderers/terminal.js.map +0 -1
- package/dist/renderers/types.d.ts +0 -12
- package/dist/renderers/types.d.ts.map +0 -1
- package/dist/renderers/types.js +0 -2
- package/dist/renderers/types.js.map +0 -1
- package/dist/sbom.d.ts +0 -42
- package/dist/sbom.d.ts.map +0 -1
- package/dist/sbom.js +0 -203
- package/dist/sbom.js.map +0 -1
- package/dist/status.d.ts +0 -27
- package/dist/status.d.ts.map +0 -1
- package/dist/status.js +0 -137
- package/dist/status.js.map +0 -1
- package/dist/summary.d.ts +0 -6
- package/dist/summary.d.ts.map +0 -1
- package/dist/summary.js +0 -47
- package/dist/summary.js.map +0 -1
- package/dist/types.d.ts +0 -208
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/validate.d.ts +0 -20
- package/dist/validate.d.ts.map +0 -1
- package/dist/validate.js +0 -19
- package/dist/validate.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,623 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
//#region src/sbom.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* SBOM comparison for the HDF diff engine.
|
|
4
|
+
*
|
|
5
|
+
* Compares two SBOM documents (CycloneDX or SPDX JSON) and produces
|
|
6
|
+
* package-level diffs: added, removed, updated, unchanged packages.
|
|
7
|
+
*
|
|
8
|
+
* Format auto-detection:
|
|
9
|
+
* - CycloneDX: has `bomFormat: "CycloneDX"`, packages in `components[]`
|
|
10
|
+
* - SPDX: has `spdxVersion`, packages in `packages[]`
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* The comparison result for a single package between two SBOMs.
|
|
14
|
+
*/
|
|
15
|
+
interface PackageDiff {
|
|
16
|
+
purl: string;
|
|
17
|
+
name: string;
|
|
18
|
+
state: 'added' | 'removed' | 'updated' | 'unchanged';
|
|
19
|
+
oldVersion?: string;
|
|
20
|
+
newVersion?: string;
|
|
21
|
+
licenses?: string[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The complete result of comparing two SBOM documents.
|
|
25
|
+
*/
|
|
26
|
+
interface SbomDiffResult {
|
|
27
|
+
packageDiffs: PackageDiff[];
|
|
28
|
+
added: number;
|
|
29
|
+
removed: number;
|
|
30
|
+
updated: number;
|
|
31
|
+
unchanged: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Compare two SBOM documents (CycloneDX or SPDX JSON strings) and return
|
|
35
|
+
* package-level diffs.
|
|
36
|
+
*
|
|
37
|
+
* @param oldJson - JSON string of the old SBOM document
|
|
38
|
+
* @param newJson - JSON string of the new SBOM document
|
|
39
|
+
* @returns Structured diff result with per-package state and aggregate counts
|
|
40
|
+
* @throws Error if either input is not valid JSON or not a recognized SBOM format
|
|
41
|
+
*/
|
|
42
|
+
declare function diffSboms(oldJson: string, newJson: string): SbomDiffResult;
|
|
43
|
+
//#endregion
|
|
44
|
+
//#region src/types.d.ts
|
|
45
|
+
/**
|
|
46
|
+
* Why a requirement's effective status changed between two evaluations.
|
|
47
|
+
*
|
|
48
|
+
* Aligned with the hdf-comparison schema's Change_Reason enum:
|
|
49
|
+
* - resultChanged: The underlying test results differ (e.g., a fix was deployed)
|
|
50
|
+
* - overrideAdded: A new statusOverride (waiver/attestation) was added
|
|
51
|
+
* - overrideExpired: A statusOverride present in the old scan has expired by the new scan's timestamp
|
|
52
|
+
* - overrideRemoved: A statusOverride was removed between scans
|
|
53
|
+
* - overrideModified: An existing statusOverride was modified (reserved for future use)
|
|
54
|
+
* - impactChanged: The impact score changed (e.g., from 0.7 to 0.0 means N/A)
|
|
55
|
+
* - baselineUpgraded: The baseline version changed (reserved for future use)
|
|
56
|
+
* - controlMapped: A control was mapped to a different framework (reserved for future use)
|
|
57
|
+
* - scannerChanged: A different scanner was used (reserved for future use)
|
|
58
|
+
* - targetChanged: The scan target changed (reserved for future use)
|
|
59
|
+
* - configChanged: The scan configuration changed (reserved for future use)
|
|
60
|
+
* - metadataChanged: Non-impact baseline metadata changed (tags, descriptions, title, etc.)
|
|
61
|
+
*/
|
|
62
|
+
type ChangeReason = 'resultChanged' | 'overrideAdded' | 'overrideExpired' | 'overrideRemoved' | 'overrideModified' | 'impactChanged' | 'baselineUpgraded' | 'controlMapped' | 'scannerChanged' | 'targetChanged' | 'configChanged' | 'metadataChanged' | 'dispositionChanged' | 'effectiveImpactChanged';
|
|
63
|
+
/**
|
|
64
|
+
* Classification of how a requirement's state changed between evaluations.
|
|
65
|
+
* Uses SARIF-inspired vocabulary.
|
|
66
|
+
*
|
|
67
|
+
* - new: Requirement exists only in the new evaluation (was "added")
|
|
68
|
+
* - absent: Requirement exists only in the old evaluation (was "removed")
|
|
69
|
+
* - unchanged: Same effective status in both evaluations
|
|
70
|
+
* - updated: Status changed but doesn't fit fixed/regressed (was "changed")
|
|
71
|
+
* - fixed: Was failing/error, now passing
|
|
72
|
+
* - regressed: Was passing, now failing/error
|
|
73
|
+
* - moved: Requirement ID changed but content is the same (future use)
|
|
74
|
+
* - split: One requirement became multiple (future use)
|
|
75
|
+
* - merged: Multiple requirements became one (future use)
|
|
76
|
+
*/
|
|
77
|
+
type RequirementState = 'new' | 'absent' | 'unchanged' | 'updated' | 'fixed' | 'regressed' | 'moved' | 'split' | 'merged';
|
|
78
|
+
/**
|
|
79
|
+
* A field-level difference on a requirement, following JSON Patch-like conventions.
|
|
80
|
+
*/
|
|
81
|
+
interface FieldChange {
|
|
82
|
+
/** The operation type: add, remove, or replace */
|
|
83
|
+
op: 'add' | 'remove' | 'replace';
|
|
84
|
+
/** Dot-notation path to the changed field (e.g., 'impact', 'tags.cci') */
|
|
85
|
+
path: string;
|
|
86
|
+
/** Value in the old evaluation (undefined for 'add' operations) */
|
|
87
|
+
oldValue?: unknown;
|
|
88
|
+
/** Value in the new evaluation (undefined for 'remove' operations) */
|
|
89
|
+
newValue?: unknown;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The diff for a single requirement across two evaluations.
|
|
93
|
+
*/
|
|
94
|
+
interface RequirementDiff {
|
|
95
|
+
/** The requirement ID (e.g., 'SV-238196') */
|
|
96
|
+
id: string;
|
|
97
|
+
/** Classification of the change */
|
|
98
|
+
state: RequirementState;
|
|
99
|
+
/** Why the status changed — empty array if unchanged */
|
|
100
|
+
changeReasons: ChangeReason[];
|
|
101
|
+
/** Full snapshot of the requirement from the old evaluation (null when state = 'new') */
|
|
102
|
+
before: Record<string, unknown> | null;
|
|
103
|
+
/** Full snapshot of the requirement from the new evaluation (null when state = 'absent') */
|
|
104
|
+
after: Record<string, unknown> | null;
|
|
105
|
+
/** The requirement title (from whichever evaluation has it) */
|
|
106
|
+
title?: string;
|
|
107
|
+
/** Effective status in the old evaluation (undefined if new) */
|
|
108
|
+
oldEffectiveStatus?: string;
|
|
109
|
+
/** Effective status in the new evaluation (undefined if absent) */
|
|
110
|
+
newEffectiveStatus?: string;
|
|
111
|
+
/** Impact in the old evaluation */
|
|
112
|
+
oldImpact?: number;
|
|
113
|
+
/** Impact in the new evaluation */
|
|
114
|
+
newImpact?: number;
|
|
115
|
+
/** Field-level diffs for non-status fields */
|
|
116
|
+
fieldChanges: FieldChange[];
|
|
117
|
+
/** The matching strategy that paired this requirement (e.g., 'exactId') */
|
|
118
|
+
matchStrategy?: string;
|
|
119
|
+
/** Confidence of the match (0.0-1.0) */
|
|
120
|
+
matchConfidence?: number;
|
|
121
|
+
/** Index into the sources array for fleet mode */
|
|
122
|
+
sourceIndex?: number;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Summary counts for the comparison.
|
|
126
|
+
*/
|
|
127
|
+
interface ComparisonSummary {
|
|
128
|
+
/** Requirements that went from failing/error to passing */
|
|
129
|
+
fixed: number;
|
|
130
|
+
/** Requirements that went from passing to failing/error */
|
|
131
|
+
regressed: number;
|
|
132
|
+
/** Requirements present only in the new evaluation (was "added") */
|
|
133
|
+
new: number;
|
|
134
|
+
/** Requirements present only in the old evaluation (was "removed") */
|
|
135
|
+
absent: number;
|
|
136
|
+
/** Requirements with the same effective status */
|
|
137
|
+
unchanged: number;
|
|
138
|
+
/** Requirements whose status changed in a way other than fixed/regressed (was "changed") */
|
|
139
|
+
updated: number;
|
|
140
|
+
/** Total unique requirements across both evaluations */
|
|
141
|
+
total: number;
|
|
142
|
+
/** Number of requirements matched between old and new */
|
|
143
|
+
matchedCount: number;
|
|
144
|
+
/** Number of requirements only in old (unmatched) */
|
|
145
|
+
unmatchedOldCount: number;
|
|
146
|
+
/** Number of requirements only in new (unmatched) */
|
|
147
|
+
unmatchedNewCount: number;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* The diff for a single component across two system documents.
|
|
151
|
+
* Used in systemDrift comparison mode.
|
|
152
|
+
*/
|
|
153
|
+
interface ComponentDiff {
|
|
154
|
+
/** Component name */
|
|
155
|
+
name: string;
|
|
156
|
+
/** Classification of the change: new, absent, unchanged, or updated */
|
|
157
|
+
state: 'new' | 'absent' | 'unchanged' | 'updated';
|
|
158
|
+
/** Component snapshot from the old system (null when state = 'new') */
|
|
159
|
+
before: Record<string, unknown> | null;
|
|
160
|
+
/** Component snapshot from the new system (null when state = 'absent') */
|
|
161
|
+
after: Record<string, unknown> | null;
|
|
162
|
+
/** Field-level diffs between old and new component */
|
|
163
|
+
fieldChanges: FieldChange[];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The diff for a single baseline across two evaluations.
|
|
167
|
+
*/
|
|
168
|
+
interface BaselineDiff {
|
|
169
|
+
/** Baseline name */
|
|
170
|
+
name: string;
|
|
171
|
+
/** Version in the old evaluation */
|
|
172
|
+
oldVersion?: string;
|
|
173
|
+
/** Version in the new evaluation */
|
|
174
|
+
newVersion?: string;
|
|
175
|
+
/** Whether this baseline was new, absent, updated, or unchanged */
|
|
176
|
+
state: 'new' | 'absent' | 'updated' | 'unchanged';
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Metadata about a source document used in the comparison.
|
|
180
|
+
*/
|
|
181
|
+
interface Source {
|
|
182
|
+
/** Role of the source in the comparison */
|
|
183
|
+
role: 'old' | 'new' | 'golden' | 'reference' | 'system';
|
|
184
|
+
/** Human-readable label */
|
|
185
|
+
label: string;
|
|
186
|
+
/** URI to the source document */
|
|
187
|
+
uri?: string;
|
|
188
|
+
/** Original format of the source (e.g., 'hdf-results-v2', 'inspec-exec-json-v1') */
|
|
189
|
+
originalFormat?: string;
|
|
190
|
+
/** Assessment timestamp from the source document */
|
|
191
|
+
assessmentTimestamp?: string;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* An annotation attached to a requirement diff.
|
|
195
|
+
*/
|
|
196
|
+
interface Annotation {
|
|
197
|
+
/** Human-readable label */
|
|
198
|
+
label: string;
|
|
199
|
+
/** Description of the annotation */
|
|
200
|
+
text: string;
|
|
201
|
+
/** When the annotation was created */
|
|
202
|
+
timestamp?: string;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* The top-level comparison result comparing two or more HDF evaluations.
|
|
206
|
+
*/
|
|
207
|
+
interface HdfComparison {
|
|
208
|
+
/** Schema version for the comparison format */
|
|
209
|
+
formatVersion: '1.0.0';
|
|
210
|
+
/** The mode of comparison */
|
|
211
|
+
comparisonMode: 'temporal' | 'baseline' | 'fleet' | 'multiSource' | 'baselineEvolution' | 'systemDrift';
|
|
212
|
+
/** When the comparison was generated */
|
|
213
|
+
timestamp?: string;
|
|
214
|
+
/** Source documents used in the comparison */
|
|
215
|
+
sources: Source[];
|
|
216
|
+
/** Matching configuration used */
|
|
217
|
+
matching?: MatchingConfig;
|
|
218
|
+
/** Aggregate counts */
|
|
219
|
+
summary: ComparisonSummary;
|
|
220
|
+
/** Per-baseline diffs */
|
|
221
|
+
baselineDiffs: BaselineDiff[];
|
|
222
|
+
/** Per-requirement diffs, sorted by id */
|
|
223
|
+
requirementDiffs: RequirementDiff[];
|
|
224
|
+
/** Per-component diffs (systemDrift mode only) */
|
|
225
|
+
componentDiffs?: ComponentDiff[];
|
|
226
|
+
/** Per-package diffs from embedded SBOM comparison (systemDrift mode only) */
|
|
227
|
+
packageDiffs?: PackageDiff[];
|
|
228
|
+
/** URI identifying the system being compared (systemDrift mode only) */
|
|
229
|
+
systemRef?: string;
|
|
230
|
+
/** Requirements that drifted from a golden baseline (future use) */
|
|
231
|
+
drift?: RequirementDiff[];
|
|
232
|
+
/** Annotations keyed by requirement ID */
|
|
233
|
+
annotations?: Record<string, Annotation>;
|
|
234
|
+
/** Extension data for custom integrations */
|
|
235
|
+
extensions?: Record<string, unknown>;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Configuration for how requirements are matched between evaluations.
|
|
239
|
+
*/
|
|
240
|
+
interface MatchingConfig {
|
|
241
|
+
/** The primary strategy used for matching requirements across sources */
|
|
242
|
+
primaryStrategy: string;
|
|
243
|
+
/** Minimum confidence threshold for a match */
|
|
244
|
+
confidenceThreshold?: number;
|
|
245
|
+
}
|
|
246
|
+
/** @deprecated Use RequirementState instead */
|
|
247
|
+
type DiffStatus = RequirementState;
|
|
248
|
+
/** @deprecated Use ComparisonSummary instead */
|
|
249
|
+
type DiffSummary = ComparisonSummary;
|
|
250
|
+
/** @deprecated Use HdfComparison instead */
|
|
251
|
+
type HdfDiff = HdfComparison;
|
|
252
|
+
//#endregion
|
|
253
|
+
//#region src/diff.d.ts
|
|
254
|
+
/**
|
|
255
|
+
* Options for configuring the diff behavior.
|
|
256
|
+
*/
|
|
257
|
+
interface DiffOptions {
|
|
258
|
+
/** Fields to track for field-level diffs (default: ['impact', 'severity', 'tags']) */
|
|
259
|
+
trackedFields?: string[];
|
|
260
|
+
/** Comparison mode (default: 'temporal') */
|
|
261
|
+
comparisonMode?: 'temporal' | 'baseline' | 'fleet' | 'multiSource' | 'baselineEvolution' | 'systemDrift';
|
|
262
|
+
/** Primary matching strategy name (default: 'exactId') */
|
|
263
|
+
matchStrategy?: string;
|
|
264
|
+
/** Fallback strategy names, applied in order to remaining unmatched requirements */
|
|
265
|
+
fallbackStrategies?: string[];
|
|
266
|
+
/** Mapping table for the 'mappedId' strategy (old ID -> new ID) */
|
|
267
|
+
mappingTable?: Record<string, string>;
|
|
268
|
+
/** Minimum confidence threshold for fuzzy matching (default: 0.6) */
|
|
269
|
+
minConfidence?: number;
|
|
270
|
+
/** Validate output against hdf-comparison schema. Default: false (performance). */
|
|
271
|
+
validateOutput?: boolean;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Compare two HDF results documents and produce a structured comparison.
|
|
275
|
+
*
|
|
276
|
+
* Requirements are matched using a configurable matching strategy (default: exact ID).
|
|
277
|
+
* Baselines are matched by `name`.
|
|
278
|
+
*
|
|
279
|
+
* For fleet mode, `newResults` can be an array of documents, each compared
|
|
280
|
+
* pairwise against `oldResults` (the reference).
|
|
281
|
+
*/
|
|
282
|
+
declare function diffHdf(oldResults: Record<string, unknown>, newResults: Record<string, unknown> | Record<string, unknown>[], options?: DiffOptions): HdfComparison;
|
|
283
|
+
/**
|
|
284
|
+
* Compare two HDF baseline documents and produce a structured comparison
|
|
285
|
+
* showing requirement changes between baseline versions.
|
|
286
|
+
*
|
|
287
|
+
* Unlike diffHdf (which compares results/evaluations), this compares baseline
|
|
288
|
+
* definitions — requirements without results. There is no status-based classification
|
|
289
|
+
* (fixed/regressed); only metadata changes (title, impact, descriptions, tags) are tracked.
|
|
290
|
+
*/
|
|
291
|
+
declare function diffBaselines(oldBaseline: Record<string, unknown>, newBaseline: Record<string, unknown>, options?: DiffOptions): HdfComparison;
|
|
292
|
+
/**
|
|
293
|
+
* Compare two HDF system documents and produce a structured comparison
|
|
294
|
+
* showing component-level changes between system versions.
|
|
295
|
+
*
|
|
296
|
+
* Components are matched by componentId (UUID) when available, falling back
|
|
297
|
+
* to exact name matching. Top-level system fields, data flows, and embedded
|
|
298
|
+
* SBOMs are also compared.
|
|
299
|
+
*/
|
|
300
|
+
declare function diffSystems(oldSystem: Record<string, unknown>, newSystem: Record<string, unknown>, options?: DiffOptions): HdfComparison;
|
|
301
|
+
//#endregion
|
|
302
|
+
//#region src/status.d.ts
|
|
303
|
+
/**
|
|
304
|
+
* Determine the effective status of a requirement from its results and overrides.
|
|
305
|
+
*
|
|
306
|
+
* Priority:
|
|
307
|
+
* 1. impact === 0 → notApplicable (regardless of results)
|
|
308
|
+
* 2. effectiveStatus field set (and no statusOverrides) → use it
|
|
309
|
+
* 3. Non-expired statusOverrides → use first non-expired
|
|
310
|
+
* 4. Aggregate results using worst-wins
|
|
311
|
+
* 5. Empty results → notReviewed
|
|
312
|
+
*/
|
|
313
|
+
declare function computeEffectiveStatus(requirement: Record<string, unknown>, referenceTimestamp?: string): string;
|
|
314
|
+
/**
|
|
315
|
+
* Classify why the status changed between two requirements.
|
|
316
|
+
* Returns an array of change reasons (a status change can have multiple causes).
|
|
317
|
+
*/
|
|
318
|
+
declare function classifyChangeReasons(oldReq: Record<string, unknown>, newReq: Record<string, unknown>, oldTimestamp?: string, newTimestamp?: string): ChangeReason[];
|
|
319
|
+
/**
|
|
320
|
+
* Classify the overall diff status based on old and new effective statuses.
|
|
321
|
+
*
|
|
322
|
+
* - If old is failing and new is passing → 'fixed'
|
|
323
|
+
* - If old is passing and new is failing → 'regressed'
|
|
324
|
+
* - If statuses are equal → 'unchanged'
|
|
325
|
+
* - Otherwise → 'updated'
|
|
326
|
+
*/
|
|
327
|
+
declare function classifyDiffStatus(oldEffectiveStatus: string, newEffectiveStatus: string): RequirementState;
|
|
328
|
+
//#endregion
|
|
329
|
+
//#region src/summary.d.ts
|
|
330
|
+
/**
|
|
331
|
+
* Compute summary counts from an array of RequirementDiff entries.
|
|
332
|
+
*/
|
|
333
|
+
declare function computeSummary(requirements: RequirementDiff[]): ComparisonSummary;
|
|
334
|
+
//#endregion
|
|
335
|
+
//#region src/normalize.d.ts
|
|
336
|
+
/**
|
|
337
|
+
* Normalize InSpec exec-json v1 format to HDF v2 structure for diffing.
|
|
338
|
+
*
|
|
339
|
+
* V1 uses: profiles[].controls[].results[].code_desc, source_location, start_time
|
|
340
|
+
* V2 uses: baselines[].requirements[].results[].codeDesc, sourceLocation, startTime
|
|
341
|
+
*
|
|
342
|
+
* This module detects v1 documents and converts them in-memory to v2 shape
|
|
343
|
+
* so the diff engine only needs to handle one format.
|
|
344
|
+
*/
|
|
345
|
+
/**
|
|
346
|
+
* Detect whether a document is v1 (InSpec exec-json) format.
|
|
347
|
+
* V1 has `profiles` at the top level; v2 has `baselines`.
|
|
348
|
+
*/
|
|
349
|
+
declare function isV1Format(doc: Record<string, unknown>): boolean;
|
|
350
|
+
/**
|
|
351
|
+
* Normalize a document to v2-like structure. If already v2, returns as-is.
|
|
352
|
+
* If v1, converts profiles→baselines, controls→requirements, and snake_case→camelCase.
|
|
353
|
+
*/
|
|
354
|
+
declare function normalizeToV2(doc: Record<string, unknown>): Record<string, unknown>;
|
|
355
|
+
//#endregion
|
|
356
|
+
//#region src/matching/types.d.ts
|
|
357
|
+
/**
|
|
358
|
+
* Result of matching requirements between two evaluations.
|
|
359
|
+
*/
|
|
360
|
+
interface MatchResult {
|
|
361
|
+
/** Paired requirements with their match metadata */
|
|
362
|
+
matched: MatchPair[];
|
|
363
|
+
/** Requirements only in the old evaluation (unmatched) */
|
|
364
|
+
unmatchedOld: Record<string, unknown>[];
|
|
365
|
+
/** Requirements only in the new evaluation (unmatched) */
|
|
366
|
+
unmatchedNew: Record<string, unknown>[];
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* A single matched pair of requirements.
|
|
370
|
+
*/
|
|
371
|
+
interface MatchPair {
|
|
372
|
+
/** The requirement from the old evaluation */
|
|
373
|
+
oldReq: Record<string, unknown>;
|
|
374
|
+
/** The requirement from the new evaluation */
|
|
375
|
+
newReq: Record<string, unknown>;
|
|
376
|
+
/** Name of the strategy that produced this match */
|
|
377
|
+
strategy: string;
|
|
378
|
+
/** Confidence score for the match (0.0 - 1.0) */
|
|
379
|
+
confidence: number;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* A pluggable strategy for matching requirements between evaluations.
|
|
383
|
+
*/
|
|
384
|
+
interface MatchStrategy {
|
|
385
|
+
/** Unique name for this strategy */
|
|
386
|
+
name: string;
|
|
387
|
+
/** Match old requirements against new requirements */
|
|
388
|
+
match(oldReqs: Record<string, unknown>[], newReqs: Record<string, unknown>[]): MatchResult;
|
|
389
|
+
}
|
|
390
|
+
//#endregion
|
|
391
|
+
//#region src/matching/exact-id.d.ts
|
|
392
|
+
/**
|
|
393
|
+
* Create an exact ID matching strategy.
|
|
394
|
+
*
|
|
395
|
+
* Matches requirements by their `id` field with exact string equality.
|
|
396
|
+
* Confidence is always 1.0 for matches.
|
|
397
|
+
*/
|
|
398
|
+
declare function createExactIdStrategy(): MatchStrategy;
|
|
399
|
+
//#endregion
|
|
400
|
+
//#region src/matching/mapped-id.d.ts
|
|
401
|
+
/**
|
|
402
|
+
* Create a mapped ID matching strategy.
|
|
403
|
+
*
|
|
404
|
+
* Translates old requirement IDs using a mapping table before matching.
|
|
405
|
+
* Only matches requirements whose old ID appears in the mapping table and
|
|
406
|
+
* whose mapped new ID exists in the new requirements.
|
|
407
|
+
*
|
|
408
|
+
* Confidence is 0.95 for mapped matches (slightly less than exact ID
|
|
409
|
+
* because the match depends on the accuracy of the mapping table).
|
|
410
|
+
*/
|
|
411
|
+
declare function createMappedIdStrategy(mapping: Record<string, string>): MatchStrategy;
|
|
412
|
+
//#endregion
|
|
413
|
+
//#region src/matching/cci-match.d.ts
|
|
414
|
+
/**
|
|
415
|
+
* Create a CCI-based matching strategy.
|
|
416
|
+
*
|
|
417
|
+
* Matches requirements that share the same CCI identifier in `tags.cci`.
|
|
418
|
+
* Only produces a match when exactly one old requirement and exactly one
|
|
419
|
+
* new requirement share a given CCI (unambiguous). Ambiguous CCIs (shared
|
|
420
|
+
* by multiple old or multiple new requirements) are skipped, and those
|
|
421
|
+
* requirements are left unmatched.
|
|
422
|
+
*
|
|
423
|
+
* Confidence is 0.8 for unambiguous matches.
|
|
424
|
+
*/
|
|
425
|
+
declare function createCciMatchStrategy(): MatchStrategy;
|
|
426
|
+
//#endregion
|
|
427
|
+
//#region src/matching/fuzzy-match.d.ts
|
|
428
|
+
/**
|
|
429
|
+
* Tokenize a title string into a set of meaningful tokens.
|
|
430
|
+
*
|
|
431
|
+
* - Lowercases the string
|
|
432
|
+
* - Splits on whitespace and punctuation
|
|
433
|
+
* - Filters out common stop words
|
|
434
|
+
* - Returns unique tokens as a Set
|
|
435
|
+
*/
|
|
436
|
+
declare function tokenize(text: string): Set<string>;
|
|
437
|
+
/**
|
|
438
|
+
* Compute Jaccard similarity between two sets.
|
|
439
|
+
* Returns |intersection| / |union|, or 0 if both sets are empty.
|
|
440
|
+
*/
|
|
441
|
+
declare function jaccardSimilarity(a: Set<string>, b: Set<string>): number;
|
|
442
|
+
/**
|
|
443
|
+
* Create a fuzzy title matching strategy.
|
|
444
|
+
*
|
|
445
|
+
* Matches requirements by token-based Jaccard similarity on the `title` field.
|
|
446
|
+
* Uses greedy best-match: for each unmatched old requirement, finds the
|
|
447
|
+
* best-matching unmatched new requirement above the confidence threshold.
|
|
448
|
+
*
|
|
449
|
+
* @param minConfidence Minimum Jaccard similarity to accept a match (default: 0.6)
|
|
450
|
+
*/
|
|
451
|
+
declare function createFuzzyTitleStrategy(minConfidence?: number): MatchStrategy;
|
|
452
|
+
//#endregion
|
|
453
|
+
//#region src/matching/index.d.ts
|
|
454
|
+
/**
|
|
455
|
+
* Options for configuring requirement matching.
|
|
456
|
+
*/
|
|
457
|
+
interface MatchOptions {
|
|
458
|
+
/** Primary matching strategy name (default: 'exactId') */
|
|
459
|
+
strategy?: string;
|
|
460
|
+
/** Fallback strategy names, applied in order to remaining unmatched requirements */
|
|
461
|
+
fallbackStrategies?: string[];
|
|
462
|
+
/** Mapping table for the 'mappedId' strategy (old ID -> new ID) */
|
|
463
|
+
mappingTable?: Record<string, string>;
|
|
464
|
+
/** Minimum confidence threshold for fuzzy matching (default: 0.6) */
|
|
465
|
+
minConfidence?: number;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Match requirements between two evaluations using a primary strategy
|
|
469
|
+
* and optional fallback strategies.
|
|
470
|
+
*
|
|
471
|
+
* The registry applies strategies in order:
|
|
472
|
+
* 1. Primary strategy matches what it can
|
|
473
|
+
* 2. Unmatched requirements pass to the next fallback strategy
|
|
474
|
+
* 3. Process continues until all strategies are exhausted or all
|
|
475
|
+
* requirements are matched
|
|
476
|
+
*
|
|
477
|
+
* @param oldReqs Requirements from the old evaluation
|
|
478
|
+
* @param newReqs Requirements from the new evaluation
|
|
479
|
+
* @param options Matching configuration
|
|
480
|
+
* @returns Combined match result from all strategies
|
|
481
|
+
*/
|
|
482
|
+
declare function matchRequirements(oldReqs: Record<string, unknown>[], newReqs: Record<string, unknown>[], options?: MatchOptions): MatchResult;
|
|
483
|
+
//#endregion
|
|
484
|
+
//#region src/validate.d.ts
|
|
485
|
+
/**
|
|
486
|
+
* Result of validating a document against the hdf-comparison schema.
|
|
487
|
+
*/
|
|
488
|
+
interface ValidationResult {
|
|
489
|
+
/** Whether the document conforms to the schema */
|
|
490
|
+
valid: boolean;
|
|
491
|
+
/** Human-readable error messages (only present when valid is false) */
|
|
492
|
+
errors?: string[];
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Validate a document against the hdf-comparison schema.
|
|
496
|
+
*
|
|
497
|
+
* Delegates to @mitre/hdf-validators which loads schemas from embedded
|
|
498
|
+
* bundled JSON (no filesystem access, no hardcoded version URLs).
|
|
499
|
+
*
|
|
500
|
+
* @param doc - The document to validate (typically the output of `diffHdf()`)
|
|
501
|
+
* @returns Validation result with `valid` boolean and optional `errors` array
|
|
502
|
+
*/
|
|
503
|
+
declare function validateComparison(doc: unknown): ValidationResult;
|
|
504
|
+
//#endregion
|
|
505
|
+
//#region src/exit-codes.d.ts
|
|
506
|
+
/** GNU diff compatible exit codes (--exit-code mode) */
|
|
507
|
+
declare const EXIT_IDENTICAL = 0;
|
|
508
|
+
declare const EXIT_DIFFERENCES = 1;
|
|
509
|
+
declare const EXIT_ERROR = 2;
|
|
510
|
+
/** Detailed exit codes (--detailed-exitcode mode) */
|
|
511
|
+
declare const EXIT_DETAILED_IDENTICAL = 0;
|
|
512
|
+
declare const EXIT_DETAILED_ERROR = 1;
|
|
513
|
+
declare const EXIT_DETAILED_FIXES_ONLY = 10;
|
|
514
|
+
declare const EXIT_DETAILED_REGRESSIONS_ONLY = 11;
|
|
515
|
+
declare const EXIT_DETAILED_MIXED = 12;
|
|
516
|
+
declare const EXIT_DETAILED_BASELINE_CHANGED = 13;
|
|
517
|
+
declare const EXIT_DETAILED_DRIFT_ONLY = 14;
|
|
518
|
+
/**
|
|
519
|
+
* Compute the GNU diff compatible exit code from a comparison summary.
|
|
520
|
+
*
|
|
521
|
+
* Returns:
|
|
522
|
+
* 0 = identical (no differences found)
|
|
523
|
+
* 1 = differences found (any kind)
|
|
524
|
+
*
|
|
525
|
+
* Note: error (exit code 2) is not computed from the summary — callers
|
|
526
|
+
* should return EXIT_ERROR directly when I/O or parse errors occur.
|
|
527
|
+
*/
|
|
528
|
+
declare function computeExitCode(summary: ComparisonSummary): number;
|
|
529
|
+
/**
|
|
530
|
+
* Compute the detailed exit code from a comparison summary.
|
|
531
|
+
*
|
|
532
|
+
* Returns:
|
|
533
|
+
* 0 = identical (no differences found)
|
|
534
|
+
* 10 = differences found, fixes only (security posture improved)
|
|
535
|
+
* 11 = differences found, regressions only (security posture degraded)
|
|
536
|
+
* 12 = differences found, mixed fixes and regressions
|
|
537
|
+
* 13 = differences found, only new/absent controls (baseline changed)
|
|
538
|
+
* 14 = differences found, only metadata drift (no status changes)
|
|
539
|
+
*
|
|
540
|
+
* Note: error (exit code 1) is not computed from the summary — callers
|
|
541
|
+
* should return EXIT_DETAILED_ERROR directly when I/O or parse errors occur.
|
|
542
|
+
*
|
|
543
|
+
* Priority order: mixed(12) > regressions(11) > fixes(10) > baseline(13) > drift(14)
|
|
544
|
+
*/
|
|
545
|
+
declare function computeDetailedExitCode(summary: ComparisonSummary): number;
|
|
546
|
+
//#endregion
|
|
547
|
+
//#region src/renderers/types.d.ts
|
|
548
|
+
type DetailLevel = 'summary' | 'control' | 'full';
|
|
549
|
+
interface RenderOptions {
|
|
550
|
+
/** What detail to show. Default: 'control' */
|
|
551
|
+
detail?: DetailLevel;
|
|
552
|
+
/** Only show requirements matching these states */
|
|
553
|
+
filterStates?: string[];
|
|
554
|
+
/** Only show requirements matching this severity */
|
|
555
|
+
filterSeverity?: string;
|
|
556
|
+
/** Use color codes (for terminal). Default: true */
|
|
557
|
+
color?: boolean;
|
|
558
|
+
}
|
|
559
|
+
//#endregion
|
|
560
|
+
//#region src/renderers/json.d.ts
|
|
561
|
+
/**
|
|
562
|
+
* Render an HdfComparison as a JSON string.
|
|
563
|
+
*
|
|
564
|
+
* - `detail: 'summary'` -- only `{ formatVersion, comparisonMode, summary }`
|
|
565
|
+
* - `detail: 'control'` -- full document but `before`/`after` stripped from requirementDiffs
|
|
566
|
+
* - `detail: 'full'` -- `JSON.stringify(comparison, null, 2)` (the complete document)
|
|
567
|
+
*
|
|
568
|
+
* Default detail level: `'control'`.
|
|
569
|
+
*/
|
|
570
|
+
declare function renderJson(comparison: HdfComparison, options?: RenderOptions): string;
|
|
571
|
+
//#endregion
|
|
572
|
+
//#region src/renderers/markdown.d.ts
|
|
573
|
+
/**
|
|
574
|
+
* Render an HdfComparison as a Markdown string.
|
|
575
|
+
*
|
|
576
|
+
* - `detail: 'summary'` -- summary table only
|
|
577
|
+
* - `detail: 'control'` -- summary + per-requirement tables by state
|
|
578
|
+
* - `detail: 'full'` -- summary + per-requirement tables with changeReasons and fieldChanges
|
|
579
|
+
*
|
|
580
|
+
* Default detail level: `'control'`.
|
|
581
|
+
*/
|
|
582
|
+
declare function renderMarkdown(comparison: HdfComparison, options?: RenderOptions): string;
|
|
583
|
+
//#endregion
|
|
584
|
+
//#region src/renderers/terminal.d.ts
|
|
585
|
+
/**
|
|
586
|
+
* Render an HdfComparison for terminal display with optional ANSI colors.
|
|
587
|
+
*
|
|
588
|
+
* - `detail: 'summary'` -- just the summary line
|
|
589
|
+
* - `detail: 'control'` -- requirement list + summary (excludes unchanged)
|
|
590
|
+
* - `detail: 'full'` -- all requirements including unchanged, with changeReasons and fieldChanges
|
|
591
|
+
*
|
|
592
|
+
* When `color: false`, no ANSI escape codes are emitted.
|
|
593
|
+
* Default detail level: `'control'`. Default color: `true`.
|
|
594
|
+
*/
|
|
595
|
+
declare function renderTerminal(comparison: HdfComparison, options?: RenderOptions): string;
|
|
596
|
+
//#endregion
|
|
597
|
+
//#region src/renderers/csv.d.ts
|
|
598
|
+
/**
|
|
599
|
+
* Render an HdfComparison as a CSV string.
|
|
600
|
+
*
|
|
601
|
+
* One row per requirement. Columns:
|
|
602
|
+
* - ID, Title, State, Old Status, New Status, Impact (Old), Impact (New), Change Reasons
|
|
603
|
+
*
|
|
604
|
+
* When `detail: 'full'`, an additional Field Changes column is included.
|
|
605
|
+
*
|
|
606
|
+
* Header row is always included. Standard CSV escaping (RFC 4180).
|
|
607
|
+
* Default detail level: `'control'`.
|
|
608
|
+
*/
|
|
609
|
+
declare function renderCsv(comparison: HdfComparison, options?: RenderOptions): string;
|
|
610
|
+
//#endregion
|
|
611
|
+
//#region src/renderers/index.d.ts
|
|
612
|
+
/**
|
|
613
|
+
* Convenience function to render a comparison in any supported format.
|
|
614
|
+
*
|
|
615
|
+
* @param comparison - The HdfComparison document to render
|
|
616
|
+
* @param format - Output format: 'json', 'markdown', 'terminal', or 'csv'
|
|
617
|
+
* @param options - Rendering options (detail level, filters, color)
|
|
618
|
+
* @returns The rendered string
|
|
619
|
+
*/
|
|
620
|
+
declare function render(comparison: HdfComparison, format: 'json' | 'markdown' | 'terminal' | 'csv', options?: RenderOptions): string;
|
|
621
|
+
//#endregion
|
|
622
|
+
export { type Annotation, type BaselineDiff, type ChangeReason, type ComparisonSummary, type ComponentDiff, type DetailLevel, type DiffOptions, type DiffStatus, type DiffSummary, EXIT_DETAILED_BASELINE_CHANGED, EXIT_DETAILED_DRIFT_ONLY, EXIT_DETAILED_ERROR, EXIT_DETAILED_FIXES_ONLY, EXIT_DETAILED_IDENTICAL, EXIT_DETAILED_MIXED, EXIT_DETAILED_REGRESSIONS_ONLY, EXIT_DIFFERENCES, EXIT_ERROR, EXIT_IDENTICAL, type FieldChange, type HdfComparison, type HdfDiff, type MatchOptions, type MatchPair, type MatchResult, type MatchStrategy, type MatchingConfig, type PackageDiff, type RenderOptions, type RequirementDiff, type RequirementState, type SbomDiffResult, type Source, type ValidationResult, classifyChangeReasons, classifyDiffStatus, computeDetailedExitCode, computeEffectiveStatus, computeExitCode, computeSummary, createCciMatchStrategy, createExactIdStrategy, createFuzzyTitleStrategy, createMappedIdStrategy, diffBaselines, diffHdf, diffSboms, diffSystems, isV1Format, jaccardSimilarity, matchRequirements, normalizeToV2, render, renderCsv, renderJson, renderMarkdown, renderTerminal, tokenize, validateComparison };
|
|
17
623
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/sbom.ts","../src/types.ts","../src/diff.ts","../src/status.ts","../src/summary.ts","../src/normalize.ts","../src/matching/types.ts","../src/matching/exact-id.ts","../src/matching/mapped-id.ts","../src/matching/cci-match.ts","../src/matching/fuzzy-match.ts","../src/matching/index.ts","../src/validate.ts","../src/exit-codes.ts","../src/renderers/types.ts","../src/renderers/json.ts","../src/renderers/markdown.ts","../src/renderers/terminal.ts","../src/renderers/csv.ts","../src/renderers/index.ts"],"mappings":"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"}
|