@mitre/hdf-converters 3.1.0 → 3.3.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.
@@ -80,6 +80,37 @@ const awsConfigFingerprint = {
80
80
  }
81
81
  };
82
82
  //#endregion
83
+ //#region converters/checkov-to-hdf/typescript/fingerprint.ts
84
+ function fingerprintObject(obj) {
85
+ if (typeof obj.check_type !== "string") return 0;
86
+ const results = obj.results;
87
+ if (typeof results !== "object" || results === null) return 0;
88
+ const res = results;
89
+ if (!Array.isArray(res.passed_checks) && !Array.isArray(res.failed_checks)) return 0;
90
+ const summary = obj.summary;
91
+ if (typeof summary === "object" && summary !== null) {
92
+ if ("checkov_version" in summary) return 1;
93
+ }
94
+ return .8;
95
+ }
96
+ const checkovFingerprint = {
97
+ id: "checkov-to-hdf",
98
+ label: "Checkov",
99
+ direction: "ingest",
100
+ inputFamily: "json",
101
+ outputType: "results",
102
+ fingerprint: (input) => {
103
+ if (typeof input !== "object" || input === null) return 0;
104
+ if (Array.isArray(input)) {
105
+ if (input.length === 0) return 0;
106
+ const first = input[0];
107
+ if (typeof first !== "object" || first === null) return 0;
108
+ return fingerprintObject(first);
109
+ }
110
+ return fingerprintObject(input);
111
+ }
112
+ };
113
+ //#endregion
83
114
  //#region converters/conveyor-to-hdf/typescript/fingerprint.ts
84
115
  const conveyorFingerprint = {
85
116
  id: "conveyor-to-hdf",
@@ -100,6 +131,23 @@ const conveyorFingerprint = {
100
131
  }
101
132
  };
102
133
  //#endregion
134
+ //#region converters/csaf-vex-to-hdf/typescript/fingerprint.ts
135
+ const csafVexFingerprint = {
136
+ id: "csaf-vex-to-hdf",
137
+ label: "CSAF VEX",
138
+ direction: "ingest",
139
+ inputFamily: "json",
140
+ outputType: "amendments",
141
+ fingerprint: (input) => {
142
+ if (typeof input !== "object" || input === null) return 0;
143
+ const doc = input.document;
144
+ if (!doc) return 0;
145
+ if (doc.category !== "csaf_vex") return 0;
146
+ if (typeof doc.csaf_version !== "string") return 0;
147
+ return 1;
148
+ }
149
+ };
150
+ //#endregion
103
151
  //#region converters/cyclonedx-to-hdf/typescript/fingerprint.ts
104
152
  const cyclonedxFingerprint = {
105
153
  id: "cyclonedx-to-hdf",
@@ -109,8 +157,13 @@ const cyclonedxFingerprint = {
109
157
  outputType: "results",
110
158
  fingerprint: (input) => {
111
159
  if (typeof input !== "object" || input === null) return 0;
112
- if (input.bomFormat === "CycloneDX") return 1;
113
- return 0;
160
+ const obj = input;
161
+ if (obj.bomFormat !== "CycloneDX") return 0;
162
+ const vulns = obj.vulnerabilities;
163
+ if (Array.isArray(vulns)) {
164
+ for (const v of vulns) if (typeof v === "object" && v !== null && "analysis" in v) return .8;
165
+ }
166
+ return 1;
114
167
  },
115
168
  detectVersion: (input) => {
116
169
  if (typeof input !== "object" || input === null) return "";
@@ -119,6 +172,24 @@ const cyclonedxFingerprint = {
119
172
  }
120
173
  };
121
174
  //#endregion
175
+ //#region converters/cyclonedx-vex-to-hdf/typescript/fingerprint.ts
176
+ const cyclonedxVexFingerprint = {
177
+ id: "cyclonedx-vex-to-hdf",
178
+ label: "CycloneDX VEX",
179
+ direction: "ingest",
180
+ inputFamily: "json",
181
+ outputType: "amendments",
182
+ fingerprint: (input) => {
183
+ if (typeof input !== "object" || input === null) return 0;
184
+ const obj = input;
185
+ if (obj.bomFormat !== "CycloneDX") return 0;
186
+ const vulns = obj.vulnerabilities;
187
+ if (!Array.isArray(vulns) || vulns.length === 0) return 0;
188
+ for (const v of vulns) if (typeof v === "object" && v !== null && "analysis" in v) return 1;
189
+ return 0;
190
+ }
191
+ };
192
+ //#endregion
122
193
  //#region converters/deptrack-to-hdf/typescript/fingerprint.ts
123
194
  const deptrackFingerprint = {
124
195
  id: "deptrack-to-hdf",
@@ -330,6 +401,23 @@ const neuvectorFingerprint = {
330
401
  }
331
402
  };
332
403
  //#endregion
404
+ //#region converters/openvex-to-hdf/typescript/fingerprint.ts
405
+ const openvexFingerprint = {
406
+ id: "openvex-to-hdf",
407
+ label: "OpenVEX",
408
+ direction: "ingest",
409
+ inputFamily: "json",
410
+ outputType: "amendments",
411
+ fingerprint: (input) => {
412
+ if (typeof input !== "object" || input === null) return 0;
413
+ const obj = input;
414
+ const ctx = obj["@context"];
415
+ if (typeof ctx !== "string" || !ctx.includes("openvex.dev")) return 0;
416
+ if (!("statements" in obj)) return 0;
417
+ return 1;
418
+ }
419
+ };
420
+ //#endregion
333
421
  //#region converters/sarif-to-hdf/typescript/fingerprint.ts
334
422
  const sarifFingerprint = {
335
423
  id: "sarif-to-hdf",
@@ -691,6 +779,35 @@ const xccdfFingerprint = {
691
779
  }
692
780
  };
693
781
  //#endregion
782
+ //#region converters/ckl-to-hdf/typescript/fingerprint.ts
783
+ const cklFingerprint = {
784
+ id: "ckl-to-hdf",
785
+ label: "CKL (DISA STIG Viewer checklist)",
786
+ direction: "ingest",
787
+ inputFamily: "xml",
788
+ outputType: "results",
789
+ fingerprint: (input) => {
790
+ if (typeof input !== "string") return 0;
791
+ return extractXmlRootElement(input) === "CHECKLIST" ? 1 : 0;
792
+ }
793
+ };
794
+ //#endregion
795
+ //#region converters/cklb-to-hdf/typescript/fingerprint.ts
796
+ const cklbFingerprint = {
797
+ id: "cklb-to-hdf",
798
+ label: "CKLB (DISA STIG Viewer 3.x JSON)",
799
+ direction: "ingest",
800
+ inputFamily: "json",
801
+ outputType: "results",
802
+ fingerprint: (input) => {
803
+ if (typeof input !== "object" || input === null || Array.isArray(input)) return 0;
804
+ const obj = input;
805
+ if (!("cklb_version" in obj)) return 0;
806
+ if (!Array.isArray(obj.stigs)) return 0;
807
+ return 1;
808
+ }
809
+ };
810
+ //#endregion
694
811
  //#region converters/prisma-to-hdf/typescript/fingerprint.ts
695
812
  /** Columns that uniquely identify Prisma Cloud CSV output */
696
813
  const PRISMA_COLUMNS = [
@@ -717,11 +834,9 @@ const prismaFingerprint = {
717
834
  return 0;
718
835
  }
719
836
  };
720
- //#endregion
721
- //#region converters/hdf-v2-passthrough/typescript/fingerprint.ts
722
- const hdfV2Fingerprint = {
723
- id: "hdf-v2-passthrough",
724
- label: "HDF v2",
837
+ const hdfFingerprint = {
838
+ id: "hdf-passthrough",
839
+ label: "HDF",
725
840
  direction: "ingest",
726
841
  inputFamily: "json",
727
842
  outputType: "results",
@@ -894,8 +1009,12 @@ const hdfToOscalPoamFingerprint = {
894
1009
  */
895
1010
  const allFingerprints = [
896
1011
  awsConfigFingerprint,
1012
+ cklbFingerprint,
1013
+ checkovFingerprint,
897
1014
  conveyorFingerprint,
1015
+ csafVexFingerprint,
898
1016
  cyclonedxFingerprint,
1017
+ cyclonedxVexFingerprint,
899
1018
  deptrackFingerprint,
900
1019
  gitlabFingerprint,
901
1020
  gosecFingerprint,
@@ -906,6 +1025,7 @@ const allFingerprints = [
906
1025
  msftDefenderEndpointFingerprint,
907
1026
  msftSecureScoreFingerprint,
908
1027
  neuvectorFingerprint,
1028
+ openvexFingerprint,
909
1029
  sarifFingerprint,
910
1030
  scoutsuiteFingerprint,
911
1031
  snykFingerprint,
@@ -916,6 +1036,7 @@ const allFingerprints = [
916
1036
  niktoFingerprint,
917
1037
  zapFingerprint,
918
1038
  burpsuiteFingerprint,
1039
+ cklFingerprint,
919
1040
  dbprotectFingerprint,
920
1041
  fortifyFingerprint,
921
1042
  junitFingerprint,
@@ -924,7 +1045,7 @@ const allFingerprints = [
924
1045
  veracodeFingerprint,
925
1046
  xccdfFingerprint,
926
1047
  prismaFingerprint,
927
- hdfV2Fingerprint,
1048
+ hdfFingerprint,
928
1049
  legacyHdfFingerprint,
929
1050
  ...oscalFingerprints,
930
1051
  hdfToCsvFingerprint,
@@ -942,4 +1063,4 @@ function registerAllFingerprints() {
942
1063
  //#endregion
943
1064
  export { detectFamily as i, detectConverter as n, detectConverterAll as r, registerAllFingerprints as t };
944
1065
 
945
- //# sourceMappingURL=register-all-DaYHszLd.js.map
1066
+ //# sourceMappingURL=register-all-C3lYICDC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-all-C3lYICDC.js","names":["sum","obj","r","obj","obj"],"sources":["../shared/typescript/fingerprint.ts","../converters/aws-config-to-hdf/typescript/fingerprint.ts","../converters/checkov-to-hdf/typescript/fingerprint.ts","../converters/conveyor-to-hdf/typescript/fingerprint.ts","../converters/csaf-vex-to-hdf/typescript/fingerprint.ts","../converters/cyclonedx-to-hdf/typescript/fingerprint.ts","../converters/cyclonedx-vex-to-hdf/typescript/fingerprint.ts","../converters/deptrack-to-hdf/typescript/fingerprint.ts","../converters/gitlab-to-hdf/typescript/fingerprint.ts","../converters/gosec-to-hdf/typescript/fingerprint.ts","../converters/grype-to-hdf/typescript/fingerprint.ts","../converters/jfrog-xray-to-hdf/typescript/fingerprint.ts","../converters/msft-defender-cloud-to-hdf/typescript/fingerprint.ts","../converters/msft-defender-devops-to-hdf/typescript/fingerprint.ts","../converters/msft-defender-endpoint-to-hdf/typescript/fingerprint.ts","../converters/msft-secure-score-to-hdf/typescript/fingerprint.ts","../converters/neuvector-to-hdf/typescript/fingerprint.ts","../converters/openvex-to-hdf/typescript/fingerprint.ts","../converters/sarif-to-hdf/typescript/fingerprint.ts","../converters/scoutsuite-to-hdf/typescript/fingerprint.ts","../converters/snyk-to-hdf/typescript/fingerprint.ts","../converters/sonarqube-to-hdf/typescript/fingerprint.ts","../converters/splunk-to-hdf/typescript/fingerprint.ts","../converters/trufflehog-to-hdf/typescript/fingerprint.ts","../converters/twistlock-to-hdf/typescript/fingerprint.ts","../converters/nikto-to-hdf/typescript/fingerprint.ts","../converters/zap-to-hdf/typescript/fingerprint.ts","../shared/typescript/xml-utils.ts","../converters/burpsuite-to-hdf/typescript/fingerprint.ts","../converters/dbprotect-to-hdf/typescript/fingerprint.ts","../converters/fortify-to-hdf/typescript/fingerprint.ts","../converters/junit-to-hdf/typescript/fingerprint.ts","../converters/nessus-to-hdf/typescript/fingerprint.ts","../converters/netsparker-to-hdf/typescript/fingerprint.ts","../converters/veracode-to-hdf/typescript/fingerprint.ts","../converters/xccdf-results-to-hdf/typescript/fingerprint.ts","../converters/ckl-to-hdf/typescript/fingerprint.ts","../converters/cklb-to-hdf/typescript/fingerprint.ts","../converters/prisma-to-hdf/typescript/fingerprint.ts","../converters/hdf-passthrough/typescript/fingerprint.ts","../converters/legacyhdf-to-hdf/typescript/fingerprint.ts","../converters/oscal-to-hdf/typescript/fingerprint.ts","../converters/hdf-to-csv/typescript/fingerprint.ts","../converters/hdf-to-xml/typescript/fingerprint.ts","../converters/hdf-to-oscal-sar/typescript/fingerprint.ts","../converters/hdf-to-oscal-poam/typescript/fingerprint.ts","../shared/typescript/register-all.ts"],"sourcesContent":["/**\n * Converter auto-detection dispatcher.\n *\n * Walks registered fingerprints and returns the highest-confidence match.\n * Lightweight — no converter imports, safe for any bundle.\n */\n\nimport { getIngestFingerprints, type ConverterFingerprint, type InputFamily } from './registry.js';\n\nexport interface DetectionResult {\n fingerprint: ConverterFingerprint;\n confidence: number;\n /** Detected format version (e.g. \"2.1.0\" for SARIF). Empty when not available. */\n version: string;\n}\n\n/** Minimum confidence to accept an auto-detection result. */\nconst MIN_CONFIDENCE = 0.8;\n\nexport function detectConverter(input: string): DetectionResult | undefined {\n const results = detectConverterAll(input);\n if (results.length === 0) return undefined;\n const best = results[0]!;\n // Refuse to guess if confidence is too low\n if (best.confidence < MIN_CONFIDENCE) return undefined;\n // Refuse to guess if there's an ambiguous tie at the top\n if (results.length > 1 && results[1]!.confidence === best.confidence) return undefined;\n return best;\n}\n\n/** Maximum input size for fingerprint detection (100 MB). */\nconst MAX_DETECT_SIZE = 100 * 1024 * 1024;\n/** Maximum characters scanned for XML/text root element detection. */\nconst MAX_XML_PREAMBLE = 8 * 1024;\n\nexport function detectConverterAll(input: string): DetectionResult[] {\n if (!input || input.length > MAX_DETECT_SIZE) return [];\n\n const family = detectFamily(input);\n if (!family) return [];\n\n // For XML/text, only pass the preamble to fingerprints\n const effectiveInput = (family !== 'json' && input.length > MAX_XML_PREAMBLE)\n ? input.slice(0, MAX_XML_PREAMBLE)\n : input;\n\n const parsed = family === 'json' ? tryParseJSON(input) : effectiveInput;\n if (parsed === undefined) return [];\n\n const results: DetectionResult[] = [];\n for (const fp of getIngestFingerprints()) {\n if (fp.inputFamily !== family) continue;\n const confidence = fp.fingerprint(parsed);\n if (confidence > 0) {\n let version = '';\n if (fp.detectVersion) {\n try {\n version = fp.detectVersion(parsed);\n } catch {\n version = '';\n }\n }\n results.push({ fingerprint: fp, confidence, version });\n }\n }\n\n // Stable sort: by confidence desc, then by ID asc for deterministic tiebreaking\n results.sort((a, b) => b.confidence - a.confidence || a.fingerprint.id.localeCompare(b.fingerprint.id));\n return results;\n}\n\nexport function detectFamily(input: string): InputFamily | undefined {\n if (!input) return undefined;\n // Strip UTF-8 BOM (U+FEFF) — common on Windows-generated files\n const stripped = input.replace(/^\\uFEFF/, '');\n const trimmed = stripped.trim();\n if (!trimmed) return undefined;\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) return 'json';\n if (trimmed.startsWith('<')) return 'xml';\n // CSV intentionally excluded — too many false positives (see design doc D1)\n return 'text';\n}\n\nfunction tryParseJSON(input: string): unknown | undefined {\n try {\n return JSON.parse(input);\n } catch {\n return undefined;\n }\n}\n","/**\n * AWS Config format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects JSON with ConfigRules[] array or individual ConfigRuleName fields.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const awsConfigFingerprint: ConverterFingerprint = {\n id: 'aws-config-to-hdf',\n label: 'AWS Config',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n // Primary: ConfigRules array (the standard export shape)\n if (Array.isArray(obj.ConfigRules)) return 1.0;\n // Secondary: individual config rule object with ConfigRuleName\n if (typeof obj.ConfigRuleName === 'string') return 0.7;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('aws-config-to-hdf')) return;\n registerFingerprint(awsConfigFingerprint);\n}\n","/**\n * Checkov format fingerprint.\n *\n * Detects JSON with check_type + results.passed_checks/failed_checks (single object or array).\n * Strong signal (1.0) when summary.checkov_version is present; medium (0.8) otherwise.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nfunction fingerprintObject(obj: Record<string, unknown>): number {\n if (typeof obj.check_type !== 'string') return 0;\n\n const results = obj.results;\n if (typeof results !== 'object' || results === null) return 0;\n const res = results as Record<string, unknown>;\n if (!Array.isArray(res.passed_checks) && !Array.isArray(res.failed_checks)) return 0;\n\n // Strong signal: summary with checkov_version\n const summary = obj.summary;\n if (typeof summary === 'object' && summary !== null) {\n const sum = summary as Record<string, unknown>;\n if ('checkov_version' in sum) return 1.0;\n }\n\n // Medium signal: has check_type + results with check arrays but no version\n return 0.8;\n}\n\nexport const checkovFingerprint: ConverterFingerprint = {\n id: 'checkov-to-hdf',\n label: 'Checkov',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n\n // Array format: check first element\n if (Array.isArray(input)) {\n if (input.length === 0) return 0;\n const first = input[0] as Record<string, unknown>;\n if (typeof first !== 'object' || first === null) return 0;\n return fingerprintObject(first);\n }\n\n return fingerprintObject(input as Record<string, unknown>);\n },\n};\n\nexport function register(): void {\n if (getFingerprint('checkov-to-hdf')) return;\n registerFingerprint(checkovFingerprint);\n}\n","/**\n * Conveyor format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects JSON with api_response.results structure.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const conveyorFingerprint: ConverterFingerprint = {\n id: 'conveyor-to-hdf',\n label: 'Conveyor',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n // Primary: api_response with results\n if (typeof obj.api_response === 'object' && obj.api_response !== null) {\n const resp = obj.api_response as Record<string, unknown>;\n if (typeof resp.results === 'object' && resp.results !== null) return 1.0;\n // Has api_response but no results — still likely Conveyor\n return 0.6;\n }\n // Secondary: has api_server_version (Conveyor-specific field)\n if (typeof obj.api_server_version === 'string') return 0.5;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('conveyor-to-hdf')) return;\n registerFingerprint(conveyorFingerprint);\n}\n","/**\n * CSAF VEX format fingerprint.\n *\n * Detects CSAF VEX by document.category=='csaf_vex' + csaf_version.\n */\n\nimport {\n registerFingerprint,\n getFingerprint,\n type ConverterFingerprint,\n} from '../../../shared/typescript/registry.js';\n\nexport const csafVexFingerprint: ConverterFingerprint = {\n id: 'csaf-vex-to-hdf',\n label: 'CSAF VEX',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'amendments',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n const doc = obj.document as Record<string, unknown> | undefined;\n if (!doc) return 0;\n if (doc.category !== 'csaf_vex') return 0;\n if (typeof doc.csaf_version !== 'string') return 0;\n return 1.0;\n },\n};\n\nexport function register(): void {\n if (!getFingerprint('csaf-vex-to-hdf')) registerFingerprint(csafVexFingerprint);\n}\n","/**\n * CycloneDX format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects JSON with bomFormat === 'CycloneDX'.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const cyclonedxFingerprint: ConverterFingerprint = {\n id: 'cyclonedx-to-hdf',\n label: 'CycloneDX',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (obj.bomFormat !== 'CycloneDX') return 0;\n // Defer to cyclonedx-vex-to-hdf when the BOM carries VEX analysis\n // statements — the amendment-output target is more specific than the\n // SBOM-as-results mapping.\n const vulns = obj.vulnerabilities;\n if (Array.isArray(vulns)) {\n for (const v of vulns) {\n if (typeof v === 'object' && v !== null && 'analysis' in v) return 0.8;\n }\n }\n return 1.0;\n },\n detectVersion: (input: unknown): string => {\n if (typeof input !== 'object' || input === null) return '';\n const obj = input as Record<string, unknown>;\n return typeof obj.specVersion === 'string' ? obj.specVersion : '';\n },\n};\n\nexport function register(): void {\n if (getFingerprint('cyclonedx-to-hdf')) return;\n registerFingerprint(cyclonedxFingerprint);\n}\n","/**\n * CycloneDX VEX format fingerprint.\n *\n * Detects a CycloneDX BOM that carries VEX analysis statements\n * (vulnerabilities[].analysis present). Plain SBOMs without analysis\n * fall through to cyclonedx-to-hdf.\n */\n\nimport {\n registerFingerprint,\n getFingerprint,\n type ConverterFingerprint,\n} from '../../../shared/typescript/registry.js';\n\nexport const cyclonedxVexFingerprint: ConverterFingerprint = {\n id: 'cyclonedx-vex-to-hdf',\n label: 'CycloneDX VEX',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'amendments',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (obj.bomFormat !== 'CycloneDX') return 0;\n const vulns = obj.vulnerabilities;\n if (!Array.isArray(vulns) || vulns.length === 0) return 0;\n for (const v of vulns) {\n if (typeof v === 'object' && v !== null && 'analysis' in v) return 1.0;\n }\n return 0;\n },\n};\n\nexport function register(): void {\n if (!getFingerprint('cyclonedx-vex-to-hdf')) registerFingerprint(cyclonedxVexFingerprint);\n}\n","/**\n * Dependency-Track format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects JSON with findings[] containing vulnerability.vulnId fields.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const deptrackFingerprint: ConverterFingerprint = {\n id: 'deptrack-to-hdf',\n label: 'Dependency-Track',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n // Primary: findings array with vulnerability.vulnId + project + meta\n if (Array.isArray(obj.findings)) {\n // Strong signal: has project and meta (standard FPF shape)\n if (typeof obj.project === 'object' && obj.project !== null &&\n typeof obj.meta === 'object' && obj.meta !== null) {\n return 1.0;\n }\n // Medium signal: findings with vulnerability sub-objects\n const findings = obj.findings as unknown[];\n if (findings.length > 0) {\n const first = findings[0] as Record<string, unknown>;\n if (typeof first === 'object' && first !== null &&\n typeof first.vulnerability === 'object' && first.vulnerability !== null) {\n const vuln = first.vulnerability as Record<string, unknown>;\n if (typeof vuln.vulnId === 'string') return 0.9;\n }\n }\n return 0.5;\n }\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('deptrack-to-hdf')) return;\n registerFingerprint(deptrackFingerprint);\n}\n","/**\n * GitLab Security Report format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects JSON with vulnerabilities[] + scan.type (v0.9) or just vulnerabilities[] (v0.5).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const gitlabFingerprint: ConverterFingerprint = {\n id: 'gitlab-to-hdf',\n label: 'GitLab',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (!Array.isArray(obj.vulnerabilities)) return 0;\n // Strong signal: scan object with type field (GitLab Security Report schema)\n if (typeof obj.scan === 'object' && obj.scan !== null) {\n const scan = obj.scan as Record<string, unknown>;\n if (typeof scan.type === 'string') return 0.9;\n // Has scan but no type — still likely GitLab\n return 0.7;\n }\n // Weak signal: just vulnerabilities[] (could be GitLab or other tools)\n return 0.5;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('gitlab-to-hdf')) return;\n registerFingerprint(gitlabFingerprint);\n}\n","/**\n * GoSec format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects JSON with GosecVersion + Issues[] (1.0) or Issues[] + Stats (0.6).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const gosecFingerprint: ConverterFingerprint = {\n id: 'gosec-to-hdf',\n label: 'GoSec',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n // Strong signal: GosecVersion present with Issues array\n if (typeof obj.GosecVersion === 'string' && Array.isArray(obj.Issues)) return 1.0;\n // Medium signal: Issues array with Stats object (gosec shape without version)\n if (Array.isArray(obj.Issues) && typeof obj.Stats === 'object' && obj.Stats !== null) return 0.6;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('gosec-to-hdf')) return;\n registerFingerprint(gosecFingerprint);\n}\n","/**\n * Grype format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects JSON with matches[] + source (1.0) or descriptor.name === 'grype' (0.8).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const grypeFingerprint: ConverterFingerprint = {\n id: 'grype-to-hdf',\n label: 'Grype',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n // Strong signal: matches array with source object (standard Grype output)\n if (Array.isArray(obj.matches) && typeof obj.source === 'object' && obj.source !== null) return 1.0;\n // Medium signal: descriptor.name === 'grype'\n if (typeof obj.descriptor === 'object' && obj.descriptor !== null) {\n const desc = obj.descriptor as Record<string, unknown>;\n if (desc.name === 'grype') return 0.8;\n }\n // Weak signal: matches array alone (could be other tools)\n if (Array.isArray(obj.matches)) return 0.4;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('grype-to-hdf')) return;\n registerFingerprint(grypeFingerprint);\n}\n","/**\n * JFrog Xray format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects JFrog Xray JSON by the presence of a `data` array with `total_count`.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const jfrogXrayFingerprint: ConverterFingerprint = {\n id: 'jfrog-xray-to-hdf',\n label: 'JFrog Xray',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (Array.isArray(obj.data) && typeof obj.total_count === 'number') return 1.0;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('jfrog-xray-to-hdf')) return;\n registerFingerprint(jfrogXrayFingerprint);\n}\n","/**\n * Microsoft Defender for Cloud format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects Defender for Cloud JSON by `value[]` with items containing\n * `properties.displayName` (Azure Security Assessment structure).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const msftDefenderCloudFingerprint: ConverterFingerprint = {\n id: 'msft-defender-cloud-to-hdf',\n label: 'Microsoft Defender for Cloud',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (!Array.isArray(obj.value)) return 0;\n if (obj.value.length === 0) return 0.5;\n const first = obj.value[0] as Record<string, unknown> | undefined;\n if (!first || typeof first !== 'object') return 0;\n const props = first.properties as Record<string, unknown> | undefined;\n if (props && typeof props === 'object' && typeof props.displayName === 'string') return 1.0;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('msft-defender-cloud-to-hdf')) return;\n registerFingerprint(msftDefenderCloudFingerprint);\n}\n","/**\n * Microsoft Defender for DevOps (MSDO) SARIF format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * This is SARIF input enriched with MSDO-specific properties.\n * Confidence 0.95 so it outranks the generic SARIF fingerprint at 0.9.\n * Detects by checking for `version` + `runs[]` (SARIF) AND a tool.driver\n * containing 'Microsoft' or 'DevOps' in name/organization/product/fullName.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nfunction isMsdoDriver(driver: Record<string, unknown>): boolean {\n const fields = [\n driver.name,\n driver.organization,\n driver.product,\n driver.fullName,\n ];\n for (const field of fields) {\n if (typeof field === 'string') {\n const lower = field.toLowerCase();\n if (lower.includes('microsoft') || lower.includes('devops')) return true;\n }\n }\n return false;\n}\n\nexport const msftDefenderDevopsFingerprint: ConverterFingerprint = {\n id: 'msft-defender-devops-to-hdf',\n label: 'Microsoft Defender for DevOps',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n // Must be SARIF: version string + runs array\n if (typeof obj.version !== 'string' || !Array.isArray(obj.runs)) return 0;\n // Check runs for MSDO-specific tool driver\n for (const run of obj.runs) {\n if (typeof run !== 'object' || run === null) continue;\n const r = run as Record<string, unknown>;\n const tool = r.tool as Record<string, unknown> | undefined;\n if (!tool || typeof tool !== 'object') continue;\n const driver = tool.driver as Record<string, unknown> | undefined;\n if (!driver || typeof driver !== 'object') continue;\n if (isMsdoDriver(driver)) return 0.95;\n }\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('msft-defender-devops-to-hdf')) return;\n registerFingerprint(msftDefenderDevopsFingerprint);\n}\n","/**\n * Microsoft Defender for Endpoint format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects MDE alert response JSON by `value[]` with items containing\n * `severity` + `category` + `evidence` (Microsoft Graph Security v2 alert structure).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const msftDefenderEndpointFingerprint: ConverterFingerprint = {\n id: 'msft-defender-endpoint-to-hdf',\n label: 'Microsoft Defender for Endpoint',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (!Array.isArray(obj.value)) return 0;\n if (obj.value.length === 0) return 0;\n const first = obj.value[0] as Record<string, unknown> | undefined;\n if (!first || typeof first !== 'object') return 0;\n // MDE alerts have severity + category + evidence array\n if (\n typeof first.severity === 'string' &&\n typeof first.category === 'string' &&\n Array.isArray(first.evidence)\n ) return 1.0;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('msft-defender-endpoint-to-hdf')) return;\n registerFingerprint(msftDefenderEndpointFingerprint);\n}\n","/**\n * Microsoft Secure Score format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects the combined input format: `secureScore.value[]` + `profiles.value[]`\n * with controlScores inside secureScore entries.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const msftSecureScoreFingerprint: ConverterFingerprint = {\n id: 'msft-secure-score-to-hdf',\n label: 'Microsoft Secure Score',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n const secureScore = obj.secureScore as Record<string, unknown> | undefined;\n const profiles = obj.profiles as Record<string, unknown> | undefined;\n if (!secureScore || typeof secureScore !== 'object') return 0;\n if (!profiles || typeof profiles !== 'object') return 0;\n if (!Array.isArray(secureScore.value) || !Array.isArray(profiles.value)) return 0;\n // Check for controlScores in the first secureScore entry\n if (secureScore.value.length > 0) {\n const first = secureScore.value[0] as Record<string, unknown> | undefined;\n if (first && Array.isArray(first.controlScores)) return 1.0;\n }\n return 0.8;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('msft-secure-score-to-hdf')) return;\n registerFingerprint(msftSecureScoreFingerprint);\n}\n","/**\n * NeuVector format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects NeuVector scan JSON by the presence of `report.vulnerabilities[]`\n * where vulnerability items have `name` + `package_name`.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const neuvectorFingerprint: ConverterFingerprint = {\n id: 'neuvector-to-hdf',\n label: 'NeuVector',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n const report = obj.report as Record<string, unknown> | undefined;\n if (!report || typeof report !== 'object') return 0;\n if (!Array.isArray(report.vulnerabilities)) return 0;\n if (report.vulnerabilities.length === 0) return 0.7;\n const first = report.vulnerabilities[0] as Record<string, unknown> | undefined;\n if (first && typeof first.name === 'string' && typeof first.package_name === 'string') return 1.0;\n return 0.5;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('neuvector-to-hdf')) return;\n registerFingerprint(neuvectorFingerprint);\n}\n","/**\n * OpenVEX format fingerprint.\n *\n * Detects an OpenVEX document by the openvex.dev context URI and the\n * presence of a statements array.\n */\n\nimport {\n registerFingerprint,\n getFingerprint,\n type ConverterFingerprint,\n} from '../../../shared/typescript/registry.js';\n\nexport const openvexFingerprint: ConverterFingerprint = {\n id: 'openvex-to-hdf',\n label: 'OpenVEX',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'amendments',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n const ctx = obj['@context'];\n if (typeof ctx !== 'string' || !ctx.includes('openvex.dev')) return 0;\n if (!('statements' in obj)) return 0;\n return 1.0;\n },\n};\n\nexport function register(): void {\n if (!getFingerprint('openvex-to-hdf')) registerFingerprint(openvexFingerprint);\n}\n","/**\n * SARIF format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Confidence 0.9 — tool-specific SARIF wrappers (MSDO etc.) return 0.95+.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const sarifFingerprint: ConverterFingerprint = {\n id: 'sarif-to-hdf',\n label: 'SARIF',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (typeof obj.version === 'string' && Array.isArray(obj.runs)) return 0.9;\n return 0;\n },\n detectVersion: (input: unknown): string => {\n if (typeof input !== 'object' || input === null) return '';\n const obj = input as Record<string, unknown>;\n return typeof obj.version === 'string' ? obj.version : '';\n },\n};\n\nexport function register(): void {\n if (getFingerprint('sarif-to-hdf')) return;\n registerFingerprint(sarifFingerprint);\n}\n","/**\n * ScoutSuite format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects ScoutSuite JSON by the presence of `services` (object) + `last_run` (object).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const scoutsuiteFingerprint: ConverterFingerprint = {\n id: 'scoutsuite-to-hdf',\n label: 'ScoutSuite',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (\n typeof obj.services === 'object' && obj.services !== null && !Array.isArray(obj.services) &&\n typeof obj.last_run === 'object' && obj.last_run !== null\n ) return 1.0;\n return 0;\n },\n};\n\nconst SCOUTSUITE_JS_PREFIX_SNIFF = /^\\s*scoutsuite_results\\s*=\\s*\\{/i;\n\nexport const scoutsuiteJsFingerprint: ConverterFingerprint = {\n id: 'scoutsuite-to-hdf-js',\n label: 'ScoutSuite',\n direction: 'ingest',\n inputFamily: 'text',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'string') return 0;\n return SCOUTSUITE_JS_PREFIX_SNIFF.test(input) ? 1.0 : 0;\n },\n};\n\nexport function register(): void {\n if (!getFingerprint('scoutsuite-to-hdf')) registerFingerprint(scoutsuiteFingerprint);\n if (!getFingerprint('scoutsuite-to-hdf-js')) registerFingerprint(scoutsuiteJsFingerprint);\n}\n","/**\n * Snyk format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects Snyk JSON by `vulnerabilities[]` array. Returns 1.0 when\n * `packageManager` is also present, 0.5 for just `vulnerabilities[]`.\n * Also handles multi-project array input (array of Snyk reports).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nfunction isSnykReport(obj: Record<string, unknown>): number {\n if (!Array.isArray(obj.vulnerabilities)) return 0;\n if (typeof obj.packageManager === 'string') return 1.0;\n return 0.5;\n}\n\nexport const snykFingerprint: ConverterFingerprint = {\n id: 'snyk-to-hdf',\n label: 'Snyk',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n // Handle array input (multi-project)\n if (Array.isArray(input)) {\n if (input.length === 0) return 0;\n const first = input[0] as Record<string, unknown> | undefined;\n if (!first || typeof first !== 'object') return 0;\n return isSnykReport(first);\n }\n // Single project\n return isSnykReport(input as Record<string, unknown>);\n },\n};\n\nexport function register(): void {\n if (getFingerprint('snyk-to-hdf')) return;\n registerFingerprint(snykFingerprint);\n}\n","/**\n * SonarQube format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects SonarQube issues JSON by `issues[]` where items have `rule` + `component`.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const sonarqubeFingerprint: ConverterFingerprint = {\n id: 'sonarqube-to-hdf',\n label: 'SonarQube',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (!Array.isArray(obj.issues)) return 0;\n if (obj.issues.length === 0) return 0.5;\n const first = obj.issues[0] as Record<string, unknown> | undefined;\n if (!first || typeof first !== 'object') return 0;\n if (typeof first.rule === 'string' && typeof first.component === 'string') return 1.0;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('sonarqube-to-hdf')) return;\n registerFingerprint(sonarqubeFingerprint);\n}\n","/**\n * Splunk HDF event format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects Splunk HDF events by checking for an array where items have\n * `meta.subtype` and `meta.guid` (the Splunk HDF pipeline event structure).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const splunkFingerprint: ConverterFingerprint = {\n id: 'splunk-to-hdf',\n label: 'Splunk',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (!Array.isArray(input)) return 0;\n if (input.length === 0) return 0;\n const first = input[0] as Record<string, unknown> | undefined;\n if (!first || typeof first !== 'object') return 0;\n const meta = first.meta as Record<string, unknown> | undefined;\n if (!meta || typeof meta !== 'object') return 0;\n if (typeof meta.subtype === 'string' && typeof meta.guid === 'string') return 1.0;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('splunk-to-hdf')) return;\n registerFingerprint(splunkFingerprint);\n}\n","/**\n * TruffleHog format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n *\n * TruffleHog output can be:\n * - JSON array of findings\n * - Single JSON object finding\n * - NDJSON (newline-delimited JSON)\n *\n * Key structural markers:\n * - SourceMetadata + DetectorName → confidence 1.0\n * - Raw + Verified (boolean) → confidence 0.7\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nfunction isTrufflehogFinding(obj: Record<string, unknown>): number {\n if (typeof obj.DetectorName === 'string' && obj.SourceMetadata != null) return 1.0;\n if (typeof obj.Raw === 'string' && typeof obj.Verified === 'boolean') return 0.7;\n return 0;\n}\n\nexport const trufflehogFingerprint: ConverterFingerprint = {\n id: 'trufflehog-to-hdf',\n label: 'TruffleHog',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n\n // Array of findings\n if (Array.isArray(input)) {\n if (input.length === 0) return 0;\n const first = input[0] as Record<string, unknown>;\n if (typeof first !== 'object' || first === null) return 0;\n return isTrufflehogFinding(first);\n }\n\n // Single finding object\n return isTrufflehogFinding(input as Record<string, unknown>);\n },\n};\n\nexport function register(): void {\n if (getFingerprint('trufflehog-to-hdf')) return;\n registerFingerprint(trufflehogFingerprint);\n}\n","/**\n * Twistlock/Prisma Cloud format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n *\n * Twistlock container image scans produce a top-level \"results\" array where\n * each item has complianceDistribution or vulnerabilityDistribution.\n * Code repository scans omit the results wrapper but still have those fields.\n *\n * Key structural markers:\n * - results[] with complianceDistribution → confidence 1.0\n * - results[] with vulnerabilityDistribution → confidence 0.9\n * - Single object with complianceDistribution → confidence 0.9\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nfunction hasTwistlockMarkers(obj: Record<string, unknown>): number {\n if ('complianceDistribution' in obj) return 1.0;\n if ('vulnerabilityDistribution' in obj) return 0.9;\n return 0;\n}\n\nexport const twistlockFingerprint: ConverterFingerprint = {\n id: 'twistlock-to-hdf',\n label: 'Twistlock',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) return 0;\n const obj = input as Record<string, unknown>;\n\n // Container scan with \"results\" wrapper\n if (Array.isArray(obj.results) && obj.results.length > 0) {\n const first = obj.results[0] as Record<string, unknown>;\n if (typeof first === 'object' && first !== null) {\n return hasTwistlockMarkers(first);\n }\n }\n\n // Code repo scan — single result object without wrapper\n return hasTwistlockMarkers(obj);\n },\n};\n\nexport function register(): void {\n if (getFingerprint('twistlock-to-hdf')) return;\n registerFingerprint(twistlockFingerprint);\n}\n","/**\n * Nikto format fingerprint.\n *\n * Detects Nikto JSON output by checking for a vulnerabilities array.\n * Nikto outputs JSON (not XML), containing host/port/vulnerabilities fields.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const niktoFingerprint: ConverterFingerprint = {\n id: 'nikto-to-hdf',\n label: 'Nikto',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n // Nikto JSON has a \"vulnerabilities\" array and optionally \"host\", \"port\", \"banner\"\n if (Array.isArray(obj.vulnerabilities)) {\n // Higher confidence if host/port present (standard Nikto fields)\n if (typeof obj.host === 'string' || typeof obj.port === 'string') return 0.95;\n return 0.85;\n }\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('nikto-to-hdf')) return;\n registerFingerprint(niktoFingerprint);\n}\n","/**\n * OWASP ZAP format fingerprint.\n *\n * Detects ZAP JSON output by checking for a site array with alerts.\n * ZAP outputs JSON (not XML), containing @generated/@version and site[] fields.\n * Note: ZAP can also output SARIF — the SARIF fingerprint handles that case.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const zapFingerprint: ConverterFingerprint = {\n id: 'zap-to-hdf',\n label: 'OWASP ZAP',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n // ZAP JSON has a \"site\" array and optionally \"@generated\", \"@version\"\n if (Array.isArray(obj.site)) {\n // Higher confidence if @version or @generated present (standard ZAP fields)\n if (typeof obj['@version'] === 'string' || typeof obj['@generated'] === 'string') return 0.95;\n return 0.85;\n }\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('zap-to-hdf')) return;\n registerFingerprint(zapFingerprint);\n}\n","/**\n * Shared XML utilities for fingerprint detection.\n *\n * Extracts root element name from XML strings, handling declarations,\n * comments, DOCTYPE (including internal subsets), and namespace prefixes.\n */\n\n/**\n * Extract the root element local name from an XML string.\n * Skips XML declarations (<?...?>), comments (<!--...-->),\n * and DOCTYPE declarations (<!DOCTYPE ... [...]>).\n * Strips namespace prefixes (e.g., xccdf:Benchmark -> Benchmark).\n *\n * Returns null if no element found.\n */\nexport function extractXmlRootElement(input: string): string | null {\n let s = input;\n while (true) {\n s = s.trimStart();\n if (s.startsWith('<?')) {\n // XML processing instruction: <?...?>\n const end = s.indexOf('?>');\n if (end === -1) return null;\n s = s.slice(end + 2);\n } else if (s.startsWith('<!--')) {\n // XML comment: <!--...-->\n const end = s.indexOf('-->');\n if (end === -1) return null;\n s = s.slice(end + 3);\n } else if (s.startsWith('<!DOCTYPE') || s.startsWith('<!doctype')) {\n // DOCTYPE: may have internal subset in [...]\n const bracket = s.indexOf('[');\n const gt = s.indexOf('>');\n if (gt === -1) return null;\n if (bracket !== -1 && bracket < gt) {\n // Has internal subset: skip to ]>\n const endSubset = s.indexOf(']>');\n if (endSubset === -1) return null;\n s = s.slice(endSubset + 2);\n } else {\n // Simple DOCTYPE without internal subset\n s = s.slice(gt + 1);\n }\n } else if (s.startsWith('<!')) {\n // Other markup declaration\n const end = s.indexOf('>');\n if (end === -1) return null;\n s = s.slice(end + 1);\n } else {\n break;\n }\n }\n // Match the root element, stripping optional namespace prefix\n const m = s.match(/^<(?:[a-zA-Z_][\\w.-]*:)?([a-zA-Z_][\\w.-]*)/);\n return m?.[1] ?? null;\n}\n","/**\n * Burp Suite format fingerprint.\n *\n * Detects Burp Suite XML files by checking for <issues> root element.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\nimport { extractXmlRootElement } from '../../../shared/typescript/xml-utils.js';\n\nexport const burpsuiteFingerprint: ConverterFingerprint = {\n id: 'burpsuite-to-hdf',\n label: 'Burp Suite',\n direction: 'ingest',\n inputFamily: 'xml',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'string') return 0;\n // BurpSuite XML has <!DOCTYPE issues [...]> before <issues> root.\n // extractXmlRootElement handles DOCTYPE stripping.\n const root = extractXmlRootElement(input);\n if (root !== 'issues') return 0;\n // burpVersion attribute is a strong signal\n if (input.includes('burpVersion')) return 1.0;\n return 0.7;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('burpsuite-to-hdf')) return;\n registerFingerprint(burpsuiteFingerprint);\n}\n","/**\n * DBProtect format fingerprint.\n *\n * Detects DBProtect XML files by checking for <dataset> root element\n * with metadata/data child structure.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\nimport { extractXmlRootElement } from '../../../shared/typescript/xml-utils.js';\n\nexport const dbprotectFingerprint: ConverterFingerprint = {\n id: 'dbprotect-to-hdf',\n label: 'DBProtect',\n direction: 'ingest',\n inputFamily: 'xml',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'string') return 0;\n const root = extractXmlRootElement(input);\n if (!root) return 0;\n if (root === 'dataset') {\n // Higher confidence if metadata/data children present (DBProtect-specific)\n if (input.includes('<metadata') && input.includes('<data')) return 1.0;\n return 0.8;\n }\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('dbprotect-to-hdf')) return;\n registerFingerprint(dbprotectFingerprint);\n}\n","/**\n * Fortify FVDL format fingerprint.\n *\n * Detects Fortify XML files by checking for <FVDL> root element.\n * Fortify uses the FVDL (Fortify Vulnerability Description Language) format\n * with xmlns=\"xmlns.fortify.com/schema/fvdl\" namespace.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\nimport { extractXmlRootElement } from '../../../shared/typescript/xml-utils.js';\n\nexport const fortifyFingerprint: ConverterFingerprint = {\n id: 'fortify-to-hdf',\n label: 'Fortify',\n direction: 'ingest',\n inputFamily: 'xml',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'string') return 0;\n const root = extractXmlRootElement(input);\n if (!root) return 0;\n if (root === 'FVDL') {\n // Higher confidence with Fortify namespace\n if (input.includes('xmlns.fortify.com')) return 1.0;\n return 0.95;\n }\n return 0;\n },\n detectVersion: (input: unknown): string => {\n if (typeof input !== 'string') return '';\n const m = input.match(/<FVDL\\b[^>]*\\bversion=\"([^\"]+)\"/);\n return m?.[1] ?? '';\n },\n};\n\nexport function register(): void {\n if (getFingerprint('fortify-to-hdf')) return;\n registerFingerprint(fortifyFingerprint);\n}\n","/**\n * JUnit format fingerprint.\n *\n * Detects JUnit XML files by checking for <testsuites> or <testsuite> root element.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\nimport { extractXmlRootElement } from '../../../shared/typescript/xml-utils.js';\n\nexport const junitFingerprint: ConverterFingerprint = {\n id: 'junit-to-hdf',\n label: 'JUnit',\n direction: 'ingest',\n inputFamily: 'xml',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'string') return 0;\n const root = extractXmlRootElement(input);\n if (!root) return 0;\n return (root === 'testsuites' || root === 'testsuite') ? 1.0 : 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('junit-to-hdf')) return;\n registerFingerprint(junitFingerprint);\n}\n","/**\n * Nessus format fingerprint.\n *\n * Detects Nessus XML files by checking for <NessusClientData_v2> root element.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\nimport { extractXmlRootElement } from '../../../shared/typescript/xml-utils.js';\n\nexport const nessusFingerprint: ConverterFingerprint = {\n id: 'nessus-to-hdf',\n label: 'Nessus',\n direction: 'ingest',\n inputFamily: 'xml',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'string') return 0;\n const root = extractXmlRootElement(input);\n if (!root) return 0;\n return root === 'NessusClientData_v2' ? 1.0 : 0;\n },\n detectVersion: (input: unknown): string => {\n if (typeof input !== 'string') return '';\n const root = extractXmlRootElement(input);\n return root === 'NessusClientData_v2' ? '2' : '';\n },\n};\n\nexport function register(): void {\n if (getFingerprint('nessus-to-hdf')) return;\n registerFingerprint(nessusFingerprint);\n}\n","/**\n * Netsparker/Invicti format fingerprint.\n *\n * Detects Netsparker XML files by checking for <netsparker-enterprise>\n * or <invicti-enterprise> root element.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\nimport { extractXmlRootElement } from '../../../shared/typescript/xml-utils.js';\n\nexport const netsparkerFingerprint: ConverterFingerprint = {\n id: 'netsparker-to-hdf',\n label: 'Netsparker',\n direction: 'ingest',\n inputFamily: 'xml',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'string') return 0;\n const root = extractXmlRootElement(input);\n if (!root) return 0;\n return (root === 'netsparker-enterprise' || root === 'invicti-enterprise') ? 1.0 : 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('netsparker-to-hdf')) return;\n registerFingerprint(netsparkerFingerprint);\n}\n","/**\n * Veracode DetailedReport XML format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n *\n * Veracode reports are XML with a <detailedreport> root element in the\n * Veracode namespace. The fingerprint checks for the <detailedreport> tag.\n *\n * Key structural markers:\n * - <detailedreport> root element → confidence 1.0\n * - <summaryreport> (unsupported variant) → confidence 0.0\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\nimport { extractXmlRootElement } from '../../../shared/typescript/xml-utils.js';\n\nexport const veracodeFingerprint: ConverterFingerprint = {\n id: 'veracode-to-hdf',\n label: 'Veracode',\n direction: 'ingest',\n inputFamily: 'xml',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'string') return 0;\n const root = extractXmlRootElement(input);\n if (root === 'detailedreport') return 1.0;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('veracode-to-hdf')) return;\n registerFingerprint(veracodeFingerprint);\n}\n","/**\n * XCCDF/ARF format fingerprint.\n *\n * Detects XCCDF and ARF XML files by checking for:\n * - <Benchmark> root element (XCCDF)\n * - <asset-report-collection> root element (ARF)\n * Handles namespace prefixes (e.g., <xccdf:Benchmark>).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\nimport { extractXmlRootElement } from '../../../shared/typescript/xml-utils.js';\n\nexport const xccdfFingerprint: ConverterFingerprint = {\n id: 'xccdf-results-to-hdf',\n label: 'XCCDF/ARF',\n direction: 'ingest',\n inputFamily: 'xml',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'string') return 0;\n const root = extractXmlRootElement(input);\n if (!root) return 0;\n if (root === 'Benchmark' || root === 'asset-report-collection') return 1.0;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('xccdf-results-to-hdf')) return;\n registerFingerprint(xccdfFingerprint);\n}\n","/**\n * CKL (DISA STIG Viewer checklist) format fingerprint.\n *\n * Detects .ckl XML files by their <CHECKLIST> root element.\n * Handles namespace prefixes via extractXmlRootElement.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\nimport { extractXmlRootElement } from '../../../shared/typescript/xml-utils.js';\n\nexport const cklFingerprint: ConverterFingerprint = {\n id: 'ckl-to-hdf',\n label: 'CKL (DISA STIG Viewer checklist)',\n direction: 'ingest',\n inputFamily: 'xml',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'string') return 0;\n return extractXmlRootElement(input) === 'CHECKLIST' ? 1.0 : 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('ckl-to-hdf')) return;\n registerFingerprint(cklFingerprint);\n}\n","/**\n * CKLB (DISA STIG Viewer 3.x JSON) format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Detects .cklb JSON by the presence of both a `cklb_version` key and a\n * `stigs` array.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const cklbFingerprint: ConverterFingerprint = {\n id: 'cklb-to-hdf',\n label: 'CKLB (DISA STIG Viewer 3.x JSON)',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) return 0;\n const obj = input as Record<string, unknown>;\n if (!('cklb_version' in obj)) return 0;\n if (!Array.isArray(obj.stigs)) return 0;\n return 1.0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('cklb-to-hdf')) return;\n registerFingerprint(cklbFingerprint);\n}\n","/**\n * Prisma Cloud CSV format fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * Confidence 0.85 — text/CSV input with Prisma-specific column headers.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\n/** Columns that uniquely identify Prisma Cloud CSV output */\nconst PRISMA_COLUMNS = ['Hostname', 'Compliance ID', 'Severity', 'Type', 'Description'];\n\nexport const prismaFingerprint: ConverterFingerprint = {\n id: 'prisma-to-hdf',\n label: 'Prisma Cloud CSV',\n direction: 'ingest',\n inputFamily: 'text',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'string') return 0;\n // Get the first line (header row) from the CSV\n const firstNewline = input.indexOf('\\n');\n const headerLine = firstNewline === -1 ? input : input.substring(0, firstNewline);\n if (!headerLine.trim()) return 0;\n\n // Check if all required Prisma columns are present in the header\n const matchCount = PRISMA_COLUMNS.filter(col => headerLine.includes(col)).length;\n if (matchCount === PRISMA_COLUMNS.length) return 0.85;\n // Partial match — at least 3 of 5 columns suggests Prisma-like CSV\n if (matchCount >= 3) return 0.4;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('prisma-to-hdf')) return;\n registerFingerprint(prismaFingerprint);\n}\n","/**\n * Native HDF format fingerprint.\n *\n * Detects HDF JSON files (the most common upload format). These have a\n * baselines[] array at the top level — no conversion needed, just passthrough.\n *\n * Confidence 0.8: lower than tool-specific formats so that if a file matches\n * a more specific converter (e.g. SARIF, TruffleHog), that wins.\n *\n * No converter imports — data only, safe for client bundles.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\n/** Detection ID for native (already-HDF) input. */\nexport const HDF_PASSTHROUGH_ID = 'hdf-passthrough';\n\nexport const hdfFingerprint: ConverterFingerprint = {\n id: HDF_PASSTHROUGH_ID,\n label: 'HDF',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) return 0;\n const obj = input as Record<string, unknown>;\n if (Array.isArray(obj.baselines)) return 0.8;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint(HDF_PASSTHROUGH_ID)) return;\n registerFingerprint(hdfFingerprint);\n}\n","/**\n * HDF v1 (legacy) format fingerprint.\n *\n * Detects HDF v1.0 JSON files that need conversion to v2.0 format.\n * V1 files have a profiles[] array at root, a platform object, and a\n * version string. They do NOT have baselines[] (that is v2).\n *\n * The isHDFV1() function in the converter checks:\n * typeof obj.version === 'string' && Array.isArray(obj.profiles) &&\n * typeof obj.platform === 'object' && obj.platform !== null\n *\n * No converter imports — data only, safe for client bundles.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const legacyHdfFingerprint: ConverterFingerprint = {\n id: 'legacyhdf-to-hdf',\n label: 'HDF v1 (Legacy)',\n direction: 'ingest',\n inputFamily: 'json',\n outputType: 'results',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) return 0;\n const obj = input as Record<string, unknown>;\n\n // Must NOT have baselines[] (that would be HDF v2)\n if (Array.isArray(obj.baselines)) return 0;\n\n // V1 structure: profiles[] + platform object + version string\n if (\n typeof obj.version === 'string' &&\n Array.isArray(obj.profiles) &&\n typeof obj.platform === 'object' &&\n obj.platform !== null\n ) {\n return 1.0;\n }\n\n return 0;\n },\n detectVersion: (input: unknown): string => {\n if (typeof input !== 'object' || input === null) return '';\n const obj = input as Record<string, unknown>;\n return typeof obj.version === 'string' ? obj.version : '';\n },\n};\n\nexport function register(): void {\n if (getFingerprint('legacyhdf-to-hdf')) return;\n registerFingerprint(legacyHdfFingerprint);\n}\n","/**\n * OSCAL document type fingerprints.\n *\n * Registers 7 separate ConverterFingerprint entries, one for each OSCAL\n * document type. Each checks for its specific top-level JSON key.\n *\n * No converter imports — data only, safe for client bundles.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint, type OutputType } from '../../../shared/typescript/registry.js';\n\ninterface OscalFingerprintSpec {\n key: string;\n id: string;\n label: string;\n outputType: OutputType;\n}\n\nconst OSCAL_SPECS: OscalFingerprintSpec[] = [\n { key: 'system-security-plan', id: 'oscal-ssp-to-hdf', label: 'OSCAL SSP', outputType: 'raw' },\n { key: 'assessment-plan', id: 'oscal-sap-to-hdf', label: 'OSCAL SAP', outputType: 'plan' },\n { key: 'assessment-results', id: 'oscal-sar-to-hdf', label: 'OSCAL SAR', outputType: 'results' },\n { key: 'plan-of-action-and-milestones', id: 'oscal-poam-to-hdf', label: 'OSCAL POA&M', outputType: 'amendments' },\n { key: 'profile', id: 'oscal-profile-to-hdf', label: 'OSCAL Profile', outputType: 'baseline' },\n { key: 'catalog', id: 'oscal-catalog-to-hdf', label: 'OSCAL Catalog', outputType: 'baseline' },\n { key: 'component-definition', id: 'oscal-component-to-hdf', label: 'OSCAL Component', outputType: 'baseline' },\n];\n\nfunction oscalDetectVersion(rootKey: string, input: unknown): string {\n if (typeof input !== 'object' || input === null) return '';\n const obj = input as Record<string, unknown>;\n const root = obj[rootKey] as Record<string, unknown> | undefined;\n if (!root || typeof root !== 'object') return '';\n const meta = root.metadata as Record<string, unknown> | undefined;\n if (!meta || typeof meta !== 'object') return '';\n return typeof meta['oscal-version'] === 'string' ? meta['oscal-version'] : '';\n}\n\nfunction buildFingerprint(spec: OscalFingerprintSpec): ConverterFingerprint {\n return {\n id: spec.id,\n label: spec.label,\n direction: 'ingest',\n inputFamily: 'json',\n outputType: spec.outputType,\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) return 0;\n const obj = input as Record<string, unknown>;\n if (spec.key in obj) return 1.0;\n return 0;\n },\n detectVersion: (input: unknown): string => oscalDetectVersion(spec.key, input),\n };\n}\n\nexport const oscalFingerprints: ConverterFingerprint[] = OSCAL_SPECS.map(buildFingerprint);\n\nexport function register(): void {\n for (const fp of oscalFingerprints) {\n if (getFingerprint(fp.id)) continue;\n registerFingerprint(fp);\n }\n}\n","/**\n * HDF-to-CSV export fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * direction: 'export' — not a detection target, low confidence (0.5).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const hdfToCsvFingerprint: ConverterFingerprint = {\n id: 'hdf-to-csv',\n label: 'HDF to CSV',\n direction: 'export',\n inputFamily: 'json',\n outputType: 'raw',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (Array.isArray(obj.baselines)) return 0.5;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('hdf-to-csv')) return;\n registerFingerprint(hdfToCsvFingerprint);\n}\n","/**\n * HDF-to-XML export fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * direction: 'export' — not a detection target, low confidence (0.5).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const hdfToXmlFingerprint: ConverterFingerprint = {\n id: 'hdf-to-xml',\n label: 'HDF to XML',\n direction: 'export',\n inputFamily: 'json',\n outputType: 'raw',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (Array.isArray(obj.baselines)) return 0.5;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('hdf-to-xml')) return;\n registerFingerprint(hdfToXmlFingerprint);\n}\n","/**\n * HDF-to-OSCAL-SAR export fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * direction: 'export' — not a detection target, low confidence (0.5).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const hdfToOscalSarFingerprint: ConverterFingerprint = {\n id: 'hdf-to-oscal-sar',\n label: 'HDF to OSCAL SAR',\n direction: 'export',\n inputFamily: 'json',\n outputType: 'raw',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (Array.isArray(obj.baselines)) return 0.5;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('hdf-to-oscal-sar')) return;\n registerFingerprint(hdfToOscalSarFingerprint);\n}\n","/**\n * HDF-to-OSCAL-POA&M export fingerprint.\n *\n * Exports a ConverterFingerprint object (data only, no converter import).\n * direction: 'export' — not a detection target, low confidence (0.5).\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from '../../../shared/typescript/registry.js';\n\nexport const hdfToOscalPoamFingerprint: ConverterFingerprint = {\n id: 'hdf-to-oscal-poam',\n label: 'HDF to OSCAL POA&M',\n direction: 'export',\n inputFamily: 'json',\n outputType: 'raw',\n fingerprint: (input: unknown): number => {\n if (typeof input !== 'object' || input === null) return 0;\n const obj = input as Record<string, unknown>;\n if (Array.isArray(obj.baselines)) return 0.5;\n return 0;\n },\n};\n\nexport function register(): void {\n if (getFingerprint('hdf-to-oscal-poam')) return;\n registerFingerprint(hdfToOscalPoamFingerprint);\n}\n","/**\n * Explicit fingerprint registration for all converters.\n *\n * Consumers call registerAllFingerprints() once at startup.\n * This avoids side-effect imports that bundlers tree-shake away.\n */\n\nimport { registerFingerprint, getFingerprint, type ConverterFingerprint } from './registry.js';\n\n// JSON ingest converters\nimport { awsConfigFingerprint } from '../../converters/aws-config-to-hdf/typescript/fingerprint.js';\nimport { checkovFingerprint } from '../../converters/checkov-to-hdf/typescript/fingerprint.js';\nimport { conveyorFingerprint } from '../../converters/conveyor-to-hdf/typescript/fingerprint.js';\nimport { csafVexFingerprint } from '../../converters/csaf-vex-to-hdf/typescript/fingerprint.js';\nimport { cyclonedxFingerprint } from '../../converters/cyclonedx-to-hdf/typescript/fingerprint.js';\nimport { cyclonedxVexFingerprint } from '../../converters/cyclonedx-vex-to-hdf/typescript/fingerprint.js';\nimport { deptrackFingerprint } from '../../converters/deptrack-to-hdf/typescript/fingerprint.js';\nimport { gitlabFingerprint } from '../../converters/gitlab-to-hdf/typescript/fingerprint.js';\nimport { gosecFingerprint } from '../../converters/gosec-to-hdf/typescript/fingerprint.js';\nimport { grypeFingerprint } from '../../converters/grype-to-hdf/typescript/fingerprint.js';\nimport { jfrogXrayFingerprint } from '../../converters/jfrog-xray-to-hdf/typescript/fingerprint.js';\nimport { msftDefenderCloudFingerprint } from '../../converters/msft-defender-cloud-to-hdf/typescript/fingerprint.js';\nimport { msftDefenderDevopsFingerprint } from '../../converters/msft-defender-devops-to-hdf/typescript/fingerprint.js';\nimport { msftDefenderEndpointFingerprint } from '../../converters/msft-defender-endpoint-to-hdf/typescript/fingerprint.js';\nimport { msftSecureScoreFingerprint } from '../../converters/msft-secure-score-to-hdf/typescript/fingerprint.js';\nimport { neuvectorFingerprint } from '../../converters/neuvector-to-hdf/typescript/fingerprint.js';\nimport { openvexFingerprint } from '../../converters/openvex-to-hdf/typescript/fingerprint.js';\nimport { sarifFingerprint } from '../../converters/sarif-to-hdf/typescript/fingerprint.js';\nimport { scoutsuiteFingerprint } from '../../converters/scoutsuite-to-hdf/typescript/fingerprint.js';\nimport { snykFingerprint } from '../../converters/snyk-to-hdf/typescript/fingerprint.js';\nimport { sonarqubeFingerprint } from '../../converters/sonarqube-to-hdf/typescript/fingerprint.js';\nimport { splunkFingerprint } from '../../converters/splunk-to-hdf/typescript/fingerprint.js';\nimport { trufflehogFingerprint } from '../../converters/trufflehog-to-hdf/typescript/fingerprint.js';\nimport { twistlockFingerprint } from '../../converters/twistlock-to-hdf/typescript/fingerprint.js';\n\n// JSON ingest converters (input is JSON despite tool names suggesting XML)\nimport { niktoFingerprint } from '../../converters/nikto-to-hdf/typescript/fingerprint.js';\nimport { zapFingerprint } from '../../converters/zap-to-hdf/typescript/fingerprint.js';\n\n// XML ingest converters\nimport { burpsuiteFingerprint } from '../../converters/burpsuite-to-hdf/typescript/fingerprint.js';\nimport { dbprotectFingerprint } from '../../converters/dbprotect-to-hdf/typescript/fingerprint.js';\nimport { fortifyFingerprint } from '../../converters/fortify-to-hdf/typescript/fingerprint.js';\nimport { junitFingerprint } from '../../converters/junit-to-hdf/typescript/fingerprint.js';\nimport { nessusFingerprint } from '../../converters/nessus-to-hdf/typescript/fingerprint.js';\nimport { netsparkerFingerprint } from '../../converters/netsparker-to-hdf/typescript/fingerprint.js';\nimport { veracodeFingerprint } from '../../converters/veracode-to-hdf/typescript/fingerprint.js';\nimport { xccdfFingerprint } from '../../converters/xccdf-results-to-hdf/typescript/fingerprint.js';\nimport { cklFingerprint } from '../../converters/ckl-to-hdf/typescript/fingerprint.js';\nimport { cklbFingerprint } from '../../converters/cklb-to-hdf/typescript/fingerprint.js';\n\n// Text/CSV ingest converters\nimport { prismaFingerprint } from '../../converters/prisma-to-hdf/typescript/fingerprint.js';\n\n// HDF native detection\nimport { hdfFingerprint } from '../../converters/hdf-passthrough/typescript/fingerprint.js';\nimport { legacyHdfFingerprint } from '../../converters/legacyhdf-to-hdf/typescript/fingerprint.js';\n\n// OSCAL converters (7 fingerprints in one array)\nimport { oscalFingerprints } from '../../converters/oscal-to-hdf/typescript/fingerprint.js';\n\n// Export converters\nimport { hdfToCsvFingerprint } from '../../converters/hdf-to-csv/typescript/fingerprint.js';\nimport { hdfToXmlFingerprint } from '../../converters/hdf-to-xml/typescript/fingerprint.js';\nimport { hdfToOscalSarFingerprint } from '../../converters/hdf-to-oscal-sar/typescript/fingerprint.js';\nimport { hdfToOscalPoamFingerprint } from '../../converters/hdf-to-oscal-poam/typescript/fingerprint.js';\n\nconst allFingerprints: ConverterFingerprint[] = [\n // JSON ingest\n awsConfigFingerprint,\n cklbFingerprint,\n checkovFingerprint,\n conveyorFingerprint,\n csafVexFingerprint,\n cyclonedxFingerprint,\n cyclonedxVexFingerprint,\n deptrackFingerprint,\n gitlabFingerprint,\n gosecFingerprint,\n grypeFingerprint,\n jfrogXrayFingerprint,\n msftDefenderCloudFingerprint,\n msftDefenderDevopsFingerprint,\n msftDefenderEndpointFingerprint,\n msftSecureScoreFingerprint,\n neuvectorFingerprint,\n openvexFingerprint,\n sarifFingerprint,\n scoutsuiteFingerprint,\n snykFingerprint,\n sonarqubeFingerprint,\n splunkFingerprint,\n trufflehogFingerprint,\n twistlockFingerprint,\n // JSON ingest (input is JSON despite tool names)\n niktoFingerprint,\n zapFingerprint,\n // XML ingest\n burpsuiteFingerprint,\n cklFingerprint,\n dbprotectFingerprint,\n fortifyFingerprint,\n junitFingerprint,\n nessusFingerprint,\n netsparkerFingerprint,\n veracodeFingerprint,\n xccdfFingerprint,\n // Text/CSV ingest\n prismaFingerprint,\n // HDF native\n hdfFingerprint,\n legacyHdfFingerprint,\n // OSCAL (7 fingerprints)\n ...oscalFingerprints,\n // Export converters\n hdfToCsvFingerprint,\n hdfToXmlFingerprint,\n hdfToOscalSarFingerprint,\n hdfToOscalPoamFingerprint,\n];\n\n/**\n * Register all known converter fingerprints.\n * Idempotent — safe to call multiple times or after _resetRegistry().\n */\nexport function registerAllFingerprints(): void {\n for (const fp of allFingerprints) {\n if (!getFingerprint(fp.id)) {\n registerFingerprint(fp);\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","names":[],"sources":["../shared/typescript/registry.ts"],"mappings":";;AAOA;;;;;KAAY,WAAA;AAAA,KACA,kBAAA;AAAA,KACA,UAAA;AAAA,UAGK,oBAAA;EAJa;EAM5B,EAAA;EALoB;EAOpB,KAAA;EAPoB;EASpB,SAAA,EAAW,kBAAA;EANI;EAQf,WAAA,EAAa,WAAA;;EAEb,UAAA,EAAY,UAAA;EAFC;EAIb,WAAA,GAAc,KAAA;EAFQ;;;;;EAQtB,aAAA,IAAiB,KAAA;AAAA;AAAA,iBAKH,mBAAA,CAAoB,EAAA,EAAI,oBAAA;AAAA,iBAOxB,eAAA,CAAA,YAA4B,oBAAA;AAAA,iBAI5B,qBAAA,CAAA,YAAkC,oBAAA;AAAA,iBAIlC,cAAA,CAAe,EAAA,WAAa,oBAAA;AAAA,iBAK5B,cAAA,CAAA"}
1
+ {"version":3,"file":"registry.d.ts","names":[],"sources":["../shared/typescript/registry.ts"],"mappings":";;AAOA;;;;AAAuB;KAAX,WAAA;AAAA,KACA,kBAAA;AAAA,KACA,UAAA;AAAA,UAGK,oBAAA;EAJa;EAM5B,EAAA;EALoB;EAOpB,KAAA;EAPoB;EASpB,SAAA,EAAW,kBAAA;EANI;EAQf,WAAA,EAAa,WAAA;;EAEb,UAAA,EAAY,UAAA;EAFC;EAIb,WAAA,GAAc,KAAA;EAFQ;;;;;EAQtB,aAAA,IAAiB,KAAA;AAAA;AAAA,iBAKH,mBAAA,CAAoB,EAAwB,EAApB,oBAAoB;AAAA,iBAO5C,eAAA,aAA4B,oBAAoB;AAAA,iBAIhD,qBAAA,aAAkC,oBAAoB;AAAA,iBAItD,cAAA,CAAe,EAAA,WAAa,oBAAoB;AAAA,iBAKhD,cAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":[],"sources":["../shared/typescript/registry.ts"],"sourcesContent":["/**\n * Converter fingerprint registry.\n *\n * Lightweight fingerprint metadata — NO converter function imports.\n * Safe for client bundles. Converters are loaded lazily by consumers.\n */\n\nexport type InputFamily = 'json' | 'xml' | 'csv' | 'text';\nexport type ConverterDirection = 'ingest' | 'export';\nexport type OutputType = 'results' | 'baseline' | 'plan' | 'amendments'\n | 'system' | 'evidence-package' | 'raw';\n\nexport interface ConverterFingerprint {\n /** Unique ID matching directory name: e.g. 'sarif-to-hdf' */\n id: string;\n /** Human-readable label: e.g. 'SARIF' */\n label: string;\n /** Direction of conversion */\n direction: ConverterDirection;\n /** Input format family */\n inputFamily: InputFamily;\n /** What the converter produces */\n outputType: OutputType;\n /** Structural fingerprint. Returns confidence 0.0-1.0. */\n fingerprint: (input: unknown) => number;\n /**\n * Optional version detector. Returns a version string from the parsed input.\n * For example, SARIF returns obj.version (\"2.1.0\"), CycloneDX returns\n * obj.specVersion (\"1.5\"). Undefined means version detection is not supported.\n */\n detectVersion?: (input: unknown) => string;\n}\n\nconst registry: ConverterFingerprint[] = [];\n\nexport function registerFingerprint(fp: ConverterFingerprint): void {\n if (registry.some(d => d.id === fp.id)) {\n throw new Error(`Duplicate fingerprint: ${fp.id}`);\n }\n registry.push(fp);\n}\n\nexport function getFingerprints(): readonly ConverterFingerprint[] {\n return [...registry];\n}\n\nexport function getIngestFingerprints(): readonly ConverterFingerprint[] {\n return registry.filter(d => d.direction === 'ingest');\n}\n\nexport function getFingerprint(id: string): ConverterFingerprint | undefined {\n const found = registry.find(d => d.id === id);\n return found ? { ...found } : undefined;\n}\n\nexport function _resetRegistry(): void {\n registry.length = 0;\n}\n"],"mappings":";AAiCA,MAAM,WAAmC,EAAE;AAE3C,SAAgB,oBAAoB,IAAgC;AAClE,KAAI,SAAS,MAAK,MAAK,EAAE,OAAO,GAAG,GAAG,CACpC,OAAM,IAAI,MAAM,0BAA0B,GAAG,KAAK;AAEpD,UAAS,KAAK,GAAG;;AAGnB,SAAgB,kBAAmD;AACjE,QAAO,CAAC,GAAG,SAAS;;AAGtB,SAAgB,wBAAyD;AACvE,QAAO,SAAS,QAAO,MAAK,EAAE,cAAc,SAAS;;AAGvD,SAAgB,eAAe,IAA8C;CAC3E,MAAM,QAAQ,SAAS,MAAK,MAAK,EAAE,OAAO,GAAG;AAC7C,QAAO,QAAQ,EAAE,GAAG,OAAO,GAAG,KAAA;;AAGhC,SAAgB,iBAAuB;AACrC,UAAS,SAAS"}
1
+ {"version":3,"file":"registry.js","names":[],"sources":["../shared/typescript/registry.ts"],"sourcesContent":["/**\n * Converter fingerprint registry.\n *\n * Lightweight fingerprint metadata — NO converter function imports.\n * Safe for client bundles. Converters are loaded lazily by consumers.\n */\n\nexport type InputFamily = 'json' | 'xml' | 'csv' | 'text';\nexport type ConverterDirection = 'ingest' | 'export';\nexport type OutputType = 'results' | 'baseline' | 'plan' | 'amendments'\n | 'system' | 'evidence-package' | 'raw';\n\nexport interface ConverterFingerprint {\n /** Unique ID matching directory name: e.g. 'sarif-to-hdf' */\n id: string;\n /** Human-readable label: e.g. 'SARIF' */\n label: string;\n /** Direction of conversion */\n direction: ConverterDirection;\n /** Input format family */\n inputFamily: InputFamily;\n /** What the converter produces */\n outputType: OutputType;\n /** Structural fingerprint. Returns confidence 0.0-1.0. */\n fingerprint: (input: unknown) => number;\n /**\n * Optional version detector. Returns a version string from the parsed input.\n * For example, SARIF returns obj.version (\"2.1.0\"), CycloneDX returns\n * obj.specVersion (\"1.5\"). Undefined means version detection is not supported.\n */\n detectVersion?: (input: unknown) => string;\n}\n\nconst registry: ConverterFingerprint[] = [];\n\nexport function registerFingerprint(fp: ConverterFingerprint): void {\n if (registry.some(d => d.id === fp.id)) {\n throw new Error(`Duplicate fingerprint: ${fp.id}`);\n }\n registry.push(fp);\n}\n\nexport function getFingerprints(): readonly ConverterFingerprint[] {\n return [...registry];\n}\n\nexport function getIngestFingerprints(): readonly ConverterFingerprint[] {\n return registry.filter(d => d.direction === 'ingest');\n}\n\nexport function getFingerprint(id: string): ConverterFingerprint | undefined {\n const found = registry.find(d => d.id === id);\n return found ? { ...found } : undefined;\n}\n\nexport function _resetRegistry(): void {\n registry.length = 0;\n}\n"],"mappings":";AAiCA,MAAM,WAAmC,CAAC;AAE1C,SAAgB,oBAAoB,IAAgC;CAClE,IAAI,SAAS,MAAK,MAAK,EAAE,OAAO,GAAG,EAAE,GACnC,MAAM,IAAI,MAAM,0BAA0B,GAAG,IAAI;CAEnD,SAAS,KAAK,EAAE;AAClB;AAEA,SAAgB,kBAAmD;CACjE,OAAO,CAAC,GAAG,QAAQ;AACrB;AAEA,SAAgB,wBAAyD;CACvE,OAAO,SAAS,QAAO,MAAK,EAAE,cAAc,QAAQ;AACtD;AAEA,SAAgB,eAAe,IAA8C;CAC3E,MAAM,QAAQ,SAAS,MAAK,MAAK,EAAE,OAAO,EAAE;CAC5C,OAAO,QAAQ,EAAE,GAAG,MAAM,IAAI,KAAA;AAChC;AAEA,SAAgB,iBAAuB;CACrC,SAAS,SAAS;AACpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mitre/hdf-converters",
3
- "version": "3.1.0",
3
+ "version": "3.3.0",
4
4
  "description": "Converters for transforming security tool outputs and HDF formats",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -35,12 +35,15 @@
35
35
  "author": "MITRE Corporation",
36
36
  "license": "Apache-2.0",
37
37
  "dependencies": {
38
- "@mitre/hdf-parsers": "^3.1.0",
39
- "@mitre/hdf-schema": "^3.1.0",
40
- "@mitre/hdf-utilities": "^3.1.0",
41
- "@mitre/hdf-mappings": "^3.1.0"
38
+ "@mitre/hdf-parsers": "^3.3.0",
39
+ "@mitre/hdf-schema": "^3.3.0",
40
+ "@mitre/hdf-mappings": "^3.3.0",
41
+ "@mitre/hdf-utilities": "^3.3.0"
42
+ },
43
+ "devDependencies": {
44
+ "@mitre/hdf-fixtures": "^3.3.0",
45
+ "@mitre/hdf-validators": "^3.3.0"
42
46
  },
43
- "devDependencies": {},
44
47
  "engines": {
45
48
  "node": ">=22.0.0"
46
49
  },
@@ -65,7 +68,7 @@
65
68
  "type-check": "tsc --noEmit",
66
69
  "lint": "eslint src converters shared",
67
70
  "lint:fix": "eslint src converters shared --fix",
68
- "lint:go": "golangci-lint run ./...",
69
- "lint:go:fix": "golangci-lint run --fix ./..."
71
+ "lint:go": "PATH=\"$PATH:$HOME/go/bin\" golangci-lint run ./...",
72
+ "lint:go:fix": "PATH=\"$PATH:$HOME/go/bin\" golangci-lint run --fix ./..."
70
73
  }
71
74
  }